/* Server version: LI-V6.3.3.26778 Firebird 2.5 SQLDialect: 3. ODS: 11.2. Forced writes: On. Sweep inteval: 20000. Page size: 16384. Cache pages: 2048 (32768 Kb). Read-only: False. */ SET NAMES UTF8; SET SQL DIALECT 3; CONNECT '192.168.1.2:BS-DB' USER 'SYSDBA' PASSWORD '123456'; /* Create Table... */ CREATE TABLE "RueckfragenAn"("RA_RueckfragenID" INTEGER NOT NULL, "RA_Status" INTEGER, "RA_AspID" INTEGER, "RA_Art" INTEGER, "RA_VerlaufGesehen" "d_Akt_DatumZeitOhneMillisek", "RA_ZuerstGesehenAM" "d_Akt_DatumZeitOhneMillisek"); DESCRIBE FIELD "RA_Status" TABLE "RueckfragenAn" 'Offen Erledigt '; DESCRIBE FIELD "RA_Art" TABLE "RueckfragenAn" 'Zur Beantwortung Zur Kenntnisnahme'; DESCRIBE FIELD "RA_VerlaufGesehen" TABLE "RueckfragenAn" 'Wann der Eintrag auf "VerlaufGesehen" gesetzt wurde. Wird wieder auf NULL gesetzt wenn jemand etwas schreibt oder wenn eine Anzahl Tage verstrichen ist , wird es automatisch wieder angezeigt. '; DESCRIBE FIELD "RA_ZuerstGesehenAM" TABLE "RueckfragenAn" 'Wann die Rueckfrage ersmals angesehen wurde. Muss automatisch vom System gesetzt werden.'; CREATE TABLE "RueckfragenVerlauf"("RV_RueckfragenID" INTEGER NOT NULL, "RV_Verlauf" "d_Akt_DatumZeitOhneMillisek" NOT NULL, "RV_AntwortAufVerlauf" "d_Akt_DatumZeitOhneMillisek", "RV_AspID" INTEGER NOT NULL, "RV_Text" "d_str1024" NOT NULL); DESCRIBE FIELD "RV_Verlauf" TABLE "RueckfragenVerlauf" 'Datum Zeit der Nachricht. Es kann mehrere geben, wenn sich weitere Rueckfragen ergeben. Wie ein Chat. Wenn es eine Antwort auf eine Rueckfrage gibt ist der urspruengliche Rueckfragetext nicht mehr aenderbar. Dann wird ein neuer Text geschrieben mit einem neuen "R_Verlauf" Datum Zeit - stempel -- auf denn dann wieder geantwortet werden muss. '; DESCRIBE FIELD "RV_AntwortAufVerlauf" TABLE "RueckfragenVerlauf" 'Auf welchen R_Verlauf geantwortet wurde. Momentan sollte es einfach fortlaufend sein also linear und nicht einer Baumstruktur entsprechen. Moeglich waere es natuerlich auch auf einen Verlauf mehr als eine ntwort zu geben aber das soll momentan nicht so sein. Evtl. spaeter einfuehrbar. Frage Text 1 Text 2 Text 3 Text 4 '; DESCRIBE FIELD "RV_Text" TABLE "RueckfragenVerlauf" 'Wenn das R_Text Feld nicht ausreicht in der laenge sollte man Spaeter noch ein Editorfenster bekommen koenen. Dort koenen dann auch evtl. Bilder und ein ewig langer Text hinterlegt werden. Aber zu lange Texte machen hier eh keinen Sinn -- 1024 Zeichen ist eigentlich schon zu viel. ( Koennte noch erhoeht werden ) '; CREATE TABLE "RueckfragenZu"("RZ_RueckfragenID" INTEGER NOT NULL, "RZ_AuftrDokument_ID" INTEGER, "RZ_AuftrDokPosID" GENERATOR_VALUE, "RZ_GestartetVonAspID" INTEGER NOT NULL, "RZ_ZustAspID" INTEGER NOT NULL, "RZ_Status" INTEGER); DESCRIBE TABLE "RueckfragenZu" 'Auf weches Objekt sich die Rueckfrage Bezieht. z.B. ein Dokument oder eine Dokumentpositio. Spaeter koenen noch weitere folgen wie z.B. Datei / Fax / eMail usw..... Einfach eine neues Feld und den passenden FK anlegen auf das Objekt.'; DESCRIBE FIELD "RZ_RueckfragenID" TABLE "RueckfragenZu" 'Auf welche Rueckfage wird sich hier bezogen ?'; DESCRIBE FIELD "RZ_AuftrDokument_ID" TABLE "RueckfragenZu" 'Bezieht sich auf ein ganzes Dokument.'; DESCRIBE FIELD "RZ_AuftrDokPosID" TABLE "RueckfragenZu" 'Bezieht sich auf eine Zeile im Dokument. Das Feld "RZ_AuftrDokument_ID" muss auch ausgefuellt werden. Wenn die Position geloescht wird, faellte die Farge zurueck auf das Dokument.'; DESCRIBE FIELD "RZ_ZustAspID" TABLE "RueckfragenZu" 'Wenn jemand die Zustaendigkeit fuer diese Rueckfrage weitergibt an jemand anderen. z.B. Wenn jemand Krank/Kuendigt oder so. '; DESCRIBE FIELD "RZ_Status" TABLE "RueckfragenZu" 'Offen Erledigt'; ALTER TABLE "HTY_Kunden" ADD "K_RGmitAblieferbeleg" D_BOOLEAN_YN; ALTER TABLE "Kunden" ADD "K_RGmitAblieferbeleg" D_BOOLEAN_YN; DESCRIBE FIELD "K_RGmitAblieferbeleg" TABLE "Kunden" 'Wenn bei der Rechung ein Abliferbeleg ( LS ) beiliegen muss.'; DESCRIBE FIELD "ArtikelVerbinderArten_ID" TABLE "ArtikelVerbinderArten" '1 = (Noch nicht nutzbar) Eigene gleiche Katalogartikel die zwischen Katalogen vorhanden sind ( evtl. ) sin die Variantenmoeglichkeiten aber andere !!! 2 = Lieferant fuer eigenen Katalogartikel 3 = 100% Kompatibler / Austauschbarer Artikel 4 = Vergleichbarer Artikel ( ein oder mehrere Artikel ) 10 = Zubehoerartikel ( ein oder mehrere Artikel ) 11 = ZubehoerartikelKataloggruppe ( Kann auch eine ganze Kataloggruppe verweisen ) jeder dieser Artikel ist dann ein zubehoerartikel. evtl. mal aufnehemn 12 = Zubehoerartikelwarengruppe Spaeter es auch hinbekommen das die Modellcoderelevaten Anteile eines Artikels mit einem anderen Modellcodereleavten Artikel verbunden werden koennen.'; DESCRIBE FIELD "AuftDokAuftArt_ID" TABLE "AuftragsDokumentAuftragsArten" '0 = Standard ist gleich zu setzen mit DB NULL. Wenn das Feld DB-Null ist, ist es auch 0 0 Wird vom System vorgegeben und kann/darf nicht abgeaendert werden. Evtl. spaeter Diese Benutzerdefinierten IDs zu System IDs mappen um spezielle Dinge umsetzen zu koennen.'; DESCRIBE FIELD "AufDokVerArt_StdName" TABLE "AuftragsDokumentVersandArt" '0 = Standard ist gleich zu setzen mit DB NULL. Wenn das Feld DB-Null ist, ist es auch 0 0 Wird vom System vorgegeben als nicht ausgewaehlt.'; DESCRIBE FIELD "AD_T_BlockPosition" TABLE "AuftrDokum_Texte" '0 = Vor der Artikeltabelle 1 = Nach der Artikeltabelle 2 = Mailtext .... usw. siehe "AuftrDokum_TextVorlagen"."AD_TV_BlockPosition"'; DESCRIBE FIELD "AD_TV_BlockPosition" TABLE "AuftrDokum_TextVorlagen" '0 = Vor der Artikeltabelle 1 = Nach der Artikeltabelle 2 = Mailtext 3 = AutoMailText -- z.B. Ticket automail das ein Ticket angelegt wurde aber kein Dokument als PDF angehaengt. 4 = E-Mail Betreffzeile'; /* Create Primary Key... */ ALTER TABLE "RueckfragenAn" ADD PRIMARY KEY ("RA_RueckfragenID"); ALTER TABLE "RueckfragenVerlauf" ADD PRIMARY KEY ("RV_RueckfragenID", "RV_Verlauf"); ALTER TABLE "RueckfragenZu" ADD CONSTRAINT "PK_RueckfragenZu" PRIMARY KEY ("RZ_RueckfragenID"); /* Create Foreign Key... */ RECONNECT; ALTER TABLE "RueckfragenZu" ADD CONSTRAINT "FK_RueckfrZu_AuftDokPos" FOREIGN KEY ("RZ_AuftrDokPosID") REFERENCES "AuftragsDokumentePositionen" ("AuftragsDokumentePositionen_ID") ON DELETE SET NULL; ALTER TABLE "RueckfragenZu" ADD CONSTRAINT "FK_RueckfrZu_DokID" FOREIGN KEY ("RZ_AuftrDokument_ID") REFERENCES "AuftragsDokumente" ("AuftrDokument_ID"); /* Empty KKUNDENSUCHE for GP_SUCHEN_HILFE(param list change) */ SET TERM ^ ; ALTER PROCEDURE KKUNDENSUCHE(MYKDNR INTEGER, IKDNR INTEGER, INAME VARCHAR(20), ISTR VARCHAR(20), IORT VARCHAR(20), IPLZ VARCHAR(10)) RETURNS(KDNR INTEGER, "GPverID" INTEGER, NAME VARCHAR(84), STR VARCHAR(40), PLZ VARCHAR(10), ORT VARCHAR(50)) AS BEGIN SUSPEND; END ^ /* Alter empty procedure GP_SUCHEN_HILFE with new param-list */ ALTER PROCEDURE GP_SUCHEN_HILFE("iGP_ID" INTEGER, "iName" VARCHAR(15), "iStrasse" VARCHAR(10), "iStaat" VARCHAR(5), "iPLZ" VARCHAR(10), "iOrt" VARCHAR(10), "iAnschRolle" VARCHAR(200), "iAktiv" CHAR, "iKatalogImGpVorhanden" CHAR, "iVarParam1" "d_str20" = NULL) RETURNS("S_GeschP_ID" INTEGER, "S_GeschP_verID" INTEGER) AS BEGIN SUSPEND; END ^ SET TERM ; ^ DESCRIBE PARAMETER "iAnschRolle" PROCEDURE GP_SUCHEN_HILFE 'Anschrollen oder GP_ID,Kd-Nr., Lief.-Nr.'; DESCRIBE PARAMETER "iVarParam1" PROCEDURE GP_SUCHEN_HILFE 'Zusaetzlicher Parameter fuer z.B. Referenznummer !!'; /* Alter Procedure... */ /* empty dependent procedure body */ /* Clear: ApplyOnCommitActionList for: Auftrags_StatusErmitteln */ SET TERM ^ ; ALTER PROCEDURE "ApplyOnCommitActionList"("ApplyOnlyAction" INTEGER, "ApplyOnlyActions" "d_BLOB_Text_AsciiGross") AS BEGIN EXIT; END ^ /* Alter (Auftrags_StatusErmitteln) */ ALTER PROCEDURE "Auftrags_StatusErmitteln"("I_DokumentID" INTEGER) RETURNS("DokumentID" INTEGER, "Auftrag_Menge" "Mengen", "Auftrag_PosSumme" "Geld_genau", "Auftrag_VersKosten" "Geld_genau", "LS_Menge" "Mengen", "LS_PosSumme" "Geld_genau", "LS_VersandKosten" "Geld_genau", "Anzahl_LS" INTEGER, "Anzahl_LS_Abgeschl" INTEGER, "Anzahl_LS_FortGefuehrt" INTEGER, "RG_Menge" "Mengen", "RG_PosSumme" "Geld_genau", "RG_VersandKosten" "Geld_genau", "Anzahl_RG" INTEGER, "Anzahl_RG_Abgeschl" INTEGER, "Anzahl_RG_FortGefuehrt" INTEGER, "Auftrags_Status" "AuftragsBestaetigungStatus", "AutomatErmittelterStatus" "AuftragsBestaetigungStatus", "AnzahlFehler_PreisEinheit" INTEGER) AS declare variable "DokArt" integer = null; /* I_DokumentID */ declare variable "PosArt" integer; declare variable "Erledigt" "d_DatumZeit" = null; declare variable "DokumentNummer" integer; declare variable "AuftagDokPositionID" GENERATOR_VALUE; declare variable "Old_AuftragDokPositionID" GENERATOR_VALUE; declare variable "Anzahl_Dokumente" integer; declare variable "AnzahlDokumenteAbgeschl" integer; declare variable "AnzahlDokumenteFortgef" integer; declare variable "AB_Menge" "Mengen"; declare variable "AB_PreisEinheit" integer; declare variable "AB_PosGesPreis" "Geld_genau"; declare variable "Fortg_AuftDokPositionID" GENERATOR_VALUE; declare variable "Fortg_Menge" "Mengen"; declare variable "Fortg_PreisEinheit" integer; declare variable "Fortg_PosGesPreis" "Geld_genau"; declare variable "MengenAusgleich" "Mengen"; begin "AnzahlFehler_PreisEinheit" = 0; "Auftrag_Menge" = 0; "Auftrag_PosSumme" = 0; "Auftrag_VersKosten" = 0; "LS_Menge" = 0; "LS_PosSumme" = 0; "LS_VersandKosten" = 0; "Anzahl_LS" = 0; "Anzahl_LS_Abgeschl" = 0; "Anzahl_LS_FortGefuehrt" = 0; "RG_Menge" = 0; "RG_PosSumme" = 0; "RG_VersandKosten" = 0; "Anzahl_RG" = 0; "Anzahl_RG_Abgeschl" = 0; "Anzahl_RG_FortGefuehrt" = 0; select "AuftrDokument_Art" , "AuftrDokument_Erledigt" , "AuftrDokument_Nummer" from "AuftragsDokumente" A where A."AuftrDokument_ID" = :"I_DokumentID" and a."AuftrDokument_Art" = 200 into :"DokArt" , :"Erledigt" , :"DokumentNummer"; if ( :"DokArt" is null ) then -- oben wird ja nur DokArt = 200 zurueckgegebenb wenn NULL dann wohl falsche Dokumentart exception "Fatal_Error"'Kein "Auftrag" ( Status nicht ermittelbar )'; "DokumentID" = :"I_DokumentID"; -- Zum joinen dee SP resultate -- !!!!!!!!! A C H T U N G !!!!!!!!!!!!!! -- Hier werden alle Preise in netto umgerechnet und fertig. -- Dann gibt es auch bei MwSt - Aenderungen keine Abweichungen und auch nicht wenn Brutto/Netto Auftraege in andere Arten von Dokumenten fortgefuehrt werden. -- Kann vor allem bei Storno schnell passieren weil hier das Dokument in der Regel manuell angelegt wird und nicht firtgefuehrt wird. -- Versandkosten werden nicht fortgefuehrt und fallen somit in der Abfrage unten raus !! -- Deshalb Versandkosten hier direkt ermitteln. select coalesce( sum( iif( A."AuftrDokument_BruttoPreise" = 'Y' , B."AuftrDokPosi_PosGPreis" / B_MWST."MwSt_Faktor" , B."AuftrDokPosi_PosGPreis" )),0) from "AuftragsDokumente" A join "AuftragsDokumentePositionen" B ON A."AuftrDokument_ID" = B."AuftrDokPosi_DokumentID" and B."AuftrDokPosi_Art" between 50 and 90 -- 50 = Versandkosten / 99 sind schon Strukturtexte join "MwSt_Saetze" B_MWST ON B_MWST."MwSt_Saetze_ID" = B."AuftrDokPosi_MwStSaetze_ID" where A."AuftrDokument_ID" = :"I_DokumentID" into :"Auftrag_VersKosten"; -- Versabdkosten muessen nicht fortgefuehrt werden also wuedren sie unten aus dem join fallen, da nur wirklich fortgefuehrte Positionen enthalten sind. -- Hier werden jetzt die gezahlten versandkosten extra ermittelt. -- ACHTUNG !!!! Es koennte auch sein das eine RG zu mehreren Auftraegen gehoert und somit wuerden dann auch die Versandkosten hoeher angezeigt als tatsaechlich bezahlt. Ist aber so gewollt !!! -- for select sum( "AuftrDokPosi_PosGPreis" ) , DOKS.ART from "AuftragsDokumentePositionen" "Ver_Kost" for select coalesce(sum( iif( B_DOK."AuftrDokument_BruttoPreise" = 'Y' , "AuftrDokPosi_PosGPreis" / B_MWST."MwSt_Faktor" , "AuftrDokPosi_PosGPreis" ) ),0) , DOKS.ART from "AuftragsDokumentePositionen" "Ver_Kost" join ( select distinct C."AuftrDokument_ID" , C."AuftrDokument_Art" from "AuftragsDokumentePositionen" A join "AuftragsDokumentePositionen" B ON A."AuftragsDokumentePositionen_ID" = B."AuftrDokPosi_MasterDokPosID" join "AuftragsDokumente" C ON B."AuftrDokPosi_DokumentID" = C."AuftrDokument_ID" and C."AuftrDokument_Art" in ( 300 , 400 ) where A."AuftrDokPosi_DokumentID" = :"I_DokumentID" ) DOKS ( DOK_ID , ART ) ON DOKS.DOK_ID = "Ver_Kost"."AuftrDokPosi_DokumentID" join "MwSt_Saetze" B_MWST ON B_MWST."MwSt_Saetze_ID" = "Ver_Kost"."AuftrDokPosi_MwStSaetze_ID" join "AuftragsDokumente" B_DOK ON B_DOK."AuftrDokument_ID" = "Ver_Kost"."AuftrDokPosi_DokumentID" where "Ver_Kost"."AuftrDokPosi_Art" between 50 and 55 group by DOKS.ART into :"Fortg_PosGesPreis" , :"DokArt" do begin if ( :"DokArt" = 300 ) then "LS_VersandKosten" = :"Fortg_PosGesPreis"; if ( :"DokArt" = 400 ) then "RG_VersandKosten" = :"Fortg_PosGesPreis"; end "Old_AuftragDokPositionID" = NULL; -- Das for select ist schon gemacht um evtl. Preiseinheiten umzurechnen -- dehalb kein group by for select a."AuftragsDokumentePositionen_ID" , a."AuftrDokPosi_Art" ,coalesce( a."AuftrDokPosi_Menge",0 ), a."AuftrDokPosi_PreisEinheit" , coalesce( iif( A_DOK."AuftrDokument_BruttoPreise" = 'Y' , a."AuftrDokPosi_PosGPreis" / A_MWST."MwSt_Faktor" , a."AuftrDokPosi_PosGPreis" ),0) -- a."AuftrDokPosi_PosGPreis" , B."AuftragsDokumentePositionen_ID" , C."AuftrDokument_Art" , coalesce(b."AuftrDokPosi_Menge",0) , b."AuftrDokPosi_PreisEinheit" , coalesce(iif( c."AuftrDokument_BruttoPreise" = 'Y' , b."AuftrDokPosi_PosGPreis" / B_MWST."MwSt_Faktor" , b."AuftrDokPosi_PosGPreis" ),0) -- b."AuftrDokPosi_PosGPreis" , c."AuftrDokument_Version" from "AuftragsDokumentePositionen" A join "AuftragsDokumente" A_DOK ON A_DOK."AuftrDokument_ID" = A."AuftrDokPosi_DokumentID" join "MwSt_Saetze" A_MWST ON A_MWST."MwSt_Saetze_ID" = A."AuftrDokPosi_MwStSaetze_ID" join "AuftragsDokumentePositionen" B ON A."AuftragsDokumentePositionen_ID" = B."AuftrDokPosi_MasterDokPosID" join "AuftragsDokumente" C ON B."AuftrDokPosi_DokumentID" = C."AuftrDokument_ID" and C."AuftrDokument_Art" in ( 200 , 300 , 400 , 900 ) -- 200 ist wichtig sonst findet er nichts wenn es keinen LS/RG gibt. join "MwSt_Saetze" B_MWST ON B_MWST."MwSt_Saetze_ID" = B."AuftrDokPosi_MwStSaetze_ID" left outer join "AuftragsDokumentePositionExt" D ON B."AuftragsDokumentePositionen_ID" = D."AuftragsDokumentePosition_ID" where A."AuftrDokPosi_DokumentID" = :"I_DokumentID" order by a."AuftragsDokumentePositionen_ID" into :"AuftagDokPositionID" , :"PosArt" , :"AB_Menge" , :"AB_PreisEinheit" , :"AB_PosGesPreis" , :"Fortg_AuftDokPositionID" , :"DokArt" , :"Fortg_Menge" , :"Fortg_PreisEinheit" , :"Fortg_PosGesPreis" , :"AnzahlDokumenteAbgeschl" do begin if ( :"PosArt" between 1 and 49 ) then -- AuftragsDokumentpositionen begin if ( :"AuftagDokPositionID" is distinct from :"Old_AuftragDokPositionID" ) then begin -- Wenn sich wirklich die Position im Auftrag aendert -- diese kommen durch den join oben jetzt hier mehrfach vor !!!! -- Einen evtl. vorhandne Mengenausgleich beachten fuer diese Auftragsposition "MengenAusgleich" = 0; -- Wichtig select koennte ja nichts zurueckgeben dann bleibt der Wert von vorher stehen select coalesce( sum( "ADPE_MengeAusgleich" ),0) from "AuftragsDokumentePositionExt" A where A."AuftragsDokumentePosition_ID" = :"AuftagDokPositionID" into :"MengenAusgleich"; "Auftrag_Menge" = :"Auftrag_Menge" + :"AB_Menge" + :"MengenAusgleich"; "Auftrag_PosSumme" = :"Auftrag_PosSumme" + :"AB_PosGesPreis"; if ( :"MengenAusgleich" > 0 and :"AB_PosGesPreis" != 0 ) then -- Nur wenn es einen PosGesPreis != 0 ist, begin -- muss man mit der "Auftrag_PosSumme" etwas tun sonst kostet es ja eh nichts "Auftrag_PosSumme" = :"Auftrag_PosSumme" + ( round( ( :"AB_PosGesPreis" / :"AB_Menge" ),2) * :"MengenAusgleich" ); end -- hier sollte noch ein Round rein wie in Daten -> Katalog festgelegt ist, wenn es ein Artikel ist end if ( :"AnzahlDokumenteAbgeschl" is not null ) then -- Nur abgeschlossene Dokumente zaehlen begin if ( :"AB_PreisEinheit" = :"Fortg_PreisEinheit" ) then begin if ( :"DokArt" = 300 ) then -- LS begin "LS_Menge" = :"LS_Menge" + :"Fortg_Menge"; "LS_PosSumme" = :"LS_PosSumme" + :"Fortg_PosGesPreis"; end else if ( :"DokArt" = 400 ) then -- RG begin "RG_Menge" = :"RG_Menge" + :"Fortg_Menge"; "RG_PosSumme" = :"RG_PosSumme" + :"Fortg_PosGesPreis"; end else if ( :"DokArt" = 900 ) then -- Storno begin "Auftrag_Menge" = :"Auftrag_Menge" - :"Fortg_Menge"; "Auftrag_PosSumme" = :"Auftrag_PosSumme" - :"Fortg_PosGesPreis"; end end else "AnzahlFehler_PreisEinheit" = :"AnzahlFehler_PreisEinheit" +1; end end else if ( :"PosArt" between 56 and 90 ) then --- Wird noch nicht verwendet begin /* Versandkosten werden nicht fortgefuehrt und fallen somit in dieser Abfrage raus !! Deshalb Versandkosten ein aus dem Auftrag separat ermitteln. if ( :"AuftagDokPositionID" is distinct from :"Old_AuftragDokPositionID" ) then begin -- Wenn sich wirklich die Position im Auftrag aendert -- diese kommen durch den join oben jetzt hier mehrfach vor !!!! "Auftrag_VersKosten" = :"Auftrag_VersKosten" + :"AB_PosGesPreis"; end */ end "Old_AuftragDokPositionID" = :"AuftagDokPositionID"; -- Damit jede Auftragsposition nur einmal addiert wird end for select c."AuftrDokument_Art" ,count( distinct iif( C."AuftrDokument_Nummer" is null , NULL , c."AuftrDokument_ID" )) as "AnzahlDokumente" ,count( distinct iif( C."AuftrDokument_Version" is null , NULL , c."AuftrDokument_ID" )) as "AnzahlAbgeschlDokumente" ,count( distinct iif( C."AuftrDokument_VollstFortgefuehr" = 100 , c."AuftrDokument_ID" , NULL)) as "AnzahlDokumenteFortgef" from "AuftragsDokumentePositionen" A join "AuftragsDokumentePositionen" B ON A."AuftragsDokumentePositionen_ID" = B."AuftrDokPosi_MasterDokPosID" join "AuftragsDokumente" C ON B."AuftrDokPosi_DokumentID" = C."AuftrDokument_ID" and C."AuftrDokument_Art" in ( 300 , 400 ) where A."AuftrDokPosi_DokumentID" = :"I_DokumentID" group by c."AuftrDokument_Art" into :"DokArt" , :"Anzahl_Dokumente" , :"AnzahlDokumenteAbgeschl" , :"AnzahlDokumenteFortgef" do begin if ( :"DokArt" = 300 ) then -- LS begin "Anzahl_LS" = :"Anzahl_Dokumente"; "Anzahl_LS_Abgeschl" = :"AnzahlDokumenteAbgeschl"; "Anzahl_LS_FortGefuehrt" = :"AnzahlDokumenteFortgef"; end else if ( :"DokArt" = 400 ) then -- RG begin "Anzahl_RG" = :"Anzahl_Dokumente"; "Anzahl_RG_Abgeschl" = :"AnzahlDokumenteAbgeschl"; "Anzahl_RG_FortGefuehrt" = :"AnzahlDokumenteFortgef"; end end "Auftrag_PosSumme" = coalesce( round( :"Auftrag_PosSumme" ,2) , 0); "RG_PosSumme" = coalesce( round(:"RG_PosSumme",2) , 0); "LS_PosSumme" = coalesce( round(:"LS_PosSumme",2) , 0); if ( :"RG_PosSumme" between :"Auftrag_PosSumme" -0.05 and :"Auftrag_PosSumme" +0.05 ) then "RG_PosSumme" = :"Auftrag_PosSumme"; -- Ein ungefaehr gleich simmulieren um Rundungsfehler abzufangen !!! if ( :"LS_PosSumme" between :"Auftrag_PosSumme" -0.05 and :"Auftrag_PosSumme" +0.05 ) then "LS_PosSumme" = :"Auftrag_PosSumme"; -- Ein ungefaehr gleich simmulieren um Rundungsfehler abzufangen !!! -- Ein Status kann auch von hand gesetzt werden. Dieser wird nur wieder automatisch geaendert wenn ein hoeherer automatischer Status ermittelt wird !! -- Erledigt (2000) kann somit nie ueberschrieben werden. "Auftrags_Status" = NULL; if ( :"Auftrag_Menge" = :"RG_Menge" and :"Auftrag_PosSumme" = :"RG_PosSumme" ) then begin "Auftrags_Status" = 1000; -- 1000 Erledigt if ( :"Auftrag_VersKosten" > :"RG_VersandKosten" ) then "Auftrags_Status" = 900; -- Alle Positionen bezahlt aber versandkosten fehlen noch else if ( :"Anzahl_RG" is distinct from :"Anzahl_RG_Abgeschl" ) then "Auftrags_Status" = 950; -- 950 Erledigt aber Rechungen nicht abgeschlossen else if ( :"Anzahl_RG_Abgeschl" != ( select count( distinct iif( exists ( select * from "AuftrDokumenteLog" A where A."ADL_AuftragDokument_ID" = C."AuftrDokument_ID" and a."ADL_AenderungsArtenID" in ( 4,5,6,7)) , C."AuftrDokument_ID", NULL)) as "AnzRG_Gedruckt" from "AuftragsDokumentePositionen" A join "AuftragsDokumentePositionen" B ON A."AuftragsDokumentePositionen_ID" = B."AuftrDokPosi_MasterDokPosID" join "AuftragsDokumente" C ON B."AuftrDokPosi_DokumentID" = C."AuftrDokument_ID" and C."AuftrDokument_Art" = 400 where A."AuftrDokPosi_DokumentID" = :"I_DokumentID" )) then -- 3,5,6,7 siehe Tabelle "AenderungsArten" / "AuftrDokumenteLog" "Auftrags_Status" = 975; -- 975 Erledigt aber Rechungen nicht Gedruckt/Mail/fax/gespeichert -- Ausgedruckte Rehnungen beachten !!!! end else if ( :"Auftrag_Menge" = :"LS_Menge" -- Bei Fremdspedition ist es so nie erfuellt ( da es keinen LS gibt ) and :"Auftrag_PosSumme" = 0 )then -- z.B. in Serviceauftraegen wenn es kein Geld zu bezahlen gibt im Auftrag dann brauchen wir keine Rechung !! -- and :"Anzahl_LS" = :"Anzahl_LS_FortGefuehrt" -- and :"Anzahl_LS_Abgeschl" = :"Anzahl_LS_FortGefuehrt" ) then -- Bei Seriveauftraegen ist Auftragswert = 0 wenn alle LS abgeschlossen und fortgefuehrt sind ist der Auftrag abgeschlossen begin if ( :"Auftrag_VersKosten" > :"RG_VersandKosten" ) then "Auftrags_Status" = 900; -- Alle Positionen bezahlt aber versandkosten fehlen noch sollte immer beruecksichtigt werden else "Auftrags_Status" = 1000; -- 1000 Versendet nichts mehr zu bezahlen und alle Lieferscheine sind fortgefuehrt oder auf erledigt gesetzt end else if ( ( :"RG_Menge" > 0 or :"RG_PosSumme" > 0 ) and ( :"Auftrag_Menge" = :"RG_Menge" )) then -- wenn AuftragMenge = RG_Menge sollte es vollstaendig geliefert sein ! -- and :"Auftrag_PosSumme" = :"LS_PosSumme" )) then begin "Auftrags_Status" = 800; -- 800 Teilweise berechnet und vollstaendig geliefert end else if ( :"Auftrag_Menge" = :"LS_Menge" -- and :"Auftrag_PosSumme" = :"LS_PosSumme" ) -- Der Preis sollte im LS immer egal sein ! or ( :"Auftrag_Menge" = :"RG_Menge" ) ) then -- wenn AuftragMenge = RG_Menge sollte es vollstaendig geliefert sein ! begin "Auftrags_Status" = 600; -- 600 Kpl. Versendet end else if ( :"LS_Menge" > 0 ) then begin "Auftrags_Status" = 500; -- 500 teilweise Versendet end else if ( :"DokumentNummer" is not null ) then begin "Auftrags_Status" = 100; -- 100 Auftrag in bearbeitung end -- Ganz am ende stehen lassen "AutomatErmittelterStatus" = "Auftrags_Status"; if ( :"Erledigt" is not null ) then begin "Auftrags_Status" = 2000; -- 2.000 manuell auf Erledigt gesetzt hier muss auch das Feld Erledigt und ErledigtVon in AuftragsDokumente mit gesetzt werden. end -- 10 = Warten auf Vorkasse ( man. zu setzen ) oder evtl. autoamtisch per Trigger -- ?? = Warten auf Abschlagszahlung ( 200 wird nie automatisch ueberschriben sondern muss man. zurueckgesetzt werden ) suspend; end ^ SET TERM ; ^ DESCRIBE PARAMETER "I_DokumentID" PROCEDURE "Auftrags_StatusErmitteln" 'Auftrag der geprueft werden soll'; DESCRIBE PARAMETER "Auftrag_PosSumme" PROCEDURE "Auftrags_StatusErmitteln" 'Summer der Positionen "AuftrDokPosi_Art" < 50 50 =Versandkosten'; DESCRIBE PARAMETER "Auftrag_VersKosten" PROCEDURE "Auftrags_StatusErmitteln" 'Alles von ( 50-55) sind Kosten im zusammenhang mit dem Versand ( Versandkosten ).'; DESCRIBE PARAMETER "LS_PosSumme" PROCEDURE "Auftrags_StatusErmitteln" 'Summer der Positionen "AuftrDokPosi_Art" < 50 50 =Versandkosten.'; DESCRIBE PARAMETER "LS_VersandKosten" PROCEDURE "Auftrags_StatusErmitteln" 'Alles von ( 50-55) sind Kosten im zusammenhang mit dem Versand ( Versandkosten )'; DESCRIBE PARAMETER "Anzahl_LS_FortGefuehrt" PROCEDURE "Auftrags_StatusErmitteln" 'Fortgefuehrte Dokumente oder auch manuell abgeschlossenen Dokumente.'; DESCRIBE PARAMETER "RG_PosSumme" PROCEDURE "Auftrags_StatusErmitteln" 'Summer der Positionen "AuftrDokPosi_Art" < 50 50 =Versandkosten.'; DESCRIBE PARAMETER "RG_VersandKosten" PROCEDURE "Auftrags_StatusErmitteln" 'Alles von ( 50-55) sind Kosten im zusammenhang mit dem Versand ( Versandkosten )'; DESCRIBE PARAMETER "Anzahl_RG_FortGefuehrt" PROCEDURE "Auftrags_StatusErmitteln" 'Fortgefuehrte Dokumente oder auch manuell abgeschlossenen Dokumente.'; DESCRIBE PARAMETER "Auftrags_Status" PROCEDURE "Auftrags_StatusErmitteln" 'Der Status der gesetzt ist.'; DESCRIBE PARAMETER "AutomatErmittelterStatus" PROCEDURE "Auftrags_StatusErmitteln" 'Der Status der automatisch fuer diesen Auftrag ermittelt wurde.'; DESCRIBE PARAMETER "AnzahlFehler_PreisEinheit" PROCEDURE "Auftrags_StatusErmitteln" 'Wenn es unterschiedliche Preiseinheiten gab dies hier hochzaehlen.'; DESCRIBE PARAMETER "Auftrag_VersKosten" PROCEDURE "Auftrags_StatusErmitteln" 'Alles von ( 50-55) sind Kosten im zusammenhang mit dem Versand ( Versandkosten ).'; DESCRIBE PARAMETER "LS_PosSumme" PROCEDURE "Auftrags_StatusErmitteln" 'Summer der Positionen "AuftrDokPosi_Art" < 50 50 =Versandkosten.'; DESCRIBE PARAMETER "Anzahl_LS_FortGefuehrt" PROCEDURE "Auftrags_StatusErmitteln" 'Fortgefuehrte Dokumente oder auch manuell abgeschlossenen Dokumente.'; DESCRIBE PARAMETER "RG_PosSumme" PROCEDURE "Auftrags_StatusErmitteln" 'Summer der Positionen "AuftrDokPosi_Art" < 50 50 =Versandkosten.'; DESCRIBE PARAMETER "Anzahl_RG_FortGefuehrt" PROCEDURE "Auftrags_StatusErmitteln" 'Fortgefuehrte Dokumente oder auch manuell abgeschlossenen Dokumente.'; DESCRIBE PARAMETER "AutomatErmittelterStatus" PROCEDURE "Auftrags_StatusErmitteln" 'Der Status der automatisch fuer diesen Auftrag ermittelt wurde.'; DESCRIBE PARAMETER "AnzahlFehler_PreisEinheit" PROCEDURE "Auftrags_StatusErmitteln" 'Wenn es unterschiedliche Preiseinheiten gab dies hier hochzaehlen.'; /* empty dependent procedure body */ /* Clear: AuftragsDokumente_Drucken for: AuftrDokument_MwSt_Liste */ SET TERM ^ ; ALTER PROCEDURE "AuftragsDokumente_Drucken"("I_AuftrDokumentID" INTEGER, "I_DruckKonfigID" INTEGER, "I_Eltern_ID" INTEGER, "I_PositionsString" "d_str50", "I_NurDieseEbene" D_BOOLEAN_YN, "I_NettoPreise" D_BOOLEAN_YN, "I_MwSt_Kurzform" D_BOOLEAN_YN, "I_Format" "d_str10", "I_Format_PosText" "d_str40", "I_Format_G-Preis" "d_str20", "I_Format_E-Preis" "d_str20", "I_Format_Menge" "d_str20", "I_Warnings" D_BOOLEAN_YN, "I_Commands" TYPE OF COLUMN "DruckJobs"."DrJob_Commands", "I_Int_Help" INTEGER, "I_BigInt_Help" BIGINT, "I_Varchar_Help" "d_str512", "I_Zeile" INTEGER) RETURNS("PositionsArt" INTEGER, "StrukturText" "d_str50", "PositionsNr" INTEGER, "PositionsStringFormatiert" "d_str60", "PosText1" "d_str10", "PosText2" "d_str60", "RAuftrDokStruktur_ID" INTEGER, "RAuftragsDokumentePositionen_ID" GENERATOR_VALUE, "VMenge" "d_str20", "NMenge" "d_str10", "MengeGeliefert" "d_str20", "MengeRueckstand" "d_str20", "ArtikelText" "d_strMax", "ArtikelBlobText" BLOB SUB_TYPE 1 SEGMENT SIZE 8192, "KurztextAnzAbsaetze" INTEGER, "Artikelnummer" VARCHAR(31), "EAN_Code" GENERATOR_VALUE, "E-Preis" "d_str20", "G-Preis" "d_str20", "Preiseinheit" "d_str30", "MwSt_Satz" "d_str10", "TexgenCommand" "d_str30", "HintergrundFarbe" VARCHAR(6), "Warnings" "d_str320", "CZeileFett" VARCHAR(1), "CZeileItalic" VARCHAR(1), "CgesPreisFett" VARCHAR(1), "CgesPreisUnterstreichen" VARCHAR(1), "CgesPreisDoppeltUnterstreichen" VARCHAR(1), "ZeilenNr" INTEGER, "RowType" INTEGER, "ExtraAbstandEinfuegen" INTEGER, "PosRabatt" "d_str10", "Pos_GPreis_StruktPreis" "Geld") AS BEGIN SUSPEND; END ^ /* empty dependent procedure body */ /* Clear: AuftragsDokumente_Drucken_old for: AuftrDokument_MwSt_Liste */ ALTER PROCEDURE "AuftragsDokumente_Drucken_old"("I_AuftrDokumentID" INTEGER, "I_DruckKonfigID" INTEGER, "I_Eltern_ID" INTEGER, "I_PositionsString" "d_str50", "I_NurDieseEbene" D_BOOLEAN_YN, "I_NettoPreise" D_BOOLEAN_YN, "I_MwSt_Kurzform" D_BOOLEAN_YN, "I_Format" "d_str10", "I_Format_PosText" "d_str40", "I_Format_G-Preis" "d_str20", "I_Format_E-Preis" "d_str20", "I_Format_Menge" "d_str20", "I_Warnings" D_BOOLEAN_YN, "I_Commands" TYPE OF COLUMN "DruckJobs"."DrJob_Commands", "I_Int_Help" INTEGER, "I_BigInt_Help" BIGINT, "I_Varchar_Help" "d_str512", "I_Zeile" INTEGER) RETURNS("PositionsArt" INTEGER, "StrukturText" "d_str50", "PositionsNr" INTEGER, "PositionsStringFormatiert" "d_str60", "PosText1" "d_str10", "PosText2" "d_str60", "RAuftrDokStruktur_ID" INTEGER, "RAuftragsDokumentePositionen_ID" GENERATOR_VALUE, "VMenge" "d_str20", "NMenge" "d_str10", "MengeGeliefert" "d_str20", "MengeRueckstand" "d_str20", "ArtikelText" "d_strMax", "ArtikelBlobText" BLOB SUB_TYPE 1 SEGMENT SIZE 8192, "KurztextAnzAbsaetze" INTEGER, "Artikelnummer" VARCHAR(31), "EAN_Code" GENERATOR_VALUE, "E-Preis" "d_str20", "G-Preis" "d_str20", "Preiseinheit" "d_str30", "MwSt_Satz" "d_str10", "TexgenCommand" "d_str30", "HintergrundFarbe" VARCHAR(6), "Warnings" "d_str320", "CZeileFett" VARCHAR(1), "CZeileItalic" VARCHAR(1), "CgesPreisFett" VARCHAR(1), "CgesPreisUnterstreichen" VARCHAR(1), "CgesPreisDoppeltUnterstreichen" VARCHAR(1), "ZeilenNr" INTEGER, "RowType" INTEGER, "ExtraAbstandEinfuegen" INTEGER, "PosRabatt" "d_str10", "Pos_GPreis_StruktPreis" "Geld") AS BEGIN SUSPEND; END ^ /* Alter (AuftrDokument_MwSt_Liste) */ ALTER PROCEDURE "AuftrDokument_MwSt_Liste"("DokumentID" INTEGER, "MitDummyMwStSatz" D_BOOLEAN_YN) RETURNS("MwStSaetze_ID" INTEGER, "KurzZeichen" CHAR CHARACTER SET ISO8859_1) AS declare variable "Count" integer; declare variable "Zeile" integer = 1; declare variable "AbMwStSaetze_ID" integer; begin if ( :"MitDummyMwStSatz" = 'Y' ) then "AbMwStSaetze_ID" = 0; else "AbMwStSaetze_ID" = 1; for select count( "AuftrDokPosi_MwStSaetze_ID" ) , "AuftrDokPosi_MwStSaetze_ID" from "AuftragsDokumentePositionen" A where "AuftrDokPosi_DokumentID" = :"DokumentID" and "AuftrDokPosi_MwStSaetze_ID" >= :"AbMwStSaetze_ID" -- and ("AuftrDokPosi_Option" is null or "AuftrDokPosi_Option" != 1 )-- Das darf hier nicht rein sonst werden alle Positionen im DokumentEditor -- ausgeblendet(wenn die MwSt Gruppe nicht durch andere Zeilen evtl. Summenzeilen schon vorhanden ist) die auf versteckt sitzen -- da Ihre MwSt gruppe nicht mehr vorhanden ist. In AuftragsDokumentDrucken ist es ein Join aus geschwindikeitsgruenden und kein Left outer join -- Versteckte Positionen duerfen nicht mitgezaehlt werden -- Um die Gruppe nicht zu bekommen muss die SP einfach oben mit "MitDummyMwStSatz"= 'N' aufgerufen werden. group by "AuftrDokPosi_MwStSaetze_ID" -- Um die mit den meisten kein kurzzeichen zu geben und dann immer weiter der zweithaeufigste 1 ... order by 1 desc , 2 into :"Count" , :"MwStSaetze_ID" do begin if ( :"Zeile" = 1 ) then "KurzZeichen" = ''; else "KurzZeichen" = :"Zeile"; if ( :"MwStSaetze_ID" = 0 ) then -- Dummy MwSt-Satz ausblenden begin "KurzZeichen" = ''; end else "Zeile" = :"Zeile" + 1; suspend; end end ^ /* Alter (AuftrDokumente_Lieferung_offen) */ ALTER PROCEDURE "AuftrDokumente_Lieferung_offen"("I_AuftrAnDenMandantSelbstAusbl" CHAR = 'Y', "I_LeistungsDatum" DATE = current_date, "I_NurDieseVersandArten" "d_str40" = null, "I_AuftrDokument_ID" INTEGER = null, "I_AuftragDokumentPositionID" BIGINT = null) RETURNS("AB_AuftrDokumPositionID" BIGINT, "AB_AuftrDokument_ID" INTEGER, "TatsOffeneMenge" "Mengen", "AB_LeistungsDatum" DATE, "AB_VersandArt" INTEGER, "AB_offeneMenge" "Mengen", "AB_Menge" "Mengen", "KS_AuftrDokumPositionID" BIGINT, "KS_LeistungsDatum" DATE, "KS_VersandArt" INTEGER, "KS_offeneMenge" "Mengen", "KS_Menge" "Mengen", "BE_Menge" "Mengen", "BE_WeMenge" "Mengen", "Lager_Menge" "Mengen") AS declare variable "AB_VersendeteMenge" "Mengen"; /* Versendet oder Storno */ declare variable "KS_VersendeteMenge" "Mengen"; /* Versendet oder Storno evtl wird Storno mal erlaubt ( dann muss aber die Storno Menge des KS dem Auftrag wieder zugefuehrt werden !!!! ) Momentan gibt es das nicht */ declare variable "KS_offeneGesMenge" integer; /* Meneg die in allen KS-Scheinen zusammen zu der AB-Positiinen enthalten ist */ declare variable "LastWE_DokID" integer; begin /* Gedanken LS oder KS nach Storno fortfuehren ginge nur wenn die Menge wieder beim AUftrag gutgeschrieben wird. Besser die Menge des LS oder KS editierbar machen und fertig !!!! */ if ( trim( :"I_NurDieseVersandArten" ) = '' ) then "I_NurDieseVersandArten" = NULL; if ( :"I_LeistungsDatum" is null ) then "I_LeistungsDatum" = current_date+2; -- Wenn es expliziet mit NULL aufgerufen wird auch einfach das aktuelle Datum setzen wie bei der Standardquelle ! else "I_LeistungsDatum" = :"I_LeistungsDatum" +1; if ( :"I_AuftrAnDenMandantSelbstAusbl" is distinct from 'N' and rdb$get_context( 'USER_SESSION' , 'MANDANT_GP_ID' ) is not null ) then "I_AuftrAnDenMandantSelbstAusbl" = 'Y'; "LastWE_DokID" = NULL; -- Zuerst alle gewuenschten Positionen zusammensuchen bei denen es noch etwas zu liefern gibt. -- Versandart darf erst im naechsten Schritt beachtet werden , da sie in einem Kommissionschein veraendert werden kann for select ADP."AuftragsDokumentePositionen_ID" , AD."AuftrDokument_ID" ,coalesce( ADP."AuftrDokPosi_VersandArt", AD."AuftrDokument_VersandArt" ) , ADP."AuftrDokPosi_Menge" -- Alles was in einem abgeschlossenen LS oder Strono Dokument steckt ,coalesce( ( select sum(GM."AuftrDokPosi_Menge" ) from "AuftragsDokumentePositionen" GM join "AuftragsDokumente" GMD ON GMD."AuftrDokument_ID" = GM."AuftrDokPosi_DokumentID" and GMD."AuftrDokument_Version" is not null -- <- LS/GS muss abgeschlossen sein where GM."AuftrDokPosi_MasterDokPosID" = ADP."AuftragsDokumentePositionen_ID" and GM."AuftrDokPosi_Art" <= 10 and GMD."AuftrDokument_Art" in( 300,900) -- 300 = LS / 900 = Storno group by GM."AuftrDokPosi_MasterDokPosID" ),0 ) -- + was in Rechungen steckt und nicht aus einem LS kommt sondern direkt auseiner AB oder KS fortgefuehrt wurde ( z.B. Fremdspedition ) + coalesce( ( select sum(GM."AuftrDokPosi_Menge" ) from "AuftragsDokumentePositionen" GM join "AuftragsDokumente" GMD ON GMD."AuftrDokument_ID" = GM."AuftrDokPosi_DokumentID" and GMD."AuftrDokument_Version" is not null -- <- RG muss abgeschlossen sein and GM."AuftrDokPosi_MasterDokPosID" = ADP."AuftragsDokumentePositionen_ID" and GM."AuftrDokPosi_Art" <= 10 and GMD."AuftrDokument_Art" = 400 join "AuftragsDokumentePositionen" FGV ON FGV."AuftragsDokumentePositionen_ID" = GM."AuftrDokPosi_AbgeleitetVonPos" join "AuftragsDokumente" NOT_LS ON NOT_LS."AuftrDokument_ID" = FGV."AuftrDokPosi_DokumentID" and NOT_LS."AuftrDokument_Art" != 300 and NOT_LS."AuftrDokument_Art" in ( 200 ,250 ) ) ,0 ) /* Erste Version hat nur AB -> Rg beruecksichtigt jetzt wird AB+KS > RG beruecksichtigt + coalesce( ( select sum(GM."AuftrDokPosi_Menge" ) from "AuftragsDokumentePositionen" GM join "AuftragsDokumente" GMD ON GMD."AuftrDokument_ID" = GM."AuftrDokPosi_DokumentID" and GMD."AuftrDokument_Version" is not null -- <- RG muss abgeschlossen sein and GM."AuftrDokPosi_AbgeleitetVonPos" = ADP."AuftragsDokumentePositionen_ID" and GMD."AuftrDokument_Art" = 400 ) ,0 )-- 400 = Rechnung */ , AD."AuftrDokument_LeistungsDatum" from "AuftragsDokumentePositionen" ADP join "AuftragsDokumente" AD ON AD."AuftrDokument_ID" = ADP."AuftrDokPosi_DokumentID" join "AuftragsDokumenteExt" ADE ON ADE."ADE_AuftrDokument_ID" = AD."AuftrDokument_ID" and ADE."ADE_AuftragsStatus" < 600 -- 600 = kpl. versendet where ( :"I_AuftrDokument_ID" is null or AD."AuftrDokument_ID" = :"I_AuftrDokument_ID" ) and ( :"I_AuftragDokumentPositionID" is null or ADP."AuftragsDokumentePositionen_ID" = :"I_AuftragDokumentPositionID" ) and AD."AuftrDokument_Art" = 200 and ADP."AuftrDokPosi_Art" <= 10 -- Es muss aus einer Auftragsbestaetigung stammen and AD."AuftrDokument_von_GP_ID" = rdb$get_context( 'USER_SESSION' , 'MANDANT_GP_ID' ) -- Nur vom gewaehlten Mandant die ABs nehmen !!! Update Version 0_91 -- and ( :"I_NurDieseVersandArten" is null or coalesce( ADP."AuftrDokPosi_VersandArt",0) in ( select "Value" from "SelectForINoperator"( :"I_NurDieseVersandArten" ) )) -- Hier oben erstmal alle Versandarten da sie ja evtl. im Kommissionsschein veraendert worden sein koennten ! and ( ( :"I_AuftrAnDenMandantSelbstAusbl" = 'Y' and AD."AuftrDokument_fuer_GP_ID" != ( rdb$get_context( 'USER_SESSION' , 'MANDANT_GP_ID' ))) or ( :"I_AuftrAnDenMandantSelbstAusbl" = 'N' ) ) -- Alle schon Mengenmaessig fertig gelieferten Positionen direkt filtern ( hier kommt es nicht auf den Wert an !!!! ) into :"AB_AuftrDokumPositionID" , :"AB_AuftrDokument_ID" , :"AB_VersandArt" , :"AB_Menge" , :"AB_VersendeteMenge" , :"AB_LeistungsDatum" do begin if ( :"LastWE_DokID" is distinct from :"AB_AuftrDokument_ID" ) then begin "LastWE_DokID" = :"AB_AuftrDokument_ID"; "LastWE_DokID" = ( select NULL from "Artikel_Verfuegb_AuftrDokument" ( :"AB_AuftrDokument_ID" , NULL )); end if ( :"AB_VersendeteMenge" < :"AB_Menge" ) then begin "KS_AuftrDokumPositionID" = NULL; "KS_LeistungsDatum" = NULL; "KS_VersandArt" = NULL; "KS_offeneMenge" = NULL; "KS_VersendeteMenge" = NULL; "KS_Menge" = NULL; "KS_offeneGesMenge" = 0; "AB_offeneMenge" = :"AB_Menge" - :"AB_VersendeteMenge"; "TatsOffeneMenge" = "AB_offeneMenge"; -- Jetzt Kommissionscheinpositionen zu der AB Position suchen for select ADP."AuftragsDokumentePositionen_ID" , ADP."AuftrDokPosi_Menge" ,coalesce( ( select sum(GM."AuftrDokPosi_Menge" ) from "AuftragsDokumentePositionen" GM join "AuftragsDokumente" GMD ON GMD."AuftrDokument_ID" = GM."AuftrDokPosi_DokumentID" and GMD."AuftrDokument_Version" is not null -- <- LS/GS muss abgeschlossen sein -- where GM."AuftrDokPosi_MasterDokPosID" = ADP."AuftragsDokumentePositionen_ID" and GM."AuftrDokPosi_Art" <= 10 where GM."AuftrDokPosi_AbgeleitetVonPos" = ADP."AuftragsDokumentePositionen_ID" and GM."AuftrDokPosi_Art" <= 10 and GMD."AuftrDokument_Art" in( 300 ) -- 300 = LS / 900 = Storno Storno geht hier eigentlich nicht !! ?? 300, 900 group by GM."AuftrDokPosi_MasterDokPosID" ),0 ) , AD."AuftrDokument_LeistungsDatum" , coalesce( AD."AuftrDokument_VersandArt" ,0 ) from "AuftragsDokumentePositionen" ADP join "AuftragsDokumente" AD ON AD."AuftrDokument_ID" = ADP."AuftrDokPosi_DokumentID" and AD."AuftrDokument_Art" = 250 -- 250 = Kommissionsschein where ADP."AuftrDokPosi_MasterDokPosID" = :"AB_AuftrDokumPositionID" -- and ( :"I_NurDieseVersandArten" is null or coalesce( AD."AuftrDokument_VersandArt",0) in ( select "Value" from "SelectForINoperator"( :"I_NurDieseVersandArten" ))) into :"KS_AuftrDokumPositionID" , :"KS_Menge" , :"KS_VersendeteMenge" , :"KS_LeistungsDatum" , :"KS_VersandArt" do begin "KS_offeneMenge" = :"KS_Menge" - :"KS_VersendeteMenge"; if ( :"KS_offeneMenge" > 0 ) then -- Wichtig diesen Kommissionschein nur nehmen wenn er noch nicht kpl. fortgefuehrt ist begin -- Da immer nur eine Zeile Zurueckgegeben wird kann es immer noch vorkommen das es Probleme gibt mit der Versandart wenn es zwei kommissionscheine zu einer Position mit verschiedenen Versandarten gibt. "KS_offeneGesMenge" = "KS_offeneGesMenge" + :"KS_offeneMenge"; -- In "KS_GesMenge" die Menge aller von der AB fortgefuehrten Mengen in den KS ablegen. if ( :"KS_LeistungsDatum" is null or :"KS_LeistungsDatum" <= :"I_LeistungsDatum" ) then begin if ( ( :"I_NurDieseVersandArten" is null ) or ( :"I_NurDieseVersandArten" is not null and :"KS_VersandArt" in (select "Value" from "SelectForINoperator"( :"I_NurDieseVersandArten" ))) ) then begin suspend; "TatsOffeneMenge" = NULL; -- Wenn suspend mit TatsOffenerMenge einmal ausgegeben dann nicht nochmal ausgeben !!! end end end end if ( :"TatsOffeneMenge" is not null ) then -- Wenn es oben zurueckgegeben wurde darf es hier nicht nochmal passieren begin if ( :"AB_LeistungsDatum" is null or :"AB_LeistungsDatum" <= :"I_LeistungsDatum" ) then begin if ( :"AB_offeneMenge" > :"KS_offeneGesMenge" ) then -- Wenn es keine offene Menge in der AB mehr gibt also alles im KS steckt sollte auch die AB alleine nicht mehr ausgegeben werden ! oder ? begin if ( ( :"I_NurDieseVersandArten" is null ) or ( :"I_NurDieseVersandArten" is not null and :"AB_VersandArt" in (select "Value" from "SelectForINoperator"( :"I_NurDieseVersandArten" ))) ) then begin "KS_AuftrDokumPositionID" = NULL; "KS_LeistungsDatum" = NULL; "KS_VersandArt" = NULL; "KS_offeneMenge" = NULL; "KS_VersendeteMenge" = NULL; "KS_Menge" = NULL; "KS_offeneGesMenge" = NULL; suspend; end end end end end end end ^ SET TERM ; ^ DESCRIBE PARAMETER "I_AuftrAnDenMandantSelbstAusbl" PROCEDURE "AuftrDokumente_Lieferung_offen" 'Auftraege vom und an den selben Mandanten ausblenden. Koennten evtl. Werksinterne Auftraege sein'; DESCRIBE PARAMETER "I_LeistungsDatum" PROCEDURE "AuftrDokumente_Lieferung_offen" 'Wenn es nicht beruecksichtigt werden soll auf 1.1.9999 setzen'; DESCRIBE PARAMETER "TatsOffeneMenge" PROCEDURE "AuftrDokumente_Lieferung_offen" 'Wird pro AB Position wirklich nur einmal zurueckgegeben.'; DESCRIBE PARAMETER "KS_VersandArt" PROCEDURE "AuftrDokumente_Lieferung_offen" 'Wenn die Versandart der KS Position von der AB-Position abweicht'; DESCRIBE PARAMETER "KS_offeneMenge" PROCEDURE "AuftrDokumente_Lieferung_offen" 'Wenn es einen KS gibt dessen offene Menge hier zurueckgeben aber AB_offenen Menge auf 0 setzen'; DESCRIBE PARAMETER "BE_Menge" PROCEDURE "AuftrDokumente_Lieferung_offen" 'Bestellte Menge Artikelbezogen es koennen mehrere Positionen den gleichen Artikel enthalten'; DESCRIBE PARAMETER "BE_WeMenge" PROCEDURE "AuftrDokumente_Lieferung_offen" 'Wareneingangsmenge der Bestellten Menge'; DESCRIBE PARAMETER "Lager_Menge" PROCEDURE "AuftrDokumente_Lieferung_offen" 'Wenn der Artikel auf Lager liegt'; DESCRIBE PROCEDURE "AuftrDokument-GetMailParameter" 'Entwder "TextBlob" oder "Text" ist belegt !!!! RowType = 0 Antwortadresse RowType = 1 From Adress ( je nachdem auch mehrere ) RowType = 2 To Adress evtl. mehrmals ( wenn es eine oder mehrer Bevorzugte gibt nur diese -- wenn keine bevorzugte dann alle anderen Mailadressen des Asp. RowType = 3 = CC empfaenger ( ungenutzt ) RowType = 4 = BCC Empfaenger wenn mehrere Sachbearbeiter/Vertreter vorhanden RowType = 10 Betreffzeile RowType = 11 Dateiname fuer den PDF Anhang / Dokument RowType = 12 Textvorlage RowType = 1000 Anmeldedaten fur den SMTP Server ( Benutzer/Mailadresse ) RowType = 1001 Anmeldedaten fur den SMTP Server ( Passwort ) RowType = 1002 Anmeldedaten fur den SMTP Server ( URL/IP Server ) RowType = 1003 Anmeldedaten fur den SMTP Server ( Port ) Gibt die SMTP-Server Daten nur zurueck wenn eine einzige Absenderadresse gefunden wurde. Ansonsten muss man mit "I_DokumenID" = -1 fuer die gewaehlte Mailadresse extra die SMTP-Daten abfragen.'; /* empty dependent procedure body */ /* Clear: SetGlobalMandantContextVariable for: E-MailStrukturListe */ SET TERM ^ ; ALTER PROCEDURE "SetGlobalMandantContextVariable"("I_MandantGP_ID" TYPE OF COLUMN "AKT_Stammdaten"."Akt_StDaten_GP_ID", "I_UserLanguage" TYPE OF COLUMN "Staaten"."Postkuerzel") AS BEGIN EXIT; END ^ /* Alter (E-MailStrukturListe) */ ALTER PROCEDURE "E-MailStrukturListe"("I_ShowResourceIDs" "d_str320", "I_ShowEMOS_ID" INTEGER, "I_Level" INTEGER) RETURNS(EMOS_ID INTEGER, "Level" INTEGER, "Type" INTEGER, "Resource_ID" TYPE OF COLUMN RESOURCE.RESOURCE_ID, "ResourceOwner" CHAR CHARACTER SET ASCII, "ChildCount" INTEGER, "MailCount" INTEGER, "MailAttentionCount" INTEGER, "ResGruppenID" INTEGER, "RechtLesen" INTEGER, "RechtSchreiben" INTEGER, "MailOrdnerPrivat" CHAR CHARACTER SET ASCII) AS declare variable "Temp_Int" integer; declare variable "ResourceID" integer; declare variable "NewResourceID" type of column RESOURCE.RESOURCE_ID; declare variable V_EMOS_ID integer; declare variable "V_Type" integer; declare variable "AllMailCount" integer; declare variable "AllMailAttentionCount" integer; declare variable "V_MailOrdnerPrivat" char(1) character set ASCII; begin if ( :"I_ShowEMOS_ID" is null ) then "I_Level" = 0; else "Level" = :"I_Level"; -- Der Left Outer Join kostet viel Zeit evtl. zweimal den Block haben und je nachdem ob :"I_ShowResourceIDs" Null ist den entsprechenden aufrufen. if ( :"I_ShowEMOS_ID" is not null ) then begin for select A."EMailOrdnerStrukturID" , "EMOS_Type" , "EMOS_Privat" from "E-Mail-OrdnerStruktur" A where A."EMOS_Parent" is not distinct from :"I_ShowEMOS_ID" into :"EMOS_ID" , :"Type" , :"MailOrdnerPrivat" do begin "Level" = :"I_Level"; select "MailCount" , "MailAttentionCount" from "E-MailOrdnerStatus"( :"EMOS_ID", NULL , 'N' , 'N' ) into :"MailCount" , :"MailAttentionCount"; "ChildCount" = ( select count(*) from "E-Mail-OrdnerStruktur" A where A."EMOS_Parent" = :"EMOS_ID" ); suspend; for select A."EMOS_ID" ,A."Level" , "Type" from "E-MailStrukturListe"( NULL , :"EMOS_ID" , :"I_Level" +1 ) A into :"EMOS_ID" , :"Level" , :"Type" do begin select "MailCount" , "MailAttentionCount" from "E-MailOrdnerStatus"( :"EMOS_ID", NULL , 'N' , 'N' ) into :"MailCount" , :"MailAttentionCount"; "ChildCount" = ( select count(*) from "E-Mail-OrdnerStruktur" A where A."EMOS_Parent" = :"EMOS_ID" ); suspend; end end end else begin "Resource_ID" = NULL; for select "RESO_MailOrdnerStrukturID" , "RESOURCE_ID" , cast(NULL as integer) as "RGZ_ResGruppenID", (cast( 999 as integer)) as "RGZ_GrRechtLesen", (cast( 999 as integer)) as "RGZ_GrRechtSchreiben" from "RESOURCE" where "RESO_ASP_ID" = rdb$get_context( 'USER_SESSION' , 'USER_ASP_ID' ) and ("RESOURCE_ID" in ( select distinct "Value" from "SelectForINoperator"( :"I_ShowResourceIDs" )) or ( :"I_ShowResourceIDs" is null and "RESOURCE_ID" is not null )) union select "RESO_MailOrdnerStrukturID" , "RGZ_ResourceID" , "RGZ_ResGruppenID" , ("RGZ_GrRechtLesen") , ("RGZ_GrRechtSchreiben") from "RESOURCE" AA join "ResourceGruppenZuordnung" BB ON AA.resource_id = BB."RGZ_ResourceID" and "RGZ_ResGruppenID" in ( select "RGZ_ResGruppenID" from "ResourceGruppenZuordnung" where "RGZ_ResourceID" in( select "RESOURCE_ID" from "RESOURCE" where "RESO_ASP_ID" = rdb$get_context( 'USER_SESSION' , 'USER_ASP_ID' ) ) ) join "ResourceGruppen" RG ON BB."RGZ_ResGruppenID" = RG."ResourceGruppenID" and RG."ResGrup_Art" =1 -- 1 = E-Mail also nur Mailgruppen zurueckgebebn where ("RESOURCE_ID" in ( select distinct "Value" from "SelectForINoperator"( :"I_ShowResourceIDs" )) or ( :"I_ShowResourceIDs" is null and "RESOURCE_ID" is not null )) -- Nur die ReourdeIDs aus :"I_ShowResourceIDs" oder alles and "RGZ_VerbergeDieseResourceID" <= 0 order by 2 , 3 nulls first , 4 , 5 into :"EMOS_ID" , :"NewResourceID" , :"ResGruppenID" , :"RechtLesen" , :"RechtSchreiben" do begin if ( :"NewResourceID" is distinct from :"Resource_ID" ) then -- Es koenne doppelte Resourcen vorkommen aber die mit den meisten Rechten kmmen immer zuerst begin -- nur diese werden dann hier genommen !!! "Resource_ID" = :"NewResourceID"; if ( :"ResGruppenID" is null ) then "ResourceOwner" = 'Y'; else "ResourceOwner" = 'N'; "Level" = :"I_Level"; -- Den ersten Eintrag erst am Schluss ausgeben da er die Summen aller untergeordneten Ordner zeigt !!! "V_EMOS_ID" = :"EMOS_ID"; "V_Type" = :"Type"; "AllMailCount" =0; "AllMailAttentionCount" = 0; for select A."EMOS_ID" ,A."Level" , "Type" from "E-MailStrukturListe"( NULL , :"EMOS_ID" , :"I_Level" +1 ) A into :"EMOS_ID" , :"Level" , :"Type" do begin select "MailCount" , "MailAttentionCount" from "E-MailOrdnerStatus"( :"EMOS_ID", NULL , 'N', 'N' ) into :"MailCount" , :"MailAttentionCount"; "ChildCount" = ( select count(*) from "E-Mail-OrdnerStruktur" A where A."EMOS_Parent" = :"EMOS_ID" ); "AllMailCount" = :"AllMailCount" + :"MailCount"; "AllMailAttentionCount" = :"AllMailAttentionCount" + :"MailAttentionCount"; suspend; end "Level" = :"I_Level"; "EMOS_ID" = :"V_EMOS_ID"; "ChildCount" = ( select count(*) from "E-Mail-OrdnerStruktur" A where A."EMOS_Parent" = :"EMOS_ID" ); "Type" = :"V_Type"; "MailCount" = :"AllMailCount"; "MailAttentionCount" = :"AllMailAttentionCount"; "MailOrdnerPrivat" = ( select "EMOS_Privat" from "E-Mail-OrdnerStruktur" where "EMailOrdnerStrukturID" = :"EMOS_ID") ; suspend; end end end end ^ SET TERM ; ^ DESCRIBE PARAMETER "I_ShowResourceIDs" PROCEDURE "E-MailStrukturListe" 'Alle Postfaecher der uebergebenen Resourcen anzeiogen.Kann auch leer bleiben. Dann schaut er ueber den Benutzer nach dem richtigen Postfach.'; DESCRIBE PARAMETER "I_ShowEMOS_ID" PROCEDURE "E-MailStrukturListe" 'Wird genutzt um unterordner zu durchlaufen'; DESCRIBE PARAMETER "MailAttentionCount" PROCEDURE "E-MailStrukturListe" 'Neue Mail nicht zugeordnete Mail noch nicht gesendete Mail'; /* Alter (GeneratorValue) */ SET TERM ^ ; ALTER PROCEDURE "GeneratorValue"("GeneratorName" "SystemFeldNamenLaenge", "SetValue" BIGINT, "Erzeuge" CHAR) RETURNS("Value" BIGINT) AS declare variable "Statement" varchar(230); begin if ( :"GeneratorName" = 'NULL' ) then exit; -- Der Name NULL wird nicht bearbeitet. post_event 'DruckTemplateChange'; -- Wenn das Konfigurationsframe diesen Event erhaelt muessen alle daten neu geladen werden. if ( :"Erzeuge" = 'Y' ) then begin -- exception "Fatal_Error" coalesce( :"GeneratorName" , 'NULL' )|| coalesce(:"SetValue" , 'NULL')|| coalesce(:"Erzeuge" , 'NULL'); if ( current_user != 'SYSDBA' ) then exception "KeineBerechtigung" 'Nur SYSDBA erlaubt !'; begin if ( not exists ( select * from rdb$generators where rdb$system_flag = 0 and rdb$generator_name = :"GeneratorName" ) ) then begin "Statement" = 'CREATE SEQUENCE "' || :"GeneratorName"||'"'; execute statement :"Statement"; when any do -- Alle Fehler abfangen und NULL zurueckgeben begin in autonomous transaction do insert into "ErrorLog" ( "EL_SQLErrorCode" , "EL_Text" ) values( SQLSTATE , 'Aufgetreten in SP GeneratorValue Zeile 11.' ); "Value" = NULL; end end end end if ( :"SetValue" is null ) then begin -- Im Fehlerfall eine DB-Null zurueckgeben kann normalerweise nicht sein so muss die Abfragende Komponente darauf reagieren. "Statement" = 'select GEN_ID( "' || :"GeneratorName" || '" , 0) from "GetOneResultRow"'; begin execute statement :"Statement" into :"Value"; when any do -- Alle Fehler abfangen und NULL zurueckgeben begin in autonomous transaction do insert into "ErrorLog" ( "EL_SQLErrorCode" , "EL_Text" ) values( SQLSTATE , 'Aufgetreten in SP GeneratorValue Zeile 26.' ); "Value" = NULL; end end suspend; end else -- Neuen Generatorwert setzen begin -- exception "Fatal_Error" coalesce( :"GeneratorName" , 'NULL' )|| coalesce(:"SetValue" , 'NULL')|| coalesce(:"Erzeuge" , 'NULL'); if ( :"GeneratorName" = 'AuftrDokNr_GlobalNrKreisID' ) then exception "Fatal_Error"'Dieser Generator darf nicht veraenndert werden !'; if ( current_user != 'SYSDBA' ) then begin -- Wer einen Nummernkreis aendern moechte muss die Berechtigung in jedem Mandanten haben. Hier bekomme ich nicht den Mandanten um den es geht oder aus dem String muss der Mandant extrahiert werden. if ( exists (select * from "BenutzerRechte" A where A."BR_UserName" = current_user and "BR_NummernKreiseVeraendern" = 'N' ) ) then exception "KeineBerechtigung"; end "Value" = :"SetValue"; "Statement" = 'ALTER SEQUENCE "' || :"GeneratorName" || '" RESTART WITH '|| :"SetValue"; begin execute statement :"Statement"; when any do -- Alle Fehler abfangen und NULL zurueckgeben begin in autonomous transaction do insert into "ErrorLog" ( "EL_SQLErrorCode" , "EL_Text" ) values( SQLSTATE , 'Aufgetreten in SP GeneratorValue Zeile 41.' ); "Value" = NULL; end end suspend; end end ^ /* Alter (GP_SUCHEN_HILFE) */ ALTER PROCEDURE GP_SUCHEN_HILFE("iGP_ID" INTEGER, "iName" VARCHAR(15), "iStrasse" VARCHAR(10), "iStaat" VARCHAR(5), "iPLZ" VARCHAR(10), "iOrt" VARCHAR(10), "iAnschRolle" VARCHAR(200), "iAktiv" CHAR, "iKatalogImGpVorhanden" CHAR, "iVarParam1" "d_str20" = NULL) RETURNS("S_GeschP_ID" INTEGER, "S_GeschP_verID" INTEGER) AS declare variable "Statement" varchar(2048); declare variable "VAnschRolle" varchar(210); declare variable "Value" integer; declare variable "StrPos" integer; declare variable "HauptGP_Only" D_BOOLEAN_YN; declare variable "V_DokumentArt" integer; begin /* ACHTUNG !!! Wenn in iGP_ID != NULL ist steht in iAnschRolle Der Type G=GP_ID(Default auch wenn nichts angegeben) , K=Kundennr. , L=Lieferantennr. Das Filtern ueber die Gruppenverwaltung soll erstmal erhlaten bleiben, da es flexibler ist als ueber PLZ. Filtern ueber AspID( dadurch auch Vertreter da er auch ein Asp ist ) und PLZ-Listen kommt neu. Hier aber auch feste Zuordnungen nochmals preufen. Also wenn es eine feste zuprdnung gibt sieht auch keinen andere Vertreter mehr diesen GP. Aber jeder Asp sieht die fest zugeordneten und die aus der PLZ-Liste. */ "HauptGP_Only" = 'N'; if ( :"iStaat" is null ) then "iStaat" ='%'; if ( :"iGP_ID" is null and :"iName" = '%' and :"iStaat" = '%' and :"iStrasse" = '%' and :"iOrt" = '%' and :"iPLZ" = '' and :"iKatalogImGpVorhanden" = 'N' and trim(:"iAnschRolle") = '1' ) then -- Wenn keine Suchkriterien uebergeben werden nur die Hauptgeschaeftspartner anzeigen ( Mandanten ) "HauptGP_Only" = 'Y'; "iAnschRolle" = trim(:"iAnschRolle"); "iAnschRolle" = trim(both ',' from upper(:"iAnschRolle")); if ( "iGP_ID" > 0 or :"iVarParam1" is not null ) then begin -- Distinct muss im Select vorhanden sein -- weil durch die Zusatzanschriften auch dee selbe GP mehrfach gefunden werden kann. "Statement" = 'SELECT distinct "Akt_Gesch_Partner_ID" , "Akt_Gesch_Partner_VerID" FROM "AKT_Gesch_Partner" "A" '; -- Vorher wurde nicht gefiltert wenn eine GP_ID einzeln abgefragt wurde das geht natuerlich nicht if ( exists ( select * from "Zugriffsrechte_GP_Suchen" where rdb$get_context( 'USER_SESSION' , 'USER_ASP_ID' ) = "ZrGPs_AspID" ) )then begin -- "Statement" = :"Statement" || ' join "Gruppenzuordnungen" BB ON BB.gz_gv_id = A."Akt_GP_GV_ID" and "GZ_GRUPPEN_ID" = ( select "ZrGPs_Gruppen_ID" from "Zugriffsrechte_GP_Suchen" where rdb$get_context( ''USER_SESSION'' , ''USER_ASP_ID'' ) = "ZrGPs_AspID" )'; -- Achtung noichmal ueberdenken in der Testdatenbank auf RadStXE2 ist folgendes passiert. -- Angemeldet mit sysdba den GP König gesperrt und dann auf auch gesperrte GP anzeigen gegangen aber er wurde nicht mehr angezeigt. -- Dieses Problem nochmal pruefen bei gelegenheit kommt hier nochmal vor -- dort ist es auch auskommentiert end if ( substring( :"iAnschRolle" from 1 for 1) in ( 'A' , 'R') ) then -- Auftragsdokumente. suchen oder Referenznr. -- Dokumente > 10.000 (Einkauf) immer anzeigen Dokumente < 10000 nur abhaegig vom Mandanten anzeigen !!! "Statement" = :"Statement" || ' JOIN "AuftragsDokumente" D ON D."AuftrDokument_fuer_GP_ID" = A."Akt_Gesch_Partner_ID" and ( (D."AuftrDokument_Art" < 10000 and D."AuftrDokument_von_GP_ID" = rdb$get_context( ''USER_SESSION'' , ''MANDANT_GP_ID'' )) or D."AuftrDokument_Art" > 10000 ) '; else if ( "iAnschRolle" = 'K' ) then -- Kundennr. suchen "Statement" = :"Statement" || ' JOIN "Kunden" K ON K."K_Gesch_Partner_ID" = A."Akt_Gesch_Partner_ID"'; else if ( "iAnschRolle" = 'L' ) then -- Lieferantennr. suchen "Statement" = :"Statement" || ' JOIN "Lieferanten" L ON L."L_Gesch_Partner_ID" = A."Akt_Gesch_Partner_ID"'; -- Ein einschraenken auf nur mit Katalog suchen macht keienn sinn wenn man eine GP_ID eingibt also lassen wir das hier. "Statement" = :"Statement" || ' JOIN "Anschriftenart" H ON H."AA_GeschPartner_ID" = A."Akt_Gesch_Partner_ID" '; /* Unterscheiden was gesucht wird normale GP/Kunden/Lieferanten oder Dokumente !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! So ist es moeglich das er alle Dokumente anzeigt in die der Vertreter verwickelt war. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! if ( exists ( select * from "PLZ_ListenZuordnungen" where rdb$get_context( 'USER_SESSION' , 'USER_ASP_ID' ) = "PLZ_AspID" ) )then begin "Statement" = :"Statement" || ' join "PLZ_Listen_zu_Asp" I ON I.gz_gv_id = A."Akt_GP_GV_ID" and "GZ_GRUPPEN_ID" = ( select "ZrGPs_Gruppen_ID" from "Zugriffsrechte_GP_Suchen" where rdb$get_context( ''USER_SESSION'' , ''USER_ASP_ID'' ) = "ZrGPs_AspID" )'; end */ -- LEFT OUTER JOIN "Kataloge" K ON k."Klog_GP_ID" = A."Akt_Gesch_Partner_ID" -- Kataloge ganz raus genommen wenn GP_ID uebergeben wird nich danach filtern if ( substring("iAnschRolle" from 1 for 1 ) = 'A' ) then -- Auftragsdokumente. suchen -- dem A koennen weiter Parameter folgen mindestens einer begin -- z.B. A,100,2010 A=Auftragsdokuemtn , 100 = Dokumentart , 2010 = Jahr des Dokuments das Jahr ist optional die Reihenfolge muss eingehalten werden. "iAktiv" = '%'; -- Alles andre macht keinen Sinn in dieser Kombination "iKatalogImGpVorhanden" = 'N'; -- Alles andre macht keinen Sinn in dieser Kombination begin "StrPos" = position( ',' ,:"iAnschRolle" ); if ( :"StrPos" = 0 ) then exception "Fatal_Error" 'Parameter Dokument-Art/Datum fehlt'; "iAnschRolle" = trim(substring( :"iAnschRolle" from :"StrPos"+1 )); -- Das A am Anfang entfernen "StrPos" = position( ',' ,:"iAnschRolle" ); if ( :"StrPos" > 0 ) then begin "V_DokumentArt" = substring( :"iAnschRolle" from 1 for :"StrPos" -1); "iAnschRolle" = trim(substring( :"iAnschRolle" from :"StrPos"+1 )); if ( :"iAnschRolle" != '' ) then -- es wurde wohl noch ein jahr uebergeben "Statement" = :"Statement" || ' and "AuftrDokument_Jahr"= '|| :"iAnschRolle" ; end else "V_DokumentArt" = :"iAnschRolle"; if ( :"V_DokumentArt" in ( 10300,10400,10500 )) then -- Die richtige Dokumentnr bei WarenEinganglieferscheinen/Rechnungen/GS steht in ReferenzNr "Statement" = :"Statement" || ' where "AuftrDokument_ReferenzNr" = :varparam and "AuftrDokument_Art" = '|| :"V_DokumentArt"; else "Statement" = :"Statement" || ' where "AuftrDokument_Nummer" = :varparam and "AuftrDokument_Art" = '|| :"V_DokumentArt"; end when any do exception "Fatal_Error"'Suchanfrage fehlerhaft !'; end else if ( "iAnschRolle" = 'K' ) then -- Kundennr suchen "Statement" = :"Statement" || ' WHERE "K_KDNR" = :gp_id'; else if ( "iAnschRolle" = 'L' ) then -- Lieferantennr. suchen "Statement" = :"Statement" || ' WHERE "L_LieferantenNr" = :gp_id'; else if ( "iAnschRolle" = 'R' ) then -- Referenznr. suchen begin "Statement" = :"Statement" || ' WHERE "AuftrDokument_ReferenzNr" like :varparam'; "iAnschRolle" = NULL; end else -- Wenn es 'G' ist oder halt was anderes wird immer eine GP_ID gesucht. "Statement" = :"Statement" || ' WHERE "Akt_Gesch_Partner_ID" = :gp_id'; "Statement" = :"Statement" || ' AND "AA_Aktiv" like :aktiv'; -- like ist wichtig da ich mit 'Y' oder '%' arbeite 'N' wird normalerweise nicht benoetigt -- Left outer join "Kataloge" ist wichtig sonst fliegen alle ohne Katalog raus aber das soll nicht sein wenn man direkt eine GP_ID angibt :-( -- Die AnschRolle wird beim direkten suchen mit einer GP_ID auch nicht beruecksichtigt ( macht nicht viel sinn ) and H."AA_Rolle" in ( 1,2,3 )'; if ( :"iVarParam1" is null ) then -- Wenn :"iVarParam1" NULL ist dann wird :"iGP_ID" genutzt. Die Parameter die aufgefuehrt werden muessen auch im SQL vorkommen !!! begin for execute statement (:"Statement") ( gp_id := :"iGP_ID" , aktiv := :"iAktiv" ) into :"S_GeschP_ID" , :"S_GeschP_verID" do begin -- Evtl. mehrere Ergebnisse bei der Referenznr. if ( :"S_GeschP_verID" is not null ) then suspend; end end else begin for execute statement (:"Statement") ( aktiv := :"iAktiv" , varparam := :"iVarParam1" ) into :"S_GeschP_ID" , :"S_GeschP_verID" do begin -- Evtrl. mehrere Ergebnisse bei der Referenznr. if ( :"S_GeschP_verID" is not null ) then suspend; end end end else begin -- Distinct muss im Select vorhanden sein -- weil durch die Zusatzanschriften auch der selbe GP mehrfach gefunden werden kann. "Statement" ='SELECT distinct "Akt_Gesch_Partner_ID" , "Akt_Gesch_Partner_VerID" FROM "AKT_Gesch_Partner" "A" JOIN "Anschriftenart" H ON H."AA_GeschPartner_ID" = A."Akt_Gesch_Partner_ID " '; "iName" = (select "SearchString" from"SearchString"( :"iName" )); "iOrt" = (select "SearchString" from"SearchString"( :"iOrt" )); "iStrasse" = (select "SearchString" from"SearchString"( :"iStrasse" )); -- searchstringde82( :"iStrasse" ); if ( :"HauptGP_Only" = 'Y' ) then "Statement" = :"Statement" || ' JOIN "AKT_Stammdaten" MANDANT ON MANDANT."Akt_StDaten_GP_ID" = A."Akt_Gesch_Partner_ID "'; -- hier sollen alle gefiltert werden die keinen Katalog haben -- deswehen kein left outer join if ( "iKatalogImGpVorhanden" = 'Y' ) then begin "Statement" = :"Statement" || ' LEFT OUTER JOIN "Kataloge" K ON k."Klog_GP_ID" = A."Akt_Gesch_Partner_ID "'; -- hier sollen alle gefiltert werden die keinen Katalog haben -- deswehen kein left outer join "Statement" = :"Statement" || ' LEFT OUTER JOIN "Lieferanten" L ON L."L_Gesch_Partner_ID" = A."Akt_Gesch_Partner_ID "'; -- hier sollen alle gefiltert werden die keinen Katalog haben -- deswehen kein left outer join end if ( exists ( select * from "Zugriffsrechte_GP_Suchen" where rdb$get_context( 'USER_SESSION' , 'USER_ASP_ID' ) = "ZrGPs_AspID" ) )then begin -- "Statement" = :"Statement" || ' join "Gruppenzuordnungen" BB ON BB.gz_gv_id = A."Akt_GP_GV_ID" and "GZ_GRUPPEN_ID" = ( select "ZrGPs_Gruppen_ID" from "Zugriffsrechte_GP_Suchen" where rdb$get_context( ''USER_SESSION'' , ''USER_ASP_ID'' ) = "ZrGPs_AspID" )'; -- Achtung noichmal ueberdenken in der Testdatenbank auf RadStXE2 ist folgendes passiert. -- Angemeldet mit sysdba den GP König gesperrt und dann auf auch gesperrte GP anzeigen gegangen aber er wurde nicht mehr angezeigt. -- Dieses Problem nochmal pruefen bei gelegenheit kommt hier nochmal vor -- dort ist es auch auskommentiert end "Statement" = :"Statement" || ' left outer JOIN "Gesch_partner" "B" ON A."Akt_Gesch_Partner_VerID" = B."Gesch_partner_verID" JOIN "Anschriften" "C" ON B."GP_Anschrift" = C."ANSCHRIFTEN_ID" JOIN "Anreden" "D" ON C."Anrede" = D."Anrede_ID" JOIN "PLZ" "E" ON C."A_PLZ_ID" = E."PLZ_ID" Where "AA_Suchfeld_Name" like :Name AND "AA_Aktiv" like :Aktiv'; -- like ist wichtig da ich mit 'Y' oder '%' arbeite 'N' wird normalerweise nicht benoetigt "Statement" = :"Statement" || ' AND ( upper ("Ort") like :Ort or ( "Ort" is null) ) AND ( upper ("Strasse") like :Strasse or ( "Strasse" IS NULL ) ) AND ( PLZ starting with :PLZ or ( PLZ is NULL ) )'; if ( "iKatalogImGpVorhanden" = 'Y' ) then "Statement" = :"Statement" || ' AND ( "Klog_GP_ID" is not null or "L_Gesch_Partner_ID" is not null) '; if ( :"iAnschRolle" is not null ) then begin "VAnschRolle" = ''; "iAnschRolle" = :"iAnschRolle" || ','; -- Select forForInOperator braucht ein abschliessendes , for select "Value" from "SelectForINoperator" ( :"iAnschRolle" ) -- Nur um sicher zu gehen das sonst nicht hierueber in den SQL-Text gelangt into :"Value" -- und so stimmt auch sicher der String und es gibt keine Fehlermeldung do begin "VAnschRolle" = :"VAnschRolle" || :"Value" || ','; end "VAnschRolle" = trim( both ',' from :"VAnschRolle" ); "Statement" = :"Statement" || ' and H."AA_Rolle" in ( ' || :"VAnschRolle" || ' )' ; end "Statement" = :"Statement" || ' order by "Akt_Gesch_Partner_ID"'; -- Wenn oben distinct steht kann man hier auch danach sortiern isteh nicht mehr langsamer for execute statement (:"Statement") ( aktiv := :"iAktiv" , name := :"iName" , Strasse :=:"iStrasse" , Ort :=:"iOrt" , plz := :"iPLZ" ) into :"S_GeschP_ID" , :"S_GeschP_verID" do suspend; /* Es gibt noch moeglichkeiten die Geschw. zu steigern. Nur die Suchparameter integrieren die gabraucht werden. DISTINCT weg bekommen und in aufrufender query vorschreiben. Macht aber alles auch nicht die Welt aus . Bei 600.000 Adressen 12 ansatt 15 sekunden. */ -- Noch nicht eingabeut ( glaub ist nicht noetig ) else if ( coalesce( char_length( :"iPLZ" ) , 0 ) > 1 ) then end end ^ SET TERM ; ^ DESCRIBE PARAMETER "iAnschRolle" PROCEDURE GP_SUCHEN_HILFE 'Anschrollen oder GP_ID,Kd-Nr., Lief.-Nr.'; DESCRIBE PARAMETER "iVarParam1" PROCEDURE GP_SUCHEN_HILFE 'Zusaetzlicher Parameter fuer z.B. Referenznummer !!'; DESCRIBE PARAMETER "iVarParam1" PROCEDURE GP_SUCHEN_HILFE 'Zusaetzlicher Parameter fuer z.B. Referenznummer !!'; /* Alter (GruppenOperationen) */ SET TERM ^ ; ALTER PROCEDURE "GruppenOperationen"("Destination" INTEGER, "Source" INTEGER, "VARstr1" VARCHAR(4096), FUNKTION VARCHAR(30), "Entry" INTEGER = null) RETURNS("GroupNumbers" VARCHAR(4096), ROWS_CHANGE INTEGER) AS declare variable "VARstr2" varchar(90); declare variable "VARstr3" varchar(90); declare variable "VARint1" integer; declare variable "VARint2" integer; declare variable "AlleGrNummern" varchar(4096); declare variable "isGP" char(1); declare variable "isASP" char(1); begin "GroupNumbers" = ''; if ( "VARstr1" is null) then "VARstr1"=''; if ( "Destination" is not null ) then begin select "Gr_Ansprechpartner" , "Gr_GeschPartner" from "Gruppen" where GRUPPEN_ID = :"Destination" into: "isASP" , "isGP"; if ( "isASP" = 'Y') then "isASP" = '%'; if ( "isGP" = 'Y') then "isGP" = '%'; end /* Alle Mitglieder der Gruppe "Source" werden der Gruppe "Destination" zugeordnet. Aber nur solche die in der Zielgruppe enthalten sein drfen. */ if ( FUNKTION = 'AddGroup' and :"Destination" is not null and :"Source" is not null ) then begin insert into "Gruppenzuordnungen" (GZ_GV_ID, GZ_GRUPPEN_ID) select "alt".GZ_GV_ID, :"Destination" from "Gruppenzuordnungen" "alt" join "GruppenVerbinder" B ON "alt".GZ_GV_ID = B.GV_ID AND B."GV_isGP" like :"isGP" AND B."GV_isAsp" like :"isASP" where "alt".GZ_GRUPPEN_ID = :"Source" and not exists (select * from "Gruppenzuordnungen" "sch" where "alt".GZ_GV_ID = "sch".GZ_GV_ID and :"Destination" = "sch".GZ_GRUPPEN_ID ); end /* Alle Mitglieder ab der Gruppe "Source" werden rekursiv der Gruppe "Destination" zugeordnet. Aber nur solche die in der Zielgruppe enthalten sein duerfen. */ else if ( FUNKTION = 'AddGroupRekursiv' and :"Destination" is not null and :"Source" is not null ) then begin "AlleGrNummern"="Source"; /*Damit die gruppe Source auch in der Liste enthalten ist. */ select "GroupNumbers" from "GruppenOperationen" ( null , :"Source" , :"AlleGrNummern" , 'AllGroupsInSource' ) into:"AlleGrNummern"; for select "Value" from "SelectForINoperator" (:"AlleGrNummern") into :"Source" do begin if ( :"Source" != :"Destination" ) then /* Die Gruppe braucht sich nicht in sich slbst zu kopieren */ begin insert into "Gruppenzuordnungen" (GZ_GV_ID, GZ_GRUPPEN_ID) select "alt".GZ_GV_ID, :"Destination" from "Gruppenzuordnungen" "alt" join "GruppenVerbinder" B ON "alt".GZ_GV_ID = B.GV_ID AND B."GV_isGP" like :"isGP" AND B."GV_isAsp" like :"isASP" where "alt".GZ_GRUPPEN_ID = :"Source" and not exists (select * from "Gruppenzuordnungen" "sch" where "alt".GZ_GV_ID = "sch".GZ_GV_ID and :"Destination" = "sch".GZ_GRUPPEN_ID ); end end end /* Alle Mitglieder der Gruppe "Source" werden aus der Gruppe "Destination" enfernt. */ else if ( FUNKTION = 'SubGroup' and :"Destination" is not null and :"Source" is not null ) then begin delete from "Gruppenzuordnungen" A where GZ_GRUPPEN_ID = :"Destination" and exists ( select GZ_GV_ID from "Gruppenzuordnungen" where GZ_GRUPPEN_ID = :"Source" and A.GZ_GV_ID = GZ_GV_ID ) ; end /* Alle Mitglieder der Gruppe "Source" werden rekusiv aus der Gruppe "Destination" enfernt. */ else if ( FUNKTION = 'SubGroupRekursiv' and :"Destination" is not null and :"Source" is not null ) then begin "AlleGrNummern"="Source"; /*Damit die gruppe Source auch in der Liste enthalten ist. */ select "GroupNumbers" from "GruppenOperationen" ( null , :"Source" , :"AlleGrNummern" , 'AllGroupsInSource' ) into:"AlleGrNummern"; for select "Value" from "SelectForINoperator" (:"AlleGrNummern") into :"Source" do begin if ( :"Source" != :"Destination" ) then /* Die Gruppe braucht sich nicht in sich slbst zu kopieren */ begin delete from "Gruppenzuordnungen" A where GZ_GRUPPEN_ID = :"Destination" and exists ( select GZ_GV_ID from "Gruppenzuordnungen" where GZ_GRUPPEN_ID = :"Source" and A.GZ_GV_ID = GZ_GV_ID ) ; end end end /* Alle Mitglieder der Gruppe "Source" loeschen. */ else if ( FUNKTION = 'DeleteAll' and :"Destination" is null and :"Source" is not null ) then begin /* Wenn die Gruppe Live ist und SQL leer darf der Eintrag nicht geloescht werden. */ if ( exists ( select GRUPPEN_ID From "Gruppen" where GRUPPEN_ID = :"Source" and "Gr_Live" = 'Y' and "Gr_SQL" IS NULL )) then exception "SystemGruppeNoDelete"; delete from "Gruppenzuordnungen" where GZ_GRUPPEN_ID = :"Source" ; end /* Alle Gruppen die in der Gruppe "Source" enthalten sind als ein String durch Komma getrennt zurueckgeben. */ else if ( FUNKTION = 'AllGroupsInSource' and :"Destination" is null and :"Source" is not null ) then begin "AlleGrNummern" = :"VARstr1"; for select GRUPPEN_ID from "Gruppen" A where A."Gr_Parent" = :"Source" into :"VARint1" do begin if ( :"VARint1" is not null ) then begin if ( :"AlleGrNummern" != '' ) then "AlleGrNummern" = :"AlleGrNummern" || ',' ; "AlleGrNummern" = :"AlleGrNummern" || :"VARint1" ; select "GroupNumbers" from "GruppenOperationen" ( null , :"VARint1" , :"AlleGrNummern" , 'AllGroupsInSource' ) into :"AlleGrNummern"; end end "GroupNumbers" = :"GroupNumbers" || :"AlleGrNummern"; end else if ( FUNKTION = 'CopyToTempTable' and :"Destination" is null and :"Source" is not null ) then begin delete from "GRUPPEN_ANSCHRIFTEN" ; insert into "GRUPPEN_ANSCHRIFTEN" select :"Source" , GP_ID , ASP_ID , PLZ , ANSCHRIFT , A_BRIEFKOPF , A_BRIEFTEXT from "AlleAnschriftenDerGruppe"( :"Source" ); /* Tabelle Locken kein anderer kann so etwas in 'GRUPPEN_ANSCHRIFTEN' veraendern.*/ update "Table_Lock" set "Benutzer" = "Benutzer" where "Tabelle" = 'GRUPPEN_ANSCHRIFTEN'; end /* Alle Mitglieder der Gruppe "Source" werden auf Aktiv/oder Inaktiv gesetzt. Aktiv = Y /Inaktiv = N */ else if ( FUNKTION = 'InAktiv' and :"Source" is not null and ( :"VARstr1" = 'Y' or :"VARstr1" = 'N' ) ) then begin "VARstr2" = "VARstr1" ; for select "Akt_Gesch_Partner_ID" , "Anschriftenart_ID" from "Gruppenzuordnungen" A join "AKT_Gesch_Partner" B ON A.GZ_GV_ID = B."Akt_GP_GV_ID" join "Anschriftenart" C ON B."Akt_Gesch_Partner_ID" = C."AA_GeschPartner_ID" and C."AA_Aktiv" != :"VARstr2" where A.GZ_GRUPPEN_ID = :"Source" into :"VARint1" , :"VARint2" do begin execute procedure "GP_Funktionen"( :"VARint1" , :"VARint2" , 'Aktiv' , :"VARstr2" ) RETURNING_VALUES "VARint1"; end end else if ( FUNKTION = 'GP_Del_By_ASP' /* GeschPartner in Gruppe loeschen wenn ASP vorhanden.*/ and :"Source" is not null ) then begin delete from "Gruppenzuordnungen" where GZ_GRUPPEN_ID = :"Source" and GZ_GV_ID in ( select E."Akt_GP_GV_ID" from "Gruppenzuordnungen" A join "GruppenVerbinder" B ON A.gz_gv_id = B.gv_id and B."GV_isAsp" = 'Y' join "Ansprechpartner" C ON B.gv_id = C.asp_gv_id join "Gesch_ASP_Abteilung" D ON C.asp_id = D."Abt_Asp_ID" join "AKT_Gesch_Partner" E ON D."Abt_Gesch_Partner_ID" = E."Akt_Gesch_Partner_ID" where A."GZ_GRUPPEN_ID" = :"Source"); end else if ( FUNKTION = 'ASP_Del_By_GP_inaktiv' /* AnsprechPartner in Gruppe loeschen wenn zugehoeriger GP inaktiv.*/ and :"Source" is not null ) then begin delete from "Gruppenzuordnungen" where GZ_GRUPPEN_ID = :"Source" and GZ_GV_ID in ( select B.GV_ID from "Gruppenzuordnungen" A join "GruppenVerbinder" B ON A.gz_gv_id = B.gv_id and B."GV_isAsp" = 'Y' join "Ansprechpartner" C ON B.gv_id = C.asp_gv_id join "Gesch_ASP_Abteilung" D ON C.asp_id = D."Abt_Asp_ID" /* join "AKT_Gesch_Partner" E ON D."Abt_Gesch_Partner_ID" = E."Akt_Gesch_Partner_ID" and E."Aktiv" = 'N' */ join "Anschriftenart" E ON D."Abt_Gesch_Partner_ID" = E."AA_GeschPartner_ID" and E."AA_Aktiv" = 'N' where A."GZ_GRUPPEN_ID" = :"Source"); end else if ( FUNKTION = 'ASP_Ins_By_GP_aktiv' /* Alle ASP's der vorhandenen GP's werden der Gruppe hinzugefuegt.*/ and :"Source" is not null ) then begin insert into "Gruppenzuordnungen" select e.asp_gv_id , :"Source" , current_timestamp , current_user from "Gruppenzuordnungen" A join "GruppenVerbinder" B ON A.gz_gv_id = B.gv_id and B."GV_isGP" = 'Y' join "AKT_Gesch_Partner" C ON B.gv_id = C."Akt_GP_GV_ID" join "Anschriftenart" G ON C."Akt_Gesch_Partner_ID" = G."AA_GeschPartner_ID" and G."AA_Aktiv" = 'Y' join "Gesch_ASP_Abteilung" D ON C."Akt_Gesch_Partner_ID" = D."Abt_Gesch_Partner_ID" join "Ansprechpartner" E ON D."Abt_Asp_ID" = E.asp_id where A."GZ_GRUPPEN_ID" = :"Source" and not exists (select * from "Gruppenzuordnungen" "sch" where e.asp_GV_ID = "sch".GZ_GV_ID and :"Source" = "sch".GZ_GRUPPEN_ID ); end else if ( FUNKTION = 'GP_Ins_By_Asp_aktiv' /* Alle GP's der vorhandenen Asp's werden der Gruppe hinzugefuegt.*/ and :"Source" is not null ) then -- Eingefuehrt am 07.04.2014 begin insert into "Gruppenzuordnungen" ( GZ_GV_ID , GZ_GRUPPEN_ID , "GZ_Zeitstempel" , "GZ_Benutzerstempel" ) select distinct E."Akt_GP_GV_ID" , cast( :"Source" as integer) , current_timestamp , current_user from "Gruppenzuordnungen" A join "GruppenVerbinder" B ON A.gz_gv_id = B.gv_id and B."GV_isAsp" = 'Y' join "Ansprechpartner" C ON B.gv_id = C.asp_gv_id join "Gesch_ASP_Abteilung" D ON C.asp_id = D."Abt_Asp_ID" join "AKT_Gesch_Partner" E ON D."Abt_Gesch_Partner_ID" = E."Akt_Gesch_Partner_ID" where A."GZ_GRUPPEN_ID" = :"Source" and not exists (select * from "Gruppenzuordnungen" "sch" where E."Akt_GP_GV_ID" = "sch".GZ_GV_ID and :"Source" = "sch".GZ_GRUPPEN_ID ); end else if ( FUNKTION = 'GP_WithoutEMailDelete' /* Alle GP's loeschen , wenn Ihnen keine Mailadresse hinterlegt wurde. */ and :"Source" is not null ) then -- Eingefuehrt am 07.10.2015 begin delete from "Gruppenzuordnungen" where GZ_GRUPPEN_ID = :"Source" and GZ_GV_ID in (select E."Akt_GP_GV_ID" from "Gruppenzuordnungen" A join "AKT_Gesch_Partner" E ON A.GZ_GV_ID = E."Akt_GP_GV_ID" left outer join "KontaktVerbinder" K ON K.KV_ID = E."Akt_GP_KV_ID" where A."GZ_GRUPPEN_ID" = :"Source" and not exists( select * from "EMAIL_URL" EU where EU.EU_KV_ID = K.KV_ID and EU."EU_KomType"< 3 /*Nur Mails keine URL*/ ) ); end else if ( FUNKTION = 'ASP_WithoutEMailDelete' /* Alle Asp loeschen , wenn Ihnen keine Mailadresse hinterlegt wurde. */ and :"Source" is not null ) then -- Eingefuehrt am 07.10.2015 begin delete from "Gruppenzuordnungen" where GZ_GRUPPEN_ID = :"Source" and GZ_GV_ID in (select A.GZ_GV_ID from "Gruppenzuordnungen" A -- join "GruppenVerbinder" B ON A.gz_gv_id = B.gv_id -- and B."GV_isAsp" = 'Y' join "Ansprechpartner" C ON A.GZ_GV_ID = C.asp_gv_id left outer join "KontaktVerbinder" K ON K.KV_ID = C."ASP_Kommunikation_ID" where A."GZ_GRUPPEN_ID" = :"Source" and not exists( select * from "EMAIL_URL" EU where EU.EU_KV_ID = K.KV_ID and EU."EU_KomType"< 3 ) ); end else if ( FUNKTION = 'MoveEntry' /* Verschieben von einem Eintrag von Source -> destination */ and :"Source" is not null and :"Destination" is not null and :"Entry" is not null ) then -- Eingefuehrt am 07.04.2015 begin delete from "Gruppenzuordnungen" where GZ_GRUPPEN_ID = :"Source" and GZ_GV_ID = :"Entry"; if (row_count > 0) then -- Wenn nichts geloescht wurde gab es den Node nicht in SOURCE also auch keinen erzeugen !!! begin update or insert into "Gruppenzuordnungen" ( GZ_GV_ID , GZ_GRUPPEN_ID ) values( :"Entry" , :"Destination" ) matching( GZ_GV_ID , GZ_GRUPPEN_ID ); end end else if ( FUNKTION = 'UNIQUE-EMail' /* Mehrfachvorkommende Mailadressen entfernen ! Zuordnungen mit Asp haben vorrang vor nur GP Eintraegen */ and :"Source" is not null ) then -- Eingefuehrt am 13.10.2015 begin "VARstr3" = NULL; "VARint2"= 0; for select MA, GZ_GV_ID from "Gruppenzuordnungen" GZ join( select distinct 1, lower(EU."Adresse" ) , GZ_GV_ID from "Gruppenzuordnungen" A join "Ansprechpartner" C ON A.GZ_GV_ID = C.asp_gv_id left outer join "Gesch_ASP_Abteilung" GAA ON GAA."Abt_Asp_ID" = C."ASP_ID" left outer join "AKT_Gesch_Partner" E ON E."Akt_Gesch_Partner_ID" = GAA."Abt_Gesch_Partner_ID" left outer join "KontaktVerbinder" K ON K.KV_ID = C."ASP_Kommunikation_ID" left outer join "EMAIL_URL" EU ON EU.EU_KV_ID = K.KV_ID and EU."EU_KomType"< 3 where A."GZ_GRUPPEN_ID" = :"Source" -- Source = GruppenID aus der die Eintröge genommen werden !!! union select distinct 2, lower(EU."Adresse" ) , GZ_GV_ID from "Gruppenzuordnungen" A join "AKT_Gesch_Partner" E ON A.GZ_GV_ID = E."Akt_GP_GV_ID" left outer join "KontaktVerbinder" K ON K.KV_ID = E."Akt_GP_KV_ID" left outer join "EMAIL_URL" EU ON EU.EU_KV_ID = K.KV_ID and EU."EU_KomType"< 3 where A."GZ_GRUPPEN_ID" =:"Source" -- Source = GruppenID aus der die Eintröge genommen werden !!! ) JGR ( "Prio", MA , GZGV_ID ) ON GZGV_ID = GZ.GZ_GV_ID where GZ.GZ_GRUPPEN_ID = :"Source" order by MA , "Prio" into :"VARstr2" , :"VARint1" do begin if ( :"VARstr2" is not distinct from :"VARstr3" ) then begin delete from "Gruppenzuordnungen" where GZ_GRUPPEN_ID = :"Source" and GZ_GV_ID = :"VARint1"; "VARint2" = :"VARint2" + ROW_COUNT; end else "VARstr3" = :"VARstr2"; end ROWS_CHANGE = :"VARint2"; suspend; exit; end ROWS_CHANGE = ROW_COUNT; suspend; END ^ SET TERM ; ^ DESCRIBE PARAMETER "Entry" PROCEDURE "GruppenOperationen" 'Neu angelegt 10.10.2015'; /* Alter (KKUNDENSUCHE) */ SET TERM ^ ; ALTER PROCEDURE KKUNDENSUCHE(MYKDNR INTEGER, IKDNR INTEGER, INAME VARCHAR(20), ISTR VARCHAR(20), IORT VARCHAR(20), IPLZ VARCHAR(10)) RETURNS(KDNR INTEGER, "GPverID" INTEGER, NAME VARCHAR(84), STR VARCHAR(40), PLZ VARCHAR(10), ORT VARCHAR(50)) AS begin if ( :MYKDNR is null ) then exit; INAME = '%'||( select "SearchString" from "SearchString"(:INAME))||'%'; ISTR = '%'||( select "SearchString" from "SearchString"(:ISTR))||'%'; IORT = '%'||( select "SearchString" from "SearchString"(:IORT))||'%'; IPLZ = ( select "SearchString" from "SearchString"(:IPLZ)); /* INAME = '%'||searchstringde82(:INAME)||'%'; ISTR = '%'||searchstringde82(:ISTR)||'%'; IORT = '%'|| searchstringde82(:IORT)||'%'; IPLZ = searchstringde82(:IPLZ); */ for SELECT "Akt_Gesch_Partner_ID" , "Akt_Gesch_Partner_VerID" -- , "Akt_GP_KV_ID" -- , "AA_Aktiv" , "Name1" || ' ; ' || "Name2" AS "Name" , "Strasse" -- , "PLZ_Postkuerzel" , "Ort" , PLZ -- , "Akt_Stammdaten_VerID" -- , "Akt_GP_GV_ID" -- , "Text" -- , "ANSCHRIFTEN_ID" FROM "AKT_Gesch_Partner" A join "GP_SUCHEN_HILFE"( :IKDNR , :INAME , :ISTR , '%' , :IPLZ , :IORT , 1 , '%' , NULL) NS ON NS."S_GeschP_ID" = A."Akt_Gesch_Partner_ID" JOIN "Anschriftenart" H ON H."AA_GeschPartner_ID" = NS."S_GeschP_ID" and "AA_Rolle" = 1 JOIN "Gesch_partner" B ON A."Akt_Gesch_Partner_VerID" = B."Gesch_partner_verID" LEFT OUTER JOIN "AKT_Stammdaten" G ON A."Akt_Gesch_Partner_ID" = G."Akt_StDaten_GP_ID" JOIN "Anschriften" C ON B."GP_Anschrift" = C."ANSCHRIFTEN_ID" JOIN "Anreden" D ON C."Anrede" = D."Anrede_ID" JOIN "PLZ" E ON C."A_PLZ_ID" = E."PLZ_ID" into :KDNR , :"GPverID" , :NAME , :STR , :ORT , :PLZ do suspend; /* if ( IKDNR is not null ) then begin if ( exists ( select * from kundenkontakt ( :MYKDNR ) where kdnr = :IKDNR )) then begin select kdnr , name1 || name2 AS Name , strasse , ort , plz from KUNDEN K where KDNR = :IKDNR into :KDNR , :NAME , :STR , :ORT , :PLZ ; suspend; end end else begin for select distinct k.kdnr , k.name1 || k.name2 AS Name , k.strasse , k.ort , k.plz from KUNDENKONTAKT ( :MYKDNR ) KK left outer join KUNDEN K on k.kdnr = kk.KDNR where TRIMALLUPPERDE82( Name1 || name2 ) like :INAME and TRIMALLUPPERDE82( k.strasse ) like :ISTR and TRIMALLUPPERDE82( k.ort ) like :IORT and TRIMALLUPPERDE82( k.plz ) starting with :IPLZ -- and TRIMALLUPPERDE82( k.plz ) like :IPLZ into :KDNR , :NAME , :STR , :ORT , :PLZ do suspend; end */ end ^ /* Alter (SetContextVariable) */ ALTER PROCEDURE "SetContextVariable"("Namespace" VARCHAR(80) CHARACTER SET NONE, "Variable" VARCHAR(80) CHARACTER SET NONE, "Wert" VARCHAR(250) CHARACTER SET NONE) AS begin rdb$set_context( :"Namespace" , :"Variable" , :"Wert" ); end ^ /* Alter (SetGlobalMandantContextVariable) */ ALTER PROCEDURE "SetGlobalMandantContextVariable"("I_MandantGP_ID" TYPE OF COLUMN "AKT_Stammdaten"."Akt_StDaten_GP_ID", "I_UserLanguage" TYPE OF COLUMN "Staaten"."Postkuerzel") AS declare variable "MandantStaat" type of column "Staaten"."Postkuerzel"; declare variable "V_BenutzerID" integer; declare variable "V_MandantGP_ID" type of column "AKT_Stammdaten"."Akt_StDaten_GP_ID"; declare variable "V_DefUserLanguage" type of column "Staaten"."Postkuerzel"; declare variable "V_ChkDoppelteArtNr" integer; declare variable "V_TempInt" integer; begin /* Den daefualt Mandanten fuer den angemeldeten User suchen. */ select "B_DefaultMandantGP_ID" , "B_DefaultUserLanguage" , "BenutzerID" from "BenutzerIDs" A where upper(A."B_UserName") = upper(current_user) into :"V_MandantGP_ID" , :"V_DefUserLanguage" , :"V_BenutzerID" ; rdb$set_context( 'USER_SESSION' , 'BENUTZER-ID' , :"V_BenutzerID" ); if ( :"I_MandantGP_ID" is null ) then begin if ( :"V_MandantGP_ID" is null ) then -- Den hauptmandanten raussuchen war halt der erste der angelegt wurde "I_MandantGP_ID" = ( select first 1 "Akt_StDaten_GP_ID" from "AKT_Stammdaten" A where A."Akt_StDaten_GP_ID" in ( select B."Bn_MandantGP_ID" from "Benutzer" B where B."Bn_BenutzerID" = :"V_BenutzerID" )order by A."Akt_StDaten_GP_ID" asc ); else "I_MandantGP_ID" = :"V_MandantGP_ID"; end else -- Wenn eine bestimmte MandantGP_ID gesetzt werden soll alle Contextvariablen Nullen !!!!Weil evtl. schon gesetzt. begin rdb$set_context( 'USER_SESSION' , 'MANDANT_GP_ID' , NULL ); rdb$set_context( 'USER_SESSION' , 'USER_ZUGRIFF_ALLE_KATALOGE' , NULL ); rdb$set_context( 'USER_SESSION' , 'USER_LANGUAGE' , NULL ); rdb$set_context( 'USER_SESSION' , 'USER_ASP_ID' , NULL ); rdb$set_context( 'USER_SESSION' , 'MANDANT_StdSprachenID' , NULL ); rdb$set_context( 'USER_SESSION' , 'MANDANT_LieferKatalogArtikelNurVkPreis' , NULL ); rdb$set_context( 'USER_SESSION' , 'USER_VERTRETER_NR' , NULL ); -- Schauen ob der Benutzer dem Mandnaten der in :"I_MandantGP_ID" uebergeben wurde auch wirklich zugeordnet ist. if ( current_user != 'SYSDBA' and not exists ( select B."Bn_MandantGP_ID" from "Benutzer" B where B."Bn_BenutzerID" = :"V_BenutzerID" and B."Bn_MandantGP_ID" = :"I_MandantGP_ID" ) ) then exception "Fatal_Error"'Benutzer ist diesem Mandanten nicht zugeordnet !!!'; end rdb$set_context( 'USER_SESSION' , 'MANDANT_GP_ID' , :"I_MandantGP_ID" ); -- Mandant setzen kann man aber auch ueber das programm neu auswaehlen oder sollte man koennen wenn man die rechte hat "MandantStaat" = ( select "Postkuerzel" from "AKT_Gesch_Partner" A join "Gesch_partner" B ON A."Akt_Gesch_Partner_VerID" = B."Gesch_partner_verID" join "Anschriften" C ON B."GP_Anschrift" = C.anschriften_id join "PLZ" D ON C.a_plz_id = D.plz_id join "Staaten" E ON D."PLZ_Postkuerzel" = E."Postkuerzel" where A."Akt_Gesch_Partner_ID" = :"I_MandantGP_ID" ); rdb$set_context( 'USER_SESSION' , 'MANDANT_STAAT' , :"MandantStaat" ); rdb$set_context( 'USER_SESSION' , 'MANDANT_StdSprachenID' , ( select "Akt_StDaten_StdSprachenID" from "AKT_Stammdaten" where "Akt_StDaten_GP_ID" = :"I_MandantGP_ID" ) ); rdb$set_context( 'USER_SESSION' , 'MANDANT_LieferKatalogArtikelNurVkPreis' , ( select "Akt_StDaten_LiefKatalNurVKPreis" from "AKT_Stammdaten" where "Akt_StDaten_GP_ID" = :"I_MandantGP_ID" ) ); if ( :"I_UserLanguage" is null ) then begin if ( :"V_DefUserLanguage" is not null ) then rdb$set_context( 'USER_SESSION' , 'USER_LANGUAGE' , :"V_DefUserLanguage" ); else rdb$set_context( 'USER_SESSION' , 'USER_LANGUAGE' , ( rdb$get_context( 'USER_SESSION' , 'MANDANT_STAAT' ))); end else rdb$set_context( 'USER_SESSION' , 'USER_LANGUAGE' , :"I_UserLanguage" ); if ( rdb$get_context( 'USER_SESSION' , 'USER_LANGUAGE' ) is not null ) then rdb$set_context( 'USER_SESSION' , 'USER_StdSprachenID' , ( select "St_StandardSprachenID" from "Staaten" where "Postkuerzel" = rdb$get_context( 'USER_SESSION' , 'USER_LANGUAGE' ) ) ); if ( upper(current_user) = 'SYSDBA' ) then rdb$set_context( 'USER_SESSION' , 'USER_INVENTURMODUS_ERLAUBT' ,'Y' ); else rdb$set_context( 'USER_SESSION' , 'USER_INVENTURMODUS_ERLAUBT' ,( select coalesce( iif( ST."Akt_StDaten_InventModusErlauben" = 'Y' , ( select BR."BR_InventurbuchungenErlaubt" from "BenutzerRechte" BR Where BR."BR_BenutzerID" = :"V_BenutzerID" and BR."BR_MandantGP_ID" = :"I_MandantGP_ID" ) , 'N' ),'N') as "Inventurmodus" from "VW_Stammdaten" ST where "Akt_StDaten_GP_ID" = rdb$get_context( 'USER_SESSION' , 'MANDANT_GP_ID') )); select "Akt_StDaten_ChkDoppelteArtNr" from "AKT_Stammdaten" A where A."Akt_StDaten_GP_ID" = :"I_MandantGP_ID" into :"V_ChkDoppelteArtNr"; rdb$set_context( 'USER_SESSION' , 'CheckDoppelteArtikelNummer' , :"V_ChkDoppelteArtNr" ); "V_TempInt" = NULL; "V_TempInt" = ( select distinct "Bn_ASP_ID" from "Benutzer" A where a."Bn_BenutzerID" = :"V_BenutzerID" and A."Bn_MandantGP_ID" = :"I_MandantGP_ID" ); if ( :"V_TempInt" is not null ) then begin rdb$set_context( 'USER_SESSION' , 'USER_ASP_ID' , :"V_TempInt" ); if ( exists( select * from "Benutzer" where "Bn_ASP_ID" = :"V_TempInt" and "Bn_AlleKatalogeSichtbar" = 'Y' )) then rdb$set_context( 'USER_SESSION' , 'USER_ZUGRIFF_ALLE_KATALOGE' , 'Y' ); -- Jetzt noch schauen ob dem Asp eine VertreterID zugeordnet ist und es sich somit um einen Vertreter handelt ! "V_TempInt" = NULL; "V_TempInt" = ( select distinct "VeTr_Nr" from "Vertreter" A where "VeTr_AspID" = rdb$get_context( 'USER_SESSION' , 'USER_ASP_ID') ); if ( :"V_TempInt" is not null ) then rdb$set_context( 'USER_SESSION' , 'USER_VERTRETER_NR' , :"V_TempInt" ); -- Ja, Vertreter also Nr. setzen end /* Evtl. in der ganzen DB das Benutzerfeld der die letzten aenderungen gamcht hat durch die Asp_ID ersetzen. Jeder Benutzer muss dann als Asp. abgelegt werden damit er arbeiten kann. So kann das Varchar Feld gegen einen kleinen Integer ausgetauscht werden. */ insert into "EMailAccessFolderRightInConnect" ( "ConnectionID" , "MailOrdnerStrukturID" , "RigthFromGroup" ) select current_connection , "EMOS_ID" , "ResGruppenID" from "E-MailStrukturListe"( NULL , NULL , NULL) where not( "ResourceOwner" = 'N' and "MailOrdnerPrivat" = 'Y' ); -- Alle Als Privat angegebenen Ordner auslassen die einem nicht selbst gehoeren. end ^ /* empty dependent procedure body */ /* Clear: E-Mail-GetOrdnerMailIDs for: TreeHelpFunctions */ ALTER PROCEDURE "E-Mail-GetOrdnerMailIDs"("iEMailOrdnerStrukturID" INTEGER, "iEMOS_Type" INTEGER) AS BEGIN EXIT; END ^ /* empty dependent procedure body */ /* Clear: Mengenausgleich for: TreeHelpFunctions */ ALTER PROCEDURE "Mengenausgleich"("iFunktion" INTEGER, "iNotiz" TYPE OF COLUMN "AuftragsDokumentePositionExt"."ADPE_TextNotiz", "iID_Art" INTEGER, "iID" BIGINT, "iIDs" "d_BLOB_Text_AsciiGross", "iAuftragsDokument_ID" INTEGER, "iAusgewaehltePositionen" INTEGER, "iUntergeordnetePositionen" D_BOOLEAN_YN, "iAusgabeListe" INTEGER, "iAuftragVerrechnPos_ID" BIGINT, "iAuftragVerrechnDokument" INTEGER, "iMengenAusgleich" "Mengen", "iParam1" INTEGER) RETURNS("AuftrDokPosID" BIGINT, "sourceAuftrDokPosID" BIGINT, "sourceAuftrDokArt" INTEGER, "BereitsVerrechnet" "Mengen", "AusgeglicheneMenge" "Mengen", "destMenge" "Mengen", "GesamtPositionen" INTEGER, "VerrechnetePositionen" INTEGER, "WarningError" "d_str60") AS BEGIN SUSPEND; END ^ /* Alter (TreeHelpFunctions) */ ALTER PROCEDURE "TreeHelpFunctions"("iName" VARCHAR(30), "iTableName" "SystemFeldNamenLaenge", "iPKFieldName" "SystemFeldNamenLaenge", "iParentFieldName" "SystemFeldNamenLaenge", "iOrderClause" "d_str160", "iPK_ID" BIGINT, "iParentID" BIGINT, "iLevel" INTEGER, "iShowException" CHAR CHARACTER SET ASCII, "iDoCountChilds" INTEGER, "iParam1" INTEGER) RETURNS(PK_ID BIGINT, "Parent_ID" BIGINT, "Deepth" INTEGER, "LoopDetectedNodeID" BIGINT, "SQLCode" "SQLSTATE-Code", "ChildCount" INTEGER) AS declare variable SQL "d_strMax"; declare variable SQL2 "d_str320"; declare variable "TreeID" bigint; declare variable "TempLevel" integer; begin "TreeID" = next value for "TreeHelpFunctions_TempTreeID"; if ( :"iPK_ID" is null ) then exception "Fatal_Error"'iPK_ID darf nicht NULL sein!'; if ( :"iName" = 'GetRootNode' ) then begin "Deepth" = -1; in autonomous transaction do begin begin "Parent_ID" = 1; while ( :"Parent_ID" is not null ) do begin -- Mit hilfe von CTE den RootKnoten eines Baumes finden !!! Siehe auch SP "CTE_TreeTest" nur als Bsp. gelassen soll nicht benutzt werden. -- Weil :"iPK_ID" jdes mal neu gesetzt wird muss auch das SQL neu zusammengebaut werden sollte aber eh nur einmal laufen in denmeisten Faellen SQL = ' with recursive tree_rec as ('|| 'select "' || :"iParentFieldName" ||'","' || :"iPKFieldName" || '" from "' || :"iTableName" || '" where "' || :"iPKFieldName" || '" = ' || :"iPK_ID" || ' union all select first 1 T."'|| :"iParentFieldName"|| '" , T."' || :"iPKFieldName" || '" from "' || :"iTableName" || '" T'|| ' join tree_rec R on R."'|| :"iParentFieldName"|| '" = T."' || :"iPKFieldName" || '") select first 1020 "'|| :"iPKFieldName" || '" , "' || :"iParentFieldName" || '" from tree_rec A'; for execute statement :SQL into :"PK_ID" , :"Parent_ID" do begin insert into "TreeTempID" ( "TrID" , "NodeID" ) values ( :"TreeID" , :"PK_ID" ); "Deepth" = "Deepth" +1; if ( :"Deepth" > 100000 ) then -- Max treedepth 100.000 exit; end "iPK_ID" = :"Parent_ID"; end end when any do begin if ( :"iShowException" = 'Y' ) then begin in autonomous transaction do insert into "ErrorLog" ( "EL_SQLErrorCode" , "EL_Text" , "EL_Angezeigt" ) values( SQLSTATE , 'Aufgetreten in SP TreeHelpFunctions.'||coalesce( :"iTableName" ,'Unknown Table')||','||coalesce(:"iPKFieldName",'Unknown PK-Field,')||','||coalesce(:"iParentFieldName",'Unknown Parent-Field,')||', PK_ID='||coalesce(:PK_ID,'DB-Null'), 'Y'); exception; end in autonomous transaction do insert into "ErrorLog" ( "EL_SQLErrorCode" , "EL_Text" ) values( SQLSTATE , 'Aufgetreten in SP TreeHelpFunctions.'||coalesce( :"iTableName" ,'Unknown Table')||','||coalesce(:"iPKFieldName",'Unknown PK-Field,')||','||coalesce(:"iParentFieldName",'Unknown Parent-Field,')||', PK_ID='||coalesce(:PK_ID,'DB-Null')); "LoopDetectedNodeID" = :"PK_ID"; -- Kommt weil oben das Insert versagt "SQLCode" = SQLSTATE; end end suspend; end else if ( :"iName" = 'GetTree' ) then -- Bei CTEs ist bei einer tiefe von 1024 Schluss !!!!!!!!! daran denken begin -- IST NICHT FERTIG autonomus transaction fehlr noch geht aber nicht mit einem suspend drinn -- evtl. alles in eine tabelle schreiben "Deepth" = coalesce( :"iLevel" , 0); "iLevel" = NULL; SQL2 = 'select count(*) from "' || :"iTableName" || '" where "' || :"iParentFieldName" ||'" = :PK '; -- Fuer ChildCount SQL = ' with recursive tree_rec as ('|| 'select "' || :"iParentFieldName" ||'","' || :"iPKFieldName" || '" from "' || :"iTableName" || '" where "' || :"iPKFieldName" || '" = ' || :"iPK_ID" || ' union all select T."'|| :"iParentFieldName"|| '" , T."' || :"iPKFieldName" || '" from "' || :"iTableName" || '" T'|| ' join tree_rec R on R."'|| :"iPKFieldName" || '" = T."' || :"iParentFieldName"|| '") select "'|| :"iPKFieldName" || '" , "' || :"iParentFieldName" || '" from tree_rec A'; for execute statement :SQL into :"PK_ID" , :"Parent_ID" do begin if ( :"iLevel" is distinct from :"Parent_ID" ) then begin "iLevel" = :"Parent_ID"; "TempLevel" = ( select "Level" from "TreeTempID" where "TrID" = :"TreeID" and "NodeID" = :"Parent_ID" ); if ( :"TempLevel" is not null ) then "Deepth" = :"TempLevel"; else begin "Deepth" = "Deepth" +1; insert into "TreeTempID" ( "TrID" , "NodeID" , "Level" ) values ( :"TreeID" , :"Parent_ID" , :"Deepth"); end end if ( :"iDoCountChilds" = 1 ) then -- Nur wenn CildCount berechnet werden soll es auch machen execute statement (:"SQL2") ( PK := :"PK_ID" ) into :"ChildCount"; suspend; end end end ^ SET TERM ; ^ DESCRIBE PARAMETER "iTableName" PROCEDURE "TreeHelpFunctions" 'Tabellennam der Tabelle mit dem Baumstruktur'; DESCRIBE PARAMETER "iPKFieldName" PROCEDURE "TreeHelpFunctions" 'PK des Baums'; DESCRIBE PARAMETER "iParentFieldName" PROCEDURE "TreeHelpFunctions" 'Parent des Baums'; DESCRIBE PARAMETER "iOrderClause" PROCEDURE "TreeHelpFunctions" '!!! FUNKTIONIERT NOCH NICHT !!! z.B. order by x , y , z ( das order by muss auch uebergeben werden )'; DESCRIBE PARAMETER "iDoCountChilds" PROCEDURE "TreeHelpFunctions" '=1 ChildCount wird berechnet'; DESCRIBE PARAMETER "Deepth" PROCEDURE "TreeHelpFunctions" 'Koennte auch LEVEL heissen'; DESCRIBE PARAMETER "ChildCount" PROCEDURE "TreeHelpFunctions" 'Koennte natuerlich auch ausserhaklb gemacht werden.'; /* Restore proc. body: ApplyOnCommitActionList */ SET TERM ^ ; ALTER PROCEDURE "ApplyOnCommitActionList"("ApplyOnlyAction" INTEGER, "ApplyOnlyActions" "d_BLOB_Text_AsciiGross") AS declare variable "Action" integer; declare variable "Param1BI" bigint; declare variable "Param2BI" bigint; declare variable "Param3BI" bigint; declare variable "Param4BI" bigint; declare variable "Param5VC" "d_str160"; declare variable "Ret" "d_str160"; declare variable "TempInt1" integer; begin -- "ApplyOnlyActions" wird noch nicht beruecksichtigt !!!!!!!! if ( :"ApplyOnlyAction" is null or :"ApplyOnlyActions" is null or :"ApplyOnlyAction" in ( 1) ) then begin for select distinct "Action" , "Param1" , "Param2" , "Param3" from "OnCommitActionList" where "Action" in ( 1 ) into :"Action" , :"Param1BI" , :"Param2BI" , :"Param3BI" do begin if ( :"Action" = 1 ) then -- 'SummenEintragen' im Auftragsdokument begin -- Als "IntParam1" wird die "AuftrDokument_ID" erwartet if ( :"Param1BI" is null ) then begin in autonomous transaction do insert into "ErrorLog" ( "EL_Text" ) values( 'Trigger "DB_ActionListCommit1" Action =1 "AuftrDokument_ID" is null' ); end else begin if ( exists( select * from "AuftragsDokumente" A where A."AuftrDokument_ID" = :"Param1BI" ) ) then -- Evtl. wurde das dokument danach geloescht dann gaebs hier ne Fehlermeldung execute procedure "AuftrDokPositionen_Funktionen"( 'SummenEintragen' , NULL , NULL , NULL , NULL , :"Param1BI", NULL,NULL ) returning_values :"Ret" , :"Param5VC" ,:"Param3BI" ,:"Param3BI" ,:"Param3BI"; end end end when any do begin -- Im Fehlerfall die Action mit Parametern loggen und die exception ansonsten verschlucken in autonomous transaction do insert into "ErrorLog" ( "EL_SQLErrorCode" , "EL_Text" ) values( SQLSTATE , 'Trigger "DB_ActionListCommit2" Action ='|| coalesce(:"Action",'NULL' ) || ' Param1=' || coalesce(:"Param1BI",'NULL') || ' Param2=' || coalesce(:"Param2BI",'NULL') || ' Param3=' || coalesce(:"Param3BI",'NULL') ); -- Die Fehler duerfen nicht uebergangen werden !!!! Deshalb macht das mit dem DEBUG keinen Sinn !!!!! -- Am 14.01.2015 gab es ein Dokument dessen Fortgefuehrt Status nichjt stimmte weil hier die Exception verschluckt wurde. -- if ( rdb$get_context( 'USER_SESSION' , 'DEBUG' ) = 1 ) then exception; end end if ( :"ApplyOnlyAction" is null or :"ApplyOnlyActions" is null or :"ApplyOnlyAction" in ( 2 ) ) then begin for select distinct B."AuftrDokPosi_DokumentID" , C."AuftrDokPosi_DokumentID" from "OnCommitActionList" A join "AuftragsDokumentePositionen" B ON A."Param3" = B."AuftragsDokumentePositionen_ID" left outer join "AuftragsDokumentePositionen" C ON B."AuftrDokPosi_AbgeleitetVonPos" = C."AuftragsDokumentePositionen_ID" where "Action" = 2 into :"Param1BI" , :"Param2BI" do begin if ( :"Param1BI" is null ) then begin in autonomous transaction do insert into "ErrorLog" ( "EL_Text" ) values( 'Trigger "DB_ActionListCommit3" Action =2 "AuftrDokumentPositionenID" not found' ); end else begin -- Das Update mit der veränderung im Feld "AuftrDokument_VollstFortgefuehr" reicht aus damit der trigger der Tabelle den Rest erledigt. update "AuftragsDokumente" A set A."AuftrDokument_VollstFortgefuehr" = -1 where A."AuftrDokument_ID" = :"Param1BI"; if ( :"Param2BI" is not null ) then update "AuftragsDokumente" A set A."AuftrDokument_VollstFortgefuehr" = -1 where A."AuftrDokument_ID" = :"Param2BI"; end if ( :"ApplyOnlyAction" is not null ) then delete from "OnCommitActionList" where "Action" = :"ApplyOnlyAction"; end when any do begin -- Im Fehlerfall die Action mit Parametern loggen und die exception ansonsten verschlucken in autonomous transaction do insert into "ErrorLog" ( "EL_SQLErrorCode" , "EL_Text" ) values( SQLSTATE , 'Trigger "DB_ActionListCommit4" Action ='|| coalesce(:"Action",'NULL' ) || ' Param1=' || coalesce(:"Param1BI",'NULL') || ' Param2=' || coalesce(:"Param2BI",'NULL') || ' Param3=' || coalesce(:"Param3BI",'NULL') ); -- if ( rdb$get_context( 'USER_SESSION' , 'DEBUG' ) = 1 ) then exception; end end if ( :"ApplyOnlyAction" is null or :"ApplyOnlyActions" is null or :"ApplyOnlyAction" in ( 3) ) then begin for select distinct "Action" , "Param1" , "Param2" from "OnCommitActionList" where "Action" = 3 and "Param1" is not null into :"Action" , :"Param1BI" , :"Param2BI" do begin if ( :"Param2BI" = 200 ) then -- Auftragsbestatetigung begin "TempInt1" = ( select "Auftrags_Status" from "Auftrags_StatusErmitteln"( :"Param1BI" )); if ( not exists ( select * from "AuftragsDokumenteExt" A where A."ADE_AuftrDokument_ID" = :"Param1BI" and A."ADE_AuftragsStatus" = :"TempInt1" ) ) then update or insert into "AuftragsDokumenteExt" ( "ADE_AuftrDokument_ID" , "ADE_AuftragsStatus" ) values ( :"Param1BI" , :"TempInt1" ) matching( "ADE_AuftrDokument_ID" ); end if ( :"Param2BI" = 10200 ) then -- Bestellung begin -- "TempInt1" = ( select "Bestell_Status" from "Bestell_StatusErmitteln"( :"Param1BI" )); end end when any do begin -- Im Fehlerfall die Action mit Parametern loggen und die exception ansonsten verschlucken in autonomous transaction do insert into "ErrorLog" ( "EL_SQLErrorCode" , "EL_Text" ) values( SQLSTATE , 'Trigger "DB_ActionListCommit2" Action ='|| coalesce(:"Action",'NULL' ) || ' Param1=' || coalesce(:"Param1BI",'NULL') || ' Param2=' || coalesce(:"Param2BI",'NULL') || ' Param3=' || coalesce(:"Param3BI",'NULL') ); -- if ( rdb$get_context( 'USER_SESSION' , 'DEBUG' ) = 1 ) then exception; end end end ^ /* Restore proc. body: AuftragsDokumente_Drucken */ ALTER PROCEDURE "AuftragsDokumente_Drucken"("I_AuftrDokumentID" INTEGER, "I_DruckKonfigID" INTEGER, "I_Eltern_ID" INTEGER, "I_PositionsString" "d_str50", "I_NurDieseEbene" D_BOOLEAN_YN, "I_NettoPreise" D_BOOLEAN_YN, "I_MwSt_Kurzform" D_BOOLEAN_YN, "I_Format" "d_str10", "I_Format_PosText" "d_str40", "I_Format_G-Preis" "d_str20", "I_Format_E-Preis" "d_str20", "I_Format_Menge" "d_str20", "I_Warnings" D_BOOLEAN_YN, "I_Commands" TYPE OF COLUMN "DruckJobs"."DrJob_Commands", "I_Int_Help" INTEGER, "I_BigInt_Help" BIGINT, "I_Varchar_Help" "d_str512", "I_Zeile" INTEGER) RETURNS("PositionsArt" INTEGER, "StrukturText" "d_str50", "PositionsNr" INTEGER, "PositionsStringFormatiert" "d_str60", "PosText1" "d_str10", "PosText2" "d_str60", "RAuftrDokStruktur_ID" INTEGER, "RAuftragsDokumentePositionen_ID" GENERATOR_VALUE, "VMenge" "d_str20", "NMenge" "d_str10", "MengeGeliefert" "d_str20", "MengeRueckstand" "d_str20", "ArtikelText" "d_strMax", "ArtikelBlobText" BLOB SUB_TYPE 1 SEGMENT SIZE 8192, "KurztextAnzAbsaetze" INTEGER, "Artikelnummer" VARCHAR(31), "EAN_Code" GENERATOR_VALUE, "E-Preis" "d_str20", "G-Preis" "d_str20", "Preiseinheit" "d_str30", "MwSt_Satz" "d_str10", "TexgenCommand" "d_str30", "HintergrundFarbe" VARCHAR(6), "Warnings" "d_str320", "CZeileFett" VARCHAR(1), "CZeileItalic" VARCHAR(1), "CgesPreisFett" VARCHAR(1), "CgesPreisUnterstreichen" VARCHAR(1), "CgesPreisDoppeltUnterstreichen" VARCHAR(1), "ZeilenNr" INTEGER, "RowType" INTEGER, "ExtraAbstandEinfuegen" INTEGER, "PosRabatt" "d_str10", "Pos_GPreis_StruktPreis" "Geld") AS declare variable "V_AuftragsDokumentePositionenID" GENERATOR_VALUE; declare variable "V_AuftrDokStrukturID" integer; declare variable "V_AuftrDokPos" integer; declare variable "V_AuftrDokPosText" "PositionsNrText"; declare variable "V_StrukturID" integer; declare variable "V_Option" integer; declare variable "V_Kurztext" integer; declare variable "V_PositionsArt" integer; declare variable "V_LastPositionsArt" integer; /* Welche Positionsart vor dieser war */ declare variable "V_Position" integer; declare variable "V_StrukturPos" varchar(5); declare variable "V_Struktur_Summe" "Geld"; declare variable "V_AuftrDokStruktur_SummeDrucken" "D_BOOLEAN_YNNull"; declare variable "V_Struktur_FettDrucken" "D_BOOLEAN_YNNull"; declare variable "V_Struktur_InAuflistung" "D_BOOLEAN_YNNull"; declare variable "V_Struktur_PreiseAusbl" "D_BOOLEAN_YNNull"; declare variable "V_OldStruktur_PreiseAusbl" "D_BOOLEAN_YNNull"; declare variable "V_CursorEmpty" integer = 0; declare variable "V_Positionen_ArtikelText" type of column "AuftrDokum_TextArtenSprachen"."ADTAS_Text"; /* "AuftrDokum_TextArtenSprachen"."ADTAS_Text" evtl. kommt noch Text dazu durch ergaenzungen also von Hand etwas mehr definieren */ declare variable "V_Struktur_ArtikelText" type of column "AuftragsDokumentStruktur"."AuftrDokStruktur_Text"; declare variable "V_LangText" "d_BLOB_XML_RTF"; declare variable "V_LangTextHTML" "d_BLOB_HTML"; declare variable "V_PosG-Preis" "Geld_genau"; declare variable "V_PosG-PreisOhneRabatt" "Geld_genau"; declare variable "V_MwSt-Satz" "MwSt_Satz"; declare variable "V_Waehrung" "d_str20"; declare variable "V_EAN-Code" type of column "Artikel"."Art_EAN_Code"; declare variable "V_MengeDokument" "Mengen"; /* Mengenangabe wie sie im Dokument angegeben wurde. */ declare variable "V_Zeile" integer; declare variable "V_CountMwSt_Saetze" integer; /* Anzahl MwSt Positionen. */ declare variable "V_MwSt_KurzZeichen" varchar(1) character set ISO8859_1; declare variable "V_Artikelnummer" varchar(30); declare variable "V_EigeneArtikelNr" varchar(30); /* Bei Lieferanten Einkaufsdikumenten die Eigene Artikelnummer */ declare variable "V_TempGP_ID" integer; declare variable "V_Temp_AnschID" bigint; declare variable "V_Temp_ASP" integer; declare variable "V_AuftrDokumentArt" integer; declare variable "V_TempHelpInt" integer; declare variable "V_PreisEinheit" "d_str30"; /* "Einheiten"."Einh_Drucken" domain vor Aenderung jetzt wird durch die Ergaenzung der Inhaltsmenge mehr platz benoetigt */ declare variable "V_VPE_Inhalts_Menge" "Mengen"; declare variable "V_MengeAnzNachkommastellen" integer; declare variable "CKeinUmbruchDanach" char(1) = 'N'; declare variable "P_HiddenHide" integer; declare variable "P_MarkChangedArticle" integer; declare variable "Error" "d_str512"; declare variable "V_Staat" type of column "Staaten"."Postkuerzel"; declare variable "V_MwStGruppenName" type of column "MwSt_Gruppen"."MwSt_Gr_Name"; declare variable "V_PosRabatt" "d_str10"; declare variable "V_OldRowType" integer; declare variable "V_AuftrDokBruttoPreise" D_BOOLEAN_YN; declare variable "V_Von_GP_ID" integer; declare variable "V_Fuer_GP_ID" integer; declare variable "V_Fuer_AnschID" bigint; declare variable "V_Fuer_Asp" integer; declare variable "V_Liefer_GP_ID" integer; declare variable "V_Liefer_AnschID" bigint; declare variable "V_Liefer_Asp" integer; declare variable "V_TempVarCharMax" "d_strMax"; declare variable "V_TempInt" integer; declare variable "V_EigenschaftenText" "d_str512"; declare variable "V_DokStdVersandArtID" integer; /* Die im Dokument angegeben standard Versandart */ declare variable "V_AuftragPositionVersandArtID" integer; /* Die evtl. vorhandne Versandart der Position */ declare variable "V_AuftrPosiVersand_KurzZeichen" type of column "AuftragsDokumentVersandArt"."AufDokVerArt_StdKuerzel"; declare variable "V_EndsummeAusgegeben" integer = 0; /* Wenn die Endsumme ausgegeben. Dann soltte auch nichts mehr folgen. Nur Text kommt dann in den Bereich nach der Artikeltabelle */ declare "Struktur" cursor for ( select "AuftrDokStruktur_ID", "AuftrDokStruktur_Position", "AuftrDokStruktur_Text", "AuftrDokStruktur_Summe", "AuftrDokStruktur_SummeDrucken", "AuftrDokStruktur_FettDrucken", "AuftrDokStruktur_PreiseAusbl", "AuftrDokStruktur_InAuflistung" from "AuftragsDokumentStruktur" where "AuftrDokStruktur_Dokument_ID" = :"I_AuftrDokumentID" and "AuftrDokStruktur_ElternID" is not distinct from :"I_Eltern_ID" /* Diese code wird durch "is not distinct from" abgeloest where (cast(:"Eltern_ID" as integer) is null and "AuftrDokStruktur_ElternID" is null) or (cast(:"Eltern_ID" as integer) is not null and "AuftrDokStruktur_ElternID" = :"Eltern_ID") */ order by "AuftrDokStruktur_Position"); begin -- RowType == 0 nornmale Tabellenzeile /* ACHTUNG RowType 1 und 2 sind sehr gefährlich ( funktionieren nicht wie sie sollen ) Der Text nimmt nicht die Beite ein die er einnehmen soll sondern bricht schon vorher um. Das sieht natuerlich sehr bloed aus. RowType == 1 Tabellenzeile mit wenig multicolumn RowType == 2 Tabellenzeile mit viel multicolumn */ -- RowType == 3 MultiColumn Zeile fuer Summenzeilem am ende des Dokuments. Die Zeile darf/wird nicht UMGEBROCHEN sie muss passen !!!! -- RowType == 4 keinen Tabellentext ( Leerzeile ) -- RowType == 5 horizontale Linie -- RowType == 6 Seitenumbruch -- RowType == 7 Zusammenhaegender Bereich ohne Seitenumbruch ANFANG - Feld "ArtikelText" = 'bezeichner' ( bezeichner nur kleinbuchstaben ) -- RowType == 8 Zusammenhaegender Bereich ohne Seitenumbruch ENDE - Feld "ArtikelText" = 'bezeichner' ( bezeichner nur kleinbuchstaben ) --ExtraAbstandEinfuegen: DB-Null kein Abstand einfuegen / 0 = 1ex Abstand einfuegen / > 0 = Abstand in mm anhaengen / < 0 mm zurueck aber selber bloed wer macht --CZeileFett --CZeileItalic --CgesPreisFett --CgesPreisUnterstreichen --CgesPreisDoppeltUnterstreichen -- Parameter fuer "I_Commands" -- #HiddenHide# verbirgt alle als versteckt gekennzeichneten Zeilen -- #RealDokNr# gibt immer die richtige Dokumentnr. und nicht evtl. den Text "Dokumentvorschau" zurueck. wird in SP "AuftragDokument-Parameter" verwendet -- Folgende Parameter am 21.03.2013 zum Einbauen mit vorgesehen. -- #LieferAnschriftVerwenden# -- Wenn eine abweichende Lieferanschrift vorhanden ist wird diese Verwendet und die beiden Anschriftenfelder auf dem Dokument vertauscht. -- #KeineZweitAnschrift# -- Das zweite Adressfeld im Dokument wird auf jeden Fall leer gelassen /* ################## A C H T U N G ################ Daran denken das man die fuer_AnschID auch mit der Liefer_AnschID wechseln können muß. Zusätzlich ist jetzt noch der Asp. anwählbar ob er mit gedruckt werden soll. */ -- "P_HiddenHide" = coalesce( position( '#HiddenHide#' , :"I_Commands" ),0); "P_MarkChangedArticle" = coalesce( position( '#MarkChangedArticle#' , :"I_Commands" ),0); -- -- ACHTUNG immer darauf achten das die Summen des Dokument berechnet wurden. -- sonst werden alte Summen gedruckt. Kann hier nicht gut geprueft werden -- da auch Joins mit der SP gemacht werden und die gleich maulen oder -- andauernd Preise berechnet werden. -- Evtl. mal was anderes ueberlegen. if ( trim("I_PositionsString") = '') then "I_PositionsString" = NULL; "V_Position" = 1; if (:"I_Zeile" is null ) then "ZeilenNr" = 0; -- Wird unten schon bei der ersten Zeile +1 genommen else "ZeilenNr" = :"I_Zeile"; -- Wird unten schon bei ser ersten Zeile +1 genommen if ( :"I_Commands" is distinct from 'HelperFuntctionIsRunning' ) then -- Wird benutzt um die letzte Position im Dokument zu finden um den Summenstart RowType 7 zu senden. begin if ( :"I_Eltern_ID" is null ) then -- Nur auf der ertsen ebene einmal aufrufen evtl. eine Contextvariable setzen, begin -- damit man auch einzelne Ebenen drucken kann. RDB$SET_CONTEXT('USER_TRANSACTION', 'CV_LastPositionID', NULL); RDB$SET_CONTEXT('USER_TRANSACTION', 'CV_LastPositionID', (select "O_LastPositionID" from "AuftrDokDruck_HelperFunction"( 'PositionsStringFormat' , :"I_AuftrDokumentID" , NULL , NULL , NULL ))); -- Anzahl Positionen von MwSt saetzen ermitteln wenn wir hier auf der Strukturebene NULL sind select count(*) from "AuftragsDokumentePositionen" where "AuftrDokPosi_DokumentID" = :"I_AuftrDokumentID" and "AuftrDokPosi_Art" = 300 into :"V_CountMwSt_Saetze"; -- ######################## Start setzte Contextvariablen ################################# -- Zuerst alle benutzten Contextvariablen auf NULL setzen sonst evtl. Fehler die nicht nachvollziehbar sind ! RDB$SET_CONTEXT('USER_TRANSACTION', '#GPID#', NULL ); RDB$SET_CONTEXT('USER_TRANSACTION', '#KDNR#', NULL ); RDB$SET_CONTEXT('USER_TRANSACTION', '#LRNR#', NULL ); RDB$SET_CONTEXT('USER_TRANSACTION', '#LieferantenNr#', NULL ); RDB$SET_CONTEXT('USER_TRANSACTION', '#Unberechnet_PosZVorPos#' , NULL); -- Text der vor die Positionsangabe gestellt wird wenn die Option Unberechnet gesetzt ist. RDB$SET_CONTEXT('USER_TRANSACTION', '#Adr1_GP_ID#' ,NULL ); RDB$SET_CONTEXT('USER_TRANSACTION', '#Adr1_AnschID#' ,NULL ); RDB$SET_CONTEXT('USER_TRANSACTION', '#Adr1_AspID#' , NULL ); RDB$SET_CONTEXT('USER_TRANSACTION', '#Adr2_GP_ID#' ,NULL ); RDB$SET_CONTEXT('USER_TRANSACTION', '#Adr2_AnschID#' , NULL ); RDB$SET_CONTEXT('USER_TRANSACTION', '#Adr2_AspID#' , NULL ); RDB$SET_CONTEXT('USER_TRANSACTION', '#Adr2_Anmerkung#' , NULL ); --Umgebungsvariablen setzen -- #GPID#/'#KDNR#' und '#LieferantenNr#' beziehen sich immer auf den Empfaenger RDB$SET_CONTEXT('USER_TRANSACTION', '#GPID#', ( select "Text" from "AuftragDokument-Parameter"( 'GPID' , :"I_AuftrDokumentID" , NULL , NULL , NULL , NULL , NULL , :"I_Commands" ))); RDB$SET_CONTEXT('USER_TRANSACTION', '#KDNR#', ( select "Text" from "AuftragDokument-Parameter"( 'KDNR' , :"I_AuftrDokumentID" , NULL , NULL , NULL , NULL , NULL , :"I_Commands" ))); RDB$SET_CONTEXT('USER_TRANSACTION', '#LieferantenNr#', ( select "Text" from "AuftragDokument-Parameter"( 'LieferantenNr' , :"I_AuftrDokumentID" , NULL , NULL , NULL , NULL , NULL , :"I_Commands" ))); -- Das Staatenkuerzel des Empfaengers ermitteln. ACHTUNG AnschID benutzen da eine bestimmte Anschrift im Dokument gewaehltr werden kann. rdb$set_context( 'USER_TRANSACTION' , '#ABSENDER_STAAT#' , ( select "PLZ_Postkuerzel" from "AuftragsDokumente" A join "Anschriften" B ON B.anschriften_id = A."AuftrDokument_von_AnschID" join PLZ C ON C.plz_id = B.a_plz_id where A."AuftrDokument_ID" = :"I_AuftrDokumentID" )); select coalesce( "AuftrDokument_VersandArt",0) , "AuftrDokument_Art" , "AuftrDokument_BruttoPreise" , "AuftrDokument_von_GP_ID" , coalesce( b.adaz_gp_id , "AuftrDokument_fuer_GP_ID" ) , coalesce( b."ADAZ_GP_AnschID" , "AuftrDokument_fuer_AnschID" ), iif ( b.adaz_gp_id is null , iif ( "AuftrDokument_FuerAspInAnschr" is distinct from 'N' , "AuftrDokument_fuer_ASP" , NULL) , iif ( b."ADAZ_AspInAnschrYN" is distinct from 'N' , b."ADAZ_Asp_ID" , NULL )) from "AuftragsDokumente" A left outer join "AuftragsDokumenteAnschrZuordnun" B on A."AuftrDokument_ID" = b."ADAZ_AuftrDokument_ID" and a."AuftrDokument_von_GP_ID" = b."ADAZ_VonGP_ID" and a."AuftrDokument_Art" = b."ADAZ_AuftrDokumentArt" and b."ADAZ_KopieEmpfaenger" in ( 0 ,1 ) -- = 0 Originalempfaenger mit GP-Daten / 1 = andere Anschrift aber GP-DAten bleiben gleich >= 10 Kopie empfaenger where A."AuftrDokument_ID" = :"I_AuftrDokumentID" into :"V_DokStdVersandArtID" , :"V_AuftrDokumentArt" , :"V_AuftrDokBruttoPreise" ,:"V_Von_GP_ID" , :"V_Fuer_GP_ID" , :"V_Fuer_AnschID" , :"V_Fuer_Asp"; -- :"V_DokStdVersandArtID" ist jetzt auf jeden Fall nicht mehr NULL unten wird jetzt auf NULL gesetzt wenn alle Positionen der einen StandardVersandart entsprechen. if ( not exists ( select * from "AuftragsDokumentePositionen" A where A."AuftrDokPosi_DokumentID" = :"I_AuftrDokumentID" and A."AuftrDokPosi_VersandArt" is not NULL and A."AuftrDokPosi_VersandArt" != 0 and A."AuftrDokPosi_VersandArt" != :"V_DokStdVersandArtID" ) ) then "V_DokStdVersandArtID" = NULL; -- Null zeigt an das nichts gemacht werden muss if ( :"I_DruckKonfigID" is not null ) then -- Nur machen wenn gedruckt wird begin if ( rdb$get_context( 'USER_TRANSACTION', '#Unberechnet_PosZVorPos#' ) is null ) then -- Text der vor die Positionsangabe gestellt wird wenn die Option Unberechnet gesetzt ist. -- Die Folgende Abfrage ist sehr komplieziert wegen den Unterabfragen Sie soll das kurzzeichen ermitteln wenn eine StammdatenVerID vorhanden ist nimmt sie die erste Abfrage -- ansonsten versucht sucht sie auch ueber aktStammdaten das zeichen zu finden aber nur wenn StammdatenVerID im Dokument nich gesetzt ist. RDB$SET_CONTEXT('USER_TRANSACTION', '#Unberechnet_PosZVorPos#' , ( select coalesce( ( select "StDaten_Unberechnet_PosZVorPos" from "AuftragsDokumente" A join "Stammdaten" B ON B."Stammdaten_VerID" = (select "AuftrDokument_StamDatenVerID" from "AuftragsDokumente" where "AuftrDokument_ID" = :"I_AuftrDokumentID" ) and B."StammD_Gesch_Partner_ID" = A."AuftrDokument_von_GP_ID" where A."AuftrDokument_ID" = :"I_AuftrDokumentID" ) , ( select "StDaten_Unberechnet_PosZVorPos" from "AKT_Stammdaten" A join "Stammdaten" B ON B."Stammdaten_VerID" = A."Akt_Stammdaten_VerID" and B."StammD_Gesch_Partner_ID" = (select "AuftrDokument_von_GP_ID" from "AuftragsDokumente" where "AuftrDokument_ID" = :"I_AuftrDokumentID" and "AuftrDokument_StamDatenVerID" is null ) )) from "GetOneResultRow" )); RDB$SET_CONTEXT('USER_TRANSACTION', 'CV_KeinSeitenumbruchBisBruttoSum' , 0 ); -- 'CV_KeinSeitenumbruchBisBruttoSum' auf 0 setzen um inaktiv anzuzeigen end /* Contextvariablen fuer die Anschriftenfelder setzen. Adresse1 = Im sichfenster des Couverts Adresse2 = Zweitadresse z.B. Lieferadresse wird irgendwo unterhal aufgelistet. */ RDB$SET_CONTEXT('USER_TRANSACTION', '#Adr1_GP_ID#' , :"V_Fuer_GP_ID" ); RDB$SET_CONTEXT('USER_TRANSACTION', '#Adr1_AnschID#' , :"V_Fuer_AnschID" ); RDB$SET_CONTEXT('USER_TRANSACTION', '#Adr1_AspID#' , :"V_Fuer_Asp" ); "V_TempInt" = NULL; if ( :"V_AuftrDokumentArt" <= 300 ) then -- Die angegeben Lieferanschrift nutzen. "V_TempInt" = :"I_AuftrDokumentID"; else if ( :"V_AuftrDokumentArt" = 400 ) then -- Die in der AB angegebene Lieferanschrift nutzen "V_TempInt" = ( select "vonAuftragDokumentID" from "AuftrDokument_UniqueDocSource"( :"I_AuftrDokumentID" , 200 )); if ( :"V_TempInt" is not null ) then begin select b.adaz_gp_id , b."ADAZ_GP_AnschID" , iif ( b."ADAZ_AspInAnschrYN" is not distinct from 'Y' , b."ADAZ_Asp_ID" , null ), B."ADAZ_Anmerkung" from "AuftragsDokumenteAnschrZuordnun" B where b."ADAZ_AuftrDokument_ID" = :"V_TempInt" and b."ADAZ_VonGP_ID" = :"V_Von_GP_ID" and b."ADAZ_AuftrDokumentArt" = 300 -- 300 Lieferscheine and b."ADAZ_KopieEmpfaenger" in ( 0,1) -- 0 originalempfaenger / 1 = andere Anschrift fuer Leferscheine into :"V_Liefer_GP_ID" , :"V_Liefer_AnschID" , :"V_Liefer_Asp" , :"V_TempVarCharMax"; if ( :"V_Liefer_GP_ID" is not null ) then begin RDB$SET_CONTEXT('USER_TRANSACTION', '#Adr2_AnschText#' , 'Lieferanschrift:'); RDB$SET_CONTEXT('USER_TRANSACTION', '#Adr2_GP_ID#' , :"V_Liefer_GP_ID" ); RDB$SET_CONTEXT('USER_TRANSACTION', '#Adr2_AnschID#' , :"V_Liefer_AnschID" ); RDB$SET_CONTEXT('USER_TRANSACTION', '#Adr2_AspID#' , :"V_Liefer_Asp" ); RDB$SET_CONTEXT('USER_TRANSACTION', '#Adr2_Anmerkung#' , :"V_TempVarCharMax" ); end end -- ######################## Ende setzte Contextvariablen ################################# -- Dokumentetxte sollten am ende erezugt werden wenn alle Parameter schon gesetzt sind. if ( :"I_DruckKonfigID" is not null ) then begin "Error" = (select "Error" from "AuftrDokument_TexteErzeugen"( 'TextVorArtikelTabelle' , :"I_AuftrDokumentID" , :"I_DruckKonfigID" , :"I_Format" , :"I_Commands" , NULL , 0 )); "Error" = (select "Error" from "AuftrDokument_TexteErzeugen"( 'TextNachArtikelTabelle' , :"I_AuftrDokumentID" , :"I_DruckKonfigID" , :"I_Format" , :"I_Commands" , NULL ,0 )); end -- Anzahl benoetigter Nachkommastellen fuer die Mengenspalte ermitteln -- 0 = Keine , 1 = eine usw. -1 = Fehler <-- Sollte hier nie vorkommen koennen bei Menge = numeric(X,3) "V_MengeAnzNachkommastellen" = ( select iif( count(*) = SUM(A) , 0 , iif( count(*) = SUM(B) ,1, IIF( count(*) = SUM(C) ,2, iif( count(*) = SUM(D) , 3, -1 )))) from ( select iif( "AuftrDokPosi_Menge" = round( "AuftrDokPosi_Menge" ,0) , 1 , 0) , iif( "AuftrDokPosi_Menge" = round( "AuftrDokPosi_Menge" ,1) , 1 , 0) , iif( "AuftrDokPosi_Menge" = round( "AuftrDokPosi_Menge" ,2) , 1 , 0) , iif( "AuftrDokPosi_Menge" = round( "AuftrDokPosi_Menge" ,3) , 1 , 0) from "AuftragsDokumentePositionen" A Where "AuftrDokPosi_DokumentID" = :"I_AuftrDokumentID" and "AuftrDokPosi_Menge" is not null) AS DT ( A , B , C , D)); end end open "Struktur"; fetch "Struktur" into :"V_StrukturID" , :"V_StrukturPos" , :"V_Struktur_ArtikelText" , :"V_Struktur_Summe" , :"V_AuftrDokStruktur_SummeDrucken" , :"V_Struktur_FettDrucken" , :"V_Struktur_PreiseAusbl" , :"V_Struktur_InAuflistung"; if ( row_count = 0 ) then "V_CursorEmpty" = 1; for select "AuftrDokPosi_Option" , "AuftrDokPosi_Kurztext" , "AuftrDokPosi_Art" , "AuftragsDokumentePositionen_ID" , "AuftrDokPosi_PositionsText" , "AuftrDokPosi_Position" , case when ( a."AuftrDokPosi_Art" = 1 ) then f."ATAS_Text" else E."ADTAS_Text" end , case when ( a."AuftrDokPosi_Art" = 1 ) then f."ATAS_LangText" else E."ADTAS_LangText" end , case when ( a."AuftrDokPosi_Art" = 1 ) then f."ATAS_LangTextHTML" else E."ADTAS_LangTextHTML" end , "AuftrDokPosi_Menge", "AuftrDokPosi_PosGPreis", ( "AuftrDokPosi_GPreis" + coalesce( "AuftrDokPosi_ArtikeOptionsPreis" * "AuftrDokPosi_Menge" , 0 ) ), -- Positions ges. Preis ohne Rabatt "AuftrDokPosi_PositionsRabatt" , "MwStKz" , trim(b."Art_Artikelnr" ||' '|| coalesce(b."Art_Revision",'')) , "Einh_Drucken" , b."Art_VPE_Inhalts_Menge" , iif( i."Art_Artikelnr" is not distinct from b."Art_Artikelnr" , NULL , i."Art_Artikelnr" ) -- Die eigene Artikelnr nur einschreiben wenn sie von der oben abweicht , iif( B."Artikel_ID" is null or not :"V_AuftrDokumentArt" between 1 and 400 , '' , ( select ascii_char(10)||'( '||"EigenschaftenText"||' )' from "ArtikelEigenschaften_TexteWerte"( b."Artikel_ID" , NULL)) ) -- Nur eine "AuftrDokPosi_VersandArt" schreiben wenn es nicht die Standardart ist und wenn sie > 0 ist ( also eine Legende erzeugt werden muss ) , iif( :"V_DokStdVersandArtID" is not null and "AuftrDokPosi_VersandArt" > 0 and "AuftrDokPosi_VersandArt" != :"V_DokStdVersandArtID" , "AuftrDokPosi_VersandArt" , NULL ) from "AuftragsDokumentePositionen" A left outer join "Artikel" B ON A."AuftrDokPosi_Artikel_ID" = B."Artikel_ID" and a."AuftrDokPosi_ArtikelVersion" = b."Artikel_Version" join ( select "MwStSaetze_ID", "KurzZeichen" from "AuftrDokument_MwSt_Liste"( :"I_AuftrDokumentID" , 'Y' ) F ) AS DTAB ( "MSaetze_ID" , "MwStKz" ) ON A."AuftrDokPosi_MwStSaetze_ID" = "MSaetze_ID" -- Achtung keinen Left Outer Join draus machen kostet enorm performance und ist nicht noetig join "Einheiten" D ON A."AuftrDokPosi_PreisEinheit" = D."Einheiten_ID" -- Left outer join sollte nicht noetig sein da Preiseinheit ein NOT NULL Feld ist. left outer join "AuftrDokum_TextArtenSprachen" E ON A."AuftragsDokumentePositionen_ID" = E."ADTAS_AuftrDokumentPositionenID" and E."ADTAS_SprachenID" = 1 and E."ADTAS_TextArtID" = 1 left outer join "ArtikelTextArtenSprachen" F On E."ADTAS_ArtikelTextArtSprachenID" = F."ArtikelTextArtenSprachenID" left outer join "AuftragDokumentPosition_Einkauf" h ON A."AuftragsDokumentePositionen_ID" = H."AuftragsDokumentePositionenE_ID" left outer join "Artikel" I ON H."AuftrDokPosiEk_Artikel_ID" = i."Artikel_ID" and h."AuftrDokPosiEk_ArtikelVersion" = i."Artikel_Version" -- Nachfolgende Joins funktionieren nicht korrekt ganz vorsichtig falls aenderungen noetig werden. -- "MwStKz" oben im Select benutzen sonst kommt immer noch der dummyeintrag durch -- Wenn anstatt des Dummy Eintrags mit PK=0 ein DB-Null benutzt wird und hierein Left Outer Join gesetzt wird geht die permormance extrem in dem Keller 3000 Positionen 1 minute und mit dem hier 2 sekunden -- Habe alles probiert aber so funktioniert es einfach am besten auch wenn der Dummy Eintrag benoetigt wird -- join "AuftrDokument_MwSt_Liste"( :"I_AuftrDokumentID" , 'Y' ) C ON A."AuftrDokPosi_MwStSaetze_ID" = C."MwStSaetze_ID" -- Achtung keinen Left Outer Join draus machen kostet enorm performance und ist nicht noetig where "AuftrDokPosi_DokumentID" = :"I_AuftrDokumentID" and "AuftrDokPosi_DokStrukturID" is not distinct from :"I_Eltern_ID" and "AuftrDokPosi_Position" >= 0 and "AuftrDokPosi_Art" not in ( 110 ) -- 110 = Zwischensumme start ( sonst gibt es eine Leerzeile ) order by "AuftrDokPosi_Position" into :"V_Option" , :"V_Kurztext" , :"V_PositionsArt" , :"V_AuftragsDokumentePositionenID" , :"V_AuftrDokPosText" , :"V_AuftrDokPos" , :"V_Positionen_ArtikelText" , :"V_LangText" , :"V_LangTextHTML" , :"V_MengeDokument" , :"V_PosG-Preis" , :"V_PosG-PreisOhneRabatt" , :"V_PosRabatt" , :"V_MwSt_KurzZeichen" , :"V_Artikelnummer" , :"V_PreisEinheit" , :"V_VPE_Inhalts_Menge" , :"V_EigeneArtikelNr" , :"V_EigenschaftenText" , :"V_AuftragPositionVersandArtID" do begin -- Aenderung vom 26.02.2014 if ( :"V_AuftrDokumentArt" > 10000 and :"V_VPE_Inhalts_Menge" > 1 ) then begin if ( cast( :"V_VPE_Inhalts_Menge" as integer) = :"V_VPE_Inhalts_Menge" ) then "V_PreisEinheit" = '(à'||cast(:"V_VPE_Inhalts_Menge" as integer)||' '||:"V_PreisEinheit"||')'; else if( :"V_VPE_Inhalts_Menge" = round( :"V_VPE_Inhalts_Menge" ,1) ) then "V_PreisEinheit" = '(à'||round(:"V_VPE_Inhalts_Menge",1)||' '||:"V_PreisEinheit"||')'; else if( :"V_VPE_Inhalts_Menge" = round( :"V_VPE_Inhalts_Menge" ,2) ) then "V_PreisEinheit" = '(à'||round(:"V_VPE_Inhalts_Menge",2)||' '||:"V_PreisEinheit"||')'; else "V_PreisEinheit" = '(à'||:"V_VPE_Inhalts_Menge"||' '||:"V_PreisEinheit"||')'; -- "V_Positionen_ArtikelText" = 'à('||:"V_VPE_Inhalts_Menge"||' Stück )'||ascii_char(29) || :"V_Positionen_ArtikelText" || ascii_char(29)|| 'à(100 Stück )'; end if ( :"V_EigeneArtikelNr" is not null ) then begin if ( :"V_LangText" is null ) then "V_LangText" = iif( :"V_Positionen_ArtikelText" is null , :"V_EigeneArtikelNr", :"V_Positionen_ArtikelText"||' ' || ascii_char(29)||ascii_char(10)|| :"V_EigeneArtikelNr"); else begin -- Im Blob steht schon was drinn if ( :"V_Positionen_ArtikelText" is null ) then "V_LangText" = :"V_LangText" ||' '|| ascii_char(29)||ascii_char(10)|| :"V_EigeneArtikelNr"; else -- Es hat wohl in beiden Feldern etwas gestanden ( Sollte momentan niemals passieren evtl. ignorieren ) "V_LangText" = :"V_Positionen_ArtikelText"||' ' || ascii_char(29) || ' '|| :"V_LangText" || ' '||ascii_char(29)||ascii_char(10)|| :"V_EigeneArtikelNr"; end "V_Positionen_ArtikelText" = NULL; -- Wenn es in das normale Textfeld passt kopiert er es unten eh dort rein. end -- Ene Aenderung vom 26.02.2014 -- Alle Ausgabeparameter zuruecksetzen "PosText1" = null ; "PosText2" = NULL ;"PositionsArt" =NULL ; "StrukturText" = :"I_PositionsString"; "PositionsNr" = NULL ; "RAuftrDokStruktur_ID" = NULL; "RAuftragsDokumentePositionen_ID" = NULL;"VMenge" = NULL;"NMenge" = NULL; "MengeGeliefert" = NULL;"MengeRueckstand" = NULL;"ArtikelBlobText" = NULL;"ArtikelText" = NULL ; "KurztextAnzAbsaetze" = NULL ;"Artikelnummer" = NULL;"EAN_Code" = NULL;"E-Preis" = NULL;"G-Preis" = NULL;"Preiseinheit" = NULL;"MwSt_Satz" = NULL;"TexgenCommand" = NULL; "CZeileFett" = NULL ; "CZeileItalic" = NULL ; "CgesPreisFett" = NULL ; "CgesPreisUnterstreichen" = NULL ; "CgesPreisDoppeltUnterstreichen" = NULL ; "RowType" = 0 ; "PosRabatt" = NULL; "ExtraAbstandEinfuegen" = NULL ; if ( :"I_Format" = 'HTML' ) then -- Momentan wird nur HTML beruecksichtigt "V_LangText" = :"V_LangTextHTML"; -- bis zum 17.01.2012 war dies die WHILE Bedingung: or :"V_Position" is not null <--- ist sehr bloed da es nie NULL ist -- while(:"V_CursorEmpty" = 0 and ( :"V_PositionsArt" < 100 or :"V_Position" is not null ) and :"V_Position" >= :"V_StrukturPos" ) -- Bis auf Art = 400 sind alle Arten zwischen 300 und 9.999 nur in Ebene 0 erlaubt deshalb auch nach unten durchreichen wenn vor der 9.999 evtl. noch was anders gebraucht wird das hier anpassen. -- Evtl. die Summenpositionen in der SP Funktion NeuNummerieren auch ans Ende sortieren lassen -- sollte doch machbar sein evtl. ein kuenstliches Feld sortindex von der PositionsArt ableiten mit vorrang vor allem while (:"V_CursorEmpty" = 0 -- Es gibt noch Strulturpositionen = 0 wenn =1 keine mehr vorhanden and (( :"V_PositionsArt" < 100 and :"V_Position" >= :"V_StrukturPos" ) -- Die Strukturposition vorrangig in das Dokument einreihen. or :"V_PositionsArt" between 300 and 9999 -- Summenpositionen gehoeren ans Ende und dorthin werden sie auch durchgereicht. or :"V_PositionsArt" = 104 -- PosArt 104 = Strukturposition hier einfuegen ( also ganz expliziet gewuenscht vom Benutzer) or :"V_PositionsArt" = 102 )) -- 102 Horizontale Linie macht am Anfang der Seite keinen Sinn also Strukturen einsortieren. do -- 102 Ist auch Problematisch bei den Endsummen vor die man diese Linie setzen kann dann gibt es evtl. Fehler also unbedingt drinn lassen !!! begin -- Immer wenn eine Struktur einsortiert werden muss. Hat Vorrang vor Positionen -- !!!ACHTUNG !!! START -- Bereich der nach unten kopiert werden muss wenn etwas geaendert wird. "ArtikelBlobText" = NULL; "RAuftrDokStruktur_ID" = :"V_StrukturID"; "RAuftragsDokumentePositionen_ID" = NULL; "ArtikelText" = "V_Struktur_ArtikelText"; "PositionsArt" = 99; -- 99 = Strukturtext "HintergrundFarbe" = 'FFFFFF'; "ZeilenNr" = "ZeilenNr" + 1; "PositionsNr" = -:"V_Position"; if ( "I_PositionsString" is null ) then "StrukturText" = :"V_Position" ; else "StrukturText" = :"I_PositionsString" || '.' || :"V_Position" ; -- Neues Schema fuer die Positonsstruktur (3xIn diser SP vorhanden muss immer genau gleich sein )mit "PosText1" und "PosText2" zusammenbauen "V_TempHelpInt" = position( '.' , :"StrukturText" ); if ( :"V_TempHelpInt" = 0 ) then begin "PosText1" = :"StrukturText"; end else begin "PosText1" = left( :"StrukturText" , "V_TempHelpInt"-1 ); "PosText2" = substring( :"StrukturText" from "V_TempHelpInt" ); end if ( :"V_AuftrDokumentArt" = 800 or :"V_Struktur_FettDrucken" is not distinct from 'Y' ) then -- Bei Mahnungen den Strukturtext Fett drucken "CZeileFett" = 'Y'; else "CgesPreisFett" = 'Y'; -- Wenn Preis der Struktur dann mindestens dieser fett. if ( :"V_AuftrDokStruktur_SummeDrucken" = 'Y' ) then select "Format_Zahl" from "Formatiere_Zahl"( :"V_Struktur_Summe" , NULL , NULL , NULL ) into :"G-Preis"; "Pos_GPreis_StruktPreis" = :"V_Struktur_Summe"; "ExtraAbstandEinfuegen" = 0; suspend; "V_LastPositionsArt" = :"PositionsArt"; if ( :"I_NurDieseEbene" != 'Y' ) then begin "V_OldStruktur_PreiseAusbl" = RDB$GET_CONTEXT('USER_TRANSACTION', '#V_Struktur_PreiseAusbl#' ); RDB$SET_CONTEXT('USER_TRANSACTION', '#V_Struktur_PreiseAusbl#' , :"V_Struktur_PreiseAusbl" ); for select "PositionsArt","StrukturText","PositionsNr","PositionsStringFormatiert","PosText1","PosText2","RAuftrDokStruktur_ID","RAuftragsDokumentePositionen_ID","VMenge","NMenge","MengeGeliefert","MengeRueckstand","ArtikelText","ArtikelBlobText","KurztextAnzAbsaetze","Artikelnummer","EAN_Code","E-Preis","G-Preis","PosRabatt","Preiseinheit","MwSt_Satz","TexgenCommand","HintergrundFarbe","Warnings","CZeileFett","CZeileItalic","CgesPreisFett","CgesPreisUnterstreichen","CgesPreisDoppeltUnterstreichen","ZeilenNr","RowType","ExtraAbstandEinfuegen","Pos_GPreis_StruktPreis" from "AuftragsDokumente_Drucken" ( :"I_AuftrDokumentID" , :"I_DruckKonfigID" , :"V_StrukturID" , :"StrukturText" , :"I_NurDieseEbene" , :"I_NettoPreise" , :"I_MwSt_Kurzform", :"I_Format" , :"I_Format_PosText" , :"I_Format_G-Preis" , :"I_Format_E-Preis" , :"I_Format_Menge" , :"I_Warnings" , :"I_Commands" , :"I_Int_Help" , :"I_BigInt_Help" , :"I_Varchar_Help" , :"ZeilenNr" ) into "PositionsArt","StrukturText","PositionsNr","PositionsStringFormatiert","PosText1","PosText2","RAuftrDokStruktur_ID","RAuftragsDokumentePositionen_ID","VMenge","NMenge","MengeGeliefert","MengeRueckstand","ArtikelText","ArtikelBlobText","KurztextAnzAbsaetze","Artikelnummer","EAN_Code","E-Preis","G-Preis","PosRabatt","Preiseinheit","MwSt_Satz","TexgenCommand","HintergrundFarbe","Warnings","CZeileFett","CZeileItalic","CgesPreisFett","CgesPreisUnterstreichen","CgesPreisDoppeltUnterstreichen","ZeilenNr","RowType","ExtraAbstandEinfuegen","Pos_GPreis_StruktPreis" do suspend; "V_LastPositionsArt" = :"PositionsArt"; RDB$SET_CONTEXT('USER_TRANSACTION', '#V_Struktur_PreiseAusbl#' , "V_OldStruktur_PreiseAusbl" ); end "V_Position" = :"V_Position" +1; fetch "Struktur" into :"V_StrukturID" , :"V_StrukturPos" , :"V_Struktur_ArtikelText" , :"V_Struktur_Summe" , :"V_AuftrDokStruktur_SummeDrucken" , :"V_Struktur_FettDrucken" , :"V_Struktur_PreiseAusbl" , :"V_Struktur_InAuflistung"; if ( row_count = 0 ) then "V_CursorEmpty" = 1; -- Alle Ausgabeparameter zuruecksetzen "PosText1" = null ; "PosText2" = NULL ;"PositionsArt" =NULL ; "StrukturText" = :"I_PositionsString"; "PositionsNr" = NULL ; "RAuftrDokStruktur_ID" = NULL; "RAuftragsDokumentePositionen_ID" = NULL;"VMenge" = NULL;"NMenge" = NULL; "MengeGeliefert" = NULL;"MengeRueckstand" = NULL;"ArtikelBlobText" = NULL;"ArtikelText" = NULL ; "KurztextAnzAbsaetze" = NULL ;"Artikelnummer" = NULL;"EAN_Code" = NULL;"E-Preis" = NULL;"G-Preis" = NULL;"Preiseinheit" = NULL;"MwSt_Satz" = NULL;"TexgenCommand" = NULL; "CZeileFett" = NULL ; "CZeileItalic" = NULL ; "CgesPreisFett" = NULL ; "CgesPreisUnterstreichen" = NULL ; "CgesPreisDoppeltUnterstreichen" = NULL ; "RowType" = 0 ; "PosRabatt" = NULL; "ExtraAbstandEinfuegen" = NULL ;"Pos_GPreis_StruktPreis" = NULL; end select "Format_Zahl" from "Formatiere_Zahl"( :"V_PosRabatt" , NULL , NULL , NULL ) into :"PosRabatt"; "PosRabatt" = :"PosRabatt" ||'%'; -- !!!ACHTUNG !!! ENDE -- Bereich der nach unten kopiert werden muss wenn etwas geaendert wird. -- if ( ( :"V_LastPositionID" = :"V_AuftragsDokumentePositionenID" or :"V_PositionsArt" > 300 ) and RDB$GET_CONTEXT('USER_TRANSACTION', 'CV_KeinSeitenumbruchBisBruttoSum' ) = 0 ) then if ( ( rdb$get_context( 'USER_TRANSACTION', 'CV_LastPositionID' ) = :"V_AuftragsDokumentePositionenID" or :"V_PositionsArt" > 300 ) and RDB$GET_CONTEXT('USER_TRANSACTION', 'CV_KeinSeitenumbruchBisBruttoSum' ) = 0 ) then begin "V_TempHelpInt" = "RowType"; "RowType" = 7; RDB$SET_CONTEXT('USER_TRANSACTION', 'CV_KeinSeitenumbruchBisBruttoSum' , 1 ); "ArtikelText" = 'summeges'; -- Jeder zusammenhaengende Bereich braucht sein extra Label einmal mit 7 oeffnen und einmal mit 8 und dem selben Labelnamen schliessen suspend; "V_LastPositionsArt" = :"PositionsArt"; "RowType" = "V_TempHelpInt"; end -- So jetzt darf die Position auch gesendet werden. -- "StrukturText" = :"I_PositionsString" || :"V_Position" ; Geaendert am 06.04.2010 wird getrennt uebergeben ! PositionsText = Struktur "RAuftrDokStruktur_ID" = NULL; "RAuftragsDokumentePositionen_ID" = :"V_AuftragsDokumentePositionenID"; "ArtikelText" = NULL; if ( :"V_LangText" is not null ) then -- es ist ein Langtext verfuegbar begin -- Hier schauen ob der Blob in den normalen ArtikelText ( Varchar(8191)) passt und darin senden. Ansonsten Blob nehmen. if ( char_length( :"V_LangText" )+coalesce( char_length( :"V_EigenschaftenText" ),0) < 8100 ) then -- 8100 - 512 fuer die evtl. vorhandenen ArtikelEigenschaften "ArtikelText" = :"V_LangText" || coalesce( ascii_char(29)||:"V_EigenschaftenText" , ''); else "ArtikelBlobText" = :"V_LangText"|| coalesce( ascii_char(29)||:"V_EigenschaftenText" , ''); end else begin if ( char_length( :"V_Positionen_ArtikelText" )+coalesce( char_length( :"V_EigenschaftenText" ),0) < 8100 ) then -- 8100 - 512 fuer die evtl. vorhandenen ArtikelEigenschaften "ArtikelText" = :"V_Positionen_ArtikelText" || coalesce( ascii_char(29)||:"V_EigenschaftenText" , ''); else "ArtikelBlobText" = :"V_Positionen_ArtikelText" || coalesce( ascii_char(29)||:"V_EigenschaftenText" , ''); end if ( :"ArtikelText" is null and :"ArtikelBlobText" is null ) then -- besser bei allen machen and :"V_PositionsArt" < 100 ) then "ArtikelText" = ' '; -- Kein Leertext sondern mindestens ein Leerzeichen, ansonsten wird die Position ganz verschluckt und nicht mehr angezeigt if ( :"V_PosG-Preis" is not null ) then begin "Pos_GPreis_StruktPreis" = :"V_PosG-Preis"; "G-Preis" = cast( :"V_PosG-Preis" as numeric(18,2)); select "Format_Zahl" from "Formatiere_Zahl"( :"G-Preis" , NULL , NULL , NULL ) into :"G-Preis"; end if ( :"V_MengeDokument" is not null ) then begin if ( :"V_MengeAnzNachkommastellen" = 0 ) then "VMenge" = ( select "Format_Zahl" from "Formatiere_Zahl"( round( :"V_MengeDokument" , 0 ) , NULL , NULL , NULL )); else if ( :"V_MengeAnzNachkommastellen" = 1 ) then "VMenge" = ( select "Format_Zahl" from "Formatiere_Zahl"( round( :"V_MengeDokument" , 1 ) , NULL , NULL , NULL )); else if ( :"V_MengeAnzNachkommastellen" = 2 ) then "VMenge" = ( select "Format_Zahl" from "Formatiere_Zahl"( round( :"V_MengeDokument" , 2 ) , NULL , NULL , NULL )); else "VMenge" = ( select "Format_Zahl" from "Formatiere_Zahl"( :"V_MengeDokument" , NULL , NULL , NULL )); "V_TempHelpInt" = position( ',' , :"VMenge" ); if ( :"V_TempHelpInt" > 0 ) then begin "NMenge" = trim( trailing '0' from substring( :"VMenge" from :"V_TempHelpInt" )); -- Evtl. das Trim rausnehmen und die menge immer gleich anzeigen und mit nullen auffuellen -- mal sehen -- "NMenge" = substring( :"VMenge" from :"V_TempHelpInt" ); -- Version ohne Trim also nullen am ende stehen lassen. if ( :"NMenge" = ',' ) then "NMenge" = ''; "VMenge" = left( :"VMenge" , :"V_TempHelpInt" -1 ); end else "NMenge" = ''; "Preiseinheit" = :"V_PreisEinheit"; -- Preiseinheit nur ausgeben wenn es auch eine menge gibt end if ( :"V_PosG-Preis" is not null and :"V_MengeDokument" is not null ) then begin if ( :"V_MengeDokument" != 0 ) then begin if ( :"V_PosRabatt" is null ) then -- E-Preis Rabatt nicht vorhanden "E-Preis" = cast( :"V_PosG-Preis" / :"V_MengeDokument" as numeric(18,2)); else -- E-Preis ohne Rabatt ausweisen evtl. waehlbar ob e-preis mit oder ohne rabatt "E-Preis" = cast( :"V_PosG-PreisOhneRabatt" / :"V_MengeDokument" as numeric(18,2)); select "Format_Zahl" from "Formatiere_Zahl"( :"E-Preis" , NULL , NULL , NULL ) into :"E-Preis"; end else begin -- Wenn Menge = NULL geht er hier drueber und zeigt den Preis wie es sein soll wenn Menge = 0 dann auch Preis nicht anzeigen "G-Preis" = NULL; -- Muss hier stehen und nicht aussen rum, sonst sind auch bei berechneten Feldern die Summenwerte = NULL ges.summe etc. geht natuerlich nicht "Pos_GPreis_StruktPreis" = NULL; end end "PositionsArt" = :"V_PositionsArt"; if ( "V_PositionsArt" > 99 -- Alle Positionsarten > 99 also ab 100 bekommen keine Positionsnummern or :"V_Option" in ( 1 ) ) then -- Alle Positionen mit der Option 1 = Versteckt bekommen auch keine Positionsnr. "StrukturText" = NULL; else "PositionsNr" = :"V_Position"; "KurztextAnzAbsaetze" = "V_Kurztext"; "HintergrundFarbe" = 'FFFFFF'; "RAuftrDokStruktur_ID" = :"I_Eltern_ID"; -- Die richtige StrukturID setzen. "ZeilenNr" = "ZeilenNr" + 1; if ( RDB$GET_CONTEXT('USER_TRANSACTION', 'CV_KeinSeitenumbruchBisBruttoSum' ) = 1 ) then "CKeinUmbruchDanach" = 'Y'; if ( :"V_PositionsArt" = 300 ) then begin "V_CountMwSt_Saetze" = :"V_CountMwSt_Saetze" -1; if ( :"V_CountMwSt_Saetze" = 0 ) then -- Unterstreichung nach MwSt ausweisung einfuegen evtl. in stamdaten schauen ob gewuenscht "CgesPreisUnterstreichen" = 'Y'; end if ( ( :"V_PositionsArt" >= 300 and :"V_PositionsArt" < 100000 ) or :"V_PositionsArt" = 111 ) then begin "CgesPreisFett" = 'Y'; "RowType" = 0; -- RowType 3 geht nur bei Einzeiligen Texten aber der Benutzer kann hier den Text auch aendern deswegen von RowType=3 auf 0 gegangen. end if ( :"V_PositionsArt" = 410 ) then "CgesPreisDoppeltUnterstreichen" = 'Y'; -- ges. Prei sdoppelt unterstreichen if ( :"V_PositionsArt" = 101 ) then "RowType" = 4; -- Leere Zeile if ( :"V_PositionsArt" = 102 ) then "RowType" = 5; -- Horizontale Linie if ( :"V_PositionsArt" = 103 ) then "RowType" = 6; -- Seitenumbruch -- MwSt Kurzzeichen setzen -- if ( :"RowType" < 99 or :"RowType" in( 300, 401 ) ) then -- kann eigentlich nur ein Fehler gewesen sein !!!!!!!! if ( :"V_PositionsArt" < 99 or :"V_PositionsArt" in( 300, 401 ) ) then "MwSt_Satz" = :"V_MwSt_KurzZeichen"; if ( :"V_AuftragPositionVersandArtID" is not NULL ) then begin -- Jetzt noch ein Kuerzel fuer die Versandart anzeigen z.B. D fuer DPD wird einfach an "MwSt_Satz" angehaengt evtl. spaeter bei der Menge mit ausgeben !! "V_AuftrPosiVersand_KurzZeichen" = NULL; "V_AuftrPosiVersand_KurzZeichen" = ( select "AufDokVerArt_StdKuerzel" from "AuftragsDokumentVersandArt" A where A."AuftrDokumVersandArt_ID" = :"V_AuftragPositionVersandArtID" ); if ( :"V_AuftrPosiVersand_KurzZeichen" is not null ) then begin if ( :"MwSt_Satz" is not null and :"MwSt_Satz" != '' ) then "MwSt_Satz" = "MwSt_Satz" || ','||:"V_AuftrPosiVersand_KurzZeichen"; else "MwSt_Satz" = :"V_AuftrPosiVersand_KurzZeichen"; end end -- Neues Schema fuer die Positonsstruktur (3xIn diser SP vorhanden muss immer genau gleich sein )mit "PosText1" und "PosText2" zusammenbauen if ( :"StrukturText" = '' or :"StrukturText" is null ) then "PosText1" = :"PositionsNr"; else begin "V_TempHelpInt" = position( '.' , :"StrukturText" ); if ( :"V_TempHelpInt" = 0 ) then begin "PosText1" = :"StrukturText"; if ( :"PositionsNr" > 0 ) then "PosText2" = '.'||:"PositionsNr"; end else begin "PosText1" = left( :"StrukturText" , "V_TempHelpInt" -1); "PosText2" = substring( :"StrukturText" from "V_TempHelpInt" ) ||'.'|| coalesce( :"PositionsNr" , '' ); end end if ( :"V_Option" = 2 ) then -- Wenn die Position die Option (U)nberechnet gesetzt hat begin if ( ( rdb$get_context( 'USER_TRANSACTION', '#Unberechnet_PosZVorPos#' )) is not null ) then "PosText1" = rdb$get_context( 'USER_TRANSACTION', '#Unberechnet_PosZVorPos#' ) || :"PosText1"; if ( "G-Preis" is not null and char_length( "G-Preis" ) > 0 ) then "G-Preis" = '('||"G-Preis"||')'; -- Alternative unberechnetet Preise in Klammern setzen end if ( :"V_PositionsArt" = 2 and :"P_MarkChangedArticle" > 0 ) then -- Artikel die von ArtikelText in ArtikelTextGeaendert gesetzt wurden. "Artikelnummer" = '*' || "V_Artikelnummer"; else "Artikelnummer" = "V_Artikelnummer"; if ( :"V_Option" is null or not(:"P_HiddenHide" > 0 and :"V_Option" = 1 )) then -- Wenn Commando HidenHide Versteckte Zeilen ausblenden begin -- und eine versteckte Zeile da ist dise kpl. ueberspringen if ( :"RowType" != 6 or ( :"RowType" =6 and RDB$GET_CONTEXT('USER_TRANSACTION', 'CV_KeinSeitenumbruchBisBruttoSum' ) = 0 )) then begin if ( :"V_PositionsArt" in ( 1,2,3 ) ) then begin "ExtraAbstandEinfuegen" = 0; -- 0 = 1ex Abstand einfuegen if ( RDB$GET_CONTEXT('USER_TRANSACTION', '#V_Struktur_PreiseAusbl#' ) = 'Y' ) then begin -- Die Preise der Positionen in dieser Struktur sollen ausgeblendet werden "E-Preis" = NULL; "G-Preis" = NULL; end end if ( 1 = 2 and :"V_PositionsArt" in ( 1,2,3 ) ) then begin exception "Fatal_Error"'Zusammenhaengender Bereich1'; if ( :"ArtikelText" is null ) then begin "RowType" = 7; "ArtikelText" = 'pos'||:"RAuftragsDokumentePositionen_ID"; -- Jeder zusammenhaengende Bereich braucht sein extra Label einmal mit 7 oeffnen und einmal mit 8 und dem selben Labelnamen schliessen suspend; "ArtikelText" = NULL; "RowType" = 0; suspend; -- DokumentPosition zurueckgeben "RowType" = 8; "ArtikelText" = 'pos'||:"RAuftragsDokumentePositionen_ID"; suspend; end else begin exception "Fatal_Error"'Zusammenhaengender Bereich2'; "V_TempVarCharMax" = "ArtikelText"; "RowType" = 7; "ArtikelText" = 'pos'||:"RAuftragsDokumentePositionen_ID"; -- Jeder zusammenhaengende Bereich braucht sein extra Label einmal mit 7 oeffnen und einmal mit 8 und dem selben Labelnamen schliessen suspend; "RowType" = 0; "ArtikelText" = "V_TempVarCharMax"; suspend; -- DokumentPosition zurueckgeben "RowType" = 8; "ArtikelText" = 'pos'||:"RAuftragsDokumentePositionen_ID"; suspend; end "RowType" = 0; end else begin -- ################################################################################################################################## if ( :"V_EndsummeAusgegeben" < 0 and :"PositionsArt" = 100 ) then begin -- Aenderung vom 02.06.2015 Text nach Ges. Summe nach der Tabelle drucken insert into "AuftrDokum_Texte" ( "AD_T_AuftrDokID" , "AD_T_BlockPosition" , "AD_T_TextPos", "AD_T_TextFormat" , "AD_T_Text" , "AD_T_BlobText" ) values ( :"I_AuftrDokumentID" , 1 , :"V_EndsummeAusgegeben" , 3 , :"ArtikelText" , :"ArtikelBlobText" ); "V_EndsummeAusgegeben" = :"V_EndsummeAusgegeben" +1; end else suspend; -- DokumentPosition zurueckgeben end "V_LastPositionsArt" = :"PositionsArt"; end end if ( :"V_PositionsArt" = 410 ) then begin "PosText1" = null ; "PosText2" = NULL ;"PositionsArt" =NULL ; "StrukturText" = :"I_PositionsString"; "PositionsNr" = NULL ; "RAuftrDokStruktur_ID" = NULL; "RAuftragsDokumentePositionen_ID" = NULL;"VMenge" = NULL;"NMenge" = NULL; "MengeGeliefert" = NULL;"MengeRueckstand" = NULL;"ArtikelBlobText" = NULL;"ArtikelText" = NULL ; "KurztextAnzAbsaetze" = NULL ;"Artikelnummer" = NULL;"EAN_Code" = NULL;"E-Preis" = NULL;"G-Preis" = NULL;"Preiseinheit" = NULL;"MwSt_Satz" = NULL;"TexgenCommand" = NULL; "CZeileFett" = NULL ; "CZeileItalic" = NULL ; "CgesPreisFett" = NULL ; "CgesPreisUnterstreichen" = NULL ; "CgesPreisDoppeltUnterstreichen" = NULL ; "RowType" = 0 ; "PosRabatt" = NULL; "ExtraAbstandEinfuegen" = NULL ;"Pos_GPreis_StruktPreis" = NULL; RDB$SET_CONTEXT('USER_TRANSACTION', 'CV_KeinSeitenumbruchBisBruttoSum' , 0 ); "RowType" = 8; "ArtikelText" = 'summeges'; -- Jeder zusammenhaengende Bereich braucht sein extra Label einmal mit 7 oeffnen und einmal mit 8 und dem selben Labelnamen schliessen suspend; "V_LastPositionsArt" = :"PositionsArt"; "V_EndsummeAusgegeben" = -1000; -- Aenderung vom 02.06.2015 Text nach Ges. Summe nach der Tabelle drucken --####################################################################################################################################### end if ( :"PositionsArt" < 100 -- Alle Arten unter 100 bekommen eine Positionsnr. and ( "V_Option" not in ( 1 ) or "V_Option" is null )) then -- Option 1 Verteckt bekommt keine Positionsnr "V_Position" = :"V_Position" +1; end /* Schauen ob noch was in der Struktur uebrig ist und es auch noch anhaengen. Kommt vor wenn zu wenig oder auch keine DokumentPositionen vorhanden waren ;-) */ -- Alle Ausgabeparameter zuruecksetzen "PosText1" = null ; "PosText2" = NULL ;"PositionsArt" =NULL ; "StrukturText" = :"I_PositionsString"; "PositionsNr" = NULL ; "RAuftrDokStruktur_ID" = NULL; "RAuftragsDokumentePositionen_ID" = NULL;"VMenge" = NULL;"NMenge" = NULL; "MengeGeliefert" = NULL;"MengeRueckstand" = NULL;"ArtikelBlobText" = NULL;"ArtikelText" = NULL ; "KurztextAnzAbsaetze" = NULL ;"Artikelnummer" = NULL;"EAN_Code" = NULL;"E-Preis" = NULL;"G-Preis" = NULL;"Preiseinheit" = NULL;"MwSt_Satz" = NULL;"TexgenCommand" = NULL; "CZeileFett" = NULL ; "CZeileItalic" = NULL ; "CgesPreisFett" = NULL ; "CgesPreisUnterstreichen" = NULL ; "CgesPreisDoppeltUnterstreichen" = NULL ; "RowType" = 0 ; "PosRabatt" = NULL; "ExtraAbstandEinfuegen" = NULL ;"Pos_GPreis_StruktPreis" = NULL; -- ################################################################################################################################################## -- ################################################################################################################################################## -- ################################################################################################################################################## -- !!! ACHTUNG !!! START Kopie von oben. Bei aenderungen diese Bloecke immer syncronisieren while( :"V_CursorEmpty" = 0 ) do -- <--- ACHTUNG das WHIKLE hier muss natuerlich nur noch so aussehen sonst nichts. Es sind nur noch Strukturebenen da. begin -- Immer wenn eine Struktur einsortiert werden muss. Hat Vorrang vor Positionen "ArtikelBlobText" = NULL; "RAuftrDokStruktur_ID" = :"V_StrukturID"; "RAuftragsDokumentePositionen_ID" = NULL; "ArtikelText" = "V_Struktur_ArtikelText"; "PositionsArt" = 99; -- 99 = Strukturtext "HintergrundFarbe" = 'FFFFFF'; "ZeilenNr" = "ZeilenNr" + 1; "PositionsNr" = -:"V_Position"; if ( "I_PositionsString" is null ) then "StrukturText" = :"V_Position" ; else "StrukturText" = :"I_PositionsString" || '.' || :"V_Position" ; -- Neues Schema fuer die Positonsstruktur (3xIn diser SP vorhanden muss immer genau gleich sein )mit "PosText1" und "PosText2" zusammenbauen "V_TempHelpInt" = position( '.' , :"StrukturText" ); if ( :"V_TempHelpInt" = 0 ) then begin "PosText1" = :"StrukturText"; end else begin "PosText1" = left( :"StrukturText" , "V_TempHelpInt"-1 ); "PosText2" = substring( :"StrukturText" from "V_TempHelpInt" ); end if ( :"V_AuftrDokumentArt" = 800 or :"V_Struktur_FettDrucken" is not distinct from 'Y' ) then -- Bei Mahnungen den Strukturtext Fett drucken "CZeileFett" = 'Y'; else "CgesPreisFett" = 'Y'; -- Wenn Preis der Struktur dann mindestens dieser fett. if ( :"V_AuftrDokStruktur_SummeDrucken" = 'Y' ) then select "Format_Zahl" from "Formatiere_Zahl"( :"V_Struktur_Summe" , NULL , NULL , NULL ) into :"G-Preis"; "Pos_GPreis_StruktPreis" = :"V_Struktur_Summe"; "ExtraAbstandEinfuegen" = 0; suspend; "V_LastPositionsArt" = :"PositionsArt"; if ( :"I_NurDieseEbene" != 'Y' ) then begin "V_OldStruktur_PreiseAusbl" = RDB$GET_CONTEXT('USER_TRANSACTION', '#V_Struktur_PreiseAusbl#' ); RDB$SET_CONTEXT('USER_TRANSACTION', '#V_Struktur_PreiseAusbl#' , :"V_Struktur_PreiseAusbl" ); for select "PositionsArt","StrukturText","PositionsNr","PositionsStringFormatiert","PosText1","PosText2","RAuftrDokStruktur_ID","RAuftragsDokumentePositionen_ID","VMenge","NMenge","MengeGeliefert","MengeRueckstand","ArtikelText","ArtikelBlobText","KurztextAnzAbsaetze","Artikelnummer","EAN_Code","E-Preis","G-Preis","PosRabatt","Preiseinheit","MwSt_Satz","TexgenCommand","HintergrundFarbe","Warnings","CZeileFett","CZeileItalic","CgesPreisFett","CgesPreisUnterstreichen","CgesPreisDoppeltUnterstreichen","ZeilenNr","RowType","ExtraAbstandEinfuegen","Pos_GPreis_StruktPreis" from "AuftragsDokumente_Drucken" ( :"I_AuftrDokumentID" , :"I_DruckKonfigID" , :"V_StrukturID" , :"StrukturText" , :"I_NurDieseEbene" , :"I_NettoPreise" , :"I_MwSt_Kurzform", :"I_Format" , :"I_Format_PosText" , :"I_Format_G-Preis" , :"I_Format_E-Preis" , :"I_Format_Menge" , :"I_Warnings" , :"I_Commands" , :"I_Int_Help" , :"I_BigInt_Help" , :"I_Varchar_Help" , :"ZeilenNr" ) into "PositionsArt","StrukturText","PositionsNr","PositionsStringFormatiert","PosText1","PosText2","RAuftrDokStruktur_ID","RAuftragsDokumentePositionen_ID","VMenge","NMenge","MengeGeliefert","MengeRueckstand","ArtikelText","ArtikelBlobText","KurztextAnzAbsaetze","Artikelnummer","EAN_Code","E-Preis","G-Preis","PosRabatt","Preiseinheit","MwSt_Satz","TexgenCommand","HintergrundFarbe","Warnings","CZeileFett","CZeileItalic","CgesPreisFett","CgesPreisUnterstreichen","CgesPreisDoppeltUnterstreichen","ZeilenNr","RowType","ExtraAbstandEinfuegen","Pos_GPreis_StruktPreis" do suspend; "V_LastPositionsArt" = :"PositionsArt"; RDB$SET_CONTEXT('USER_TRANSACTION', '#V_Struktur_PreiseAusbl#' , "V_OldStruktur_PreiseAusbl" ); end "V_Position" = :"V_Position" +1; fetch "Struktur" into :"V_StrukturID" , :"V_StrukturPos" , :"V_Struktur_ArtikelText" , :"V_Struktur_Summe" , :"V_AuftrDokStruktur_SummeDrucken" , :"V_Struktur_FettDrucken" , :"V_Struktur_PreiseAusbl" , :"V_Struktur_InAuflistung"; if ( row_count = 0 ) then "V_CursorEmpty" = 1; else RDB$SET_CONTEXT('USER_TRANSACTION', '#V_Struktur_PreiseAusbl#' , :"V_Struktur_PreiseAusbl" ); -- Alle Ausgabeparameter zuruecksetzen "PosText1" = null ; "PosText2" = NULL ;"PositionsArt" =NULL ; "StrukturText" = :"I_PositionsString"; "PositionsNr" = NULL ; "RAuftrDokStruktur_ID" = NULL; "RAuftragsDokumentePositionen_ID" = NULL;"VMenge" = NULL;"NMenge" = NULL; "MengeGeliefert" = NULL;"MengeRueckstand" = NULL;"ArtikelBlobText" = NULL;"ArtikelText" = NULL ; "KurztextAnzAbsaetze" = NULL ;"Artikelnummer" = NULL;"EAN_Code" = NULL;"E-Preis" = NULL;"G-Preis" = NULL;"Preiseinheit" = NULL;"MwSt_Satz" = NULL;"TexgenCommand" = NULL; "CZeileFett" = NULL ; "CZeileItalic" = NULL ; "CgesPreisFett" = NULL ; "CgesPreisUnterstreichen" = NULL ; "CgesPreisDoppeltUnterstreichen" = NULL ; "RowType" = 0 ; "PosRabatt" = NULL; "ExtraAbstandEinfuegen" = NULL ;"Pos_GPreis_StruktPreis" = NULL; end -- !!! ACHTUNG !!! ENDE Kopie von oben select "Format_Zahl" from "Formatiere_Zahl"( :"V_PosRabatt" , NULL , NULL , NULL ) into :"PosRabatt"; "PosRabatt" = :"PosRabatt" ||'%'; if ( :"I_DruckKonfigID" is null or "I_Eltern_ID" is not null ) then -- Wenn nicht gedruckt wird braucht man keine Legende und Kram und nur auf der ersten Ebene exit; -- eine Legende Drucken - asnosnten raus hier "ArtikelText" = ''; "Error" = ' 1 ) then -- Nur MwSt-Saetze in legende einbauen wenn es mehr als einen gibt ! begin if ( (select count( distinct "MwStGr_Staaten_ID") from "AuftrDokument_MwSt_Liste"( :"I_AuftrDokumentID" , 'N' ) A join "MwSt_Saetze" B ON B."MwSt_Saetze_ID" = A."MwStSaetze_ID" join "MwSt_Gruppen" C ON C."MwStGruppen_ID" = B."MwSt_Saetze_Gruppen_ID" ) < 2 ) then begin -- Nur ein Staat unter den MwSt Saetzen. for select "KurzZeichen" ,"Satz" , "MwStGr_FestDokumentSumme" , "MwSt_Gr_Name", "MwStGr_Staaten_ID" from "AuftrDokument_MwSt_Liste"( :"I_AuftrDokumentID" , 'N' ) A join "MwSt_Saetze" B ON B."MwSt_Saetze_ID" = A."MwStSaetze_ID" join "MwSt_Gruppen" C ON C."MwStGruppen_ID" = B."MwSt_Saetze_Gruppen_ID" into :"V_MwSt_KurzZeichen" , :"V_MwSt-Satz" , :"V_PosG-Preis" , :"V_MwStGruppenName" , :"V_Staat" do begin if ( :"V_TempHelpInt" = 0 ) then "V_TempHelpInt" = 1; else "ArtikelText" = "ArtikelText" || :"Error" || 'br="0">,'; if ( :"V_PosG-Preis" is null ) then -- Dann ist es Prozentual und nicht mit Betrag 0 ueberschrieben "ArtikelText" = "ArtikelText" || :"Error" || 'br="0" subsuperscripttype="super">' || :"V_MwSt_KurzZeichen" || '' || :"Error" || iif(:"V_MwSt_KurzZeichen" = '' , 'br="0">' , 'br="0">: ' )|| :"V_MwSt-Satz" || '%'; else "ArtikelText" = "ArtikelText" || :"Error" || 'br="0" subsuperscripttype="super">' || :"V_MwSt_KurzZeichen" || '' || :"Error" || iif(:"V_MwSt_KurzZeichen" = '' , 'br="0">' , 'br="0">: ' )|| :"V_MwStGruppenName" || ''; end end else begin -- Mehr als ein Staat unter den MwSt Saetzen also auch den Staatsnamen des MwSt Satzes zeigen for select "KurzZeichen" ,"Satz" , "MwStGr_FestDokumentSumme" , "MwSt_Gr_Name", "MwStGr_Staaten_ID" from "AuftrDokument_MwSt_Liste"( :"I_AuftrDokumentID" , 'N' ) A join "MwSt_Saetze" B ON B."MwSt_Saetze_ID" = A."MwStSaetze_ID" join "MwSt_Gruppen" C ON C."MwStGruppen_ID" = B."MwSt_Saetze_Gruppen_ID" into :"V_MwSt_KurzZeichen" , :"V_MwSt-Satz" , :"V_PosG-Preis" , :"V_MwStGruppenName" , :"V_Staat" do begin if ( :"V_TempHelpInt" = 0 ) then "V_TempHelpInt" = 1; else "ArtikelText" = "ArtikelText" || :"Error" || 'br="0">, '; -- Hochzahl Doppelpunkt Leerzeichen Prozentsatz Komma Leerzeichen if ( :"V_PosG-Preis" is null ) then -- Dann ist es Prozentual und nicht mit Betrag 0 ueberschrieben "ArtikelText" = "ArtikelText" || :"Error" || 'br="0" subsuperscripttype="super">' || :"V_MwSt_KurzZeichen" || '' || :"Error" || iif(:"V_MwSt_KurzZeichen" = '' , 'br="0">' , 'br="0">: ' )|| :"V_Staat" ||'-'||:"V_MwSt-Satz" || '%'; else "ArtikelText" = "ArtikelText" || :"Error" || 'br="0" subsuperscripttype="super">' || :"V_MwSt_KurzZeichen" || '' || :"Error" || iif(:"V_MwSt_KurzZeichen" = '' , 'br="0">' , 'br="0">: ' )|| :"V_Staat" ||'-'||:"V_MwStGruppenName" || ''; end end end if ( ( select count(*) from "AuftragsDokumentePositionen" A where A."AuftrDokPosi_DokumentID" = :"I_AuftrDokumentID" and A."AuftrDokPosi_Option" = 2 ) > 0 ) then begin -- Unberechnete Position gefunden schauen ob ein A für Alternativ hinterlegt ist ! "V_MwStGruppenName" = RDB$GET_CONTEXT('USER_TRANSACTION', '#Unberechnet_PosZVorPos#' ); if ( :"V_MwStGruppenName" is not null and trim(:"V_MwStGruppenName") != '' ) then begin -- Legende um Alternativtext ergaenzen if ( :"V_TempHelpInt" = 0 ) then "V_TempHelpInt" = 1; else "ArtikelText" = "ArtikelText" || :"Error" || 'br="0">, '; "ArtikelText" = "ArtikelText" || :"Error" || 'br="0" subsuperscripttype="super">' || :"V_MwStGruppenName" || '' || :"Error" || 'br="0">:Alternativ'; end end if ( :"V_DokStdVersandArtID" is not null ) then begin -- Es muss eine Legende fuer die Versandarten ausgegeben werden "V_TempHelpInt" = 1; -- nur damit er unten auch wirklich rein geht for select distinct "AufDokVerArt_StdKuerzel" , "AufDokVerArt_StdName" from "AuftragsDokumentePositionen" A join "AuftragsDokumentVersandArt" B ON B."AuftrDokumVersandArt_ID" = A."AuftrDokPosi_VersandArt" where A."AuftrDokPosi_DokumentID" = :"I_AuftrDokumentID" and A."AuftrDokPosi_VersandArt" is not NULL and A."AuftrDokPosi_VersandArt" != 0 and A."AuftrDokPosi_VersandArt" != :"V_DokStdVersandArtID" and B."AufDokVerArt_StdKuerzel" is not null into :"V_AuftrPosiVersand_KurzZeichen" , :"V_TempVarCharMax" do begin if ( :"ArtikelText" = '' ) then begin "ArtikelText" = :"ArtikelText" || ''|| :"V_AuftrPosiVersand_KurzZeichen" ||':'|| :"V_TempVarCharMax" || ''; end else "ArtikelText" = :"ArtikelText" || ','|| :"V_AuftrPosiVersand_KurzZeichen" ||':'|| :"V_TempVarCharMax" || ''; end end if ( :"V_TempHelpInt" > 0 ) then begin "ArtikelText" = "ArtikelText" || ''; "RowType" = 3; suspend; "V_LastPositionsArt" = :"PositionsArt"; end end ^ SET TERM ; ^ DESCRIBE PARAMETER "StrukturText" PROCEDURE "AuftragsDokumente_Drucken" 'PositionsText=StrukturText+PositionsNr'; DESCRIBE PARAMETER "PositionsNr" PROCEDURE "AuftragsDokumente_Drucken" 'Nur Positionsnummer allein'; DESCRIBE PARAMETER "PositionsStringFormatiert" PROCEDURE "AuftragsDokumente_Drucken" 'Wird als Parameter gebraucht wenn es Strukturen gibt'; DESCRIBE PARAMETER "PosText1" PROCEDURE "AuftragsDokumente_Drucken" 'Erstes Feld der Positionsstruktur zm Drucken rechtsbuendig ausgerichtet'; DESCRIBE PARAMETER "PosText2" PROCEDURE "AuftragsDokumente_Drucken" 'Zweites Feld der Positionsstruktur zm Drucken linksbuendig ausgerichtet'; DESCRIBE PARAMETER "VMenge" PROCEDURE "AuftragsDokumente_Drucken" 'Vorkommaanteil'; DESCRIBE PARAMETER "NMenge" PROCEDURE "AuftragsDokumente_Drucken" 'Nachkommaanteil Menge mit Komma'; DESCRIBE PARAMETER "Artikelnummer" PROCEDURE "AuftragsDokumente_Drucken" 'Feld Artikelnr. + evtl. ein Sternchen was auf ArtikelTZextGeaendert hinweist'; DESCRIBE PARAMETER "Preiseinheit" PROCEDURE "AuftragsDokumente_Drucken" '"Einheiten"."Einh_Drucken" domain vor Aenderung jetzt wird durch die Ergaenzung der Inhaltsmenge mehr platz benoetigt'; DESCRIBE PARAMETER "ExtraAbstandEinfuegen" PROCEDURE "AuftragsDokumente_Drucken" 'DB-Null bedeutet Abstand in hoehe von kleinem "x" und bei allen anderen Werten in mm nach der Position einfuegen'; DESCRIBE PARAMETER "Pos_GPreis_StruktPreis" PROCEDURE "AuftragsDokumente_Drucken" 'Gibt den ein oder anderen GesPreis aus je nachdem ob es eine Position oder Struktur ist'; /* Restore proc. body: AuftragsDokumente_Drucken_old */ SET TERM ^ ; ALTER PROCEDURE "AuftragsDokumente_Drucken_old"("I_AuftrDokumentID" INTEGER, "I_DruckKonfigID" INTEGER, "I_Eltern_ID" INTEGER, "I_PositionsString" "d_str50", "I_NurDieseEbene" D_BOOLEAN_YN, "I_NettoPreise" D_BOOLEAN_YN, "I_MwSt_Kurzform" D_BOOLEAN_YN, "I_Format" "d_str10", "I_Format_PosText" "d_str40", "I_Format_G-Preis" "d_str20", "I_Format_E-Preis" "d_str20", "I_Format_Menge" "d_str20", "I_Warnings" D_BOOLEAN_YN, "I_Commands" TYPE OF COLUMN "DruckJobs"."DrJob_Commands", "I_Int_Help" INTEGER, "I_BigInt_Help" BIGINT, "I_Varchar_Help" "d_str512", "I_Zeile" INTEGER) RETURNS("PositionsArt" INTEGER, "StrukturText" "d_str50", "PositionsNr" INTEGER, "PositionsStringFormatiert" "d_str60", "PosText1" "d_str10", "PosText2" "d_str60", "RAuftrDokStruktur_ID" INTEGER, "RAuftragsDokumentePositionen_ID" GENERATOR_VALUE, "VMenge" "d_str20", "NMenge" "d_str10", "MengeGeliefert" "d_str20", "MengeRueckstand" "d_str20", "ArtikelText" "d_strMax", "ArtikelBlobText" BLOB SUB_TYPE 1 SEGMENT SIZE 8192, "KurztextAnzAbsaetze" INTEGER, "Artikelnummer" VARCHAR(31), "EAN_Code" GENERATOR_VALUE, "E-Preis" "d_str20", "G-Preis" "d_str20", "Preiseinheit" "d_str30", "MwSt_Satz" "d_str10", "TexgenCommand" "d_str30", "HintergrundFarbe" VARCHAR(6), "Warnings" "d_str320", "CZeileFett" VARCHAR(1), "CZeileItalic" VARCHAR(1), "CgesPreisFett" VARCHAR(1), "CgesPreisUnterstreichen" VARCHAR(1), "CgesPreisDoppeltUnterstreichen" VARCHAR(1), "ZeilenNr" INTEGER, "RowType" INTEGER, "ExtraAbstandEinfuegen" INTEGER, "PosRabatt" "d_str10", "Pos_GPreis_StruktPreis" "Geld") AS declare variable "V_AuftragsDokumentePositionenID" GENERATOR_VALUE; declare variable "V_AuftrDokStrukturID" integer; declare variable "V_AuftrDokPos" integer; declare variable "V_AuftrDokPosText" "PositionsNrText"; declare variable "V_StrukturID" integer; declare variable "V_Option" integer; declare variable "V_Kurztext" integer; declare variable "V_PositionsArt" integer; declare variable "V_LastPositionsArt" integer; /* Welche Positionsart vor dieser war */ declare variable "V_Position" integer; declare variable "V_StrukturPos" varchar(5); declare variable "V_Struktur_Summe" "Geld"; declare variable "V_AuftrDokStruktur_SummeDrucken" "D_BOOLEAN_YNNull"; declare variable "V_Struktur_FettDrucken" "D_BOOLEAN_YNNull"; declare variable "V_Struktur_InAuflistung" "D_BOOLEAN_YNNull"; declare variable "V_Struktur_PreiseAusbl" "D_BOOLEAN_YNNull"; declare variable "V_OldStruktur_PreiseAusbl" "D_BOOLEAN_YNNull"; declare variable "V_CursorEmpty" integer = 0; declare variable "V_Positionen_ArtikelText" type of column "AuftrDokum_TextArtenSprachen"."ADTAS_Text"; /* "AuftrDokum_TextArtenSprachen"."ADTAS_Text" evtl. kommt noch Text dazu durch ergaenzungen also von Hand etwas mehr definieren */ declare variable "V_Struktur_ArtikelText" type of column "AuftragsDokumentStruktur"."AuftrDokStruktur_Text"; declare variable "V_LangText" "d_BLOB_XML_RTF"; declare variable "V_LangTextHTML" "d_BLOB_HTML"; declare variable "V_PosG-Preis" "Geld_genau"; declare variable "V_PosG-PreisOhneRabatt" "Geld_genau"; declare variable "V_MwSt-Satz" "MwSt_Satz"; declare variable "V_Waehrung" "d_str20"; declare variable "V_EAN-Code" type of column "Artikel"."Art_EAN_Code"; declare variable "V_MengeDokument" "Mengen"; /* Mengenangabe wie sie im Dokument angegeben wurde. */ declare variable "V_Zeile" integer; declare variable "V_CountMwSt_Saetze" integer; /* Anzahl MwSt Positionen. */ declare variable "V_MwSt_KurzZeichen" varchar(1) character set ISO8859_1; declare variable "V_Artikelnummer" varchar(30); declare variable "V_EigeneArtikelNr" varchar(30); /* Bei Lieferanten Einkaufsdikumenten die Eigene Artikelnummer */ declare variable "V_TempGP_ID" integer; declare variable "V_Temp_AnschID" bigint; declare variable "V_Temp_ASP" integer; declare variable "V_AuftrDokumentArt" integer; declare variable "V_TempHelpInt" integer; declare variable "V_PreisEinheit" "d_str30"; /* "Einheiten"."Einh_Drucken" domain vor Aenderung jetzt wird durch die Ergaenzung der Inhaltsmenge mehr platz benoetigt */ declare variable "V_VPE_Inhalts_Menge" "Mengen"; declare variable "V_MengeAnzNachkommastellen" integer; declare variable "CKeinUmbruchDanach" char(1) = 'N'; declare variable "P_HiddenHide" integer; declare variable "P_MarkChangedArticle" integer; declare variable "Error" "d_str512"; declare variable "V_Staat" type of column "Staaten"."Postkuerzel"; declare variable "V_MwStGruppenName" type of column "MwSt_Gruppen"."MwSt_Gr_Name"; declare variable "V_PosRabatt" "d_str10"; declare variable "V_OldRowType" integer; declare variable "V_AuftrDokBruttoPreise" D_BOOLEAN_YN; declare variable "V_Von_GP_ID" integer; declare variable "V_Fuer_GP_ID" integer; declare variable "V_Fuer_AnschID" bigint; declare variable "V_Fuer_Asp" integer; declare variable "V_Liefer_GP_ID" integer; declare variable "V_Liefer_AnschID" bigint; declare variable "V_Liefer_Asp" integer; declare variable "V_TempVarCharMax" "d_strMax"; declare variable "V_TempInt" integer; declare variable "V_EigenschaftenText" "d_str512"; declare variable "V_DokStdVersandArtID" integer; /* Die im Dokument angegeben standard Versandart */ declare variable "V_AuftragPositionVersandArtID" integer; /* Die evtl. vorhandne Versandart der Position */ declare variable "V_AuftrPosiVersand_KurzZeichen" type of column "AuftragsDokumentVersandArt"."AufDokVerArt_StdKuerzel"; declare "Struktur" cursor for ( select "AuftrDokStruktur_ID", "AuftrDokStruktur_Position", "AuftrDokStruktur_Text", "AuftrDokStruktur_Summe", "AuftrDokStruktur_SummeDrucken", "AuftrDokStruktur_FettDrucken", "AuftrDokStruktur_PreiseAusbl", "AuftrDokStruktur_InAuflistung" from "AuftragsDokumentStruktur" where "AuftrDokStruktur_Dokument_ID" = :"I_AuftrDokumentID" and "AuftrDokStruktur_ElternID" is not distinct from :"I_Eltern_ID" /* Diese code wird durch "is not distinct from" abgeloest where (cast(:"Eltern_ID" as integer) is null and "AuftrDokStruktur_ElternID" is null) or (cast(:"Eltern_ID" as integer) is not null and "AuftrDokStruktur_ElternID" = :"Eltern_ID") */ order by "AuftrDokStruktur_Position"); begin -- RowType == 0 nornmale Tabellenzeile /* ACHTUNG RowType 1 und 2 sind sehr gefährlich ( funktionieren nicht wie sie sollen ) Der Text nimmt nicht die Beite ein die er einnehmen soll sondern bricht schon vorher um. Das sieht natuerlich sehr bloed aus. RowType == 1 Tabellenzeile mit wenig multicolumn RowType == 2 Tabellenzeile mit viel multicolumn */ -- RowType == 3 MultiColumn Zeile fuer Summenzeilem am ende des Dokuments. Die Zeile darf/wird nicht UMGEBROCHEN sie muss passen !!!! -- RowType == 4 keinen Tabellentext ( Leerzeile ) -- RowType == 5 horizontale Linie -- RowType == 6 Seitenumbruch -- RowType == 7 Zusammenhaegender Bereich ohne Seitenumbruch ANFANG - Feld "ArtikelText" = 'bezeichner' ( bezeichner nur kleinbuchstaben ) -- RowType == 8 Zusammenhaegender Bereich ohne Seitenumbruch ENDE - Feld "ArtikelText" = 'bezeichner' ( bezeichner nur kleinbuchstaben ) --ExtraAbstandEinfuegen: DB-Null kein Abstand einfuegen / 0 = 1ex Abstand einfuegen / > 0 = Abstand in mm anhaengen / < 0 mm zurueck aber selber bloed wer macht --CZeileFett --CZeileItalic --CgesPreisFett --CgesPreisUnterstreichen --CgesPreisDoppeltUnterstreichen -- Parameter fuer "I_Commands" -- #HiddenHide# verbirgt alle als versteckt gekennzeichneten Zeilen -- #RealDokNr# gibt immer die richtige Dokumentnr. und nicht evtl. den Text "Dokumentvorschau" zurueck. wird in SP "AuftragDokument-Parameter" verwendet -- Folgende Parameter am 21.03.2013 zum Einbauen mit vorgesehen. -- #LieferAnschriftVerwenden# -- Wenn eine abweichende Lieferanschrift vorhanden ist wird diese Verwendet und die beiden Anschriftenfelder auf dem Dokument vertauscht. -- #KeineZweitAnschrift# -- Das zweite Adressfeld im Dokument wird auf jeden Fall leer gelassen /* ################## A C H T U N G ################ Daran denken das man die fuer_AnschID auch mit der Liefer_AnschID wechseln können muß. Zusätzlich ist jetzt noch der Asp. anwählbar ob er mit gedruckt werden soll. */ -- "P_HiddenHide" = coalesce( position( '#HiddenHide#' , :"I_Commands" ),0); "P_MarkChangedArticle" = coalesce( position( '#MarkChangedArticle#' , :"I_Commands" ),0); -- -- ACHTUNG immer darauf achten das die Summen des Dokument berechnet wurden. -- sonst werden alte Summen gedruckt. Kann hier nicht gut geprueft werden -- da auch Joins mit der SP gemacht werden und die gleich maulen oder -- andauernd Preise berechnet werden. -- Evtl. mal was anderes ueberlegen. if ( trim("I_PositionsString") = '') then "I_PositionsString" = NULL; "V_Position" = 1; if (:"I_Zeile" is null ) then "ZeilenNr" = 0; -- Wird unten schon bei der ersten Zeile +1 genommen else "ZeilenNr" = :"I_Zeile"; -- Wird unten schon bei ser ersten Zeile +1 genommen if ( :"I_Commands" is distinct from 'HelperFuntctionIsRunning' ) then -- Wird benutzt um die letzte Position im Dokument zu finden um den Summenstart RowType 7 zu senden. begin if ( :"I_Eltern_ID" is null ) then -- Nur auf der ertsen ebene einmal aufrufen evtl. eine Contextvariable setzen, begin -- damit man auch einzelne Ebenen drucken kann. RDB$SET_CONTEXT('USER_TRANSACTION', 'CV_LastPositionID', NULL); RDB$SET_CONTEXT('USER_TRANSACTION', 'CV_LastPositionID', (select "O_LastPositionID" from "AuftrDokDruck_HelperFunction"( 'PositionsStringFormat' , :"I_AuftrDokumentID" , NULL , NULL , NULL ))); -- Anzahl Positionen von MwSt saetzen ermitteln wenn wir hier auf der Strukturebene NULL sind select count(*) from "AuftragsDokumentePositionen" where "AuftrDokPosi_DokumentID" = :"I_AuftrDokumentID" and "AuftrDokPosi_Art" = 300 into :"V_CountMwSt_Saetze"; -- ######################## Start setzte Contextvariablen ################################# -- Zuerst alle benutzten Contextvariablen auf NULL setzen sonst evtl. Fehler die nicht nachvollziehbar sind ! RDB$SET_CONTEXT('USER_TRANSACTION', '#GPID#', NULL ); RDB$SET_CONTEXT('USER_TRANSACTION', '#KDNR#', NULL ); RDB$SET_CONTEXT('USER_TRANSACTION', '#LRNR#', NULL ); RDB$SET_CONTEXT('USER_TRANSACTION', '#LieferantenNr#', NULL ); RDB$SET_CONTEXT('USER_TRANSACTION', '#Unberechnet_PosZVorPos#' , NULL); -- Text der vor die Positionsangabe gestellt wird wenn die Option Unberechnet gesetzt ist. RDB$SET_CONTEXT('USER_TRANSACTION', '#Adr1_GP_ID#' ,NULL ); RDB$SET_CONTEXT('USER_TRANSACTION', '#Adr1_AnschID#' ,NULL ); RDB$SET_CONTEXT('USER_TRANSACTION', '#Adr1_AspID#' , NULL ); RDB$SET_CONTEXT('USER_TRANSACTION', '#Adr2_GP_ID#' ,NULL ); RDB$SET_CONTEXT('USER_TRANSACTION', '#Adr2_AnschID#' , NULL ); RDB$SET_CONTEXT('USER_TRANSACTION', '#Adr2_AspID#' , NULL ); RDB$SET_CONTEXT('USER_TRANSACTION', '#Adr2_Anmerkung#' , NULL ); --Umgebungsvariablen setzen -- #GPID#/'#KDNR#' und '#LieferantenNr#' beziehen sich immer auf den Empfaenger RDB$SET_CONTEXT('USER_TRANSACTION', '#GPID#', ( select "Text" from "AuftragDokument-Parameter"( 'GPID' , :"I_AuftrDokumentID" , NULL , NULL , NULL , NULL , NULL , :"I_Commands" ))); RDB$SET_CONTEXT('USER_TRANSACTION', '#KDNR#', ( select "Text" from "AuftragDokument-Parameter"( 'KDNR' , :"I_AuftrDokumentID" , NULL , NULL , NULL , NULL , NULL , :"I_Commands" ))); RDB$SET_CONTEXT('USER_TRANSACTION', '#LieferantenNr#', ( select "Text" from "AuftragDokument-Parameter"( 'LieferantenNr' , :"I_AuftrDokumentID" , NULL , NULL , NULL , NULL , NULL , :"I_Commands" ))); -- Das Staatenkuerzel des Empfaengers ermitteln. ACHTUNG AnschID benutzen da eine bestimmte Anschrift im Dokument gewaehltr werden kann. rdb$set_context( 'USER_TRANSACTION' , '#ABSENDER_STAAT#' , ( select "PLZ_Postkuerzel" from "AuftragsDokumente" A join "Anschriften" B ON B.anschriften_id = A."AuftrDokument_von_AnschID" join PLZ C ON C.plz_id = B.a_plz_id where A."AuftrDokument_ID" = :"I_AuftrDokumentID" )); select coalesce( "AuftrDokument_VersandArt",0) , "AuftrDokument_Art" , "AuftrDokument_BruttoPreise" , "AuftrDokument_von_GP_ID" , coalesce( b.adaz_gp_id , "AuftrDokument_fuer_GP_ID" ) , coalesce( b."ADAZ_GP_AnschID" , "AuftrDokument_fuer_AnschID" ), iif ( b.adaz_gp_id is null , iif ( "AuftrDokument_FuerAspInAnschr" is distinct from 'N' , "AuftrDokument_fuer_ASP" , NULL) , iif ( b."ADAZ_AspInAnschrYN" is distinct from 'N' , b."ADAZ_Asp_ID" , NULL )) from "AuftragsDokumente" A left outer join "AuftragsDokumenteAnschrZuordnun" B on A."AuftrDokument_ID" = b."ADAZ_AuftrDokument_ID" and a."AuftrDokument_von_GP_ID" = b."ADAZ_VonGP_ID" and a."AuftrDokument_Art" = b."ADAZ_AuftrDokumentArt" and b."ADAZ_KopieEmpfaenger" in ( 0 ,1 ) -- = 0 Originalempfaenger mit GP-Daten / 1 = andere Anschrift aber GP-DAten bleiben gleich >= 10 Kopie empfaenger where A."AuftrDokument_ID" = :"I_AuftrDokumentID" into :"V_DokStdVersandArtID" , :"V_AuftrDokumentArt" , :"V_AuftrDokBruttoPreise" ,:"V_Von_GP_ID" , :"V_Fuer_GP_ID" , :"V_Fuer_AnschID" , :"V_Fuer_Asp"; -- :"V_DokStdVersandArtID" ist jetzt auf jeden Fall nicht mehr NULL unten wird jetzt auf NULL gesetzt wenn alle Positionen der einen StandardVersandart entsprechen. if ( not exists ( select * from "AuftragsDokumentePositionen" A where A."AuftrDokPosi_DokumentID" = :"I_AuftrDokumentID" and A."AuftrDokPosi_VersandArt" is not NULL and A."AuftrDokPosi_VersandArt" != 0 and A."AuftrDokPosi_VersandArt" != :"V_DokStdVersandArtID" ) ) then "V_DokStdVersandArtID" = NULL; -- Null zeigt an das nichts gemacht werden muss if ( :"I_DruckKonfigID" is not null ) then -- Nur machen wenn gedruckt wird begin if ( rdb$get_context( 'USER_TRANSACTION', '#Unberechnet_PosZVorPos#' ) is null ) then -- Text der vor die Positionsangabe gestellt wird wenn die Option Unberechnet gesetzt ist. -- Die Folgende Abfrage ist sehr komplieziert wegen den Unterabfragen Sie soll das kurzzeichen ermitteln wenn eine StammdatenVerID vorhanden ist nimmt sie die erste Abfrage -- ansonsten versucht sucht sie auch ueber aktStammdaten das zeichen zu finden aber nur wenn StammdatenVerID im Dokument nich gesetzt ist. RDB$SET_CONTEXT('USER_TRANSACTION', '#Unberechnet_PosZVorPos#' , ( select coalesce( ( select "StDaten_Unberechnet_PosZVorPos" from "AuftragsDokumente" A join "Stammdaten" B ON B."Stammdaten_VerID" = (select "AuftrDokument_StamDatenVerID" from "AuftragsDokumente" where "AuftrDokument_ID" = :"I_AuftrDokumentID" ) and B."StammD_Gesch_Partner_ID" = A."AuftrDokument_von_GP_ID" where A."AuftrDokument_ID" = :"I_AuftrDokumentID" ) , ( select "StDaten_Unberechnet_PosZVorPos" from "AKT_Stammdaten" A join "Stammdaten" B ON B."Stammdaten_VerID" = A."Akt_Stammdaten_VerID" and B."StammD_Gesch_Partner_ID" = (select "AuftrDokument_von_GP_ID" from "AuftragsDokumente" where "AuftrDokument_ID" = :"I_AuftrDokumentID" and "AuftrDokument_StamDatenVerID" is null ) )) from "GetOneResultRow" )); RDB$SET_CONTEXT('USER_TRANSACTION', 'CV_KeinSeitenumbruchBisBruttoSum' , 0 ); -- 'CV_KeinSeitenumbruchBisBruttoSum' auf 0 setzen um inaktiv anzuzeigen end /* Contextvariablen fuer die Anschriftenfelder setzen. Adresse1 = Im sichfenster des Couverts Adresse2 = Zweitadresse z.B. Lieferadresse wird irgendwo unterhal aufgelistet. */ RDB$SET_CONTEXT('USER_TRANSACTION', '#Adr1_GP_ID#' , :"V_Fuer_GP_ID" ); RDB$SET_CONTEXT('USER_TRANSACTION', '#Adr1_AnschID#' , :"V_Fuer_AnschID" ); RDB$SET_CONTEXT('USER_TRANSACTION', '#Adr1_AspID#' , :"V_Fuer_Asp" ); "V_TempInt" = NULL; if ( :"V_AuftrDokumentArt" <= 300 ) then -- Die angegeben Lieferanschrift nutzen. "V_TempInt" = :"I_AuftrDokumentID"; else if ( :"V_AuftrDokumentArt" = 400 ) then -- Die in der AB angegebene Lieferanschrift nutzen "V_TempInt" = ( select "vonAuftragDokumentID" from "AuftrDokument_UniqueDocSource"( :"I_AuftrDokumentID" , 200 )); if ( :"V_TempInt" is not null ) then begin select b.adaz_gp_id , b."ADAZ_GP_AnschID" , iif ( b."ADAZ_AspInAnschrYN" is not distinct from 'Y' , b."ADAZ_Asp_ID" , null ), B."ADAZ_Anmerkung" from "AuftragsDokumenteAnschrZuordnun" B where b."ADAZ_AuftrDokument_ID" = :"V_TempInt" and b."ADAZ_VonGP_ID" = :"V_Von_GP_ID" and b."ADAZ_AuftrDokumentArt" = 300 -- 300 Lieferscheine and b."ADAZ_KopieEmpfaenger" in ( 0,1) -- 0 originalempfaenger / 1 = andere Anschrift fuer Leferscheine into :"V_Liefer_GP_ID" , :"V_Liefer_AnschID" , :"V_Liefer_Asp" , :"V_TempVarCharMax"; if ( :"V_Liefer_GP_ID" is not null ) then begin RDB$SET_CONTEXT('USER_TRANSACTION', '#Adr2_AnschText#' , 'Lieferanschrift:'); RDB$SET_CONTEXT('USER_TRANSACTION', '#Adr2_GP_ID#' , :"V_Liefer_GP_ID" ); RDB$SET_CONTEXT('USER_TRANSACTION', '#Adr2_AnschID#' , :"V_Liefer_AnschID" ); RDB$SET_CONTEXT('USER_TRANSACTION', '#Adr2_AspID#' , :"V_Liefer_Asp" ); RDB$SET_CONTEXT('USER_TRANSACTION', '#Adr2_Anmerkung#' , :"V_TempVarCharMax" ); end end -- ######################## Ende setzte Contextvariablen ################################# -- Dokumentetxte sollten am ende erezugt werden wenn alle Parameter schon gesetzt sind. if ( :"I_DruckKonfigID" is not null ) then begin "Error" = (select "Error" from "AuftrDokument_TexteErzeugen"( 'TextVorArtikelTabelle' , :"I_AuftrDokumentID" , :"I_DruckKonfigID" , :"I_Format" , :"I_Commands" , NULL , 0 )); "Error" = (select "Error" from "AuftrDokument_TexteErzeugen"( 'TextNachArtikelTabelle' , :"I_AuftrDokumentID" , :"I_DruckKonfigID" , :"I_Format" , :"I_Commands" , NULL ,0 )); end -- Anzahl benoetigter Nachkommastellen fuer die Mengenspalte ermitteln -- 0 = Keine , 1 = eine usw. -1 = Fehler <-- Sollte hier nie vorkommen koennen bei Menge = numeric(X,3) "V_MengeAnzNachkommastellen" = ( select iif( count(*) = SUM(A) , 0 , iif( count(*) = SUM(B) ,1, IIF( count(*) = SUM(C) ,2, iif( count(*) = SUM(D) , 3, -1 )))) from ( select iif( "AuftrDokPosi_Menge" = round( "AuftrDokPosi_Menge" ,0) , 1 , 0) , iif( "AuftrDokPosi_Menge" = round( "AuftrDokPosi_Menge" ,1) , 1 , 0) , iif( "AuftrDokPosi_Menge" = round( "AuftrDokPosi_Menge" ,2) , 1 , 0) , iif( "AuftrDokPosi_Menge" = round( "AuftrDokPosi_Menge" ,3) , 1 , 0) from "AuftragsDokumentePositionen" A Where "AuftrDokPosi_DokumentID" = :"I_AuftrDokumentID" and "AuftrDokPosi_Menge" is not null) AS DT ( A , B , C , D)); end end open "Struktur"; fetch "Struktur" into :"V_StrukturID" , :"V_StrukturPos" , :"V_Struktur_ArtikelText" , :"V_Struktur_Summe" , :"V_AuftrDokStruktur_SummeDrucken" , :"V_Struktur_FettDrucken" , :"V_Struktur_PreiseAusbl" , :"V_Struktur_InAuflistung"; if ( row_count = 0 ) then "V_CursorEmpty" = 1; for select "AuftrDokPosi_Option" , "AuftrDokPosi_Kurztext" , "AuftrDokPosi_Art" , "AuftragsDokumentePositionen_ID" , "AuftrDokPosi_PositionsText" , "AuftrDokPosi_Position" , case when ( a."AuftrDokPosi_Art" = 1 ) then f."ATAS_Text" else E."ADTAS_Text" end , case when ( a."AuftrDokPosi_Art" = 1 ) then f."ATAS_LangText" else E."ADTAS_LangText" end , case when ( a."AuftrDokPosi_Art" = 1 ) then f."ATAS_LangTextHTML" else E."ADTAS_LangTextHTML" end , "AuftrDokPosi_Menge", "AuftrDokPosi_PosGPreis", ( "AuftrDokPosi_GPreis" + coalesce( "AuftrDokPosi_ArtikeOptionsPreis" * "AuftrDokPosi_Menge" , 0 ) ), -- Positions ges. Preis ohne Rabatt "AuftrDokPosi_PositionsRabatt" , "MwStKz" , trim(b."Art_Artikelnr" ||' '|| coalesce(b."Art_Revision",'')) , "Einh_Drucken" , b."Art_VPE_Inhalts_Menge" , iif( i."Art_Artikelnr" is not distinct from b."Art_Artikelnr" , NULL , i."Art_Artikelnr" ) -- Die eigene Artikelnr nur einschreiben wenn sie von der oben abweicht , iif( B."Artikel_ID" is null or not :"V_AuftrDokumentArt" between 1 and 400 , '' , ( select ascii_char(10)||'( '||"EigenschaftenText"||' )' from "ArtikelEigenschaften_TexteWerte"( b."Artikel_ID" , NULL)) ) -- Nur eine "AuftrDokPosi_VersandArt" schreiben wenn es nicht die Standardart ist und wenn sie > 0 ist ( also eine Legende erzeugt werden muss ) , iif( :"V_DokStdVersandArtID" is not null and "AuftrDokPosi_VersandArt" > 0 and "AuftrDokPosi_VersandArt" != :"V_DokStdVersandArtID" , "AuftrDokPosi_VersandArt" , NULL ) from "AuftragsDokumentePositionen" A left outer join "Artikel" B ON A."AuftrDokPosi_Artikel_ID" = B."Artikel_ID" and a."AuftrDokPosi_ArtikelVersion" = b."Artikel_Version" join ( select "MwStSaetze_ID", "KurzZeichen" from "AuftrDokument_MwSt_Liste"( :"I_AuftrDokumentID" , 'Y' ) F ) AS DTAB ( "MSaetze_ID" , "MwStKz" ) ON A."AuftrDokPosi_MwStSaetze_ID" = "MSaetze_ID" -- Achtung keinen Left Outer Join draus machen kostet enorm performance und ist nicht noetig join "Einheiten" D ON A."AuftrDokPosi_PreisEinheit" = D."Einheiten_ID" -- Left outer join sollte nicht noetig sein da Preiseinheit ein NOT NULL Feld ist. left outer join "AuftrDokum_TextArtenSprachen" E ON A."AuftragsDokumentePositionen_ID" = E."ADTAS_AuftrDokumentPositionenID" and E."ADTAS_SprachenID" = 1 and E."ADTAS_TextArtID" = 1 left outer join "ArtikelTextArtenSprachen" F On E."ADTAS_ArtikelTextArtSprachenID" = F."ArtikelTextArtenSprachenID" left outer join "AuftragDokumentPosition_Einkauf" h ON A."AuftragsDokumentePositionen_ID" = H."AuftragsDokumentePositionenE_ID" left outer join "Artikel" I ON H."AuftrDokPosiEk_Artikel_ID" = i."Artikel_ID" and h."AuftrDokPosiEk_ArtikelVersion" = i."Artikel_Version" -- Nachfolgende Joins funktionieren nicht korrekt ganz vorsichtig falls aenderungen noetig werden. -- "MwStKz" oben im Select benutzen sonst kommt immer noch der dummyeintrag durch -- Wenn anstatt des Dummy Eintrags mit PK=0 ein DB-Null benutzt wird und hierein Left Outer Join gesetzt wird geht die permormance extrem in dem Keller 3000 Positionen 1 minute und mit dem hier 2 sekunden -- Habe alles probiert aber so funktioniert es einfach am besten auch wenn der Dummy Eintrag benoetigt wird -- join "AuftrDokument_MwSt_Liste"( :"I_AuftrDokumentID" , 'Y' ) C ON A."AuftrDokPosi_MwStSaetze_ID" = C."MwStSaetze_ID" -- Achtung keinen Left Outer Join draus machen kostet enorm performance und ist nicht noetig where "AuftrDokPosi_DokumentID" = :"I_AuftrDokumentID" and "AuftrDokPosi_DokStrukturID" is not distinct from :"I_Eltern_ID" and "AuftrDokPosi_Position" >= 0 and "AuftrDokPosi_Art" not in ( 110 ) -- 110 = Zwischensumme start ( sonst gibt es eine Leerzeile ) order by "AuftrDokPosi_Position" into :"V_Option" , :"V_Kurztext" , :"V_PositionsArt" , :"V_AuftragsDokumentePositionenID" , :"V_AuftrDokPosText" , :"V_AuftrDokPos" , :"V_Positionen_ArtikelText" , :"V_LangText" , :"V_LangTextHTML" , :"V_MengeDokument" , :"V_PosG-Preis" , :"V_PosG-PreisOhneRabatt" , :"V_PosRabatt" , :"V_MwSt_KurzZeichen" , :"V_Artikelnummer" , :"V_PreisEinheit" , :"V_VPE_Inhalts_Menge" , :"V_EigeneArtikelNr" , :"V_EigenschaftenText" , :"V_AuftragPositionVersandArtID" do begin -- Aenderung vom 26.02.2014 if ( :"V_AuftrDokumentArt" > 10000 and :"V_VPE_Inhalts_Menge" > 1 ) then begin if ( cast( :"V_VPE_Inhalts_Menge" as integer) = :"V_VPE_Inhalts_Menge" ) then "V_PreisEinheit" = '(à'||cast(:"V_VPE_Inhalts_Menge" as integer)||' '||:"V_PreisEinheit"||')'; else if( :"V_VPE_Inhalts_Menge" = round( :"V_VPE_Inhalts_Menge" ,1) ) then "V_PreisEinheit" = '(à'||round(:"V_VPE_Inhalts_Menge",1)||' '||:"V_PreisEinheit"||')'; else if( :"V_VPE_Inhalts_Menge" = round( :"V_VPE_Inhalts_Menge" ,2) ) then "V_PreisEinheit" = '(à'||round(:"V_VPE_Inhalts_Menge",2)||' '||:"V_PreisEinheit"||')'; else "V_PreisEinheit" = '(à'||:"V_VPE_Inhalts_Menge"||' '||:"V_PreisEinheit"||')'; -- "V_Positionen_ArtikelText" = 'à('||:"V_VPE_Inhalts_Menge"||' Stück )'||ascii_char(29) || :"V_Positionen_ArtikelText" || ascii_char(29)|| 'à(100 Stück )'; end if ( :"V_EigeneArtikelNr" is not null ) then begin if ( :"V_LangText" is null ) then "V_LangText" = iif( :"V_Positionen_ArtikelText" is null , :"V_EigeneArtikelNr", :"V_Positionen_ArtikelText"||' ' || ascii_char(29)||ascii_char(10)|| :"V_EigeneArtikelNr"); else begin -- Im Blob steht schon was drinn if ( :"V_Positionen_ArtikelText" is null ) then "V_LangText" = :"V_LangText" ||' '|| ascii_char(29)||ascii_char(10)|| :"V_EigeneArtikelNr"; else -- Es hat wohl in beiden Feldern etwas gestanden ( Sollte momentan niemals passieren evtl. ignorieren ) "V_LangText" = :"V_Positionen_ArtikelText"||' ' || ascii_char(29) || ' '|| :"V_LangText" || ' '||ascii_char(29)||ascii_char(10)|| :"V_EigeneArtikelNr"; end "V_Positionen_ArtikelText" = NULL; -- Wenn es in das normale Textfeld passt kopiert er es unten eh dort rein. end -- Ene Aenderung vom 26.02.2014 -- Alle Ausgabeparameter zuruecksetzen "PosText1" = null ; "PosText2" = NULL ;"PositionsArt" =NULL ; "StrukturText" = :"I_PositionsString"; "PositionsNr" = NULL ; "RAuftrDokStruktur_ID" = NULL; "RAuftragsDokumentePositionen_ID" = NULL;"VMenge" = NULL;"NMenge" = NULL; "MengeGeliefert" = NULL;"MengeRueckstand" = NULL;"ArtikelBlobText" = NULL;"ArtikelText" = NULL ; "KurztextAnzAbsaetze" = NULL ;"Artikelnummer" = NULL;"EAN_Code" = NULL;"E-Preis" = NULL;"G-Preis" = NULL;"Preiseinheit" = NULL;"MwSt_Satz" = NULL;"TexgenCommand" = NULL; "CZeileFett" = NULL ; "CZeileItalic" = NULL ; "CgesPreisFett" = NULL ; "CgesPreisUnterstreichen" = NULL ; "CgesPreisDoppeltUnterstreichen" = NULL ; "RowType" = 0 ; "PosRabatt" = NULL; "ExtraAbstandEinfuegen" = NULL ; if ( :"I_Format" = 'HTML' ) then -- Momentan wird nur HTML beruecksichtigt "V_LangText" = :"V_LangTextHTML"; -- bis zum 17.01.2012 war dies die WHILE Bedingung: or :"V_Position" is not null <--- ist sehr bloed da es nie NULL ist -- while(:"V_CursorEmpty" = 0 and ( :"V_PositionsArt" < 100 or :"V_Position" is not null ) and :"V_Position" >= :"V_StrukturPos" ) -- Bis auf Art = 400 sind alle Arten zwischen 300 und 9.999 nur in Ebene 0 erlaubt deshalb auch nach unten durchreichen wenn vor der 9.999 evtl. noch was anders gebraucht wird das hier anpassen. -- Evtl. die Summenpositionen in der SP Funktion NeuNummerieren auch ans Ende sortieren lassen -- sollte doch machbar sein evtl. ein kuenstliches Feld sortindex von der PositionsArt ableiten mit vorrang vor allem while (:"V_CursorEmpty" = 0 -- Es gibt noch Strulturpositionen = 0 wenn =1 keine mehr vorhanden and (( :"V_PositionsArt" < 100 and :"V_Position" >= :"V_StrukturPos" ) -- Die Strukturposition vorrangig in das Dokument einreihen. or :"V_PositionsArt" between 300 and 9999 -- Summenpositionen gehoeren ans Ende und dorthin werden sie auch durchgereicht. or :"V_PositionsArt" = 104 -- PosArt 104 = Strukturposition hier einfuegen ( also ganz expliziet gewuenscht vom Benutzer) or :"V_PositionsArt" = 102 )) -- 102 Horizontale Linie macht am Anfang der Seite keinen Sinn also Strukturen einsortieren. do -- 102 Ist auch Problematisch bei den Endsummen vor die man diese Linie setzen kann dann gibt es evtl. Fehler also unbedingt drinn lassen !!! begin -- Immer wenn eine Struktur einsortiert werden muss. Hat Vorrang vor Positionen -- !!!ACHTUNG !!! START -- Bereich der nach unten kopiert werden muss wenn etwas geaendert wird. "ArtikelBlobText" = NULL; "RAuftrDokStruktur_ID" = :"V_StrukturID"; "RAuftragsDokumentePositionen_ID" = NULL; "ArtikelText" = "V_Struktur_ArtikelText"; "PositionsArt" = 99; -- 99 = Strukturtext "HintergrundFarbe" = 'FFFFFF'; "ZeilenNr" = "ZeilenNr" + 1; "PositionsNr" = -:"V_Position"; if ( "I_PositionsString" is null ) then "StrukturText" = :"V_Position" ; else "StrukturText" = :"I_PositionsString" || '.' || :"V_Position" ; -- Neues Schema fuer die Positonsstruktur (3xIn diser SP vorhanden muss immer genau gleich sein )mit "PosText1" und "PosText2" zusammenbauen "V_TempHelpInt" = position( '.' , :"StrukturText" ); if ( :"V_TempHelpInt" = 0 ) then begin "PosText1" = :"StrukturText"; end else begin "PosText1" = left( :"StrukturText" , "V_TempHelpInt"-1 ); "PosText2" = substring( :"StrukturText" from "V_TempHelpInt" ); end if ( :"V_AuftrDokumentArt" = 800 or :"V_Struktur_FettDrucken" is not distinct from 'Y' ) then -- Bei Mahnungen den Strukturtext Fett drucken "CZeileFett" = 'Y'; else "CgesPreisFett" = 'Y'; -- Wenn Preis der Struktur dann mindestens dieser fett. if ( :"V_AuftrDokStruktur_SummeDrucken" = 'Y' ) then select "Format_Zahl" from "Formatiere_Zahl"( :"V_Struktur_Summe" , NULL , NULL , NULL ) into :"G-Preis"; "Pos_GPreis_StruktPreis" = :"V_Struktur_Summe"; "ExtraAbstandEinfuegen" = 0; suspend; "V_LastPositionsArt" = :"PositionsArt"; if ( :"I_NurDieseEbene" != 'Y' ) then begin "V_OldStruktur_PreiseAusbl" = RDB$GET_CONTEXT('USER_TRANSACTION', '#V_Struktur_PreiseAusbl#' ); RDB$SET_CONTEXT('USER_TRANSACTION', '#V_Struktur_PreiseAusbl#' , :"V_Struktur_PreiseAusbl" ); for select "PositionsArt","StrukturText","PositionsNr","PositionsStringFormatiert","PosText1","PosText2","RAuftrDokStruktur_ID","RAuftragsDokumentePositionen_ID","VMenge","NMenge","MengeGeliefert","MengeRueckstand","ArtikelText","ArtikelBlobText","KurztextAnzAbsaetze","Artikelnummer","EAN_Code","E-Preis","G-Preis","PosRabatt","Preiseinheit","MwSt_Satz","TexgenCommand","HintergrundFarbe","Warnings","CZeileFett","CZeileItalic","CgesPreisFett","CgesPreisUnterstreichen","CgesPreisDoppeltUnterstreichen","ZeilenNr","RowType","ExtraAbstandEinfuegen","Pos_GPreis_StruktPreis" from "AuftragsDokumente_Drucken_old" ( :"I_AuftrDokumentID" , :"I_DruckKonfigID" , :"V_StrukturID" , :"StrukturText" , :"I_NurDieseEbene" , :"I_NettoPreise" , :"I_MwSt_Kurzform", :"I_Format" , :"I_Format_PosText" , :"I_Format_G-Preis" , :"I_Format_E-Preis" , :"I_Format_Menge" , :"I_Warnings" , :"I_Commands" , :"I_Int_Help" , :"I_BigInt_Help" , :"I_Varchar_Help" , :"ZeilenNr" ) into "PositionsArt","StrukturText","PositionsNr","PositionsStringFormatiert","PosText1","PosText2","RAuftrDokStruktur_ID","RAuftragsDokumentePositionen_ID","VMenge","NMenge","MengeGeliefert","MengeRueckstand","ArtikelText","ArtikelBlobText","KurztextAnzAbsaetze","Artikelnummer","EAN_Code","E-Preis","G-Preis","PosRabatt","Preiseinheit","MwSt_Satz","TexgenCommand","HintergrundFarbe","Warnings","CZeileFett","CZeileItalic","CgesPreisFett","CgesPreisUnterstreichen","CgesPreisDoppeltUnterstreichen","ZeilenNr","RowType","ExtraAbstandEinfuegen","Pos_GPreis_StruktPreis" do suspend; "V_LastPositionsArt" = :"PositionsArt"; RDB$SET_CONTEXT('USER_TRANSACTION', '#V_Struktur_PreiseAusbl#' , "V_OldStruktur_PreiseAusbl" ); end "V_Position" = :"V_Position" +1; fetch "Struktur" into :"V_StrukturID" , :"V_StrukturPos" , :"V_Struktur_ArtikelText" , :"V_Struktur_Summe" , :"V_AuftrDokStruktur_SummeDrucken" , :"V_Struktur_FettDrucken" , :"V_Struktur_PreiseAusbl" , :"V_Struktur_InAuflistung"; if ( row_count = 0 ) then "V_CursorEmpty" = 1; -- Alle Ausgabeparameter zuruecksetzen "PosText1" = null ; "PosText2" = NULL ;"PositionsArt" =NULL ; "StrukturText" = :"I_PositionsString"; "PositionsNr" = NULL ; "RAuftrDokStruktur_ID" = NULL; "RAuftragsDokumentePositionen_ID" = NULL;"VMenge" = NULL;"NMenge" = NULL; "MengeGeliefert" = NULL;"MengeRueckstand" = NULL;"ArtikelBlobText" = NULL;"ArtikelText" = NULL ; "KurztextAnzAbsaetze" = NULL ;"Artikelnummer" = NULL;"EAN_Code" = NULL;"E-Preis" = NULL;"G-Preis" = NULL;"Preiseinheit" = NULL;"MwSt_Satz" = NULL;"TexgenCommand" = NULL; "CZeileFett" = NULL ; "CZeileItalic" = NULL ; "CgesPreisFett" = NULL ; "CgesPreisUnterstreichen" = NULL ; "CgesPreisDoppeltUnterstreichen" = NULL ; "RowType" = 0 ; "PosRabatt" = NULL; "ExtraAbstandEinfuegen" = NULL ;"Pos_GPreis_StruktPreis" = NULL; end select "Format_Zahl" from "Formatiere_Zahl"( :"V_PosRabatt" , NULL , NULL , NULL ) into :"PosRabatt"; "PosRabatt" = :"PosRabatt" ||'%'; -- !!!ACHTUNG !!! ENDE -- Bereich der nach unten kopiert werden muss wenn etwas geaendert wird. -- if ( ( :"V_LastPositionID" = :"V_AuftragsDokumentePositionenID" or :"V_PositionsArt" > 300 ) and RDB$GET_CONTEXT('USER_TRANSACTION', 'CV_KeinSeitenumbruchBisBruttoSum' ) = 0 ) then if ( ( rdb$get_context( 'USER_TRANSACTION', 'CV_LastPositionID' ) = :"V_AuftragsDokumentePositionenID" or :"V_PositionsArt" > 300 ) and RDB$GET_CONTEXT('USER_TRANSACTION', 'CV_KeinSeitenumbruchBisBruttoSum' ) = 0 ) then begin "V_TempHelpInt" = "RowType"; "RowType" = 7; RDB$SET_CONTEXT('USER_TRANSACTION', 'CV_KeinSeitenumbruchBisBruttoSum' , 1 ); "ArtikelText" = 'summeges'; -- Jeder zusammenhaengende Bereich braucht sein extra Label einmal mit 7 oeffnen und einmal mit 8 und dem selben Labelnamen schliessen suspend; "V_LastPositionsArt" = :"PositionsArt"; "RowType" = "V_TempHelpInt"; end -- So jetzt darf die Position auch gesendet werden. -- "StrukturText" = :"I_PositionsString" || :"V_Position" ; Geaendert am 06.04.2010 wird getrennt uebergeben ! PositionsText = Struktur "RAuftrDokStruktur_ID" = NULL; "RAuftragsDokumentePositionen_ID" = :"V_AuftragsDokumentePositionenID"; "ArtikelText" = NULL; if ( :"V_LangText" is not null ) then -- es ist ein Langtext verfuegbar begin -- Hier schauen ob der Blob in den normalen ArtikelText ( Varchar(8191)) passt und darin senden. Ansonsten Blob nehmen. if ( char_length( :"V_LangText" )+coalesce( char_length( :"V_EigenschaftenText" ),0) < 8100 ) then -- 8100 - 512 fuer die evtl. vorhandenen ArtikelEigenschaften "ArtikelText" = :"V_LangText" || coalesce( ascii_char(29)||:"V_EigenschaftenText" , ''); else "ArtikelBlobText" = :"V_LangText"|| coalesce( ascii_char(29)||:"V_EigenschaftenText" , ''); end else begin if ( char_length( :"V_Positionen_ArtikelText" )+coalesce( char_length( :"V_EigenschaftenText" ),0) < 8100 ) then -- 8100 - 512 fuer die evtl. vorhandenen ArtikelEigenschaften "ArtikelText" = :"V_Positionen_ArtikelText" || coalesce( ascii_char(29)||:"V_EigenschaftenText" , ''); else "ArtikelBlobText" = :"V_Positionen_ArtikelText" || coalesce( ascii_char(29)||:"V_EigenschaftenText" , ''); end if ( :"ArtikelText" is null and :"ArtikelBlobText" is null ) then -- besser bei allen machen and :"V_PositionsArt" < 100 ) then "ArtikelText" = ' '; -- Kein Leertext sondern mindestens ein Leerzeichen, ansonsten wird die Position ganz verschluckt und nicht mehr angezeigt if ( :"V_PosG-Preis" is not null ) then begin "Pos_GPreis_StruktPreis" = :"V_PosG-Preis"; "G-Preis" = cast( :"V_PosG-Preis" as numeric(18,2)); select "Format_Zahl" from "Formatiere_Zahl"( :"G-Preis" , NULL , NULL , NULL ) into :"G-Preis"; end if ( :"V_MengeDokument" is not null ) then begin if ( :"V_MengeAnzNachkommastellen" = 0 ) then "VMenge" = ( select "Format_Zahl" from "Formatiere_Zahl"( round( :"V_MengeDokument" , 0 ) , NULL , NULL , NULL )); else if ( :"V_MengeAnzNachkommastellen" = 1 ) then "VMenge" = ( select "Format_Zahl" from "Formatiere_Zahl"( round( :"V_MengeDokument" , 1 ) , NULL , NULL , NULL )); else if ( :"V_MengeAnzNachkommastellen" = 2 ) then "VMenge" = ( select "Format_Zahl" from "Formatiere_Zahl"( round( :"V_MengeDokument" , 2 ) , NULL , NULL , NULL )); else "VMenge" = ( select "Format_Zahl" from "Formatiere_Zahl"( :"V_MengeDokument" , NULL , NULL , NULL )); "V_TempHelpInt" = position( ',' , :"VMenge" ); if ( :"V_TempHelpInt" > 0 ) then begin "NMenge" = trim( trailing '0' from substring( :"VMenge" from :"V_TempHelpInt" )); -- Evtl. das Trim rausnehmen und die menge immer gleich anzeigen und mit nullen auffuellen -- mal sehen -- "NMenge" = substring( :"VMenge" from :"V_TempHelpInt" ); -- Version ohne Trim also nullen am ende stehen lassen. if ( :"NMenge" = ',' ) then "NMenge" = ''; "VMenge" = left( :"VMenge" , :"V_TempHelpInt" -1 ); end else "NMenge" = ''; "Preiseinheit" = :"V_PreisEinheit"; -- Preiseinheit nur ausgeben wenn es auch eine menge gibt end if ( :"V_PosG-Preis" is not null and :"V_MengeDokument" is not null ) then begin if ( :"V_MengeDokument" != 0 ) then begin if ( :"V_PosRabatt" is null ) then -- E-Preis Rabatt nicht vorhanden "E-Preis" = cast( :"V_PosG-Preis" / :"V_MengeDokument" as numeric(18,2)); else -- E-Preis ohne Rabatt ausweisen evtl. waehlbar ob e-preis mit oder ohne rabatt "E-Preis" = cast( :"V_PosG-PreisOhneRabatt" / :"V_MengeDokument" as numeric(18,2)); select "Format_Zahl" from "Formatiere_Zahl"( :"E-Preis" , NULL , NULL , NULL ) into :"E-Preis"; end else begin -- Wenn Menge = NULL geht er hier drueber und zeigt den Preis wie es sein soll wenn Menge = 0 dann auch Preis nicht anzeigen "G-Preis" = NULL; -- Muss hier stehen und nicht aussen rum, sonst sind auch bei berechneten Feldern die Summenwerte = NULL ges.summe etc. geht natuerlich nicht "Pos_GPreis_StruktPreis" = NULL; end end "PositionsArt" = :"V_PositionsArt"; if ( "V_PositionsArt" > 99 -- Alle Positionsarten > 99 also ab 100 bekommen keine Positionsnummern or :"V_Option" in ( 1 ) ) then -- Alle Positionen mit der Option 1 = Versteckt bekommen auch keine Positionsnr. "StrukturText" = NULL; else "PositionsNr" = :"V_Position"; "KurztextAnzAbsaetze" = "V_Kurztext"; "HintergrundFarbe" = 'FFFFFF'; "RAuftrDokStruktur_ID" = :"I_Eltern_ID"; -- Die richtige StrukturID setzen. "ZeilenNr" = "ZeilenNr" + 1; if ( RDB$GET_CONTEXT('USER_TRANSACTION', 'CV_KeinSeitenumbruchBisBruttoSum' ) = 1 ) then "CKeinUmbruchDanach" = 'Y'; if ( :"V_PositionsArt" = 300 ) then begin "V_CountMwSt_Saetze" = :"V_CountMwSt_Saetze" -1; if ( :"V_CountMwSt_Saetze" = 0 ) then -- Unterstreichung nach MwSt ausweisung einfuegen evtl. in stamdaten schauen ob gewuenscht "CgesPreisUnterstreichen" = 'Y'; end if ( ( :"V_PositionsArt" >= 300 and :"V_PositionsArt" < 100000 ) or :"V_PositionsArt" = 111 ) then begin "CgesPreisFett" = 'Y'; "RowType" = 0; -- RowType 3 geht nur bei Einzeiligen Texten aber der Benutzer kann hier den Text auch aendern deswegen von RowType=3 auf 0 gegangen. end if ( :"V_PositionsArt" = 410 ) then "CgesPreisDoppeltUnterstreichen" = 'Y'; -- ges. Prei sdoppelt unterstreichen if ( :"V_PositionsArt" = 101 ) then "RowType" = 4; -- Leere Zeile if ( :"V_PositionsArt" = 102 ) then "RowType" = 5; -- Horizontale Linie if ( :"V_PositionsArt" = 103 ) then "RowType" = 6; -- Seitenumbruch -- MwSt Kurzzeichen setzen -- if ( :"RowType" < 99 or :"RowType" in( 300, 401 ) ) then -- kann eigentlich nur ein Fehler gewesen sein !!!!!!!! if ( :"V_PositionsArt" < 99 or :"V_PositionsArt" in( 300, 401 ) ) then "MwSt_Satz" = :"V_MwSt_KurzZeichen"; if ( :"V_AuftragPositionVersandArtID" is not NULL ) then begin -- Jetzt noch ein Kuerzel fuer die Versandart anzeigen z.B. D fuer DPD wird einfach an "MwSt_Satz" angehaengt evtl. spaeter bei der Menge mit ausgeben !! "V_AuftrPosiVersand_KurzZeichen" = NULL; "V_AuftrPosiVersand_KurzZeichen" = ( select "AufDokVerArt_StdKuerzel" from "AuftragsDokumentVersandArt" A where A."AuftrDokumVersandArt_ID" = :"V_AuftragPositionVersandArtID" ); if ( :"V_AuftrPosiVersand_KurzZeichen" is not null ) then begin if ( :"MwSt_Satz" is not null and :"MwSt_Satz" != '' ) then "MwSt_Satz" = "MwSt_Satz" || ','||:"V_AuftrPosiVersand_KurzZeichen"; else "MwSt_Satz" = :"V_AuftrPosiVersand_KurzZeichen"; end end -- Neues Schema fuer die Positonsstruktur (3xIn diser SP vorhanden muss immer genau gleich sein )mit "PosText1" und "PosText2" zusammenbauen if ( :"StrukturText" = '' or :"StrukturText" is null ) then "PosText1" = :"PositionsNr"; else begin "V_TempHelpInt" = position( '.' , :"StrukturText" ); if ( :"V_TempHelpInt" = 0 ) then begin "PosText1" = :"StrukturText"; if ( :"PositionsNr" > 0 ) then "PosText2" = '.'||:"PositionsNr"; end else begin "PosText1" = left( :"StrukturText" , "V_TempHelpInt" -1); "PosText2" = substring( :"StrukturText" from "V_TempHelpInt" ) ||'.'|| coalesce( :"PositionsNr" , '' ); end end if ( :"V_Option" = 2 ) then -- Wenn die Position die Option (U)nberechnet gesetzt hat begin if ( ( rdb$get_context( 'USER_TRANSACTION', '#Unberechnet_PosZVorPos#' )) is not null ) then "PosText1" = rdb$get_context( 'USER_TRANSACTION', '#Unberechnet_PosZVorPos#' ) || :"PosText1"; if ( "G-Preis" is not null and char_length( "G-Preis" ) > 0 ) then "G-Preis" = '('||"G-Preis"||')'; -- Alternative unberechnetet Preise in Klammern setzen end if ( :"V_PositionsArt" = 2 and :"P_MarkChangedArticle" > 0 ) then -- Artikel die von ArtikelText in ArtikelTextGeaendert gesetzt wurden. "Artikelnummer" = '*' || "V_Artikelnummer"; else "Artikelnummer" = "V_Artikelnummer"; if ( :"V_Option" is null or not(:"P_HiddenHide" > 0 and :"V_Option" = 1 )) then -- Wenn Commando HidenHide Versteckte Zeilen ausblenden begin -- und eine versteckte Zeile da ist dise kpl. ueberspringen if ( :"RowType" != 6 or ( :"RowType" =6 and RDB$GET_CONTEXT('USER_TRANSACTION', 'CV_KeinSeitenumbruchBisBruttoSum' ) = 0 )) then begin if ( :"V_PositionsArt" in ( 1,2,3 ) ) then begin "ExtraAbstandEinfuegen" = 0; -- 0 = 1ex Abstand einfuegen if ( RDB$GET_CONTEXT('USER_TRANSACTION', '#V_Struktur_PreiseAusbl#' ) = 'Y' ) then begin -- Die Preise der Positionen in dieser Struktur sollen ausgeblendet werden "E-Preis" = NULL; "G-Preis" = NULL; end end if ( 1 = 2 and :"V_PositionsArt" in ( 1,2,3 ) ) then begin exception "Fatal_Error"'Zusammenhaengender Bereich1'; if ( :"ArtikelText" is null ) then begin "RowType" = 7; "ArtikelText" = 'pos'||:"RAuftragsDokumentePositionen_ID"; -- Jeder zusammenhaengende Bereich braucht sein extra Label einmal mit 7 oeffnen und einmal mit 8 und dem selben Labelnamen schliessen suspend; "ArtikelText" = NULL; "RowType" = 0; suspend; -- DokumentPosition zurueckgeben "RowType" = 8; "ArtikelText" = 'pos'||:"RAuftragsDokumentePositionen_ID"; suspend; end else begin exception "Fatal_Error"'Zusammenhaengender Bereich2'; "V_TempVarCharMax" = "ArtikelText"; "RowType" = 7; "ArtikelText" = 'pos'||:"RAuftragsDokumentePositionen_ID"; -- Jeder zusammenhaengende Bereich braucht sein extra Label einmal mit 7 oeffnen und einmal mit 8 und dem selben Labelnamen schliessen suspend; "RowType" = 0; "ArtikelText" = "V_TempVarCharMax"; suspend; -- DokumentPosition zurueckgeben "RowType" = 8; "ArtikelText" = 'pos'||:"RAuftragsDokumentePositionen_ID"; suspend; end "RowType" = 0; end else suspend; -- DokumentPosition zurueckgeben "V_LastPositionsArt" = :"PositionsArt"; end end if ( :"V_PositionsArt" = 410 ) then begin "PosText1" = null ; "PosText2" = NULL ;"PositionsArt" =NULL ; "StrukturText" = :"I_PositionsString"; "PositionsNr" = NULL ; "RAuftrDokStruktur_ID" = NULL; "RAuftragsDokumentePositionen_ID" = NULL;"VMenge" = NULL;"NMenge" = NULL; "MengeGeliefert" = NULL;"MengeRueckstand" = NULL;"ArtikelBlobText" = NULL;"ArtikelText" = NULL ; "KurztextAnzAbsaetze" = NULL ;"Artikelnummer" = NULL;"EAN_Code" = NULL;"E-Preis" = NULL;"G-Preis" = NULL;"Preiseinheit" = NULL;"MwSt_Satz" = NULL;"TexgenCommand" = NULL; "CZeileFett" = NULL ; "CZeileItalic" = NULL ; "CgesPreisFett" = NULL ; "CgesPreisUnterstreichen" = NULL ; "CgesPreisDoppeltUnterstreichen" = NULL ; "RowType" = 0 ; "PosRabatt" = NULL; "ExtraAbstandEinfuegen" = NULL ;"Pos_GPreis_StruktPreis" = NULL; RDB$SET_CONTEXT('USER_TRANSACTION', 'CV_KeinSeitenumbruchBisBruttoSum' , 0 ); "RowType" = 8; "ArtikelText" = 'summeges'; -- Jeder zusammenhaengende Bereich braucht sein extra Label einmal mit 7 oeffnen und einmal mit 8 und dem selben Labelnamen schliessen suspend; "V_LastPositionsArt" = :"PositionsArt"; end if ( :"PositionsArt" < 100 -- Alle Arten unter 100 bekommen eine Positionsnr. and ( "V_Option" not in ( 1 ) or "V_Option" is null )) then -- Option 1 Verteckt bekommt keine Positionsnr "V_Position" = :"V_Position" +1; end /* Schauen ob noch was in der Struktur uebrig ist und es auch noch anhaengen. Kommt vor wenn zu wenig oder auch keine DokumentPositionen vorhanden waren ;-) */ -- Alle Ausgabeparameter zuruecksetzen "PosText1" = null ; "PosText2" = NULL ;"PositionsArt" =NULL ; "StrukturText" = :"I_PositionsString"; "PositionsNr" = NULL ; "RAuftrDokStruktur_ID" = NULL; "RAuftragsDokumentePositionen_ID" = NULL;"VMenge" = NULL;"NMenge" = NULL; "MengeGeliefert" = NULL;"MengeRueckstand" = NULL;"ArtikelBlobText" = NULL;"ArtikelText" = NULL ; "KurztextAnzAbsaetze" = NULL ;"Artikelnummer" = NULL;"EAN_Code" = NULL;"E-Preis" = NULL;"G-Preis" = NULL;"Preiseinheit" = NULL;"MwSt_Satz" = NULL;"TexgenCommand" = NULL; "CZeileFett" = NULL ; "CZeileItalic" = NULL ; "CgesPreisFett" = NULL ; "CgesPreisUnterstreichen" = NULL ; "CgesPreisDoppeltUnterstreichen" = NULL ; "RowType" = 0 ; "PosRabatt" = NULL; "ExtraAbstandEinfuegen" = NULL ;"Pos_GPreis_StruktPreis" = NULL; -- ################################################################################################################################################## -- ################################################################################################################################################## -- ################################################################################################################################################## -- !!! ACHTUNG !!! START Kopie von oben. Bei aenderungen diese Bloecke immer syncronisieren while( :"V_CursorEmpty" = 0 ) do -- <--- ACHTUNG das WHIKLE hier muss natuerlich nur noch so aussehen sonst nichts. Es sind nur noch Strukturebenen da. begin -- Immer wenn eine Struktur einsortiert werden muss. Hat Vorrang vor Positionen "ArtikelBlobText" = NULL; "RAuftrDokStruktur_ID" = :"V_StrukturID"; "RAuftragsDokumentePositionen_ID" = NULL; "ArtikelText" = "V_Struktur_ArtikelText"; "PositionsArt" = 99; -- 99 = Strukturtext "HintergrundFarbe" = 'FFFFFF'; "ZeilenNr" = "ZeilenNr" + 1; "PositionsNr" = -:"V_Position"; if ( "I_PositionsString" is null ) then "StrukturText" = :"V_Position" ; else "StrukturText" = :"I_PositionsString" || '.' || :"V_Position" ; -- Neues Schema fuer die Positonsstruktur (3xIn diser SP vorhanden muss immer genau gleich sein )mit "PosText1" und "PosText2" zusammenbauen "V_TempHelpInt" = position( '.' , :"StrukturText" ); if ( :"V_TempHelpInt" = 0 ) then begin "PosText1" = :"StrukturText"; end else begin "PosText1" = left( :"StrukturText" , "V_TempHelpInt"-1 ); "PosText2" = substring( :"StrukturText" from "V_TempHelpInt" ); end if ( :"V_AuftrDokumentArt" = 800 or :"V_Struktur_FettDrucken" is not distinct from 'Y' ) then -- Bei Mahnungen den Strukturtext Fett drucken "CZeileFett" = 'Y'; else "CgesPreisFett" = 'Y'; -- Wenn Preis der Struktur dann mindestens dieser fett. if ( :"V_AuftrDokStruktur_SummeDrucken" = 'Y' ) then select "Format_Zahl" from "Formatiere_Zahl"( :"V_Struktur_Summe" , NULL , NULL , NULL ) into :"G-Preis"; "Pos_GPreis_StruktPreis" = :"V_Struktur_Summe"; "ExtraAbstandEinfuegen" = 0; suspend; "V_LastPositionsArt" = :"PositionsArt"; if ( :"I_NurDieseEbene" != 'Y' ) then begin "V_OldStruktur_PreiseAusbl" = RDB$GET_CONTEXT('USER_TRANSACTION', '#V_Struktur_PreiseAusbl#' ); RDB$SET_CONTEXT('USER_TRANSACTION', '#V_Struktur_PreiseAusbl#' , :"V_Struktur_PreiseAusbl" ); for select "PositionsArt","StrukturText","PositionsNr","PositionsStringFormatiert","PosText1","PosText2","RAuftrDokStruktur_ID","RAuftragsDokumentePositionen_ID","VMenge","NMenge","MengeGeliefert","MengeRueckstand","ArtikelText","ArtikelBlobText","KurztextAnzAbsaetze","Artikelnummer","EAN_Code","E-Preis","G-Preis","PosRabatt","Preiseinheit","MwSt_Satz","TexgenCommand","HintergrundFarbe","Warnings","CZeileFett","CZeileItalic","CgesPreisFett","CgesPreisUnterstreichen","CgesPreisDoppeltUnterstreichen","ZeilenNr","RowType","ExtraAbstandEinfuegen","Pos_GPreis_StruktPreis" from "AuftragsDokumente_Drucken_old" ( :"I_AuftrDokumentID" , :"I_DruckKonfigID" , :"V_StrukturID" , :"StrukturText" , :"I_NurDieseEbene" , :"I_NettoPreise" , :"I_MwSt_Kurzform", :"I_Format" , :"I_Format_PosText" , :"I_Format_G-Preis" , :"I_Format_E-Preis" , :"I_Format_Menge" , :"I_Warnings" , :"I_Commands" , :"I_Int_Help" , :"I_BigInt_Help" , :"I_Varchar_Help" , :"ZeilenNr" ) into "PositionsArt","StrukturText","PositionsNr","PositionsStringFormatiert","PosText1","PosText2","RAuftrDokStruktur_ID","RAuftragsDokumentePositionen_ID","VMenge","NMenge","MengeGeliefert","MengeRueckstand","ArtikelText","ArtikelBlobText","KurztextAnzAbsaetze","Artikelnummer","EAN_Code","E-Preis","G-Preis","PosRabatt","Preiseinheit","MwSt_Satz","TexgenCommand","HintergrundFarbe","Warnings","CZeileFett","CZeileItalic","CgesPreisFett","CgesPreisUnterstreichen","CgesPreisDoppeltUnterstreichen","ZeilenNr","RowType","ExtraAbstandEinfuegen","Pos_GPreis_StruktPreis" do suspend; "V_LastPositionsArt" = :"PositionsArt"; RDB$SET_CONTEXT('USER_TRANSACTION', '#V_Struktur_PreiseAusbl#' , "V_OldStruktur_PreiseAusbl" ); end "V_Position" = :"V_Position" +1; fetch "Struktur" into :"V_StrukturID" , :"V_StrukturPos" , :"V_Struktur_ArtikelText" , :"V_Struktur_Summe" , :"V_AuftrDokStruktur_SummeDrucken" , :"V_Struktur_FettDrucken" , :"V_Struktur_PreiseAusbl" , :"V_Struktur_InAuflistung"; if ( row_count = 0 ) then "V_CursorEmpty" = 1; else RDB$SET_CONTEXT('USER_TRANSACTION', '#V_Struktur_PreiseAusbl#' , :"V_Struktur_PreiseAusbl" ); -- Alle Ausgabeparameter zuruecksetzen "PosText1" = null ; "PosText2" = NULL ;"PositionsArt" =NULL ; "StrukturText" = :"I_PositionsString"; "PositionsNr" = NULL ; "RAuftrDokStruktur_ID" = NULL; "RAuftragsDokumentePositionen_ID" = NULL;"VMenge" = NULL;"NMenge" = NULL; "MengeGeliefert" = NULL;"MengeRueckstand" = NULL;"ArtikelBlobText" = NULL;"ArtikelText" = NULL ; "KurztextAnzAbsaetze" = NULL ;"Artikelnummer" = NULL;"EAN_Code" = NULL;"E-Preis" = NULL;"G-Preis" = NULL;"Preiseinheit" = NULL;"MwSt_Satz" = NULL;"TexgenCommand" = NULL; "CZeileFett" = NULL ; "CZeileItalic" = NULL ; "CgesPreisFett" = NULL ; "CgesPreisUnterstreichen" = NULL ; "CgesPreisDoppeltUnterstreichen" = NULL ; "RowType" = 0 ; "PosRabatt" = NULL; "ExtraAbstandEinfuegen" = NULL ;"Pos_GPreis_StruktPreis" = NULL; end -- !!! ACHTUNG !!! ENDE Kopie von oben select "Format_Zahl" from "Formatiere_Zahl"( :"V_PosRabatt" , NULL , NULL , NULL ) into :"PosRabatt"; "PosRabatt" = :"PosRabatt" ||'%'; if ( :"I_DruckKonfigID" is null or "I_Eltern_ID" is not null ) then -- Wenn nicht gedruckt wird braucht man keine Legende und Kram und nur auf der ersten Ebene exit; -- eine Legende Drucken - asnosnten raus hier "ArtikelText" = ''; "Error" = ' 1 ) then -- Nur MwSt-Saetze in legende einbauen wenn es mehr als einen gibt ! begin if ( (select count( distinct "MwStGr_Staaten_ID") from "AuftrDokument_MwSt_Liste"( :"I_AuftrDokumentID" , 'N' ) A join "MwSt_Saetze" B ON B."MwSt_Saetze_ID" = A."MwStSaetze_ID" join "MwSt_Gruppen" C ON C."MwStGruppen_ID" = B."MwSt_Saetze_Gruppen_ID" ) < 2 ) then begin -- Nur ein Staat unter den MwSt Saetzen. for select "KurzZeichen" ,"Satz" , "MwStGr_FestDokumentSumme" , "MwSt_Gr_Name", "MwStGr_Staaten_ID" from "AuftrDokument_MwSt_Liste"( :"I_AuftrDokumentID" , 'N' ) A join "MwSt_Saetze" B ON B."MwSt_Saetze_ID" = A."MwStSaetze_ID" join "MwSt_Gruppen" C ON C."MwStGruppen_ID" = B."MwSt_Saetze_Gruppen_ID" into :"V_MwSt_KurzZeichen" , :"V_MwSt-Satz" , :"V_PosG-Preis" , :"V_MwStGruppenName" , :"V_Staat" do begin if ( :"V_TempHelpInt" = 0 ) then "V_TempHelpInt" = 1; else "ArtikelText" = "ArtikelText" || :"Error" || 'br="0">,'; if ( :"V_PosG-Preis" is null ) then -- Dann ist es Prozentual und nicht mit Betrag 0 ueberschrieben "ArtikelText" = "ArtikelText" || :"Error" || 'br="0" subsuperscripttype="super">' || :"V_MwSt_KurzZeichen" || '' || :"Error" || iif(:"V_MwSt_KurzZeichen" = '' , 'br="0">' , 'br="0">: ' )|| :"V_MwSt-Satz" || '%'; else "ArtikelText" = "ArtikelText" || :"Error" || 'br="0" subsuperscripttype="super">' || :"V_MwSt_KurzZeichen" || '' || :"Error" || iif(:"V_MwSt_KurzZeichen" = '' , 'br="0">' , 'br="0">: ' )|| :"V_MwStGruppenName" || ''; end end else begin -- Mehr als ein Staat unter den MwSt Saetzen also auch den Staatsnamen des MwSt Satzes zeigen for select "KurzZeichen" ,"Satz" , "MwStGr_FestDokumentSumme" , "MwSt_Gr_Name", "MwStGr_Staaten_ID" from "AuftrDokument_MwSt_Liste"( :"I_AuftrDokumentID" , 'N' ) A join "MwSt_Saetze" B ON B."MwSt_Saetze_ID" = A."MwStSaetze_ID" join "MwSt_Gruppen" C ON C."MwStGruppen_ID" = B."MwSt_Saetze_Gruppen_ID" into :"V_MwSt_KurzZeichen" , :"V_MwSt-Satz" , :"V_PosG-Preis" , :"V_MwStGruppenName" , :"V_Staat" do begin if ( :"V_TempHelpInt" = 0 ) then "V_TempHelpInt" = 1; else "ArtikelText" = "ArtikelText" || :"Error" || 'br="0">, '; -- Hochzahl Doppelpunkt Leerzeichen Prozentsatz Komma Leerzeichen if ( :"V_PosG-Preis" is null ) then -- Dann ist es Prozentual und nicht mit Betrag 0 ueberschrieben "ArtikelText" = "ArtikelText" || :"Error" || 'br="0" subsuperscripttype="super">' || :"V_MwSt_KurzZeichen" || '' || :"Error" || iif(:"V_MwSt_KurzZeichen" = '' , 'br="0">' , 'br="0">: ' )|| :"V_Staat" ||'-'||:"V_MwSt-Satz" || '%'; else "ArtikelText" = "ArtikelText" || :"Error" || 'br="0" subsuperscripttype="super">' || :"V_MwSt_KurzZeichen" || '' || :"Error" || iif(:"V_MwSt_KurzZeichen" = '' , 'br="0">' , 'br="0">: ' )|| :"V_Staat" ||'-'||:"V_MwStGruppenName" || ''; end end end if ( ( select count(*) from "AuftragsDokumentePositionen" A where A."AuftrDokPosi_DokumentID" = :"I_AuftrDokumentID" and A."AuftrDokPosi_Option" = 2 ) > 0 ) then begin -- Unberechnete Position gefunden schauen ob ein A für Alternativ hinterlegt ist ! "V_MwStGruppenName" = RDB$GET_CONTEXT('USER_TRANSACTION', '#Unberechnet_PosZVorPos#' ); if ( :"V_MwStGruppenName" is not null and trim(:"V_MwStGruppenName") != '' ) then begin -- Legende um Alternativtext ergaenzen if ( :"V_TempHelpInt" = 0 ) then "V_TempHelpInt" = 1; else "ArtikelText" = "ArtikelText" || :"Error" || 'br="0">, '; "ArtikelText" = "ArtikelText" || :"Error" || 'br="0" subsuperscripttype="super">' || :"V_MwStGruppenName" || '' || :"Error" || 'br="0">:Alternativ'; end end if ( :"V_DokStdVersandArtID" is not null ) then begin -- Es muss eine Legende fuer die Versandarten ausgegeben werden "V_TempHelpInt" = 1; -- nur damit er unten auch wirklich rein geht for select distinct "AufDokVerArt_StdKuerzel" , "AufDokVerArt_StdName" from "AuftragsDokumentePositionen" A join "AuftragsDokumentVersandArt" B ON B."AuftrDokumVersandArt_ID" = A."AuftrDokPosi_VersandArt" where A."AuftrDokPosi_DokumentID" = :"I_AuftrDokumentID" and A."AuftrDokPosi_VersandArt" is not NULL and A."AuftrDokPosi_VersandArt" != 0 and A."AuftrDokPosi_VersandArt" != :"V_DokStdVersandArtID" and B."AufDokVerArt_StdKuerzel" is not null into :"V_AuftrPosiVersand_KurzZeichen" , :"V_TempVarCharMax" do begin if ( :"ArtikelText" = '' ) then begin "ArtikelText" = :"ArtikelText" || ''|| :"V_AuftrPosiVersand_KurzZeichen" ||':'|| :"V_TempVarCharMax" || ''; end else "ArtikelText" = :"ArtikelText" || ','|| :"V_AuftrPosiVersand_KurzZeichen" ||':'|| :"V_TempVarCharMax" || ''; end end if ( :"V_TempHelpInt" > 0 ) then begin "ArtikelText" = "ArtikelText" || ''; "RowType" = 3; suspend; "V_LastPositionsArt" = :"PositionsArt"; end end ^ SET TERM ; ^ DESCRIBE PARAMETER "StrukturText" PROCEDURE "AuftragsDokumente_Drucken_old" 'PositionsText=StrukturText+PositionsNr'; DESCRIBE PARAMETER "PositionsNr" PROCEDURE "AuftragsDokumente_Drucken_old" 'Nur Positionsnummer allein'; DESCRIBE PARAMETER "PositionsStringFormatiert" PROCEDURE "AuftragsDokumente_Drucken_old" 'Wird als Parameter gebraucht wenn es Strukturen gibt'; DESCRIBE PARAMETER "PosText1" PROCEDURE "AuftragsDokumente_Drucken_old" 'Erstes Feld der Positionsstruktur zm Drucken rechtsbuendig ausgerichtet'; DESCRIBE PARAMETER "PosText2" PROCEDURE "AuftragsDokumente_Drucken_old" 'Zweites Feld der Positionsstruktur zm Drucken linksbuendig ausgerichtet'; DESCRIBE PARAMETER "VMenge" PROCEDURE "AuftragsDokumente_Drucken_old" 'Vorkommaanteil'; DESCRIBE PARAMETER "NMenge" PROCEDURE "AuftragsDokumente_Drucken_old" 'Nachkommaanteil Menge mit Komma'; DESCRIBE PARAMETER "Artikelnummer" PROCEDURE "AuftragsDokumente_Drucken_old" 'Feld Artikelnr. + evtl. ein Sternchen was auf ArtikelTZextGeaendert hinweist'; DESCRIBE PARAMETER "ExtraAbstandEinfuegen" PROCEDURE "AuftragsDokumente_Drucken_old" 'DB-Null bedeutet Abstand in hoehe von kleinem "x" und bei allen anderen Werten in mm nach der Position einfuegen'; DESCRIBE PARAMETER "Pos_GPreis_StruktPreis" PROCEDURE "AuftragsDokumente_Drucken_old" 'Gibt den ein oder anderen GesPreis aus je nachdem ob es eine Position oder Struktur ist'; /* Restore proc. body: E-Mail-GetOrdnerMailIDs */ SET TERM ^ ; ALTER PROCEDURE "E-Mail-GetOrdnerMailIDs"("iEMailOrdnerStrukturID" INTEGER, "iEMOS_Type" INTEGER) AS declare variable "RootNodeID" integer; begin if ( :"iEMOS_Type" is null ) then begin "iEMOS_Type" = (select "EMOS_Type" from "E-Mail-OrdnerStruktur" where "EMailOrdnerStrukturID" = :"iEMailOrdnerStrukturID" ); end "RootNodeID" = ( select PK_ID from "TreeHelpFunctions"( 'GetRootNode' , 'E-Mail-OrdnerStruktur' , 'EMailOrdnerStrukturID' , 'EMOS_Parent' , NULL , :"iEMailOrdnerStrukturID" , NULL , NULL , 'Y' ,NULL ,NULL)); if ( current_user != 'SYSDBA' -- current_user != 'MailManager' noch evtl. einfuegen und sysdba rausnehemn and current_user != (select "B_UserName" from "RESOURCE" join "BenutzerIDs" ON "BenutzerID" = "RESO_BenutzerID" where "RESO_MailOrdnerStrukturID" = :"RootNodeID" )) then begin -- Hier noch schauen ob eine Berechtigung ueber eine Resourcegruppe vorhanden ist. -- Ansonsten Exception exception "Zugriffsrechte" 'Kein Zugriff auf den Ordner'; end suspend; end ^ SET TERM ; ^ DESCRIBE PARAMETER "iEMOS_Type" PROCEDURE "E-Mail-GetOrdnerMailIDs" 'Wenn NULL iwrd der Type ermittelt'; /* Restore proc. body: Mengenausgleich */ SET TERM ^ ; ALTER PROCEDURE "Mengenausgleich"("iFunktion" INTEGER, "iNotiz" TYPE OF COLUMN "AuftragsDokumentePositionExt"."ADPE_TextNotiz", "iID_Art" INTEGER, "iID" BIGINT, "iIDs" "d_BLOB_Text_AsciiGross", "iAuftragsDokument_ID" INTEGER, "iAusgewaehltePositionen" INTEGER, "iUntergeordnetePositionen" D_BOOLEAN_YN, "iAusgabeListe" INTEGER, "iAuftragVerrechnPos_ID" BIGINT, "iAuftragVerrechnDokument" INTEGER, "iMengenAusgleich" "Mengen", "iParam1" INTEGER) RETURNS("AuftrDokPosID" BIGINT, "sourceAuftrDokPosID" BIGINT, "sourceAuftrDokArt" INTEGER, "BereitsVerrechnet" "Mengen", "AusgeglicheneMenge" "Mengen", "destMenge" "Mengen", "GesamtPositionen" INTEGER, "VerrechnetePositionen" INTEGER, "WarningError" "d_str60") AS declare variable "TempBigInt" bigint; declare variable "TempBigInt2" bigint; declare variable "TempBigInt3" integer; begin if ( :"iFunktion" is null or :"iFunktion" not in ( 0 ) ) then exception "Fatal_Error"'Fehlerhafte Funktion'; if ( :"iID_Art" is null or :"iID_Art" not in ( 0,1) ) then exception "Fatal_Error"'Fehlerhafte ID_Art'; if ( exists( Select * from "TempIDsZwischenspeicher" A where A."TempID_Art" = 3 and A."InsertTransaction" = current_transaction )) then exception "Fatal_Error" 'IDs in Temp schon vorhanden ! (Nicht erlaubt)'; if ( :"iIDs" is null ) then "iIDs" = :"iID"; else begin if ( :"iID" is not null ) then "iIDs" = :"iIDs" || :"iID"; end if ( :"iAuftragsDokument_ID" is null ) then begin if ( :"iIDs" is null ) then exception "Fatal_Error" 'Keine IDs uebergeben'; if ( :"iID_Art" = 0 ) then -- IDs entsprechen AuftragsDokumentPositionenIDs und sichergestellt das es nur von einem Dokument die Positionen sind. "iAuftragsDokument_ID" = ( select distinct A."AuftrDokPosi_DokumentID" from "AuftragsDokumentePositionen" A join "SelectForINoperator"( :"iIDs" ) B ON A."AuftragsDokumentePositionen_ID" is not distinct from b."Value"); else -- IDs entsprechen AuftragsDokumentStruktur und sichergestellt das es nur von einem Dokument die Strukturen sind. "iAuftragsDokument_ID" = ( select distinct A."AuftrDokStruktur_Dokument_ID" from "AuftragsDokumentStruktur" A join "SelectForINoperator"( :"iIDs" ) B ON A."AuftrDokStruktur_ID" is not distinct from b."Value"); end if ( not exists ( select * from "AuftragsDokumente" A where A."AuftrDokument_ID" = :"iAuftragsDokument_ID" and A."AuftrDokument_Art" = 500 )) then exception "Fatal_Error" 'Keine Gutschrift uebergeben!'; if ( :"iAusgewaehltePositionen" = 0 ) then begin insert into "TempIDsZwischenspeicher" ( "TempID_Art" , "ID1" , "AutoDeleteAfterEndInsertTransac" ) select 3 , A."AuftragsDokumentePositionen_ID" , 1 from "AuftragsDokumentePositionen" A where A."AuftrDokPosi_DokumentID" = :"iAuftragsDokument_ID" and A."AuftrDokPosi_Art" < 11 and A."AuftrDokPosi_AbgeleitetVonPos" is not null; end else if ( :"iAusgewaehltePositionen" = 1 ) then begin if ( :"iID_Art" = 0 ) then insert into "TempIDsZwischenspeicher" ( "TempID_Art" , "ID1" , "AutoDeleteAfterEndInsertTransac" ) select distinct 3 , A."AuftragsDokumentePositionen_ID" , 1 from "AuftragsDokumentePositionen" A join "SelectForINoperator"( :"iIDs" ) B ON A."AuftragsDokumentePositionen_ID" = B."Value" where A."AuftrDokPosi_Art" < 11 and A."AuftrDokPosi_AbgeleitetVonPos" is not null; else insert into "TempIDsZwischenspeicher" ( "TempID_Art" , "ID1" , "AutoDeleteAfterEndInsertTransac" ) select distinct 3 , A."AuftragsDokumentePositionen_ID" , 1 from "AuftragsDokumentePositionen" A join "SelectForINoperator"( :"iIDs" ) B ON A."AuftrDokPosi_DokStrukturID" = B."Value" where A."AuftrDokPosi_Art" < 11 and A."AuftrDokPosi_AbgeleitetVonPos" is not null; end else if ( :"iAusgewaehltePositionen" = 2 ) then begin if ( :"iID_Art" = 0 ) then insert into "TempIDsZwischenspeicher" ( "TempID_Art" , "ID1" , "AutoDeleteAfterEndInsertTransac" ) select distinct 3 , A."AuftragsDokumentePositionen_ID" , 1 from "AuftragsDokumentePositionen" A join "AuftragsDokumentePositionen" B on A."AuftrDokPosi_DokStrukturID" is not distinct from b."AuftrDokPosi_DokStrukturID" and b."AuftrDokPosi_DokumentID" = :"iAuftragsDokument_ID" where A."AuftrDokPosi_Art" < 11 and A."AuftrDokPosi_AbgeleitetVonPos" is not null and A."AuftrDokPosi_DokumentID" = :"iAuftragsDokument_ID" and B."AuftragsDokumentePositionen_ID" in ( select "Value" from "SelectForINoperator"( :"iIDs" )); else -- Das hier ist noch etwas fraglich (Alle Strukturen der Ebene) es kommen nur positionen die in den Strukturen liegen aber nicht die Positionen der Struktur selbst insert into "TempIDsZwischenspeicher" ( "TempID_Art" , "ID1" , "AutoDeleteAfterEndInsertTransac" ) select distinct 3 , A."AuftragsDokumentePositionen_ID" , 1 from "AuftragsDokumentePositionen" A join "AuftragsDokumentStruktur" B ON A."AuftrDokPosi_DokStrukturID" = B."AuftrDokStruktur_ID" where A."AuftrDokPosi_Art" < 11 and A."AuftrDokPosi_AbgeleitetVonPos" is not null and A."AuftrDokPosi_DokumentID" = :"iAuftragsDokument_ID" and B."AuftrDokStruktur_ElternID" in ( select "Value" from "SelectForINoperator"( :"iIDs" )); end if ( :"iAusgewaehltePositionen" != 0 and :"iUntergeordnetePositionen" = 'Y' ) then begin -- Auch noch untergeordnete Ebenen mit aufnehmen :-) for select distinct C."AuftrDokStruktur_ID" from "AuftragsDokumentePositionen" A join "TempIDsZwischenspeicher" B ON A."AuftragsDokumentePositionen_ID" = "ID1" and B."TempID_Art" = 3 and B."InsertTransaction" = current_transaction -- Durch diesen zweiten Join bekomme ich schon immer die naechste/untergeordnete) Ebene da von Ebene NULL die untergeordnete immer eine StrukturID hat und diese nie NULL sein kann funktioniert es. join "AuftragsDokumentStruktur" C ON A."AuftrDokPosi_DokStrukturID" is not distinct from C."AuftrDokStruktur_ElternID" and C."AuftrDokStruktur_Dokument_ID" = A."AuftrDokPosi_DokumentID" into :"TempBigInt" do begin merge into "TempIDsZwischenspeicher" B using ( select A."AuftragsDokumentePositionen_ID" from "AuftragsDokumentePositionen" A join "TreeHelpFunctions"( 'GetTree' ,'AuftragsDokumentStruktur','AuftrDokStruktur_ID','AuftrDokStruktur_ElternID', NULL , :"TempBigInt" , NULL , NULL , 'Y' ,NULL,NULL) C on A."AuftrDokPosi_DokStrukturID" is not distinct from C."PK_ID" where A."AuftrDokPosi_Art" < 11 and A."AuftrDokPosi_AbgeleitetVonPos" is not null and A."AuftrDokPosi_DokumentID" = :"iAuftragsDokument_ID" ) on ( B.id1 is not distinct from "AuftragsDokumentePositionen_ID" and B."TempID_Art" = 3 and B."InsertTransaction" = current_transaction ) when not matched then insert ( "TempID_Art" , "ID1" , "AutoDeleteAfterEndInsertTransac" ) values ( 3 , "AuftragsDokumentePositionen_ID" , 1); end end -- Sicherheitshalber pruefen ob wirklich alle Positionen aus ein und dem selben Dokument stammen -- Sonst ist etwas SEHR schief gelaufen !!!! if ( exists ( select * from "TempIDsZwischenspeicher" A join "AuftragsDokumentePositionen" B ON A."ID1" = B."AuftragsDokumentePositionen_ID" where b."AuftrDokPosi_DokumentID" is distinct from :"iAuftragsDokument_ID" and A."TempID_Art" = 3 and A."InsertTransaction" = current_transaction )) then exception "Fatal_Error"'Positionen aus verschiedenen Dokumenten gefunden !!! '; "GesamtPositionen" = ( select count(*) from "TempIDsZwischenspeicher" A where A."TempID_Art" = 3 and A."InsertTransaction" = current_transaction); if ( :"iMengenAusgleich" is not null and :"GesamtPositionen" > 1 ) then exception "Fatal_Error" 'Ausgleichsmenege nicht auf mehere Positionen anwendbar !'; if ( :"iAusgabeListe" = 0 ) then "iAusgabeListe" = NULL; "VerrechnetePositionen" = 0; -- Ab hier die Mengen verrechnen -- Jeder Position kann eine andere AB zu Grunde liegen also darauf achten. for select ID1 , "AuftragDokPosiID" , "BestellDokArt" , C."AuftrDokPosi_Menge" from "TempIDsZwischenspeicher" A left outer join "AuftrDokPosition_Historie"( 1, NULL , NULL , A.ID1 , NULL , NULL) B ON B."I_AuftragDokPosiPositionID" = A.ID1 left outer join "AuftragsDokumentePositionen" C ON C."AuftragsDokumentePositionen_ID" = A.ID1 where A."TempID_Art" = 3 and A."InsertTransaction" = current_transaction into :"AuftrDokPosID" , :"sourceAuftrDokPosID" , :"sourceAuftrDokArt" , :"destMenge" do begin "WarningError" =''; -- In :"BereitsVerrechnet" die schon verrechntete Menge speichern aber nicht die des jetzt zu aendernden types summieren der Wert steht ja hier select coalesce( sum( "ADPE_MengeAusgleich" ),0) from "AuftragsDokumentePositionExt" A where A."AuftragsDokumentePosition_ID" is not distinct from :"sourceAuftrDokPosID" and A."AuftragsDokumentePosition_ID" is distinct from :"AuftrDokPosID" -- Die jetztige Position nicht summieren sondern den new oder old wert entsprechend hier addieren into :"BereitsVerrechnet"; if ( :"iMengenAusgleich" is not null ) then -- Vom Benutzer uebergeben Menge uebernehmen begin if ( :"iMengenAusgleich" > :"destMenge" ) then exception "Fatal_Error"'Angegebene Menge zu gross'; "destMenge" = :"iMengenAusgleich"; end if ( :"destMenge" < 0) then exception "Fatal_Error"'Angegebene Menge darf nicht < 0 sein'; if ( :"destMenge" = 0 ) then -- Wenn destmenge = 0 den Datensatz loeschen der Verrechnet werden soll delete from "AuftragsDokumentePositionExt" where "AuftragsDokumentePosition_ID" is not distinct from "AuftragsDokumentePosition_ID" and "ADPE_VerrechnPosID" is not distinct from :"AuftrDokPosID"; else if ( :"sourceAuftrDokArt" is not distinct from 200 ) then -- Passende AB gefunden zu der GS begin -- Eine Auftragsbestaetigung wurde gefunden if ( exists ( select * from "AuftragsDokumentePositionExt" A where A."AuftragsDokumentePosition_ID" = :"sourceAuftrDokPosID" and A."ADPE_VerrechnPosID" is not distinct from :"AuftrDokPosID" )) then update "AuftragsDokumentePositionExt" set "ADPE_MengeAusgleich" = :"destMenge" , "ADPE_TextNotiz" = :"iNotiz" where "AuftragsDokumentePosition_ID" = :"sourceAuftrDokPosID" and "ADPE_VerrechnPosID" is not distinct from :"AuftrDokPosID"; else insert into "AuftragsDokumentePositionExt" ( "AuftragsDokumentePosition_ID" , "ADPE_VerrechnPosID" , "ADPE_MengeAusgleich" , "ADPE_TextNotiz" ) values( :"sourceAuftrDokPosID" , :"AuftrDokPosID" , :"destMenge" , :"iNotiz" ); "VerrechnetePositionen" = :"VerrechnetePositionen" +1; end else "WarningError" = :"WarningError" || '1,'; if ( :"WarningError" = '' ) then "WarningError" = NULL; if ( :"iAusgabeListe" is not null ) then suspend; end delete from "TempIDsZwischenspeicher" A where A."TempID_Art" = 3 and A."InsertTransaction" = current_transaction; end ^ SET TERM ; ^ DESCRIBE PARAMETER "iFunktion" PROCEDURE "Mengenausgleich" '0=Fehlemengen durch GS in AB einfuegen'; DESCRIBE PARAMETER "iID_Art" PROCEDURE "Mengenausgleich" '0=AuftragsDokumentPositionernIDs , 1 = StrukturIDs'; DESCRIBE PARAMETER "iID" PROCEDURE "Mengenausgleich" 'AuftragDokumentPositionenID oder StrukturID'; DESCRIBE PARAMETER "iIDs" PROCEDURE "Mengenausgleich" 'Mehrere IDs durch Komma getrennt (Aber nur von einem einzigen Dokument )'; DESCRIBE PARAMETER "iAuftragsDokument_ID" PROCEDURE "Mengenausgleich" 'Optional kann verwendet werden wenn alle Positionen eines Dokuments betroffen sind'; DESCRIBE PARAMETER "iAusgewaehltePositionen" PROCEDURE "Mengenausgleich" '0=Alle Dokumentpositionen ,1=Nur uebergeben Positionen/Strukturen, 2=Alle Positionen/Strukturen der Ebene'; DESCRIBE PARAMETER "iUntergeordnetePositionen" PROCEDURE "Mengenausgleich" 'wenn iAusgewaehltePositionen != 0 ist'; DESCRIBE PARAMETER "iAusgabeListe" PROCEDURE "Mengenausgleich" '0/NULL = Nichts zurueckgeben, 1 = nur geaenderte ohne Fehler zurueckgeben , 2 = Alle zurueckgeben'; DESCRIBE PARAMETER "iAuftragVerrechnPos_ID" PROCEDURE "Mengenausgleich" 'Bei GS->AB findet er diese Felder automatisch also NULL setzen'; DESCRIBE PARAMETER "iAuftragVerrechnDokument" PROCEDURE "Mengenausgleich" 'Bei GS->AB findet er diese Felder automatisch also NULL setzen'; DESCRIBE PARAMETER "iMengenAusgleich" PROCEDURE "Mengenausgleich" 'Wenn NULL dann automatisch die volle Menge ausgleichen(Ist fuer das verarbeiten von mehrern Positionen voraussetzung).Auf welchem Stand die Ausgleichsmenege stehen soll -- also wenn es schon was gab nur einen Teil einfuegen damit diese Menge hier genau erreicht wird'; DESCRIBE PARAMETER "AusgeglicheneMenge" PROCEDURE "Mengenausgleich" 'Ausgleichsmenge die errechnete wurde um die Gewuenscht menge zu erhalten z.B. War 1 Soll 5 = 5-1 = 4'; DESCRIBE PARAMETER "destMenge" PROCEDURE "Mengenausgleich" 'Menge in destination z.B. Menge in de GS Position'; DESCRIBE PARAMETER "WarningError" PROCEDURE "Mengenausgleich" 'NULL = nichts, 1 = Keine AB fuer Position gefunden ,'; /* Alter exist trigger... */ SET TERM ^ ; ALTER TRIGGER "AuftrDokumPositionen_BIU" AS declare variable "PreisEinheit" integer; declare variable "MwStGruppe" integer; declare variable "Waehrung" integer; declare variable "MwSt_Satz_Gr_fuerGP_Std" integer; declare variable "MwSt_Satz_ID" integer; declare variable "MwStGr_NurNettoPosition" d_boolean_yn ; declare variable "DokLeistungsDatum" date; declare variable "AuftragDokumentArt" integer; declare variable "AuftrDokument_BruttoPreise" d_boolean_yn; declare variable "RabattGruppenID" integer; declare variable "StdVersandArt" integer; begin new."AuftrDokPosi_Aend_Zeit" = current_timestamp; new."AuftrDokPosi_Aend_Benu" = current_user; -- Sonst funktionoert die ContextVaribale 'AuftragsDokument_LastChangeTime' nicht mehr if ( rdb$get_context('USER_TRANSACTION', 'AuftrDokPositionen_Funktionen') = 1 ) then exit; -- ## if ( INSERTING and new."AuftrDokPosi_Art" is null ) then -- Positionsart setzen falls Sie nicht uebergeben wird. exception "Fatal_Error"'new."AuftrDokPosi_Art" darf nicht NULL sein !!!'; if ( new."AuftrDokPosi_Art" < 100 and new."AuftrDokPosi_LeistungErbringung" is null ) then begin "DokLeistungsDatum" = ( select a."AuftrDokument_LeistungsDatum" from "AuftragsDokumente" A where A."AuftrDokument_ID" = new."AuftrDokPosi_DokumentID" ); if ( :"DokLeistungsDatum" is null ) then new."AuftrDokPosi_LeistungErbringung" = current_date; -- Wenn noch keine Nr. vergeben also das Dokument noch nicht abgeschlossen wurde aktuelles Datum nehmen. else new."AuftrDokPosi_LeistungErbringung" = :"DokLeistungsDatum"; -- :"DokLeistungsDatum" ist immer gesetzt end if ( INSERTING ) then begin /* Neuste Version zur ArtikelID suchen und eintragen */ -- if ( new."AuftrDokPosi_Artikel_ID" is not null ) then -- gaendert 08.02.2013 wenn keine uebergeben wird die neuste suchen ansonsten immer die uebergebene nehmen if ( new."AuftrDokPosi_ArtikelVersion" is null ) then -- gaendert 08.02.2013 wenn keine uebergeben wird die neuste suchen ansonsten immer die uebergebene nehmen begin select max("Artikel_Version") from "Artikel" A where A."Artikel_ID" = new."AuftrDokPosi_Artikel_ID" into new."AuftrDokPosi_ArtikelVersion"; -- Wird in INSERTING benoetigt deshalb steht es hier oben end if ( new."AuftrDokPosi_Position" is null ) then begin select coalesce( ( max("AuftrDokPosi_Position") +1 ) , 1 ) from "AuftragsDokumentePositionen" A where A."AuftrDokPosi_DokumentID" = new."AuftrDokPosi_DokumentID" and A."AuftrDokPosi_DokStrukturID" is not distinct from new."AuftrDokPosi_DokStrukturID" into new."AuftrDokPosi_Position"; end if ( new."AuftrDokPosi_Artikel_ID" is not null and ( new."AuftrDokPosi_PreisEinheit" is null or new."AuftrDokPosi_MwStSaetze_ID" is null or new."AuftrDokPosi_Waehrung" is null )) then begin select A."Art_PreisEinheit" , A."Art_MwStGruppe" , B."Klog_Waehrung" , coalesce( new."AuftrDokPosi_PositionsRabatt" , C."RGW_Rabatt" ) from "Artikel" A join "Kataloge" B ON B."Katalog_ID" = A."Art_Katalog_ID" left outer join "RabattGruppenWarengruppe" C ON C."RGW_RabattGruppen_ID" = :"RabattGruppenID" and C."RGW_WarenGruppe" = A."Art_WarenGr" where A."Artikel_ID" = new."AuftrDokPosi_Artikel_ID" and a."Artikel_Version" = new."AuftrDokPosi_ArtikelVersion" into :"PreisEinheit" , :"MwStGruppe" , :"Waehrung" , new."AuftrDokPosi_PositionsRabatt" ; if ( new."AuftrDokPosi_PreisEinheit" is null ) then new."AuftrDokPosi_PreisEinheit" = :"PreisEinheit"; if ( new."AuftrDokPosi_MwStSaetze_ID" is null ) then new."AuftrDokPosi_MwStSaetze_ID" = ( select first (1) "MwSt_Saetze_ID" from "MwSt_Saetze" A where new."AuftrDokPosi_LeistungErbringung" >= A."Ab_Datum" and :"MwStGruppe" = A."MwSt_Saetze_Gruppen_ID" order by "Ab_Datum" DESC ); /* Order BY ist wichtig nur so kommt immer der richtige Satz */ if ( new."AuftrDokPosi_Waehrung" is null ) then new."AuftrDokPosi_Waehrung" = :"Waehrung"; end else begin if ( new."AuftrDokPosi_PreisEinheit" is null ) then new."AuftrDokPosi_PreisEinheit" =1; -- Evtl. auf deafaultwert in Stammdaten setzen und nicht einfach auf 1 if ( new."AuftrDokPosi_Waehrung" is null ) then new."AuftrDokPosi_Waehrung" = 1; -- Evtl. auf deafaultwert in Stammdaten setzen und nicht einfach auf 1 end end -- Ende INSERTING If if ( new."AuftrDokPosi_Art" >= 99 and new."AuftrDokPosi_Art" not between 300 and 401 ) then new."AuftrDokPosi_MwStSaetze_ID" = 0; else if ( ( new."AuftrDokPosi_Art" < 99 ) and ( new."AuftrDokPosi_LeistungErbringung" is distinct from old."AuftrDokPosi_LeistungErbringung" or new."AuftrDokPosi_LeistungErbringung" is null or new."AuftrDokPosi_MwStSaetze_ID" is distinct from old."AuftrDokPosi_MwStSaetze_ID" or new."AuftrDokPosi_MwStSaetze_ID" is null )) then begin -- Muss ganz hier oben stehen. -- exception "Fatal_Error" iif( UPDATING , 'Upd.', 'Ins' )||iif( new."AuftrDokPosi_AbgeleitetVonPos" is null , ' Nicht abgel. ' , ' abgel. ') ||'MwSt-Satz:'||coalesce( new."AuftrDokPosi_MwStSaetze_ID", 'NULL' ) ; select "AuftrDokument_Art" , "AuftrDokument_BruttoPreise" , iif( A."AuftrDokument_Art" < 10000 , I."K_StdMwStGruppen_ID" , L."L_StdMwStGruppen_ID" ) /* Beim INSERT soll er den Default ueber Kunde / Lieferant nehmen wenn angegeben ansosnten den Staaten Standard. Beim UPDATE/Fortfuehren sucht er wie vorher einfach den passendne Satz zur vorhandenen Gruppe. ( Aber die Gruppe muss natuerlich zur Dokument Brutto/Netto passen !!!) So wird auch beim INSERT wenn schon etwas vorgegeben ist wenn man im Artikelsucheform eine Paste ausloest trotzdem nochmal auf das hinterlegte gegangen. Wird die Position kopiert wird die MwSt-Gruppe evtl. angepasst wenn aber fortgefuehrt wird bleibt sie gleich. Wenn es eine Artikelposition ist wird oben new."AuftrDokPosi_MwStSaetze_ID" gesetzt auf die richtige Standardgruppe des Artikels z.B. Standard oder ermaessigt. */ , ( select first 1 "MwSt_Saetze_ID" from "MwSt_Saetze" MWS join "MwSt_Gruppen" MWG ON MWG."MwStGruppen_ID" = MWS."MwSt_Saetze_Gruppen_ID" and ( ( A."AuftrDokument_BruttoPreise" = 'Y' and MWG."MwStGr_NurNettoPosition" != 'Y') or ( A."AuftrDokument_BruttoPreise" = 'N') ) where new."AuftrDokPosi_LeistungErbringung" >= "Ab_Datum" and MWS."MwSt_Saetze_Gruppen_ID" = iif( UPDATING or new."AuftrDokPosi_AbgeleitetVonPos" is not null , coalesce( H."MwStGruppen_ID" , F."MwStGruppen_ID" ) ,coalesce( iif( A."AuftrDokument_Art" < 10000 , I."K_StdMwStGruppen_ID" , L."L_StdMwStGruppen_ID" ) , coalesce( H."MwStGruppen_ID" , F."MwStGruppen_ID" ))) order by "Ab_Datum" DESC ) , "RGMGP_RabattGruppenID" from "AuftragsDokumente" A join "AKT_Gesch_Partner" B ON B."Akt_Gesch_Partner_ID" = A."AuftrDokument_von_GP_ID" -- A."AuftrDokument_von_GP_ID" muss benutzt werden es soll ja der Standard MwSt-Satz des GP/Mandanten ermittelt werden. left outer join "Kunden" I ON I."K_Gesch_Partner_ID" = A."AuftrDokument_fuer_GP_ID" left outer join "Lieferanten" L ON L."L_Gesch_Partner_ID" = A."AuftrDokument_fuer_GP_ID" join "Gesch_partner" C ON C."Gesch_partner_verID" = B."Akt_Gesch_Partner_VerID" join "Anschriften" D ON D.anschriften_id = C."GP_Anschrift" join PLZ E ON E.plz_id = D.a_plz_id -- default MwSt-Gruppe fuer den Mandant Staat left outer join "MwSt_Gruppen" F ON F."MwStGr_Staaten_ID" = E."PLZ_Postkuerzel" and F."MwStGr_StaatenStd" = 'Y' and ( ( A."AuftrDokument_BruttoPreise" = 'Y' and F."MwStGr_NurNettoPosition" != 'Y') or ( A."AuftrDokument_BruttoPreise" = 'N') ) -- MwSt-Gruppe die angegeben ist in der Position. left outer join "MwSt_Gruppen" H ON H."MwStGruppen_ID" = ( select MWSS1."MwSt_Saetze_Gruppen_ID" from "MwSt_Saetze" MWSS1 where MWSS1."MwSt_Saetze_ID" = new."AuftrDokPosi_MwStSaetze_ID" ) and ( ( A."AuftrDokument_BruttoPreise" = 'Y' and H."MwStGr_NurNettoPosition" != 'Y') or ( A."AuftrDokument_BruttoPreise" = 'N') ) -- left outer join hier muss sein da es evtl. ja keine "MwStGr_StaatenStd" = 'Y' gibt und dann kommt ja nichts mehr zurueck left outer join "RabattGruppeMandGeschPartner" G ON A."AuftrDokument_fuer_GP_ID" = G.rgmgp_gp_id and rdb$get_context( 'USER_SESSION' , 'MANDANT_GP_ID' ) is not distinct from G."RGMGP_Mandant_GP_ID" -- A."AuftrDokument_fuer_GP_ID" evtl. uebverdenken wenn eine andere Anschtift oder Original GP setzen aktiv ist -- mal schauen where A."AuftrDokument_ID" = new."AuftrDokPosi_DokumentID" into :"AuftragDokumentArt", :"AuftrDokument_BruttoPreise" , :"MwSt_Satz_Gr_fuerGP_Std" , :"MwSt_Satz_ID" , :"RabattGruppenID"; -- exception "Fatal_Error"'Rabattgruppe:'||coalesce( :"RabattGruppenID",-1 )||' Mandant:'||rdb$get_context( 'USER_SESSION' , 'MANDANT_GP_ID' ); -- exception "Fatal_Error" iif( UPDATING , 'Upd.', 'Ins' )||iif( new."AuftrDokPosi_AbgeleitetVonPos" is null , ' Nicht abgel. ' , ' abgel. ') ||'MwSt-Satz:'||coalesce( :"MwSt_Satz_ID", 'NULL' ) ; if ( :"MwSt_Satz_ID" is null ) then exception "Fatal_Error"'MwSt.-Satz. konnte nicht ermittelt werden. Brutto/Netto Dokument ?'; new."AuftrDokPosi_MwStSaetze_ID" = :"MwSt_Satz_ID"; end if ( UPDATING ) then begin /* Wenn der Artikel gewechselt wird wird die neust ID eingelesen und auch der neue Preis berechnet wenn menge not NULL */ if ( new."AuftrDokPosi_Artikel_ID" is distinct from old."AuftrDokPosi_Artikel_ID" ) then begin if ( new."AuftrDokPosi_Artikel_ID" is not null ) then begin select max("Artikel_Version") from "Artikel" A where A."Artikel_ID" = new."AuftrDokPosi_Artikel_ID" into new."AuftrDokPosi_ArtikelVersion"; -- Wird in INSERTING benoetigt deshalb steht es hier oben if ( new."AuftrDokPosi_Menge" is not null ) then new."AuftrDokPosi_GPreis" = NULL; end end end /* Preis fuer einen Artikel aus der DB suchen und eintragen wenn das Feld Preis DB-NULL ist und in menge > 0 */ if ( new."AuftrDokPosi_GPreis" is null and new."AuftrDokPosi_Menge" > 0 and ( new."AuftrDokPosi_Artikel_ID" is not null or new."AuftrDokPosi_AbgeleitetVonPos" is not null )) then begin if ( new."AuftrDokPosi_AbgeleitetVonPos" is not null ) then select round(( "Bestell-GPreis" / "Bestell-Menge" ) * new."AuftrDokPosi_Menge" ,2 ) from "AuftrDokPosition_Historie"( 1, NULL , NULL , new."AuftragsDokumentePositionen_ID" , NULL , NULL) into new."AuftrDokPosi_GPreis" ; if ( new."AuftrDokPosi_GPreis" is null and new."AuftrDokPosi_Artikel_ID" is not null ) then begin if ( :"AuftragDokumentArt" is null ) then select "AuftrDokument_Art" , "AuftrDokument_BruttoPreise" from "AuftragsDokumente" A where A."AuftrDokument_ID" = new."AuftrDokPosi_DokumentID" into :"AuftragDokumentArt" , :"AuftrDokument_BruttoPreise"; -- select round( "EPreis" * new."AuftrDokPosi_Menge" ,2 ) from "ArtikelEkVkPreis"( iif( :"AuftragDokumentArt" < 10000 , 1 , 2 ) , new."AuftrDokPosi_Artikel_ID" , NULL , new."AuftrDokPosi_Menge" , NULL , :"AuftrDokument_BruttoPreise" , new."AuftrDokPosi_LeistungErbringung" ) -- Null fuer Version bedeutet er nimmt intern die neuste select round( iif( :"AuftrDokument_BruttoPreise" ='Y', "VPRM_ArtVkBruttoPreis" , "VPRM_ArtVkNettoPreis" ) * new."AuftrDokPosi_Menge" ,2 ) from "VkPreiseRabattMarge"( null , null , new."AuftrDokPosi_Artikel_ID" , new."AuftrDokPosi_ArtikelVersion" , null , null , new."AuftrDokPosi_PreisEinheit" , :"AuftragDokumentArt" , new."AuftrDokPosi_Menge" , new."AuftrDokPosi_ArtikelPreisVom" ,new."AuftrDokPosi_LeistungErbringung" , :"MwStGruppe" , new."AuftrDokPosi_Waehrung" ) -- Null fuer Version bedeutet er nimmt intern die neuste into new."AuftrDokPosi_GPreis" ; end end "MwStGr_NurNettoPosition" = ( select "MwStGr_NurNettoPosition" from "MwSt_Gruppen" A where a."MwStGruppen_ID" = ( select "MwSt_Saetze_Gruppen_ID" from "MwSt_Saetze" B where b."MwSt_Saetze_ID" = new."AuftrDokPosi_MwStSaetze_ID") ); -- Pruefen ob versucht wird eine reine Netto MwSt.-Gruppe in ein Bruttodokument einzusetzen. -- Fuer Kunden bei denen das als Standard MwST.-Gruppe hinterlegt ist sollte man kein Bruttodokument anlegen/bearbeiten koennen !!!! select "AuftrDokument_Art" , "AuftrDokument_BruttoPreise" , "AuftrDokument_VersandArt" from "AuftragsDokumente" A where A."AuftrDokument_ID" = new."AuftrDokPosi_DokumentID" into :"AuftragDokumentArt" , :"AuftrDokument_BruttoPreise" , :"StdVersandArt"; if ( :"AuftragDokumentArt" > 200 or new."AuftrDokPosi_Art" > 10 ) then new."AuftrDokPosi_VersandArt" = NULL; -- Immer auf NULL setzen wenn es nicht zugeordnet sein darf !!!! if ( :"MwStGr_NurNettoPosition" = 'Y' and :"AuftrDokument_BruttoPreise" = 'Y' ) then exception "Fatal_Error"'MwSt.-Gruppe im Bruttodokument nicht erlaubt !'; if ( ( new."AuftrDokPosi_Art" < 99 or new."AuftrDokPosi_Art" between 300 and 401 ) and new."AuftrDokPosi_MwStSaetze_ID" = 0 ) then exception "MwStGruppeFehlt"; -- ansonsten ist es scheinbar moeglich den Dummy MwSt satz rein zu bekommen das hier koennte auch in einem Check stehen if ( new."AuftrDokPosi_AbgeleitetVonPos" is not null ) then begin -- Auf alle abhaengikeiten der Abgeleiteten Position Achten die Eingehalten werden muessen if ( new."AuftrDokPosi_PreisEinheit" is distinct from old."AuftrDokPosi_PreisEinheit" and new."AuftrDokPosi_Art" < 50 ) then -- Hier darauf achten das in Fortgefuehrten Positionen die "AuftrDokPosi_PreisEinheit" nicht geaendert wird da sich dann die mengen nicht mehr einfach summieren lassen. begin -- Evtl. spaeter mal eine automatische umrechnung einbauen. Dann muss das hier angepasst werden. if ( new."AuftrDokPosi_PreisEinheit" is distinct from ( select "AuftrDokPosi_PreisEinheit" from "AuftragsDokumentePositionen" where "AuftragsDokumentePositionen_ID" = new."AuftrDokPosi_AbgeleitetVonPos" ) ) then exception "Fatal_Error" 'Die Einheit in der abgeleiteten Position darf nicht von der Urspruenglichen abweichen !'; end if ( UPDATING ) then -- Nur bei Updates begin if ( new."AuftrDokPosi_Art" is distinct from old."AuftrDokPosi_Art" ) then -- Wenn die Positionsart in der abgeleiteten Position veraendert wird begin -- Kopieren an sich findet ueber das System statt also kann beim Insert der Typ normalerweise auch nicht geaendert werden. -- Nachschauen ob der Benutzer die Rechte besitzt fortgefuehrte Positiinen zu veraendern. 1.( Artikel Position in Artikel Text geaendert ) if ( ( select "BR_AuftrDokArtVerFortgefAendern" from "BenutzerRechte" -- 2. ( Den Text der Position an zu passen ! ) where "BR_UserName" = current_user and "BR_MandantGP_ID" = rdb$get_context( 'USER_SESSION' , 'MANDANT_GP_ID') ) is distinct from 'Y' or ( new."AuftrDokPosi_Art" is distinct from 2 and old."AuftrDokPosi_Art" is distinct from 1 ) -- Wenn die neue Positionart != 2 ist und die alte != 1 or new."AuftrDokPosi_Art" is distinct from 2 ) then -- Wenn die neue Positionart != 2 ist exception "Fatal_Error" 'Die Positionsart in der abgeleiteten Position darf nicht von der Urspruenglichen abweichen !'; end if ( new."AuftrDokPosi_Artikel_ID" is distinct from old."AuftrDokPosi_Artikel_ID" ) then exception "Fatal_Error" 'Der "Artikel" draf nicht gegen einen neuen getauscht werden !'; if ( ( select "BR_AuftrDokArtVerFortgefAendern" from "BenutzerRechte" where "BR_UserName" = current_user and "BR_MandantGP_ID" = rdb$get_context( 'USER_SESSION' , 'MANDANT_GP_ID') ) is distinct from 'Y' and ( new."AuftrDokPosi_ArtikelVersion" is distinct from old."AuftrDokPosi_ArtikelVersion" )) then exception "Fatal_Error" 'Der Positionstext in der abgeleiteten Position darf nicht vom Urspruenglichen abweichen !'; end end -- Pruefen ob die Einheitentypen zusammen passen wenn es eine Artikelposition ist !!!! if ( new."AuftrDokPosi_Artikel_ID" is not null ) then begin if ( ( select "Einh_Typ" from "Einheiten" A where a."Einheiten_ID" = new."AuftrDokPosi_PreisEinheit" ) is distinct from ( select "Einh_Typ" from "Einheiten" A where a."Einheiten_ID" = ( select "Art_PreisEinheit" from "Artikel" B where b."Artikel_ID" = new."AuftrDokPosi_Artikel_ID" and b."Artikel_Version" = new."AuftrDokPosi_ArtikelVersion" ) ) ) then exception "Fatal_Error" 'Die gewaehlte Einheit passt nicht zu der Einheit des Artikel !'; end end ^ /* Alter exist trigger... */ ALTER TRIGGER "Kunden_HTY" AS begin insert into "HTY_Kunden" ( "K_Gesch_Partner_ID" , K_KDNR , "K_LiefNr_beim_Kunden" , "K_Aktiv" , "K_Bemerkung" , "K_Betriebsferien" ,"K_TeillieferungErlaubt" , "K_StdMwStGruppen_ID" , "K_Zahlungsart", "K_TageZahlungsziel" , "K_SkontoSatz" , "K_SkontoTage" , "K_KundenArtFestVergeben" , "K_Mahngebuehr" , "K_VerzugsZinsen" , "K_Aend_Zeit" ,"K_Aend_Benu" , "K_BruttoDokumente", "K_Aend_AspID", "K_RGmitAblieferbeleg" ) values ( old."K_Gesch_Partner_ID" , old.K_KDNR , old."K_LiefNr_beim_Kunden" , old."K_Aktiv" , old."K_Bemerkung" , old."K_Betriebsferien" ,old."K_TeillieferungErlaubt", old."K_StdMwStGruppen_ID" , old."K_Zahlungsart", old."K_TageZahlungsziel" , old."K_SkontoSatz" , old."K_SkontoTage" , old."K_KundenArtFestVergeben" , old."K_Mahngebuehr" , old."K_VerzugsZinsen" , old."K_Aend_Zeit" ,old."K_Aend_Benu" , old."K_BruttoDokumente", old."K_Aend_AspID", old."K_RGmitAblieferbeleg" ); end ^ /* Alter exist trigger... */ ALTER TRIGGER "Kunden_IU" AS begin new."K_Aend_Zeit" = CURRENT_TIMESTAMP; new."K_Aend_AspID" = ( select rdb$get_context( 'USER_SESSION' , 'USER_ASP_ID' ) from "GetOneResultRow" ); new."K_Aend_Benu" = NULL; -- NULL setzen ist wichtig sonst bleibt evtl. was altes stehen if ( new."K_RGmitAblieferbeleg" is null or trim( new."K_RGmitAblieferbeleg" ) = '' ) then new."K_RGmitAblieferbeleg" = 'N'; if ( new."K_Aend_AspID" is null ) then new."K_Aend_Benu" = CURRENT_USER; if ( inserting ) then begin if ( new.k_kdnr is null ) then new.k_kdnr = GEN_ID( "Kunden_ID" , 1 ); new."K_Aktiv" = 'Y'; if ( new."K_TeillieferungErlaubt" is null ) then new."K_TeillieferungErlaubt" = 'N'; end if ( UPDATING and old.k_kdnr is not null ) then begin if ( new.k_kdnr is distinct from old.k_kdnr and upper (current_user)!= 'SYSDBA' ) then exception "UnerlaubSchluesseffeldaenderung" 'Kundennr. darf nicht geaendert werden !'; -- Kundennr. darf nur geaenmdert werden wenn es keine Dokumente zum Kunden gibt !!! -- Evtl. nur Ausgangsdokumente beachten. if ( current_user != 'SYSDBA' ) then -- OK wenn es SYSDBA macht ist es OK. begin -- Noch eine Berechtigung bei den Usern einfuehren damit es auch normale User duerfen !!! if ( new.k_kdnr is distinct from old.k_kdnr and exists( select * from "AuftragsDokumente" A where a."AuftrDokument_von_GP_ID" = old."K_Gesch_Partner_ID" or a."AuftrDokument_fuer_GP_ID" = old."K_Gesch_Partner_ID" )) then exception "Fatal_Error"'Aenderung nicht moeglich da Dokumente vorhanden !'; if ( new.k_kdnr is distinct from old.k_kdnr and exists( select * from "AuftragsDokumenteAnschrZuordnun" A where a.adaz_gp_id = old."K_Gesch_Partner_ID" and a."ADAZ_KopieEmpfaenger" = 0 )) then exception "Fatal_Error"'Aenderung nicht moeglich da Dokumente vorhanden !'; end end end ^ /* Alter exist trigger... */ ALTER TRIGGER VW_BENUTZER_AIUD AS declare variable "StateM" varchar(2048); declare variable "Obj" varchar(31); begin if ( INSERTING ) then begin if ( new."Passwort" != '' ) then begin "StateM" = 'create user ' || upper(new."DBUserName") || ' PASSWORD '''||new."Passwort" || ''''; if ( new."Name" is not null ) then "StateM" = "StateM" || ' FIRSTNAME ''' || new."Name" || ''''; if ( new."Vorname" is not null ) then "StateM" = "StateM" || ' LASTNAME ''' || new."Vorname" || ''''; in autonomous transaction do -- Ist hier aus welchem Grund auch immer wichtig sonst uebernimmt er nur den ersten eingegebebn User begin execute statement :"StateM"; when any do -- Wenn es den User schon gibt einfach weiter machen fertig begin end end execute procedure "Benutzer_SQL_RechteSetzen"('Y', new."DBUserName" ,NULL); end end else if ( UPDATING ) then begin "StateM" = 'alter user ' || upper(new."DBUserName"); if ( new."Passwort" is distinct from old."Passwort" and new."Passwort" is not null ) then begin if ( char_length( coalesce( new."Passwort" , '')) < 2 ) then -- Mind 2 Zeichen fuer das Passwort exception "Fatal_Error"'Passwort zu kurz ! Mind. 2 Zeichen'; "StateM" = "StateM" || ' PASSWORD '''||new."Passwort" || ''''; end if ( new."Name" is not null ) then "StateM" = "StateM" || ' FIRSTNAME ''' || new."Name" || ''''; if ( new."Vorname" is not null ) then "StateM" = "StateM" || ' LASTNAME ''' || new."Vorname" || ''''; -- Bei jedem aendern der Benutzerrechte alles was ueber den View geht wird auch ein "Alter User" erzeugt. -- Das problem ist, dass es kein select gibt um zu schauen ob und wie der Benutzer angelegt ist. -- Wenn der Benutzer in der DB nicht vorhanden ist kommt hier eine Exception "Record not found" die vom "When any do" nicht abgefangen wird. -- Momentan muß der Benutzer dann von Hand angelegt werden. -- Evtl. im Programm darauf reagieren und den Benutzer automatisch anlegen wenn der Fehler kommt !!!! -- In FB3.0 I added CORE 4217 (Add sec$admin_role to pseudo-table sec$users) as an improvement on this issue. -- In der Tabelle koenen die tatsaechlich vorhandenen Benutzer gelesen werden. in autonomous transaction do -- Ist hier aus welchem Grund auch immer wichtig sonst setzt er das Passwort nur beim ersten aendern wenn man das selbe nochmal aendert bleibt das erste in der Security db wenn man den Stammdateneditor verlaesst geht es aber -- mit autnonomus tr geht es aber immer begin execute statement :"StateM"; when any do -- Alle Fehler abfangen und NULL zurueckgeben begin in autonomous transaction do insert into "ErrorLog" ( "EL_SQLErrorCode" , "EL_Text" , "EL_Angezeigt" ) values( SQLSTATE , 'Aufgetreten in Tr VW_BENUTZER_AIUD. Aktueller Benutzer:'|| current_user || ' zu aendernder Benutzer:' || coalesce(new."DBUserName",'---' ) , 'N'); end end end else if ( DELETING ) then begin "StateM" = 'REVOKE ALL ON ALL FROM '|| old."DBUserName"; begin execute statement :"StateM"; when any do -- Alle Fehler abfangen und NULL zurueckgeben begin end end "StateM" = 'drop user '|| old."DBUserName"; in autonomous transaction do -- Ist hier aus welchem Grund auch immer wichtig sonst uebernimmt er nur den ersten geloeschten User begin execute statement :"StateM"; when any do -- Alle Fehler abfangen und NULL zurueckgeben begin end end end end ^ /* Alter Procedure... */ /* Alter (ApplyOnCommitActionList) */ ALTER PROCEDURE "ApplyOnCommitActionList"("ApplyOnlyAction" INTEGER, "ApplyOnlyActions" "d_BLOB_Text_AsciiGross") AS declare variable "Action" integer; declare variable "Param1BI" bigint; declare variable "Param2BI" bigint; declare variable "Param3BI" bigint; declare variable "Param4BI" bigint; declare variable "Param5VC" "d_str160"; declare variable "Ret" "d_str160"; declare variable "TempInt1" integer; begin -- "ApplyOnlyActions" wird noch nicht beruecksichtigt !!!!!!!! if ( :"ApplyOnlyAction" is null or :"ApplyOnlyActions" is null or :"ApplyOnlyAction" in ( 1) ) then begin for select distinct "Action" , "Param1" , "Param2" , "Param3" from "OnCommitActionList" where "Action" in ( 1 ) into :"Action" , :"Param1BI" , :"Param2BI" , :"Param3BI" do begin if ( :"Action" = 1 ) then -- 'SummenEintragen' im Auftragsdokument begin -- Als "IntParam1" wird die "AuftrDokument_ID" erwartet if ( :"Param1BI" is null ) then begin in autonomous transaction do insert into "ErrorLog" ( "EL_Text" ) values( 'Trigger "DB_ActionListCommit1" Action =1 "AuftrDokument_ID" is null' ); end else begin if ( exists( select * from "AuftragsDokumente" A where A."AuftrDokument_ID" = :"Param1BI" ) ) then -- Evtl. wurde das dokument danach geloescht dann gaebs hier ne Fehlermeldung execute procedure "AuftrDokPositionen_Funktionen"( 'SummenEintragen' , NULL , NULL , NULL , NULL , :"Param1BI", NULL,NULL ) returning_values :"Ret" , :"Param5VC" ,:"Param3BI" ,:"Param3BI" ,:"Param3BI"; end end end when any do begin -- Im Fehlerfall die Action mit Parametern loggen und die exception ansonsten verschlucken in autonomous transaction do insert into "ErrorLog" ( "EL_SQLErrorCode" , "EL_Text" ) values( SQLSTATE , 'Trigger "DB_ActionListCommit2" Action ='|| coalesce(:"Action",'NULL' ) || ' Param1=' || coalesce(:"Param1BI",'NULL') || ' Param2=' || coalesce(:"Param2BI",'NULL') || ' Param3=' || coalesce(:"Param3BI",'NULL') ); -- Die Fehler duerfen nicht uebergangen werden !!!! Deshalb macht das mit dem DEBUG keinen Sinn !!!!! -- Am 14.01.2015 gab es ein Dokument dessen Fortgefuehrt Status nichjt stimmte weil hier die Exception verschluckt wurde. -- if ( rdb$get_context( 'USER_SESSION' , 'DEBUG' ) = 1 ) then exception; end end if ( :"ApplyOnlyAction" is null or :"ApplyOnlyActions" is null or :"ApplyOnlyAction" in ( 2 ) ) then begin for select distinct B."AuftrDokPosi_DokumentID" , C."AuftrDokPosi_DokumentID" from "OnCommitActionList" A join "AuftragsDokumentePositionen" B ON A."Param3" = B."AuftragsDokumentePositionen_ID" left outer join "AuftragsDokumentePositionen" C ON B."AuftrDokPosi_AbgeleitetVonPos" = C."AuftragsDokumentePositionen_ID" where "Action" = 2 into :"Param1BI" , :"Param2BI" do begin if ( :"Param1BI" is null ) then begin in autonomous transaction do insert into "ErrorLog" ( "EL_Text" ) values( 'Trigger "DB_ActionListCommit3" Action =2 "AuftrDokumentPositionenID" not found' ); end else begin -- Das Update mit der veränderung im Feld "AuftrDokument_VollstFortgefuehr" reicht aus damit der trigger der Tabelle den Rest erledigt. update "AuftragsDokumente" A set A."AuftrDokument_VollstFortgefuehr" = -1 where A."AuftrDokument_ID" = :"Param1BI"; if ( :"Param2BI" is not null ) then update "AuftragsDokumente" A set A."AuftrDokument_VollstFortgefuehr" = -1 where A."AuftrDokument_ID" = :"Param2BI"; end if ( :"ApplyOnlyAction" is not null ) then delete from "OnCommitActionList" where "Action" = :"ApplyOnlyAction"; end when any do begin -- Im Fehlerfall die Action mit Parametern loggen und die exception ansonsten verschlucken in autonomous transaction do insert into "ErrorLog" ( "EL_SQLErrorCode" , "EL_Text" ) values( SQLSTATE , 'Trigger "DB_ActionListCommit4" Action ='|| coalesce(:"Action",'NULL' ) || ' Param1=' || coalesce(:"Param1BI",'NULL') || ' Param2=' || coalesce(:"Param2BI",'NULL') || ' Param3=' || coalesce(:"Param3BI",'NULL') ); -- if ( rdb$get_context( 'USER_SESSION' , 'DEBUG' ) = 1 ) then exception; end end if ( :"ApplyOnlyAction" is null or :"ApplyOnlyActions" is null or :"ApplyOnlyAction" in ( 3) ) then begin for select distinct "Action" , "Param1" , "Param2" from "OnCommitActionList" where "Action" = 3 and "Param1" is not null into :"Action" , :"Param1BI" , :"Param2BI" do begin if ( :"Param2BI" = 200 ) then -- Auftragsbestatetigung begin "TempInt1" = ( select "Auftrags_Status" from "Auftrags_StatusErmitteln"( :"Param1BI" )); if ( not exists ( select * from "AuftragsDokumenteExt" A where A."ADE_AuftrDokument_ID" = :"Param1BI" and A."ADE_AuftragsStatus" = :"TempInt1" ) ) then update or insert into "AuftragsDokumenteExt" ( "ADE_AuftrDokument_ID" , "ADE_AuftragsStatus" ) values ( :"Param1BI" , :"TempInt1" ) matching( "ADE_AuftrDokument_ID" ); end if ( :"Param2BI" = 10200 ) then -- Bestellung begin -- "TempInt1" = ( select "Bestell_Status" from "Bestell_StatusErmitteln"( :"Param1BI" )); end end when any do begin -- Im Fehlerfall die Action mit Parametern loggen und die exception ansonsten verschlucken in autonomous transaction do insert into "ErrorLog" ( "EL_SQLErrorCode" , "EL_Text" ) values( SQLSTATE , 'Trigger "DB_ActionListCommit2" Action ='|| coalesce(:"Action",'NULL' ) || ' Param1=' || coalesce(:"Param1BI",'NULL') || ' Param2=' || coalesce(:"Param2BI",'NULL') || ' Param3=' || coalesce(:"Param3BI",'NULL') ); -- if ( rdb$get_context( 'USER_SESSION' , 'DEBUG' ) = 1 ) then exception; end end end ^ SET TERM ; ^ DESCRIBE PARAMETER "Auftrag_VersKosten" PROCEDURE "Auftrags_StatusErmitteln" 'Alles von ( 50-55) sind Kosten im zusammenhang mit dem Versand ( Versandkosten ).'; DESCRIBE PARAMETER "LS_PosSumme" PROCEDURE "Auftrags_StatusErmitteln" 'Summer der Positionen "AuftrDokPosi_Art" < 50 50 =Versandkosten.'; DESCRIBE PARAMETER "Anzahl_LS_FortGefuehrt" PROCEDURE "Auftrags_StatusErmitteln" 'Fortgefuehrte Dokumente oder auch manuell abgeschlossenen Dokumente.'; DESCRIBE PARAMETER "RG_PosSumme" PROCEDURE "Auftrags_StatusErmitteln" 'Summer der Positionen "AuftrDokPosi_Art" < 50 50 =Versandkosten.'; DESCRIBE PARAMETER "Anzahl_RG_FortGefuehrt" PROCEDURE "Auftrags_StatusErmitteln" 'Fortgefuehrte Dokumente oder auch manuell abgeschlossenen Dokumente.'; DESCRIBE PARAMETER "AutomatErmittelterStatus" PROCEDURE "Auftrags_StatusErmitteln" 'Der Status der automatisch fuer diesen Auftrag ermittelt wurde.'; DESCRIBE PARAMETER "AnzahlFehler_PreisEinheit" PROCEDURE "Auftrags_StatusErmitteln" 'Wenn es unterschiedliche Preiseinheiten gab dies hier hochzaehlen.'; /* empty dependent procedure body */ /* Clear: AuftrDokDruck_HelperFunction for: AuftragsDokumente_Drucken */ SET TERM ^ ; ALTER PROCEDURE "AuftrDokDruck_HelperFunction"("Funktion" "d_str60", "I_DokumentID" INTEGER, "I_FormatString" "d_str60", "I_Pos" BIGINT, "I_Struktur" "d_str50") RETURNS("O_MaxPosNrLen" INTEGER, "O_StrukturFormatString" "d_str50", "O_LastPositionID" BIGINT) AS BEGIN SUSPEND; END ^ /* empty dependent procedure body */ /* Clear: AuftrDokument_Summen for: AuftragsDokumente_Drucken */ ALTER PROCEDURE "AuftrDokument_Summen"("I_AuftrDokumentID" INTEGER, "I_StrukturID" INTEGER, "I_KeinStrukturPreis" D_BOOLEAN_YN, "I_AlleStrukturPreise" D_BOOLEAN_YN, "I_SummenFunktion" INTEGER) RETURNS("MwSt_Saetze_ID" INTEGER, "StrukturID" INTEGER, "GesAnzPositionen" INTEGER, "Summe" "Geld", "AnzPosAusArtikelDB" INTEGER, "ArtikelSumme" "Geld", "ArtikelSummeBruttoErloes" "Geld", "Betrag" "Geld", "MwSt_Satz" "MwSt_UmrechungsGenau", "MwSt_Summe" "Geld", "O_AuftragDokumentPositionenID" BIGINT, RET "d_str160", "NettoPosSummOhneRabatt" "Geld", "VersteckteBruttoRabattSumme" "Geld", "NettoWerksabgabePreis" "Geld", "O_AuftrDokumentID" INTEGER) AS BEGIN SUSPEND; END ^ /* empty dependent procedure body */ /* Clear: SPDrucktestVerglFuerUmstelDelet for: AuftragsDokumente_Drucken */ ALTER PROCEDURE "SPDrucktestVerglFuerUmstelDelet" RETURNS("PositionsArt" INTEGER, "PositionsNr" INTEGER, "PosText1" "d_str10", "PosText2" "d_str60", "ArtikelBlobText" BLOB SUB_TYPE 1 SEGMENT SIZE 8192, "KurztextAnzAbsaetze" INTEGER, "ZeilenNr" INTEGER, "RowType" INTEGER, "StrukturText" "d_str50") AS BEGIN SUSPEND; END ^ /* empty dependent procedure body */ /* Clear: SPDrucktestVerglFuerUmstellung for: AuftragsDokumente_Drucken */ ALTER PROCEDURE "SPDrucktestVerglFuerUmstellung"("Nachher" D_BOOLEAN_YN) AS BEGIN EXIT; END ^ /* Alter (AuftragsDokumente_Drucken) */ ALTER PROCEDURE "AuftragsDokumente_Drucken"("I_AuftrDokumentID" INTEGER, "I_DruckKonfigID" INTEGER, "I_Eltern_ID" INTEGER, "I_PositionsString" "d_str50", "I_NurDieseEbene" D_BOOLEAN_YN, "I_NettoPreise" D_BOOLEAN_YN, "I_MwSt_Kurzform" D_BOOLEAN_YN, "I_Format" "d_str10", "I_Format_PosText" "d_str40", "I_Format_G-Preis" "d_str20", "I_Format_E-Preis" "d_str20", "I_Format_Menge" "d_str20", "I_Warnings" D_BOOLEAN_YN, "I_Commands" TYPE OF COLUMN "DruckJobs"."DrJob_Commands", "I_Int_Help" INTEGER, "I_BigInt_Help" BIGINT, "I_Varchar_Help" "d_str512", "I_Zeile" INTEGER) RETURNS("PositionsArt" INTEGER, "StrukturText" "d_str50", "PositionsNr" INTEGER, "PositionsStringFormatiert" "d_str60", "PosText1" "d_str10", "PosText2" "d_str60", "RAuftrDokStruktur_ID" INTEGER, "RAuftragsDokumentePositionen_ID" GENERATOR_VALUE, "VMenge" "d_str20", "NMenge" "d_str10", "MengeGeliefert" "d_str20", "MengeRueckstand" "d_str20", "ArtikelText" "d_strMax", "ArtikelBlobText" BLOB SUB_TYPE 1 SEGMENT SIZE 8192, "KurztextAnzAbsaetze" INTEGER, "Artikelnummer" VARCHAR(31), "EAN_Code" GENERATOR_VALUE, "E-Preis" "d_str20", "G-Preis" "d_str20", "Preiseinheit" "d_str30", "MwSt_Satz" "d_str10", "TexgenCommand" "d_str30", "HintergrundFarbe" VARCHAR(6), "Warnings" "d_str320", "CZeileFett" VARCHAR(1), "CZeileItalic" VARCHAR(1), "CgesPreisFett" VARCHAR(1), "CgesPreisUnterstreichen" VARCHAR(1), "CgesPreisDoppeltUnterstreichen" VARCHAR(1), "ZeilenNr" INTEGER, "RowType" INTEGER, "ExtraAbstandEinfuegen" INTEGER, "PosRabatt" "d_str10", "Pos_GPreis_StruktPreis" "Geld") AS declare variable "V_AuftragsDokumentePositionenID" GENERATOR_VALUE; declare variable "V_AuftrDokStrukturID" integer; declare variable "V_AuftrDokPos" integer; declare variable "V_AuftrDokPosText" "PositionsNrText"; declare variable "V_StrukturID" integer; declare variable "V_Option" integer; declare variable "V_Kurztext" integer; declare variable "V_PositionsArt" integer; declare variable "V_LastPositionsArt" integer; /* Welche Positionsart vor dieser war */ declare variable "V_Position" integer; declare variable "V_StrukturPos" varchar(5); declare variable "V_Struktur_Summe" "Geld"; declare variable "V_AuftrDokStruktur_SummeDrucken" "D_BOOLEAN_YNNull"; declare variable "V_Struktur_FettDrucken" "D_BOOLEAN_YNNull"; declare variable "V_Struktur_InAuflistung" "D_BOOLEAN_YNNull"; declare variable "V_Struktur_PreiseAusbl" "D_BOOLEAN_YNNull"; declare variable "V_OldStruktur_PreiseAusbl" "D_BOOLEAN_YNNull"; declare variable "V_CursorEmpty" integer = 0; declare variable "V_Positionen_ArtikelText" type of column "AuftrDokum_TextArtenSprachen"."ADTAS_Text"; /* "AuftrDokum_TextArtenSprachen"."ADTAS_Text" evtl. kommt noch Text dazu durch ergaenzungen also von Hand etwas mehr definieren */ declare variable "V_Struktur_ArtikelText" type of column "AuftragsDokumentStruktur"."AuftrDokStruktur_Text"; declare variable "V_LangText" "d_BLOB_XML_RTF"; declare variable "V_LangTextHTML" "d_BLOB_HTML"; declare variable "V_PosG-Preis" "Geld_genau"; declare variable "V_PosG-PreisOhneRabatt" "Geld_genau"; declare variable "V_MwSt-Satz" "MwSt_Satz"; declare variable "V_Waehrung" "d_str20"; declare variable "V_EAN-Code" type of column "Artikel"."Art_EAN_Code"; declare variable "V_MengeDokument" "Mengen"; /* Mengenangabe wie sie im Dokument angegeben wurde. */ declare variable "V_Zeile" integer; declare variable "V_CountMwSt_Saetze" integer; /* Anzahl MwSt Positionen. */ declare variable "V_MwSt_KurzZeichen" varchar(1) character set ISO8859_1; declare variable "V_Artikelnummer" varchar(30); declare variable "V_EigeneArtikelNr" varchar(30); /* Bei Lieferanten Einkaufsdikumenten die Eigene Artikelnummer */ declare variable "V_TempGP_ID" integer; declare variable "V_Temp_AnschID" bigint; declare variable "V_Temp_ASP" integer; declare variable "V_AuftrDokumentArt" integer; declare variable "V_TempHelpInt" integer; declare variable "V_PreisEinheit" "d_str30"; /* "Einheiten"."Einh_Drucken" domain vor Aenderung jetzt wird durch die Ergaenzung der Inhaltsmenge mehr platz benoetigt */ declare variable "V_VPE_Inhalts_Menge" "Mengen"; declare variable "V_MengeAnzNachkommastellen" integer; declare variable "CKeinUmbruchDanach" char(1) = 'N'; declare variable "P_HiddenHide" integer; declare variable "P_MarkChangedArticle" integer; declare variable "Error" "d_str512"; declare variable "V_Staat" type of column "Staaten"."Postkuerzel"; declare variable "V_MwStGruppenName" type of column "MwSt_Gruppen"."MwSt_Gr_Name"; declare variable "V_PosRabatt" "d_str10"; declare variable "V_OldRowType" integer; declare variable "V_AuftrDokBruttoPreise" D_BOOLEAN_YN; declare variable "V_Von_GP_ID" integer; declare variable "V_Fuer_GP_ID" integer; declare variable "V_Fuer_AnschID" bigint; declare variable "V_Fuer_Asp" integer; declare variable "V_Liefer_GP_ID" integer; declare variable "V_Liefer_AnschID" bigint; declare variable "V_Liefer_Asp" integer; declare variable "V_TempVarCharMax" "d_strMax"; declare variable "V_TempInt" integer; declare variable "V_EigenschaftenText" "d_str512"; declare variable "V_DokStdVersandArtID" integer; /* Die im Dokument angegeben standard Versandart */ declare variable "V_AuftragPositionVersandArtID" integer; /* Die evtl. vorhandne Versandart der Position */ declare variable "V_AuftrPosiVersand_KurzZeichen" type of column "AuftragsDokumentVersandArt"."AufDokVerArt_StdKuerzel"; declare variable "V_EndsummeAusgegeben" integer = 0; /* Wenn die Endsumme ausgegeben. Dann soltte auch nichts mehr folgen. Nur Text kommt dann in den Bereich nach der Artikeltabelle */ declare "Struktur" cursor for ( select "AuftrDokStruktur_ID", "AuftrDokStruktur_Position", "AuftrDokStruktur_Text", "AuftrDokStruktur_Summe", "AuftrDokStruktur_SummeDrucken", "AuftrDokStruktur_FettDrucken", "AuftrDokStruktur_PreiseAusbl", "AuftrDokStruktur_InAuflistung" from "AuftragsDokumentStruktur" where "AuftrDokStruktur_Dokument_ID" = :"I_AuftrDokumentID" and "AuftrDokStruktur_ElternID" is not distinct from :"I_Eltern_ID" /* Diese code wird durch "is not distinct from" abgeloest where (cast(:"Eltern_ID" as integer) is null and "AuftrDokStruktur_ElternID" is null) or (cast(:"Eltern_ID" as integer) is not null and "AuftrDokStruktur_ElternID" = :"Eltern_ID") */ order by "AuftrDokStruktur_Position"); begin -- RowType == 0 nornmale Tabellenzeile /* ACHTUNG RowType 1 und 2 sind sehr gefährlich ( funktionieren nicht wie sie sollen ) Der Text nimmt nicht die Beite ein die er einnehmen soll sondern bricht schon vorher um. Das sieht natuerlich sehr bloed aus. RowType == 1 Tabellenzeile mit wenig multicolumn RowType == 2 Tabellenzeile mit viel multicolumn */ -- RowType == 3 MultiColumn Zeile fuer Summenzeilem am ende des Dokuments. Die Zeile darf/wird nicht UMGEBROCHEN sie muss passen !!!! -- RowType == 4 keinen Tabellentext ( Leerzeile ) -- RowType == 5 horizontale Linie -- RowType == 6 Seitenumbruch -- RowType == 7 Zusammenhaegender Bereich ohne Seitenumbruch ANFANG - Feld "ArtikelText" = 'bezeichner' ( bezeichner nur kleinbuchstaben ) -- RowType == 8 Zusammenhaegender Bereich ohne Seitenumbruch ENDE - Feld "ArtikelText" = 'bezeichner' ( bezeichner nur kleinbuchstaben ) --ExtraAbstandEinfuegen: DB-Null kein Abstand einfuegen / 0 = 1ex Abstand einfuegen / > 0 = Abstand in mm anhaengen / < 0 mm zurueck aber selber bloed wer macht --CZeileFett --CZeileItalic --CgesPreisFett --CgesPreisUnterstreichen --CgesPreisDoppeltUnterstreichen -- Parameter fuer "I_Commands" -- #HiddenHide# verbirgt alle als versteckt gekennzeichneten Zeilen -- #RealDokNr# gibt immer die richtige Dokumentnr. und nicht evtl. den Text "Dokumentvorschau" zurueck. wird in SP "AuftragDokument-Parameter" verwendet -- Folgende Parameter am 21.03.2013 zum Einbauen mit vorgesehen. -- #LieferAnschriftVerwenden# -- Wenn eine abweichende Lieferanschrift vorhanden ist wird diese Verwendet und die beiden Anschriftenfelder auf dem Dokument vertauscht. -- #KeineZweitAnschrift# -- Das zweite Adressfeld im Dokument wird auf jeden Fall leer gelassen /* ################## A C H T U N G ################ Daran denken das man die fuer_AnschID auch mit der Liefer_AnschID wechseln können muß. Zusätzlich ist jetzt noch der Asp. anwählbar ob er mit gedruckt werden soll. */ -- "P_HiddenHide" = coalesce( position( '#HiddenHide#' , :"I_Commands" ),0); "P_MarkChangedArticle" = coalesce( position( '#MarkChangedArticle#' , :"I_Commands" ),0); -- -- ACHTUNG immer darauf achten das die Summen des Dokument berechnet wurden. -- sonst werden alte Summen gedruckt. Kann hier nicht gut geprueft werden -- da auch Joins mit der SP gemacht werden und die gleich maulen oder -- andauernd Preise berechnet werden. -- Evtl. mal was anderes ueberlegen. if ( trim("I_PositionsString") = '') then "I_PositionsString" = NULL; "V_Position" = 1; if (:"I_Zeile" is null ) then "ZeilenNr" = 0; -- Wird unten schon bei der ersten Zeile +1 genommen else "ZeilenNr" = :"I_Zeile"; -- Wird unten schon bei ser ersten Zeile +1 genommen if ( :"I_Commands" is distinct from 'HelperFuntctionIsRunning' ) then -- Wird benutzt um die letzte Position im Dokument zu finden um den Summenstart RowType 7 zu senden. begin if ( :"I_Eltern_ID" is null ) then -- Nur auf der ertsen ebene einmal aufrufen evtl. eine Contextvariable setzen, begin -- damit man auch einzelne Ebenen drucken kann. RDB$SET_CONTEXT('USER_TRANSACTION', 'CV_LastPositionID', NULL); RDB$SET_CONTEXT('USER_TRANSACTION', 'CV_LastPositionID', (select "O_LastPositionID" from "AuftrDokDruck_HelperFunction"( 'PositionsStringFormat' , :"I_AuftrDokumentID" , NULL , NULL , NULL ))); -- Anzahl Positionen von MwSt saetzen ermitteln wenn wir hier auf der Strukturebene NULL sind select count(*) from "AuftragsDokumentePositionen" where "AuftrDokPosi_DokumentID" = :"I_AuftrDokumentID" and "AuftrDokPosi_Art" = 300 into :"V_CountMwSt_Saetze"; -- ######################## Start setzte Contextvariablen ################################# -- Zuerst alle benutzten Contextvariablen auf NULL setzen sonst evtl. Fehler die nicht nachvollziehbar sind ! RDB$SET_CONTEXT('USER_TRANSACTION', '#GPID#', NULL ); RDB$SET_CONTEXT('USER_TRANSACTION', '#KDNR#', NULL ); RDB$SET_CONTEXT('USER_TRANSACTION', '#LRNR#', NULL ); RDB$SET_CONTEXT('USER_TRANSACTION', '#LieferantenNr#', NULL ); RDB$SET_CONTEXT('USER_TRANSACTION', '#Unberechnet_PosZVorPos#' , NULL); -- Text der vor die Positionsangabe gestellt wird wenn die Option Unberechnet gesetzt ist. RDB$SET_CONTEXT('USER_TRANSACTION', '#Adr1_GP_ID#' ,NULL ); RDB$SET_CONTEXT('USER_TRANSACTION', '#Adr1_AnschID#' ,NULL ); RDB$SET_CONTEXT('USER_TRANSACTION', '#Adr1_AspID#' , NULL ); RDB$SET_CONTEXT('USER_TRANSACTION', '#Adr2_GP_ID#' ,NULL ); RDB$SET_CONTEXT('USER_TRANSACTION', '#Adr2_AnschID#' , NULL ); RDB$SET_CONTEXT('USER_TRANSACTION', '#Adr2_AspID#' , NULL ); RDB$SET_CONTEXT('USER_TRANSACTION', '#Adr2_Anmerkung#' , NULL ); --Umgebungsvariablen setzen -- #GPID#/'#KDNR#' und '#LieferantenNr#' beziehen sich immer auf den Empfaenger RDB$SET_CONTEXT('USER_TRANSACTION', '#GPID#', ( select "Text" from "AuftragDokument-Parameter"( 'GPID' , :"I_AuftrDokumentID" , NULL , NULL , NULL , NULL , NULL , :"I_Commands" ))); RDB$SET_CONTEXT('USER_TRANSACTION', '#KDNR#', ( select "Text" from "AuftragDokument-Parameter"( 'KDNR' , :"I_AuftrDokumentID" , NULL , NULL , NULL , NULL , NULL , :"I_Commands" ))); RDB$SET_CONTEXT('USER_TRANSACTION', '#LieferantenNr#', ( select "Text" from "AuftragDokument-Parameter"( 'LieferantenNr' , :"I_AuftrDokumentID" , NULL , NULL , NULL , NULL , NULL , :"I_Commands" ))); -- Das Staatenkuerzel des Empfaengers ermitteln. ACHTUNG AnschID benutzen da eine bestimmte Anschrift im Dokument gewaehltr werden kann. rdb$set_context( 'USER_TRANSACTION' , '#ABSENDER_STAAT#' , ( select "PLZ_Postkuerzel" from "AuftragsDokumente" A join "Anschriften" B ON B.anschriften_id = A."AuftrDokument_von_AnschID" join PLZ C ON C.plz_id = B.a_plz_id where A."AuftrDokument_ID" = :"I_AuftrDokumentID" )); select coalesce( "AuftrDokument_VersandArt",0) , "AuftrDokument_Art" , "AuftrDokument_BruttoPreise" , "AuftrDokument_von_GP_ID" , coalesce( b.adaz_gp_id , "AuftrDokument_fuer_GP_ID" ) , coalesce( b."ADAZ_GP_AnschID" , "AuftrDokument_fuer_AnschID" ), iif ( b.adaz_gp_id is null , iif ( "AuftrDokument_FuerAspInAnschr" is distinct from 'N' , "AuftrDokument_fuer_ASP" , NULL) , iif ( b."ADAZ_AspInAnschrYN" is distinct from 'N' , b."ADAZ_Asp_ID" , NULL )) from "AuftragsDokumente" A left outer join "AuftragsDokumenteAnschrZuordnun" B on A."AuftrDokument_ID" = b."ADAZ_AuftrDokument_ID" and a."AuftrDokument_von_GP_ID" = b."ADAZ_VonGP_ID" and a."AuftrDokument_Art" = b."ADAZ_AuftrDokumentArt" and b."ADAZ_KopieEmpfaenger" in ( 0 ,1 ) -- = 0 Originalempfaenger mit GP-Daten / 1 = andere Anschrift aber GP-DAten bleiben gleich >= 10 Kopie empfaenger where A."AuftrDokument_ID" = :"I_AuftrDokumentID" into :"V_DokStdVersandArtID" , :"V_AuftrDokumentArt" , :"V_AuftrDokBruttoPreise" ,:"V_Von_GP_ID" , :"V_Fuer_GP_ID" , :"V_Fuer_AnschID" , :"V_Fuer_Asp"; -- :"V_DokStdVersandArtID" ist jetzt auf jeden Fall nicht mehr NULL unten wird jetzt auf NULL gesetzt wenn alle Positionen der einen StandardVersandart entsprechen. if ( not exists ( select * from "AuftragsDokumentePositionen" A where A."AuftrDokPosi_DokumentID" = :"I_AuftrDokumentID" and A."AuftrDokPosi_VersandArt" is not NULL and A."AuftrDokPosi_VersandArt" != 0 and A."AuftrDokPosi_VersandArt" != :"V_DokStdVersandArtID" ) ) then "V_DokStdVersandArtID" = NULL; -- Null zeigt an das nichts gemacht werden muss if ( :"I_DruckKonfigID" is not null ) then -- Nur machen wenn gedruckt wird begin if ( rdb$get_context( 'USER_TRANSACTION', '#Unberechnet_PosZVorPos#' ) is null ) then -- Text der vor die Positionsangabe gestellt wird wenn die Option Unberechnet gesetzt ist. -- Die Folgende Abfrage ist sehr komplieziert wegen den Unterabfragen Sie soll das kurzzeichen ermitteln wenn eine StammdatenVerID vorhanden ist nimmt sie die erste Abfrage -- ansonsten versucht sucht sie auch ueber aktStammdaten das zeichen zu finden aber nur wenn StammdatenVerID im Dokument nich gesetzt ist. RDB$SET_CONTEXT('USER_TRANSACTION', '#Unberechnet_PosZVorPos#' , ( select coalesce( ( select "StDaten_Unberechnet_PosZVorPos" from "AuftragsDokumente" A join "Stammdaten" B ON B."Stammdaten_VerID" = (select "AuftrDokument_StamDatenVerID" from "AuftragsDokumente" where "AuftrDokument_ID" = :"I_AuftrDokumentID" ) and B."StammD_Gesch_Partner_ID" = A."AuftrDokument_von_GP_ID" where A."AuftrDokument_ID" = :"I_AuftrDokumentID" ) , ( select "StDaten_Unberechnet_PosZVorPos" from "AKT_Stammdaten" A join "Stammdaten" B ON B."Stammdaten_VerID" = A."Akt_Stammdaten_VerID" and B."StammD_Gesch_Partner_ID" = (select "AuftrDokument_von_GP_ID" from "AuftragsDokumente" where "AuftrDokument_ID" = :"I_AuftrDokumentID" and "AuftrDokument_StamDatenVerID" is null ) )) from "GetOneResultRow" )); RDB$SET_CONTEXT('USER_TRANSACTION', 'CV_KeinSeitenumbruchBisBruttoSum' , 0 ); -- 'CV_KeinSeitenumbruchBisBruttoSum' auf 0 setzen um inaktiv anzuzeigen end /* Contextvariablen fuer die Anschriftenfelder setzen. Adresse1 = Im sichfenster des Couverts Adresse2 = Zweitadresse z.B. Lieferadresse wird irgendwo unterhal aufgelistet. */ RDB$SET_CONTEXT('USER_TRANSACTION', '#Adr1_GP_ID#' , :"V_Fuer_GP_ID" ); RDB$SET_CONTEXT('USER_TRANSACTION', '#Adr1_AnschID#' , :"V_Fuer_AnschID" ); RDB$SET_CONTEXT('USER_TRANSACTION', '#Adr1_AspID#' , :"V_Fuer_Asp" ); "V_TempInt" = NULL; if ( :"V_AuftrDokumentArt" <= 300 ) then -- Die angegeben Lieferanschrift nutzen. "V_TempInt" = :"I_AuftrDokumentID"; else if ( :"V_AuftrDokumentArt" = 400 ) then -- Die in der AB angegebene Lieferanschrift nutzen "V_TempInt" = ( select "vonAuftragDokumentID" from "AuftrDokument_UniqueDocSource"( :"I_AuftrDokumentID" , 200 )); if ( :"V_TempInt" is not null ) then begin select b.adaz_gp_id , b."ADAZ_GP_AnschID" , iif ( b."ADAZ_AspInAnschrYN" is not distinct from 'Y' , b."ADAZ_Asp_ID" , null ), B."ADAZ_Anmerkung" from "AuftragsDokumenteAnschrZuordnun" B where b."ADAZ_AuftrDokument_ID" = :"V_TempInt" and b."ADAZ_VonGP_ID" = :"V_Von_GP_ID" and b."ADAZ_AuftrDokumentArt" = 300 -- 300 Lieferscheine and b."ADAZ_KopieEmpfaenger" in ( 0,1) -- 0 originalempfaenger / 1 = andere Anschrift fuer Leferscheine into :"V_Liefer_GP_ID" , :"V_Liefer_AnschID" , :"V_Liefer_Asp" , :"V_TempVarCharMax"; if ( :"V_Liefer_GP_ID" is not null ) then begin RDB$SET_CONTEXT('USER_TRANSACTION', '#Adr2_AnschText#' , 'Lieferanschrift:'); RDB$SET_CONTEXT('USER_TRANSACTION', '#Adr2_GP_ID#' , :"V_Liefer_GP_ID" ); RDB$SET_CONTEXT('USER_TRANSACTION', '#Adr2_AnschID#' , :"V_Liefer_AnschID" ); RDB$SET_CONTEXT('USER_TRANSACTION', '#Adr2_AspID#' , :"V_Liefer_Asp" ); RDB$SET_CONTEXT('USER_TRANSACTION', '#Adr2_Anmerkung#' , :"V_TempVarCharMax" ); end end -- ######################## Ende setzte Contextvariablen ################################# -- Dokumentetxte sollten am ende erezugt werden wenn alle Parameter schon gesetzt sind. if ( :"I_DruckKonfigID" is not null ) then begin "Error" = (select "Error" from "AuftrDokument_TexteErzeugen"( 'TextVorArtikelTabelle' , :"I_AuftrDokumentID" , :"I_DruckKonfigID" , :"I_Format" , :"I_Commands" , NULL , 0 )); "Error" = (select "Error" from "AuftrDokument_TexteErzeugen"( 'TextNachArtikelTabelle' , :"I_AuftrDokumentID" , :"I_DruckKonfigID" , :"I_Format" , :"I_Commands" , NULL ,0 )); end -- Anzahl benoetigter Nachkommastellen fuer die Mengenspalte ermitteln -- 0 = Keine , 1 = eine usw. -1 = Fehler <-- Sollte hier nie vorkommen koennen bei Menge = numeric(X,3) "V_MengeAnzNachkommastellen" = ( select iif( count(*) = SUM(A) , 0 , iif( count(*) = SUM(B) ,1, IIF( count(*) = SUM(C) ,2, iif( count(*) = SUM(D) , 3, -1 )))) from ( select iif( "AuftrDokPosi_Menge" = round( "AuftrDokPosi_Menge" ,0) , 1 , 0) , iif( "AuftrDokPosi_Menge" = round( "AuftrDokPosi_Menge" ,1) , 1 , 0) , iif( "AuftrDokPosi_Menge" = round( "AuftrDokPosi_Menge" ,2) , 1 , 0) , iif( "AuftrDokPosi_Menge" = round( "AuftrDokPosi_Menge" ,3) , 1 , 0) from "AuftragsDokumentePositionen" A Where "AuftrDokPosi_DokumentID" = :"I_AuftrDokumentID" and "AuftrDokPosi_Menge" is not null) AS DT ( A , B , C , D)); end end open "Struktur"; fetch "Struktur" into :"V_StrukturID" , :"V_StrukturPos" , :"V_Struktur_ArtikelText" , :"V_Struktur_Summe" , :"V_AuftrDokStruktur_SummeDrucken" , :"V_Struktur_FettDrucken" , :"V_Struktur_PreiseAusbl" , :"V_Struktur_InAuflistung"; if ( row_count = 0 ) then "V_CursorEmpty" = 1; for select "AuftrDokPosi_Option" , "AuftrDokPosi_Kurztext" , "AuftrDokPosi_Art" , "AuftragsDokumentePositionen_ID" , "AuftrDokPosi_PositionsText" , "AuftrDokPosi_Position" , case when ( a."AuftrDokPosi_Art" = 1 ) then f."ATAS_Text" else E."ADTAS_Text" end , case when ( a."AuftrDokPosi_Art" = 1 ) then f."ATAS_LangText" else E."ADTAS_LangText" end , case when ( a."AuftrDokPosi_Art" = 1 ) then f."ATAS_LangTextHTML" else E."ADTAS_LangTextHTML" end , "AuftrDokPosi_Menge", "AuftrDokPosi_PosGPreis", ( "AuftrDokPosi_GPreis" + coalesce( "AuftrDokPosi_ArtikeOptionsPreis" * "AuftrDokPosi_Menge" , 0 ) ), -- Positions ges. Preis ohne Rabatt "AuftrDokPosi_PositionsRabatt" , "MwStKz" , trim(b."Art_Artikelnr" ||' '|| coalesce(b."Art_Revision",'')) , "Einh_Drucken" , b."Art_VPE_Inhalts_Menge" , iif( i."Art_Artikelnr" is not distinct from b."Art_Artikelnr" , NULL , i."Art_Artikelnr" ) -- Die eigene Artikelnr nur einschreiben wenn sie von der oben abweicht , iif( B."Artikel_ID" is null or not :"V_AuftrDokumentArt" between 1 and 400 , '' , ( select ascii_char(10)||'( '||"EigenschaftenText"||' )' from "ArtikelEigenschaften_TexteWerte"( b."Artikel_ID" , NULL)) ) -- Nur eine "AuftrDokPosi_VersandArt" schreiben wenn es nicht die Standardart ist und wenn sie > 0 ist ( also eine Legende erzeugt werden muss ) , iif( :"V_DokStdVersandArtID" is not null and "AuftrDokPosi_VersandArt" > 0 and "AuftrDokPosi_VersandArt" != :"V_DokStdVersandArtID" , "AuftrDokPosi_VersandArt" , NULL ) from "AuftragsDokumentePositionen" A left outer join "Artikel" B ON A."AuftrDokPosi_Artikel_ID" = B."Artikel_ID" and a."AuftrDokPosi_ArtikelVersion" = b."Artikel_Version" join ( select "MwStSaetze_ID", "KurzZeichen" from "AuftrDokument_MwSt_Liste"( :"I_AuftrDokumentID" , 'Y' ) F ) AS DTAB ( "MSaetze_ID" , "MwStKz" ) ON A."AuftrDokPosi_MwStSaetze_ID" = "MSaetze_ID" -- Achtung keinen Left Outer Join draus machen kostet enorm performance und ist nicht noetig join "Einheiten" D ON A."AuftrDokPosi_PreisEinheit" = D."Einheiten_ID" -- Left outer join sollte nicht noetig sein da Preiseinheit ein NOT NULL Feld ist. left outer join "AuftrDokum_TextArtenSprachen" E ON A."AuftragsDokumentePositionen_ID" = E."ADTAS_AuftrDokumentPositionenID" and E."ADTAS_SprachenID" = 1 and E."ADTAS_TextArtID" = 1 left outer join "ArtikelTextArtenSprachen" F On E."ADTAS_ArtikelTextArtSprachenID" = F."ArtikelTextArtenSprachenID" left outer join "AuftragDokumentPosition_Einkauf" h ON A."AuftragsDokumentePositionen_ID" = H."AuftragsDokumentePositionenE_ID" left outer join "Artikel" I ON H."AuftrDokPosiEk_Artikel_ID" = i."Artikel_ID" and h."AuftrDokPosiEk_ArtikelVersion" = i."Artikel_Version" -- Nachfolgende Joins funktionieren nicht korrekt ganz vorsichtig falls aenderungen noetig werden. -- "MwStKz" oben im Select benutzen sonst kommt immer noch der dummyeintrag durch -- Wenn anstatt des Dummy Eintrags mit PK=0 ein DB-Null benutzt wird und hierein Left Outer Join gesetzt wird geht die permormance extrem in dem Keller 3000 Positionen 1 minute und mit dem hier 2 sekunden -- Habe alles probiert aber so funktioniert es einfach am besten auch wenn der Dummy Eintrag benoetigt wird -- join "AuftrDokument_MwSt_Liste"( :"I_AuftrDokumentID" , 'Y' ) C ON A."AuftrDokPosi_MwStSaetze_ID" = C."MwStSaetze_ID" -- Achtung keinen Left Outer Join draus machen kostet enorm performance und ist nicht noetig where "AuftrDokPosi_DokumentID" = :"I_AuftrDokumentID" and "AuftrDokPosi_DokStrukturID" is not distinct from :"I_Eltern_ID" and "AuftrDokPosi_Position" >= 0 and "AuftrDokPosi_Art" not in ( 110 ) -- 110 = Zwischensumme start ( sonst gibt es eine Leerzeile ) order by "AuftrDokPosi_Position" into :"V_Option" , :"V_Kurztext" , :"V_PositionsArt" , :"V_AuftragsDokumentePositionenID" , :"V_AuftrDokPosText" , :"V_AuftrDokPos" , :"V_Positionen_ArtikelText" , :"V_LangText" , :"V_LangTextHTML" , :"V_MengeDokument" , :"V_PosG-Preis" , :"V_PosG-PreisOhneRabatt" , :"V_PosRabatt" , :"V_MwSt_KurzZeichen" , :"V_Artikelnummer" , :"V_PreisEinheit" , :"V_VPE_Inhalts_Menge" , :"V_EigeneArtikelNr" , :"V_EigenschaftenText" , :"V_AuftragPositionVersandArtID" do begin -- Aenderung vom 26.02.2014 if ( :"V_AuftrDokumentArt" > 10000 and :"V_VPE_Inhalts_Menge" > 1 ) then begin if ( cast( :"V_VPE_Inhalts_Menge" as integer) = :"V_VPE_Inhalts_Menge" ) then "V_PreisEinheit" = '(à'||cast(:"V_VPE_Inhalts_Menge" as integer)||' '||:"V_PreisEinheit"||')'; else if( :"V_VPE_Inhalts_Menge" = round( :"V_VPE_Inhalts_Menge" ,1) ) then "V_PreisEinheit" = '(à'||round(:"V_VPE_Inhalts_Menge",1)||' '||:"V_PreisEinheit"||')'; else if( :"V_VPE_Inhalts_Menge" = round( :"V_VPE_Inhalts_Menge" ,2) ) then "V_PreisEinheit" = '(à'||round(:"V_VPE_Inhalts_Menge",2)||' '||:"V_PreisEinheit"||')'; else "V_PreisEinheit" = '(à'||:"V_VPE_Inhalts_Menge"||' '||:"V_PreisEinheit"||')'; -- "V_Positionen_ArtikelText" = 'à('||:"V_VPE_Inhalts_Menge"||' Stück )'||ascii_char(29) || :"V_Positionen_ArtikelText" || ascii_char(29)|| 'à(100 Stück )'; end if ( :"V_EigeneArtikelNr" is not null ) then begin if ( :"V_LangText" is null ) then "V_LangText" = iif( :"V_Positionen_ArtikelText" is null , :"V_EigeneArtikelNr", :"V_Positionen_ArtikelText"||' ' || ascii_char(29)||ascii_char(10)|| :"V_EigeneArtikelNr"); else begin -- Im Blob steht schon was drinn if ( :"V_Positionen_ArtikelText" is null ) then "V_LangText" = :"V_LangText" ||' '|| ascii_char(29)||ascii_char(10)|| :"V_EigeneArtikelNr"; else -- Es hat wohl in beiden Feldern etwas gestanden ( Sollte momentan niemals passieren evtl. ignorieren ) "V_LangText" = :"V_Positionen_ArtikelText"||' ' || ascii_char(29) || ' '|| :"V_LangText" || ' '||ascii_char(29)||ascii_char(10)|| :"V_EigeneArtikelNr"; end "V_Positionen_ArtikelText" = NULL; -- Wenn es in das normale Textfeld passt kopiert er es unten eh dort rein. end -- Ene Aenderung vom 26.02.2014 -- Alle Ausgabeparameter zuruecksetzen "PosText1" = null ; "PosText2" = NULL ;"PositionsArt" =NULL ; "StrukturText" = :"I_PositionsString"; "PositionsNr" = NULL ; "RAuftrDokStruktur_ID" = NULL; "RAuftragsDokumentePositionen_ID" = NULL;"VMenge" = NULL;"NMenge" = NULL; "MengeGeliefert" = NULL;"MengeRueckstand" = NULL;"ArtikelBlobText" = NULL;"ArtikelText" = NULL ; "KurztextAnzAbsaetze" = NULL ;"Artikelnummer" = NULL;"EAN_Code" = NULL;"E-Preis" = NULL;"G-Preis" = NULL;"Preiseinheit" = NULL;"MwSt_Satz" = NULL;"TexgenCommand" = NULL; "CZeileFett" = NULL ; "CZeileItalic" = NULL ; "CgesPreisFett" = NULL ; "CgesPreisUnterstreichen" = NULL ; "CgesPreisDoppeltUnterstreichen" = NULL ; "RowType" = 0 ; "PosRabatt" = NULL; "ExtraAbstandEinfuegen" = NULL ; if ( :"I_Format" = 'HTML' ) then -- Momentan wird nur HTML beruecksichtigt "V_LangText" = :"V_LangTextHTML"; -- bis zum 17.01.2012 war dies die WHILE Bedingung: or :"V_Position" is not null <--- ist sehr bloed da es nie NULL ist -- while(:"V_CursorEmpty" = 0 and ( :"V_PositionsArt" < 100 or :"V_Position" is not null ) and :"V_Position" >= :"V_StrukturPos" ) -- Bis auf Art = 400 sind alle Arten zwischen 300 und 9.999 nur in Ebene 0 erlaubt deshalb auch nach unten durchreichen wenn vor der 9.999 evtl. noch was anders gebraucht wird das hier anpassen. -- Evtl. die Summenpositionen in der SP Funktion NeuNummerieren auch ans Ende sortieren lassen -- sollte doch machbar sein evtl. ein kuenstliches Feld sortindex von der PositionsArt ableiten mit vorrang vor allem while (:"V_CursorEmpty" = 0 -- Es gibt noch Strulturpositionen = 0 wenn =1 keine mehr vorhanden and (( :"V_PositionsArt" < 100 and :"V_Position" >= :"V_StrukturPos" ) -- Die Strukturposition vorrangig in das Dokument einreihen. or :"V_PositionsArt" between 300 and 9999 -- Summenpositionen gehoeren ans Ende und dorthin werden sie auch durchgereicht. or :"V_PositionsArt" = 104 -- PosArt 104 = Strukturposition hier einfuegen ( also ganz expliziet gewuenscht vom Benutzer) or :"V_PositionsArt" = 102 )) -- 102 Horizontale Linie macht am Anfang der Seite keinen Sinn also Strukturen einsortieren. do -- 102 Ist auch Problematisch bei den Endsummen vor die man diese Linie setzen kann dann gibt es evtl. Fehler also unbedingt drinn lassen !!! begin -- Immer wenn eine Struktur einsortiert werden muss. Hat Vorrang vor Positionen -- !!!ACHTUNG !!! START -- Bereich der nach unten kopiert werden muss wenn etwas geaendert wird. "ArtikelBlobText" = NULL; "RAuftrDokStruktur_ID" = :"V_StrukturID"; "RAuftragsDokumentePositionen_ID" = NULL; "ArtikelText" = "V_Struktur_ArtikelText"; "PositionsArt" = 99; -- 99 = Strukturtext "HintergrundFarbe" = 'FFFFFF'; "ZeilenNr" = "ZeilenNr" + 1; "PositionsNr" = -:"V_Position"; if ( "I_PositionsString" is null ) then "StrukturText" = :"V_Position" ; else "StrukturText" = :"I_PositionsString" || '.' || :"V_Position" ; -- Neues Schema fuer die Positonsstruktur (3xIn diser SP vorhanden muss immer genau gleich sein )mit "PosText1" und "PosText2" zusammenbauen "V_TempHelpInt" = position( '.' , :"StrukturText" ); if ( :"V_TempHelpInt" = 0 ) then begin "PosText1" = :"StrukturText"; end else begin "PosText1" = left( :"StrukturText" , "V_TempHelpInt"-1 ); "PosText2" = substring( :"StrukturText" from "V_TempHelpInt" ); end if ( :"V_AuftrDokumentArt" = 800 or :"V_Struktur_FettDrucken" is not distinct from 'Y' ) then -- Bei Mahnungen den Strukturtext Fett drucken "CZeileFett" = 'Y'; else "CgesPreisFett" = 'Y'; -- Wenn Preis der Struktur dann mindestens dieser fett. if ( :"V_AuftrDokStruktur_SummeDrucken" = 'Y' ) then select "Format_Zahl" from "Formatiere_Zahl"( :"V_Struktur_Summe" , NULL , NULL , NULL ) into :"G-Preis"; "Pos_GPreis_StruktPreis" = :"V_Struktur_Summe"; "ExtraAbstandEinfuegen" = 0; suspend; "V_LastPositionsArt" = :"PositionsArt"; if ( :"I_NurDieseEbene" != 'Y' ) then begin "V_OldStruktur_PreiseAusbl" = RDB$GET_CONTEXT('USER_TRANSACTION', '#V_Struktur_PreiseAusbl#' ); RDB$SET_CONTEXT('USER_TRANSACTION', '#V_Struktur_PreiseAusbl#' , :"V_Struktur_PreiseAusbl" ); for select "PositionsArt","StrukturText","PositionsNr","PositionsStringFormatiert","PosText1","PosText2","RAuftrDokStruktur_ID","RAuftragsDokumentePositionen_ID","VMenge","NMenge","MengeGeliefert","MengeRueckstand","ArtikelText","ArtikelBlobText","KurztextAnzAbsaetze","Artikelnummer","EAN_Code","E-Preis","G-Preis","PosRabatt","Preiseinheit","MwSt_Satz","TexgenCommand","HintergrundFarbe","Warnings","CZeileFett","CZeileItalic","CgesPreisFett","CgesPreisUnterstreichen","CgesPreisDoppeltUnterstreichen","ZeilenNr","RowType","ExtraAbstandEinfuegen","Pos_GPreis_StruktPreis" from "AuftragsDokumente_Drucken" ( :"I_AuftrDokumentID" , :"I_DruckKonfigID" , :"V_StrukturID" , :"StrukturText" , :"I_NurDieseEbene" , :"I_NettoPreise" , :"I_MwSt_Kurzform", :"I_Format" , :"I_Format_PosText" , :"I_Format_G-Preis" , :"I_Format_E-Preis" , :"I_Format_Menge" , :"I_Warnings" , :"I_Commands" , :"I_Int_Help" , :"I_BigInt_Help" , :"I_Varchar_Help" , :"ZeilenNr" ) into "PositionsArt","StrukturText","PositionsNr","PositionsStringFormatiert","PosText1","PosText2","RAuftrDokStruktur_ID","RAuftragsDokumentePositionen_ID","VMenge","NMenge","MengeGeliefert","MengeRueckstand","ArtikelText","ArtikelBlobText","KurztextAnzAbsaetze","Artikelnummer","EAN_Code","E-Preis","G-Preis","PosRabatt","Preiseinheit","MwSt_Satz","TexgenCommand","HintergrundFarbe","Warnings","CZeileFett","CZeileItalic","CgesPreisFett","CgesPreisUnterstreichen","CgesPreisDoppeltUnterstreichen","ZeilenNr","RowType","ExtraAbstandEinfuegen","Pos_GPreis_StruktPreis" do suspend; "V_LastPositionsArt" = :"PositionsArt"; RDB$SET_CONTEXT('USER_TRANSACTION', '#V_Struktur_PreiseAusbl#' , "V_OldStruktur_PreiseAusbl" ); end "V_Position" = :"V_Position" +1; fetch "Struktur" into :"V_StrukturID" , :"V_StrukturPos" , :"V_Struktur_ArtikelText" , :"V_Struktur_Summe" , :"V_AuftrDokStruktur_SummeDrucken" , :"V_Struktur_FettDrucken" , :"V_Struktur_PreiseAusbl" , :"V_Struktur_InAuflistung"; if ( row_count = 0 ) then "V_CursorEmpty" = 1; -- Alle Ausgabeparameter zuruecksetzen "PosText1" = null ; "PosText2" = NULL ;"PositionsArt" =NULL ; "StrukturText" = :"I_PositionsString"; "PositionsNr" = NULL ; "RAuftrDokStruktur_ID" = NULL; "RAuftragsDokumentePositionen_ID" = NULL;"VMenge" = NULL;"NMenge" = NULL; "MengeGeliefert" = NULL;"MengeRueckstand" = NULL;"ArtikelBlobText" = NULL;"ArtikelText" = NULL ; "KurztextAnzAbsaetze" = NULL ;"Artikelnummer" = NULL;"EAN_Code" = NULL;"E-Preis" = NULL;"G-Preis" = NULL;"Preiseinheit" = NULL;"MwSt_Satz" = NULL;"TexgenCommand" = NULL; "CZeileFett" = NULL ; "CZeileItalic" = NULL ; "CgesPreisFett" = NULL ; "CgesPreisUnterstreichen" = NULL ; "CgesPreisDoppeltUnterstreichen" = NULL ; "RowType" = 0 ; "PosRabatt" = NULL; "ExtraAbstandEinfuegen" = NULL ;"Pos_GPreis_StruktPreis" = NULL; end select "Format_Zahl" from "Formatiere_Zahl"( :"V_PosRabatt" , NULL , NULL , NULL ) into :"PosRabatt"; "PosRabatt" = :"PosRabatt" ||'%'; -- !!!ACHTUNG !!! ENDE -- Bereich der nach unten kopiert werden muss wenn etwas geaendert wird. -- if ( ( :"V_LastPositionID" = :"V_AuftragsDokumentePositionenID" or :"V_PositionsArt" > 300 ) and RDB$GET_CONTEXT('USER_TRANSACTION', 'CV_KeinSeitenumbruchBisBruttoSum' ) = 0 ) then if ( ( rdb$get_context( 'USER_TRANSACTION', 'CV_LastPositionID' ) = :"V_AuftragsDokumentePositionenID" or :"V_PositionsArt" > 300 ) and RDB$GET_CONTEXT('USER_TRANSACTION', 'CV_KeinSeitenumbruchBisBruttoSum' ) = 0 ) then begin "V_TempHelpInt" = "RowType"; "RowType" = 7; RDB$SET_CONTEXT('USER_TRANSACTION', 'CV_KeinSeitenumbruchBisBruttoSum' , 1 ); "ArtikelText" = 'summeges'; -- Jeder zusammenhaengende Bereich braucht sein extra Label einmal mit 7 oeffnen und einmal mit 8 und dem selben Labelnamen schliessen suspend; "V_LastPositionsArt" = :"PositionsArt"; "RowType" = "V_TempHelpInt"; end -- So jetzt darf die Position auch gesendet werden. -- "StrukturText" = :"I_PositionsString" || :"V_Position" ; Geaendert am 06.04.2010 wird getrennt uebergeben ! PositionsText = Struktur "RAuftrDokStruktur_ID" = NULL; "RAuftragsDokumentePositionen_ID" = :"V_AuftragsDokumentePositionenID"; "ArtikelText" = NULL; if ( :"V_LangText" is not null ) then -- es ist ein Langtext verfuegbar begin -- Hier schauen ob der Blob in den normalen ArtikelText ( Varchar(8191)) passt und darin senden. Ansonsten Blob nehmen. if ( char_length( :"V_LangText" )+coalesce( char_length( :"V_EigenschaftenText" ),0) < 8100 ) then -- 8100 - 512 fuer die evtl. vorhandenen ArtikelEigenschaften "ArtikelText" = :"V_LangText" || coalesce( ascii_char(29)||:"V_EigenschaftenText" , ''); else "ArtikelBlobText" = :"V_LangText"|| coalesce( ascii_char(29)||:"V_EigenschaftenText" , ''); end else begin if ( char_length( :"V_Positionen_ArtikelText" )+coalesce( char_length( :"V_EigenschaftenText" ),0) < 8100 ) then -- 8100 - 512 fuer die evtl. vorhandenen ArtikelEigenschaften "ArtikelText" = :"V_Positionen_ArtikelText" || coalesce( ascii_char(29)||:"V_EigenschaftenText" , ''); else "ArtikelBlobText" = :"V_Positionen_ArtikelText" || coalesce( ascii_char(29)||:"V_EigenschaftenText" , ''); end if ( :"ArtikelText" is null and :"ArtikelBlobText" is null ) then -- besser bei allen machen and :"V_PositionsArt" < 100 ) then "ArtikelText" = ' '; -- Kein Leertext sondern mindestens ein Leerzeichen, ansonsten wird die Position ganz verschluckt und nicht mehr angezeigt if ( :"V_PosG-Preis" is not null ) then begin "Pos_GPreis_StruktPreis" = :"V_PosG-Preis"; "G-Preis" = cast( :"V_PosG-Preis" as numeric(18,2)); select "Format_Zahl" from "Formatiere_Zahl"( :"G-Preis" , NULL , NULL , NULL ) into :"G-Preis"; end if ( :"V_MengeDokument" is not null ) then begin if ( :"V_MengeAnzNachkommastellen" = 0 ) then "VMenge" = ( select "Format_Zahl" from "Formatiere_Zahl"( round( :"V_MengeDokument" , 0 ) , NULL , NULL , NULL )); else if ( :"V_MengeAnzNachkommastellen" = 1 ) then "VMenge" = ( select "Format_Zahl" from "Formatiere_Zahl"( round( :"V_MengeDokument" , 1 ) , NULL , NULL , NULL )); else if ( :"V_MengeAnzNachkommastellen" = 2 ) then "VMenge" = ( select "Format_Zahl" from "Formatiere_Zahl"( round( :"V_MengeDokument" , 2 ) , NULL , NULL , NULL )); else "VMenge" = ( select "Format_Zahl" from "Formatiere_Zahl"( :"V_MengeDokument" , NULL , NULL , NULL )); "V_TempHelpInt" = position( ',' , :"VMenge" ); if ( :"V_TempHelpInt" > 0 ) then begin "NMenge" = trim( trailing '0' from substring( :"VMenge" from :"V_TempHelpInt" )); -- Evtl. das Trim rausnehmen und die menge immer gleich anzeigen und mit nullen auffuellen -- mal sehen -- "NMenge" = substring( :"VMenge" from :"V_TempHelpInt" ); -- Version ohne Trim also nullen am ende stehen lassen. if ( :"NMenge" = ',' ) then "NMenge" = ''; "VMenge" = left( :"VMenge" , :"V_TempHelpInt" -1 ); end else "NMenge" = ''; "Preiseinheit" = :"V_PreisEinheit"; -- Preiseinheit nur ausgeben wenn es auch eine menge gibt end if ( :"V_PosG-Preis" is not null and :"V_MengeDokument" is not null ) then begin if ( :"V_MengeDokument" != 0 ) then begin if ( :"V_PosRabatt" is null ) then -- E-Preis Rabatt nicht vorhanden "E-Preis" = cast( :"V_PosG-Preis" / :"V_MengeDokument" as numeric(18,2)); else -- E-Preis ohne Rabatt ausweisen evtl. waehlbar ob e-preis mit oder ohne rabatt "E-Preis" = cast( :"V_PosG-PreisOhneRabatt" / :"V_MengeDokument" as numeric(18,2)); select "Format_Zahl" from "Formatiere_Zahl"( :"E-Preis" , NULL , NULL , NULL ) into :"E-Preis"; end else begin -- Wenn Menge = NULL geht er hier drueber und zeigt den Preis wie es sein soll wenn Menge = 0 dann auch Preis nicht anzeigen "G-Preis" = NULL; -- Muss hier stehen und nicht aussen rum, sonst sind auch bei berechneten Feldern die Summenwerte = NULL ges.summe etc. geht natuerlich nicht "Pos_GPreis_StruktPreis" = NULL; end end "PositionsArt" = :"V_PositionsArt"; if ( "V_PositionsArt" > 99 -- Alle Positionsarten > 99 also ab 100 bekommen keine Positionsnummern or :"V_Option" in ( 1 ) ) then -- Alle Positionen mit der Option 1 = Versteckt bekommen auch keine Positionsnr. "StrukturText" = NULL; else "PositionsNr" = :"V_Position"; "KurztextAnzAbsaetze" = "V_Kurztext"; "HintergrundFarbe" = 'FFFFFF'; "RAuftrDokStruktur_ID" = :"I_Eltern_ID"; -- Die richtige StrukturID setzen. "ZeilenNr" = "ZeilenNr" + 1; if ( RDB$GET_CONTEXT('USER_TRANSACTION', 'CV_KeinSeitenumbruchBisBruttoSum' ) = 1 ) then "CKeinUmbruchDanach" = 'Y'; if ( :"V_PositionsArt" = 300 ) then begin "V_CountMwSt_Saetze" = :"V_CountMwSt_Saetze" -1; if ( :"V_CountMwSt_Saetze" = 0 ) then -- Unterstreichung nach MwSt ausweisung einfuegen evtl. in stamdaten schauen ob gewuenscht "CgesPreisUnterstreichen" = 'Y'; end if ( ( :"V_PositionsArt" >= 300 and :"V_PositionsArt" < 100000 ) or :"V_PositionsArt" = 111 ) then begin "CgesPreisFett" = 'Y'; "RowType" = 0; -- RowType 3 geht nur bei Einzeiligen Texten aber der Benutzer kann hier den Text auch aendern deswegen von RowType=3 auf 0 gegangen. end if ( :"V_PositionsArt" = 410 ) then "CgesPreisDoppeltUnterstreichen" = 'Y'; -- ges. Prei sdoppelt unterstreichen if ( :"V_PositionsArt" = 101 ) then "RowType" = 4; -- Leere Zeile if ( :"V_PositionsArt" = 102 ) then "RowType" = 5; -- Horizontale Linie if ( :"V_PositionsArt" = 103 ) then "RowType" = 6; -- Seitenumbruch -- MwSt Kurzzeichen setzen -- if ( :"RowType" < 99 or :"RowType" in( 300, 401 ) ) then -- kann eigentlich nur ein Fehler gewesen sein !!!!!!!! if ( :"V_PositionsArt" < 99 or :"V_PositionsArt" in( 300, 401 ) ) then "MwSt_Satz" = :"V_MwSt_KurzZeichen"; if ( :"V_AuftragPositionVersandArtID" is not NULL ) then begin -- Jetzt noch ein Kuerzel fuer die Versandart anzeigen z.B. D fuer DPD wird einfach an "MwSt_Satz" angehaengt evtl. spaeter bei der Menge mit ausgeben !! "V_AuftrPosiVersand_KurzZeichen" = NULL; "V_AuftrPosiVersand_KurzZeichen" = ( select "AufDokVerArt_StdKuerzel" from "AuftragsDokumentVersandArt" A where A."AuftrDokumVersandArt_ID" = :"V_AuftragPositionVersandArtID" ); if ( :"V_AuftrPosiVersand_KurzZeichen" is not null ) then begin if ( :"MwSt_Satz" is not null and :"MwSt_Satz" != '' ) then "MwSt_Satz" = "MwSt_Satz" || ','||:"V_AuftrPosiVersand_KurzZeichen"; else "MwSt_Satz" = :"V_AuftrPosiVersand_KurzZeichen"; end end -- Neues Schema fuer die Positonsstruktur (3xIn diser SP vorhanden muss immer genau gleich sein )mit "PosText1" und "PosText2" zusammenbauen if ( :"StrukturText" = '' or :"StrukturText" is null ) then "PosText1" = :"PositionsNr"; else begin "V_TempHelpInt" = position( '.' , :"StrukturText" ); if ( :"V_TempHelpInt" = 0 ) then begin "PosText1" = :"StrukturText"; if ( :"PositionsNr" > 0 ) then "PosText2" = '.'||:"PositionsNr"; end else begin "PosText1" = left( :"StrukturText" , "V_TempHelpInt" -1); "PosText2" = substring( :"StrukturText" from "V_TempHelpInt" ) ||'.'|| coalesce( :"PositionsNr" , '' ); end end if ( :"V_Option" = 2 ) then -- Wenn die Position die Option (U)nberechnet gesetzt hat begin if ( ( rdb$get_context( 'USER_TRANSACTION', '#Unberechnet_PosZVorPos#' )) is not null ) then "PosText1" = rdb$get_context( 'USER_TRANSACTION', '#Unberechnet_PosZVorPos#' ) || :"PosText1"; if ( "G-Preis" is not null and char_length( "G-Preis" ) > 0 ) then "G-Preis" = '('||"G-Preis"||')'; -- Alternative unberechnetet Preise in Klammern setzen end if ( :"V_PositionsArt" = 2 and :"P_MarkChangedArticle" > 0 ) then -- Artikel die von ArtikelText in ArtikelTextGeaendert gesetzt wurden. "Artikelnummer" = '*' || "V_Artikelnummer"; else "Artikelnummer" = "V_Artikelnummer"; if ( :"V_Option" is null or not(:"P_HiddenHide" > 0 and :"V_Option" = 1 )) then -- Wenn Commando HidenHide Versteckte Zeilen ausblenden begin -- und eine versteckte Zeile da ist dise kpl. ueberspringen if ( :"RowType" != 6 or ( :"RowType" =6 and RDB$GET_CONTEXT('USER_TRANSACTION', 'CV_KeinSeitenumbruchBisBruttoSum' ) = 0 )) then begin if ( :"V_PositionsArt" in ( 1,2,3 ) ) then begin "ExtraAbstandEinfuegen" = 0; -- 0 = 1ex Abstand einfuegen if ( RDB$GET_CONTEXT('USER_TRANSACTION', '#V_Struktur_PreiseAusbl#' ) = 'Y' ) then begin -- Die Preise der Positionen in dieser Struktur sollen ausgeblendet werden "E-Preis" = NULL; "G-Preis" = NULL; end end if ( 1 = 2 and :"V_PositionsArt" in ( 1,2,3 ) ) then begin exception "Fatal_Error"'Zusammenhaengender Bereich1'; if ( :"ArtikelText" is null ) then begin "RowType" = 7; "ArtikelText" = 'pos'||:"RAuftragsDokumentePositionen_ID"; -- Jeder zusammenhaengende Bereich braucht sein extra Label einmal mit 7 oeffnen und einmal mit 8 und dem selben Labelnamen schliessen suspend; "ArtikelText" = NULL; "RowType" = 0; suspend; -- DokumentPosition zurueckgeben "RowType" = 8; "ArtikelText" = 'pos'||:"RAuftragsDokumentePositionen_ID"; suspend; end else begin exception "Fatal_Error"'Zusammenhaengender Bereich2'; "V_TempVarCharMax" = "ArtikelText"; "RowType" = 7; "ArtikelText" = 'pos'||:"RAuftragsDokumentePositionen_ID"; -- Jeder zusammenhaengende Bereich braucht sein extra Label einmal mit 7 oeffnen und einmal mit 8 und dem selben Labelnamen schliessen suspend; "RowType" = 0; "ArtikelText" = "V_TempVarCharMax"; suspend; -- DokumentPosition zurueckgeben "RowType" = 8; "ArtikelText" = 'pos'||:"RAuftragsDokumentePositionen_ID"; suspend; end "RowType" = 0; end else begin -- ################################################################################################################################## if ( :"V_EndsummeAusgegeben" < 0 and :"PositionsArt" = 100 ) then begin -- Aenderung vom 02.06.2015 Text nach Ges. Summe nach der Tabelle drucken insert into "AuftrDokum_Texte" ( "AD_T_AuftrDokID" , "AD_T_BlockPosition" , "AD_T_TextPos", "AD_T_TextFormat" , "AD_T_Text" , "AD_T_BlobText" ) values ( :"I_AuftrDokumentID" , 1 , :"V_EndsummeAusgegeben" , 3 , :"ArtikelText" , :"ArtikelBlobText" ); "V_EndsummeAusgegeben" = :"V_EndsummeAusgegeben" +1; end else suspend; -- DokumentPosition zurueckgeben end "V_LastPositionsArt" = :"PositionsArt"; end end if ( :"V_PositionsArt" = 410 ) then begin "PosText1" = null ; "PosText2" = NULL ;"PositionsArt" =NULL ; "StrukturText" = :"I_PositionsString"; "PositionsNr" = NULL ; "RAuftrDokStruktur_ID" = NULL; "RAuftragsDokumentePositionen_ID" = NULL;"VMenge" = NULL;"NMenge" = NULL; "MengeGeliefert" = NULL;"MengeRueckstand" = NULL;"ArtikelBlobText" = NULL;"ArtikelText" = NULL ; "KurztextAnzAbsaetze" = NULL ;"Artikelnummer" = NULL;"EAN_Code" = NULL;"E-Preis" = NULL;"G-Preis" = NULL;"Preiseinheit" = NULL;"MwSt_Satz" = NULL;"TexgenCommand" = NULL; "CZeileFett" = NULL ; "CZeileItalic" = NULL ; "CgesPreisFett" = NULL ; "CgesPreisUnterstreichen" = NULL ; "CgesPreisDoppeltUnterstreichen" = NULL ; "RowType" = 0 ; "PosRabatt" = NULL; "ExtraAbstandEinfuegen" = NULL ;"Pos_GPreis_StruktPreis" = NULL; RDB$SET_CONTEXT('USER_TRANSACTION', 'CV_KeinSeitenumbruchBisBruttoSum' , 0 ); "RowType" = 8; "ArtikelText" = 'summeges'; -- Jeder zusammenhaengende Bereich braucht sein extra Label einmal mit 7 oeffnen und einmal mit 8 und dem selben Labelnamen schliessen suspend; "V_LastPositionsArt" = :"PositionsArt"; "V_EndsummeAusgegeben" = -1000; -- Aenderung vom 02.06.2015 Text nach Ges. Summe nach der Tabelle drucken --####################################################################################################################################### end if ( :"PositionsArt" < 100 -- Alle Arten unter 100 bekommen eine Positionsnr. and ( "V_Option" not in ( 1 ) or "V_Option" is null )) then -- Option 1 Verteckt bekommt keine Positionsnr "V_Position" = :"V_Position" +1; end /* Schauen ob noch was in der Struktur uebrig ist und es auch noch anhaengen. Kommt vor wenn zu wenig oder auch keine DokumentPositionen vorhanden waren ;-) */ -- Alle Ausgabeparameter zuruecksetzen "PosText1" = null ; "PosText2" = NULL ;"PositionsArt" =NULL ; "StrukturText" = :"I_PositionsString"; "PositionsNr" = NULL ; "RAuftrDokStruktur_ID" = NULL; "RAuftragsDokumentePositionen_ID" = NULL;"VMenge" = NULL;"NMenge" = NULL; "MengeGeliefert" = NULL;"MengeRueckstand" = NULL;"ArtikelBlobText" = NULL;"ArtikelText" = NULL ; "KurztextAnzAbsaetze" = NULL ;"Artikelnummer" = NULL;"EAN_Code" = NULL;"E-Preis" = NULL;"G-Preis" = NULL;"Preiseinheit" = NULL;"MwSt_Satz" = NULL;"TexgenCommand" = NULL; "CZeileFett" = NULL ; "CZeileItalic" = NULL ; "CgesPreisFett" = NULL ; "CgesPreisUnterstreichen" = NULL ; "CgesPreisDoppeltUnterstreichen" = NULL ; "RowType" = 0 ; "PosRabatt" = NULL; "ExtraAbstandEinfuegen" = NULL ;"Pos_GPreis_StruktPreis" = NULL; -- ################################################################################################################################################## -- ################################################################################################################################################## -- ################################################################################################################################################## -- !!! ACHTUNG !!! START Kopie von oben. Bei aenderungen diese Bloecke immer syncronisieren while( :"V_CursorEmpty" = 0 ) do -- <--- ACHTUNG das WHIKLE hier muss natuerlich nur noch so aussehen sonst nichts. Es sind nur noch Strukturebenen da. begin -- Immer wenn eine Struktur einsortiert werden muss. Hat Vorrang vor Positionen "ArtikelBlobText" = NULL; "RAuftrDokStruktur_ID" = :"V_StrukturID"; "RAuftragsDokumentePositionen_ID" = NULL; "ArtikelText" = "V_Struktur_ArtikelText"; "PositionsArt" = 99; -- 99 = Strukturtext "HintergrundFarbe" = 'FFFFFF'; "ZeilenNr" = "ZeilenNr" + 1; "PositionsNr" = -:"V_Position"; if ( "I_PositionsString" is null ) then "StrukturText" = :"V_Position" ; else "StrukturText" = :"I_PositionsString" || '.' || :"V_Position" ; -- Neues Schema fuer die Positonsstruktur (3xIn diser SP vorhanden muss immer genau gleich sein )mit "PosText1" und "PosText2" zusammenbauen "V_TempHelpInt" = position( '.' , :"StrukturText" ); if ( :"V_TempHelpInt" = 0 ) then begin "PosText1" = :"StrukturText"; end else begin "PosText1" = left( :"StrukturText" , "V_TempHelpInt"-1 ); "PosText2" = substring( :"StrukturText" from "V_TempHelpInt" ); end if ( :"V_AuftrDokumentArt" = 800 or :"V_Struktur_FettDrucken" is not distinct from 'Y' ) then -- Bei Mahnungen den Strukturtext Fett drucken "CZeileFett" = 'Y'; else "CgesPreisFett" = 'Y'; -- Wenn Preis der Struktur dann mindestens dieser fett. if ( :"V_AuftrDokStruktur_SummeDrucken" = 'Y' ) then select "Format_Zahl" from "Formatiere_Zahl"( :"V_Struktur_Summe" , NULL , NULL , NULL ) into :"G-Preis"; "Pos_GPreis_StruktPreis" = :"V_Struktur_Summe"; "ExtraAbstandEinfuegen" = 0; suspend; "V_LastPositionsArt" = :"PositionsArt"; if ( :"I_NurDieseEbene" != 'Y' ) then begin "V_OldStruktur_PreiseAusbl" = RDB$GET_CONTEXT('USER_TRANSACTION', '#V_Struktur_PreiseAusbl#' ); RDB$SET_CONTEXT('USER_TRANSACTION', '#V_Struktur_PreiseAusbl#' , :"V_Struktur_PreiseAusbl" ); for select "PositionsArt","StrukturText","PositionsNr","PositionsStringFormatiert","PosText1","PosText2","RAuftrDokStruktur_ID","RAuftragsDokumentePositionen_ID","VMenge","NMenge","MengeGeliefert","MengeRueckstand","ArtikelText","ArtikelBlobText","KurztextAnzAbsaetze","Artikelnummer","EAN_Code","E-Preis","G-Preis","PosRabatt","Preiseinheit","MwSt_Satz","TexgenCommand","HintergrundFarbe","Warnings","CZeileFett","CZeileItalic","CgesPreisFett","CgesPreisUnterstreichen","CgesPreisDoppeltUnterstreichen","ZeilenNr","RowType","ExtraAbstandEinfuegen","Pos_GPreis_StruktPreis" from "AuftragsDokumente_Drucken" ( :"I_AuftrDokumentID" , :"I_DruckKonfigID" , :"V_StrukturID" , :"StrukturText" , :"I_NurDieseEbene" , :"I_NettoPreise" , :"I_MwSt_Kurzform", :"I_Format" , :"I_Format_PosText" , :"I_Format_G-Preis" , :"I_Format_E-Preis" , :"I_Format_Menge" , :"I_Warnings" , :"I_Commands" , :"I_Int_Help" , :"I_BigInt_Help" , :"I_Varchar_Help" , :"ZeilenNr" ) into "PositionsArt","StrukturText","PositionsNr","PositionsStringFormatiert","PosText1","PosText2","RAuftrDokStruktur_ID","RAuftragsDokumentePositionen_ID","VMenge","NMenge","MengeGeliefert","MengeRueckstand","ArtikelText","ArtikelBlobText","KurztextAnzAbsaetze","Artikelnummer","EAN_Code","E-Preis","G-Preis","PosRabatt","Preiseinheit","MwSt_Satz","TexgenCommand","HintergrundFarbe","Warnings","CZeileFett","CZeileItalic","CgesPreisFett","CgesPreisUnterstreichen","CgesPreisDoppeltUnterstreichen","ZeilenNr","RowType","ExtraAbstandEinfuegen","Pos_GPreis_StruktPreis" do suspend; "V_LastPositionsArt" = :"PositionsArt"; RDB$SET_CONTEXT('USER_TRANSACTION', '#V_Struktur_PreiseAusbl#' , "V_OldStruktur_PreiseAusbl" ); end "V_Position" = :"V_Position" +1; fetch "Struktur" into :"V_StrukturID" , :"V_StrukturPos" , :"V_Struktur_ArtikelText" , :"V_Struktur_Summe" , :"V_AuftrDokStruktur_SummeDrucken" , :"V_Struktur_FettDrucken" , :"V_Struktur_PreiseAusbl" , :"V_Struktur_InAuflistung"; if ( row_count = 0 ) then "V_CursorEmpty" = 1; else RDB$SET_CONTEXT('USER_TRANSACTION', '#V_Struktur_PreiseAusbl#' , :"V_Struktur_PreiseAusbl" ); -- Alle Ausgabeparameter zuruecksetzen "PosText1" = null ; "PosText2" = NULL ;"PositionsArt" =NULL ; "StrukturText" = :"I_PositionsString"; "PositionsNr" = NULL ; "RAuftrDokStruktur_ID" = NULL; "RAuftragsDokumentePositionen_ID" = NULL;"VMenge" = NULL;"NMenge" = NULL; "MengeGeliefert" = NULL;"MengeRueckstand" = NULL;"ArtikelBlobText" = NULL;"ArtikelText" = NULL ; "KurztextAnzAbsaetze" = NULL ;"Artikelnummer" = NULL;"EAN_Code" = NULL;"E-Preis" = NULL;"G-Preis" = NULL;"Preiseinheit" = NULL;"MwSt_Satz" = NULL;"TexgenCommand" = NULL; "CZeileFett" = NULL ; "CZeileItalic" = NULL ; "CgesPreisFett" = NULL ; "CgesPreisUnterstreichen" = NULL ; "CgesPreisDoppeltUnterstreichen" = NULL ; "RowType" = 0 ; "PosRabatt" = NULL; "ExtraAbstandEinfuegen" = NULL ;"Pos_GPreis_StruktPreis" = NULL; end -- !!! ACHTUNG !!! ENDE Kopie von oben select "Format_Zahl" from "Formatiere_Zahl"( :"V_PosRabatt" , NULL , NULL , NULL ) into :"PosRabatt"; "PosRabatt" = :"PosRabatt" ||'%'; if ( :"I_DruckKonfigID" is null or "I_Eltern_ID" is not null ) then -- Wenn nicht gedruckt wird braucht man keine Legende und Kram und nur auf der ersten Ebene exit; -- eine Legende Drucken - asnosnten raus hier "ArtikelText" = ''; "Error" = ' 1 ) then -- Nur MwSt-Saetze in legende einbauen wenn es mehr als einen gibt ! begin if ( (select count( distinct "MwStGr_Staaten_ID") from "AuftrDokument_MwSt_Liste"( :"I_AuftrDokumentID" , 'N' ) A join "MwSt_Saetze" B ON B."MwSt_Saetze_ID" = A."MwStSaetze_ID" join "MwSt_Gruppen" C ON C."MwStGruppen_ID" = B."MwSt_Saetze_Gruppen_ID" ) < 2 ) then begin -- Nur ein Staat unter den MwSt Saetzen. for select "KurzZeichen" ,"Satz" , "MwStGr_FestDokumentSumme" , "MwSt_Gr_Name", "MwStGr_Staaten_ID" from "AuftrDokument_MwSt_Liste"( :"I_AuftrDokumentID" , 'N' ) A join "MwSt_Saetze" B ON B."MwSt_Saetze_ID" = A."MwStSaetze_ID" join "MwSt_Gruppen" C ON C."MwStGruppen_ID" = B."MwSt_Saetze_Gruppen_ID" into :"V_MwSt_KurzZeichen" , :"V_MwSt-Satz" , :"V_PosG-Preis" , :"V_MwStGruppenName" , :"V_Staat" do begin if ( :"V_TempHelpInt" = 0 ) then "V_TempHelpInt" = 1; else "ArtikelText" = "ArtikelText" || :"Error" || 'br="0">,'; if ( :"V_PosG-Preis" is null ) then -- Dann ist es Prozentual und nicht mit Betrag 0 ueberschrieben "ArtikelText" = "ArtikelText" || :"Error" || 'br="0" subsuperscripttype="super">' || :"V_MwSt_KurzZeichen" || '' || :"Error" || iif(:"V_MwSt_KurzZeichen" = '' , 'br="0">' , 'br="0">: ' )|| :"V_MwSt-Satz" || '%'; else "ArtikelText" = "ArtikelText" || :"Error" || 'br="0" subsuperscripttype="super">' || :"V_MwSt_KurzZeichen" || '' || :"Error" || iif(:"V_MwSt_KurzZeichen" = '' , 'br="0">' , 'br="0">: ' )|| :"V_MwStGruppenName" || ''; end end else begin -- Mehr als ein Staat unter den MwSt Saetzen also auch den Staatsnamen des MwSt Satzes zeigen for select "KurzZeichen" ,"Satz" , "MwStGr_FestDokumentSumme" , "MwSt_Gr_Name", "MwStGr_Staaten_ID" from "AuftrDokument_MwSt_Liste"( :"I_AuftrDokumentID" , 'N' ) A join "MwSt_Saetze" B ON B."MwSt_Saetze_ID" = A."MwStSaetze_ID" join "MwSt_Gruppen" C ON C."MwStGruppen_ID" = B."MwSt_Saetze_Gruppen_ID" into :"V_MwSt_KurzZeichen" , :"V_MwSt-Satz" , :"V_PosG-Preis" , :"V_MwStGruppenName" , :"V_Staat" do begin if ( :"V_TempHelpInt" = 0 ) then "V_TempHelpInt" = 1; else "ArtikelText" = "ArtikelText" || :"Error" || 'br="0">, '; -- Hochzahl Doppelpunkt Leerzeichen Prozentsatz Komma Leerzeichen if ( :"V_PosG-Preis" is null ) then -- Dann ist es Prozentual und nicht mit Betrag 0 ueberschrieben "ArtikelText" = "ArtikelText" || :"Error" || 'br="0" subsuperscripttype="super">' || :"V_MwSt_KurzZeichen" || '' || :"Error" || iif(:"V_MwSt_KurzZeichen" = '' , 'br="0">' , 'br="0">: ' )|| :"V_Staat" ||'-'||:"V_MwSt-Satz" || '%'; else "ArtikelText" = "ArtikelText" || :"Error" || 'br="0" subsuperscripttype="super">' || :"V_MwSt_KurzZeichen" || '' || :"Error" || iif(:"V_MwSt_KurzZeichen" = '' , 'br="0">' , 'br="0">: ' )|| :"V_Staat" ||'-'||:"V_MwStGruppenName" || ''; end end end if ( ( select count(*) from "AuftragsDokumentePositionen" A where A."AuftrDokPosi_DokumentID" = :"I_AuftrDokumentID" and A."AuftrDokPosi_Option" = 2 ) > 0 ) then begin -- Unberechnete Position gefunden schauen ob ein A für Alternativ hinterlegt ist ! "V_MwStGruppenName" = RDB$GET_CONTEXT('USER_TRANSACTION', '#Unberechnet_PosZVorPos#' ); if ( :"V_MwStGruppenName" is not null and trim(:"V_MwStGruppenName") != '' ) then begin -- Legende um Alternativtext ergaenzen if ( :"V_TempHelpInt" = 0 ) then "V_TempHelpInt" = 1; else "ArtikelText" = "ArtikelText" || :"Error" || 'br="0">, '; "ArtikelText" = "ArtikelText" || :"Error" || 'br="0" subsuperscripttype="super">' || :"V_MwStGruppenName" || '' || :"Error" || 'br="0">:Alternativ'; end end if ( :"V_DokStdVersandArtID" is not null ) then begin -- Es muss eine Legende fuer die Versandarten ausgegeben werden "V_TempHelpInt" = 1; -- nur damit er unten auch wirklich rein geht for select distinct "AufDokVerArt_StdKuerzel" , "AufDokVerArt_StdName" from "AuftragsDokumentePositionen" A join "AuftragsDokumentVersandArt" B ON B."AuftrDokumVersandArt_ID" = A."AuftrDokPosi_VersandArt" where A."AuftrDokPosi_DokumentID" = :"I_AuftrDokumentID" and A."AuftrDokPosi_VersandArt" is not NULL and A."AuftrDokPosi_VersandArt" != 0 and A."AuftrDokPosi_VersandArt" != :"V_DokStdVersandArtID" and B."AufDokVerArt_StdKuerzel" is not null into :"V_AuftrPosiVersand_KurzZeichen" , :"V_TempVarCharMax" do begin if ( :"ArtikelText" = '' ) then begin "ArtikelText" = :"ArtikelText" || ''|| :"V_AuftrPosiVersand_KurzZeichen" ||':'|| :"V_TempVarCharMax" || ''; end else "ArtikelText" = :"ArtikelText" || ','|| :"V_AuftrPosiVersand_KurzZeichen" ||':'|| :"V_TempVarCharMax" || ''; end end if ( :"V_TempHelpInt" > 0 ) then begin "ArtikelText" = "ArtikelText" || ''; "RowType" = 3; suspend; "V_LastPositionsArt" = :"PositionsArt"; end end ^ SET TERM ; ^ DESCRIBE PARAMETER "StrukturText" PROCEDURE "AuftragsDokumente_Drucken" 'PositionsText=StrukturText+PositionsNr'; DESCRIBE PARAMETER "PositionsNr" PROCEDURE "AuftragsDokumente_Drucken" 'Nur Positionsnummer allein'; DESCRIBE PARAMETER "PositionsStringFormatiert" PROCEDURE "AuftragsDokumente_Drucken" 'Wird als Parameter gebraucht wenn es Strukturen gibt'; DESCRIBE PARAMETER "PosText1" PROCEDURE "AuftragsDokumente_Drucken" 'Erstes Feld der Positionsstruktur zm Drucken rechtsbuendig ausgerichtet'; DESCRIBE PARAMETER "PosText2" PROCEDURE "AuftragsDokumente_Drucken" 'Zweites Feld der Positionsstruktur zm Drucken linksbuendig ausgerichtet'; DESCRIBE PARAMETER "VMenge" PROCEDURE "AuftragsDokumente_Drucken" 'Vorkommaanteil'; DESCRIBE PARAMETER "NMenge" PROCEDURE "AuftragsDokumente_Drucken" 'Nachkommaanteil Menge mit Komma'; DESCRIBE PARAMETER "Artikelnummer" PROCEDURE "AuftragsDokumente_Drucken" 'Feld Artikelnr. + evtl. ein Sternchen was auf ArtikelTZextGeaendert hinweist'; DESCRIBE PARAMETER "Preiseinheit" PROCEDURE "AuftragsDokumente_Drucken" '"Einheiten"."Einh_Drucken" domain vor Aenderung jetzt wird durch die Ergaenzung der Inhaltsmenge mehr platz benoetigt'; DESCRIBE PARAMETER "ExtraAbstandEinfuegen" PROCEDURE "AuftragsDokumente_Drucken" 'DB-Null bedeutet Abstand in hoehe von kleinem "x" und bei allen anderen Werten in mm nach der Position einfuegen'; DESCRIBE PARAMETER "Pos_GPreis_StruktPreis" PROCEDURE "AuftragsDokumente_Drucken" 'Gibt den ein oder anderen GesPreis aus je nachdem ob es eine Position oder Struktur ist'; /* Alter (AuftragsDokumente_Drucken_old) */ SET TERM ^ ; ALTER PROCEDURE "AuftragsDokumente_Drucken_old"("I_AuftrDokumentID" INTEGER, "I_DruckKonfigID" INTEGER, "I_Eltern_ID" INTEGER, "I_PositionsString" "d_str50", "I_NurDieseEbene" D_BOOLEAN_YN, "I_NettoPreise" D_BOOLEAN_YN, "I_MwSt_Kurzform" D_BOOLEAN_YN, "I_Format" "d_str10", "I_Format_PosText" "d_str40", "I_Format_G-Preis" "d_str20", "I_Format_E-Preis" "d_str20", "I_Format_Menge" "d_str20", "I_Warnings" D_BOOLEAN_YN, "I_Commands" TYPE OF COLUMN "DruckJobs"."DrJob_Commands", "I_Int_Help" INTEGER, "I_BigInt_Help" BIGINT, "I_Varchar_Help" "d_str512", "I_Zeile" INTEGER) RETURNS("PositionsArt" INTEGER, "StrukturText" "d_str50", "PositionsNr" INTEGER, "PositionsStringFormatiert" "d_str60", "PosText1" "d_str10", "PosText2" "d_str60", "RAuftrDokStruktur_ID" INTEGER, "RAuftragsDokumentePositionen_ID" GENERATOR_VALUE, "VMenge" "d_str20", "NMenge" "d_str10", "MengeGeliefert" "d_str20", "MengeRueckstand" "d_str20", "ArtikelText" "d_strMax", "ArtikelBlobText" BLOB SUB_TYPE 1 SEGMENT SIZE 8192, "KurztextAnzAbsaetze" INTEGER, "Artikelnummer" VARCHAR(31), "EAN_Code" GENERATOR_VALUE, "E-Preis" "d_str20", "G-Preis" "d_str20", "Preiseinheit" "d_str30", "MwSt_Satz" "d_str10", "TexgenCommand" "d_str30", "HintergrundFarbe" VARCHAR(6), "Warnings" "d_str320", "CZeileFett" VARCHAR(1), "CZeileItalic" VARCHAR(1), "CgesPreisFett" VARCHAR(1), "CgesPreisUnterstreichen" VARCHAR(1), "CgesPreisDoppeltUnterstreichen" VARCHAR(1), "ZeilenNr" INTEGER, "RowType" INTEGER, "ExtraAbstandEinfuegen" INTEGER, "PosRabatt" "d_str10", "Pos_GPreis_StruktPreis" "Geld") AS declare variable "V_AuftragsDokumentePositionenID" GENERATOR_VALUE; declare variable "V_AuftrDokStrukturID" integer; declare variable "V_AuftrDokPos" integer; declare variable "V_AuftrDokPosText" "PositionsNrText"; declare variable "V_StrukturID" integer; declare variable "V_Option" integer; declare variable "V_Kurztext" integer; declare variable "V_PositionsArt" integer; declare variable "V_LastPositionsArt" integer; /* Welche Positionsart vor dieser war */ declare variable "V_Position" integer; declare variable "V_StrukturPos" varchar(5); declare variable "V_Struktur_Summe" "Geld"; declare variable "V_AuftrDokStruktur_SummeDrucken" "D_BOOLEAN_YNNull"; declare variable "V_Struktur_FettDrucken" "D_BOOLEAN_YNNull"; declare variable "V_Struktur_InAuflistung" "D_BOOLEAN_YNNull"; declare variable "V_Struktur_PreiseAusbl" "D_BOOLEAN_YNNull"; declare variable "V_OldStruktur_PreiseAusbl" "D_BOOLEAN_YNNull"; declare variable "V_CursorEmpty" integer = 0; declare variable "V_Positionen_ArtikelText" type of column "AuftrDokum_TextArtenSprachen"."ADTAS_Text"; /* "AuftrDokum_TextArtenSprachen"."ADTAS_Text" evtl. kommt noch Text dazu durch ergaenzungen also von Hand etwas mehr definieren */ declare variable "V_Struktur_ArtikelText" type of column "AuftragsDokumentStruktur"."AuftrDokStruktur_Text"; declare variable "V_LangText" "d_BLOB_XML_RTF"; declare variable "V_LangTextHTML" "d_BLOB_HTML"; declare variable "V_PosG-Preis" "Geld_genau"; declare variable "V_PosG-PreisOhneRabatt" "Geld_genau"; declare variable "V_MwSt-Satz" "MwSt_Satz"; declare variable "V_Waehrung" "d_str20"; declare variable "V_EAN-Code" type of column "Artikel"."Art_EAN_Code"; declare variable "V_MengeDokument" "Mengen"; /* Mengenangabe wie sie im Dokument angegeben wurde. */ declare variable "V_Zeile" integer; declare variable "V_CountMwSt_Saetze" integer; /* Anzahl MwSt Positionen. */ declare variable "V_MwSt_KurzZeichen" varchar(1) character set ISO8859_1; declare variable "V_Artikelnummer" varchar(30); declare variable "V_EigeneArtikelNr" varchar(30); /* Bei Lieferanten Einkaufsdikumenten die Eigene Artikelnummer */ declare variable "V_TempGP_ID" integer; declare variable "V_Temp_AnschID" bigint; declare variable "V_Temp_ASP" integer; declare variable "V_AuftrDokumentArt" integer; declare variable "V_TempHelpInt" integer; declare variable "V_PreisEinheit" "d_str30"; /* "Einheiten"."Einh_Drucken" domain vor Aenderung jetzt wird durch die Ergaenzung der Inhaltsmenge mehr platz benoetigt */ declare variable "V_VPE_Inhalts_Menge" "Mengen"; declare variable "V_MengeAnzNachkommastellen" integer; declare variable "CKeinUmbruchDanach" char(1) = 'N'; declare variable "P_HiddenHide" integer; declare variable "P_MarkChangedArticle" integer; declare variable "Error" "d_str512"; declare variable "V_Staat" type of column "Staaten"."Postkuerzel"; declare variable "V_MwStGruppenName" type of column "MwSt_Gruppen"."MwSt_Gr_Name"; declare variable "V_PosRabatt" "d_str10"; declare variable "V_OldRowType" integer; declare variable "V_AuftrDokBruttoPreise" D_BOOLEAN_YN; declare variable "V_Von_GP_ID" integer; declare variable "V_Fuer_GP_ID" integer; declare variable "V_Fuer_AnschID" bigint; declare variable "V_Fuer_Asp" integer; declare variable "V_Liefer_GP_ID" integer; declare variable "V_Liefer_AnschID" bigint; declare variable "V_Liefer_Asp" integer; declare variable "V_TempVarCharMax" "d_strMax"; declare variable "V_TempInt" integer; declare variable "V_EigenschaftenText" "d_str512"; declare variable "V_DokStdVersandArtID" integer; /* Die im Dokument angegeben standard Versandart */ declare variable "V_AuftragPositionVersandArtID" integer; /* Die evtl. vorhandne Versandart der Position */ declare variable "V_AuftrPosiVersand_KurzZeichen" type of column "AuftragsDokumentVersandArt"."AufDokVerArt_StdKuerzel"; declare "Struktur" cursor for ( select "AuftrDokStruktur_ID", "AuftrDokStruktur_Position", "AuftrDokStruktur_Text", "AuftrDokStruktur_Summe", "AuftrDokStruktur_SummeDrucken", "AuftrDokStruktur_FettDrucken", "AuftrDokStruktur_PreiseAusbl", "AuftrDokStruktur_InAuflistung" from "AuftragsDokumentStruktur" where "AuftrDokStruktur_Dokument_ID" = :"I_AuftrDokumentID" and "AuftrDokStruktur_ElternID" is not distinct from :"I_Eltern_ID" /* Diese code wird durch "is not distinct from" abgeloest where (cast(:"Eltern_ID" as integer) is null and "AuftrDokStruktur_ElternID" is null) or (cast(:"Eltern_ID" as integer) is not null and "AuftrDokStruktur_ElternID" = :"Eltern_ID") */ order by "AuftrDokStruktur_Position"); begin -- RowType == 0 nornmale Tabellenzeile /* ACHTUNG RowType 1 und 2 sind sehr gefährlich ( funktionieren nicht wie sie sollen ) Der Text nimmt nicht die Beite ein die er einnehmen soll sondern bricht schon vorher um. Das sieht natuerlich sehr bloed aus. RowType == 1 Tabellenzeile mit wenig multicolumn RowType == 2 Tabellenzeile mit viel multicolumn */ -- RowType == 3 MultiColumn Zeile fuer Summenzeilem am ende des Dokuments. Die Zeile darf/wird nicht UMGEBROCHEN sie muss passen !!!! -- RowType == 4 keinen Tabellentext ( Leerzeile ) -- RowType == 5 horizontale Linie -- RowType == 6 Seitenumbruch -- RowType == 7 Zusammenhaegender Bereich ohne Seitenumbruch ANFANG - Feld "ArtikelText" = 'bezeichner' ( bezeichner nur kleinbuchstaben ) -- RowType == 8 Zusammenhaegender Bereich ohne Seitenumbruch ENDE - Feld "ArtikelText" = 'bezeichner' ( bezeichner nur kleinbuchstaben ) --ExtraAbstandEinfuegen: DB-Null kein Abstand einfuegen / 0 = 1ex Abstand einfuegen / > 0 = Abstand in mm anhaengen / < 0 mm zurueck aber selber bloed wer macht --CZeileFett --CZeileItalic --CgesPreisFett --CgesPreisUnterstreichen --CgesPreisDoppeltUnterstreichen -- Parameter fuer "I_Commands" -- #HiddenHide# verbirgt alle als versteckt gekennzeichneten Zeilen -- #RealDokNr# gibt immer die richtige Dokumentnr. und nicht evtl. den Text "Dokumentvorschau" zurueck. wird in SP "AuftragDokument-Parameter" verwendet -- Folgende Parameter am 21.03.2013 zum Einbauen mit vorgesehen. -- #LieferAnschriftVerwenden# -- Wenn eine abweichende Lieferanschrift vorhanden ist wird diese Verwendet und die beiden Anschriftenfelder auf dem Dokument vertauscht. -- #KeineZweitAnschrift# -- Das zweite Adressfeld im Dokument wird auf jeden Fall leer gelassen /* ################## A C H T U N G ################ Daran denken das man die fuer_AnschID auch mit der Liefer_AnschID wechseln können muß. Zusätzlich ist jetzt noch der Asp. anwählbar ob er mit gedruckt werden soll. */ -- "P_HiddenHide" = coalesce( position( '#HiddenHide#' , :"I_Commands" ),0); "P_MarkChangedArticle" = coalesce( position( '#MarkChangedArticle#' , :"I_Commands" ),0); -- -- ACHTUNG immer darauf achten das die Summen des Dokument berechnet wurden. -- sonst werden alte Summen gedruckt. Kann hier nicht gut geprueft werden -- da auch Joins mit der SP gemacht werden und die gleich maulen oder -- andauernd Preise berechnet werden. -- Evtl. mal was anderes ueberlegen. if ( trim("I_PositionsString") = '') then "I_PositionsString" = NULL; "V_Position" = 1; if (:"I_Zeile" is null ) then "ZeilenNr" = 0; -- Wird unten schon bei der ersten Zeile +1 genommen else "ZeilenNr" = :"I_Zeile"; -- Wird unten schon bei ser ersten Zeile +1 genommen if ( :"I_Commands" is distinct from 'HelperFuntctionIsRunning' ) then -- Wird benutzt um die letzte Position im Dokument zu finden um den Summenstart RowType 7 zu senden. begin if ( :"I_Eltern_ID" is null ) then -- Nur auf der ertsen ebene einmal aufrufen evtl. eine Contextvariable setzen, begin -- damit man auch einzelne Ebenen drucken kann. RDB$SET_CONTEXT('USER_TRANSACTION', 'CV_LastPositionID', NULL); RDB$SET_CONTEXT('USER_TRANSACTION', 'CV_LastPositionID', (select "O_LastPositionID" from "AuftrDokDruck_HelperFunction"( 'PositionsStringFormat' , :"I_AuftrDokumentID" , NULL , NULL , NULL ))); -- Anzahl Positionen von MwSt saetzen ermitteln wenn wir hier auf der Strukturebene NULL sind select count(*) from "AuftragsDokumentePositionen" where "AuftrDokPosi_DokumentID" = :"I_AuftrDokumentID" and "AuftrDokPosi_Art" = 300 into :"V_CountMwSt_Saetze"; -- ######################## Start setzte Contextvariablen ################################# -- Zuerst alle benutzten Contextvariablen auf NULL setzen sonst evtl. Fehler die nicht nachvollziehbar sind ! RDB$SET_CONTEXT('USER_TRANSACTION', '#GPID#', NULL ); RDB$SET_CONTEXT('USER_TRANSACTION', '#KDNR#', NULL ); RDB$SET_CONTEXT('USER_TRANSACTION', '#LRNR#', NULL ); RDB$SET_CONTEXT('USER_TRANSACTION', '#LieferantenNr#', NULL ); RDB$SET_CONTEXT('USER_TRANSACTION', '#Unberechnet_PosZVorPos#' , NULL); -- Text der vor die Positionsangabe gestellt wird wenn die Option Unberechnet gesetzt ist. RDB$SET_CONTEXT('USER_TRANSACTION', '#Adr1_GP_ID#' ,NULL ); RDB$SET_CONTEXT('USER_TRANSACTION', '#Adr1_AnschID#' ,NULL ); RDB$SET_CONTEXT('USER_TRANSACTION', '#Adr1_AspID#' , NULL ); RDB$SET_CONTEXT('USER_TRANSACTION', '#Adr2_GP_ID#' ,NULL ); RDB$SET_CONTEXT('USER_TRANSACTION', '#Adr2_AnschID#' , NULL ); RDB$SET_CONTEXT('USER_TRANSACTION', '#Adr2_AspID#' , NULL ); RDB$SET_CONTEXT('USER_TRANSACTION', '#Adr2_Anmerkung#' , NULL ); --Umgebungsvariablen setzen -- #GPID#/'#KDNR#' und '#LieferantenNr#' beziehen sich immer auf den Empfaenger RDB$SET_CONTEXT('USER_TRANSACTION', '#GPID#', ( select "Text" from "AuftragDokument-Parameter"( 'GPID' , :"I_AuftrDokumentID" , NULL , NULL , NULL , NULL , NULL , :"I_Commands" ))); RDB$SET_CONTEXT('USER_TRANSACTION', '#KDNR#', ( select "Text" from "AuftragDokument-Parameter"( 'KDNR' , :"I_AuftrDokumentID" , NULL , NULL , NULL , NULL , NULL , :"I_Commands" ))); RDB$SET_CONTEXT('USER_TRANSACTION', '#LieferantenNr#', ( select "Text" from "AuftragDokument-Parameter"( 'LieferantenNr' , :"I_AuftrDokumentID" , NULL , NULL , NULL , NULL , NULL , :"I_Commands" ))); -- Das Staatenkuerzel des Empfaengers ermitteln. ACHTUNG AnschID benutzen da eine bestimmte Anschrift im Dokument gewaehltr werden kann. rdb$set_context( 'USER_TRANSACTION' , '#ABSENDER_STAAT#' , ( select "PLZ_Postkuerzel" from "AuftragsDokumente" A join "Anschriften" B ON B.anschriften_id = A."AuftrDokument_von_AnschID" join PLZ C ON C.plz_id = B.a_plz_id where A."AuftrDokument_ID" = :"I_AuftrDokumentID" )); select coalesce( "AuftrDokument_VersandArt",0) , "AuftrDokument_Art" , "AuftrDokument_BruttoPreise" , "AuftrDokument_von_GP_ID" , coalesce( b.adaz_gp_id , "AuftrDokument_fuer_GP_ID" ) , coalesce( b."ADAZ_GP_AnschID" , "AuftrDokument_fuer_AnschID" ), iif ( b.adaz_gp_id is null , iif ( "AuftrDokument_FuerAspInAnschr" is distinct from 'N' , "AuftrDokument_fuer_ASP" , NULL) , iif ( b."ADAZ_AspInAnschrYN" is distinct from 'N' , b."ADAZ_Asp_ID" , NULL )) from "AuftragsDokumente" A left outer join "AuftragsDokumenteAnschrZuordnun" B on A."AuftrDokument_ID" = b."ADAZ_AuftrDokument_ID" and a."AuftrDokument_von_GP_ID" = b."ADAZ_VonGP_ID" and a."AuftrDokument_Art" = b."ADAZ_AuftrDokumentArt" and b."ADAZ_KopieEmpfaenger" in ( 0 ,1 ) -- = 0 Originalempfaenger mit GP-Daten / 1 = andere Anschrift aber GP-DAten bleiben gleich >= 10 Kopie empfaenger where A."AuftrDokument_ID" = :"I_AuftrDokumentID" into :"V_DokStdVersandArtID" , :"V_AuftrDokumentArt" , :"V_AuftrDokBruttoPreise" ,:"V_Von_GP_ID" , :"V_Fuer_GP_ID" , :"V_Fuer_AnschID" , :"V_Fuer_Asp"; -- :"V_DokStdVersandArtID" ist jetzt auf jeden Fall nicht mehr NULL unten wird jetzt auf NULL gesetzt wenn alle Positionen der einen StandardVersandart entsprechen. if ( not exists ( select * from "AuftragsDokumentePositionen" A where A."AuftrDokPosi_DokumentID" = :"I_AuftrDokumentID" and A."AuftrDokPosi_VersandArt" is not NULL and A."AuftrDokPosi_VersandArt" != 0 and A."AuftrDokPosi_VersandArt" != :"V_DokStdVersandArtID" ) ) then "V_DokStdVersandArtID" = NULL; -- Null zeigt an das nichts gemacht werden muss if ( :"I_DruckKonfigID" is not null ) then -- Nur machen wenn gedruckt wird begin if ( rdb$get_context( 'USER_TRANSACTION', '#Unberechnet_PosZVorPos#' ) is null ) then -- Text der vor die Positionsangabe gestellt wird wenn die Option Unberechnet gesetzt ist. -- Die Folgende Abfrage ist sehr komplieziert wegen den Unterabfragen Sie soll das kurzzeichen ermitteln wenn eine StammdatenVerID vorhanden ist nimmt sie die erste Abfrage -- ansonsten versucht sucht sie auch ueber aktStammdaten das zeichen zu finden aber nur wenn StammdatenVerID im Dokument nich gesetzt ist. RDB$SET_CONTEXT('USER_TRANSACTION', '#Unberechnet_PosZVorPos#' , ( select coalesce( ( select "StDaten_Unberechnet_PosZVorPos" from "AuftragsDokumente" A join "Stammdaten" B ON B."Stammdaten_VerID" = (select "AuftrDokument_StamDatenVerID" from "AuftragsDokumente" where "AuftrDokument_ID" = :"I_AuftrDokumentID" ) and B."StammD_Gesch_Partner_ID" = A."AuftrDokument_von_GP_ID" where A."AuftrDokument_ID" = :"I_AuftrDokumentID" ) , ( select "StDaten_Unberechnet_PosZVorPos" from "AKT_Stammdaten" A join "Stammdaten" B ON B."Stammdaten_VerID" = A."Akt_Stammdaten_VerID" and B."StammD_Gesch_Partner_ID" = (select "AuftrDokument_von_GP_ID" from "AuftragsDokumente" where "AuftrDokument_ID" = :"I_AuftrDokumentID" and "AuftrDokument_StamDatenVerID" is null ) )) from "GetOneResultRow" )); RDB$SET_CONTEXT('USER_TRANSACTION', 'CV_KeinSeitenumbruchBisBruttoSum' , 0 ); -- 'CV_KeinSeitenumbruchBisBruttoSum' auf 0 setzen um inaktiv anzuzeigen end /* Contextvariablen fuer die Anschriftenfelder setzen. Adresse1 = Im sichfenster des Couverts Adresse2 = Zweitadresse z.B. Lieferadresse wird irgendwo unterhal aufgelistet. */ RDB$SET_CONTEXT('USER_TRANSACTION', '#Adr1_GP_ID#' , :"V_Fuer_GP_ID" ); RDB$SET_CONTEXT('USER_TRANSACTION', '#Adr1_AnschID#' , :"V_Fuer_AnschID" ); RDB$SET_CONTEXT('USER_TRANSACTION', '#Adr1_AspID#' , :"V_Fuer_Asp" ); "V_TempInt" = NULL; if ( :"V_AuftrDokumentArt" <= 300 ) then -- Die angegeben Lieferanschrift nutzen. "V_TempInt" = :"I_AuftrDokumentID"; else if ( :"V_AuftrDokumentArt" = 400 ) then -- Die in der AB angegebene Lieferanschrift nutzen "V_TempInt" = ( select "vonAuftragDokumentID" from "AuftrDokument_UniqueDocSource"( :"I_AuftrDokumentID" , 200 )); if ( :"V_TempInt" is not null ) then begin select b.adaz_gp_id , b."ADAZ_GP_AnschID" , iif ( b."ADAZ_AspInAnschrYN" is not distinct from 'Y' , b."ADAZ_Asp_ID" , null ), B."ADAZ_Anmerkung" from "AuftragsDokumenteAnschrZuordnun" B where b."ADAZ_AuftrDokument_ID" = :"V_TempInt" and b."ADAZ_VonGP_ID" = :"V_Von_GP_ID" and b."ADAZ_AuftrDokumentArt" = 300 -- 300 Lieferscheine and b."ADAZ_KopieEmpfaenger" in ( 0,1) -- 0 originalempfaenger / 1 = andere Anschrift fuer Leferscheine into :"V_Liefer_GP_ID" , :"V_Liefer_AnschID" , :"V_Liefer_Asp" , :"V_TempVarCharMax"; if ( :"V_Liefer_GP_ID" is not null ) then begin RDB$SET_CONTEXT('USER_TRANSACTION', '#Adr2_AnschText#' , 'Lieferanschrift:'); RDB$SET_CONTEXT('USER_TRANSACTION', '#Adr2_GP_ID#' , :"V_Liefer_GP_ID" ); RDB$SET_CONTEXT('USER_TRANSACTION', '#Adr2_AnschID#' , :"V_Liefer_AnschID" ); RDB$SET_CONTEXT('USER_TRANSACTION', '#Adr2_AspID#' , :"V_Liefer_Asp" ); RDB$SET_CONTEXT('USER_TRANSACTION', '#Adr2_Anmerkung#' , :"V_TempVarCharMax" ); end end -- ######################## Ende setzte Contextvariablen ################################# -- Dokumentetxte sollten am ende erezugt werden wenn alle Parameter schon gesetzt sind. if ( :"I_DruckKonfigID" is not null ) then begin "Error" = (select "Error" from "AuftrDokument_TexteErzeugen"( 'TextVorArtikelTabelle' , :"I_AuftrDokumentID" , :"I_DruckKonfigID" , :"I_Format" , :"I_Commands" , NULL , 0 )); "Error" = (select "Error" from "AuftrDokument_TexteErzeugen"( 'TextNachArtikelTabelle' , :"I_AuftrDokumentID" , :"I_DruckKonfigID" , :"I_Format" , :"I_Commands" , NULL ,0 )); end -- Anzahl benoetigter Nachkommastellen fuer die Mengenspalte ermitteln -- 0 = Keine , 1 = eine usw. -1 = Fehler <-- Sollte hier nie vorkommen koennen bei Menge = numeric(X,3) "V_MengeAnzNachkommastellen" = ( select iif( count(*) = SUM(A) , 0 , iif( count(*) = SUM(B) ,1, IIF( count(*) = SUM(C) ,2, iif( count(*) = SUM(D) , 3, -1 )))) from ( select iif( "AuftrDokPosi_Menge" = round( "AuftrDokPosi_Menge" ,0) , 1 , 0) , iif( "AuftrDokPosi_Menge" = round( "AuftrDokPosi_Menge" ,1) , 1 , 0) , iif( "AuftrDokPosi_Menge" = round( "AuftrDokPosi_Menge" ,2) , 1 , 0) , iif( "AuftrDokPosi_Menge" = round( "AuftrDokPosi_Menge" ,3) , 1 , 0) from "AuftragsDokumentePositionen" A Where "AuftrDokPosi_DokumentID" = :"I_AuftrDokumentID" and "AuftrDokPosi_Menge" is not null) AS DT ( A , B , C , D)); end end open "Struktur"; fetch "Struktur" into :"V_StrukturID" , :"V_StrukturPos" , :"V_Struktur_ArtikelText" , :"V_Struktur_Summe" , :"V_AuftrDokStruktur_SummeDrucken" , :"V_Struktur_FettDrucken" , :"V_Struktur_PreiseAusbl" , :"V_Struktur_InAuflistung"; if ( row_count = 0 ) then "V_CursorEmpty" = 1; for select "AuftrDokPosi_Option" , "AuftrDokPosi_Kurztext" , "AuftrDokPosi_Art" , "AuftragsDokumentePositionen_ID" , "AuftrDokPosi_PositionsText" , "AuftrDokPosi_Position" , case when ( a."AuftrDokPosi_Art" = 1 ) then f."ATAS_Text" else E."ADTAS_Text" end , case when ( a."AuftrDokPosi_Art" = 1 ) then f."ATAS_LangText" else E."ADTAS_LangText" end , case when ( a."AuftrDokPosi_Art" = 1 ) then f."ATAS_LangTextHTML" else E."ADTAS_LangTextHTML" end , "AuftrDokPosi_Menge", "AuftrDokPosi_PosGPreis", ( "AuftrDokPosi_GPreis" + coalesce( "AuftrDokPosi_ArtikeOptionsPreis" * "AuftrDokPosi_Menge" , 0 ) ), -- Positions ges. Preis ohne Rabatt "AuftrDokPosi_PositionsRabatt" , "MwStKz" , trim(b."Art_Artikelnr" ||' '|| coalesce(b."Art_Revision",'')) , "Einh_Drucken" , b."Art_VPE_Inhalts_Menge" , iif( i."Art_Artikelnr" is not distinct from b."Art_Artikelnr" , NULL , i."Art_Artikelnr" ) -- Die eigene Artikelnr nur einschreiben wenn sie von der oben abweicht , iif( B."Artikel_ID" is null or not :"V_AuftrDokumentArt" between 1 and 400 , '' , ( select ascii_char(10)||'( '||"EigenschaftenText"||' )' from "ArtikelEigenschaften_TexteWerte"( b."Artikel_ID" , NULL)) ) -- Nur eine "AuftrDokPosi_VersandArt" schreiben wenn es nicht die Standardart ist und wenn sie > 0 ist ( also eine Legende erzeugt werden muss ) , iif( :"V_DokStdVersandArtID" is not null and "AuftrDokPosi_VersandArt" > 0 and "AuftrDokPosi_VersandArt" != :"V_DokStdVersandArtID" , "AuftrDokPosi_VersandArt" , NULL ) from "AuftragsDokumentePositionen" A left outer join "Artikel" B ON A."AuftrDokPosi_Artikel_ID" = B."Artikel_ID" and a."AuftrDokPosi_ArtikelVersion" = b."Artikel_Version" join ( select "MwStSaetze_ID", "KurzZeichen" from "AuftrDokument_MwSt_Liste"( :"I_AuftrDokumentID" , 'Y' ) F ) AS DTAB ( "MSaetze_ID" , "MwStKz" ) ON A."AuftrDokPosi_MwStSaetze_ID" = "MSaetze_ID" -- Achtung keinen Left Outer Join draus machen kostet enorm performance und ist nicht noetig join "Einheiten" D ON A."AuftrDokPosi_PreisEinheit" = D."Einheiten_ID" -- Left outer join sollte nicht noetig sein da Preiseinheit ein NOT NULL Feld ist. left outer join "AuftrDokum_TextArtenSprachen" E ON A."AuftragsDokumentePositionen_ID" = E."ADTAS_AuftrDokumentPositionenID" and E."ADTAS_SprachenID" = 1 and E."ADTAS_TextArtID" = 1 left outer join "ArtikelTextArtenSprachen" F On E."ADTAS_ArtikelTextArtSprachenID" = F."ArtikelTextArtenSprachenID" left outer join "AuftragDokumentPosition_Einkauf" h ON A."AuftragsDokumentePositionen_ID" = H."AuftragsDokumentePositionenE_ID" left outer join "Artikel" I ON H."AuftrDokPosiEk_Artikel_ID" = i."Artikel_ID" and h."AuftrDokPosiEk_ArtikelVersion" = i."Artikel_Version" -- Nachfolgende Joins funktionieren nicht korrekt ganz vorsichtig falls aenderungen noetig werden. -- "MwStKz" oben im Select benutzen sonst kommt immer noch der dummyeintrag durch -- Wenn anstatt des Dummy Eintrags mit PK=0 ein DB-Null benutzt wird und hierein Left Outer Join gesetzt wird geht die permormance extrem in dem Keller 3000 Positionen 1 minute und mit dem hier 2 sekunden -- Habe alles probiert aber so funktioniert es einfach am besten auch wenn der Dummy Eintrag benoetigt wird -- join "AuftrDokument_MwSt_Liste"( :"I_AuftrDokumentID" , 'Y' ) C ON A."AuftrDokPosi_MwStSaetze_ID" = C."MwStSaetze_ID" -- Achtung keinen Left Outer Join draus machen kostet enorm performance und ist nicht noetig where "AuftrDokPosi_DokumentID" = :"I_AuftrDokumentID" and "AuftrDokPosi_DokStrukturID" is not distinct from :"I_Eltern_ID" and "AuftrDokPosi_Position" >= 0 and "AuftrDokPosi_Art" not in ( 110 ) -- 110 = Zwischensumme start ( sonst gibt es eine Leerzeile ) order by "AuftrDokPosi_Position" into :"V_Option" , :"V_Kurztext" , :"V_PositionsArt" , :"V_AuftragsDokumentePositionenID" , :"V_AuftrDokPosText" , :"V_AuftrDokPos" , :"V_Positionen_ArtikelText" , :"V_LangText" , :"V_LangTextHTML" , :"V_MengeDokument" , :"V_PosG-Preis" , :"V_PosG-PreisOhneRabatt" , :"V_PosRabatt" , :"V_MwSt_KurzZeichen" , :"V_Artikelnummer" , :"V_PreisEinheit" , :"V_VPE_Inhalts_Menge" , :"V_EigeneArtikelNr" , :"V_EigenschaftenText" , :"V_AuftragPositionVersandArtID" do begin -- Aenderung vom 26.02.2014 if ( :"V_AuftrDokumentArt" > 10000 and :"V_VPE_Inhalts_Menge" > 1 ) then begin if ( cast( :"V_VPE_Inhalts_Menge" as integer) = :"V_VPE_Inhalts_Menge" ) then "V_PreisEinheit" = '(à'||cast(:"V_VPE_Inhalts_Menge" as integer)||' '||:"V_PreisEinheit"||')'; else if( :"V_VPE_Inhalts_Menge" = round( :"V_VPE_Inhalts_Menge" ,1) ) then "V_PreisEinheit" = '(à'||round(:"V_VPE_Inhalts_Menge",1)||' '||:"V_PreisEinheit"||')'; else if( :"V_VPE_Inhalts_Menge" = round( :"V_VPE_Inhalts_Menge" ,2) ) then "V_PreisEinheit" = '(à'||round(:"V_VPE_Inhalts_Menge",2)||' '||:"V_PreisEinheit"||')'; else "V_PreisEinheit" = '(à'||:"V_VPE_Inhalts_Menge"||' '||:"V_PreisEinheit"||')'; -- "V_Positionen_ArtikelText" = 'à('||:"V_VPE_Inhalts_Menge"||' Stück )'||ascii_char(29) || :"V_Positionen_ArtikelText" || ascii_char(29)|| 'à(100 Stück )'; end if ( :"V_EigeneArtikelNr" is not null ) then begin if ( :"V_LangText" is null ) then "V_LangText" = iif( :"V_Positionen_ArtikelText" is null , :"V_EigeneArtikelNr", :"V_Positionen_ArtikelText"||' ' || ascii_char(29)||ascii_char(10)|| :"V_EigeneArtikelNr"); else begin -- Im Blob steht schon was drinn if ( :"V_Positionen_ArtikelText" is null ) then "V_LangText" = :"V_LangText" ||' '|| ascii_char(29)||ascii_char(10)|| :"V_EigeneArtikelNr"; else -- Es hat wohl in beiden Feldern etwas gestanden ( Sollte momentan niemals passieren evtl. ignorieren ) "V_LangText" = :"V_Positionen_ArtikelText"||' ' || ascii_char(29) || ' '|| :"V_LangText" || ' '||ascii_char(29)||ascii_char(10)|| :"V_EigeneArtikelNr"; end "V_Positionen_ArtikelText" = NULL; -- Wenn es in das normale Textfeld passt kopiert er es unten eh dort rein. end -- Ene Aenderung vom 26.02.2014 -- Alle Ausgabeparameter zuruecksetzen "PosText1" = null ; "PosText2" = NULL ;"PositionsArt" =NULL ; "StrukturText" = :"I_PositionsString"; "PositionsNr" = NULL ; "RAuftrDokStruktur_ID" = NULL; "RAuftragsDokumentePositionen_ID" = NULL;"VMenge" = NULL;"NMenge" = NULL; "MengeGeliefert" = NULL;"MengeRueckstand" = NULL;"ArtikelBlobText" = NULL;"ArtikelText" = NULL ; "KurztextAnzAbsaetze" = NULL ;"Artikelnummer" = NULL;"EAN_Code" = NULL;"E-Preis" = NULL;"G-Preis" = NULL;"Preiseinheit" = NULL;"MwSt_Satz" = NULL;"TexgenCommand" = NULL; "CZeileFett" = NULL ; "CZeileItalic" = NULL ; "CgesPreisFett" = NULL ; "CgesPreisUnterstreichen" = NULL ; "CgesPreisDoppeltUnterstreichen" = NULL ; "RowType" = 0 ; "PosRabatt" = NULL; "ExtraAbstandEinfuegen" = NULL ; if ( :"I_Format" = 'HTML' ) then -- Momentan wird nur HTML beruecksichtigt "V_LangText" = :"V_LangTextHTML"; -- bis zum 17.01.2012 war dies die WHILE Bedingung: or :"V_Position" is not null <--- ist sehr bloed da es nie NULL ist -- while(:"V_CursorEmpty" = 0 and ( :"V_PositionsArt" < 100 or :"V_Position" is not null ) and :"V_Position" >= :"V_StrukturPos" ) -- Bis auf Art = 400 sind alle Arten zwischen 300 und 9.999 nur in Ebene 0 erlaubt deshalb auch nach unten durchreichen wenn vor der 9.999 evtl. noch was anders gebraucht wird das hier anpassen. -- Evtl. die Summenpositionen in der SP Funktion NeuNummerieren auch ans Ende sortieren lassen -- sollte doch machbar sein evtl. ein kuenstliches Feld sortindex von der PositionsArt ableiten mit vorrang vor allem while (:"V_CursorEmpty" = 0 -- Es gibt noch Strulturpositionen = 0 wenn =1 keine mehr vorhanden and (( :"V_PositionsArt" < 100 and :"V_Position" >= :"V_StrukturPos" ) -- Die Strukturposition vorrangig in das Dokument einreihen. or :"V_PositionsArt" between 300 and 9999 -- Summenpositionen gehoeren ans Ende und dorthin werden sie auch durchgereicht. or :"V_PositionsArt" = 104 -- PosArt 104 = Strukturposition hier einfuegen ( also ganz expliziet gewuenscht vom Benutzer) or :"V_PositionsArt" = 102 )) -- 102 Horizontale Linie macht am Anfang der Seite keinen Sinn also Strukturen einsortieren. do -- 102 Ist auch Problematisch bei den Endsummen vor die man diese Linie setzen kann dann gibt es evtl. Fehler also unbedingt drinn lassen !!! begin -- Immer wenn eine Struktur einsortiert werden muss. Hat Vorrang vor Positionen -- !!!ACHTUNG !!! START -- Bereich der nach unten kopiert werden muss wenn etwas geaendert wird. "ArtikelBlobText" = NULL; "RAuftrDokStruktur_ID" = :"V_StrukturID"; "RAuftragsDokumentePositionen_ID" = NULL; "ArtikelText" = "V_Struktur_ArtikelText"; "PositionsArt" = 99; -- 99 = Strukturtext "HintergrundFarbe" = 'FFFFFF'; "ZeilenNr" = "ZeilenNr" + 1; "PositionsNr" = -:"V_Position"; if ( "I_PositionsString" is null ) then "StrukturText" = :"V_Position" ; else "StrukturText" = :"I_PositionsString" || '.' || :"V_Position" ; -- Neues Schema fuer die Positonsstruktur (3xIn diser SP vorhanden muss immer genau gleich sein )mit "PosText1" und "PosText2" zusammenbauen "V_TempHelpInt" = position( '.' , :"StrukturText" ); if ( :"V_TempHelpInt" = 0 ) then begin "PosText1" = :"StrukturText"; end else begin "PosText1" = left( :"StrukturText" , "V_TempHelpInt"-1 ); "PosText2" = substring( :"StrukturText" from "V_TempHelpInt" ); end if ( :"V_AuftrDokumentArt" = 800 or :"V_Struktur_FettDrucken" is not distinct from 'Y' ) then -- Bei Mahnungen den Strukturtext Fett drucken "CZeileFett" = 'Y'; else "CgesPreisFett" = 'Y'; -- Wenn Preis der Struktur dann mindestens dieser fett. if ( :"V_AuftrDokStruktur_SummeDrucken" = 'Y' ) then select "Format_Zahl" from "Formatiere_Zahl"( :"V_Struktur_Summe" , NULL , NULL , NULL ) into :"G-Preis"; "Pos_GPreis_StruktPreis" = :"V_Struktur_Summe"; "ExtraAbstandEinfuegen" = 0; suspend; "V_LastPositionsArt" = :"PositionsArt"; if ( :"I_NurDieseEbene" != 'Y' ) then begin "V_OldStruktur_PreiseAusbl" = RDB$GET_CONTEXT('USER_TRANSACTION', '#V_Struktur_PreiseAusbl#' ); RDB$SET_CONTEXT('USER_TRANSACTION', '#V_Struktur_PreiseAusbl#' , :"V_Struktur_PreiseAusbl" ); for select "PositionsArt","StrukturText","PositionsNr","PositionsStringFormatiert","PosText1","PosText2","RAuftrDokStruktur_ID","RAuftragsDokumentePositionen_ID","VMenge","NMenge","MengeGeliefert","MengeRueckstand","ArtikelText","ArtikelBlobText","KurztextAnzAbsaetze","Artikelnummer","EAN_Code","E-Preis","G-Preis","PosRabatt","Preiseinheit","MwSt_Satz","TexgenCommand","HintergrundFarbe","Warnings","CZeileFett","CZeileItalic","CgesPreisFett","CgesPreisUnterstreichen","CgesPreisDoppeltUnterstreichen","ZeilenNr","RowType","ExtraAbstandEinfuegen","Pos_GPreis_StruktPreis" from "AuftragsDokumente_Drucken_old" ( :"I_AuftrDokumentID" , :"I_DruckKonfigID" , :"V_StrukturID" , :"StrukturText" , :"I_NurDieseEbene" , :"I_NettoPreise" , :"I_MwSt_Kurzform", :"I_Format" , :"I_Format_PosText" , :"I_Format_G-Preis" , :"I_Format_E-Preis" , :"I_Format_Menge" , :"I_Warnings" , :"I_Commands" , :"I_Int_Help" , :"I_BigInt_Help" , :"I_Varchar_Help" , :"ZeilenNr" ) into "PositionsArt","StrukturText","PositionsNr","PositionsStringFormatiert","PosText1","PosText2","RAuftrDokStruktur_ID","RAuftragsDokumentePositionen_ID","VMenge","NMenge","MengeGeliefert","MengeRueckstand","ArtikelText","ArtikelBlobText","KurztextAnzAbsaetze","Artikelnummer","EAN_Code","E-Preis","G-Preis","PosRabatt","Preiseinheit","MwSt_Satz","TexgenCommand","HintergrundFarbe","Warnings","CZeileFett","CZeileItalic","CgesPreisFett","CgesPreisUnterstreichen","CgesPreisDoppeltUnterstreichen","ZeilenNr","RowType","ExtraAbstandEinfuegen","Pos_GPreis_StruktPreis" do suspend; "V_LastPositionsArt" = :"PositionsArt"; RDB$SET_CONTEXT('USER_TRANSACTION', '#V_Struktur_PreiseAusbl#' , "V_OldStruktur_PreiseAusbl" ); end "V_Position" = :"V_Position" +1; fetch "Struktur" into :"V_StrukturID" , :"V_StrukturPos" , :"V_Struktur_ArtikelText" , :"V_Struktur_Summe" , :"V_AuftrDokStruktur_SummeDrucken" , :"V_Struktur_FettDrucken" , :"V_Struktur_PreiseAusbl" , :"V_Struktur_InAuflistung"; if ( row_count = 0 ) then "V_CursorEmpty" = 1; -- Alle Ausgabeparameter zuruecksetzen "PosText1" = null ; "PosText2" = NULL ;"PositionsArt" =NULL ; "StrukturText" = :"I_PositionsString"; "PositionsNr" = NULL ; "RAuftrDokStruktur_ID" = NULL; "RAuftragsDokumentePositionen_ID" = NULL;"VMenge" = NULL;"NMenge" = NULL; "MengeGeliefert" = NULL;"MengeRueckstand" = NULL;"ArtikelBlobText" = NULL;"ArtikelText" = NULL ; "KurztextAnzAbsaetze" = NULL ;"Artikelnummer" = NULL;"EAN_Code" = NULL;"E-Preis" = NULL;"G-Preis" = NULL;"Preiseinheit" = NULL;"MwSt_Satz" = NULL;"TexgenCommand" = NULL; "CZeileFett" = NULL ; "CZeileItalic" = NULL ; "CgesPreisFett" = NULL ; "CgesPreisUnterstreichen" = NULL ; "CgesPreisDoppeltUnterstreichen" = NULL ; "RowType" = 0 ; "PosRabatt" = NULL; "ExtraAbstandEinfuegen" = NULL ;"Pos_GPreis_StruktPreis" = NULL; end select "Format_Zahl" from "Formatiere_Zahl"( :"V_PosRabatt" , NULL , NULL , NULL ) into :"PosRabatt"; "PosRabatt" = :"PosRabatt" ||'%'; -- !!!ACHTUNG !!! ENDE -- Bereich der nach unten kopiert werden muss wenn etwas geaendert wird. -- if ( ( :"V_LastPositionID" = :"V_AuftragsDokumentePositionenID" or :"V_PositionsArt" > 300 ) and RDB$GET_CONTEXT('USER_TRANSACTION', 'CV_KeinSeitenumbruchBisBruttoSum' ) = 0 ) then if ( ( rdb$get_context( 'USER_TRANSACTION', 'CV_LastPositionID' ) = :"V_AuftragsDokumentePositionenID" or :"V_PositionsArt" > 300 ) and RDB$GET_CONTEXT('USER_TRANSACTION', 'CV_KeinSeitenumbruchBisBruttoSum' ) = 0 ) then begin "V_TempHelpInt" = "RowType"; "RowType" = 7; RDB$SET_CONTEXT('USER_TRANSACTION', 'CV_KeinSeitenumbruchBisBruttoSum' , 1 ); "ArtikelText" = 'summeges'; -- Jeder zusammenhaengende Bereich braucht sein extra Label einmal mit 7 oeffnen und einmal mit 8 und dem selben Labelnamen schliessen suspend; "V_LastPositionsArt" = :"PositionsArt"; "RowType" = "V_TempHelpInt"; end -- So jetzt darf die Position auch gesendet werden. -- "StrukturText" = :"I_PositionsString" || :"V_Position" ; Geaendert am 06.04.2010 wird getrennt uebergeben ! PositionsText = Struktur "RAuftrDokStruktur_ID" = NULL; "RAuftragsDokumentePositionen_ID" = :"V_AuftragsDokumentePositionenID"; "ArtikelText" = NULL; if ( :"V_LangText" is not null ) then -- es ist ein Langtext verfuegbar begin -- Hier schauen ob der Blob in den normalen ArtikelText ( Varchar(8191)) passt und darin senden. Ansonsten Blob nehmen. if ( char_length( :"V_LangText" )+coalesce( char_length( :"V_EigenschaftenText" ),0) < 8100 ) then -- 8100 - 512 fuer die evtl. vorhandenen ArtikelEigenschaften "ArtikelText" = :"V_LangText" || coalesce( ascii_char(29)||:"V_EigenschaftenText" , ''); else "ArtikelBlobText" = :"V_LangText"|| coalesce( ascii_char(29)||:"V_EigenschaftenText" , ''); end else begin if ( char_length( :"V_Positionen_ArtikelText" )+coalesce( char_length( :"V_EigenschaftenText" ),0) < 8100 ) then -- 8100 - 512 fuer die evtl. vorhandenen ArtikelEigenschaften "ArtikelText" = :"V_Positionen_ArtikelText" || coalesce( ascii_char(29)||:"V_EigenschaftenText" , ''); else "ArtikelBlobText" = :"V_Positionen_ArtikelText" || coalesce( ascii_char(29)||:"V_EigenschaftenText" , ''); end if ( :"ArtikelText" is null and :"ArtikelBlobText" is null ) then -- besser bei allen machen and :"V_PositionsArt" < 100 ) then "ArtikelText" = ' '; -- Kein Leertext sondern mindestens ein Leerzeichen, ansonsten wird die Position ganz verschluckt und nicht mehr angezeigt if ( :"V_PosG-Preis" is not null ) then begin "Pos_GPreis_StruktPreis" = :"V_PosG-Preis"; "G-Preis" = cast( :"V_PosG-Preis" as numeric(18,2)); select "Format_Zahl" from "Formatiere_Zahl"( :"G-Preis" , NULL , NULL , NULL ) into :"G-Preis"; end if ( :"V_MengeDokument" is not null ) then begin if ( :"V_MengeAnzNachkommastellen" = 0 ) then "VMenge" = ( select "Format_Zahl" from "Formatiere_Zahl"( round( :"V_MengeDokument" , 0 ) , NULL , NULL , NULL )); else if ( :"V_MengeAnzNachkommastellen" = 1 ) then "VMenge" = ( select "Format_Zahl" from "Formatiere_Zahl"( round( :"V_MengeDokument" , 1 ) , NULL , NULL , NULL )); else if ( :"V_MengeAnzNachkommastellen" = 2 ) then "VMenge" = ( select "Format_Zahl" from "Formatiere_Zahl"( round( :"V_MengeDokument" , 2 ) , NULL , NULL , NULL )); else "VMenge" = ( select "Format_Zahl" from "Formatiere_Zahl"( :"V_MengeDokument" , NULL , NULL , NULL )); "V_TempHelpInt" = position( ',' , :"VMenge" ); if ( :"V_TempHelpInt" > 0 ) then begin "NMenge" = trim( trailing '0' from substring( :"VMenge" from :"V_TempHelpInt" )); -- Evtl. das Trim rausnehmen und die menge immer gleich anzeigen und mit nullen auffuellen -- mal sehen -- "NMenge" = substring( :"VMenge" from :"V_TempHelpInt" ); -- Version ohne Trim also nullen am ende stehen lassen. if ( :"NMenge" = ',' ) then "NMenge" = ''; "VMenge" = left( :"VMenge" , :"V_TempHelpInt" -1 ); end else "NMenge" = ''; "Preiseinheit" = :"V_PreisEinheit"; -- Preiseinheit nur ausgeben wenn es auch eine menge gibt end if ( :"V_PosG-Preis" is not null and :"V_MengeDokument" is not null ) then begin if ( :"V_MengeDokument" != 0 ) then begin if ( :"V_PosRabatt" is null ) then -- E-Preis Rabatt nicht vorhanden "E-Preis" = cast( :"V_PosG-Preis" / :"V_MengeDokument" as numeric(18,2)); else -- E-Preis ohne Rabatt ausweisen evtl. waehlbar ob e-preis mit oder ohne rabatt "E-Preis" = cast( :"V_PosG-PreisOhneRabatt" / :"V_MengeDokument" as numeric(18,2)); select "Format_Zahl" from "Formatiere_Zahl"( :"E-Preis" , NULL , NULL , NULL ) into :"E-Preis"; end else begin -- Wenn Menge = NULL geht er hier drueber und zeigt den Preis wie es sein soll wenn Menge = 0 dann auch Preis nicht anzeigen "G-Preis" = NULL; -- Muss hier stehen und nicht aussen rum, sonst sind auch bei berechneten Feldern die Summenwerte = NULL ges.summe etc. geht natuerlich nicht "Pos_GPreis_StruktPreis" = NULL; end end "PositionsArt" = :"V_PositionsArt"; if ( "V_PositionsArt" > 99 -- Alle Positionsarten > 99 also ab 100 bekommen keine Positionsnummern or :"V_Option" in ( 1 ) ) then -- Alle Positionen mit der Option 1 = Versteckt bekommen auch keine Positionsnr. "StrukturText" = NULL; else "PositionsNr" = :"V_Position"; "KurztextAnzAbsaetze" = "V_Kurztext"; "HintergrundFarbe" = 'FFFFFF'; "RAuftrDokStruktur_ID" = :"I_Eltern_ID"; -- Die richtige StrukturID setzen. "ZeilenNr" = "ZeilenNr" + 1; if ( RDB$GET_CONTEXT('USER_TRANSACTION', 'CV_KeinSeitenumbruchBisBruttoSum' ) = 1 ) then "CKeinUmbruchDanach" = 'Y'; if ( :"V_PositionsArt" = 300 ) then begin "V_CountMwSt_Saetze" = :"V_CountMwSt_Saetze" -1; if ( :"V_CountMwSt_Saetze" = 0 ) then -- Unterstreichung nach MwSt ausweisung einfuegen evtl. in stamdaten schauen ob gewuenscht "CgesPreisUnterstreichen" = 'Y'; end if ( ( :"V_PositionsArt" >= 300 and :"V_PositionsArt" < 100000 ) or :"V_PositionsArt" = 111 ) then begin "CgesPreisFett" = 'Y'; "RowType" = 0; -- RowType 3 geht nur bei Einzeiligen Texten aber der Benutzer kann hier den Text auch aendern deswegen von RowType=3 auf 0 gegangen. end if ( :"V_PositionsArt" = 410 ) then "CgesPreisDoppeltUnterstreichen" = 'Y'; -- ges. Prei sdoppelt unterstreichen if ( :"V_PositionsArt" = 101 ) then "RowType" = 4; -- Leere Zeile if ( :"V_PositionsArt" = 102 ) then "RowType" = 5; -- Horizontale Linie if ( :"V_PositionsArt" = 103 ) then "RowType" = 6; -- Seitenumbruch -- MwSt Kurzzeichen setzen -- if ( :"RowType" < 99 or :"RowType" in( 300, 401 ) ) then -- kann eigentlich nur ein Fehler gewesen sein !!!!!!!! if ( :"V_PositionsArt" < 99 or :"V_PositionsArt" in( 300, 401 ) ) then "MwSt_Satz" = :"V_MwSt_KurzZeichen"; if ( :"V_AuftragPositionVersandArtID" is not NULL ) then begin -- Jetzt noch ein Kuerzel fuer die Versandart anzeigen z.B. D fuer DPD wird einfach an "MwSt_Satz" angehaengt evtl. spaeter bei der Menge mit ausgeben !! "V_AuftrPosiVersand_KurzZeichen" = NULL; "V_AuftrPosiVersand_KurzZeichen" = ( select "AufDokVerArt_StdKuerzel" from "AuftragsDokumentVersandArt" A where A."AuftrDokumVersandArt_ID" = :"V_AuftragPositionVersandArtID" ); if ( :"V_AuftrPosiVersand_KurzZeichen" is not null ) then begin if ( :"MwSt_Satz" is not null and :"MwSt_Satz" != '' ) then "MwSt_Satz" = "MwSt_Satz" || ','||:"V_AuftrPosiVersand_KurzZeichen"; else "MwSt_Satz" = :"V_AuftrPosiVersand_KurzZeichen"; end end -- Neues Schema fuer die Positonsstruktur (3xIn diser SP vorhanden muss immer genau gleich sein )mit "PosText1" und "PosText2" zusammenbauen if ( :"StrukturText" = '' or :"StrukturText" is null ) then "PosText1" = :"PositionsNr"; else begin "V_TempHelpInt" = position( '.' , :"StrukturText" ); if ( :"V_TempHelpInt" = 0 ) then begin "PosText1" = :"StrukturText"; if ( :"PositionsNr" > 0 ) then "PosText2" = '.'||:"PositionsNr"; end else begin "PosText1" = left( :"StrukturText" , "V_TempHelpInt" -1); "PosText2" = substring( :"StrukturText" from "V_TempHelpInt" ) ||'.'|| coalesce( :"PositionsNr" , '' ); end end if ( :"V_Option" = 2 ) then -- Wenn die Position die Option (U)nberechnet gesetzt hat begin if ( ( rdb$get_context( 'USER_TRANSACTION', '#Unberechnet_PosZVorPos#' )) is not null ) then "PosText1" = rdb$get_context( 'USER_TRANSACTION', '#Unberechnet_PosZVorPos#' ) || :"PosText1"; if ( "G-Preis" is not null and char_length( "G-Preis" ) > 0 ) then "G-Preis" = '('||"G-Preis"||')'; -- Alternative unberechnetet Preise in Klammern setzen end if ( :"V_PositionsArt" = 2 and :"P_MarkChangedArticle" > 0 ) then -- Artikel die von ArtikelText in ArtikelTextGeaendert gesetzt wurden. "Artikelnummer" = '*' || "V_Artikelnummer"; else "Artikelnummer" = "V_Artikelnummer"; if ( :"V_Option" is null or not(:"P_HiddenHide" > 0 and :"V_Option" = 1 )) then -- Wenn Commando HidenHide Versteckte Zeilen ausblenden begin -- und eine versteckte Zeile da ist dise kpl. ueberspringen if ( :"RowType" != 6 or ( :"RowType" =6 and RDB$GET_CONTEXT('USER_TRANSACTION', 'CV_KeinSeitenumbruchBisBruttoSum' ) = 0 )) then begin if ( :"V_PositionsArt" in ( 1,2,3 ) ) then begin "ExtraAbstandEinfuegen" = 0; -- 0 = 1ex Abstand einfuegen if ( RDB$GET_CONTEXT('USER_TRANSACTION', '#V_Struktur_PreiseAusbl#' ) = 'Y' ) then begin -- Die Preise der Positionen in dieser Struktur sollen ausgeblendet werden "E-Preis" = NULL; "G-Preis" = NULL; end end if ( 1 = 2 and :"V_PositionsArt" in ( 1,2,3 ) ) then begin exception "Fatal_Error"'Zusammenhaengender Bereich1'; if ( :"ArtikelText" is null ) then begin "RowType" = 7; "ArtikelText" = 'pos'||:"RAuftragsDokumentePositionen_ID"; -- Jeder zusammenhaengende Bereich braucht sein extra Label einmal mit 7 oeffnen und einmal mit 8 und dem selben Labelnamen schliessen suspend; "ArtikelText" = NULL; "RowType" = 0; suspend; -- DokumentPosition zurueckgeben "RowType" = 8; "ArtikelText" = 'pos'||:"RAuftragsDokumentePositionen_ID"; suspend; end else begin exception "Fatal_Error"'Zusammenhaengender Bereich2'; "V_TempVarCharMax" = "ArtikelText"; "RowType" = 7; "ArtikelText" = 'pos'||:"RAuftragsDokumentePositionen_ID"; -- Jeder zusammenhaengende Bereich braucht sein extra Label einmal mit 7 oeffnen und einmal mit 8 und dem selben Labelnamen schliessen suspend; "RowType" = 0; "ArtikelText" = "V_TempVarCharMax"; suspend; -- DokumentPosition zurueckgeben "RowType" = 8; "ArtikelText" = 'pos'||:"RAuftragsDokumentePositionen_ID"; suspend; end "RowType" = 0; end else suspend; -- DokumentPosition zurueckgeben "V_LastPositionsArt" = :"PositionsArt"; end end if ( :"V_PositionsArt" = 410 ) then begin "PosText1" = null ; "PosText2" = NULL ;"PositionsArt" =NULL ; "StrukturText" = :"I_PositionsString"; "PositionsNr" = NULL ; "RAuftrDokStruktur_ID" = NULL; "RAuftragsDokumentePositionen_ID" = NULL;"VMenge" = NULL;"NMenge" = NULL; "MengeGeliefert" = NULL;"MengeRueckstand" = NULL;"ArtikelBlobText" = NULL;"ArtikelText" = NULL ; "KurztextAnzAbsaetze" = NULL ;"Artikelnummer" = NULL;"EAN_Code" = NULL;"E-Preis" = NULL;"G-Preis" = NULL;"Preiseinheit" = NULL;"MwSt_Satz" = NULL;"TexgenCommand" = NULL; "CZeileFett" = NULL ; "CZeileItalic" = NULL ; "CgesPreisFett" = NULL ; "CgesPreisUnterstreichen" = NULL ; "CgesPreisDoppeltUnterstreichen" = NULL ; "RowType" = 0 ; "PosRabatt" = NULL; "ExtraAbstandEinfuegen" = NULL ;"Pos_GPreis_StruktPreis" = NULL; RDB$SET_CONTEXT('USER_TRANSACTION', 'CV_KeinSeitenumbruchBisBruttoSum' , 0 ); "RowType" = 8; "ArtikelText" = 'summeges'; -- Jeder zusammenhaengende Bereich braucht sein extra Label einmal mit 7 oeffnen und einmal mit 8 und dem selben Labelnamen schliessen suspend; "V_LastPositionsArt" = :"PositionsArt"; end if ( :"PositionsArt" < 100 -- Alle Arten unter 100 bekommen eine Positionsnr. and ( "V_Option" not in ( 1 ) or "V_Option" is null )) then -- Option 1 Verteckt bekommt keine Positionsnr "V_Position" = :"V_Position" +1; end /* Schauen ob noch was in der Struktur uebrig ist und es auch noch anhaengen. Kommt vor wenn zu wenig oder auch keine DokumentPositionen vorhanden waren ;-) */ -- Alle Ausgabeparameter zuruecksetzen "PosText1" = null ; "PosText2" = NULL ;"PositionsArt" =NULL ; "StrukturText" = :"I_PositionsString"; "PositionsNr" = NULL ; "RAuftrDokStruktur_ID" = NULL; "RAuftragsDokumentePositionen_ID" = NULL;"VMenge" = NULL;"NMenge" = NULL; "MengeGeliefert" = NULL;"MengeRueckstand" = NULL;"ArtikelBlobText" = NULL;"ArtikelText" = NULL ; "KurztextAnzAbsaetze" = NULL ;"Artikelnummer" = NULL;"EAN_Code" = NULL;"E-Preis" = NULL;"G-Preis" = NULL;"Preiseinheit" = NULL;"MwSt_Satz" = NULL;"TexgenCommand" = NULL; "CZeileFett" = NULL ; "CZeileItalic" = NULL ; "CgesPreisFett" = NULL ; "CgesPreisUnterstreichen" = NULL ; "CgesPreisDoppeltUnterstreichen" = NULL ; "RowType" = 0 ; "PosRabatt" = NULL; "ExtraAbstandEinfuegen" = NULL ;"Pos_GPreis_StruktPreis" = NULL; -- ################################################################################################################################################## -- ################################################################################################################################################## -- ################################################################################################################################################## -- !!! ACHTUNG !!! START Kopie von oben. Bei aenderungen diese Bloecke immer syncronisieren while( :"V_CursorEmpty" = 0 ) do -- <--- ACHTUNG das WHIKLE hier muss natuerlich nur noch so aussehen sonst nichts. Es sind nur noch Strukturebenen da. begin -- Immer wenn eine Struktur einsortiert werden muss. Hat Vorrang vor Positionen "ArtikelBlobText" = NULL; "RAuftrDokStruktur_ID" = :"V_StrukturID"; "RAuftragsDokumentePositionen_ID" = NULL; "ArtikelText" = "V_Struktur_ArtikelText"; "PositionsArt" = 99; -- 99 = Strukturtext "HintergrundFarbe" = 'FFFFFF'; "ZeilenNr" = "ZeilenNr" + 1; "PositionsNr" = -:"V_Position"; if ( "I_PositionsString" is null ) then "StrukturText" = :"V_Position" ; else "StrukturText" = :"I_PositionsString" || '.' || :"V_Position" ; -- Neues Schema fuer die Positonsstruktur (3xIn diser SP vorhanden muss immer genau gleich sein )mit "PosText1" und "PosText2" zusammenbauen "V_TempHelpInt" = position( '.' , :"StrukturText" ); if ( :"V_TempHelpInt" = 0 ) then begin "PosText1" = :"StrukturText"; end else begin "PosText1" = left( :"StrukturText" , "V_TempHelpInt"-1 ); "PosText2" = substring( :"StrukturText" from "V_TempHelpInt" ); end if ( :"V_AuftrDokumentArt" = 800 or :"V_Struktur_FettDrucken" is not distinct from 'Y' ) then -- Bei Mahnungen den Strukturtext Fett drucken "CZeileFett" = 'Y'; else "CgesPreisFett" = 'Y'; -- Wenn Preis der Struktur dann mindestens dieser fett. if ( :"V_AuftrDokStruktur_SummeDrucken" = 'Y' ) then select "Format_Zahl" from "Formatiere_Zahl"( :"V_Struktur_Summe" , NULL , NULL , NULL ) into :"G-Preis"; "Pos_GPreis_StruktPreis" = :"V_Struktur_Summe"; "ExtraAbstandEinfuegen" = 0; suspend; "V_LastPositionsArt" = :"PositionsArt"; if ( :"I_NurDieseEbene" != 'Y' ) then begin "V_OldStruktur_PreiseAusbl" = RDB$GET_CONTEXT('USER_TRANSACTION', '#V_Struktur_PreiseAusbl#' ); RDB$SET_CONTEXT('USER_TRANSACTION', '#V_Struktur_PreiseAusbl#' , :"V_Struktur_PreiseAusbl" ); for select "PositionsArt","StrukturText","PositionsNr","PositionsStringFormatiert","PosText1","PosText2","RAuftrDokStruktur_ID","RAuftragsDokumentePositionen_ID","VMenge","NMenge","MengeGeliefert","MengeRueckstand","ArtikelText","ArtikelBlobText","KurztextAnzAbsaetze","Artikelnummer","EAN_Code","E-Preis","G-Preis","PosRabatt","Preiseinheit","MwSt_Satz","TexgenCommand","HintergrundFarbe","Warnings","CZeileFett","CZeileItalic","CgesPreisFett","CgesPreisUnterstreichen","CgesPreisDoppeltUnterstreichen","ZeilenNr","RowType","ExtraAbstandEinfuegen","Pos_GPreis_StruktPreis" from "AuftragsDokumente_Drucken_old" ( :"I_AuftrDokumentID" , :"I_DruckKonfigID" , :"V_StrukturID" , :"StrukturText" , :"I_NurDieseEbene" , :"I_NettoPreise" , :"I_MwSt_Kurzform", :"I_Format" , :"I_Format_PosText" , :"I_Format_G-Preis" , :"I_Format_E-Preis" , :"I_Format_Menge" , :"I_Warnings" , :"I_Commands" , :"I_Int_Help" , :"I_BigInt_Help" , :"I_Varchar_Help" , :"ZeilenNr" ) into "PositionsArt","StrukturText","PositionsNr","PositionsStringFormatiert","PosText1","PosText2","RAuftrDokStruktur_ID","RAuftragsDokumentePositionen_ID","VMenge","NMenge","MengeGeliefert","MengeRueckstand","ArtikelText","ArtikelBlobText","KurztextAnzAbsaetze","Artikelnummer","EAN_Code","E-Preis","G-Preis","PosRabatt","Preiseinheit","MwSt_Satz","TexgenCommand","HintergrundFarbe","Warnings","CZeileFett","CZeileItalic","CgesPreisFett","CgesPreisUnterstreichen","CgesPreisDoppeltUnterstreichen","ZeilenNr","RowType","ExtraAbstandEinfuegen","Pos_GPreis_StruktPreis" do suspend; "V_LastPositionsArt" = :"PositionsArt"; RDB$SET_CONTEXT('USER_TRANSACTION', '#V_Struktur_PreiseAusbl#' , "V_OldStruktur_PreiseAusbl" ); end "V_Position" = :"V_Position" +1; fetch "Struktur" into :"V_StrukturID" , :"V_StrukturPos" , :"V_Struktur_ArtikelText" , :"V_Struktur_Summe" , :"V_AuftrDokStruktur_SummeDrucken" , :"V_Struktur_FettDrucken" , :"V_Struktur_PreiseAusbl" , :"V_Struktur_InAuflistung"; if ( row_count = 0 ) then "V_CursorEmpty" = 1; else RDB$SET_CONTEXT('USER_TRANSACTION', '#V_Struktur_PreiseAusbl#' , :"V_Struktur_PreiseAusbl" ); -- Alle Ausgabeparameter zuruecksetzen "PosText1" = null ; "PosText2" = NULL ;"PositionsArt" =NULL ; "StrukturText" = :"I_PositionsString"; "PositionsNr" = NULL ; "RAuftrDokStruktur_ID" = NULL; "RAuftragsDokumentePositionen_ID" = NULL;"VMenge" = NULL;"NMenge" = NULL; "MengeGeliefert" = NULL;"MengeRueckstand" = NULL;"ArtikelBlobText" = NULL;"ArtikelText" = NULL ; "KurztextAnzAbsaetze" = NULL ;"Artikelnummer" = NULL;"EAN_Code" = NULL;"E-Preis" = NULL;"G-Preis" = NULL;"Preiseinheit" = NULL;"MwSt_Satz" = NULL;"TexgenCommand" = NULL; "CZeileFett" = NULL ; "CZeileItalic" = NULL ; "CgesPreisFett" = NULL ; "CgesPreisUnterstreichen" = NULL ; "CgesPreisDoppeltUnterstreichen" = NULL ; "RowType" = 0 ; "PosRabatt" = NULL; "ExtraAbstandEinfuegen" = NULL ;"Pos_GPreis_StruktPreis" = NULL; end -- !!! ACHTUNG !!! ENDE Kopie von oben select "Format_Zahl" from "Formatiere_Zahl"( :"V_PosRabatt" , NULL , NULL , NULL ) into :"PosRabatt"; "PosRabatt" = :"PosRabatt" ||'%'; if ( :"I_DruckKonfigID" is null or "I_Eltern_ID" is not null ) then -- Wenn nicht gedruckt wird braucht man keine Legende und Kram und nur auf der ersten Ebene exit; -- eine Legende Drucken - asnosnten raus hier "ArtikelText" = ''; "Error" = ' 1 ) then -- Nur MwSt-Saetze in legende einbauen wenn es mehr als einen gibt ! begin if ( (select count( distinct "MwStGr_Staaten_ID") from "AuftrDokument_MwSt_Liste"( :"I_AuftrDokumentID" , 'N' ) A join "MwSt_Saetze" B ON B."MwSt_Saetze_ID" = A."MwStSaetze_ID" join "MwSt_Gruppen" C ON C."MwStGruppen_ID" = B."MwSt_Saetze_Gruppen_ID" ) < 2 ) then begin -- Nur ein Staat unter den MwSt Saetzen. for select "KurzZeichen" ,"Satz" , "MwStGr_FestDokumentSumme" , "MwSt_Gr_Name", "MwStGr_Staaten_ID" from "AuftrDokument_MwSt_Liste"( :"I_AuftrDokumentID" , 'N' ) A join "MwSt_Saetze" B ON B."MwSt_Saetze_ID" = A."MwStSaetze_ID" join "MwSt_Gruppen" C ON C."MwStGruppen_ID" = B."MwSt_Saetze_Gruppen_ID" into :"V_MwSt_KurzZeichen" , :"V_MwSt-Satz" , :"V_PosG-Preis" , :"V_MwStGruppenName" , :"V_Staat" do begin if ( :"V_TempHelpInt" = 0 ) then "V_TempHelpInt" = 1; else "ArtikelText" = "ArtikelText" || :"Error" || 'br="0">,'; if ( :"V_PosG-Preis" is null ) then -- Dann ist es Prozentual und nicht mit Betrag 0 ueberschrieben "ArtikelText" = "ArtikelText" || :"Error" || 'br="0" subsuperscripttype="super">' || :"V_MwSt_KurzZeichen" || '' || :"Error" || iif(:"V_MwSt_KurzZeichen" = '' , 'br="0">' , 'br="0">: ' )|| :"V_MwSt-Satz" || '%'; else "ArtikelText" = "ArtikelText" || :"Error" || 'br="0" subsuperscripttype="super">' || :"V_MwSt_KurzZeichen" || '' || :"Error" || iif(:"V_MwSt_KurzZeichen" = '' , 'br="0">' , 'br="0">: ' )|| :"V_MwStGruppenName" || ''; end end else begin -- Mehr als ein Staat unter den MwSt Saetzen also auch den Staatsnamen des MwSt Satzes zeigen for select "KurzZeichen" ,"Satz" , "MwStGr_FestDokumentSumme" , "MwSt_Gr_Name", "MwStGr_Staaten_ID" from "AuftrDokument_MwSt_Liste"( :"I_AuftrDokumentID" , 'N' ) A join "MwSt_Saetze" B ON B."MwSt_Saetze_ID" = A."MwStSaetze_ID" join "MwSt_Gruppen" C ON C."MwStGruppen_ID" = B."MwSt_Saetze_Gruppen_ID" into :"V_MwSt_KurzZeichen" , :"V_MwSt-Satz" , :"V_PosG-Preis" , :"V_MwStGruppenName" , :"V_Staat" do begin if ( :"V_TempHelpInt" = 0 ) then "V_TempHelpInt" = 1; else "ArtikelText" = "ArtikelText" || :"Error" || 'br="0">, '; -- Hochzahl Doppelpunkt Leerzeichen Prozentsatz Komma Leerzeichen if ( :"V_PosG-Preis" is null ) then -- Dann ist es Prozentual und nicht mit Betrag 0 ueberschrieben "ArtikelText" = "ArtikelText" || :"Error" || 'br="0" subsuperscripttype="super">' || :"V_MwSt_KurzZeichen" || '' || :"Error" || iif(:"V_MwSt_KurzZeichen" = '' , 'br="0">' , 'br="0">: ' )|| :"V_Staat" ||'-'||:"V_MwSt-Satz" || '%'; else "ArtikelText" = "ArtikelText" || :"Error" || 'br="0" subsuperscripttype="super">' || :"V_MwSt_KurzZeichen" || '' || :"Error" || iif(:"V_MwSt_KurzZeichen" = '' , 'br="0">' , 'br="0">: ' )|| :"V_Staat" ||'-'||:"V_MwStGruppenName" || ''; end end end if ( ( select count(*) from "AuftragsDokumentePositionen" A where A."AuftrDokPosi_DokumentID" = :"I_AuftrDokumentID" and A."AuftrDokPosi_Option" = 2 ) > 0 ) then begin -- Unberechnete Position gefunden schauen ob ein A für Alternativ hinterlegt ist ! "V_MwStGruppenName" = RDB$GET_CONTEXT('USER_TRANSACTION', '#Unberechnet_PosZVorPos#' ); if ( :"V_MwStGruppenName" is not null and trim(:"V_MwStGruppenName") != '' ) then begin -- Legende um Alternativtext ergaenzen if ( :"V_TempHelpInt" = 0 ) then "V_TempHelpInt" = 1; else "ArtikelText" = "ArtikelText" || :"Error" || 'br="0">, '; "ArtikelText" = "ArtikelText" || :"Error" || 'br="0" subsuperscripttype="super">' || :"V_MwStGruppenName" || '' || :"Error" || 'br="0">:Alternativ'; end end if ( :"V_DokStdVersandArtID" is not null ) then begin -- Es muss eine Legende fuer die Versandarten ausgegeben werden "V_TempHelpInt" = 1; -- nur damit er unten auch wirklich rein geht for select distinct "AufDokVerArt_StdKuerzel" , "AufDokVerArt_StdName" from "AuftragsDokumentePositionen" A join "AuftragsDokumentVersandArt" B ON B."AuftrDokumVersandArt_ID" = A."AuftrDokPosi_VersandArt" where A."AuftrDokPosi_DokumentID" = :"I_AuftrDokumentID" and A."AuftrDokPosi_VersandArt" is not NULL and A."AuftrDokPosi_VersandArt" != 0 and A."AuftrDokPosi_VersandArt" != :"V_DokStdVersandArtID" and B."AufDokVerArt_StdKuerzel" is not null into :"V_AuftrPosiVersand_KurzZeichen" , :"V_TempVarCharMax" do begin if ( :"ArtikelText" = '' ) then begin "ArtikelText" = :"ArtikelText" || ''|| :"V_AuftrPosiVersand_KurzZeichen" ||':'|| :"V_TempVarCharMax" || ''; end else "ArtikelText" = :"ArtikelText" || ','|| :"V_AuftrPosiVersand_KurzZeichen" ||':'|| :"V_TempVarCharMax" || ''; end end if ( :"V_TempHelpInt" > 0 ) then begin "ArtikelText" = "ArtikelText" || ''; "RowType" = 3; suspend; "V_LastPositionsArt" = :"PositionsArt"; end end ^ SET TERM ; ^ DESCRIBE PARAMETER "StrukturText" PROCEDURE "AuftragsDokumente_Drucken_old" 'PositionsText=StrukturText+PositionsNr'; DESCRIBE PARAMETER "PositionsNr" PROCEDURE "AuftragsDokumente_Drucken_old" 'Nur Positionsnummer allein'; DESCRIBE PARAMETER "PositionsStringFormatiert" PROCEDURE "AuftragsDokumente_Drucken_old" 'Wird als Parameter gebraucht wenn es Strukturen gibt'; DESCRIBE PARAMETER "PosText1" PROCEDURE "AuftragsDokumente_Drucken_old" 'Erstes Feld der Positionsstruktur zm Drucken rechtsbuendig ausgerichtet'; DESCRIBE PARAMETER "PosText2" PROCEDURE "AuftragsDokumente_Drucken_old" 'Zweites Feld der Positionsstruktur zm Drucken linksbuendig ausgerichtet'; DESCRIBE PARAMETER "VMenge" PROCEDURE "AuftragsDokumente_Drucken_old" 'Vorkommaanteil'; DESCRIBE PARAMETER "NMenge" PROCEDURE "AuftragsDokumente_Drucken_old" 'Nachkommaanteil Menge mit Komma'; DESCRIBE PARAMETER "Artikelnummer" PROCEDURE "AuftragsDokumente_Drucken_old" 'Feld Artikelnr. + evtl. ein Sternchen was auf ArtikelTZextGeaendert hinweist'; DESCRIBE PARAMETER "ExtraAbstandEinfuegen" PROCEDURE "AuftragsDokumente_Drucken_old" 'DB-Null bedeutet Abstand in hoehe von kleinem "x" und bei allen anderen Werten in mm nach der Position einfuegen'; DESCRIBE PARAMETER "Pos_GPreis_StruktPreis" PROCEDURE "AuftragsDokumente_Drucken_old" 'Gibt den ein oder anderen GesPreis aus je nachdem ob es eine Position oder Struktur ist'; /* Alter (AuftrDokDruck_HelperFunction) */ SET TERM ^ ; ALTER PROCEDURE "AuftrDokDruck_HelperFunction"("Funktion" "d_str60", "I_DokumentID" INTEGER, "I_FormatString" "d_str60", "I_Pos" BIGINT, "I_Struktur" "d_str50") RETURNS("O_MaxPosNrLen" INTEGER, "O_StrukturFormatString" "d_str50", "O_LastPositionID" BIGINT) AS declare variable "StrukturText" "d_str50"; declare variable "Positionsnr" integer; declare variable "PositionsArt" integer; declare variable "PosID" bigint; begin if ( :"Funktion" = 'PositionsStringFormat' ) then begin if ( :"I_DokumentID" is null ) then exception "Fatal_Error" 'Parameter fehlt !'; "O_MaxPosNrLen" =0; "O_LastPositionID" = 0; "O_StrukturFormatString" = NULL; -- Die SP "AuftragsDokumente_DruckenNurPos" kann hier nicht verwendet werden weill wir hier den Struktur Format Strinmg berechnen ! oder geht es trotzdem ??? for select A."StrukturText" , A."PositionsNr" , A."PositionsArt" , A."RAuftragsDokumentePositionen_ID" from "AuftragsDokumente_Drucken"( :"I_DokumentID" , NULL , NULL , NULL , 'N' , 'Y' , 'Y' , NULL , NULL , NULL , NULL , NULL , 'N' , 'HelperFuntctionIsRunning', null , null , null , null) A where "PositionsNr" is not null into :"StrukturText" , :"Positionsnr" , :"PositionsArt" , :"PosID" do begin -- Hier noch den O_StrukturFormatString berechenn max. 10 ebeenn Tief dann ist es egal :P if ( :"PositionsArt" in ( 1 , 2 , 3 , 50 , 51 , 100) ) then "O_LastPositionID" = :"PosID"; if ( :"Positionsnr" > :"O_MaxPosNrLen" ) then "O_MaxPosNrLen" = :"Positionsnr"; -- Achtung hier wird noch die groesse der Zahl genommen unten noch in Anzahl Ziffern umrechnen end "O_MaxPosNrLen" = char_length ( cast( :"O_MaxPosNrLen" as varchar(20))); --Max. Anzahl stellen zurueckgeben suspend; end end ^ SET TERM ; ^ DESCRIBE PARAMETER "O_LastPositionID" PROCEDURE "AuftrDokDruck_HelperFunction" 'Die Letzte Artikelposition im Dokuemnt'; /* empty dependent procedure body */ /* Clear: AuftrDokPositionen_Funktionen for: AuftrDokument_Summen */ SET TERM ^ ; ALTER PROCEDURE "AuftrDokPositionen_Funktionen"("Funktion" VARCHAR(30), "vonAuftrDokPos_ID" TYPE OF COLUMN "AuftragsDokumentePositionen"."AuftragsDokumentePositionen_ID", "Anzahl" INTEGER, "nachAuftrDokPos_ID" TYPE OF COLUMN "AuftragsDokumentePositionen"."AuftragsDokumentePositionen_ID", "I_DokStrukturID" INTEGER, "I_DokumentID" INTEGER, "I_ParamDouble" DOUBLE PRECISION, "I_ParamVarChar" "d_str40") RETURNS(RET "d_str160", "RET_VarCHAR" "d_str60", RET_BIGINT1 BIGINT, RET_BIGINT2 BIGINT, RET_BIGINT3 BIGINT) AS BEGIN SUSPEND; END ^ /* Alter (AuftrDokument_Summen) */ ALTER PROCEDURE "AuftrDokument_Summen"("I_AuftrDokumentID" INTEGER, "I_StrukturID" INTEGER, "I_KeinStrukturPreis" D_BOOLEAN_YN, "I_AlleStrukturPreise" D_BOOLEAN_YN, "I_SummenFunktion" INTEGER) RETURNS("MwSt_Saetze_ID" INTEGER, "StrukturID" INTEGER, "GesAnzPositionen" INTEGER, "Summe" "Geld", "AnzPosAusArtikelDB" INTEGER, "ArtikelSumme" "Geld", "ArtikelSummeBruttoErloes" "Geld", "Betrag" "Geld", "MwSt_Satz" "MwSt_UmrechungsGenau", "MwSt_Summe" "Geld", "O_AuftragDokumentPositionenID" BIGINT, RET "d_str160", "NettoPosSummOhneRabatt" "Geld", "VersteckteBruttoRabattSumme" "Geld", "NettoWerksabgabePreis" "Geld", "O_AuftrDokumentID" INTEGER) AS declare variable "DokumentDatum" date; declare variable "V_GesAnzPositionen" integer = 0; declare variable "V_Summe" "Geld" = 0; declare variable "V_AnzPosAusArtikelDB" integer = 0; declare variable "V_ArtikelSumme" "Geld" = 0; declare variable "V_ArtikelSummeBruttoErloes" "Geld" = 0; declare variable "V_Betrag" "Geld" = 0; /* vorher V_Brutto */ declare variable "V_ZwSummePosStart" integer; declare variable "V_ZwSummePosEnd" integer; declare variable "V_SummenID" integer; declare variable "V_Dokument_BruttoPreise" D_BOOLEAN_YN; declare variable "V_EigentlicheMwSt" "Geld"; declare variable "V_NettoPosSummOhneRabatt" "Geld" = 0; declare variable "V_NettoPosSumOhneRabatAusMinus2" "Geld"; /* Als zwischenspeicher fuer Funktion = 4 */ declare variable "V_ArtiVk_PosGPreis_PreisDiff" "Geld"; declare variable "V_VersteckterBruttoRabatt" "Geld_genau"; declare variable "V_Klog_BruttoPreise" type of column "Kataloge"."Klog_BruttoPreise"; declare variable "V_StrukturG-Preis" "Geld"; declare variable "V_OldStrukturG-Preis" "Geld"; declare variable "V_DokStrukturID" integer; declare variable "V_StrukturPreiseFalsch" D_BOOLEAN_YN; declare variable "V_ADE_DokumentNettoSumme" "Geld"; declare variable "V_ADE_DokumentBruttoSumme" "Geld"; declare variable "V_Temp_DP" double precision; declare variable "V_NettoWerksabgabePreis" "Geld"; begin /* Wenn SummenFunkltion = 0 werden einfach alle Summen fuer die Query im Programm zurueckgegeben. = 1 Summen in den AuuftragDokumentPositionen und Tabelle "AuftragsDokumenteExt" eintragen. Wenn gesetzt wird "I_AlleStrukturPreise" auf 'Y' gesetzt und "I_KeinStrukturPreis" auf 'N' = 2 Summen ins RgAusgangsbuch uebernehmen = 4 Summen nur in der Tabelle "AuftragsDokumenteExt" eintragen. */ "O_AuftrDokumentID" = :"I_AuftrDokumentID"; begin select "AuftrDokument_Erstellt" , "AuftrDokument_BruttoPreise" from "AuftragsDokumente" where "AuftrDokument_ID" = :"I_AuftrDokumentID" into :"DokumentDatum" , :"V_Dokument_BruttoPreise" ; if ( :"I_SummenFunktion" = 1 ) then begin -- Beim Summen eintragen natuerlich immer alles machen !! "I_AlleStrukturPreise" = 'Y'; "I_KeinStrukturPreis" = 'N'; end else if ( :"I_SummenFunktion" in (2,4) ) then begin -- "I_AlleStrukturPreise" = 'N'; "I_KeinStrukturPreis" = 'Y'; if ( exists ( select * from "RgAusgangsBuch" A where A."RgAB_AuftrDokumentID" = :"I_AuftrDokumentID" ) ) then begin -- loeschen der MwSt Betraege freischaltren sonst exception rdb$set_context( 'USER_TRANSACTION' , 'Delete_RgAusgangsBuch_MwStOK' , :"I_AuftrDokumentID" ); delete from "RgAusgangsBuch_MwSt" A where A."RgABMwSt_RgAB_ID" = :"I_AuftrDokumentID"; rdb$set_context( 'USER_TRANSACTION' , 'Delete_RgAusgangsBuch_MwStOK' , NULL ); end end -- Alle Struktursummen berechnen start "V_StrukturPreiseFalsch" = 'N'; for select a."AuftrDokStruktur_ID" , "AuftrDokStruktur_Summe" from "AuftragsDokumentStruktur" A where a."AuftrDokStruktur_Dokument_ID" = :"I_AuftrDokumentID" into :"V_DokStrukturID" , :"V_OldStrukturG-Preis" do begin "StrukturID" = :"V_DokStrukturID"; for with recursive tree_rec as ( select "AuftrDokStruktur_ElternID" , "AuftrDokStruktur_ID" from "AuftragsDokumentStruktur" where "AuftrDokStruktur_ID" = :"V_DokStrukturID" union all select T."AuftrDokStruktur_ElternID", T."AuftrDokStruktur_ID" from "AuftragsDokumentStruktur" T join tree_rec R on T."AuftrDokStruktur_ElternID" = R."AuftrDokStruktur_ID" ) select sum(b."AuftrDokPosi_PosGPreis") from tree_rec S -- Die DokumentID wird nur fuer den Fall das es auch StrukturID = DB-Null machen soll was aber eigentlich eh nicht geht ! join "AuftragsDokumentePositionen" B ON b."AuftrDokPosi_DokumentID" = :"I_AuftrDokumentID" and S."AuftrDokStruktur_ID" is not distinct from B."AuftrDokPosi_DokStrukturID" where ( B."AuftrDokPosi_Art" < 99 or B."AuftrDokPosi_Art" > 100000 ) and ( B."AuftrDokPosi_Option" not in ( 1 , 2 ) or B."AuftrDokPosi_Option" is null ) and ( B."AuftrDokPosi_Menge" != 0 or B."AuftrDokPosi_Menge" is null ) into :"V_StrukturG-Preis" do begin -- Summen nur eintragen wenn gewuenscht und wenn abweichend von der momentan gespeicherten Summe ! if ( :"V_StrukturG-Preis" is distinct from :"V_OldStrukturG-Preis" ) then begin if ( :"I_SummenFunktion" = 1 ) then update "AuftragsDokumentStruktur" A set "AuftrDokStruktur_Summe" = :"V_StrukturG-Preis" where a."AuftrDokStruktur_Dokument_ID" = :"I_AuftrDokumentID" and "AuftrDokStruktur_ID" = :"V_DokStrukturID"; else "V_StrukturPreiseFalsch" = 'Y'; -- Die momentan hinterlegten Strukturpeise sind Fehlerhaft dann auch keine Zwischensummen zurueckgeben. end end end -- Alle Zwischensummen berechnen start if ( "V_StrukturPreiseFalsch" = 'Y' ) then -- Zwischensummen nur berechnen wenn die Strukturpreise keine Fehler enthalten was nicht vorkommen sollte. begin if ( :"I_SummenFunktion" in ( 1 , 2 ) ) then -- Bei diesen Funktionen darf es keine falschen Preise geben also Exception / 4 Geht hier nicht wegen den alten Dokumenten exception "Fatal_Error"'Falsche Strukturpreise gefunden !!!'; end else -- Strukturpreise waren OK begin if ( :"I_KeinStrukturPreis" = 'N' or :"I_AlleStrukturPreise" ='Y' or :"I_StrukturID" is not null ) then begin for select "AuftragsDokumentePositionen_ID" , "AuftrDokPosi_DokStrukturID" , "AuftrDokPosi_Position" , "AuftrDokPosi_Menge" from "AuftragsDokumentePositionen" A where "AuftrDokPosi_DokumentID" = :"I_AuftrDokumentID" and ( :"I_AlleStrukturPreise" = 'Y' or "AuftrDokPosi_DokStrukturID" is not distinct from :"I_StrukturID" ) and "AuftrDokPosi_Art" = 111 into :"O_AuftragDokumentPositionenID" , :"StrukturID" , :"V_ZwSummePosEnd" , :"V_SummenID" -- in "V_SummenID" die Summen mit der ID sollten nur ganze Zahlen sein do begin "V_ZwSummePosStart" = (coalesce ( ( select max( "AuftrDokPosi_Position") from "AuftragsDokumentePositionen" where "AuftrDokPosi_DokumentID" = :"I_AuftrDokumentID" and "AuftrDokPosi_DokStrukturID" is not distinct from :"StrukturID" and "AuftrDokPosi_Position" < :"V_ZwSummePosEnd" and ( "AuftrDokPosi_Art" in ( 110,111) and "AuftrDokPosi_Menge" is not distinct from :"V_SummenID" ) ) ,1 )); -- "AuftrDokPosi_PosGPreis" ist schon gerundet und kann dann ohne runden summiert werden. if ( :"I_SummenFunktion" = 1 ) then begin update "AuftragsDokumentePositionen" set "AuftrDokPosi_GPreis" = (select sum( "Pos_GPreis_StruktPreis" ) from "AuftragsDokumente_Drucken"( :"I_AuftrDokumentID" , null , :"StrukturID" , null , 'Y' , 'Y' , 'Y' , null , null , null , null , null , 'N' , 'HelperFuntctionIsRunning', null , null , null , null) b left outer join "AuftragsDokumentePositionen" C on b."RAuftragsDokumentePositionen_ID" = c."AuftragsDokumentePositionen_ID" where b."PositionsNr" is not null -- !!!! ACHTUNG !!!! Niemals nach den Positionsummern gehen immer nach den Zeilennnr. alles andere kann grossen durcheinander geben !!! -- and iif ( b."PositionsNr" < 0 , b."PositionsNr"*-1 , b."PositionsNr") between :"V_ZwSummePosStart" and :"V_ZwSummePosEnd" and c."AuftrDokPosi_Position" > 0 and c."AuftrDokPosi_Position" between :"V_ZwSummePosStart" and :"V_ZwSummePosEnd" and ( B."PositionsArt" < 100 or B."PositionsArt" > 100000 ) -- < 100 da die Strukturpreise auch rein sollen !!! and ( c."AuftrDokPosi_Option" not in ( 1 , 2 ) or c."AuftrDokPosi_Option" is null ) and ( c."AuftrDokPosi_Menge" != 0 or c."AuftrDokPosi_Menge" is null )) where "AuftragsDokumentePositionen_ID" = :"O_AuftragDokumentPositionenID" ; end else begin select sum( "Pos_GPreis_StruktPreis" ) from "AuftragsDokumente_Drucken"( :"I_AuftrDokumentID" , null , :"StrukturID" , null , 'Y' , 'Y' , 'Y' , null , null , null , null , null , 'N' , 'HelperFuntctionIsRunning', null , null , null , null) b left outer join "AuftragsDokumentePositionen" C on b."RAuftragsDokumentePositionen_ID" = c."AuftragsDokumentePositionen_ID" where b."PositionsNr" is not null and c."AuftrDokPosi_Position" > 0 and c."AuftrDokPosi_Position" between :"V_ZwSummePosStart" and :"V_ZwSummePosEnd" and ( B."PositionsArt" < 100 or B."PositionsArt" > 100000 ) -- < 100 da die Strukturpreise auch rein sollen !!! and ( c."AuftrDokPosi_Option" not in ( 1 , 2 ) or c."AuftrDokPosi_Option" is null ) and ( c."AuftrDokPosi_Menge" != 0 or c."AuftrDokPosi_Menge" is null ) into :"Summe"; suspend; end end end end -- !!! Zwischensummen berechnen ende !!! if ( :"I_SummenFunktion" = 1 ) then begin if ( not exists( select * from "AuftragsDokumentePositionen" where "AuftrDokPosi_DokumentID" = :"I_AuftrDokumentID" and "AuftrDokPosi_Art" >= 300 and "AuftrDokPosi_Art" < 100000 )) then begin -- Keine neuberechnung noetig da es keine Positionen zum eintragen gibt. -- Da er es jetzt auch in die Tabelle "AuftragsDokumenteExt" schreibt muss er hier immer weiter machen -- Aber er schaltet das Eintragen in die Positionen ab und aktualisiert nur noch die Tabelle "I_SummenFunktion" = 4; -- Von Funktion = 1 das neu berechnet ist noch vermerken da es hier ja mit Funktion = 4 weiter geht update "AuftragsDokumente" set "AuftrDokument_SummenBerechnet" = current_timestamp where "AuftrDokument_ID" = :"I_AuftrDokumentID" ; -- Zeitstempel der letzten Berechnung setzen end else update "AuftragsDokumentePositionen" A set A."AuftrDokPosi_GPreis" = 0 where "AuftrDokPosi_DokumentID" = :"I_AuftrDokumentID" --29.11.12 sollte ein Fehler sein er kann nicht sagen was von oben stehen bleibt eigentlich ganzes Dokument auf 0 and "AuftrDokPosi_DokStrukturID" is not distinct from :"nachDokStrukturID" and "AuftrDokPosi_Art" < 100000 -- 100000 Mahnpositionen hier darf auch nicht einfach was auf 0 gesetzt werden. and "AuftrDokPosi_Art" >= 300; end "O_AuftragDokumentPositionenID" = NULL; -- Die Folgenden Summen haben keine PositionenID diese werden anders identifiziert. -- Summen der Strukturebene (400) berechnen PosArt 99 gibt es ja nicht wirklich in den Positionen Tabelle !! if ( :"I_KeinStrukturPreis" = 'N' or :"I_SummenFunktion" = 1 ) then -- Wenn I_SummenEintragen = Y hier rein gehen begin -- ACHTUNG bestehendes Problem es muss eigentlich von der tiefsten Struktur nach aussen die Summen ermittelt werden, wenn -- die Summen aussen die inneren Summen enthalten sollen ! -- Sollen sie das ??? Momentan sind nur die Positionen summiert !!! for select "AuftrDokPosi_DokStrukturID" , count(*) AS "GesAnzPositionen" , coalesce(SUM(round("AuftrDokPosi_PosGPreis",2) ),0) AS "Summe" , count( B."Artikel_ID") AS "AnzPosAusArtikelDB" , sum( B."Art_EkPreis" * a."AuftrDokPosi_Menge") as "ArtikelSumme" , sum( round( a."AuftrDokPosi_PosGPreis",2) -( B."Art_EkPreis" * a."AuftrDokPosi_Menge"))as "ArtikelSummeBruttoErloes" from "AuftragsDokumentePositionen" A left outer join "Artikel" B ON A."AuftrDokPosi_Artikel_ID" = B."Artikel_ID" and a."AuftrDokPosi_ArtikelVersion" = b."Artikel_Version" join "AuftragsDokumente" C ON A."AuftrDokPosi_DokumentID" = C."AuftrDokument_ID" where "AuftrDokPosi_DokumentID" = :"I_AuftrDokumentID" and ( A."AuftrDokPosi_Art" < 99 or A."AuftrDokPosi_Art" > 100000 ) --- ############### NEU and ( A."AuftrDokPosi_Option" not in ( 1 , 2 ) or "AuftrDokPosi_Option" is null ) and ( "AuftrDokPosi_Menge" != 0 or "AuftrDokPosi_Menge" is null ) and ( :"I_AlleStrukturPreise" = 'Y' or "AuftrDokPosi_DokStrukturID" is not distinct from :"I_StrukturID" ) group by "AuftrDokPosi_DokStrukturID" order by "AuftrDokPosi_DokStrukturID" nulls first into :"StrukturID" , :"GesAnzPositionen" , :"Summe" , :"AnzPosAusArtikelDB" , :"ArtikelSumme" , :"ArtikelSummeBruttoErloes" do begin if ( :"I_SummenFunktion" = 1 ) then update "AuftragsDokumentePositionen" A set A."AuftrDokPosi_GPreis" = :"Summe" where "AuftrDokPosi_DokumentID" = :"I_AuftrDokumentID" and "AuftrDokPosi_DokStrukturID" is not distinct from :"StrukturID" and "AuftrDokPosi_Art" in ( 99 , 400); -- 99 wird nicht wirklich Benutzt da der Strukturtext in "AuftragsDokumentStruktur"."AuftrDokStruktur_Text" steht und die Summe auch else if ( :"I_SummenFunktion" = 0 ) then suspend; end end -- Summen der Strukturebene berechnen ENDE !! -- Ab hier muss Brutto/Netto unterschieden werden -- also aufpassen ! -- -- !!! Die Summen die ab hier gebildet werden, werden auch im Trigger "AuftrDokum_AU_RgAusgBuch" errechnet bei Aenderungen bedenken !!!!!!!!!!!!! -- -- Summen fuer das kpl. Dokument ermitteln - nach MwSt gruppiert. "NettoWerksabgabePreis" =0; for select A."AuftrDokPosi_MwStSaetze_ID" , count(*) AS "GesAnzPositionen" , coalesce(SUM(round("AuftrDokPosi_PosGPreis" ,2)),0) AS "Summe" , count( B."Artikel_ID") AS "AnzPosAusArtikelDB" , sum( B."Art_EkPreis" * a."AuftrDokPosi_Menge") as "ArtikelSumme" , sum( coalesce(round( a."AuftrDokPosi_PosGPreis" ,2),0) -( B."Art_EkPreis" * a."AuftrDokPosi_Menge"))as "ArtikelSummeBruttoErloes" , sum( coalesce( "AuftrDokPosi_GPreis" , 0 ) + coalesce( "AuftrDokPosi_ArtikeOptionsPreis" * "AuftrDokPosi_Menge" , 0 )) as "NettoPosSummOhneRabatt" -- Netto Werksabgabepreis berechnen Zuerst wenn Artikel dann den Katalogpreis + optionen ( sollte in ) -- Nur richtige Auftragspositionen <= 10 fuer den Werksabgabaepreis beruecksichtigen ,sum ( coalesce( "ADPERW_WAPreis_Netto" *coalesce( A."AuftrDokPosi_Menge",1) , iif( A."AuftrDokPosi_Art" > 10 and A."AuftrDokPosi_Art" < 100000 , 0 , round( iif( B."Artikel_ID" is not null , --,sum ( iif( A."AuftrDokPosi_Art" > 10 and A."AuftrDokPosi_Art" < 100000 , 0 , round( iif( B."Artikel_ID" is not null , -- Werksabgabepreis anhand des Katalogpreises berechnen. ACHTUNG PositionsOptionspreis muss dem MwSt Satz des Kataloges entsprechen und auch Brutto sein wenn es der Katalogpreis ist ) -- ACHTUNG c."VPRM_PosStdNettoPreis" ist der richtige Artikelpreis fuer den Artikel mit der entsprechenden ArtikelVersion !!!! round(c."VPRM_PosStdNettoPreis" ,6) * coalesce( A."AuftrDokPosi_Menge",1)-- Einfach den Preis nehmen der in der Position steckt aber immer Netto -- Spaeter evtl. noch ein Feld hinzufuegen um den WerksabgabePreis zu hinterlegen !!!! Dann dieses zuerst nehmen , iif ( :"V_Dokument_BruttoPreise" = 'Y', (coalesce( A."AuftrDokPosi_GPreis", 0 ) +( coalesce( A."AuftrDokPosi_ArtikeOptionsPreis" ,0)*coalesce( A."AuftrDokPosi_Menge",1))) / MWS."MwSt_Faktor" , coalesce( A."AuftrDokPosi_GPreis" ,0 )+( coalesce( A."AuftrDokPosi_ArtikeOptionsPreis" ,0)*coalesce( A."AuftrDokPosi_Menge",1) ) ) ) , 6 )))) from "AuftragsDokumentePositionen" A left outer join "MwSt_Saetze" MWS ON MWS."MwSt_Saetze_ID" = A."AuftrDokPosi_MwStSaetze_ID" -- Join sollte es auch tun. left outer join "Artikel" B ON A."AuftrDokPosi_Artikel_ID" = B."Artikel_ID" and a."AuftrDokPosi_ArtikelVersion" = b."Artikel_Version" left outer join "AuftragsDokumentePositionErw" ADPERW ON ADPERW."ADPERW_AuftrDokPosID" = A."AuftragsDokumentePositionen_ID" -- Um die original Preise fuer den Artikel in der Position zu bekommen zu dem Zeitpunkt als er angelegt wurde. -- left outer join "VkPreiseRabattMarge"( a."AuftragsDokumentePositionen_ID" , NULL , A."AuftrDokPosi_Artikel_ID" , A."AuftrDokPosi_ArtikelVersion" ,null) C on C.vprm_pk_id1 = a."AuftragsDokumentePositionen_ID" -- um rundungsfehler bei hohen mengen zu vermeiden den nettopreis hier auf 6 Stellen gerundet anfordern !!! left outer join "VkPreiseRabattMarge"( a."AuftragsDokumentePositionen_ID" , NULL , A."AuftrDokPosi_Artikel_ID" , A."AuftrDokPosi_ArtikelVersion" ,null,null,null,null,null, null, null, null,null,6 ) C on C.vprm_pk_id1 = a."AuftragsDokumentePositionen_ID" where "AuftrDokPosi_DokumentID" = :"I_AuftrDokumentID" and ( A."AuftrDokPosi_Art" < 99 or A."AuftrDokPosi_Art" > 100000 ) --- ############### NEU and ( A."AuftrDokPosi_Option" not in ( 1 , 2 ) or "AuftrDokPosi_Option" is null ) and ( "AuftrDokPosi_Menge" != 0 or "AuftrDokPosi_Menge" is null ) group by "AuftrDokPosi_MwStSaetze_ID" order by "AuftrDokPosi_MwStSaetze_ID" into :"MwSt_Saetze_ID" , :"GesAnzPositionen" , :"Summe" , :"AnzPosAusArtikelDB" , :"ArtikelSumme" , :"ArtikelSummeBruttoErloes" , :"NettoPosSummOhneRabatt" , :"V_NettoWerksabgabePreis" do begin if ( :"V_Dokument_BruttoPreise" = 'Y' ) then begin -- :"DokumentDatum" das DokumentDatum nicht uebrgeben da die MwStSaetzeID uebergeben wird und das LeistungsDatum der Position -- ein anderes sein kann als das DokumentDatum und dadurch gibt es durcheinander. So wird das Leistungsdarum der Position beachtet. select coalesce( round( "Betrag",2),0) , "MwSt_Satz" , "EigentlicheMwSt" from "BruttoNettoBetrag"( NULL , :"MwSt_Saetze_ID" , null , :"Summe" , NULL ) into :"Betrag" , :"MwSt_Satz" , :"V_EigentlicheMwSt"; "V_Betrag" = :"V_Betrag" + :"Summe"; "MwSt_Summe" = :"Summe" - :"Betrag"; "V_Summe" = :"V_Summe" + :"Betrag" ; "NettoPosSummOhneRabatt" = ( select coalesce( round( "Betrag",2),0) from "BruttoNettoBetrag"( NULL , :"MwSt_Saetze_ID" , null,:"NettoPosSummOhneRabatt" , NULL )); end else begin -- :"DokumentDatum" das DokumentDatum nicht uebrgeben da die MwStSaetzeID uebergeben wird und das LeistungsDatum der Position -- ein anderes sein kann als das DokumentDatum und dadurch gibt es durcheinander. So wird das Leistungsdarum der Position beachtet. select coalesce( round( "Betrag",2),0) , "MwSt_Satz" , "EigentlicheMwSt" from "BruttoNettoBetrag"( NULL , :"MwSt_Saetze_ID" , :"Summe" , null , NULL ) into :"Betrag" , :"MwSt_Satz", :"V_EigentlicheMwSt"; "V_Betrag" = :"V_Betrag" + :"Betrag" ; "MwSt_Summe" = :"Betrag" - :"Summe"; "V_Summe" = :"V_Summe" + :"Summe" ; end "NettoWerksabgabePreis" = :"NettoWerksabgabePreis" + :"V_NettoWerksabgabePreis"; "V_NettoPosSummOhneRabatt" = :"V_NettoPosSummOhneRabatt" + "NettoPosSummOhneRabatt"; "V_GesAnzPositionen" = :"V_GesAnzPositionen" + :"GesAnzPositionen"; "V_AnzPosAusArtikelDB" = :"V_AnzPosAusArtikelDB" + :"AnzPosAusArtikelDB" ; "V_ArtikelSumme" = :"V_ArtikelSumme" + :"ArtikelSumme"; -- Noch preufen ob der Artikelpreis Brutto oder Netto ist "V_ArtikelSummeBruttoErloes" = :"V_ArtikelSummeBruttoErloes" + :"ArtikelSummeBruttoErloes"; "StrukturID" = -1; -- -1 Zeigt an das es sich um das kpl. Dokument handelt aber nach MwSt Gruppen gruppiert if ( :"I_SummenFunktion" = 1 ) then -- Summen eintragen begin -- Nettosummen der einzelnen MwSt gruppen update "AuftragsDokumentePositionen" A set A."AuftrDokPosi_GPreis" = iif( :"V_Dokument_BruttoPreise" = 'Y' , :"Betrag" , :"Summe" ) where "AuftrDokPosi_DokumentID" = :"I_AuftrDokumentID" and "AuftrDokPosi_DokStrukturID" is null and "AuftrDokPosi_MwStSaetze_ID" = :"MwSt_Saetze_ID" and "AuftrDokPosi_Art" = 401; -- MwSt/USt summen setzen. update "AuftragsDokumentePositionen" A set A."AuftrDokPosi_GPreis" = :"MwSt_Summe" where "AuftrDokPosi_DokumentID" = :"I_AuftrDokumentID" and "AuftrDokPosi_DokStrukturID" is null and "AuftrDokPosi_MwStSaetze_ID" = :"MwSt_Saetze_ID" and "AuftrDokPosi_Art" = 300; end else if ( :"I_SummenFunktion" = 2 ) then -- Summen ins RgAusgangsbuch uebernehmen begin -- MwSt/USt summen im "RgAusgangsBuch_MwSt" eintragen ! insert into "RgAusgangsBuch_MwSt" ( "RgABMwSt_RgAB_ID" , "RgABMwSt_MwStSatzID" , "RgABMwSt_BuchungsBetrag" , "RgABMwSt_EigentlicherBetrag" ) values ( :"I_AuftrDokumentID" , :"MwSt_Saetze_ID" , :"MwSt_Summe" ,coalesce ( :"V_EigentlicheMwSt" ,:"MwSt_Summe" )); end else if ( :"I_SummenFunktion" = 0 ) then begin if ( :"V_Dokument_BruttoPreise" = 'Y' ) then "Summe" = "Betrag"; suspend; end end -- Ende Betraege nach MwSt-Summen erfassen if ( :"I_SummenFunktion" in( 1,4) ) then begin -- Gesamt Netto eintragen von oben summierten Summen.Vorher wurde die Summe von den Summen gebildet was Fehler brachte wenn nicht alle MeSt Satz summen im Dokument vorhanden waren. if ( :"I_SummenFunktion" = 1 ) then begin update "AuftragsDokumentePositionen" A set A."AuftrDokPosi_GPreis" = :"V_Summe" where "AuftrDokPosi_DokumentID" = :"I_AuftrDokumentID" and "AuftrDokPosi_DokStrukturID" is null and "AuftrDokPosi_Art" = 402; -- Gesamt Brutto eintragen von oben summierten Summen.Vorher wurde die Summe von den Summen gebildet was Fehler brachte wenn nicht alle MeSt Satz summen im Dokument vorhanden waren. update "AuftragsDokumentePositionen" A set A."AuftrDokPosi_GPreis" = :"V_Betrag" where "AuftrDokPosi_DokumentID" = :"I_AuftrDokumentID" and "AuftrDokPosi_DokStrukturID" is null and "AuftrDokPosi_Art" = 410; -- Summe aller Positionen einfuegen entsprechend ob Brutto oder Nettodokument if ( :"V_Dokument_BruttoPreise" = 'Y' ) then update "AuftragsDokumentePositionen" A set A."AuftrDokPosi_GPreis" = :"V_Betrag" where "AuftrDokPosi_DokumentID" = :"I_AuftrDokumentID" and "AuftrDokPosi_DokStrukturID" is null and "AuftrDokPosi_Art" = 403; else update "AuftragsDokumentePositionen" A set A."AuftrDokPosi_GPreis" = :"V_Summe" where "AuftrDokPosi_DokumentID" = :"I_AuftrDokumentID" and "AuftrDokPosi_DokStrukturID" is null and "AuftrDokPosi_Art" = 403; end end -- Die zwischenspeicher Variablen fuer Funktion = 4 jetzt setzen "V_ADE_DokumentNettoSumme" = :"V_Summe"; "V_ADE_DokumentBruttoSumme" = :"V_Betrag"; if ( :"I_SummenFunktion" = 2 ) then -- Summen ins RgAusgangsbuch uebernehmen begin update "RgAusgangsBuch" set "RgAB_NettoRechnungsBetrag" = :"V_Summe" , "RgAB_BruttoBetrag" = :"V_Betrag" where "RgAB_AuftrDokumentID" =:"I_AuftrDokumentID"; exit; -- Funktion 2 beendet end "NettoPosSummOhneRabatt" = :"V_NettoPosSummOhneRabatt"; -- Summe der Preisen ohne den Rabatt ( so laesst sich der Gesamtrabatt ermitteln) "V_NettoPosSumOhneRabatAusMinus2" = :"NettoPosSummOhneRabatt"; -- Als zwischenspeicher fuer Funktion = 4 "GesAnzPositionen" = "V_GesAnzPositionen" ; "Summe" = "V_Summe"; "AnzPosAusArtikelDB" = "V_AnzPosAusArtikelDB"; "ArtikelSumme" = "V_ArtikelSumme" ; "ArtikelSummeBruttoErloes" = "V_ArtikelSummeBruttoErloes"; "Betrag" = "V_Betrag"; "StrukturID" = -2; -- -2 Zeigt an das es sich um das kpl. Dokument handelt ohne MwSt gruppierung "MwSt_Satz" = NULL; "MwSt_Summe" = iif( :"V_Dokument_BruttoPreise" = 'Y' , :"Summe" - :"Betrag" , :"Betrag" - :"Summe"); -- Folgendes evtl. nur dann machen wenn es auch gewuenscht ist -- Noch den unterschied zwischen Katalog VK und dem evtl. hier geaenderten VK des Artikel ausrechnen ( versteckter Rabatt ) -- ACHTUNG hier werden keine Staffelpreise beruecksichtigt wodurch diese dann im versteckten Rabatt angezeigt werden. "VersteckteBruttoRabattSumme" =0; for select sum( round( iif( "Klog_BruttoPreise" = 'N' , (B."Art_VkPreis" * a."AuftrDokPosi_Menge") * (( cast("Satz" as float) / 100 )+1) , B."Art_VkPreis" * a."AuftrDokPosi_Menge" ),2)) - sum( round( iif( :"V_Dokument_BruttoPreise" = 'N' , coalesce( a."AuftrDokPosi_GPreis" , 0) * (( cast("Satz" as float) / 100 )+1) , coalesce( a."AuftrDokPosi_GPreis" ,0) ),2)) as "VersteckteRabattSumme" from "AuftragsDokumentePositionen" A join "Artikel" B ON A."AuftrDokPosi_Artikel_ID" = B."Artikel_ID" and a."AuftrDokPosi_ArtikelVersion" = b."Artikel_Version" join "Kataloge" C ON B."Art_Katalog_ID" = C."Katalog_ID" join "MwSt_Saetze" D ON A."AuftrDokPosi_MwStSaetze_ID" = D."MwSt_Saetze_ID" where "AuftrDokPosi_DokumentID" = :"I_AuftrDokumentID" and ( A."AuftrDokPosi_Art" < 99 or A."AuftrDokPosi_Art" > 100000 ) --- ############### NEU and ( A."AuftrDokPosi_Option" not in ( 1 , 2 ) or "AuftrDokPosi_Option" is null ) and ( "AuftrDokPosi_Menge" != 0 or "AuftrDokPosi_Menge" is null ) group by "Satz" , "Klog_BruttoPreise" into :"V_VersteckterBruttoRabatt" do begin "VersteckteBruttoRabattSumme" = :"VersteckteBruttoRabattSumme" + :"V_VersteckterBruttoRabatt"; end -- Fuer Funktion = 4 die ges. Summe des versteckten Brutto Rabatts hier in Variable uebernehemn da Outputparameter genullt wird nach -2 auch -3 "V_VersteckterBruttoRabatt" = :"VersteckteBruttoRabattSumme"; if ( :"I_SummenFunktion" not in ( 1,4 )) then suspend; -- Die Versand/Verischerungskosten ( Positionsart 50+51 ermitteln ) !!!!!!!!!!!!!!!!!! "StrukturID" = -3; -- -3 Zeigt an das es sich um die Brutto Versand + Versicherungkosten handelt "MwSt_Saetze_ID" = NULL; "GesAnzPositionen" = NULL; "Summe" = NULL; "AnzPosAusArtikelDB" = NULL; "ArtikelSumme" = NULL; "ArtikelSummeBruttoErloes" = NULL; "MwSt_Satz" = 0; "MwSt_Summe" = NULL; "O_AuftragDokumentPositionenID" = NULL; "RET" = NULL; "VersteckteBruttoRabattSumme" = NULL; "NettoPosSummOhneRabatt" = 0; "Betrag" = 0; for select sum( round( iif( :"V_Dokument_BruttoPreise" = 'Y' , coalesce( a."AuftrDokPosi_GPreis" , 0 ) / (( cast("Satz" as float) / 100 )+1) , coalesce( a."AuftrDokPosi_GPreis" ,0) ),2)) as "VersandBruttoOhneRabatt" ,sum( round( iif( :"V_Dokument_BruttoPreise" = 'Y' , coalesce( a."AuftrDokPosi_PosGPreis" , 0 ) / (( cast("Satz" as float) / 100 )+1) , coalesce( a."AuftrDokPosi_PosGPreis" ,0) ),2)) as "VersandBrutto" from "AuftragsDokumentePositionen" A -- ACHTUNG coalesce( a."AuftrDokPosi_PosGPreis" , 0 ) ist hier wichtig bei Versand kann GesPreis NULL sein !!! join "MwSt_Saetze" D ON A."AuftrDokPosi_MwStSaetze_ID" = D."MwSt_Saetze_ID" where "AuftrDokPosi_DokumentID" = :"I_AuftrDokumentID" and ( A."AuftrDokPosi_Art" in ( 50,51) ) and ( A."AuftrDokPosi_Option" not in ( 1 , 2 ) or "AuftrDokPosi_Option" is null ) and ( "AuftrDokPosi_Menge" != 0 or "AuftrDokPosi_Menge" is null ) group by "AuftrDokPosi_MwStSaetze_ID" order by "AuftrDokPosi_MwStSaetze_ID" into :"V_NettoPosSummOhneRabatt" , :"V_Summe" do begin "NettoPosSummOhneRabatt" = "NettoPosSummOhneRabatt" +:"V_NettoPosSummOhneRabatt"; "Betrag" = "Betrag" + :"V_Summe"; end if ( ( :"V_ADE_DokumentNettoSumme" - :"Betrag" = 0 ) and ( :"V_GesAnzPositionen" > 0 ) ) then "MwSt_Satz" = 100; else if ( :"NettoWerksabgabePreis" = 0 or :"V_ADE_DokumentNettoSumme" = 0 ) then "MwSt_Satz" = NULL; -- Da mindestens eine der beiden Summen =0 ist kann nichts ordentlich errechnet werden !!!! else if ( coalesce( ( :"NettoWerksabgabePreis" - (:"V_ADE_DokumentNettoSumme" - :"Betrag" )),0) = 0 ) then "MwSt_Satz" = 0; else begin "V_Temp_DP" = round( (1-( (:"V_ADE_DokumentNettoSumme" - :"Betrag" ) / ( :"NettoWerksabgabePreis"+0.000001)))*100,2) ; if ( :"V_Temp_DP" > 99999.99 ) then "V_Temp_DP" = 99999.99; else if ( :"V_Temp_DP" < -99999.99 ) then "V_Temp_DP" = -99999.99; "MwSt_Satz" = :"V_Temp_DP"; -- groessere Zahlen als 99999.99 passen nicht in das Feld "MwSt_Satz" end if ( :"I_SummenFunktion" in ( 1, 4 )) then begin if ( :"I_SummenFunktion" = 1 ) then update "AuftragsDokumente" set "AuftrDokument_SummenBerechnet" = current_timestamp where "AuftrDokument_ID" = :"I_AuftrDokumentID" ; -- Zeitstempel der letzten Berechnung setzen -- ACHTUNG Deoumentrabatt hier berechnen wegen ueberlaufgefahr und es wird keine Zahl groesser/kleiner 9999999.99 eingetragen !!!! update or insert into "AuftragsDokumenteExt" ( "ADE_AuftrDokument_ID", "ADE_DokumentNettoSumme" , "ADE_DokumentBruttoSumme" , "ADE_DokumentRabatt" ) values ( :"I_AuftrDokumentID" , :"V_ADE_DokumentNettoSumme" , :"V_Betrag" , :"MwSt_Satz" ) matching ("ADE_AuftrDokument_ID"); RET ='OK'; suspend; exit; -- Funktion 1/4 ist hier beendet ! Exit wird aufgerufen evtl. kommt unten ja spaeter was da zu end suspend; -- E N D E --- Die Versand/Verischerungskosten ( Positionsart 50+51 ermitteln ) end when any do begin exception "Fatal_Error"'In SP "AuftrDokumentSummen" DokID='||:"I_AuftrDokumentID"; end end ^ SET TERM ; ^ DESCRIBE PARAMETER "Summe" PROCEDURE "AuftrDokument_Summen" 'Summe Nettobetrag'; DESCRIBE PARAMETER "Betrag" PROCEDURE "AuftrDokument_Summen" 'Bruttobetrag bei Bei StrukturID -2 der gesm Brutto bei -3 Netto Versandkosten mit Rabatt'; DESCRIBE PARAMETER "MwSt_Satz" PROCEDURE "AuftrDokument_Summen" 'Bei StrukturID -3 steht hier der Versteckte Rabatt also der Tarsaechliche. Problem Freie Artikel'; DESCRIBE PARAMETER "NettoPosSummOhneRabatt" PROCEDURE "AuftrDokument_Summen" 'Bei StrukturID -3 Netto Versandkosten ohne Rabatt'; DESCRIBE PARAMETER "VersteckteBruttoRabattSumme" PROCEDURE "AuftrDokument_Summen" 'Der Unteschied zwischen tatsaechlichem Artikel Vk Preis und dem fuer die Positon genutzen Vk preis ( Versteckter Rabatt )'; DESCRIBE PARAMETER "NettoWerksabgabePreis" PROCEDURE "AuftrDokument_Summen" 'Summe der Katalogpreis des Artikel wenn Artikel Position beim Freien Positionen einfach der Wert wie angegeben'; DESCRIBE PARAMETER "O_AuftrDokumentID" PROCEDURE "AuftrDokument_Summen" 'Zum joinen mit einer DokumentID'; DESCRIBE PROCEDURE "AuftrDokument-GetMailParameter" 'Entwder "TextBlob" oder "Text" ist belegt !!!! RowType = 0 Antwortadresse RowType = 1 From Adress ( je nachdem auch mehrere ) RowType = 2 To Adress evtl. mehrmals ( wenn es eine oder mehrer Bevorzugte gibt nur diese -- wenn keine bevorzugte dann alle anderen Mailadressen des Asp. RowType = 3 = CC empfaenger ( ungenutzt ) RowType = 4 = BCC Empfaenger wenn mehrere Sachbearbeiter/Vertreter vorhanden RowType = 10 Betreffzeile RowType = 11 Dateiname fuer den PDF Anhang / Dokument RowType = 12 Textvorlage RowType = 1000 Anmeldedaten fur den SMTP Server ( Benutzer/Mailadresse ) RowType = 1001 Anmeldedaten fur den SMTP Server ( Passwort ) RowType = 1002 Anmeldedaten fur den SMTP Server ( URL/IP Server ) RowType = 1003 Anmeldedaten fur den SMTP Server ( Port ) Gibt die SMTP-Server Daten nur zurueck wenn eine einzige Absenderadresse gefunden wurde. Ansonsten muss man mit "I_DokumenID" = -1 fuer die gewaehlte Mailadresse extra die SMTP-Daten abfragen.'; /* Alter (E-Mail-GetOrdnerMailIDs) */ SET TERM ^ ; ALTER PROCEDURE "E-Mail-GetOrdnerMailIDs"("iEMailOrdnerStrukturID" INTEGER, "iEMOS_Type" INTEGER) AS declare variable "RootNodeID" integer; begin if ( :"iEMOS_Type" is null ) then begin "iEMOS_Type" = (select "EMOS_Type" from "E-Mail-OrdnerStruktur" where "EMailOrdnerStrukturID" = :"iEMailOrdnerStrukturID" ); end "RootNodeID" = ( select PK_ID from "TreeHelpFunctions"( 'GetRootNode' , 'E-Mail-OrdnerStruktur' , 'EMailOrdnerStrukturID' , 'EMOS_Parent' , NULL , :"iEMailOrdnerStrukturID" , NULL , NULL , 'Y' ,NULL ,NULL)); if ( current_user != 'SYSDBA' -- current_user != 'MailManager' noch evtl. einfuegen und sysdba rausnehemn and current_user != (select "B_UserName" from "RESOURCE" join "BenutzerIDs" ON "BenutzerID" = "RESO_BenutzerID" where "RESO_MailOrdnerStrukturID" = :"RootNodeID" )) then begin -- Hier noch schauen ob eine Berechtigung ueber eine Resourcegruppe vorhanden ist. -- Ansonsten Exception exception "Zugriffsrechte" 'Kein Zugriff auf den Ordner'; end suspend; end ^ SET TERM ; ^ DESCRIBE PARAMETER "iEMOS_Type" PROCEDURE "E-Mail-GetOrdnerMailIDs" 'Wenn NULL iwrd der Type ermittelt'; DESCRIBE PARAMETER "iVarParam1" PROCEDURE GP_SUCHEN_HILFE 'Zusaetzlicher Parameter fuer z.B. Referenznummer !!'; /* Alter (Mengenausgleich) */ SET TERM ^ ; ALTER PROCEDURE "Mengenausgleich"("iFunktion" INTEGER, "iNotiz" TYPE OF COLUMN "AuftragsDokumentePositionExt"."ADPE_TextNotiz", "iID_Art" INTEGER, "iID" BIGINT, "iIDs" "d_BLOB_Text_AsciiGross", "iAuftragsDokument_ID" INTEGER, "iAusgewaehltePositionen" INTEGER, "iUntergeordnetePositionen" D_BOOLEAN_YN, "iAusgabeListe" INTEGER, "iAuftragVerrechnPos_ID" BIGINT, "iAuftragVerrechnDokument" INTEGER, "iMengenAusgleich" "Mengen", "iParam1" INTEGER) RETURNS("AuftrDokPosID" BIGINT, "sourceAuftrDokPosID" BIGINT, "sourceAuftrDokArt" INTEGER, "BereitsVerrechnet" "Mengen", "AusgeglicheneMenge" "Mengen", "destMenge" "Mengen", "GesamtPositionen" INTEGER, "VerrechnetePositionen" INTEGER, "WarningError" "d_str60") AS declare variable "TempBigInt" bigint; declare variable "TempBigInt2" bigint; declare variable "TempBigInt3" integer; begin if ( :"iFunktion" is null or :"iFunktion" not in ( 0 ) ) then exception "Fatal_Error"'Fehlerhafte Funktion'; if ( :"iID_Art" is null or :"iID_Art" not in ( 0,1) ) then exception "Fatal_Error"'Fehlerhafte ID_Art'; if ( exists( Select * from "TempIDsZwischenspeicher" A where A."TempID_Art" = 3 and A."InsertTransaction" = current_transaction )) then exception "Fatal_Error" 'IDs in Temp schon vorhanden ! (Nicht erlaubt)'; if ( :"iIDs" is null ) then "iIDs" = :"iID"; else begin if ( :"iID" is not null ) then "iIDs" = :"iIDs" || :"iID"; end if ( :"iAuftragsDokument_ID" is null ) then begin if ( :"iIDs" is null ) then exception "Fatal_Error" 'Keine IDs uebergeben'; if ( :"iID_Art" = 0 ) then -- IDs entsprechen AuftragsDokumentPositionenIDs und sichergestellt das es nur von einem Dokument die Positionen sind. "iAuftragsDokument_ID" = ( select distinct A."AuftrDokPosi_DokumentID" from "AuftragsDokumentePositionen" A join "SelectForINoperator"( :"iIDs" ) B ON A."AuftragsDokumentePositionen_ID" is not distinct from b."Value"); else -- IDs entsprechen AuftragsDokumentStruktur und sichergestellt das es nur von einem Dokument die Strukturen sind. "iAuftragsDokument_ID" = ( select distinct A."AuftrDokStruktur_Dokument_ID" from "AuftragsDokumentStruktur" A join "SelectForINoperator"( :"iIDs" ) B ON A."AuftrDokStruktur_ID" is not distinct from b."Value"); end if ( not exists ( select * from "AuftragsDokumente" A where A."AuftrDokument_ID" = :"iAuftragsDokument_ID" and A."AuftrDokument_Art" = 500 )) then exception "Fatal_Error" 'Keine Gutschrift uebergeben!'; if ( :"iAusgewaehltePositionen" = 0 ) then begin insert into "TempIDsZwischenspeicher" ( "TempID_Art" , "ID1" , "AutoDeleteAfterEndInsertTransac" ) select 3 , A."AuftragsDokumentePositionen_ID" , 1 from "AuftragsDokumentePositionen" A where A."AuftrDokPosi_DokumentID" = :"iAuftragsDokument_ID" and A."AuftrDokPosi_Art" < 11 and A."AuftrDokPosi_AbgeleitetVonPos" is not null; end else if ( :"iAusgewaehltePositionen" = 1 ) then begin if ( :"iID_Art" = 0 ) then insert into "TempIDsZwischenspeicher" ( "TempID_Art" , "ID1" , "AutoDeleteAfterEndInsertTransac" ) select distinct 3 , A."AuftragsDokumentePositionen_ID" , 1 from "AuftragsDokumentePositionen" A join "SelectForINoperator"( :"iIDs" ) B ON A."AuftragsDokumentePositionen_ID" = B."Value" where A."AuftrDokPosi_Art" < 11 and A."AuftrDokPosi_AbgeleitetVonPos" is not null; else insert into "TempIDsZwischenspeicher" ( "TempID_Art" , "ID1" , "AutoDeleteAfterEndInsertTransac" ) select distinct 3 , A."AuftragsDokumentePositionen_ID" , 1 from "AuftragsDokumentePositionen" A join "SelectForINoperator"( :"iIDs" ) B ON A."AuftrDokPosi_DokStrukturID" = B."Value" where A."AuftrDokPosi_Art" < 11 and A."AuftrDokPosi_AbgeleitetVonPos" is not null; end else if ( :"iAusgewaehltePositionen" = 2 ) then begin if ( :"iID_Art" = 0 ) then insert into "TempIDsZwischenspeicher" ( "TempID_Art" , "ID1" , "AutoDeleteAfterEndInsertTransac" ) select distinct 3 , A."AuftragsDokumentePositionen_ID" , 1 from "AuftragsDokumentePositionen" A join "AuftragsDokumentePositionen" B on A."AuftrDokPosi_DokStrukturID" is not distinct from b."AuftrDokPosi_DokStrukturID" and b."AuftrDokPosi_DokumentID" = :"iAuftragsDokument_ID" where A."AuftrDokPosi_Art" < 11 and A."AuftrDokPosi_AbgeleitetVonPos" is not null and A."AuftrDokPosi_DokumentID" = :"iAuftragsDokument_ID" and B."AuftragsDokumentePositionen_ID" in ( select "Value" from "SelectForINoperator"( :"iIDs" )); else -- Das hier ist noch etwas fraglich (Alle Strukturen der Ebene) es kommen nur positionen die in den Strukturen liegen aber nicht die Positionen der Struktur selbst insert into "TempIDsZwischenspeicher" ( "TempID_Art" , "ID1" , "AutoDeleteAfterEndInsertTransac" ) select distinct 3 , A."AuftragsDokumentePositionen_ID" , 1 from "AuftragsDokumentePositionen" A join "AuftragsDokumentStruktur" B ON A."AuftrDokPosi_DokStrukturID" = B."AuftrDokStruktur_ID" where A."AuftrDokPosi_Art" < 11 and A."AuftrDokPosi_AbgeleitetVonPos" is not null and A."AuftrDokPosi_DokumentID" = :"iAuftragsDokument_ID" and B."AuftrDokStruktur_ElternID" in ( select "Value" from "SelectForINoperator"( :"iIDs" )); end if ( :"iAusgewaehltePositionen" != 0 and :"iUntergeordnetePositionen" = 'Y' ) then begin -- Auch noch untergeordnete Ebenen mit aufnehmen :-) for select distinct C."AuftrDokStruktur_ID" from "AuftragsDokumentePositionen" A join "TempIDsZwischenspeicher" B ON A."AuftragsDokumentePositionen_ID" = "ID1" and B."TempID_Art" = 3 and B."InsertTransaction" = current_transaction -- Durch diesen zweiten Join bekomme ich schon immer die naechste/untergeordnete) Ebene da von Ebene NULL die untergeordnete immer eine StrukturID hat und diese nie NULL sein kann funktioniert es. join "AuftragsDokumentStruktur" C ON A."AuftrDokPosi_DokStrukturID" is not distinct from C."AuftrDokStruktur_ElternID" and C."AuftrDokStruktur_Dokument_ID" = A."AuftrDokPosi_DokumentID" into :"TempBigInt" do begin merge into "TempIDsZwischenspeicher" B using ( select A."AuftragsDokumentePositionen_ID" from "AuftragsDokumentePositionen" A join "TreeHelpFunctions"( 'GetTree' ,'AuftragsDokumentStruktur','AuftrDokStruktur_ID','AuftrDokStruktur_ElternID', NULL , :"TempBigInt" , NULL , NULL , 'Y' ,NULL,NULL) C on A."AuftrDokPosi_DokStrukturID" is not distinct from C."PK_ID" where A."AuftrDokPosi_Art" < 11 and A."AuftrDokPosi_AbgeleitetVonPos" is not null and A."AuftrDokPosi_DokumentID" = :"iAuftragsDokument_ID" ) on ( B.id1 is not distinct from "AuftragsDokumentePositionen_ID" and B."TempID_Art" = 3 and B."InsertTransaction" = current_transaction ) when not matched then insert ( "TempID_Art" , "ID1" , "AutoDeleteAfterEndInsertTransac" ) values ( 3 , "AuftragsDokumentePositionen_ID" , 1); end end -- Sicherheitshalber pruefen ob wirklich alle Positionen aus ein und dem selben Dokument stammen -- Sonst ist etwas SEHR schief gelaufen !!!! if ( exists ( select * from "TempIDsZwischenspeicher" A join "AuftragsDokumentePositionen" B ON A."ID1" = B."AuftragsDokumentePositionen_ID" where b."AuftrDokPosi_DokumentID" is distinct from :"iAuftragsDokument_ID" and A."TempID_Art" = 3 and A."InsertTransaction" = current_transaction )) then exception "Fatal_Error"'Positionen aus verschiedenen Dokumenten gefunden !!! '; "GesamtPositionen" = ( select count(*) from "TempIDsZwischenspeicher" A where A."TempID_Art" = 3 and A."InsertTransaction" = current_transaction); if ( :"iMengenAusgleich" is not null and :"GesamtPositionen" > 1 ) then exception "Fatal_Error" 'Ausgleichsmenege nicht auf mehere Positionen anwendbar !'; if ( :"iAusgabeListe" = 0 ) then "iAusgabeListe" = NULL; "VerrechnetePositionen" = 0; -- Ab hier die Mengen verrechnen -- Jeder Position kann eine andere AB zu Grunde liegen also darauf achten. for select ID1 , "AuftragDokPosiID" , "BestellDokArt" , C."AuftrDokPosi_Menge" from "TempIDsZwischenspeicher" A left outer join "AuftrDokPosition_Historie"( 1, NULL , NULL , A.ID1 , NULL , NULL) B ON B."I_AuftragDokPosiPositionID" = A.ID1 left outer join "AuftragsDokumentePositionen" C ON C."AuftragsDokumentePositionen_ID" = A.ID1 where A."TempID_Art" = 3 and A."InsertTransaction" = current_transaction into :"AuftrDokPosID" , :"sourceAuftrDokPosID" , :"sourceAuftrDokArt" , :"destMenge" do begin "WarningError" =''; -- In :"BereitsVerrechnet" die schon verrechntete Menge speichern aber nicht die des jetzt zu aendernden types summieren der Wert steht ja hier select coalesce( sum( "ADPE_MengeAusgleich" ),0) from "AuftragsDokumentePositionExt" A where A."AuftragsDokumentePosition_ID" is not distinct from :"sourceAuftrDokPosID" and A."AuftragsDokumentePosition_ID" is distinct from :"AuftrDokPosID" -- Die jetztige Position nicht summieren sondern den new oder old wert entsprechend hier addieren into :"BereitsVerrechnet"; if ( :"iMengenAusgleich" is not null ) then -- Vom Benutzer uebergeben Menge uebernehmen begin if ( :"iMengenAusgleich" > :"destMenge" ) then exception "Fatal_Error"'Angegebene Menge zu gross'; "destMenge" = :"iMengenAusgleich"; end if ( :"destMenge" < 0) then exception "Fatal_Error"'Angegebene Menge darf nicht < 0 sein'; if ( :"destMenge" = 0 ) then -- Wenn destmenge = 0 den Datensatz loeschen der Verrechnet werden soll delete from "AuftragsDokumentePositionExt" where "AuftragsDokumentePosition_ID" is not distinct from "AuftragsDokumentePosition_ID" and "ADPE_VerrechnPosID" is not distinct from :"AuftrDokPosID"; else if ( :"sourceAuftrDokArt" is not distinct from 200 ) then -- Passende AB gefunden zu der GS begin -- Eine Auftragsbestaetigung wurde gefunden if ( exists ( select * from "AuftragsDokumentePositionExt" A where A."AuftragsDokumentePosition_ID" = :"sourceAuftrDokPosID" and A."ADPE_VerrechnPosID" is not distinct from :"AuftrDokPosID" )) then update "AuftragsDokumentePositionExt" set "ADPE_MengeAusgleich" = :"destMenge" , "ADPE_TextNotiz" = :"iNotiz" where "AuftragsDokumentePosition_ID" = :"sourceAuftrDokPosID" and "ADPE_VerrechnPosID" is not distinct from :"AuftrDokPosID"; else insert into "AuftragsDokumentePositionExt" ( "AuftragsDokumentePosition_ID" , "ADPE_VerrechnPosID" , "ADPE_MengeAusgleich" , "ADPE_TextNotiz" ) values( :"sourceAuftrDokPosID" , :"AuftrDokPosID" , :"destMenge" , :"iNotiz" ); "VerrechnetePositionen" = :"VerrechnetePositionen" +1; end else "WarningError" = :"WarningError" || '1,'; if ( :"WarningError" = '' ) then "WarningError" = NULL; if ( :"iAusgabeListe" is not null ) then suspend; end delete from "TempIDsZwischenspeicher" A where A."TempID_Art" = 3 and A."InsertTransaction" = current_transaction; end ^ SET TERM ; ^ DESCRIBE PARAMETER "iFunktion" PROCEDURE "Mengenausgleich" '0=Fehlemengen durch GS in AB einfuegen'; DESCRIBE PARAMETER "iID_Art" PROCEDURE "Mengenausgleich" '0=AuftragsDokumentPositionernIDs , 1 = StrukturIDs'; DESCRIBE PARAMETER "iID" PROCEDURE "Mengenausgleich" 'AuftragDokumentPositionenID oder StrukturID'; DESCRIBE PARAMETER "iIDs" PROCEDURE "Mengenausgleich" 'Mehrere IDs durch Komma getrennt (Aber nur von einem einzigen Dokument )'; DESCRIBE PARAMETER "iAuftragsDokument_ID" PROCEDURE "Mengenausgleich" 'Optional kann verwendet werden wenn alle Positionen eines Dokuments betroffen sind'; DESCRIBE PARAMETER "iAusgewaehltePositionen" PROCEDURE "Mengenausgleich" '0=Alle Dokumentpositionen ,1=Nur uebergeben Positionen/Strukturen, 2=Alle Positionen/Strukturen der Ebene'; DESCRIBE PARAMETER "iUntergeordnetePositionen" PROCEDURE "Mengenausgleich" 'wenn iAusgewaehltePositionen != 0 ist'; DESCRIBE PARAMETER "iAusgabeListe" PROCEDURE "Mengenausgleich" '0/NULL = Nichts zurueckgeben, 1 = nur geaenderte ohne Fehler zurueckgeben , 2 = Alle zurueckgeben'; DESCRIBE PARAMETER "iAuftragVerrechnPos_ID" PROCEDURE "Mengenausgleich" 'Bei GS->AB findet er diese Felder automatisch also NULL setzen'; DESCRIBE PARAMETER "iAuftragVerrechnDokument" PROCEDURE "Mengenausgleich" 'Bei GS->AB findet er diese Felder automatisch also NULL setzen'; DESCRIBE PARAMETER "iMengenAusgleich" PROCEDURE "Mengenausgleich" 'Wenn NULL dann automatisch die volle Menge ausgleichen(Ist fuer das verarbeiten von mehrern Positionen voraussetzung).Auf welchem Stand die Ausgleichsmenege stehen soll -- also wenn es schon was gab nur einen Teil einfuegen damit diese Menge hier genau erreicht wird'; DESCRIBE PARAMETER "AusgeglicheneMenge" PROCEDURE "Mengenausgleich" 'Ausgleichsmenge die errechnete wurde um die Gewuenscht menge zu erhalten z.B. War 1 Soll 5 = 5-1 = 4'; DESCRIBE PARAMETER "destMenge" PROCEDURE "Mengenausgleich" 'Menge in destination z.B. Menge in de GS Position'; DESCRIBE PARAMETER "WarningError" PROCEDURE "Mengenausgleich" 'NULL = nichts, 1 = Keine AB fuer Position gefunden ,'; /* Alter (SPDrucktestVerglFuerUmstelDelet) */ SET TERM ^ ; ALTER PROCEDURE "SPDrucktestVerglFuerUmstelDelet" RETURNS("PositionsArt" INTEGER, "PositionsNr" INTEGER, "PosText1" "d_str10", "PosText2" "d_str60", "ArtikelBlobText" BLOB SUB_TYPE 1 SEGMENT SIZE 8192, "KurztextAnzAbsaetze" INTEGER, "ZeilenNr" INTEGER, "RowType" INTEGER, "StrukturText" "d_str50") AS declare variable "DokID" integer; begin for select b."AuftrDokument_ID" from "AuftragsDokumente" B where b."AuftrDokument_ID" not in ( 274) into :"DokID" do begin for select :"DokID" , "ZeilenNr", "PositionsArt" , "PositionsNr" ,"PosText1" , "PosText2" , "RowType" , "KurztextAnzAbsaetze", coalesce( "ArtikelText" , "ArtikelBlobText" ) , "StrukturText" from "AuftragsDokumente_Drucken"( :"DokID" ,NULL , NULL , NULL , 'N' , 'N' , 'Y', 'TEXT' , NULL , NULL , NULL , NULL , 'N', NULL , NULL , NULL ,NULL , NULL ) where "RowType" not in ( 7,8) -- RoweType 7/8 kann die selbe Zeilennr haben wie eine andere Zeile wird wohl einfach reingefriemelt mal schauen into :"DokID" , :"ZeilenNr" , :"PositionsArt" , :"PositionsNr" , :"PosText1" , :"PosText2" , :"RowType" , :"KurztextAnzAbsaetze" , :"ArtikelBlobText" , :"StrukturText" do begin delete from "DrucktestVerglFuerUmstellung" where "AuftragDokumentID" is not distinct from :"DokID" and "ZeilenNr" is not distinct from :"ZeilenNr" and "Positionsart" is not distinct from :"PositionsArt" and "PositionsNr" is not distinct from :"PositionsNr" and "PosText1" is not distinct from :"PosText1" and "PosText2" is not distinct from :"PosText2" and "RowType" is not distinct from :"RowType" and "KurztextAnzAbsaetze" is not distinct from :"KurztextAnzAbsaetze" and "ArtikelTextBlob" is not distinct from :"ArtikelBlobText" and "StrukturText" is not distinct from :"StrukturText" and "Nachher" = 'N'; end end end ^ /* Alter (SPDrucktestVerglFuerUmstellung) */ ALTER PROCEDURE "SPDrucktestVerglFuerUmstellung"("Nachher" D_BOOLEAN_YN) AS declare variable "DokID" integer; begin for select b."AuftrDokument_ID" from "AuftragsDokumente" B where b."AuftrDokument_ID" not in ( 274) into :"DokID" do begin insert into "DrucktestVerglFuerUmstellung" ( "AuftragDokumentID","ZeilenNr","Nachher","Positionsart","PositionsNr","PosText1","PosText2" ,"RowType","KurztextAnzAbsaetze", "ArtikelTextBlob","StrukturText" ) select :"DokID" , "ZeilenNr", :"Nachher", "PositionsArt" , "PositionsNr" ,"PosText1" , "PosText2" , "RowType" , "KurztextAnzAbsaetze", coalesce( "ArtikelText" , "ArtikelBlobText" ) , "StrukturText" from "AuftragsDokumente_Drucken"( :"DokID" ,NULL , NULL , NULL , 'N' , 'N' , 'Y', 'TEXT' , NULL , NULL , NULL , NULL , 'N', NULL , NULL , NULL ,NULL , NULL ) where "RowType" not in ( 7,8); -- RoweType 7/8 kann die selbe Zeilennr haben wie eine andere Zeile wird wohl einfach reingefriemelt mal schauen end end ^ /* Restore proc. body: AuftrDokPositionen_Funktionen */ ALTER PROCEDURE "AuftrDokPositionen_Funktionen"("Funktion" VARCHAR(30), "vonAuftrDokPos_ID" TYPE OF COLUMN "AuftragsDokumentePositionen"."AuftragsDokumentePositionen_ID", "Anzahl" INTEGER, "nachAuftrDokPos_ID" TYPE OF COLUMN "AuftragsDokumentePositionen"."AuftragsDokumentePositionen_ID", "I_DokStrukturID" INTEGER, "I_DokumentID" INTEGER, "I_ParamDouble" DOUBLE PRECISION, "I_ParamVarChar" "d_str40") RETURNS(RET "d_str160", "RET_VarCHAR" "d_str60", RET_BIGINT1 BIGINT, RET_BIGINT2 BIGINT, RET_BIGINT3 BIGINT) AS declare variable "ROWs" integer; declare variable "KopierenZumFortfuehren" integer = 0; declare variable "AB_Pos" integer; declare variable "Nach_Pos" integer; declare variable "vonDokStrukturID" integer; declare variable "vonDokument_ID" integer; declare variable "nachDokStrukturID" integer; declare variable "nachDokument_ID" integer; declare variable "AuftragDokumentArt" integer; declare variable "V_Pos" integer; declare variable "NeuNummerierenAbPosition" integer = 0; /* Nummeriert ab Position Default 0 alle Zeilen neu. Wenn ab -99999 blendet er auch alle ausgeblendetten positionen wieder ein */ declare variable "AuftrDokument_StdTextArt" integer; declare variable "AuftrDokument_StdSprache" integer; declare variable "ArtikelTextArtSprachenID" integer; declare variable "AuftrDokument_BruttoPreise" D_BOOLEAN_YN; declare variable "SumNetto" "Geld"; declare variable "GesSumNetto" "Geld"; declare variable "SumBrutto" "Geld"; declare variable "GesSumBrutto" "Geld"; declare variable "MwStSaetze_ID" integer; declare variable "MwSt_Satz" "MwSt_UmrechungsGenau"; declare variable "Anz" integer; declare variable "Temp_Int" integer; declare variable "Temp_AtaffelPreismenge" "StaffelPreisMenge"; declare variable "DokumentDatum" date; declare variable "V_OffeneMenge" "Mengen"; declare variable "V_ZwSummePosStart" integer; declare variable "V_ZwSummePosEnd" integer; declare variable "V_SummenID" integer; declare variable "V_ADP_ZS_Ausgeschnitten" D_BOOLEAN_YN; declare variable "V_ADP_ZS_Reihenfolge" integer; declare variable "V_ADP_ZS_Positionen_ID" bigint; declare variable "V_Positionen_ID" bigint; declare variable "V_ADP_ZS_DokumentID" integer; declare variable "V_ADP_ZS_AbgeleitetVonPosID" bigint; declare variable "V_ADP_ZS_AbgeleitetVonDokumArt" integer; declare variable "V_ADP_ZS_DokStrukturID" integer; declare variable "V_ADP_ZS_Option" integer; declare variable "V_ADP_ZS_Kurztext" integer; declare variable "V_ADP_ZS_Art" integer; declare variable "V_ADP_ZS_PositionsText" "PositionsNrText" collate UNICODE_NUM; declare variable "V_ADP_ZS_Text" "d_ArtikelText"; declare variable "V_ADP_ZS_LangText" "d_BLOB_RTFText"; declare variable "V_ADP_ZS_LangTextHTML" "d_BLOB_HTML"; declare variable "V_ADP_ZS_ArtikelID" bigint; declare variable "V_ADP_ZS_ArtikelVersion" integer; declare variable "V_New_ADP_ZS_ArtikelVersion" integer; declare variable "V_UpdateToNewestArtikelText" D_BOOLEAN_YN; declare variable "V_ADP_ZS_Menge" "Mengen"; declare variable "V_ADP_ZS_GPreis" "Geld_genau"; declare variable "V_ADP_ZS_ArtikeOptionsPreis" "Geld_genau"; declare variable "V_ADP_ZS_PositionsRabatt" "Prozent"; declare variable "V_ADP_ZS_PreisEinheit" integer; declare variable "V_ADP_ZS_MwStSaetze_ID" integer; declare variable "V_ADP_ZS_Waehrung" integer; declare variable "V_ADP_ZS_ArtikelTextFormat" smallint; declare variable "V_ADP_ZS_LeistungErbringung" "d_Datum"; declare variable "V_ADP_ZS_BruttoPreise" "D_BOOLEAN_YNNull"; declare variable "V_ADP_ZS_MandantAtikelID" bigint; declare variable "V_ADP_ZS_Mandant_ArtikelVersion" integer; declare variable "NeDokPosEndsEinfueg" D_BOOLEAN_YN; declare variable "BrDokPosEndsEinfueg" D_BOOLEAN_YN; declare variable "DokPosEndsEinfueHLV" D_BOOLEAN_YN; declare variable "DokPosEndsEinfueHLN" D_BOOLEAN_YN; begin -- !!!W I C H T I G!!! Bitte in Beschreibungstext Hinweise lesen vor Aenderungen !!!!!! if ( :"Funktion" = 'SetAuftragDokumInAbhaengigkeit' ) then begin if ( :"I_DokumentID" is null ) then exception "Fatal_Error"'Keine DokumentID uebergeben ! '; in autonomous transaction -- Wenn es mit :"Anzahl" ( "AbfrageID" und "I_DokumentID" = 0 aufgerufen wird kann man auch alles expliziet loeschen !! do begin if ( :"Anzahl" is null ) then "Anzahl" = current_transaction; else delete from "AuftragDokumenteInAbhaengigkeit" where "AbfrageID" = :"Anzahl"; insert into "AuftragDokumenteInAbhaengigkeit" ( "AbfrageID", "AuftragDokumentID" , "InitiatorAuftragDokumentID" ) values ( :"Anzahl" , :"I_DokumentID" , :"I_DokumentID" ); RET = 'OK'; "RET_BIGINT1" = :"Anzahl"; end if ( RET = 'OK' ) then RET = :RET || ( select count(*) from "AuftragDokumenteInAbhaengigkeit" ); exit; end if ( :"Funktion" = 'ZwSpeicherAnzZeilen' ) then begin select count(*) from "AuftragsDokumPositionZwSpeicher" into :RET; suspend; exit; end -- ACHTUNG Hack wenn "I_DokumentID" NULL ist und in "I_DokStrukturID" was steht werden beide vertauscht und Alle Strukturen neu Nummeriert -- gleichzeitig werden auch alle als ausgeschnitten makierten Positionen ( also AuftrDokPosi_Position < 0 ) zurueckgesetzt und somit sichtbar. if ( :"Funktion" = 'NeuNummerieren' and :"I_DokumentID" is null and :"I_DokStrukturID" is not null ) then begin -- Alle Strukturen neu sortieren "I_DokumentID" = :"I_DokStrukturID"; RDB$SET_CONTEXT('USER_TRANSACTION', 'AuftrDokPositionen_Funktionen', '1'); -- <-- 1 = Bedutung siehe Trigger "AuftrDokPosition_Einsortieren" update "AuftragsDokumentePositionen" set "AuftrDokPosi_Position" = "AuftrDokPosi_Position" *-1 where "AuftrDokPosi_DokumentID" = :"I_DokumentID" and "AuftrDokPosi_Position" < 0; RDB$SET_CONTEXT('USER_TRANSACTION', 'AuftrDokPositionen_Funktionen', null); for select distinct "AuftrDokPosi_DokStrukturID" from "AuftragsDokumentePositionen" where "AuftrDokPosi_DokumentID" = :"I_DokumentID" order by 1 asc into :"I_DokStrukturID" do begin execute procedure "AuftrDokPositionen_Funktionen"( 'NeuNummerieren' , null , :"Anzahl" , null , :"I_DokStrukturID" , :"I_DokumentID",null,null) returning_values :RET , :"RET_VarCHAR" , :ret_bigint1, :ret_bigint2, :ret_bigint3; end exit; end if ( :"Funktion" = '-FortfuehrenKopieren' ) then begin "Funktion" = '-Kopieren'; "KopierenZumFortfuehren" = 1; end else if ( :"Funktion" = 'FortfuehrenKopieren' ) then begin "Funktion" = 'Kopieren'; "KopierenZumFortfuehren" = 1; end if ( :"Funktion" = '-Kopieren' ) then begin begin in autonomous transaction do delete from "AuftragsDokumPositionZwSpeicher"; "RET" = 'OK - Zwischenspeicher geleert. '|| row_count ||' row(s) Zeilen entfernt!'; end "Funktion" = 'Kopieren'; end RDB$SET_CONTEXT('USER_TRANSACTION', 'AuftrDokPositionen_Funktionen', '2'); begin --////////////////////// if ( :"Funktion" = 'SummenEintragen' ) then -- Der Ges.-Preis ist immer in den Positionen eingetragen. begin -- ACHTUNG Wichtig alle Summen zuerst auf 0,00 Setzen wenn Positionen geloescht wurden z.B. Position mit Mwst 7% und es gibt sonst keine bleibt die Summe von vorher bei den Summen stehen. -- Aber nur zu berechnende Feldarten auf 0 setzen -- nicht Textfelder oder aehnliches. -- Seit dem 29.11.2012 wird nur noch die neue SP AuftrDokument_Summen aufgerufen !!!! -- Diese SP darf nur eine Zeile zurueckgeben wenn "I_SummenEintragen" = 'Y' ist sonst ist etwas Faul !!! select RET from "AuftrDokument_Summen"( :"I_DokumentID" , null , 'N' , 'Y' , 1 ) -- Funktion =1 Summen eintragen into :RET; RDB$SET_CONTEXT('USER_TRANSACTION', 'AuftrDokPositionen_Funktionen', null); exit; end /* !!! ACHTUNG !!! Sortierungtrigger der Tabelle abschalten. Ansonsten gibt es riesigen Durcheinander in der Tabelle und vorallem beim loeschen verschwinden mehr Positionen als beabsichtigt. Auf jeden Fall die Richtige aktuelle Position des Eintrags erimtteln. Kann im Einzelfall je nachdem welche Aendrungen gemacht wurden durcheinander kommen. So wird immer die richtige benutz. Die Reihenfolge darf nicht durcheinander kommen. Im Grid wird nach Delete keine aktualisierung gemacht daher kann es kommen. ACHTUNG !!!! Beim Insert ist es wichtig die richtige gewuenschte Position anzugeben hier kann die alte logischerweise nicht ausgelesen werden. Bei Updates immer eine Position DB-Null uebergeben so wird automatisch die richtige genommen. Verschieben der Positionen nur ueber eine SP alles andere ist wirklich Tierischer MURKS */ select "AuftrDokPosi_Position" , "AuftrDokPosi_DokStrukturID" , "AuftrDokPosi_DokumentID" from "AuftragsDokumentePositionen" where "AuftragsDokumentePositionen_ID" = :"vonAuftrDokPos_ID" into :"AB_Pos" , :"vonDokStrukturID" ,:"vonDokument_ID"; if ( :"vonDokStrukturID" is not null and :"I_DokStrukturID" is null ) then "I_DokStrukturID" = :"vonDokStrukturID"; if ( :"vonDokument_ID" is not null and :"I_DokumentID" is null ) then "I_DokumentID" = :"vonDokument_ID"; if ( :"nachAuftrDokPos_ID" < 0 ) then -- Bei negativen Werten soll an das Ende verschoben werden Position +1 begin select "AuftrDokPosi_DokStrukturID" , "AuftrDokPosi_DokumentID" from "AuftragsDokumentePositionen" where "AuftragsDokumentePositionen_ID" = (:"nachAuftrDokPos_ID" *-1) into :"nachDokStrukturID" ,:"nachDokument_ID"; -- Nochmal sicher die letzte Position holen. select coalesce( max("AuftrDokPosi_Position") +1 , 1 ) from "AuftragsDokumentePositionen" where "AuftrDokPosi_DokumentID" = :"nachDokument_ID" and "AuftrDokPosi_DokStrukturID" is not distinct from :"nachDokStrukturID" into :"Nach_Pos"; end else select "AuftrDokPosi_Position" , "AuftrDokPosi_DokStrukturID" , "AuftrDokPosi_DokumentID" from "AuftragsDokumentePositionen" where "AuftragsDokumentePositionen_ID" = :"nachAuftrDokPos_ID" into :"Nach_Pos" , :"nachDokStrukturID" ,:"nachDokument_ID"; -- !!!!!!!!!! Hier alle Funktionen eintragen die keine :"AB_Pos" brauchen.!!!!!!!!!!!!!!!!!!!!! if ( :"AB_Pos" is null and :"Funktion" != 'PasteFromTableZwSpeicher' and :"Funktion" != 'NeuNummerieren' and :"Funktion" != 'EndSummenEinfuegen' and :"Funktion" != 'LoescheTableZwSpeicher' and :"Funktion" != 'DokumentAbschliessen') then -- hinzugefuegt 10.02.2013 begin RDB$SET_CONTEXT('USER_TRANSACTION', 'AuftrDokPositionen_Funktionen', null); RET = 'AB_Pos NULL'; exit; end if ( :"Funktion" = 'DokumentAbschliessen' ) then -- Ist eigentlich keine Positionenfunktion kommt aber trotzdem mit hier rein !!! begin RET = NULL; if ( :"I_DokumentID" is null ) then begin "RET" = 'ERROR1: DokumentID fehlt.'; RDB$SET_CONTEXT('USER_TRANSACTION', 'AuftrDokPositionen_Funktionen', null); suspend; exit; end if ( exists(select * from "AuftragsDokumentePositionen" APOS where APOS."AuftrDokPosi_Position" < 0 and APOS."AuftrDokPosi_DokumentID" = :"I_DokumentID" ) ) then exception "Fatal_Error"'Es gibt noch versteckte Positionen im Dokument !!'; -- Ist bei Koenig leider schn 3x mal vorher vorgekommen deshalb der extra check. Wie kann das im ONTransactionCommit Trigger durchgehen. Positionen verschieben im Dokument muss es ausloesen oder wo wierden noch negative PosNr verwendet ? if ( exists( select * from "AuftragsDokumente" A where A."AuftrDokument_ID" = :"I_DokumentID" and A."AuftrDokument_Nummer" is null -- Wenn schon mal abgeschlossen nicht pruefen and ( ( A."AuftrDokument_Art" between 0 and 250 ) or ( A."AuftrDokument_Art" between 10000 and 10250 )))) then -- Wenn es einen gesperrten Artikel in dem Dokument gibt wird hier der erste zurueckgeliefert und RET ist nicht NULL. Nur bei den oben im between angegebene Dokumenten pruefen RET = (select first 1 'ERROR2:' || coalesce( "AuftrDokPosi_DokStrukturID",'')||':'|| "AuftrDokPosi_Position" from "AuftragsDokumentePositionen" A join "Artikel_NoVersioning" B on A."AuftrDokPosi_Artikel_ID" = B."ArtikelNV_ID" and B."ArtikelNV_GesperrtAm" is not null left outer join "AuftragsDokumentStruktur" C on A."AuftrDokPosi_DokStrukturID" = C."AuftrDokStruktur_ID" where A."AuftrDokPosi_DokumentID" = :"I_DokumentID"); -- Pruefen ob es Artikel-Positionen ( Art <=10 ) ohne Mengenanbgabe gibt. Preis >= 0 so koenen Rabattpositioenn mit Preis < 0 ohne Menge bleiben. -- Ansonsten darf es nicht mehr sein wegen Fortfuehrproblemen. Aendderung 30.07.2014 if ( exists( select * from "AuftragsDokumentePositionen" A where A."AuftrDokPosi_DokumentID" = :"I_DokumentID" and A."AuftrDokPosi_Art" <= 10 and A."AuftrDokPosi_Menge" is null and coalesce( A."AuftrDokPosi_PosGPreis",0) >= 0 )) then exception "Fatal_Error"'Auftragspositionen ohne Mengenangabe !!'; -- Pruefen ob alle Positionsrabatte eingehalten werden !!! -- Sollte im Programm vorher schon gemacht werden hier nur zur sicherheit !! if ( 'Y' = ( select "AuftDokAuftArt_RabattPruefung" from "AuftragsDokumentAuftragsArten" where "AuftDokAuftArt_ID" = ( select coalesce( "AuftrDokument_AuftragsArt" , 0 ) from "AuftragsDokumente" where "AuftrDokument_ID" = :"I_DokumentID" )) ) then begin -- Nur wenn bei dieser "AuftrDokument_AuftragsArt" Rabatte geprueft werden sollen -- dies auch hier tun if ( :RET is null ) then RET = ( select first 1 'ERROR4:'||coalesce( "DokStrukturID",'')||':'||"AuftragDokPositionen_ID" from "AuftrDokument_Rabatte"( 'DokumentRabattePruefen' , null , :"I_DokumentID" , null , null , null , null , null , null , null , null)); end -- Die Mengen in Dokumenten verbuchen die von der SP unterstuetzt werden. -- Momentan werden nur beim ersten abchliessen die Mengen von Lieferscheinen ins Lager gebucht !!! execute procedure "ArtikelBestandBuchen"( 1, NULL , :"I_DokumentID" , NULL ); if ( :RET is not null ) then begin RDB$SET_CONTEXT('USER_TRANSACTION', 'AuftrDokPositionen_Funktionen', null); suspend; exit; end -- Ende Rabatte pruefen in autonomous transaction do begin begin execute procedure "AuftrDokPositionen_Funktionen"( 'SummenEintragen' , null , null , null , null , :"I_DokumentID",null,null ) returning_values :RET , :"RET_VarCHAR" , :ret_bigint1, :ret_bigint2, :ret_bigint3; RDB$SET_CONTEXT('USER_TRANSACTION', 'AuftrDokPositionen_Funktionen', '2'); -- Muss jetzt wiederholt gesetzt werden wegen autonomus transaction RDB$SET_CONTEXT('USER_TRANSACTION', 'SP_DocClose', :"I_DokumentID" ); -- Anzeigen das die SP benutzt wird um das Dokument zu schliessen RDB$SET_CONTEXT('USER_TRANSACTION', 'AuftrDokPositionen_Funktionen', null); update "AuftragsDokumente" A set A."AuftrDokument_Nummer" = -1 where A."AuftrDokument_ID" = :"I_DokumentID" ; -- returning funktioniert nicht -- returning "AuftrDokument_Nummer" into :ret ; select "AuftrDokument_Nummer" , "AuftrDokument_Jahr" from "AuftragsDokumente" where "AuftrDokument_ID" = :"I_DokumentID" into :RET_BIGINT1 , :RET_BIGINT2 ; if ( :RET_BIGINT1 is null and :RET_BIGINT2 is null ) then -- ## Neu eingefuegt 17.01.2012 testen ob es keine Probleme damit gibt. In der Autonomus Transaction scheint es keienn Fehler zu geben WaitTranaction so geht es dann einfach nicht und keiner weiss warum. -- Diese Exception hier auszuloesen schafft wohl abhilfe. exception "Fatal_Error"'Dokument nicht abschliessbar andere Transaktion noch aktiv'; -- Der Datenbanktrigger braucht die Dokumentsummen nicht nochmal zu berechnen delete from "OnCommitActionList" A where A."Action" = 1 and A."Param1" = :"I_DokumentID"; end when exception "MwSt_Satz_Unterschiedlich" do begin RET = 'ERROR3: Ges. Nettosumme oder MwSt.-Saetze nicht vollstaendig ausgewiesen'; end when any do begin if ( :RET is null ) then -- In das when any do kommt am ende immer auch wenn er vorher schon was hatte und oben kann man in der autonomus transaction kein suspend machen begin in autonomous transaction do insert into "ErrorLog" ( "EL_SQLErrorCode" , "EL_Text" , "EL_Angezeigt" ) values( sqlstate , 'Aufgetreten in SP von AuftrDokPositionen_Funktionen in Funktion DokumentAbschliessen.' , 'Y'); RET = 'ERROR: Unbekannter Fehler'; exception; end end end if ( position( 'ERROR' , :RET ) = 0 ) then -- Wenn KEIN Fehler passiert ist RET = 'OK:' || :RET_BIGINT1; -- Alles hat funktioniert also OK und die Nummer zurueckgeben suspend; exit; end --/////////////////////////////////////////////////////////////////////// else if ( :"Funktion" = 'EndSummenEinfuegen' ) then begin "V_Pos" = (select count(distinct "AuftrDokPosi_MwStSaetze_ID") from "AuftragsDokumentePositionen" A where A."AuftrDokPosi_DokumentID" = :"I_DokumentID" and A."AuftrDokPosi_Art" < 100 and A."AuftrDokPosi_MwStSaetze_ID" != 0 ); if ( :"V_Pos" = 0 ) then begin -- Es gab keine Positionen im Dokument deshalb gibt es auch keine Summen ret = 'NOCHANGE: Es gab keine Positionen !'; RDB$SET_CONTEXT('USER_TRANSACTION', 'AuftrDokPositionen_Funktionen', null); suspend; exit; end -- Alle alten Endsummenpositionen löschen ######################################## -- Wenn es die Positionsart 403 gibt evtl. vorherige und folgende Horizontale Linie entfernen wird grundsaetzlich so gemacht fertig. "V_Positionen_ID" = null; "V_Positionen_ID" = ( select "AuftrDokPosi_Position" from "AuftragsDokumentePositionen" A where a."AuftrDokPosi_DokumentID" = :"I_DokumentID" and a."AuftrDokPosi_Art" = 403 ); if ( :"V_Positionen_ID" is not null ) then begin delete from "VW_AuftrDokumPositionen" A where A."AuftrDokPosi_DokumentID" = :"I_DokumentID" and a."AuftrDokPosi_DokStrukturID" is null -- <--- Ist hier natuerlich wichtig das es auch in den Strukturen mit den selben Positionen Linien geben kann and a."AuftrDokPosi_Position" between :"V_Positionen_ID" -1 and :"V_Positionen_ID" +1 and A."AuftrDokPosi_Art" = 102; -- Horizontale Linie end delete from "VW_AuftrDokumPositionen" A where A."AuftrDokPosi_DokumentID" = :"I_DokumentID" and A."AuftrDokPosi_Art" in ( 300 , 401 , 402 , 403 , 410 ); select "AuftrDokument_BruttoPreise" , "AuftrDokument_Art" , "Akt_StDaten_NeDokPosEndsEinfueg","Akt_StDaten_BrDokPosEndsEinfueg", "Akt_StDaten_DokPosEndsEinfueHLV","Akt_StDaten_DokPosEndsEinfueHLN" from "AuftragsDokumente" A join "VW_Stammdaten" B on a."AuftrDokument_von_GP_ID" = B."Akt_StDaten_GP_ID" where A."AuftrDokument_ID" = :"I_DokumentID" into :"AuftrDokument_BruttoPreise" , :"AuftragDokumentArt" , :"NeDokPosEndsEinfueg" , :"BrDokPosEndsEinfueg" , :"DokPosEndsEinfueHLV" , :"DokPosEndsEinfueHLN" ; /* Diese Funktion benoetigt das automatische nummerieren in der Tabelle AuftragDokumentPositionen beim einfuegen neuer Zeilen, also Trigger in der Tabelle mit der naechsten Zeile aktivieren. WICHTIG !!!!!!!*/ RDB$SET_CONTEXT('USER_TRANSACTION', 'AuftrDokPositionen_Funktionen', null); if ( :"AuftragDokumentArt" not in ( 300 ) ) then begin if ( ( :"AuftrDokument_BruttoPreise" = 'N' and :"NeDokPosEndsEinfueg" = 'Y' ) or ( :"AuftrDokument_BruttoPreise" = 'Y' and :"BrDokPosEndsEinfueg" = 'Y' ) ) then begin if ( :"DokPosEndsEinfueHLV" = 'Y' ) then insert into "AuftragsDokumentePositionen" ( "AuftrDokPosi_DokumentID" , "AuftrDokPosi_Art" ) values ( :"I_DokumentID" , 102 ); insert into "AuftragsDokumentePositionen" ( "AuftrDokPosi_DokumentID" , "AuftrDokPosi_Art" ) values ( :"I_DokumentID" , 403 ); if ( :"DokPosEndsEinfueHLN" = 'Y' ) then insert into "AuftragsDokumentePositionen" ( "AuftrDokPosi_DokumentID" , "AuftrDokPosi_Art" ) values ( :"I_DokumentID" , 102 ); end end -- Wenn keine Position für das Dokuemnt angegeben wird wird automatisch angehaengt if ( :"V_Pos" > 1 ) then -- Gesamt Netto bur anlegen wenn mehrere MwSt-Saetze vorhanden sind ! insert into "AuftragsDokumentePositionen" ( "AuftrDokPosi_DokumentID" , "AuftrDokPosi_Art" ) values ( :"I_DokumentID" , 402 ); /* Probleme wenn das Netto der MwSt Gruppe nicht vorhanden ist kann auch der Parameter '#NETTO_MWST_SATZ' , :"NettoMwSt-Satz" nicht ersetzt werden und bleibt leer sieht nicht schoen aus deshalb so machen oder es muss jedesmal die Summe gebildet werden. Mehrere MwSt - Saetze ausweisen */ for select count(*) , "AuftrDokPosi_MwStSaetze_ID" from "AuftragsDokumentePositionen" A -- Besser die SP "AuftrDokument_MwSt_Liste" nutzen join "MwSt_Saetze" B on B."MwSt_Saetze_ID" = A."AuftrDokPosi_MwStSaetze_ID" where "AuftrDokPosi_DokumentID" = :"I_DokumentID" and "AuftrDokPosi_Art" < 100 and "AuftrDokPosi_MwStSaetze_ID" != 0 and ("AuftrDokPosi_Option" is null or "AuftrDokPosi_Option" != 1 )-- Versteckte Positionen duerfen nicht mitgezaehlt werden group by "AuftrDokPosi_MwStSaetze_ID" , "Satz" order by 1 desc , "Satz" desc -- Zuerst der MwSt-Satz mit den meisten eintraegen und dann der hoechste Satz zuerst into :"Anz" , :"V_Pos" do begin insert into "VW_AuftrDokumPositionen" ( "AuftrDokPosi_DokumentID" , "AuftrDokPosi_Art" ,"AuftrDokPosi_MwStSaetze_ID" ) values ( :"I_DokumentID" , 401 , :"V_Pos" ); insert into "VW_AuftrDokumPositionen" ( "AuftrDokPosi_DokumentID" , "AuftrDokPosi_Art" , "AuftrDokPosi_MwStSaetze_ID") values ( :"I_DokumentID" , 300 , :"V_Pos" ); end insert into "VW_AuftrDokumPositionen" ( "AuftrDokPosi_DokumentID" , "AuftrDokPosi_Art" ) values ( :"I_DokumentID" , 410 ); ret = 'OK: '|| :"V_Pos" || ' Mwst-Sätze gefunden und Endsummen eingefügt !'; /* WICHTIG !!!!!!! Unbediungt neu nummerieren aufrufen !!!!!!!!! Oben kann durch das loeschen der alten Summenpositionen evtl. ein lock entsatenden sein was nur so geschlossen werden kann. Wenn es nicht da ist fuerht folgendes zu einem Fehlverhalten: Dokument mit 2 Zeilen Positionen eine Leerzeile und dann die drei Summenzeilen. die ersten beiden kopieren und dann am ende anhaengen und die summen einfuegen taste druecken. -- Sieht noch gut aus !! Aber wenn man jetzt eine z.B. leerzeile direkt ueber der ersten Summenzeile einfuegt springt sie von dieser position weg nach oben :-( das ist dann der fehler.*/ execute procedure "AuftrDokPositionen_Funktionen"( 'NeuNummerieren' , null , null , null , null , :"I_DokumentID",null,null) returning_values :RET , :"RET_VarCHAR" , :ret_bigint1, :ret_bigint2, :ret_bigint3; suspend; end --///////////////////////////////////////////////// else if ( ( :"Funktion" = 'ZeilenVerschieben' ) -- Nur in der Selben Dokumentstruktur !!! and ( :"vonDokStrukturID" is not distinct from :"nachDokStrukturID") ) then -- nur in der selben Dokumentstruktur verschieben begin if ( ( :"Nach_Pos" < :"AB_Pos" ) ) then begin update "AuftragsDokumentePositionen" set "AuftrDokPosi_Position" = "AuftrDokPosi_Position" + :"Anzahl" where "AuftrDokPosi_DokumentID" = :"vonDokument_ID" and "AuftrDokPosi_DokStrukturID" is not distinct from :"vonDokStrukturID" and "AuftrDokPosi_Position" >= :"Nach_Pos"; select "AuftrDokPosi_Position" from "AuftragsDokumentePositionen" where "AuftragsDokumentePositionen_ID" = :"vonAuftrDokPos_ID" into :"AB_Pos" ; for select "AuftragsDokumentePositionen_ID" from "AuftragsDokumentePositionen" where "AuftrDokPosi_DokumentID" = :"vonDokument_ID" and "AuftrDokPosi_DokStrukturID" is not distinct from :"vonDokStrukturID" and "AuftrDokPosi_Position" >= :"AB_Pos" order by "AuftrDokPosi_Position" rows :"Anzahl" into :"vonAuftrDokPos_ID" do begin update "AuftragsDokumentePositionen" set "AuftrDokPosi_Position" = :"Nach_Pos" where "AuftragsDokumentePositionen_ID" = :"vonAuftrDokPos_ID"; "Nach_Pos" = :"Nach_Pos"+1; end "Funktion" = 'NeuNummerieren'; -- Jetzt noch alles neu Durchsnummerieren "Anzahl" = -2147483647; -- Alle Positionen neu durchnummerieren sonst Fehler !! end else if ( :"Nach_Pos" > :"AB_Pos" ) then begin update "AuftragsDokumentePositionen" set "AuftrDokPosi_Position" = "AuftrDokPosi_Position" - :"Anzahl" where "AuftrDokPosi_DokumentID" = :"vonDokument_ID" and "AuftrDokPosi_DokStrukturID" is not distinct from :"vonDokStrukturID" and "AuftrDokPosi_Position" <= :"Nach_Pos"; select "AuftrDokPosi_Position" from "AuftragsDokumentePositionen" where "AuftragsDokumentePositionen_ID" = :"vonAuftrDokPos_ID" into :"AB_Pos" ; "Nach_Pos" = ( :"Nach_Pos" - :"Anzahl" ) +1; for select "AuftragsDokumentePositionen_ID" from "AuftragsDokumentePositionen" where "AuftrDokPosi_DokumentID" = :"vonDokument_ID" and "AuftrDokPosi_DokStrukturID" is not distinct from :"vonDokStrukturID" and "AuftrDokPosi_Position" >= :"AB_Pos" order by "AuftrDokPosi_Position" rows :"Anzahl" into :"vonAuftrDokPos_ID" do begin update "AuftragsDokumentePositionen" set "AuftrDokPosi_Position" = :"Nach_Pos" where "AuftragsDokumentePositionen_ID" = :"vonAuftrDokPos_ID"; "Nach_Pos" = :"Nach_Pos"+1; end "Funktion" = 'NeuNummerieren'; -- Jetzt noch alles neu Durchsnummerieren "Anzahl" = -2147483647; -- Alle Positionen neu durchnummerieren sonst Fehler !! end else begin RDB$SET_CONTEXT('USER_TRANSACTION', 'AuftrDokPositionen_Funktionen', null); RET = 'Positionsfehler'; exit; end end -- Ende Verschieben --///////////////////////////////////// else if ( :"Funktion" = 'PasteFromTableZwSpeicher' ) then begin -- Alle Positionen von der Tabelle "AuftragsDokumPositionZwSpeicher" in uebergebenes Dokument einfuegen if ( :"Nach_Pos" is null ) then begin "Nach_Pos" =1; "nachDokStrukturID" = :"I_DokStrukturID"; "nachDokument_ID" = :"I_DokumentID"; end select "AuftrDokument_StdTextArt" , "AuftrDokument_StdSprache" , "AuftrDokument_BruttoPreise" from "AuftragsDokumente" A where A."AuftrDokument_ID" = :"nachDokument_ID" into :"AuftrDokument_StdTextArt" , :"AuftrDokument_StdSprache" , :"AuftrDokument_BruttoPreise" ; if ( exists( select * from "AuftragsDokumPositionZwSp_NurTr" ) ) then begin select count(*) from "AuftragsDokumPositionZwSp_NurTr" -- Das Verschieben in Dokumeneten hat immer vorrang im Programm darauf achten. into :"Anzahl"; -- Also wenn in der Tabelle was vorhanden ist dann soll es an diese Stelle verschoben werden. if ( :"Nach_Pos" < ( select coalesce( max("AuftrDokPosi_Position") +1 , 1 ) from "AuftragsDokumentePositionen" where "AuftrDokPosi_DokumentID" = :"nachDokument_ID" and "AuftrDokPosi_DokStrukturID" is not distinct from :"nachDokStrukturID" )) then begin -- es wird nicht ans ende angehaengt sondern mitten rein kopiert. Somit stoerende Positionen nach unten verschieben update "AuftragsDokumentePositionen" set "AuftrDokPosi_Position" = "AuftrDokPosi_Position" + :"Anzahl" where "AuftrDokPosi_DokumentID" = :"vonDokument_ID" and "AuftrDokPosi_DokStrukturID" is not distinct from :"vonDokStrukturID" and "AuftrDokPosi_Position" >= :"Nach_Pos"; end end else begin select count(*) from "AuftragsDokumPositionZwSpeicher" into :"Anzahl"; if ( :"Nach_Pos" < ( select coalesce( max("AuftrDokPosi_Position") +1 , 1 ) from "AuftragsDokumentePositionen" where "AuftrDokPosi_DokumentID" = :"nachDokument_ID" and "AuftrDokPosi_DokStrukturID" is not distinct from :"nachDokStrukturID" )) then begin -- es wird nicht ans ende angehaengt sondern mitten rein kopiert. Somit stoerende Positionen nach unten verschieben update "AuftragsDokumentePositionen" set "AuftrDokPosi_Position" = "AuftrDokPosi_Position" + :"Anzahl" where "AuftrDokPosi_DokumentID" = :"vonDokument_ID" and "AuftrDokPosi_DokStrukturID" is not distinct from :"vonDokStrukturID" and "AuftrDokPosi_Position" >= :"Nach_Pos"; end end "V_Pos" = 1; "Nach_Pos" = :"Nach_Pos" -1; if ( exists( select * from "AuftragsDokumPositionZwSp_NurTr" )) then begin -- Die Daten wurden ausgeschnitten zum verschieben in diesem Fall diese Daten an anderer Position einfuegen. while( :"V_Pos" <= :"Anzahl" ) do begin update "AuftragsDokumentePositionen" A set A."AuftrDokPosi_DokStrukturID" = :"nachDokStrukturID" , "AuftrDokPosi_Position" = :"Nach_Pos" + :"V_Pos" where A."AuftragsDokumentePositionen_ID" = ( select "ADP_ZS_Positionen_ID" from "AuftragsDokumPositionZwSp_NurTr" where "ADP_ZS_Reihenfolge" = :"V_Pos" ) and A."AuftrDokPosi_DokumentID" = :"nachDokument_ID"; "V_Pos" = :"V_Pos" + 1; end -- So jetzt noch alle Positionen in den beteiligten strukturen neu sortieren for select distinct "ADP_ZS_DokStrukturID" from "AuftragsDokumPositionZwSp_NurTr" into :"nachDokStrukturID" do begin execute procedure "AuftrDokPositionen_Funktionen"( 'NeuNummerieren' , ( select first 1 "AuftragsDokumentePositionen_ID" from "AuftragsDokumentePositionen" where "AuftrDokPosi_DokStrukturID" is not distinct from :"nachDokStrukturID" and "AuftrDokPosi_DokumentID" = :"nachDokument_ID" ) , 1 ,null ,null , null,null,null ) returning_values :RET , :"RET_VarCHAR" , :ret_bigint1, :ret_bigint2, :ret_bigint3 ; end delete from "AuftragsDokumPositionZwSp_NurTr"; -- Jetzt noch alle eintraege aus dem Zwischenspeicher entfernen. "RET" = 'OK - Ausgeschnittene Eintr. eingef. '; end else -- Es war eine normale Paste aktion aus der Globalen ZwischenSpeicherTabelle. begin -- Achtung hierbei muesen auch alle Texte aus der Tabelle "AuftrDokum_TextArtenSprachen" zu den neuen Positionen kopiert werden. "AuftragDokumentArt" = ( select "AuftrDokument_Art" from "AuftragsDokumente" A where A."AuftrDokument_ID" = :"nachDokument_ID" ); "Nach_Pos" = :"Nach_Pos" + :"V_Pos"; begin for select "ADP_ZS_Positionen_ID", "ADP_ZS_AbgeleitetVonPosID" , "ADP_ZS_AbgeleitetVonDokumentArt", "ADP_ZS_Option" , "ADP_ZS_Kurztext" ,"ADP_ZS_Art" , "ADP_ZS_PositionsText" , "ADP_ZS_Text" , "ADP_ZS_LangText" , "ADP_ZS_LangTextHTML" , "ADP_ZS_ArtikelTextFormat" , "ADP_ZS_ArtikelID" , "ADP_ZS_ArtikelVersion" , "ADP_ZS_Menge" ,"ADP_ZS_GPreis", "ADP_ZS_ArtikeOptionsPreis" , "ADP_ZS_PositionsRabatt" , "ADP_ZS_BruttoPreise" , "ADP_ZS_PreisEinheit" , "ADP_ZS_MwStSaetze_ID" , "ADP_ZS_Waehrung" ,"ADP_ZS_LeistungErbringung" ,"Satz" , "ADP_ZS_MandantAtikelID" , "ADP_ZS_Mandant_ArtikelVersion" from "AuftragsDokumPositionZwSpeicher" A left outer join "MwSt_Saetze" B on A."ADP_ZS_MwStSaetze_ID" = B."MwSt_Saetze_ID" order by "ADP_ZS_Reihenfolge" into :"V_ADP_ZS_Positionen_ID" , :"V_ADP_ZS_AbgeleitetVonPosID" , :"V_ADP_ZS_AbgeleitetVonDokumArt", :"V_ADP_ZS_Option" , :"V_ADP_ZS_Kurztext" , :"V_ADP_ZS_Art" , :"V_ADP_ZS_PositionsText", :"V_ADP_ZS_Text" , :"V_ADP_ZS_LangText" , :"V_ADP_ZS_LangTextHTML" , :"V_ADP_ZS_ArtikelTextFormat" ,:"V_ADP_ZS_ArtikelID" ,:"V_ADP_ZS_ArtikelVersion" , :"V_ADP_ZS_Menge" , :"V_ADP_ZS_GPreis" , :"V_ADP_ZS_ArtikeOptionsPreis" , :"V_ADP_ZS_PositionsRabatt" , :"V_ADP_ZS_BruttoPreise" ,:"V_ADP_ZS_PreisEinheit" , :"V_ADP_ZS_MwStSaetze_ID" , :"V_ADP_ZS_Waehrung" , :"V_ADP_ZS_LeistungErbringung" , :"MwSt_Satz" , :"V_ADP_ZS_MandantAtikelID" , :"V_ADP_ZS_Mandant_ArtikelVersion" do begin if ( :"V_ADP_ZS_AbgeleitetVonPosID" is not null ) then begin -- Wenn die Position fortgefuehrt wird "V_OffeneMenge" = ( select ("oOffeneMenge") from "AuftrDokumentSummenUebersicht"( null , 'NULL,' , :"V_ADP_ZS_AbgeleitetVonPosID" , 1 , :"V_ADP_ZS_AbgeleitetVonDokumArt" , :"AuftragDokumentArt" , null )); -- exception "Fatal_Error" 'Abg.VonPosID=' || coalesce( "V_ADP_ZS_AbgeleitetVonPosID" , 'NULL') || 'Abg.VonDokumentArt=' || coalesce( "V_ADP_ZS_AbgeleitetVonDokumArt" , 'NULL') || 'V_OffeneMenge='|| coalesce( "V_OffeneMenge" , 'NULL'); "V_UpdateToNewestArtikelText" = 'N'; if ( :"V_OffeneMenge" <= 0 ) then begin "V_ADP_ZS_GPreis" = 0; "V_ADP_ZS_Menge" = :"V_OffeneMenge"; -- Anzeigen wieviel die Menge im minus ist schadet bestimmt nicht end else begin if ( :"V_ADP_ZS_GPreis" != 0 and :"V_ADP_ZS_GPreis" is not null ) then "V_ADP_ZS_GPreis" = ( :"V_ADP_ZS_GPreis" / :"V_ADP_ZS_Menge") * :"V_OffeneMenge" ; "V_ADP_ZS_Menge" = :"V_OffeneMenge"; end end else -- Artikel Position wurde einfach nur kopiert nicht fortgefuehrt jetzt auch auf die neuste Artikelversion wechseln wenn Art = 1 !! begin if ( :"V_ADP_ZS_Art" = 1 ) then -- Wenn Art =2 dann ist es eh nicht mehr der Artikeltext und wir lassen die Finger von Version und Art "V_UpdateToNewestArtikelText" = 'Y'; end -- Wenn noetig Brutto/Nettopreise umwnadeln if ( :"AuftrDokument_BruttoPreise" is distinct from :"V_ADP_ZS_BruttoPreise" ) then -- wenn :"AuftrDokument_BruttoPreise" NULL einfach drueber gehen sollte aber nicht sein evtl. aendern !!! begin -- Die Preise noch umrechnen -- alle preise werden ungerundet mit voller genauigkeit zurueckgegeben !!! -- Wen der MwSt-Satz nicht vorhanden ist und es ein Artikel aus dem Katalog ist nehemn wir die std. MwSt-Gruppe des Artikel und suchen den passenden satz fuer das Dokument in das die Positionen eingefuegt werden. -- Der Satz darf nur fehlen wenn es keine vorhanden Position war dann ist es wohl eine Position aus dem Suchen Dialog der keine MwSt Saetze einfuegt !!!! if ( ( :"MwSt_Satz" is null and :"V_ADP_ZS_GPreis" is not null ) or ( :"MwSt_Satz" is null and :"V_ADP_ZS_ArtikelID" is null )) then exception "Fatal_Error"'Kein MwSt-Satz vorhanden aber umrechnung noetig !'; /* Hier ist es wohl besser immer die Version zu nehmen die auch tatsaechlich uebergeben wurde. Immer den neuseten Satz zurueckgeben oder evtl. auf das Positionsdatum ausgerichtet. Da es nur aus dem Artikelsuche Dialog kommen kann einfach den neusten MwSt.-Satz nehemen. Auf NULL abfragen ist wohl nicht noetig multiplizieren geht immer ohne exception und was NULL ist bleibt NULL !!! ACHTUNG !!! der MwSt-Satz muss hier von der Position von der die Position abstammt sein, damit die Umrechung ueberhaupt richtiug sein kann. Auch noch darueber nachdenken was passiert wenn sich der Satz geaendert hat durch eine MwST erhoehung im naechsten Jahr.*/ if ( :"V_ADP_ZS_BruttoPreise" = 'Y' and :"AuftrDokument_BruttoPreise" = 'N' ) then begin -- Von Brutto nach Netto umrechnen "V_ADP_ZS_GPreis" = :"V_ADP_ZS_GPreis" * (1/cast((( :"MwSt_Satz" / 100 )+1)as double precision)); "V_ADP_ZS_ArtikeOptionsPreis" = :"V_ADP_ZS_ArtikeOptionsPreis" * (1/cast((( :"MwSt_Satz" / 100 )+1)as double precision)); end else if ( :"V_ADP_ZS_BruttoPreise" = 'N' and :"AuftrDokument_BruttoPreise" = 'Y' ) then begin -- Von Netto nach Brutto umrechnen "V_ADP_ZS_GPreis" = :"V_ADP_ZS_GPreis" * (( :"MwSt_Satz" / 100 )+1); "V_ADP_ZS_ArtikeOptionsPreis" = :"V_ADP_ZS_ArtikeOptionsPreis" * (( :"MwSt_Satz" / 100 )+1); end else -- Sollte nicht passieren exception "Fatal_Error"'SP "ArtikelEkVkPreis" Brutto/Netto Fehler !'; end insert into "AuftragsDokumentePositionen" ( "AuftrDokPosi_DokumentID" , "AuftrDokPosi_AbgeleitetVonPos" ,"AuftrDokPosi_DokStrukturID" , "AuftrDokPosi_Option" , "AuftrDokPosi_Kurztext" , "AuftrDokPosi_Art" , "AuftrDokPosi_Position" , "AuftrDokPosi_PositionsText" , "AuftrDokPosi_Artikel_ID" , "AuftrDokPosi_ArtikelVersion" , "AuftrDokPosi_Menge", "AuftrDokPosi_GPreis" , "AuftrDokPosi_ArtikeOptionsPreis" , "AuftrDokPosi_PositionsRabatt" , "AuftrDokPosi_PreisEinheit" , "AuftrDokPosi_MwStSaetze_ID" , "AuftrDokPosi_Waehrung" , "AuftrDokPosi_LeistungErbringung") values ( :"nachDokument_ID" , :"V_ADP_ZS_AbgeleitetVonPosID" , :"nachDokStrukturID" , :"V_ADP_ZS_Option" , :"V_ADP_ZS_Kurztext" , :"V_ADP_ZS_Art" , :"Nach_Pos" , :"V_ADP_ZS_PositionsText", :"V_ADP_ZS_ArtikelID" , iif( :"V_UpdateToNewestArtikelText" = 'Y' , null , :"V_ADP_ZS_ArtikelVersion" ), :"V_ADP_ZS_Menge" , :"V_ADP_ZS_GPreis", :"V_ADP_ZS_ArtikeOptionsPreis" , :"V_ADP_ZS_PositionsRabatt" , :"V_ADP_ZS_PreisEinheit" , :"V_ADP_ZS_MwStSaetze_ID" , :"V_ADP_ZS_Waehrung" , :"V_ADP_ZS_LeistungErbringung" ) returning "AuftragsDokumentePositionen_ID" , "AuftrDokPosi_ArtikelVersion" into :"V_Positionen_ID" , :"V_New_ADP_ZS_ArtikelVersion"; -- Wenn vorhanden auch die Angaben aus "AuftragDokumentPosition_Einkauf" kopieren. insert into "AuftragDokumentPosition_Einkauf" ( "AuftragsDokumentePositionenE_ID" , "AuftrDokPosiEk_Artikel_ID" , "AuftrDokPosiEk_ArtikelVersion" ) select :"V_Positionen_ID" , "AuftrDokPosiEk_Artikel_ID" , "AuftrDokPosiEk_ArtikelVersion" from "AuftragDokumentPosition_Einkauf" A where A."AuftragsDokumentePositionenE_ID" = :"V_ADP_ZS_Positionen_ID"; if ( :"V_ADP_ZS_MandantAtikelID" is not null ) then begin -- Bei Einkaufsdokumenten evtl. noch weitere Felder in externe Tabelle anlegen insert into "AuftragDokumentPosition_Einkauf" ( "AuftragsDokumentePositionenE_ID" , "AuftrDokPosiEk_Artikel_ID" , "AuftrDokPosiEk_ArtikelVersion" ) values ( :"V_Positionen_ID" , :"V_ADP_ZS_MandantAtikelID" , :"V_ADP_ZS_Mandant_ArtikelVersion" ); end /* Texte aus der Tabelle "AuftrDokum_TextArtenSprachen" der alten Positionen fuer die neuen einfach uebernehemn. Auch wenn das neue Dokument noch nicht alle Sprachen unterstuetzt wird hier doch alles kopiert und fertig ist es !!! Pruefen ob der Artikel aus einer Auftragsdokumentposition kommt oder direkt aus der Artikeldatenbank.*/ if ( :"V_ADP_ZS_Positionen_ID" is null ) then begin -- Es war keine Position sondern evtl. ein neuer einzufuegender Artikel if ( :"V_ADP_ZS_ArtikelID" is null ) then -- Darf an dieser Stelle nicht passieren. Versuch einen Artikel einzufuegen ohne ArtikelID exception "Fatal_Error"'Artikelposition einfuegen ohne "Artikel" !'; if ( :"V_ADP_ZS_Art" is distinct from 1 and :"V_ADP_ZS_Art" is distinct from 2 ) then -- Es ist keine Artikelposition also irgendetwas ist faul -- Fehler melden exception "Fatal_Error"'Artikelposition einfuegen aber Positionsart nicht in (1,2) !'; if ( :"V_ADP_ZS_ArtikelVersion" is null ) then exception "Fatal_Error"'Keine Version des Artikels vorhanden in der Zwischenablage !'; -- Hier sollte man auch die Tabelle "Akt_ArtikelTextArtenSprachen" verwenden koennen geht schneller da es direkt nur Aktuelle Artikel sind !! "ArtikelTextArtSprachenID" = ( select first 1 "ArtikelTextArtenSprachenID" from "ArtikelTextArtenSprachen" A where A."ATAS_ArtikelID" = :"V_ADP_ZS_ArtikelID" and A."ATAS_SprachenID" = :"AuftrDokument_StdSprache" and A."ATAS_Artikel_Verison" >= :"V_ADP_ZS_ArtikelVersion" and A."ATAS_TextArtID" = :"AuftrDokument_StdTextArt" order by "ATAS_Artikel_Verison" asc ); if ( :"ArtikelTextArtSprachenID" is null ) then exception "Fatal_Error"'Keinen passenden Artikeltext fuer dieses Dokument gefunden !'; insert into "AuftrDokum_TextArtenSprachen" ( "ADTAS_AuftrDokumentPositionenID" , "ADTAS_SprachenID" ,"ADTAS_TextArtID", "ADTAS_ArtikelTextArtSprachenID" , "ADTAS_AuftrDokPosiArt" ) values ( :"V_Positionen_ID" , :"AuftrDokument_StdSprache" , :"AuftrDokument_StdTextArt" , :"ArtikelTextArtSprachenID" , :"V_ADP_ZS_Art" ); end else begin insert into "AuftrDokum_TextArtenSprachen" ( "ADTAS_AuftrDokumentPositionenID" , "ADTAS_SprachenID" ,"ADTAS_TextArtID", "ADTAS_ArtikelTextArtSprachenID" , "ADTAS_AuftrDokPosiArt" , "ADTAS_Kurztext" , "ADTAS_Text" , "ADTAS_LangText", "ADTAS_LangTextHTML" ,"ADTAS_SuchText" , "ADTAS_ArtikelTextFormat") select :"V_Positionen_ID" , "ADTAS_SprachenID" ,"ADTAS_TextArtID", -- Wenn die neuste Artikelversion und somit der neuste Artikeltext verwendet werden soll iif( :"V_UpdateToNewestArtikelText" = 'Y' and :"V_New_ADP_ZS_ArtikelVersion" is distinct from :"V_ADP_ZS_ArtikelVersion" , ( select first 1 "ArtikelTextArtenSprachenID" from "ArtikelTextArtenSprachen" A -- Tabelle "Akt_ArtikelTextArtenSprachen" verwenden where A."ATAS_ArtikelID" = :"V_ADP_ZS_ArtikelID" and A."ATAS_SprachenID" = :"AuftrDokument_StdSprache" and A."ATAS_Artikel_Verison" >= :"V_New_ADP_ZS_ArtikelVersion" and A."ATAS_TextArtID" = :"AuftrDokument_StdTextArt" order by "ATAS_Artikel_Verison" asc ) , "ADTAS_ArtikelTextArtSprachenID" ), -- Wenn der alte Artikeltext verwendet werden muss nimmt er Ihn einfach wie er eh schon da ist. "ADTAS_AuftrDokPosiArt" , "ADTAS_Kurztext" , "ADTAS_Text" , "ADTAS_LangText", "ADTAS_LangTextHTML" ,"ADTAS_SuchText" , "ADTAS_ArtikelTextFormat" from "AuftrDokum_TextArtenSprachen" A where a."ADTAS_AuftrDokumentPositionenID" = :"V_ADP_ZS_Positionen_ID"; end "Nach_Pos" = :"Nach_Pos" + 1; end end "RET" = 'OK - Kopierte Eintr. eingef. '; end "Anzahl"=0; -- Zuruecksetzen weil sie in "NeuNummerieren" verwendet wird !! "Funktion" = 'NeuNummerieren'; -- Jetzt noch alles neu Durchsnummerieren -- sonst kam es zu falsch durchnummerierten Dokumenten end --////////////////////////////////////////////////////////////////////////////////////////////// else if ( :"Funktion" = 'Kopieren' ) then begin -- :"KopierenZumFortfuehren" auf != 0 setzen um jetzige "AuftragsDokumentePositionen_ID" in das Feld "V_ADP_ZS_AbgeleitetVonPosID" zu kopieren ! --Er muss aus der aktiven Transaktion lesen und in eine neue die commited wird schreiben O:) "Temp_Int" = 0; if ( :"KopierenZumFortfuehren" != 0 ) then begin if ( (select "AuftrDokument_Version" from "AuftragsDokumente" A where A."AuftrDokument_ID" = :"vonDokument_ID" ) is null ) then exception "Fatal_Error" 'Dokument muss abgewschlossen sein um Positionen fortfuehren zu koennen !'; select "AuftrDokument_Art" , "AuftrDokument_BruttoPreise" from "AuftragsDokumente" A where A."AuftrDokument_ID" = :"vonDokument_ID" into :"AuftragDokumentArt" ,:"V_ADP_ZS_BruttoPreise" ; if ( :"AuftragDokumentArt" in ( 300,400 ) )then -- Wenn ein LS/RG Dokument Fortgefuehrt wird das Leistungsdatum mit kopieren und weitergeben auch in GS RG->GS -- Fuer Einkaufsdokumente spaeter anpassen "Temp_Int" = 1; end else "V_ADP_ZS_BruttoPreise" = ( select "AuftrDokument_BruttoPreise" from "AuftragsDokumente" A where A."AuftrDokument_ID" = :"vonDokument_ID" ); "ROWs" =0; for select "AuftragsDokumentePositionen_ID" , "AuftrDokPosi_DokumentID" , iif ( :"KopierenZumFortfuehren" = 0, null , "AuftragsDokumentePositionen_ID" ), "AuftrDokPosi_DokStrukturID" , "AuftrDokPosi_Option" , "AuftrDokPosi_Kurztext" , "AuftrDokPosi_Art" , "AuftrDokPosi_Position" , "AuftrDokPosi_PositionsText" , "AuftrDokPosi_Artikel_ID" , "AuftrDokPosi_ArtikelVersion" , "AuftrDokPosi_Menge", "AuftrDokPosi_GPreis" , "AuftrDokPosi_ArtikeOptionsPreis" , "AuftrDokPosi_PositionsRabatt" , "AuftrDokPosi_PreisEinheit" , "AuftrDokPosi_MwStSaetze_ID" , "AuftrDokPosi_Waehrung" , iif( :"Temp_Int" != 1 , null , "AuftrDokPosi_LeistungErbringung") from "AuftragsDokumentePositionen" A where "AuftrDokPosi_DokumentID" = :"vonDokument_ID" and "AuftrDokPosi_Art" not in ( 300,401,402,403,410 ) -- 02.09.2013 Summenpositionen immer aussen vor lassen !!! Gibt auch Probleme beim einfuegen der Texte da er beim Paste den Text kopiert und der Text aus der Vorlage generiert wird -- dann wird der Uniques "UNQ_AuftrDokum_TextArtenSprach" verletzt ! and "AuftrDokPosi_DokStrukturID" is not distinct from :"vonDokStrukturID" and "AuftrDokPosi_Position" between :"AB_Pos" and :"Nach_Pos" order by "AuftrDokPosi_Position" -- WICHTIG muss sein sonst kann nicht fuer die Reihenfolge garantiert werden. into :"V_ADP_ZS_Positionen_ID" , :"V_ADP_ZS_DokumentID" , :"V_ADP_ZS_AbgeleitetVonPosID" , :"V_ADP_ZS_DokStrukturID" , :"V_ADP_ZS_Option" , :"V_ADP_ZS_Kurztext" , :"V_ADP_ZS_Art" , :"V_ADP_ZS_Reihenfolge" , :"V_ADP_ZS_PositionsText" ,:"V_ADP_ZS_ArtikelID" , :"V_ADP_ZS_ArtikelVersion" , :"V_ADP_ZS_Menge" , :"V_ADP_ZS_GPreis" , :"V_ADP_ZS_ArtikeOptionsPreis" , :"V_ADP_ZS_PositionsRabatt" , :"V_ADP_ZS_PreisEinheit" , :"V_ADP_ZS_MwStSaetze_ID" , :"V_ADP_ZS_Waehrung" , :"V_ADP_ZS_LeistungErbringung" do begin in autonomous transaction do begin "ROWs" = :"ROWs" +1; insert into "AuftragsDokumPositionZwSpeicher" ( "ADP_ZS_Positionen_ID" , "ADP_ZS_DokumentID" , "ADP_ZS_AbgeleitetVonPosID" , "ADP_ZS_AbgeleitetVonDokumentArt" , "ADP_ZS_DokStrukturID" , "ADP_ZS_Option" ,"ADP_ZS_Art" , "ADP_ZS_PositionsText" , "ADP_ZS_ArtikelID" , "ADP_ZS_ArtikelVersion" , "ADP_ZS_Menge" , "ADP_ZS_GPreis" , "ADP_ZS_ArtikeOptionsPreis" , "ADP_ZS_PositionsRabatt", "ADP_ZS_BruttoPreise", "ADP_ZS_PreisEinheit" , "ADP_ZS_MwStSaetze_ID" , "ADP_ZS_Waehrung" , "ADP_ZS_LeistungErbringung" ) values ( :"V_ADP_ZS_Positionen_ID" , :"V_ADP_ZS_DokumentID" , :"V_ADP_ZS_AbgeleitetVonPosID" , :"AuftragDokumentArt" , :"V_ADP_ZS_DokStrukturID" , :"V_ADP_ZS_Option" , :"V_ADP_ZS_Art" , :"V_ADP_ZS_PositionsText" , :"V_ADP_ZS_ArtikelID" ,:"V_ADP_ZS_ArtikelVersion" , :"V_ADP_ZS_Menge" , :"V_ADP_ZS_GPreis" , :"V_ADP_ZS_ArtikeOptionsPreis" , :"V_ADP_ZS_PositionsRabatt", :"V_ADP_ZS_BruttoPreise" , :"V_ADP_ZS_PreisEinheit" , :"V_ADP_ZS_MwStSaetze_ID" , :"V_ADP_ZS_Waehrung" , :"V_ADP_ZS_LeistungErbringung"); end end "RET" = 'OK -kopiert '|| :"ROWs" ||' row(s) Zeile '||:"AB_Pos" || '-'||:"Nach_Pos" || 'Zeilen in Zw-Ablage' || (select count(*) from "AuftragsDokumPositionZwSpeicher"); -- exception "Fatal_Error" :RET; -- Koennte immer hier kommen ;-) Daten sind ja eh kopiert :P end --///////////////////////////////////////////////////////////// else if ( :"Funktion" = 'VerschiebenImGanzenDokument' ) then begin /* VerschiebenImGanzenDokument kopiert nur in die Zwischenablage mit Feld "ADP_ZS_Ausgeschnitten" = Y aber Im Programm werden negative Positionen nicht angezeigt so werden sie dann ausgeblendet. Zuerst auch den Zwischenspeicher leeren wenn nicht schon was im Zwischenspeicher ist von dieser Funktion dehalb abfrage auf < 0 Die Daten werden nur in den Zwischenspeicher uebregeben um die Reihenfolge wie sie ausgeschnitten wurden beim einfuegen beruecksichtigen zu koennen*/ insert into "AuftragsDokumPositionZwSp_NurTr" ( "ADP_ZS_Ausgeschnitten" , "ADP_ZS_Positionen_ID" , "ADP_ZS_DokumentID" , "ADP_ZS_AbgeleitetVonPosID" , "ADP_ZS_DokStrukturID" , "ADP_ZS_Option" , "ADP_ZS_Art" , "ADP_ZS_PositionsText" , "ADP_ZS_ArtikelID" , "ADP_ZS_ArtikelVersion" , "ADP_ZS_Menge" , "ADP_ZS_GPreis", "ADP_ZS_ArtikeOptionsPreis" , "ADP_ZS_PositionsRabatt" , "ADP_ZS_PreisEinheit" , "ADP_ZS_MwStSaetze_ID" , "ADP_ZS_Waehrung" ) select 'Y' , "AuftragsDokumentePositionen_ID" , "AuftrDokPosi_DokumentID" , "AuftrDokPosi_AbgeleitetVonPos" , "AuftrDokPosi_DokStrukturID" , "AuftrDokPosi_Option" , "AuftrDokPosi_Art" , "AuftrDokPosi_PositionsText" , "AuftrDokPosi_Artikel_ID" , "AuftrDokPosi_ArtikelVersion" , "AuftrDokPosi_Menge", "AuftrDokPosi_GPreis", "AuftrDokPosi_ArtikeOptionsPreis" , "AuftrDokPosi_PositionsRabatt" , "AuftrDokPosi_PreisEinheit" , "AuftrDokPosi_MwStSaetze_ID" , "AuftrDokPosi_Waehrung" from "AuftragsDokumentePositionen" where "AuftrDokPosi_DokumentID" = :"vonDokument_ID" and "AuftrDokPosi_DokStrukturID" is not distinct from :"vonDokStrukturID" and "AuftrDokPosi_Position" between :"AB_Pos" and :"Nach_Pos" order by "AuftrDokPosi_Position"; -- so wird die reihenfolge der Positionen sichergestellt update "AuftragsDokumentePositionen" set "AuftrDokPosi_Position" = "AuftrDokPosi_Position" * -1 where "AuftrDokPosi_DokumentID" = :"vonDokument_ID" and "AuftrDokPosi_DokStrukturID" is not distinct from :"vonDokStrukturID" and "AuftrDokPosi_Position" between :"AB_Pos" and :"Nach_Pos"; "RET" = 'OK - Zum verschieben makiert. '|| row_count ||' row(s) Zeile '||:"AB_Pos" || '-'||:"Nach_Pos"; end --////////////////////////////////////////////////////////////////// else if ( :"Funktion" = 'LoescheTableZwSpeicher' ) then begin -- Die Globale Tabelle Zwischenspeicher loeschen die ander wird eh automatisch nach abschluss der Aktion geloescht in autonomous transaction do begin delete from "AuftragsDokumPositionZwSpeicher"; "RET" = 'OK - Zwischenspeicher geleert. '|| row_count ||' row(s) Zeilen entfernt!'; end end --/////////////////////////////////////////////////////////////// else if ( :"Funktion" = 'Delete' ) then begin delete from "VW_AuftrDokumPositionen" where "AuftrDokPosi_DokumentID" = :"vonDokument_ID" and "AuftrDokPosi_DokStrukturID" is not distinct from :"vonDokStrukturID" and ( "AuftrDokPosi_Position" between :"AB_Pos" and :"Nach_Pos" ); "RET" = 'OK -deleted '|| row_count ||' row(s) Zeile '||:"AB_Pos" || '-'||:"Nach_Pos"; "Anzahl"=0; -- Zuruecksetzen weil sie in "NeuNummerieren" verwendet wird !! "Funktion" = 'NeuNummerieren'; -- Jetzt noch alles neu Durchsnummerieren end --/////////////////////////////////////////////////////////////////////// else if ( :"Funktion" = 'ArtkNachStaffelungDuplizieren' ) then -- Fuegt den angewaehlten Artikel so oft ein wie es in der Staffelpreistabelle Staffelungen gibt begin -- und settzt die Menge entsprechend der Staffelung ein "AuftragDokumentArt" = ( select "AuftrDokument_Art" from "AuftragsDokumente" A where A."AuftrDokument_ID" = :"I_DokumentID" ); if ( :"AuftragDokumentArt" < 10000 ) then -- Ausgangsdokumente VK-Staffelpreise begin "Anzahl" = ( select count(*) from "AuftragsDokumentePositionen" A join "ArtVkStaffelPreise" B on A."AuftrDokPosi_Artikel_ID" = B."ArtVkStPr_Artikel_ID" where A."AuftragsDokumentePositionen_ID" = :"vonAuftrDokPos_ID" and B."ArtVkStPr_Ab" not in ( select coalesce( D."AuftrDokPosi_Menge" , 0 ) from "AuftragsDokumentePositionen" D where D."AuftrDokPosi_DokumentID" = A."AuftrDokPosi_DokumentID" and D."AuftrDokPosi_DokStrukturID" is not distinct from A."AuftrDokPosi_DokStrukturID" and D."AuftrDokPosi_Artikel_ID" = A."AuftrDokPosi_Artikel_ID" )); end else begin -- Eingangsdokumente EK-Staffelpreise "Anzahl" = ( select count(*) from "AuftragsDokumentePositionen" A join "ArtEkStaffelPreise" B on A."AuftrDokPosi_Artikel_ID" = B."ArtEkStPr_Artikel_ID" where A."AuftragsDokumentePositionen_ID" = :"vonAuftrDokPos_ID" and B."ArtEkStPr_Ab" not in ( select coalesce( D."AuftrDokPosi_Menge" , 0 ) from "AuftragsDokumentePositionen" D where D."AuftrDokPosi_DokumentID" = A."AuftrDokPosi_DokumentID" and D."AuftrDokPosi_DokStrukturID" is not distinct from A."AuftrDokPosi_DokStrukturID" and D."AuftrDokPosi_Artikel_ID" = A."AuftrDokPosi_Artikel_ID" )); end if ( :"Anzahl" = 0 ) then begin RDB$SET_CONTEXT('USER_TRANSACTION', 'AuftrDokPositionen_Funktionen', null); RET = 'Kein Artikel aus Artikeldatenbank oder kein Staffelpreis'; exit; end select "AuftragsDokumentePositionen_ID" , "AuftrDokPosi_DokumentID" , "AuftrDokPosi_DokStrukturID" , "AuftrDokPosi_Option" ,"AuftrDokPosi_Art" , "AuftrDokPosi_Position" , "AuftrDokPosi_PositionsText" , "AuftrDokPosi_Artikel_ID" , "AuftrDokPosi_ArtikelVersion" , "AuftrDokPosi_PreisEinheit" , "AuftrDokPosi_MwStSaetze_ID" , "AuftrDokPosi_Waehrung" from "AuftragsDokumentePositionen" where "AuftragsDokumentePositionen_ID" = :"vonAuftrDokPos_ID" into :"V_ADP_ZS_Positionen_ID" , :"V_ADP_ZS_DokumentID" , :"V_ADP_ZS_DokStrukturID" , :"V_ADP_ZS_Option" , :"V_ADP_ZS_Art" , :"V_ADP_ZS_Reihenfolge" , :"V_ADP_ZS_PositionsText" , :"V_ADP_ZS_ArtikelID" , :"V_ADP_ZS_ArtikelVersion" , :"V_ADP_ZS_PreisEinheit" , :"V_ADP_ZS_MwStSaetze_ID" , :"V_ADP_ZS_Waehrung"; "Nach_Pos" = :"AB_Pos"+1; if ( :"Nach_Pos" < ( select coalesce( max("AuftrDokPosi_Position") +1 , 1 ) from "AuftragsDokumentePositionen" where "AuftrDokPosi_DokumentID" = :"vonDokument_ID" and "AuftrDokPosi_DokStrukturID" is not distinct from :"vonDokStrukturID" )) then begin -- es wird nicht ans ende angehaengt sondern mitten rein kopiert. Somit stoerende Positionen nach unten verschieben update "AuftragsDokumentePositionen" set "AuftrDokPosi_Position" = "AuftrDokPosi_Position" + :"Anzahl" where "AuftrDokPosi_DokumentID" = :"vonDokument_ID" and "AuftrDokPosi_DokStrukturID" is not distinct from :"vonDokStrukturID" and "AuftrDokPosi_Position" >= :"Nach_Pos"; end "Temp_Int" = 1; if ( :"AuftragDokumentArt" < 10000 ) then -- Ausgangsdokumente VK-Staffelpreise begin for select "ArtVkStPr_Ab" from "AuftragsDokumentePositionen" A join "ArtVkStaffelPreise" B on A."AuftrDokPosi_Artikel_ID" = B."ArtVkStPr_Artikel_ID" where A."AuftragsDokumentePositionen_ID" = :"vonAuftrDokPos_ID" and B."ArtVkStPr_Ab" not in ( select coalesce( D."AuftrDokPosi_Menge" , 0 ) from "AuftragsDokumentePositionen" D where D."AuftrDokPosi_DokumentID" = A."AuftrDokPosi_DokumentID" and D."AuftrDokPosi_DokStrukturID" is not distinct from A."AuftrDokPosi_DokStrukturID" and D."AuftrDokPosi_Artikel_ID" = A."AuftrDokPosi_Artikel_ID" ) order by B."ArtVkStPr_Ab" into :"Temp_AtaffelPreismenge" do begin insert into "AuftragsDokumentePositionen" ( "AuftrDokPosi_DokumentID" , "AuftrDokPosi_DokStrukturID" , "AuftrDokPosi_Option" , "AuftrDokPosi_Art" , "AuftrDokPosi_Position" , "AuftrDokPosi_Artikel_ID" , "AuftrDokPosi_ArtikelVersion" , "AuftrDokPosi_Menge" , "AuftrDokPosi_PreisEinheit" , "AuftrDokPosi_MwStSaetze_ID" , "AuftrDokPosi_Waehrung" ) values ( :"V_ADP_ZS_DokumentID" , :"V_ADP_ZS_DokStrukturID" , :"V_ADP_ZS_Option" , :"V_ADP_ZS_Art" , :"V_ADP_ZS_Reihenfolge" + :"Temp_Int" , :"V_ADP_ZS_ArtikelID" , :"V_ADP_ZS_ArtikelVersion" , :"Temp_AtaffelPreismenge" , :"V_ADP_ZS_PreisEinheit" , :"V_ADP_ZS_MwStSaetze_ID" , :"V_ADP_ZS_Waehrung" ) returning "AuftragsDokumentePositionen_ID" into :"V_Positionen_ID"; /* Texte aus der Tabelle "AuftrDokum_TextArtenSprachen" der alten Positionen fuer die neuen einfach uebernehemn. Auch wenn das neue Dokument noch nicht alle SPrachen unterstuetzt wird hier doch alles kopiert und fertig ist es !!! */ insert into "AuftrDokum_TextArtenSprachen" ( "ADTAS_AuftrDokumentPositionenID" , "ADTAS_SprachenID" ,"ADTAS_TextArtID", "ADTAS_ArtikelTextArtSprachenID" , "ADTAS_AuftrDokPosiArt" , "ADTAS_Kurztext" , "ADTAS_Text" , "ADTAS_LangText", "ADTAS_LangTextHTML" ,"ADTAS_SuchText" , "ADTAS_ArtikelTextFormat") select :"V_Positionen_ID" , "ADTAS_SprachenID" ,"ADTAS_TextArtID", "ADTAS_ArtikelTextArtSprachenID" , "ADTAS_AuftrDokPosiArt" , "ADTAS_Kurztext" , "ADTAS_Text" , "ADTAS_LangText", "ADTAS_LangTextHTML" ,"ADTAS_SuchText" , "ADTAS_ArtikelTextFormat" from "AuftrDokum_TextArtenSprachen" A where a."ADTAS_AuftrDokumentPositionenID" = :"V_ADP_ZS_Positionen_ID"; "Temp_Int" = :"Temp_Int" + 1; end end else -- Eingangsdokumente EK-Staffelpreise begin for select "ArtEkStPr_Ab" from "AuftragsDokumentePositionen" A join "ArtEkStaffelPreise" B on A."AuftrDokPosi_Artikel_ID" = B."ArtEkStPr_Artikel_ID" where A."AuftragsDokumentePositionen_ID" = :"vonAuftrDokPos_ID" and B."ArtEkStPr_Ab" not in ( select coalesce( D."AuftrDokPosi_Menge" , 0 ) from "AuftragsDokumentePositionen" D where D."AuftrDokPosi_DokumentID" = A."AuftrDokPosi_DokumentID" and D."AuftrDokPosi_DokStrukturID" is not distinct from A."AuftrDokPosi_DokStrukturID" and D."AuftrDokPosi_Artikel_ID" = A."AuftrDokPosi_Artikel_ID" ) order by B."ArtEkStPr_Ab" into :"Temp_AtaffelPreismenge" do begin insert into "AuftragsDokumentePositionen" ( "AuftrDokPosi_DokumentID" , "AuftrDokPosi_DokStrukturID" , "AuftrDokPosi_Option" , "AuftrDokPosi_Art" , "AuftrDokPosi_Position" , "AuftrDokPosi_Artikel_ID" , "AuftrDokPosi_ArtikelVersion" , "AuftrDokPosi_Menge" , "AuftrDokPosi_PreisEinheit" , "AuftrDokPosi_MwStSaetze_ID" , "AuftrDokPosi_Waehrung" ) values ( :"V_ADP_ZS_DokumentID" , :"V_ADP_ZS_DokStrukturID" , :"V_ADP_ZS_Option" , :"V_ADP_ZS_Art" , :"V_ADP_ZS_Reihenfolge" + :"Temp_Int" , :"V_ADP_ZS_ArtikelID" , :"V_ADP_ZS_ArtikelVersion" , :"Temp_AtaffelPreismenge" , :"V_ADP_ZS_PreisEinheit" , :"V_ADP_ZS_MwStSaetze_ID" , :"V_ADP_ZS_Waehrung" ) returning "AuftragsDokumentePositionen_ID" into :"V_Positionen_ID"; /* Texte aus der Tabelle "AuftrDokum_TextArtenSprachen" der alten Positionen fuer die neuen einfach uebernehemn. Auch wenn das neue Dokument noch nicht alle SPrachen unterstuetzt wird hier doch alles kopiert und fertig ist es !!!*/ insert into "AuftrDokum_TextArtenSprachen" ( "ADTAS_AuftrDokumentPositionenID" , "ADTAS_SprachenID" ,"ADTAS_TextArtID", "ADTAS_ArtikelTextArtSprachenID" , "ADTAS_AuftrDokPosiArt" , "ADTAS_Kurztext" , "ADTAS_Text" , "ADTAS_LangText", "ADTAS_LangTextHTML" ,"ADTAS_SuchText" , "ADTAS_ArtikelTextFormat") select :"V_Positionen_ID" , "ADTAS_SprachenID" ,"ADTAS_TextArtID", "ADTAS_ArtikelTextArtSprachenID" , "ADTAS_AuftrDokPosiArt" , "ADTAS_Kurztext" , "ADTAS_Text" , "ADTAS_LangText", "ADTAS_LangTextHTML" ,"ADTAS_SuchText" , "ADTAS_ArtikelTextFormat" from "AuftrDokum_TextArtenSprachen" A where a."ADTAS_AuftrDokumentPositionenID" = :"V_ADP_ZS_Positionen_ID"; "Temp_Int" = :"Temp_Int" + 1; end end "RET" = 'OK -dupliziert '|| row_count ||' row(s) Zeile(n) '; "Anzahl"=0; -- Zuruecksetzen weil sie in "NeuNummerieren" verwendet wird !! "Funktion" = 'NeuNummerieren'; -- Jetzt noch alles neu Durchsnummerieren end if ( :"Funktion" = 'NeuNummerieren' ) then begin -- Nummeriert alle Positionen neu durch damit es keine Luecken oder doppelte mehr geben kann. execute procedure "AuftrDokPositionen_Funktionen2"( "Funktion" , "vonAuftrDokPos_ID" , "Anzahl" , "nachAuftrDokPos_ID" , "I_DokStrukturID" , "I_DokumentID" , "I_ParamDouble" , "I_ParamVarChar") returning_values :RET , :"RET_VarCHAR" , :RET_BIGINT1 , :RET_BIGINT2 ,:RET_BIGINT3 ; end -- Wenn hier irgendwo eine Exception nicht gefangen wird passiert es spaetestens hier.( Nicht nur fuer die letzte Funktion sondern fuer Alle ) Die Contextvariable wird zurueckgesetzt und die Exception weitergegeben. RDB$SET_CONTEXT('USER_TRANSACTION', 'AuftrDokPositionen_Funktionen', null); end when any do begin -- Im Fehlerfall eines SQL Statements kommt man hier rein und die Contextvariale wird zurueckgesetzt. Danach wird der Fehler weitergegeben und so angeueigt als waere er dirket aufgetreten. in autonomous transaction do insert into "ErrorLog" ( "EL_SQLErrorCode" , "EL_Text" , "EL_Angezeigt" ) values( sqlstate , 'Aufgetreten in SP AuftrDokPositionen_Funktionen:'||:"Funktion" , 'Y'); RDB$SET_CONTEXT('USER_TRANSACTION', 'AuftrDokPositionen_Funktionen', null); exception; -- Original exception( die oben gefangen wurde ) weitergeben end end ^ SET TERM ; ^ ALTER TABLE "HTY_Kunden" ALTER COLUMN "K_Gesch_Partner_ID" POSITION 1; ALTER TABLE "HTY_Kunden" ALTER COLUMN K_KDNR POSITION 2; ALTER TABLE "HTY_Kunden" ALTER COLUMN "K_LiefNr_beim_Kunden" POSITION 3; ALTER TABLE "HTY_Kunden" ALTER COLUMN "K_Aktiv" POSITION 4; ALTER TABLE "HTY_Kunden" ALTER COLUMN "K_Bemerkung" POSITION 5; ALTER TABLE "HTY_Kunden" ALTER COLUMN "K_Betriebsferien" POSITION 6; ALTER TABLE "HTY_Kunden" ALTER COLUMN "K_TeillieferungErlaubt" POSITION 7; ALTER TABLE "HTY_Kunden" ALTER COLUMN "K_StdMwStGruppen_ID" POSITION 8; ALTER TABLE "HTY_Kunden" ALTER COLUMN "K_Zahlungsart" POSITION 9; ALTER TABLE "HTY_Kunden" ALTER COLUMN "K_TageZahlungsziel" POSITION 10; ALTER TABLE "HTY_Kunden" ALTER COLUMN "K_SkontoSatz" POSITION 11; ALTER TABLE "HTY_Kunden" ALTER COLUMN "K_SkontoTage" POSITION 12; ALTER TABLE "HTY_Kunden" ALTER COLUMN "K_KundenArtFestVergeben" POSITION 13; ALTER TABLE "HTY_Kunden" ALTER COLUMN "K_Mahngebuehr" POSITION 14; ALTER TABLE "HTY_Kunden" ALTER COLUMN "K_VerzugsZinsen" POSITION 15; ALTER TABLE "HTY_Kunden" ALTER COLUMN "K_Aend_Zeit" POSITION 16; ALTER TABLE "HTY_Kunden" ALTER COLUMN "K_Aend_Benu" POSITION 17; ALTER TABLE "HTY_Kunden" ALTER COLUMN "K_BruttoDokumente" POSITION 18; ALTER TABLE "HTY_Kunden" ALTER COLUMN "K_Aend_AspID" POSITION 19; ALTER TABLE "HTY_Kunden" ALTER COLUMN "K_RGmitAblieferbeleg" POSITION 20; ALTER TABLE "Kunden" ALTER COLUMN "K_Gesch_Partner_ID" POSITION 1; ALTER TABLE "Kunden" ALTER COLUMN K_KDNR POSITION 2; ALTER TABLE "Kunden" ALTER COLUMN "K_LiefNr_beim_Kunden" POSITION 3; ALTER TABLE "Kunden" ALTER COLUMN "K_Aktiv" POSITION 4; ALTER TABLE "Kunden" ALTER COLUMN "K_Bemerkung" POSITION 5; ALTER TABLE "Kunden" ALTER COLUMN "K_Betriebsferien" POSITION 6; ALTER TABLE "Kunden" ALTER COLUMN "K_TeillieferungErlaubt" POSITION 7; ALTER TABLE "Kunden" ALTER COLUMN "K_StdMwStGruppen_ID" POSITION 8; ALTER TABLE "Kunden" ALTER COLUMN "K_Zahlungsart" POSITION 9; ALTER TABLE "Kunden" ALTER COLUMN "K_TageZahlungsziel" POSITION 10; ALTER TABLE "Kunden" ALTER COLUMN "K_SkontoSatz" POSITION 11; ALTER TABLE "Kunden" ALTER COLUMN "K_SkontoTage" POSITION 12; ALTER TABLE "Kunden" ALTER COLUMN "K_KundenArtFestVergeben" POSITION 13; ALTER TABLE "Kunden" ALTER COLUMN "K_Mahngebuehr" POSITION 14; ALTER TABLE "Kunden" ALTER COLUMN "K_VerzugsZinsen" POSITION 15; ALTER TABLE "Kunden" ALTER COLUMN "K_Aend_Zeit" POSITION 16; ALTER TABLE "Kunden" ALTER COLUMN "K_Aend_Benu" POSITION 17; ALTER TABLE "Kunden" ALTER COLUMN "K_BruttoDokumente" POSITION 18; ALTER TABLE "Kunden" ALTER COLUMN "K_Aend_AspID" POSITION 19; ALTER TABLE "Kunden" ALTER COLUMN "K_RGmitAblieferbeleg" POSITION 20;