Rechnungsadresse nachträglich ändern

Allgemeine Diskussionen um die ERP Software AvERP

Moderator: SYNERPY

Antworten
RKR
Beiträge: 88
Registriert: Do Mär 15, 2007 11:07 am
Wohnort: Hochheim am Main (Hessen)

Rechnungsadresse nachträglich ändern

Beitrag von RKR »

Hallo,

ist es möglich das Ändern der Rechnungsadresse des Kunden auch nach dem erstellen des Lieferscheins zu erlauben bzw. dass das auch noch in der Rechnung selbst möglich wird?

Wo kann man diese Einstellungen vornehmen?

Es kommt bei uns des Öfteren vor, dass sich die Rechnungsadresse im Nachhinein ändert...


Für eine Abhilfe wären wir sehr dankbar :roll: .
MfG > RKR

GDB-Version: AvERP2009-A
Software-Version: 3.6.0.15
NPLADMIN
Beiträge: 163
Registriert: Di Okt 07, 2008 7:54 am
Wohnort: Oxbüll / Wees

Beitrag von NPLADMIN »

Hallo,

ansich ist es ohne weiteres möglich in der Rechnung die Adresse zu ändern, solange sie nicht verbucht wurde
und eine abweichende Liefer-bzw. Rechnungsadresse beim Kunden hinterlegt ist.

Eine zusätzliche Adresse kann im Kundenstamm eingerichtet werden.
Gruß
KTS

AvERP-Exe: 4.2.1.6
Datenbank: AvERP2009-A.01
_________________________
Suchen heißt finden und je mehr man sucht um so mehr findet man. ;-)
Geri12
Beiträge: 589
Registriert: Mi Apr 16, 2008 7:51 am

Beitrag von Geri12 »

Hallo,
um zu wissen, ob es für Sie hinhaut, muß man wissen, welche Datenbank-Version Sie benutzen ! In der 2008er-A14 war das nämlich nicht so ohne weiteres möglich ...
1. Erweiterung in Trigger BAUF_BU0
2. Alle Auftrags-Pos. müssen noch im Rechnungsrückstand sein

Ich fände es hilfreich, wenn bei einer Anfrage zumindest die DB-Version mit genannt wird - evt. direkt in der Signatur, dann braucht man sie nicht ständig einzutippen ...
Gruß
Geri12

Software-Version: V4.2.5.2
FDB-Version: AvERP2008-A.14
RKR
Beiträge: 88
Registriert: Do Mär 15, 2007 11:07 am
Wohnort: Hochheim am Main (Hessen)

Beitrag von RKR »

Danke für die schnellen Anworten.

Unsere Version siehe Signatur 8).

Also wenn ich veruche die Rechnungsadresse in der Rechnung zu ändern, dann erscheint die Meldung "Der Datensatz darf nicht geändert werden.", auch wenn die Rechnung noch nicht gedruckt und auch noch nicht verbucht wurde.

Auch vor der Rechnungserzeugung kann die Rechnungsadresse in der Auftrgasmaske (BAUF) nicht mehr geändert werden, sobald ein Lieferschein generiert wurde. Es erscheint die Meldung "Die Positionen sind nicht mehr komplett im Rückstand.", was ja auch stimmt wegen dem LS.

Gibt es also nur die Möglichkeit den Trigger BAUF_BU0 zu verändern, oder gibt es auch eine einfachere Lösung, oder hat jemand den Trigger schon dementsprechend modifiziert und kann dies posten?
MfG > RKR

GDB-Version: AvERP2009-A
Software-Version: 3.6.0.15
Geri12
Beiträge: 589
Registriert: Mi Apr 16, 2008 7:51 am

Beitrag von Geri12 »

RKR hat geschrieben:Also wenn ich veruche die Rechnungsadresse in der Rechnung zu ändern, dann erscheint die Meldung "Der Datensatz darf nicht geändert werden.", auch wenn die Rechnung noch nicht gedruckt und auch noch nicht verbucht wurde.
Aber die offene Rechnug hat halt schon Positionen hinterlegt.
Auch vor der Rechnungserzeugung kann die Rechnungsadresse in der Auftrgasmaske (BAUF) nicht mehr geändert werden, sobald ein Lieferschein generiert wurde. Es erscheint die Meldung "Die Positionen sind nicht mehr komplett im Rückstand.", was ja auch stimmt wegen dem LS.
Genau. Ist eine Abfrage im Trigger, ob schon geliefert. Wenn ja, dann kann die Lieferadresse logischerweise nicht mehr geändert werden - Ok. Aber an dieser Stelle wird auch die Änderung der Rech.Adresse gesperrt.
Gibt es also nur die Möglichkeit den Trigger BAUF_BU0 zu verändern, oder gibt es auch eine einfachere Lösung, oder hat jemand den Trigger schon dementsprechend modifiziert und kann dies posten?
Ja.

Code: Alles auswählen

