/* 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;