Konflikt bei Vergabe von Rechnungsnummern

Allgemeine Diskussionen um die ERP Software AvERP

Moderator: SYNERPY

Antworten
Gast

Konflikt bei Vergabe von Rechnungsnummern

Beitrag von Gast »

Wir testen zur Zeit AvERP in unserem Unternehmen. Hierbei ist folgendes Problem aufgetreten:

Wenn mehrere Personen gleichzeitig Kundenrechnungen schreiben, kommt es vor, daß das die gleiche Rechnungsnummer mehrfach vergeben wird. Dies ist dann der Fall, wenn beispielsweise zwei Personen relativ zeitgleich einen neuen Rechnungsdatensatz anlegen. Bei der zweiten Rechnung, dann mit dieser Nummer abgespeichert werden soll, gibt es dann logischerweise eine Fehlermeldung und die Rechnungsnummer muß manuell geändert werden.

Dies ist vielleicht noch vertretbar, wenn nur zwei Personen mit der Software arbeiten, da man die Rechnungsnummer im schlimmsten Fall einmal um eine Stelle ändern muß. Je mehr Personen jedoch gleichzeitig Rechnungen schreiben wollen, desto unübersichtlicher wird es wahrscheinlich.

Gibt es eine Möglichkeit dies zu beheben?

Vielen Dank im voraus.
admin
Site Admin
Beiträge: 2673
Registriert: Di Feb 10, 2004 5:48 am
Wohnort: Bayreuth

Beitrag von admin »

Erfahrungsgemäß führt dies nicht zu Problemen:

1. Das Anlegen eines Rechnungskopfes dauert circa 10 Sekunden. Der Zeitraum für Überschneidungen ist daher gering.

2. Im Echtbetrieb lassen die meisten Firmen Rechnungen automatisch oder halbautomatisch (per Utility) erstellen
Susanne
Beiträge: 9
Registriert: Di Jan 18, 2005 1:28 pm

Rechnungen automatisch erstellen

Beitrag von Susanne »

Rechnungen per Utility automatisch erstellen lassen klingt interessant. Wie funktioniert das?
SYN12
Beiträge: 824
Registriert: Mi Mär 17, 2004 12:11 pm

Beitrag von SYN12 »

Aus der Angebots- und Auftragsverwaltung sowie aus der Maske Kundenlieferscheine können, per Utility, Rechnungen erstellt werden. Die Rechnungen werden als Datensatz in der Maske Kundenrechnungen angelegt bzw. offenen Rechnungen für diesen Kunden hinzugefügt.
Noket
Beiträge: 22
Registriert: Di Feb 14, 2006 10:03 am

Beitrag von Noket »

Man sollte evtl. trotzdem darauf hinweisen, dass diese Art und Weise nicht bei Auslandskunden angewendet werden darf (sollte), da das Mwst. Nebenkostenkennzeichen (oder so ähnlich) immer auf "1" (16%) gesetzt wird und dadurch Fehler in der Berechnung entstehen können.

Verherrender is aber der Fehler bei dem Utility aus der Maske Kundenlieferschein: wird mit diesem Utility die Rechnung erstellt geht sie an die gleiche Adresse wie der Lieferschein.... :shock:
(und diese Adresse lässt sich dann von einem normalen Benutzer nicht mehr ändern, da die Rechnungsadresse nicht veränderlich ist, solange es Rechnungspositionen gibt)

aber in allen anderen Fällen geht es so schnell und reibungslos...
SYN12
Beiträge: 824
Registriert: Mi Mär 17, 2004 12:11 pm

Beitrag von SYN12 »

Vielen Dank für die Hinweise. Wir werden diese Probelematik im kommenden Release berücksichtigen und verbessern.
Noket
Beiträge: 22
Registriert: Di Feb 14, 2006 10:03 am

Beitrag von Noket »

um euch die Sache ein bischen zu vereinfachen hätt ich sogar ein Lösungsvorschlag, der nur in einem Fall nicht funktioniert, indem man zu mehreren Aufträgen einen Lieferschein schreibt, der eigentlich an zu 2 verschidenen Rechnungsadressen hätte geschickt werden sollen (kommt dann keine fehlermeldung oder sowas [wenn sowas überhaupt mal vorkommt]):