*SNIP*
    -- Wenn sich der Positionsrabatt ändert, dann gesammte Positionen den Rabatt1 ändern
    -- Erlaubt nachträgliches manuelles Ändern des RABATT1 in der BAUFPO
    IF (NEW.BAUFPO_RABATT <> OLD.BAUFPO_RABATT) THEN
      UPDATE BAUFPO
      SET RABATT1 = NEW.BAUFPO_RABATT
      WHERE BAUF_ID_LINKKEY = NEW.ID;

    -- Lieferadresse nur änderbar, wenn der komplette Auftrag noch im Lieferrückstand ist
    IF (F_EQUALINTEGER(NEW.BADR_ID_LIEFADRNR, OLD.BADR_ID_LIEFADRNR) = 0 AND
        NEW.AUFTRAG = SJA AND OLD.AUFTRAG = SJA) THEN
      IF (EXISTS (SELECT FIRST 1 A.ID
                  FROM BRRCP A, BAUFPO B
                  WHERE A.BAUFPO_ID_AUFNRPOS = B.ID AND
                        B.BAUF_ID_LINKKEY = NEW.ID AND
                        A.BKUNDE_ID = OLD.BKUNDE_ID_KUNR AND
                        ((A.LS_BUCHUNGSART IS NOT NULL) OR
                         (A.BRLS_ID_LSNR IS NOT NULL)))) THEN
        EXCEPTION DELETE_RUECKSTAND;

    -- Rechnungsadresse nur änderbar, wenn der komplette Auftrag noch im Rechnungsrückstand ist
    IF (F_EQUALINTEGER(NEW.BADR_ID_READRNR, OLD.BADR_ID_READRNR) = 0 AND
        NEW.AUFTRAG = SJA AND OLD.AUFTRAG = SJA) THEN
      IF (EXISTS (SELECT FIRST 1 A.ID
                  FROM BRRCP A, BAUFPO B
                  WHERE A.BAUFPO_ID_AUFNRPOS = B.ID AND
                        B.BAUF_ID_LINKKEY = NEW.ID AND
                        A.BKUNDE_ID = OLD.BKUNDE_ID_KUNR AND
                        ((A.RG_BUCHUNGSART IS NOT NULL) OR
                         (A.BRRC_ID_RGNR IS NOT NULL)))) THEN
        EXCEPTION DELETE_RUECKSTAND;

    -- MwSt.belegen
    IF (NEW.BMWST_ID_MWSTKZ IS NULL) THEN
      EXECUTE PROCEDURE P_LIEFADR_MWSTKZ_ERMITTELN (NULL, NEW.BADR_ID_LIEFADRNR,
                                                    NEW.BKUNDE_ID_KUNR, NEW.BTOUR_ID_TOURKZ,
                                                    NEW.BMAND_ID)
      RETURNING_VALUES (:MWST_BERECHNEN, NEW.BMWST_ID_MWSTKZ);
*SNIP*
 
Folgendes Vorgehen:
1. Trigger abändern + kompilieren
2. Bei der entspr. Rechnung die Positionen löschen
3. Im zugehörigen Auftrag die Rech.Adr. ändern
4. In der Rechnung die Rech.Adr. ändern
5. Die Positionen wieder in die Rechnung ziehen
Gruß
Geri12

Software-Version: V4.2.5.2
FDB-Version: AvERP2008-A.14
RKR
Beiträge: 88
Registriert: Do Mär 15, 2007 11:07 am
Wohnort: Hochheim am Main (Hessen)

Beitrag von RKR »

Habe es mal in unserer Testumgebung ausprobiert, wenn man also den Eintrag "-- Rechnungsadresse nur änderbar, wenn der komplette Auftrag noch im Rechnungsrückstand ist" außer Kraft setzt, dann lässt sich auch nach Erstellung des LS noch die Rechnungsadresse im Auftrag ändern, so wie wir es also brauchen.

Danke soweit.
MfG > RKR

GDB-Version: AvERP2009-A
Software-Version: 3.6.0.15
Geri12
Beiträge: 589
Registriert: Mi Apr 16, 2008 7:51 am

Beitrag von Geri12 »

Hohoho, langsam ...

Der von mir gepostete Ausschnitt (aus der Datenbank 2009-A.01 bzw. A.02) gestaltet die Überprüfung derart, dass im Auftrag die Lieferadresse nur geändert werden kann, wenn noch alle Auftrags-Pos. im LieferRückstand sind. Der Status der AuftragsPos. in Richtung "Rechnung" ist dabei egal (d.h. egal, ob noch im RechPosRückstand oder ob schon berechnet).

Das selbe gilt umgekehrt für die Rechnungsadresse: Im Auftrag kann die Rechnungsadresse nur geändert werden kann, wenn noch alle Auftrags-Pos. im RechnungsRückstand sind. Der Status der AuftragsPos. in Richtung "Lieferschein" ist dabei egal (d.h. egal, ob noch im LiefPosRückstand oder ob schon geliefert).

Das sagt aber nichts darüber aus, ob die Rechnungs-Adresse auch in der zugehörigen Rechnung geändert werden kann. Das geht nämlich nach meiner Erfahrung nur, wenn die Rechnung keine Positionen hat.

Wenn der oben beschriebene und von Ihnen erwähnte Passus bzgl. der Überprüfung des RechPosRückstandes ausgeREMt wird, dann kann man die Auftrags-Rech.Adresse sogar dann ändern, wenn nicht mehr alle Auftrags-Pos. im Rechnungsrückstand sind. Das würde allerdings meiner Meinung nach nur beim Auftrag funktionieren. Nicht aber bei der Rechnung, dann dort wird auch kontrolliert, ob schon Positionen hinterlegt sind.

