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: 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;