Code: Alles auswählen

CREATE PROCEDURE P_BAUF_NACH_BRRCP (
    BAUF_ID INTEGER)
AS
DECLARE VARIABLE SJA VARCHAR(1);
DECLARE VARIABLE SNEIN VARCHAR(1);
DECLARE VARIABLE BKUNDE_ID_KUNR INTEGER;
DECLARE VARIABLE BADR_ID_LIEFADRNR INTEGER;
DECLARE VARIABLE BADR_ID_READRNR INTEGER;
DECLARE VARIABLE BRLS_ID INTEGER;
DECLARE VARIABLE BRRC_ID INTEGER;
DECLARE VARIABLE BAUFPO_ID INTEGER;
DECLARE VARIABLE COUNTER INTEGER;
DECLARE VARIABLE BWAER_ID INTEGER;
DECLARE VARIABLE TJA VARCHAR(5);
DECLARE VARIABLE NJA INTEGER;
BEGIN
  /* Letzter Stand: 09.02.2005 11:15:47  GK */

  /* Aus Auftrag einen Lieferschein und eine Rechnung erzeugen */
  /* Letzter Stand 10.03.2004 16:57:19 HB - mit Teilmengen */
  /* Letzter Stand 13.12.2004 06:55:53 AS */

  /* PROTOKOLLIEREN, DASS AKTION HIER DURCHGELAUFEN IST */
  IF (GEN_ID(GEN_ENTWICKLUNG,0) = 0) THEN
    INSERT INTO A_WASMACHTIB (PROGRAMMTEIL) VALUES ('P_BAUF_NACH_BRRCP');

  EXECUTE PROCEDURE P_BFIRMA_JANEIN RETURNING_VALUES (:SJA, :SNEIN);
  BKUNDE_ID_KUNR = NULL;
  BADR_ID_LIEFADRNR = NULL;
  BADR_ID_READRNR = NULL;
  /* Hier muss getestet werden, ob der Auftrag überhaupt Positionen hat,
     die geliefert werden können.
     Wenn nicht, dann werden auch keine Lieferschein- und
     Rechnungsköpfe angelegt  */
  COUNTER = 0;
  FOR SELECT E.ID
  FROM BAUFPO E
  LEFT OUTER JOIN BARTLH F ON E.BARTLH_ID_LAGERNR = F.ID
  WHERE E.BAUF_ID_LINKKEY = :BAUF_ID
  INTO :BAUFPO_ID
  DO
    COUNTER = COUNTER + 1;

  IF (COUNTER < 1) THEN EXIT;

  /* Informationen zum Auftrag holen */
  SELECT BKUNDE_ID_KUNR,
         BADR_ID_LIEFADRNR,
         BADR_ID_READRNR,
         BWAER_ID
  FROM BAUF
  WHERE ID = :BAUF_ID
  INTO :BKUNDE_ID_KUNR,
       :BADR_ID_LIEFADRNR,
       :BADR_ID_READRNR,
       :BWAER_ID;

  /* Lieferschein anlegen */
  BRLS_ID = NULL;

  /* Positionn werden immer zum ältesten Lieferschein anlegen */
  SELECT MIN(ID)
  FROM BRLS
  WHERE BKUNDE_ID_LINKKEY = :BKUNDE_ID_KUNR AND
        MASKENKEY NOT STARTING WITH 'X' AND
        BADR_ID_LADRCODE = :BADR_ID_LIEFADRNR AND
        LSGEDRUCKT = :SNEIN
  INTO :BRLS_ID;

  IF (BRLS_ID IS NULL) THEN
  BEGIN
    BRLS_ID = GEN_ID(GEN_BRLS, 1);
    INSERT INTO BRLS(
      ID,
      MASKENKEY,
      ANSPRECHP,
      BADR_ID_LADRCODE,
      LIEFDATUM,
      BKUNDE_ID_LINKKEY,
      BABT_ID_LSABTNR,
      LSGEDRUCKT,
      UZEICH,
      BLIEBE_ID_VERSBED1K,
      BLIEBE_ID_VERSBED2K,
      BVERSAND_ID_1,
      BVERSAND_ID_2,
      BMAND_ID)
      SELECT
        :BRLS_ID,
        NULL,
        A.ANSPRECHP,
        A.BADR_ID_LIEFADRNR,
        A.KLTERMIN,
        A.BKUNDE_ID_KUNR,
        A.BABT_ID_ABTNR,
        :SNEIN,
        A.UZEICH,
        A.BLIEBE_ID_VERSBED1K,
        A.BLIEBE_ID_VERSBED2K,
        A.BVERSAND_ID_1,
        A.BVERSAND_ID_2,
        A.BMAND_ID
        FROM BAUF A
        WHERE A.ID = :BAUF_ID;
  END

  SELECT KS.KZ_MWST
  FROM BRLS KP
  LEFT OUTER JOIN BKUNDE KS ON KP.BKUNDE_ID_LINKKEY = KS.ID
  WHERE KP.ID = :BRLS_ID
  INTO :TJA;

  IF (TJA = :SJA) THEN
  TJA = '1';
  ELSE
  TJA = '2';

  SELECT PROZENT
  FROM BMWST
  WHERE ID = :TJA
  INTO :NJA;

  /* Rechnungen anlegen */
  BRRC_ID = NULL;
  SELECT ID
  FROM BRRC
  WHERE BKUNDE_ID_LINKKEY = :BKUNDE_ID_KUNR AND
        BADR_ID_RADRCODE = :BADR_ID_READRNR AND
        RGGEDRUCKT = :SNEIN AND
        RECHNUNGSART = 'R' AND
        BWAER_ID = :BWAER_ID
  INTO :BRRC_ID;

  IF (BRRC_ID IS NULL) THEN
  BEGIN
    BRRC_ID = GEN_ID(GEN_BRRC, 1);
    INSERT INTO BRRC(
      ID,
      MASKENKEY,
      ANSPRECHP,
      GESAMT,
      GUTSCHR,
      GUTSCHRART,
      KURSDF,
      BKUNDE_ID_LINKKEY,
      MWST,
      BMWST_ID_MWSTKZ,
      MWSTSATZ,
      NETTO,
      BADR_ID_RADRCODE,
      RECHDATUM,
      BABT_ID_RGABTNR,
      RGGEDRUCKT,
      UZEICH,
      VERBUCHT,
      VERRECHNET,
      BWAER_ID_WAEHRUNGK,
      BZAHBE_ID_ZAHLBED1K,
      BZAHBE_ID_ZAHLBED2K,
      BZAHBE_ID_ZAHLBED3K,
      BZAHBE_ID_ZAHLBED4K,
      BRRCNK_SUMME,
      RECHNUNGSART,
      ABSCHLAGPROZENT,
      BMAND_ID,
      GESAMT_FW,
      MWST_FW,
      NETTO_FW,
      BRRCNK_SUMME_FW,
      BWAER_ID,
      KURS_FW )
      SELECT
        :BRRC_ID,
        NULL,
        B.ANSPRECHP,
        0.0,
        :SNEIN,
        NULL,
        B.KURSDF,
        B.BKUNDE_ID_KUNR,
        0,
        :TJA,
        :NJA,
        0.0,
        B.BADR_ID_READRNR,
        CURRENT_DATE,
        B.BABT_ID_ABTNR,
        :SNEIN,
        B.UZEICH,
        :SNEIN,
        :SNEIN,
        B.BWAER_ID_WAEHRUNGK,
        B.BZAHBE_ID_ZAHLBED1K,
        B.BZAHBE_ID_ZAHLBED2K,
        B.BZAHBE_ID_ZAHLBED3K,
        B.BZAHBE_ID_ZAHLBED4K,
        0.0,
        'R',
        0,
        B.BMAND_ID,
        0,
        0,
        0,
        0,
        B.BWAER_ID,
        B.KURS_FW
        FROM BAUF B
        LEFT OUTER JOIN BFIRMA C ON C.ID = 1
        LEFT OUTER JOIN BMWST D ON C.BMWST_ID_MWSTKENNZ = D.ID
        WHERE B.ID = :BAUF_ID;
  END

  /* Positionen in Lieferschein und Rechnung eintragen */
  FOR SELECT E.ID
  FROM BAUFPO E
  LEFT OUTER JOIN BARTLH F ON E.BARTLH_ID_LAGERNR = F.ID
  WHERE E.BAUF_ID_LINKKEY = :BAUF_ID
  INTO :BAUFPO_ID
  DO
  BEGIN
    UPDATE BRRCP
    SET BRRC_ID_RGNR = :BRRC_ID,
        BRLS_ID_LSNR = :BRLS_ID
    WHERE BRRC_ID_RGNR IS NULL AND
          BRLS_ID_LSNR IS NULL AND
          BAUFPO_ID_AUFNRPOS = :BAUFPO_ID AND
          BKUNDE_ID = BKUNDE_ID;
  END

  /* Nebenkosten neu berechnen */
  EXECUTE PROCEDURE P_BRRCNK_AUTO(:BRRC_ID, 1)
    RETURNING_VALUES (:Counter);
  /* Rechnungskopf neu berechnen */
  EXECUTE PROCEDURE P_BRRC_NEUBERECHNUNG (:BRRC_ID);