Meines Erachtens ist der erste notwendige Schritt immer, die schon angelegten RechnungsPos. zu löschen und somit wieder in den RechPos-Rückstand zurückzugeben.
Sie sollten die Sicherheitsüberprüfung in der BAUF_BU0 nicht ausschalten, sonst stimmen evt. (je nach Anwender :wink: ) die Rech.Adressen in Auftrag und zugehöriger Rechnung nicht mehr überein.

So sieht außerdem der Quellcode in der 2008-A.14 noch aus ...

Code: Alles auswählen

    -- Liefer oder Rechnungsadresse geändert nur wenn noch alles offen ist
    IF (((F_EQUALINTEGER(NEW.BADR_ID_LIEFADRNR, OLD.BADR_ID_LIEFADRNR) = 0) OR
         ((F_EQUALINTEGER(NEW.BADR_ID_READRNR, OLD.BADR_ID_READRNR) = 0))) AND
         ((NEW.AUFTRAG = SJA) AND (OLD.AUFTRAG = SJA))) THEN
      IF (EXISTS (SELECT FIRST 1 A.ID
                  FROM BRRCP A, BAUFPO B
                  WHERE A.BAUFPO_ID_AUFNRPOS = B.ID AND
                        B.BAUF_ID_LINKKEY = NEW.ID AND
                        A.BKUNDE_ID = OLD.BKUNDE_ID_KUNR AND
                        ((A.LS_BUCHUNGSART IS NOT NULL) OR
                         (A.RG_BUCHUNGSART IS NOT NULL) OR
                         (A.BRLS_ID_LSNR IS NOT NULL) OR
                         (A.BRRC_ID_RGNR IS NOT NULL)))) THEN
        EXCEPTION DELETE_RUECKSTAND;
Hier konnte noch nicht einmal die RechAdresse im Auftrag geändert werden, wenn schon ein Lieferschein, aber keine Rechnung erstellt war ...
Gruß
Geri12

Software-Version: V4.2.5.2
FDB-Version: AvERP2008-A.14
admin
Site Admin
Beiträge: 2673
Registriert: Di Feb 10, 2004 5:48 am
Wohnort: Bayreuth

Beitrag von admin »

Wir haben das in unserer derzeitigen Version etwas anders gelöst:
Bei der Erfassung von Rechnungspositionen wird die Rechnungsadresse des Auftrags geprüft.
Beim Aufruf des Erfassen-Buttons in den Rechnungspositionen gibt es jetzt eine weitere Option "Positionen zu anderer Rechnungsadresse des Kunden", bei der die Rechnungsadresse des Auftrags bei der Erfassung ignoriert wird, es zählt lediglich der Kunde:

Code des Buttons (EIGENE GEFAHR, ERST IN DEMOVERSION TESTEN):

Code: Alles auswählen