END

Code: Alles auswählen

CREATE PROCEDURE P_BRLS_NACH_BRRCP (
    BRLS_ID INTEGER)
AS
DECLARE VARIABLE BKUNDE_ID INTEGER;
DECLARE VARIABLE BADR_ID_LADRCODE INTEGER;
DECLARE VARIABLE BRRC_ID INTEGER;
DECLARE VARIABLE SJA VARCHAR(1);
DECLARE VARIABLE SNEIN VARCHAR(1);
DECLARE VARIABLE COUNTER INTEGER;
DECLARE VARIABLE BKUNDE_BWAER_ID INTEGER;
DECLARE VARIABLE MINID INTEGER;
DECLARE VARIABLE TJA VARCHAR(5);
DECLARE VARIABLE NJA INTEGER;
BEGIN
  /* Letzter Stand 07.03.2005 19:02:18 HB */
  /* Protokollieren, dass Aktion hier durchgelaufen ist */
  IF (GEN_ID(GEN_ENTWICKLUNG,0) = 0) THEN
    INSERT INTO A_WASMACHTIB (PROGRAMMTEIL) VALUES ('P_BRLS_NACH_BRRCP');

  EXECUTE PROCEDURE P_BFIRMA_JANEIN RETURNING_VALUES (:SJA, :SNEIN);

  /* Informationen aus dem Lieferschein holen */
  SELECT KA.BKUNDE_ID_LINKKEY,
         KA.BADR_ID_LADRCODE,
         KB.BWAER_ID
  FROM BRLS KA
  LEFT OUTER JOIN BKUNDE KB ON KA.BKUNDE_ID_LINKKEY = KB.ID
  WHERE KA.ID = :BRLS_ID
  INTO :BKUNDE_ID,
       :BADR_ID_LADRCODE,
       :BKUNDE_BWAER_ID;

  SELECT MIN(PL.ID)
  FROM BRLS PO
  LEFT OUTER JOIN V_BRLSP PL ON PL.BRLS_ID_LSNR = PO.ID
  WHERE PO.ID = :BRLS_ID
  INTO :MINID;

  SELECT KL.BADR_ID_READRNR
  FROM BRLS KI
  LEFT OUTER JOIN V_BRLSP KO ON KO.BRLS_ID_LSNR = KI.ID
  LEFT OUTER JOIN BAUF KL ON KL.MASKENKEY = KO.BAUF_MASKENKEY
  WHERE KI.ID = :BRLS_ID AND KO.ID = :MINID
  INTO :BADR_ID_LADRCODE;

  SELECT KS.KZ_MWST
  FROM BRLS KP
  LEFT OUTER JOIN BKUNDE KS ON KP.BKUNDE_ID_LINKKEY = KS.ID
  WHERE KP.ID = :BRLS_ID
  INTO :TJA;

  IF (TJA = :SJA) THEN
  TJA = '1';
  ELSE
  TJA = '2';

  SELECT PROZENT
  FROM BMWST
  WHERE ID = :TJA
  INTO :NJA;


  /* Rechnungen anlegen */
  BRRC_ID = NULL;
  SELECT ID
  FROM BRRC
  WHERE BKUNDE_ID_LINKKEY = :BKUNDE_ID AND
        BADR_ID_RADRCODE = :BADR_ID_LADRCODE AND
        RGGEDRUCKT = :SNEIN AND
        RECHNUNGSART = 'R' AND
        BWAER_ID = :BKUNDE_BWAER_ID
  INTO :BRRC_ID;

  IF (BRRC_ID IS NULL) THEN
  BEGIN
    BRRC_ID = GEN_ID(GEN_BRRC, 1);
    INSERT INTO BRRC(
      ID,
      MASKENKEY,
      ANSPRECHP,
      GESAMT,
      GUTSCHR,
      GUTSCHRART,
      BKUNDE_ID_LINKKEY,
      MWST,
      BMWST_ID_MWSTKZ,
      MWSTSATZ,
      NETTO,
      BADR_ID_RADRCODE,
      RECHDATUM,
      BABT_ID_RGABTNR,
      RGGEDRUCKT,
      UZEICH,
      VERBUCHT,
      VERRECHNET,
      BRRCNK_SUMME,
      RECHNUNGSART,
      ABSCHLAGPROZENT,
      BMAND_ID,
      BZAHBE_ID_ZAHLBED1K,
      BZAHBE_ID_ZAHLBED2K,
      BZAHBE_ID_ZAHLBED3K,
      BZAHBE_ID_ZAHLBED4K,
      BWAER_ID_WAEHRUNGK,
      GESAMT_FW,
      MWST_FW,
      NETTO_FW,
      BRRCNK_SUMME_FW,
      BWAER_ID,
      KURS_FW)
      SELECT
        :BRRC_ID,
        NULL,
        B.ANSPRECHP,
        0.0,
        :SNEIN,
        NULL,
        B.BKUNDE_ID_LINKKEY,
        0,
        :TJA,
        :NJA,
        0.0,
        B.BADR_ID_LADRCODE,
        CURRENT_DATE,
        B.BABT_ID_LSABTNR,
        :SNEIN,
        B.UZEICH,
        :SNEIN,
        :SNEIN,
        0.0,
        'R',
        0,
        B.BMAND_ID,
        E.BZAHBE_ID_ZAHL1K,
        E.BZAHBE_ID_ZAHL2K,
        E.BZAHBE_ID_ZAHL3K,
        E.BZAHBE_ID_ZAHL4K,
        C.BWAER_ID_FV_WAER,
        0.0,
        0.0,
        0.0,
        0.0,
        E.BWAER_ID,
        F.KURS
        FROM BRLS B
        LEFT OUTER JOIN BFIRMA C ON C.ID = 1
        LEFT OUTER JOIN BMWST D ON C.BMWST_ID_MWSTKENNZ = D.ID
        LEFT OUTER JOIN BKUNDE E ON B.BKUNDE_ID_LINKKEY = E.ID
        LEFT OUTER JOIN BWAER F ON E.BWAER_ID = F.ID
        WHERE B.ID = :BRLS_ID;
  END

  UPDATE BRRCP XA
  SET XA.BRRC_ID_RGNR = :BRRC_ID
  WHERE XA.BRRC_ID_RGNR IS NULL AND XA.BRLS_ID_LSNR = :BRLS_ID AND
        XA.BAUFPO_ID_AUFNRPOS IN
        (SELECT XB.BAUFPO_ID_AUFNRPOS
         FROM BRRCP XB
         LEFT OUTER JOIN BAUFPO XC ON XB.BAUFPO_ID_AUFNRPOS = XC.ID
         LEFT OUTER JOIN BAUF XD ON XC.BAUF_ID_LINKKEY = XD.ID
         WHERE XB.BRLS_ID_LSNR = :BRLS_ID AND
               XB.BRLS_ID_LSNR IS NOT NULL AND
               XD.BWAER_ID = :BKUNDE_BWAER_ID);

  /* Nebenkosten neu berechnen */
  EXECUTE PROCEDURE P_BRRCNK_AUTO(:BRRC_ID, 1)
    RETURNING_VALUES (:Counter);

  /* Frachtkosten berechnen */
  EXECUTE PROCEDURE P_BRRC_FRACHTKOSTEN(:BRRC_ID, :BRLS_ID);

  /* Rechnungskopf neu berechnen */
  EXECUTE PROCEDURE P_BRRC_NEUBERECHNUNG (:BRRC_ID);
END
Antworten