Begin
  // Rechnungsrückstand erfassen
  // Letzter Stand: 09.12.2008 AK
  // keine Erfassung von Rückständen mit BAUFPO_RG_LS_ERZ = 'L'

  //DebugOn := true;

  // Anzeigemodus prüfen
  if ((q_1.state = dssInsert) or (q_1.state = dssEdit)) then
  begin
    Messagebox('Nur im Anzeigemodus möglich !','Erfassung Rechnungspositionen',0);
    bPascalScriptOK := false;
    Goto 1;
  end; 

  // Erfassungsbutton bietet je nach Rechnungs- oder Gutschriftsart 
  // entsprechende Positionen zur Auswahl an

  // Linkkey übernehmen
  iBRRC_ID := nLinkkeyID;

  // Rechnungskopf prüfen
  if (iBRRC_ID = 0) then
  begin
    Messagebox('Gültige Rechnungsnummer (Rechnungskopf) fehlt !','Erfassung Rechnungspositionen',0);
    bPascalScriptOK := false;
    Goto 1;
  end; 

  // Erfassungsfenster prüfen
  O_AUFLIST := 0;
  O_Auflist := Application.FindComponent('frmauflist2');
  
  if O_Auflist = 0 then
  begin 
    bPascalScriptOK := false;
    MessageBox('Konnte Erfassungsfenster nicht finden','ACHTUNG',0);
    Goto 1;
  end;

  // Mandant berücksichtigen
    iBMAND_ID := 0;
    frmData.Universal.Close();
    frmData.Universal.SQL.Text := 'SELECT BMAND_ID FROM BRRC WHERE ID= :iBRRC_ID';
    frmData.Universal.ParamByName('iBRRC_ID', iBRRC_ID);
    frmData.Universal.Open();
    Fld := frmData.Universal.FieldByName('BMAND_ID');
    iBMAND_ID := Fld.AsInteger;
    frmData.Universal.Close();

  // zusätzliche Suchbedingungen ermitteln
  // Auftragsnr wird immer berücksichtigt
  sWhereBAUF := '';
  sTemp := Trim(E_BAUF_MASKENKEY.TEXT);
  if sTemp <> '' then
  Begin
    sTemp := StringReplace(sTemp,'*','%');
    sTemp := StringReplace(sTemp,'?','_');
    sWhereBAUF := ' AND (A.BAUF_MASKENKEY LIKE ' + QuotedStr(sTemp + '%')+')';
  end;
  // Artikelnr wird nur berücksichtigt, wenn "Einzelpositionen" in Auswahl erlaubt sind
  sWhereBSA := '';
  sTemp := Trim(E_BSA_MASKENKEY.TEXT);
  if sTemp <> '' then
  Begin
    sTemp := StringReplace(sTemp,'*','%');
    sTemp := StringReplace(sTemp,'?','_');
    sWhereBSA := ' AND (A.BSA_MASKENKEY LIKE ' + QuotedStr(sTemp + '%')+')';
  end;

  // Umschalten von Such- in Anzeigemodus
  if ((iBRRC_ID > 0) and (q_1.state = dssSearch)) then
    q_1.post;

  // Kundennummer und Adressnr. holen
  iBKUNDE_ID := 0;   
  iBADR_ID := 0;
  MyQuery := FrmData.Universal;
  MyQuery.Close;
  MyQuery.Sql.Text := 'SELECT * FROM BRRC WHERE ID = ' + IntToStr(iBRRC_ID);
  MyQuery.Open;
  iBKUNDE_ID := AsInteger(MyQuery.FieldByName('BKUNDE_ID_LINKKEY'));
  iBADR_ID   := AsInteger(MyQuery.FieldByName('BADR_ID_RADRCODE'));
  iBADR_ID_POST := AsInteger(MyQuery.FieldByName('BADR_ID_POST'));
  nABSCHLAGPROZENT := AsFloat(MyQuery.FieldByName('ABSCHLAGPROZENT'));
  MyQuery.Close;

  if iBKUNDE_ID <= 0 then 
  begin
    bPascalScriptOK := false;
    MessageBox('Konnte Kundennummer nicht finden','ACHTUNG',0);
    Goto 1;
  end;

  if iBADR_ID <= 0 then 
  begin
    bPascalScriptOK := false;
    MessageBox('Konnte Rechnungsadresse nicht finden','ACHTUNG',0);
    Goto 1;
  end;

  // manuell erfasste Gutschriften  
  // -----------------------------
  if length(lblGUTSCHRART.Caption)>0 then
  begin
    sAuswahl := '"Einzelpositionen", "Lieferscheinweise", "Auftragsweise"';
    nAuswahl := SipMessage('Gutschrifterfassungsart', sAuswahl, '0,1');
    if nAuswahl < 0 then 
    begin
      bPascalScriptOK := false;
      GOTO 1;
    end;

    // Gutschrifterfassung (Einzelpositionen)
    if nAuswahl = 0 then
    begin
      sSelect := 'ID';
      sWhere := '';
      sOrder := 'A.BAUFPO_ID_LINKKEY, A.BAUFPO_MASKENKEY';
      O_Auflist.Caption := 'Gutschrifterfassung (Einzelpositionen)';
    end

    // Gutschrifterfassung (Lieferscheinweise)
    else if nAuswahl = 1 then
    begin
      sSelect := 'BRLS_ID_LSNR';
      sWhere := ' AND (A.BRLS_ID_LSNR > 0) ';
      sOrder := 'A.BRLS_ID_LSNR, A.BAUFPO_ID_LINKKEY, A.BAUFPO_MASKENKEY';
      O_Auflist.Caption := 'Gutschrifterfassung ( Nach Lieferschein )';
    end
    
    // Gutschrifterfassung (Auftragsweise)
    else if nAuswahl = 2 then
    begin
      sSelect := 'BAUFPO_ID_LINKKEY';
      sWhere := '';
      sOrder := 'A.BAUFPO_ID_LINKKEY, A.BAUFPO_MASKENKEY';
      O_Auflist.Caption := 'Gutschrifterfassung ( Auftragsweise )';
    end;
    
    // Bei Gutschriftarten, die sich auf einen Liefermenge beziehen, muss es auch vorher einen LS gegeben haben
    if Pos(lblGUTSCHRART.Caption,'W/R/B/S') > 0 then
      sWhere := sWhere + ' AND A.BRLS_ID_LSNR IS NOT NULL AND A.LS_BUCHUNGSART IS NULL'; 

    // Positionen manueller Gutschriften beziehen sich auf in Rechnung gestellte Positionen,
    // eine Lieferung kann, muß aber noch nicht erfolgt sein (P_BRRCP_IN_BRRCP)
    O_Auflist.MultiselectIDFeld := sSelect;
    O_Auflist.ProcInputNameID := 'QUELLE_ID';
    O_Auflist.StP_Uebername.StoredProcName := 'P_BRRCP_IN_BRRCP'; 
    O_Auflist.StP_Uebername.ParamByName('ZIEL_ID_LINKKEY', nLinkkeyID);
    O_Auflist.Q_Erfassung.SQL.Text := 'SELECT A.ID, ' +
                                      '       A.MENGE, ' +
                                      '       A.MENGE - F_ZAHLRUNDEN((SELECT SUM(B.MENGE) ' +
                                      '                                FROM BRRCP B ' +
                                      '                                WHERE B.BRRCP_ID_BRRCP = A.ID),4) AS "OFFENE_MENGE", ' +
                                      '       A.BAUFPO_ID_LINKKEY, ' +
                                      '       A.BAUFPO_MASKENKEY, ' +
                                      '       A.BRLS_ID_LSNR AS "BRLS_ID", ' +
                                      '       A.* ' + 
                                      'FROM V_BRRCP A ' +
                                      'WHERE A.BKUNDE_ID = :BKUNDE_ID AND ' +
                                      '      A.BAUF_BMAND_ID = :iBMAND_ID AND ' +
                                      '      A.GPREIS > 0 ' +
                                             sWhere + sWhereBAUF + sWhereBSA + 
                                      ' ORDER BY ' + sOrder;
    O_Auflist.Q_Erfassung.ParamByName('BKUNDE_ID', iBKUNDE_ID);
    O_Auflist.Q_Erfassung.ParamByName('iBMAND_ID', iBMAND_ID);

    // Parameter für die Erfassung von Gutschriften wurden geändert, da sonst keine Abschlagsrechnungen
    // gutgeschrieben werden können

    //O_Auflist.Q_Erfassung.SQL.Text := 'SELECT A.* FROM V_BRRCP A' +
    //                                  ' WHERE A.BKUNDE_ID = :BKUNDE_ID AND' +
    //                                        ' A.BAUF_BMAND_ID = :iBMAND_ID AND' +
    //                                  ' (A.LS_BUCHUNGSART IS NULL) AND (A.GPREIS > 0) ' +
    //                                  sWhere + sWhereBAUF + sWhereBSA + ' ORDER BY ' + sOrder;
  end

  // Pauschale Abschlagsrechnung ( Abschlagszahlungsauftrag mit Auftragsstatus ? BTOUR.ABSCHLAG = 'J' )
  // --------------------------------------------------------------------------------------------------
  else if (lblRECHNUNGSART.Caption = 'P') then
  begin
    sAuswahl := '"Abrufauftrag Einzelpositionen", "Abrufauftrag Auftragsweise"';
    nAuswahl := SipMessage('Pauschale Abschlagsrechnung Erfassungsart', sAuswahl, '0,1');
    if nAuswahl < 0 then 
    begin
      bPascalScriptOK := false;
      GOTO 1 ;
    end;

    // Abrufauftrag Einzelpositionen
    if nAuswahl = 0 then
    begin
      sSelect := 'ID';
      sWhere := '';
      sOrder := 'BAUFPO_ID_LINKKEY,BAUFPO_MASKENKEY';
      O_Auflist.Caption := 'Abrufauftrag Einzelpositionen';
    end

    // Abrufauftrag Auftragsweise
    else if nAuswahl = 1 then
    begin
      sSelect := 'BAUFPO_ID_LINKKEY';
      sWhere := '';
      sOrder := 'BAUFPO_ID_LINKKEY,BAUFPO_MASKENKEY';
      O_Auflist.Caption := 'Abrufauftrag Auftragsweise';
    end;

    // Positionen pauschaler Abschlagsrechnungen beziehen sich auf in Rechnungs-Rückstand gestellte Positionen
    // mit LS_BUCHUNGSART 20 und positivem Preis, Lieferungen gibt es hierzu nicht (P_BRRCR_IN_BRRCP)                      
    O_Auflist.MultiselectIDFeld := sSelect;
    O_Auflist.ProcInputNameID := 'QUELLE_ID';
    O_Auflist.StP_Uebername.StoredProcName := 'P_BRRCR_IN_BRRCP'; 
    O_Auflist.StP_Uebername.ParamByName('ZIEL_ID_LINKKEY', nLinkkeyID);
    O_Auflist.Q_Erfassung.SQL.Text := 'SELECT A.* FROM V_BRRCR A' +
                                      ' WHERE A.BKUNDE_ID = :BKUNDE_ID' +
                                      ' AND A.BAUF_BMAND_ID = :iBMAND_ID' +
                                      ' AND A.BAUF_BADR_ID_READRNR = :BADR_ID' +
                                      ' AND (A.BAUF_BADR_ID_POST = :BADR_ID_POST OR A.BAUF_BADR_ID_POST IS NULL)'+
                                      ' AND (A.LS_BUCHUNGSART IS NOT NULL) AND (A.LS_BUCHUNGSART = 20) AND (A.GPREIS > 0)' +
                                      ' AND A.BAUFPO_RG_LS_ERZ <> ' + QuotedStr('L') +  // es dürfen keine rückstände mit KZ L erfasst werden
                                      sWhere + sWhereBAUF + sWhereBSA + ' ORDER BY ' + sOrder;
    O_Auflist.Q_Erfassung.ParamByName('BKUNDE_ID', iBKUNDE_ID);
    O_Auflist.Q_Erfassung.ParamByName('BADR_ID', iBADR_ID);
    O_Auflist.Q_Erfassung.ParamByName('BADR_ID_POST', iBADR_ID_POST);
    O_Auflist.Q_Erfassung.ParamByName('iBMAND_ID', iBMAND_ID);
  end

  // Schlussrechnung von Auftrag
  // ---------------------------
  else if  (lblRECHNUNGSART.Caption = 'S') then
  begin
    // sAuswahl := '"Schlussrechnung von Auftrag"';
    // keine Auswahl, da nur Auftragsweise sinnvoll
    sSelect := 'BAUFPO_ID_LINKKEY';
    sWhere := '';
    sOrder := 'BAUFPO_ID_LINKKEY,BAUFPO_MASKENKEY,LS_BUCHUNGSART';
    O_Auflist.Caption := 'Schlussrechnung von Auftrag';

    // Positionen von Schlussrechnungen beziehen sich auf in Rechnungs-Rückstand gestellte Positionen
    // mit LS_BUCHUNGSART = Null und positivem Preis, Lieferungen kann, muss es aber nicht geben
    // zusätzlich werden alle Gutschrifts-DS der Abschlagszahlungen (negative Beträge) mit übernommen                      
    // Änderungen nicht erlaubt ,nur löschen, solange nicht gedruckt (==>ist das so richtig?)
    O_Auflist.MultiselectIDFeld := sSelect;
    O_Auflist.ProcInputNameID := 'QUELLE_ID';
    O_Auflist.StP_Uebername.StoredProcName := 'P_BRRCR_IN_BRRCP'; 
    O_Auflist.StP_Uebername.ParamByName('ZIEL_ID_LINKKEY', nLinkkeyID);
    O_Auflist.Q_Erfassung.SQL.Text := 'SELECT A.* FROM V_BRRCR A' +
                                      ' WHERE A.BKUNDE_ID = :BKUNDE_ID' +
                                      ' AND A.BAUF_BMAND_ID = :iBMAND_ID' +
                                      ' AND A.BAUF_BADR_ID_READRNR = :BADR_ID' +
                                      ' AND (A.BAUF_BADR_ID_POST = :BADR_ID_POST OR A.BAUF_BADR_ID_POST IS NULL)'+
                                      ' AND (((A.LS_BUCHUNGSART IS NULL) AND (A.GPREIS > 0))' +
                                      ' AND A.BAUFPO_RG_LS_ERZ <> ' + QuotedStr('L') +  // es dürfen keine rückstände mit KZ L erfasst werden
                                      ' OR ((A.LS_BUCHUNGSART IS NOT NULL) AND (A.LS_BUCHUNGSART = 21) AND (A.GPREIS <= 0 )))' +
                                      sWhere + sWhereBAUF + ' ORDER BY ' + sOrder;
    O_Auflist.Q_Erfassung.ParamByName('BKUNDE_ID', iBKUNDE_ID);
    O_Auflist.Q_Erfassung.ParamByName('BADR_ID', iBADR_ID);
    O_Auflist.Q_Erfassung.ParamByName('BADR_ID_POST', iBADR_ID_POST);
    O_Auflist.Q_Erfassung.ParamByName('iBMAND_ID', iBMAND_ID);
  end

  // Prozentuale Abschlagsrechnung von normalem Auftrag
  // --------------------------------------------------
  else if  (lblRECHNUNGSART.Caption = 'A') then
  begin

    // Wenn bereits Positionen eines Auftrags vorhanden, keine weiteren zulassen
    if (lblPosiVorhanden.Caption = 'J') and (nABSCHLAGPROZENT > 0.0) then
    begin
      Messagebox('prozentuale Abschlagsrechnung nur für einen Auftrag möglich !','Hinweis',0);
      bPascalScriptOK := false;
      Goto 1;
    end;

    // keine Auswahl, da nur Auftragsweise sinnvoll
    sSelect := 'BAUFPO_ID_LINKKEY';
    sWhere := '';
    sOrder := 'BAUFPO_ID_LINKKEY,BAUFPO_MASKENKEY';
    O_Auflist.Caption := 'Prozentuale Abschlagsrechnung von Auftrag';

    // Positionen prozentualer Abschlagsrechnungen beziehen sich auf in Rechnungs-Rückstand gestellte Positionen
    // mit LS_BUCHUNGSART = Null und positivem Preis, Lieferungen kann, muss es aber nicht geben 
    // die DS werden durch kopieren der Original-DS erstellt, 
    // Änderungen nicht erlaubt,nur löschen, solange nicht gedruckt, Mit Druck wird Gutschrifts-DS erstellt                      
    O_Auflist.MultiselectIDFeld := sSelect;
    O_Auflist.ProcInputNameID := 'QUELLE_ID';
    O_Auflist.StP_Uebername.StoredProcName := 'P_BRRCR_IN_BRRCP_ABSCHLAG'; 
    O_Auflist.StP_Uebername.ParamByName('ZIEL_ID_LINKKEY', nLinkkeyID);
    O_Auflist.Q_Erfassung.SQL.Text := 'SELECT A.* FROM V_BRRCR A' +
                                      ' WHERE A.BKUNDE_ID = :BKUNDE_ID' +
                                      ' AND A.BAUF_BMAND_ID = :iBMAND_ID' +
                                      ' AND A.BAUF_BADR_ID_READRNR = :BADR_ID' +
                                      ' AND (A.BAUF_BADR_ID_POST = :BADR_ID_POST OR A.BAUF_BADR_ID_POST IS NULL)' +
                                      ' AND A.BAUFPO_RG_LS_ERZ <> ' + QuotedStr('L') +  // es dürfen keine rückstände mit KZ L erfasst werden
                                      ' AND (A.LS_BUCHUNGSART IS NULL) AND (A.GPREIS > 0) ' +
                                      sWhere + sWhereBAUF + ' ORDER BY ' + sOrder;
    O_Auflist.Q_Erfassung.ParamByName('BKUNDE_ID', iBKUNDE_ID);
    O_Auflist.Q_Erfassung.ParamByName('BADR_ID', iBADR_ID);
    O_Auflist.Q_Erfassung.ParamByName('BADR_ID_POST', iBADR_ID_POST);
    O_Auflist.Q_Erfassung.ParamByName('iBMAND_ID', iBMAND_ID);
  end

  // Standard-Rechnung 
  // -----------------
  else if (lblRECHNUNGSART.Caption = 'R') then
  begin
    // Rechnungspositionen
    // SipMessagbox Abfrage der Erfassungart
    sAuswahl := '"Lieferscheinweise","Auftragsweise","Einzelpositionen (ohne Aufträge mit GesamtabwicklungsKZ=J)","Positionen zu anderer Rechnungsadresse des Kunden"';
    nAuswahl := SipMessage('Rechnungserfassungsart', sAuswahl, '0,1');
    
		if (nAuswahl < 0) then 
    begin
      bPascalScriptOK := false;
      GOTO 1 ;
    end    
    // Rechnungserfassung nach Lieferschein
    else if (nAuswahl = 0) then
    begin
      sSelect := 'BRLS_ID_LSNR';
      sWhere := ' AND BRLS_ID_LSNR > 0 ';
      sWhereBADR := ' AND A.BAUF_BADR_ID_READRNR = '+IntToStr(iBADR_ID);      
      sOrder := 'BRLS_ID_LSNR,BAUFPO_ID_LINKKEY,BAUFPO_MASKENKEY';
      O_Auflist.Caption := 'Rechnungserfassung ( Nach Lieferschein )';
    end
    // Rechnungserfassung Auftragsweise
    else if (nAuswahl = 1) then
    begin
      sSelect := 'BAUFPO_ID_LINKKEY';
      sWhere := '';
      sWhereBADR := ' AND A.BAUF_BADR_ID_READRNR = '+IntToStr(iBADR_ID);      
      sOrder := 'BAUFPO_ID_LINKKEY,BAUFPO_MASKENKEY';
      O_Auflist.Caption := 'Rechnungserfassung ( Auftragsweise )';
    end
    // Rechnungserfassung Einzelpositionen (ohne Gesamtabwicklungsaufträge)
    else if (nAuswahl = 2) then
    begin
      sSelect := 'ID';
      sWhere := ' AND ((BAUF_CGESLR <> ''' + AsString(frmData.q_v_bfirma.FieldByName('JA')) + ''') or (BAUF_CGESLR is NULL))';
      sWhereBADR := ' AND A.BAUF_BADR_ID_READRNR = '+IntToStr(iBADR_ID);
      sOrder := 'BAUFPO_ID_LINKKEY,BAUFPO_MASKENKEY';
      O_Auflist.Caption := 'Rechnungserfassung ( Einzelpositionen )'; 
    end
		// Zu anderer Rechnungsadresse
		else if (nAuswahl = 3) then
		begin
      sSelect := 'ID';
      sWhere := '';
      sWhereBADR := '';
      sOrder := 'BAUFPO_ID_LINKKEY,BAUFPO_MASKENKEY';
      O_Auflist.Caption := 'Rechnungserfassung ( Auch adressfremde Positionen erfassen )';		
		end;    

    // Positionen einer Standardrechnung beziehen sich auf in Rechnungs-Rückstand gestellte Positionen
    // (Betrag pos. oder neg.), aber ohne Abschlagszahlungen aufgrund Abrufauftrag (LS_BUCHUNGSART = 20 und Betrag pos.) 
    // Lieferungen kann, muss es aber nicht geben
    O_Auflist.MultiselectIDFeld := sSelect;
    O_Auflist.ProcInputNameID := 'QUELLE_ID';
    O_Auflist.StP_Uebername.StoredProcName := 'P_BRRCR_IN_BRRCP'; 
    O_Auflist.StP_Uebername.ParamByName('ZIEL_ID_LINKKEY', nLinkkeyID);
    O_Auflist.Q_Erfassung.SQL.Text := 'SELECT A.* FROM V_BRRCR A' +
                                      ' WHERE A.BKUNDE_ID = :BKUNDE_ID' +
                                      ' AND (A.BAUF_BADR_ID_POST = :BADR_ID_POST OR A.BAUF_BADR_ID_POST IS NULL)' +
                                      ' AND A.BAUF_BMAND_ID = :iBMAND_ID' +
                                      ' AND A.BAUFPO_RG_LS_ERZ <> ' + QuotedStr('L') +  // es dürfen keine rückstände mit KZ L erfasst werden
                                      ' AND NOT ((A.LS_BUCHUNGSART IS NOT NULL) AND (A.LS_BUCHUNGSART = 20) AND (A.GPREIS >= 0)) ' +
                                      sWhere + sWhereBAUF + sWhereBSA + sWhereBADR + ' ORDER BY ' + sOrder;
    O_Auflist.Q_Erfassung.ParamByName('BKUNDE_ID', iBKUNDE_ID);
    O_Auflist.Q_Erfassung.ParamByName('BADR_ID_POST', iBADR_ID_POST);
    O_Auflist.Q_Erfassung.ParamByName('iBMAND_ID', iBMAND_ID);
  end;
  1:
End;
RKR
Beiträge: 88
Registriert: Do Mär 15, 2007 11:07 am
Wohnort: Hochheim am Main (Hessen)

Beitrag von RKR »

Also die Weise wie Geri12 sie vorschlägt trifft es anscheinend wohl am ehesten.

So lange noch keine Rechnung erzeugt wurde, kann im Auftrag, LS Status spielt dabei keine Rolle, die Rechnungsadresse geändert werden. In der Rechnung selbst ist dies nicht mehr möglich, aber bei Bedarf kann man die Rechnung ja einfach löschen, im Auftrag die Rechnungsadresse dann ändern und eine neue Rechnung generieren. Sobald eine Rechnung erzeugt wurde, kann auch im Auftrag die Rechnungsadresse nicht mehr geändert werden, dafür müsste, wie zuvor, die Rechnung erst gelöscht werden. Für mich ist dies anscheinend also eine "wasserdichte" Lösung um nachträglich abweichende Rechnungsadressen in AvERP zu händeln...wenn ich jetzt nichts übersehen habe?

Einfach den Eintrag "-- Rechnungsadresse nur änderbar, wenn der komplette Auftrag noch im Rechnungsrückstand ist" außer Kraft zu setzten, wie von mir zuvor geschrieben, birgt natürlich die Gefahr von inkonsistenten Daten bei falscher Handhabung bzw. kann schnell vergessen werden, da das System ja alles erlaubt. Dies ist also nicht wirklich empfehlenswert...

Danke.
MfG > RKR

GDB-Version: AvERP2009-A
Software-Version: 3.6.0.15
Geri12
Beiträge: 589
Registriert: Mi Apr 16, 2008 7:51 am

Beitrag von Geri12 »

Hallo RKR
Es muss nicht zwingend die komplette Rechnung gelöscht werden (was evt. in der Rechnungsliste ein Loch in der lfd.Nr. erzeugen würde), sondern es müssen eigentlich nur die Rechnungspositionen dieser Rechnung gelöscht (und somit wieder an den RechPosRückstand zurückgegeben) werden. Der "Rechnungskopf" (sprich: der Datensatz in Maske BRRC) darf stehen bleiben, denn ohne Rechnungspositionen kann hier die Rechnungsadresse geändert werden, ebenso im Auftrag.

Hallo ADMIN
Diese neue Lösung klingt interessant, aber leider orientieren wir uns sehr an den Auftragsdaten. Sollte daher eine Abweichung zw. Auftrags-RechAdr. und Rechungs-RechAdr auftreten, könnte das bei uns zur Verwirrung der unterschiedlichen Sachbearbeiter führen. Die aktuelle Lösung passt für uns am besten ...
Gruß
Geri12

Software-Version: V4.2.5.2
FDB-Version: AvERP2008-A.14
Geri12
Beiträge: 589
Registriert: Mi Apr 16, 2008 7:51 am

Beitrag von Geri12 »

Hallo
admin hat geschrieben:Wir haben das in unserer derzeitigen Version etwas anders gelöst: Bei der Erfassung von Rechnungspositionen wird die Rechnungsadresse des Auftrags geprüft. Beim Aufruf des Erfassen-Buttons in den Rechnungspositionen gibt es jetzt eine weitere Option "Positionen zu anderer Rechnungsadresse des Kunden", bei der die Rechnungsadresse des Auftrags bei der Erfassung ignoriert wird, es zählt lediglich der Kunde:
1. Ist diese Programmerweiterung noch aktuell ? Konnte in der AvERP2009-A.07 nichts entsprechendes finden. Kann da jemand aus einer der AvERP2010er Versionen was dazu sagen ?

2. Wäre eine solche Funktion generell für Buchhaltung und Finanzbehörde im Einklang mit den aktuell geltenden Regeln, wenn eine Teilrechnung an eine andere Adresse als im Auftrag angegeben geht ?

3. Hätte gerade eben (logischerweise wieder mal eine der ganz dringenden Notfallaktionen) eine solche Funktion benötigt. Habe im Trigger BRRC_BU0 den Passus "OR (NEW.BADR_ID_RADRCODE <> OLD.BADR_ID_RADRCODE)" ausgeREMt (Stichwort 'fast-and-dirty'). Das selbe läßt sich auch für Lieferungen im Trigger BRLS_BU0 durchführen. Hier die Frage: Unterlaufe ich damit irgendeine nachgeschaltete Programm-Logik ?
Gruß
Geri12

Software-Version: V4.2.5.2
FDB-Version: AvERP2008-A.14
admin
Site Admin
Beiträge: 2673
Registriert: Di Feb 10, 2004 5:48 am
Wohnort: Bayreuth

Beitrag von admin »

1. Ist in der 2010 enthalten
2. Warum nicht? Generell könnte man ja auch eine Rechnung schreiben, ohne vorab einen Auftrag anzulegen.
3. Hmmmm, auf den ersten Gedanken hin scheint das okay. Man müsste aber schon ein Weilchen Zeit investieren, um hier sicher zu gehen...
Geri12
Beiträge: 589
Registriert: Mi Apr 16, 2008 7:51 am

Beitrag von Geri12 »

Hallo admin,
vielen Dank für die Antworten ...

zu 1. Dann sollte ich mir diese Version doch endlich mal anschauen. Aber wenn ich dann wieder sehe, was alles Neues dazu gekommen ist, würde ich lieber gestern als heute unsere Datenbank updaten. :wink:

zu 2. Da bin ich zu wenig Buchhalter ... und das ist gut so :lol: :lol: :lol:

zu 3. Ok, dann werde ich diese gestern erstellte Akonto-Abschlußrechnung mal im Auge behalten, ob das System sie problemlos durchläßt oder ob es sich irgendwo daran verschluckt. - Schau'n 'mer mal 8)
Gruß
Geri12

Software-Version: V4.2.5.2
FDB-Version: AvERP2008-A.14
Antworten