#include "Gra.ch" #include "Common.ch" #include "Xbp.ch" #include "Appevent.ch" #include "Appedit.ch" #include "Appbrow.ch" #include "Font.ch" #include "fileio.ch" #include "DelDbe.ch" //+25.06.2013 12:38: ******************************************************************************* * DbeSys() wird bei jedem Programmstart ausgefhrt ******************************************************************************* PROCEDURE dbeSys() /* * Der Parameter lHidden wird fr alle Database-Engines, die zu * einer abstrakten Database-Engine kombiniert werden, auf .T. gesetzt. */ //LOCAL aDbes := { { "DBFDBE", .T.},; // { "NTXDBE", .T.},; // { "DELDBE", .F.},; // { "SDFDBE", .F.},; // { "FOXDBE", .F.},; // { "CDXDBE", .F.} } //LOCAL aBuild :={ { "DBFNTX", 1, 2 },{ "SDFNTX", 4, 2 },{ "FOXCDX", 5, 6 } } LOCAL aDbes := { { "DBFDBE", .T.},; { "NTXDBE", .T.},; { "DELDBE", .F.},; { "SDFDBE", .F.} } LOCAL aBuild :={ { "DBFNTX", 1, 2 },{ "SDFNTX", 4, 2 } } LOCAL i /* * Setzen der Sortierfolge und des Datumformates */ SET COLLATION TO GERMAN SET DATE TO GERMAN /* * Laden aller Database-Engines */ FOR i:= 1 TO len(aDbes) IF ! DbeLoad( aDbes[i][1], aDbes[i][2]) Alert( aDbes[i][1] + MSG_DBE_NOT_LOADED , {"OK"} ) ENDIF sleep(5) //+19.11.2019 21:27 test, ob 'Ausstieg direkt beim Start' dann noch auftritt NEXT i /* * Erzeugen von Database-Engines */ FOR i:= 1 TO len(aBuild) IF ! DbeBuild( aBuild[i][1], aDbes[aBuild[i][2]][1], aDbes[aBuild[i][3]][1]) Alert( aBuild[i][1] + MSG_DBE_NOT_CREATED , {"OK"} ) ENDIF sleep(5) //+19.11.2019 21:27 test, ob 'Ausstieg direkt beim Start' dann noch auftritt NEXT i DbeSetDefault( "DELDBE" ) DbeInfo( COMPONENT_DATA, DELDBE_MODE, DELDBE_MULTIFIELD ) DbeInfo( COMPONENT_DATA, DELDBE_FIELD_TOKEN, "," ) DbeInfo( COMPONENT_DATA, DELDBE_RECORD_TOKEN, Chr(13)+Chr(10) ) //13.08.2024 18:38 DbeSetDefault( "SDFNTX" ) DbeInfo( COMPONENT_DATA , DBE_EXTENSION, "TAK" ) DbeInfo( COMPONENT_ORDER, DBE_EXTENSION, "XAK" ) DbeSetDefault( "DBFNTX" ) // ohne das geht es nicht! DbeInfo( COMPONENT_DATA , DBE_EXTENSION, "DBF" ) DbeInfo( COMPONENT_ORDER, DBE_EXTENSION, "NTX" ) RETURN //PROCEDURE xRZUGFeRD( cAuf, edrucker, zdate, textjn, anz ) //, lAbr, oDlg1 ) PROCEDURE MAIN( cAppName, cAufnum, edrucker, zdate, textjn, anz ) //, lAbr, oDlg1 ) // universelles Rechnungsdruckprogramm fr KSO LOCAL nOldArea := Select(), nRec := RecNo() //+11.10.2018 14:24 LOCAL aLeist1 := {}, aLeist2 := {}, aLeist3 := {}, aLeistA := {} //01.05.2008 16:02 aLeistA LOCAL nL1Sum := 0, nL2Sum := 0, nL3Sum := 0, nLASum := 0 LOCAL n4 := 4 , n5 := 5, nL12 := 0 LOCAL sbetr, grsu, smwsta, smwstb, zae PRIVATE aBlatt := {}, aBlattZ := {}, cAnz, cdate, ctextjn PRIVATE cSeite, cNa, cPrompt, cText, nTFont, cBereich, cFeld, nFFont, nZei, nSpa PRIVATE aSeite := {}, aNa := {}, aPrompt := {}, aText := {}, aTFont := {} PRIVATE aBereich := {}, aFeld := {}, aFFont := {}, aZei := {}, aSpa := {} CRLF := Chr(13)+Chr(10) //09.12.2025 17:54 /*21.05.2008 18:25 */ EUROV() IF xdmeu="D" /* DM darf nicht mehr gebraucht werden fr neue F„lle!! */ RETURN ENDIF /**/ SET DEFAULT TO &cDatver // RechnungZeilenKorrektur(cAuf) //+21.10.2018 19:21 //06.01.2026 15:24 speziell zum Testen: PRIVATE cAuf := IIf(ValType(cAufnum)=="N" .OR. cAufnum==NIL .OR. Val(cAufnum)==0, " 44", cAufnum) DEFAULT edrucker TO "H" DEFAULT zdate TO DtoC(DATE()) DEFAULT textjn TO "N" DEFAULT anz TO "W" //06.01.2026 15:08 fr standalone-Programm PRIVATE cUsername := "XR" PRIVATE cPCName := "TEST" PRIVATE nArea := 3 PRIVATE schdat := "1010000" do datei SELECT 1 DbSeek(cAuf,.F.) SELECT &nArea DbSetScope( SCOPE_BOTH, cAuf) DbGotop() DbSuspendNotifications() //05.03.2008 13:06 //================================================================================================ //04.01.2026 19:10 die Dateien der Rechnung (.html + .odt + .pdf + .zug.xml + zug.pdf) ... // ... werden in diesem Verzeichnis archiviert: PRIVATE cRechDir := cDatver + "Scans\Dokumente\" + StrZero(1->auftrnr,6,0) + "\_Rechnung" // wegen FExists ohne "\" // Verzeichnis erzeugen (wenn noch nicht geschehen): IF !FExists( cRechDir,"D" ) RunShell( "/C MD "+cRechDir,, .T. ) sleep(200) cRechDir += "\" ELSEIF FExists(cRechDir+"R"+StrZero(1->auftrnr,6,0)+".odt") nHandle := FOpen( cRechDir+"R"+StrZero(1->auftrnr,6,0)+".odt", FO_EXCLUSIVE ) IF nHandle = -1 //+ Die Datei ist bereits auf diesem PC ge”ffnet FClose(nHandle) msgbox("Es ist bereits eine Datei R"+StrZero(1->auftrnr,6,0)+".odt offen!"+CR+LF+"Bitte im OfficeWriter schlieáen, dann nochmal versuchen!") RETURN ELSE FClose(nHandle) ENDIF ELSEIF FExists(cRechDir+"R"+StrZero(1->auftrnr,6,0)+".html") nHandle := FOpen( cRechDir+"R"+StrZero(1->auftrnr,6,0)+".html", FO_EXCLUSIVE ) IF nHandle = -1 //+ Die Datei ist bereits auf diesem PC ge”ffnet FClose(nHandle) msgbox("Es ist bereits eine Datei R"+StrZero(1->auftrnr,6,0)+".html offen!"+CR+LF+"Bitte im OfficeWriter schlieáen, dann nochmal versuchen!") RETURN ELSE FClose(nHandle) ENDIF ENDIF //================================================================================================ // fr alle F„lle: ASize( aLeist1, 0 ); ASize( aLeist2, 0 ); ASize( aLeist3, 0 ); ASize( aLeistA, 0 ) nAnz := IIf(ValType(anz)=="C",Val(anz),anz) //+22.10.2018 12:26 nArea := 3 // weil oDlg1 fr den Ausdruck ohnehin von Typ 'L' ist, damit es in 'auf3AUFTRNR.dbf' sucht SELECT &nArea GO TOP DbSuspendNotifications() //05.03.2008 13:06 IF Upper(anz)$"WP" // Variablen mit Daten dieses Auftrags fllen: IF anz == "W" // CII cDash := "" ELSEIF anz == "P" // UBL cDash := "-" ENDIF zdate := DtoC(DATE()) // muss ggf noch geREMt werden !?! // ab hier werden das lauter neue PRIVATE: cRechnr := "R"+StrZero(1->auftrnr,6,0) // provisorisch erstmal fr "WP" cJJJJMMTT := SubStr(zdate,7,4)+cDash+SubStr(zdate,4,2)+cDash+SubStr(zdate,1,2) cJJJJMMTT_Lief := SubStr(zdate,7,4)+cDash+SubStr(zdate,4,2)+cDash+SubStr(zdate,1,2) ydate := DtoC(CtoD(zdate)+10) cJJJJMMTT_Zahl := SubStr(ydate,7,4)+cDash+SubStr(ydate,4,2)+cDash+SubStr(ydate,1,2) cRevCharge := Wandeln_in_UTF8("RC-Text") cVatProz := "19.00" nTotalNetto := 0.00 nSum_MwSt := 0.00 nTotalNetto4 := 0.0000 nSum_MwSt4 := 0.0000 cAuftrag := StrZero(1->auftrnr,6,0) cKdnr := "A" + cAuftrag cLief := "Schumacher" cLieferant := "Beerdigungsinstitut Karl Schumacher e.K." cHRBnr := "DE120633201" // "hrb" cMA_Lief := 1->berater cTel_Lief := "0208 69 04 80" cMail_Lief := "zentrale@karl-schumacher.de" cPLZ_Lief := "46117" cStr_Lief := Wandeln_in_UTF8("Vestische Straáe 146") cOrt_Lief := Wandeln_in_UTF8("Oberhausen") cLand_Lief := "DE" cVAT_Lief := "DE120633201" cKunde := Wandeln_in_UTF8(Trim(1->ansp_name)) cMA_Kunde := cKunde // vorl„ufig cMail_Kunde := IIf("@"$1->ansp_ktoi,Trim(1->ansp_ktoi),"eine.leere@mail.ee") cMail_MA_Kunde := Wandeln_in_UTF8(cMail_Kunde) // vorl„ufig cPLZ_Kunde := SubStr (1->ansp_ort,1,6) cStr_Kunde := Wandeln_in_UTF8(Trim(1->ansp_str)) cOrt_Kunde := Wandeln_in_UTF8(ORTohnePLZ(1->ansp_ort)) cLand_Kunde := "DE" // vorl„ufig cVAT_Kunde := "DE123456789" // vorl„ufig cKontoNameLief := "Beerdigungsinstitut Karl Schumacher e.K." cIBAN_Lief := "DE11 2222 3333 4444 5555 66" cBIC_Lief := "AABBCCDDXXX" cZahlungsbedingungen := "zahlbar innerhalb 8 Tagen" // schon mal fr die Rechnungszeilen: cMenge := "1.0000" cXml3 := '' ENDIF //07.12.2025 10:21 XML-Erzeugung: KOPF vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv IF anz == "W" // = CII fr ZUGFeRD cXML1 := '' + CRLF + ; '' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' urn:fdc:peppol.eu:2017:poacc:billing:01:1.0' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' urn:cen.eu:en16931:2017#compliant#urn:xeinkauf.de:kosit:xrechnung_3.0' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' + cRechnr + '' + CRLF + ; ' 380' + CRLF + ; ' ' + CRLF + ; ' ' + cJJJJMMTT + '' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' + cRevCharge + '' + CRLF + ; ' ' + CRLF + ; ' ' cXML1 += ' ' // schlieát erst fast ganz am Schluss des XML ! ELSEIF anz == "P" // = UBL fr xRechnung cXML1 := '' + CRLF + ; '' + CRLF + ; ' urn:cen.eu:en16931:2017#compliant#urn:xeinkauf.de:kosit:xrechnung_3.0#conformant#urn:xeinkauf.de:kosit:extension:xrechnung_3.0' + CRLF + ; ' urn:fdc:peppol.eu:2017:poacc:billing:01:1.0' + CRLF + ; ' ' + cRechnr + '' + CRLF + ; ' ' + cJJJJMMTT + '' + CRLF + ; ' ' + cJJJJMMTT_Zahl+ '' + CRLF + ; ' 380' + CRLF + ; ' ' + cRevCharge + '' + CRLF + ; ' EUR' + CRLF + ; ' ' + cKdnr + '' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' + cMail_Lief + '' + CRLF + ; ' ' + CRLF + ; ' ' + cMA_Lief + '' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' + cStr_Lief + '' + CRLF + ; ' ' + cOrt_Lief+ '' + CRLF + ; ' ' + cPLZ_Lief + '' + CRLF + ; ' ' + CRLF + ; ' DE' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' + cVAT_Lief + '' + CRLF + ; ' ' + CRLF + ; ' VAT' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' + cVAT_Lief + '' + CRLF + ; ' ' + CRLF + ; ' FC' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' + cLieferant+ '' + CRLF + ; ' ' + cVAT_Lief + '' + CRLF + ; ' ' + cRevCharge + '' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' cLieferant' + CRLF + ; ' ' + cTel_Lief + '' + CRLF + ; ' ' + cMail_Lief + '' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' + cMail_Kunde + '' + CRLF + ; ' ' + CRLF + ; ' ' + cKdnr + '' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' + cStr_kunde + '' + CRLF + ; ' ' + cOrt_Kunde + '' + CRLF + ; ' ' + cPLZ_Kunde+ '' + CRLF + ; ' ' + CRLF + ; ' ' + cLand_Kunde+ '' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' + cVAT_Kunde + '' + CRLF + ; ' ' + CRLF + ; ' VAT' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' + cKunde + '' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' + cKunde + '' + CRLF + ; ' ' + cMail_MA_Kunde+ '' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' ENDIF //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ // durch die Rechnungstabelle steppen: (fr Druck UND fr XML): DO WHILE (nArea)->auftrnr == Val( cAuf ) .AND. .NOT. Eof() //07.12.2025 10:21 XML-Erzeugung: Rechnungs-Artikel-Zeilen vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv IF mwst_schl == "3" cVatProz := "19.00" ELSEIF mwst_schl == "1" cVatProz := "7.00" ENDIF IF anz == "W" // CII fr ZUGFeRD cXML3 += '' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' + (nArea)->zeile + '' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' + (nArea)->zugr_z_st + '' + CRLF + ; ' ' + Wandeln_in_UTF8(Trim((nArea)->bezeich)) + '' + CRLF + ; ' ' + Wandeln_in_UTF8(Trim((nArea)->bezeich)) + '' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' + Str((nArea)->betrageu/1.19,8,2) + '' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' + cMenge + '' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' VAT' + CRLF + ; ' S' + CRLF + ; ' ' + cVATProz + '' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' + Str((nArea)->betrageu/1.19,8,2) + '' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' nTotalNetto += Round((nArea)->betrageu/1.19, 2) nSum_Mwst += (nArea)->betrageu - Round((nArea)->betrageu/1.19, 2) nTotalNetto4 += Round((nArea)->betrageu/1.19, 4) nSum_Mwst4 += Round((nArea)->betrageu - (nArea)->betrageu/1.19, 4) ELSEIF anz == "P" cXML3 += '' + CRLF + ; ' ' + CRLF + ; ' ' + (nArea)->zeile + '' + CRLF + ; ' ' + cMenge + '' + CRLF + ; ' ' + Str((nArea)->betrageu/1.19,8,2) + '' + CRLF + ; ' ' + CRLF + ; ' ' + Wandeln_in_UTF8(Trim((nArea)->bezeich)) + '' + CRLF + ; ' ' + Wandeln_in_UTF8(Trim((nArea)->bezeich)) + '' + CRLF + ; ' ' + CRLF + ; ' ' + (nArea)->zugr_z_st + '' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' S' + CRLF + ; ' ' + cVATProz + '' + CRLF + ; ' ' + CRLF + ; ' VAT' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' + Str((nArea)->betrageu/1.19,8,2) + '' + CRLF + ; ' ' + CRLF + ; ' ' nTotalNetto += Round((nArea)->betrageu/1.19, 2) nSum_Mwst += (nArea)->betrageu - Round((nArea)->betrageu/1.19, 2) ENDIF //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ DO CASE /*Wird nicht mehr gebraucht: !!! CASE rn == "A" //01.05.2008 21:55 AAdd( aLeistA, bezeich ) // Finanzierungskosten 'Adelta' AAdd( aLeistA, &b_g ) AAdd( aLeistA, mwst_schl ) AAdd( aLeistA, rn ) nLASum += &b_g //+27.10.2018 21:44 */ CASE rn == " " // Eigenleistung 1 AAdd( aLeist1, bezeich ) AAdd( aLeist1, &b_g ) AAdd( aLeist1, mwst_schl ) AAdd( aLeist1, rn ) nL1Sum += &b_g //+27.10.2018 21:44 CASE rn == "2" // Eigenleistung 2 AAdd( aLeist2, bezeich ) AAdd( aLeist2, &b_g ) AAdd( aLeist2, mwst_schl ) AAdd( aLeist2, rn ) nL2Sum += &b_g //+27.10.2018 21:44 /* Wird nur fr Abrechnung/Aufstellung gebraucht CASE rn == "3" // Fremdleistung (ausgelegt) -> Abrechnung! AAdd( aLeist3, bezeichf1 ) AAdd( aLeist3, bezeichf2 ) AAdd( aLeist3, &b_g ) AAdd( aLeist3, mwst_schl ) AAdd( aLeist3, rn ) nL3Sum += &b_g //+27.10.2018 21:44 */ ENDCASE SKIP ENDDO //vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv //+27.10.2018 21:45 Vergleich der gerade erstellten aktuellen Summen mit den Summen in best.dbf IF nLASum != 1->&r_b_1h ist := "gleich" // wird nur zum Debuggen gebraucht ENDIF //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ DbResumeNotifications() //05.03.2008 13:06 nL1 := Len( aLeist1 ) nL2 := Len( aLeist2 ) nL3 := Len( aLeist3 ) // wurde nur fr Adelta gebraucht: nLA := Len( aLeistA ) //01.05.2008 16:06 IF nAnz == 0 .AND. !Upper(anz) $ "WP" //+30.10.2018 12:03 AAdd( aLeist1, 0, nL1+1 ) AAdd( aLeist1, 0, nL1+2 ) AAdd( aLeist2, 0, nL2+1 ) AAdd( aLeist2, 0, nL2+2 ) /* AAdd( aLeistA, 0, nLA+1 ) //01.05.2008 16:06 Adelta AAdd( aLeistA, 0, nLA+2 ) //01.05.2008 16:07 */ ELSE AAdd( aLeist1, 0, nL1+1 ) AAdd( aLeist1, 0, nL1+2 ) AAdd( aLeist1, 0, nL1+3 ) AAdd( aLeist1, 0, nL1+4 ) AAdd( aLeist2, 0, nL2+1 ) AAdd( aLeist2, 0, nL2+2 ) AAdd( aLeist2, 0, nL2+3 ) AAdd( aLeist2, 0, nL2+4 ) /* AAdd( aLeistA, 0, nLA+1 ) //01.05.2008 16:06 Adelta AAdd( aLeistA, 0, nLA+2 ) //01.05.2008 16:07 AAdd( aLeistA, 0, nLA+3 ) //01.05.2008 16:06 AAdd( aLeistA, 0, nLA+4 ) //01.05.2008 16:07 */ ENDIF ////nL12 := int( nL1/5 + nL2/5 ) // aus 4 mach 5 ////// !!!!!!!! wird nur gebraucht, um die Optik zu korrigieren! => ggf etwas runterschieben: // z„hlt die Rechnungszeilen und teilt durch 4 (pro 4 Zeilen wird nL12 := int( Len( aLeist1 )/4 + Len( aLeist2 )/4 + Len( aLeistA )/4 ) //01.05.2008 16:08 // Abstand nach unten zu den Leistungszeilen ist 7-nL12 . Je mehr Zeilen, desto weniger Abstand. // holt aus drubef.dbf die Zeilen- und Spaltenabst„nde etc... select 20 use drubef edrucker=upper(edrucker) if edrucker="E" z12p=trim(ep12p) z14p=trim(ep14p) znorm=trim(epnorm) nPoffY:= Val(SubStr(epres5,1,3)) nPoffX:= Val(SubStr(epres5,4,3)) nPpZ := Val( Substr( 20->hpres5, 7, 3 ) ) //10.01.2008 09:23 nPpS := Val( Substr( 20->hpres5, 10, 3 ) ) //10.01.2008 09:23 else z12p=trim(hp12p) z14p=trim(hp14p) znorm=trim(hpnorm) nPoffY:= Val(SubStr(hpres5,1,3)) nPoffX:= Val(SubStr(hpres5,4,3)) nPpZ := Val( Substr( 20->epres5, 7, 3 ) ) //10.01.2008 09:23 nPpS := Val( Substr( 20->epres5, 10, 3 ) ) //10.01.2008 09:23 endif USE //+25.06.2018 18:33 wenn anz == w, dann wird nur der HTML-File ausgegeben auf swriter vvvvvvvv IF nAnz == 0 .AND. Upper(anz) $ "WP" //+29.10.2018 21:34 // cDruckabr := "c:\hdbe\dHTML.abr" // Text fr HTML-File (frher...) //04.01.2026 19:12 cDruckabr := "c:\hdbe\R"+StrZero(1->auftrnr)+".rdr" //27.12.2025 15:56 rdr=Rechnungsdruck cDruckabr := cRechDir + "R"+StrZero(1->auftrnr)+".rdr" //27.12.2025 15:56 rdr=Rechnungsdruck ++nAnz nS := 8 //03.01.2026 19:39 Spaltenoffset fr html nZ := 3 //03.01.2026 19:44 Zeilenoffset fr html ELSE cDruckabr := "c:\hdbe\dummy.abr" // Dummy, damit berechnet wird //04.01.2026 19:14 bleibt erstmal im HDBE nS := 0 //03.01.2026 19:39 Spaltenoffset nZ := 0 //03.01.2026 19:44 Zeilenoffset ENDIF nAnzahl := nAnz //+30.10.2018 17:47 hierher aus Zeile (viel frher:131, jetzt ??) //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ // druckt auf den Standard-Drucker oder fllt die .rdr, aus der die .html befllt wird: DO WHILE nAnz > 0 //von oben SELECT 1 find &cAuf // IF nAnz>1 /* 03.07.2008 18:14 in Dummydatei, damit endbetr berechnet wird -auch ohne Druck! */ IF !Upper(anz)$"WP" //+30.10.2018 08:53 SET DEVICE TO PRINTW ELSE --nAnz Set( _SET_DEVICE, "PRINTER" ) // damit PRINTW umgangen wird: schreiben in eine Datei cPrintFile := Set( _SET_PRINTFILE, cDruckabr ) // in cPrintfile ist jetzt die VORIGE Einstellung! ENDIF @ 06-nZ,8-nS say ansp_anr @ 07-nZ,8-nS say trim(ansp_vname) + " " + ansp_name @ 08-nZ,8-nS say ansp_str @ 10-nZ,8-nS say ansp_ort //@ 11,47 say cAuf + " / " + zdate @ 12-nZ,55-nS say cAuf + " / " + zdate //18.07.2006 16:18 IF Upper(anz)$"WP" //06.12.2025 15:50 fr den Ausdruck mit LO-Writer zae := 13-nZ @ zae,10-nS say Z1214(chr(27)+z12p)+"R E C H N U N G" //06.12.2025 15:50 zae=zae+1 @ zae,10-nS say Z1214(chr(27)+z12p)+"Bestattung:"+" "+trim(anrede)+" "+trim(vorname)+ " "+name zae=zae+1 @ zae,10-nS say Z1214(chr(27)+znorm)+" " ELSE zae := 14 //18.07.2006 16:18 @ zae,25-nS say Z1214(chr(27)+z12p)+trim(anrede)+" "+trim(vorname)+ " "+name zae=zae+1 @ zae,25-nS say Z1214(chr(27)+znorm)+" " ENDIF zae := zae+2 zae := IIf( nL12<7, zae+7-nL12, zae ) //nL1 := Len( aLeist1 ) nLL := nL1 IF nL1 > 0 @ ++zae,10-nS say "Leistung I:" aLeist1 := Leistdruck( aLeist1, n4, @zae, nS ) //n4 = 4 Felder pro Zeile @ ++zae,60-nS say "--------" @ ++zae,36-nS say "Summe I" @ zae,57-nS say w_g @ zae,60-nS say str( aLeist1[nL1+1],8,2 ) @ ++zae,60-nS say "========" ELSE AAdd( aLeist1, 0, 1 ) AAdd( aLeist1, 0, 2 ) ENDIF //++zae //nL2 := Len( aLeist2 ) nLL := nL2 IF nL2 > 0 @ ++zae,10-nS say "Leistung II:" aLeist2 := Leistdruck( aLeist2, n4, @zae, nS ) //n4 = 4 Felder pro Zeile @ ++zae,60-nS say "--------" @ ++zae,36-nS say "Summe II" @ zae,57-nS say w_g @ zae,60-nS say str( aLeist2[nL2+1],8,2 ) @ ++zae,60-nS say "========" ELSE AAdd( aLeist2, 0, 1 ) AAdd( aLeist2, 0, 2 ) ENDIF ++zae /*01.05.2008 16:11 fr die LeistungA: */ nLL := nLA IF nLA > 0 @ ++zae,10-nS say "Leistung III:" aLeistA := Leistdruck( aLeistA, n4, @zae, nS ) //n4 = 4 Felder pro Zeile @ ++zae,60-nS say "--------" @ ++zae,36-nS say "Summe III" @ zae,57-nS say w_g @ zae,60-nS say str( aLeistA[nLA+1],8,2 ) @ ++zae,60-nS say "========" ELSE AAdd( aLeistA, 0, 1 ) AAdd( aLeistA, 0, 2 ) ENDIF ++zae /**/ @ ++zae,36-nS say "Leistungen I" @ zae,57-nS say w_g @ zae,60-nS say str( aLeist1[nL1+1],8,2 ) @ ++zae,34-nS say "+ Leistungen II" @ zae,57-nS say w_g @ zae,60-nS say str( aLeist2[nL2+1],8,2 ) /* IF aLeistA[nLA+1] != 0 // nur fr Adelta! @ ++zae,34-nS say "+ Leistungen III" @ zae,57-nS say w_g @ zae,60-nS say str( aLeistA[nLA+1],8,2 ) ENDIF */ @ ++zae,60-nS say "--------" /*01.05.2008 16:14 aLeistA[nLA+1] tr„gt auch zur Gesamtsumme (nLA+2) bei: */ // aLeist1[nL1+2] := aLeist2[nL2+2] := aLeistA[nLA+2] := aLeist1[nL1+1] + aLeist2[nL2+1] //07.01.2026 12:40 + aLeistA[nLA+1] aLeist1[nL1+2] := aLeist2[nL2+2] := aLeist1[nL1+1] + aLeist2[nL2+1] @ ++zae,36-nS say "Gesamtsumme" @ zae,57-nS say w_g @ zae,60-nS say str( aLeist1[nL1+2],8,2 ) @ ++zae,60-nS say "========" // ist vermutlich nicht mehr im Gebrauch: ??? if Upper( textjn ) = "J" select 9 use ksotexte ++zae zae := IIf( zae<45, 45, zae ) @ ++zae,12-nS say rtext1 @ ++zae,12-nS say rtext2 @ ++zae,12-nS say rtext3 @ ++zae,12-nS say rtext4 @ ++zae,12-nS say rtext5 @ ++zae,12-nS say rtext6 @ ++zae,12-nS say rtext7 @ ++zae,12-nS say rtext8 @ ++zae,12-nS say rtext9 use endif // aLeist3 := Leistdruck( aLeist3, n5, zae ) // nur in der Abrechnung/Aufstellung IF cLPT = "LPT1" EJECT lSeiteleer := .F. ENDIF --nAnz IF nAnz > 0 aLeist1[nL1+1] := 0 aLeist1[nL1+2] := 0 aLeist2[nL2+1] := 0 aLeist2[nL2+2] := 0 /* aLeistA[nLA+1] := 0 //01.05.2008 16:15 aLeistA[nLA+2] := 0 //01.05.2008 16:15 */ ENDIF IF nAnz >= 0 /*03.07.2008 18:17 s.o. Dummydruck, um endbetr auszurechnen */ SET DEVICE TO SCREEN ELSE Set( _SET_PRINTFILE, cPrintFile ) // 03.07.2008 18:17 Set( _SET_DEVICE, "SCREEN" ) // weil Ausdruck in File umgeleitet war ENDIF ENDDO IF Upper(anz)$"WP" //21.12.2025 21:18 Erzeugung der AusgleichsZeile fr die Rundungsfehler bei Netto/MwSt: cVAT_Proz := "19.00" // Totale errechnet aus der Brutto-Gesamtsumme: cTotalPreisX := Str(aLeist1[nL1+2],8,2) // Brutto-Gesamtsumme der KSOX-Rechnung cTotalNettoX := Str(aLeist1[nL1+2]/1.19,8,2) // daraus berechnete Netto-Summe cSUM_MWSTX := Str(aLeist1[nL1+2]-aLeist1[nL1+2]/1.19,8,2) // daraus berechnete MwSt-Summe // Totale errechnet aus der Summe der Netto-Zeilenbetr„ge: cTotalNetto4 := Str(nTotalNetto4,8,2) cSUM_MWST4 := Str(nSum_Mwst4,8,2) cTotalPreis4 := Str(Val(cTotalNetto4)+Val(cSum_Mwst4),8,2) // Totale errechnet aus der Summe der Netto-Zeilenbetr„ge: cTotalNetto := Str(nTotalNetto,8,2) cSUM_MWST := Str(nSum_Mwst,8,2) cTotalPreis := Str(Val(cTotalNetto)+Val(cSum_Mwst),8,2) IF cTotalPreisX != cTotalPreis nAusgleichsBetragBrutto := Round(aLeist1[nL1+2],2) - Round(nTotalNetto*1.19,2) // nAusgleichsBetragNetto := nAusgleichsBetragBrutto/1.19 cZeile := Str(Val((nArea)->zeile)+1) IF anz == "W" cXML3 += '' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' + cZeile + '' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' + '0000' + '' + CRLF + ; ' ' + Wandeln_in_UTF8("Netto-Ausgleichsbetrag") + '' + CRLF + ; ' ' + Wandeln_in_UTF8("Netto-Ausgleichsbetrag") + '' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' + Str(nAusgleichsBetragBrutto/1.19,8,2) + '' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' + cMenge + '' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' VAT' + CRLF + ; ' S' + CRLF + ; ' ' + cVATProz + '' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' + Str(nAusgleichsBetragBrutto/1.19,8,2) + '' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' nTotalNetto += Round(nAusgleichsBetragBrutto/1.19, 2) nTotalNetto4 += Round(nAusgleichsBetragBrutto/1.19, 4) nSum_Mwst += Round(nAusgleichsBetragBrutto/1.19*0.19, 2) nSum_Mwst4 += Round(nAusgleichsBetragBrutto/1.19*0.19, 4) // Korrektur durch AusgleichsBetrag: // Totale errechnet aus der Summe der Netto-Zeilenbetr„ge: cTotalNetto := Str(nTotalNetto,8,2) cSUM_MWST := Str(nTotalNetto*0.19,8,2) // cTotalPreis := Str(nTotalNetto + nTotalNetto*0.19,8,2) cTotalPreis := Str(Val(cTotalNetto)*1.19,8,2) ELSEIF anz == "P" cXML3 += '' + CRLF + ; ' ' + CRLF + ; ' ' + (nArea)->zeile + '' + CRLF + ; ' ' + cMenge + '' + CRLF + ; ' ' + Str((nArea)->betrageu/1.19,8,2) + '' + CRLF + ; ' ' + CRLF + ; ' ' + Wandeln_in_UTF8(Trim((nArea)->bezeich)) + '' + CRLF + ; ' ' + Wandeln_in_UTF8(Trim((nArea)->bezeich)) + '' + CRLF + ; ' ' + CRLF + ; ' ' + (nArea)->zugr_z_st + '' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' S' + CRLF + ; ' ' + cVATProz + '' + CRLF + ; ' ' + CRLF + ; ' VAT' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' + Str((nArea)->betrageu/1.19,8,2) + '' + CRLF + ; ' ' + CRLF + ; ' ' nTotalNetto += Round((nArea)->betrageu/1.19, 2) nSum_Mwst += (nArea)->betrageu - Round((nArea)->betrageu/1.19, 2) ENDIF ENDIF // Ende der Ausgleichszeile //09.12.2025 09:14 XML-Erzeugung: Daten von Lieferant & Kunde & Summen vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv IF anz == "W" cXML2 := ' ' // Daten des Lieferanten: cXML2 += CRLF + ; ' ' + cKdnr+ '' + CRLF + ; ' ' + CRLF + ; ' ' + cLief + '' + CRLF + ; ' ' + cLieferant + '' + CRLF + ; ' ' + CRLF + ; ' ' + cHRBnr + '' + CRLF + ; ' ' + cLieferant + '' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' + cMA_Lief + '' + CRLF + ; ' ' + CRLF + ; ' ' + cTEL_Lief + '' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' + cMail_Lief + '' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' + cPLZ_Lief + '' + CRLF + ; ' ' + cStr_Lief + '' + CRLF + ; ' ' + cOrt_Lief + '' + CRLF + ; ' ' + cLand_Lief + '' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' + cMail_Kunde + '' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' + cVAT_Kunde + '' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' + cVAT_Kunde + '' + CRLF + ; ' ' + CRLF + ; ' ' // Daten des Kunden: cXML2 += '' + CRLF + ; ' ' + CRLF + ; ' ' + cKdnr + '' + CRLF + ; ' ' + cKunde + '' + CRLF + ; ' ' + CRLF + ; ' ' + cMA_Kunde + '' + CRLF + ; ' ' + CRLF + ; ' ' + cMail_MA_Kunde + '' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' + cPLZ_Kunde + '' + CRLF + ; ' ' + cStr_Kunde + '' + CRLF + ; ' ' + cOrt_Kunde + '' + CRLF + ; ' ' + cLand_Kunde + '' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' + cMail_Kunde + '' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' + cVAT_Kunde + '' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' // Summen der Rechnung etc.: cXML2 += '' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' + cJJJJMMTT_Lief + '' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' EUR' + CRLF + ; ' ' + CRLF + ; ' 1' + CRLF + ; ' ' + CRLF + ; ' ' + cIBAN_Lief + '' + CRLF + ; ' ' + cKontoNameLief + '' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' + cBIC_Lief + '' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' + cSUM_MWST + '' + CRLF + ; ' VAT' + CRLF + ; ' ' + cTotalNetto + '' + CRLF + ; ' S' + CRLF + ; ' ' + cVAT_Proz + '' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' + cZahlungsBedingungen + '' + CRLF + ; ' ' + CRLF + ; ' ' + cJJJJMMTT_Zahl + '' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' + cTotalNetto + '' + CRLF + ; ' ' + cTotalNetto + '' + CRLF + ; ' ' + cSUM_MWST + '' + CRLF + ; ' ' + cTotalPreis + '' + CRLF + ; ' ' + cTotalpreis + '' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; '' cXml := cXml1 + CRLF + cXml3 + CRLF + cXml2 cFilezugxml := cRechDir + "R"+StrZero(1->auftrnr)+"_zug.xml" nHandle := FCreate(cFilezugxml) FWrite(nHandle,cXml) FClose(nHandle) ELSEIF anz == "P" cXml2 := '' + ; ' ' + CRLF + ; ' ' + cJJJJMMTT_Lief + '' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' 1' + CRLF + ; ' ' + cAuftrag + '' + CRLF + ; ' ' + CRLF + ; ' ' + cIBAN_Lief + '' + CRLF + ; ' ' + cKontoNameLief + '' + CRLF + ; ' ' + CRLF + ; ' ' + cBIC_Lief + '' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' + cZahlungsbedingungen + '' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' + cSUM_MWST + '' + CRLF + ; ' ' + CRLF + ; ' ' + cTotalNetto + '' + CRLF + ; ' ' + cSUM_MWST + '' + CRLF + ; ' ' + CRLF + ; ' S' + CRLF + ; ' ' + cVAT_Proz + '' + CRLF + ; ' ' + CRLF + ; ' VAT' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' + cTotalNetto + '' + CRLF + ; ' ' + cTotalNetto + '' + CRLF + ; ' ' + cTotalPreis + '' + CRLF + ; ' ' + cTotalPreis + '' + CRLF + ; ' ' cXml := cXml1 + CRLF + cXml2 + CRLF + cXml3 + CRLF + '' cFilexml := cRechDir + "R"+StrZero(1->auftrnr)+".xml" nHandle := FCreate(cFilexml) FWrite(nHandle,cXml) FClose(nHandle) ENDIF //24.12.2025 15:47 Die Rechnung als HTML-Datei abspeichern: vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv // und dann erst zu einer PDF umwandeln cHtmlRech := '' + CRLF + ; '' + CRLF + ; '' + CRLF + ; ' ' + CRLF + ; ' c:\hdbe\'+StrZero(1->auftrnr)+'.html' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; ' ' + CRLF + ; '' + CRLF + ; '' + CRLF + ; '
'
		nRTxtLen = Len(MemoRead(cRechDir + "R"+StrZero(1->auftrnr,6,0)+".rdr"))	//geht das anders? nur die Filel„nge?
	   nHandle := FOpen( cRechDir + "R"+StrZero(1->auftrnr,6,0)+".rdr", FO_READ )
	   cBuffer := Space(nRTxtLen)
	   nBytes := FRead( nHandle, @cBuffer, nRTxtLen )
	   cHtmlRech += AllTrim(cBuffer)
		FClose( nHandle )
		cHtmlRech += CRLF + '
' cFilehtml := cRechDir + "R"+StrZero(1->auftrnr,6,0)+".html" nHandle := FCreate(cFilehtml) FWrite(nHandle,Wandeln_in_UTF8(cHtmlRech)) FClose(nHandle) cAuftrag := StrZero(1->auftrnr,6,0) cCommand := ' &cFilehtml macro:///Standard.Module1.xRechPDF ' RunShell (' &cFilehtml macro:///Standard.Module1.xRechPDF ', 'C:\Program Files\LibreOffice\program\swriter.exe',.T.) ENDIF select 1 IF &r_b_1 <> aLeist1[nL1+1] .AND. nAnzahl > 0 satzsperren() // damit die erg„nzten BestFallDaten auch bertragen werden k”nnen aData1 := SatzGet( Select(), RecNo() ) // IF xdmeu="D" /* DM darf nicht mehr gebraucht werden fr neue F„lle!! */ ELSE repl &r_b_1 with aLeist1[nL1+1] ENDIF // damit die erg„nzten BestFallDaten auch bertragen werden trckng( Select(), RecNo(), aData1 ) // satzentsperren() ENDIF IF &r_b_2 <> aLeist2[nL2+1] .AND. nAnzahl > 0 satzsperren() // damit die erg„nzten BestFallDaten auch bertragen werden k”nnen aData1 := SatzGet( Select(), RecNo() ) // IF xdmeu="D" /* DM darf nicht mehr gebraucht werden fr neue F„lle!! */ ELSE repl &r_b_2 with aLeist2[nL2+1] ENDIF // damit die erg„nzten BestFallDaten auch bertragen werden trckng( Select(), RecNo(), aData1 ) // satzentsperren() ENDIF /*04.05.2008 22:11 wird (noch) nicht in best.dbf abgespeichert */ /*21.05.2008 18:17 ab jetzt werden die Hintergrundw„hrungsfelder fr Leistung III und Fremdleistung verwendet */ IF nAnzahl > 0 satzsperren() // damit die erg„nzten BestFallDaten auch bertragen werden k”nnen aData1 := SatzGet( Select(), RecNo() ) // IF xdmeu="D" /* DM darf nicht mehr gebraucht werden fr neue F„lle!! */ ELSE repl &r_b_1h with aLeistA[nLA+1] repl rech_dat WITH CtoD(zdate) //+16.07.2008 21:08 zdate ist "C" ENDIF // damit die erg„nzten BestFallDaten auch bertragen werden trckng( Select(), RecNo(), aData1 ) // satzentsperren() ENDIF /**/ IF nArea == 13 //+30.10.2018 12:53 nur wenn normaler Rechnungsdruck mit BregieR3L // Anfang Schreiben der Auftrag-Backup-Datei SELECT 9 USE AUFTR_B SELECT &nArea DbGotop() //05.03.2008 13:09 DbSuspendNotifications() INDEX ON Str(auftrnr,6,0)+rn+kennz+zeile TO C:\HDBE\xtemp nZeile := 0 FOR nt := 0 TO 2 STEP 2 SELECT &nArea IF .NOT. Bof() GO TOP ENDIF DO WHILE .NOT. Eof() IF Val( (nArea)->rn ) <> nt .OR. (nArea)->auftrnr != 1->auftrnr SKIP LOOP ENDIF ++nZeile FOR n := 1 to FCount() aData2[n] := FieldGet( n ) NEXT SELECT 9 APPEND BLANK FOR n := 1 to FCount() FieldPut( n, aData2[n] ) NEXT REPLACE 9->zeile WITH Str( nZeile,2,0 ) DbRUnlock( Recno() ) SELECT &nArea SKIP ENDDO NEXT /*01.05.2008 16:19 fr LeistungIII */ GO TOP DO WHILE .NOT. Eof() IF (nArea)->rn != "A" .OR. (nArea)->auftrnr != 1->auftrnr SKIP LOOP ENDIF ++nZeile For n := 1 to FCount() aData2[n] := FieldGet( n ) NEXT SELECT 9 APPEND BLANK For n := 1 to FCount() FieldPut( n, aData2[n] ) NEXT REPLACE 9->zeile WITH Str( nZeile,2,0 ) DbRUnlock( Recno() ) SELECT &nArea SKIP ENDDO SELECT 9 USE SELECT &nArea SET INDEX TO DbGotop() //05.03.2008 13:10 DbResumeNotifications() // Ende Schreiben der Auftrag-Backup-Datei ENDIF SELECT &nOldArea DbGoto(nRec) //+11.10.2018 14:25 RETURN FUNCTION Leistdruck( aLeist, n, zae, nS ) //04.01.2026 14:57 nS IF zae > 0 //04.05.2008 17:11 s.u. IF n == 4 // FOR i := 5 to ( nLL + 1 ) STEP 5 // die zweite Zeile der Bezeichnung FOR i := n to ( nLL + 1 ) STEP n // @ ++zae,10 say aLeist[i-4] // IF Len(Trim(aLeist[i-3])) > 0 @ ++zae,10-nS say aLeist[i-3] // ENDIF @ zae,57-nS say w_g @ zae,60-nS say str( aLeist[i-2],8,2 ) aLeist[nLL+1]=aLeist[nLL+1] + aLeist[i-2] aLeist[nLL+2]=aLeist[nLL+2] + aLeist[i-2] if aLeist[i-1]="3" aLeist[nLL+3]=aLeist[nLL+3] + (aLeist[i-2] / (100+zschl_voll) * zschl_voll) endif if aLeist[i-1]="2" aLeist[nLL+4]=aLeist[nLL+4] + (aLeist[i-2] / (100+zschl_halb) * zschl_halb) endif NEXT ELSE AAdd( aLeist, 0, nLL+5 ) FOR i := n to ( nLL + 1 ) STEP n @ ++zae,5 say "Rechnung-"+Substr(aLeist[i-4],1,34)+"-"+aLeist[i-3] @ zae,64 say w_g @ zae,67 say str( aLeist[i-2],8,2 ) aLeist[nLL+1]=aLeist[nLL+1] + aLeist[i-2] aLeist[nLL+2]=aLeist[nLL+2] + aLeist[i-2] if aLeist[i-1]="3" aLeist[nLL+3]=aLeist[nLL+3] + (aLeist[i-2] / (100+zschl_voll) * zschl_voll) endif if aLeist[i-1]="2" aLeist[nLL+4]=aLeist[nLL+4] + (aLeist[i-2] / (100+zschl_halb) * zschl_halb) endif NEXT ENDIF ELSEIF zae == 0 //04.05.2008 17:10 rechnet in Aufstellung die Vorfinanzierungskosten aus: FOR i := n to ( nLL + 1 ) STEP n aLeist[nLL+1]=aLeist[nLL+1] + aLeist[i-2] aLeist[nLL+2]=aLeist[nLL+2] + aLeist[i-2] NEXT ENDIF RETURN aLeist FUNCTION BSEingabe( aBlatt, oDlg1 ) LOCAL oDlg, nEvent, mp1, mp2 LOCAL aSizeDesktop := AppDesktop():currentSize() LOCAL nBSb := aSizeDesktop[1] LOCAL nBSh := aSizeDesktop[2] // folgende Zahlen-Werte basieren auf 800x600: LOCAL nV := nBSb/800 // Korrekturfaktor fr tats„chliche Aufl”sung LOCAL nOldArea := Select() LOCAL aEditcontrols := {} // LOCAL oFocus := SetAppFocus() LOCAL aSeite := {}, aNa := {}, aPrompt := {}, aText := {}, aTFont := {} LOCAL aBereich := {}, aFeld := {}, aFFont := {}, aZei := {}, aSpa := {} PRIVATE oWin := oDlg1 cFont := IIf( nBSb < 700, "7.Arial", "8.Arial" ) oDlg := XbpDialog():new( AppDeskTop(), oDlg1 ) oDlg:tasklist := .T. oDlg:title := "Felder korrigieren/eingeben" oDlg:maxButton := .F. oDlg:clipSiblings := .T. oDlg:border := XBPDLG_RAISEDBORDERTHIN_FIXED oDlg:create(,, {10,10}, {int(740*nV),int(460*nV)} ) oDlg:drawingArea:setFontCompoundName( "8.Arial" ) oDlg:drawingArea:setColorBG( GRA_CLR_DARKGREEN ) oCB := oDlg:drawingArea oCB:clipSiblings := .T. nBo := int(430*nV) nBr := 0 j := 0 FOR i := 1 to Len( aBlatt ) aBlattZ := aBlatt[i] AAdd( aSeite, aBlattZ[1] ) AAdd( aNa, aBlattZ[2] ) AAdd( aPrompt, aBlattZ[3] ) AAdd( aText, aBlattZ[4] ) AAdd( aTFont, aBlattZ[5] ) AAdd( aBereich, aBlattZ[6] ) AAdd( aFeld, aBlattZ[7] ) // Feldbezeichnung AAdd( aFFont, aBlattZ[8] ) AAdd( aZei, aBlattZ[9] ) AAdd( aSpa, aBlattZ[10] ) // fr die Positionierung im Editierfenster: nBr := IIf( i<>1 .AND. (aSeite[i]="n" .OR. nBo-Int(j*25*nV) < Int(30*nV)), ; (nBr+Int(370*nV)), nBr ) j := IIf( nBo-Int(j*25*nV) < Int(30*nV) .OR. aSeite[i]="n", 0, j ) IF Upper( aSeite[i] ) = "R" .OR. Upper( aSeite[i] ) = "V" // keine Žnderungen, wenn es sich um "Rechnungszeilen" handelt AAdd( aEditcontrols, aFeld[i] ) ELSE IF aNa[i] = "t" // Text ist zu ver„ndern // aText[i] := aText[i]+Space(70-len(aText[i])) oXbp := XbpStatic():new( oDlg:drawingArea, , {nBr+int(30*nV),nBo-int(++j*25*nV)}, {int(100*nV),int(25*nV)}) oXbp:caption := aPrompt[i] oXbp:clipSiblings := .T. oXbp:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT oXbp:create() oSle := XbpSLE():new( oDlg:drawingArea, , {nBr+int(140*nV),nBo-int(j*25*nV)}, {int(200*nV),int(25*nV)}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } ) oSle:bufferLength := 70 oSle:setInputFocus := {|mp1,mp2,obj| HiliteSle( obj ) } oSle:killInputFocus := {|mp1,mp2,obj| DeHiliteSle( obj ) } oSle:group := XBP_WITHIN_GROUP oSle:dataLink := {|x| IIf( PCOUNT()==0, Trim( aText[i] ), aText[i] := x ) } oSle:create():setData() AAdd( aEditcontrols, oSle ) // IF ASC( aFeld[i] ) > 32 cB := aBereich[i] ; cF := aFeld[i] IF !Empty( cF ) .AND. Val( cB ) > 0 aFeld[i] := ((&cB)->(&cF)) //Feldinhalt ENDIF ELSEIF aNa[i] = "f" // Feldinhalt soll editiert werden cB := aBereich[i] ; cF := aFeld[i] xF := ( (&cB)->(&cF) ) //Feldinhalt DO CASE CASE Valtype( xF ) == "C" aFeld[i] := xF CASE ValType( xF ) == "N" aFeld[i] := Str( xF ) CASE ValType( xF ) == "D" aFeld[i] := DtoC( xF ) ENDCASE oXbp := XbpStatic():new( oDlg:drawingArea, , {nBr+int(30*nV),nBo-int(++j*25*nV)}, {int(100*nV),int(25*nV)}) oXbp:caption := aPrompt[i] oXbp:clipSiblings := .T. oXbp:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT oXbp:create() oSle := XbpSLE():new( oDlg:drawingArea, , {nBr+int(140*nV),nBo-int(j*25*nV)}, {int(200*nV),int(25*nV)}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } ) oSle:bufferLength := 50 oSle:setInputFocus := {|mp1,mp2,obj| HiliteSle( obj ) } oSle:killInputFocus := {|mp1,mp2,obj| DeHiliteSle( obj ) } oSle:group := XBP_WITHIN_GROUP oSle:dataLink := {|x| IIf( PCOUNT()==0, Trim( aFeld[i] ), aFeld[i] := x ) } oSle:create():setData() AAdd( aEditcontrols, oSle ) aText[i] := "" ELSEIF aNa[i] = "v" .AND. aBereich[i] = "v" // Variable soll editiert werden cF := aFeld[i] xF := &(cF) //Variableninhalt DO CASE CASE Valtype( xF ) == "C" aFeld[i] := xF CASE ValType( xF ) == "N" aFeld[i] := Str( xF ) CASE ValType( xF ) == "D" aFeld[i] := DtoC( xF ) ENDCASE oXbp := XbpStatic():new( oDlg:drawingArea, , {nBr+int(30*nV),nBo-int(++j*25*nV)}, {int(100*nV),int(25*nV)}) oXbp:caption := aPrompt[i] oXbp:clipSiblings := .T. oXbp:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT oXbp:create() oSle := XbpSLE():new( oDlg:drawingArea, , {nBr+int(140*nV),nBo-int(j*25*nV)}, {int(200*nV),int(25*nV)}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } ) oSle:bufferLength := 50 oSle:setInputFocus := {|mp1,mp2,obj| HiliteSle( obj ) } oSle:killInputFocus := {|mp1,mp2,obj| DeHiliteSle( obj ) } oSle:group := XBP_WITHIN_GROUP oSle:dataLink := {|x| IIf( PCOUNT()==0, Trim( aFeld[i] ), aFeld[i] := x ) } oSle:create():setData() AAdd( aEditcontrols, oSle ) ELSEIF aNa[i] <> "v" .AND. aBereich[i] = "v" // im aFeld steht Mem-Variable cF := aFeld[i] aFeld[i] := "&(" + cF + ")" AAdd( aEditcontrols, aFeld[i] ) ELSE IF ASC( aFeld[i] ) > 32 cB := aBereich[i] ; cF := aFeld[i] aFeld[i] := ((&cB)->(&cF)) //Feldinhalt ENDIF AAdd( aEditcontrols, aFeld[i] ) ENDIF IF ValType(cF)="C" IF Upper(cF) = "FAM" .OR. Upper(cF) = "KONF" aFeld[i] := Kurzlang( aFeld[i] ) ENDIF ENDIF ENDIF NEXT i=1 oDlg:setModalState( XBP_DISP_APPMODAL ) oDlg:show() IF Len( aEditcontrols ) > 0 .AND. ValType( aEditControls[1] ) = "O" oFocus := SetAppFocus( aEditcontrols[1] ) ELSE oFocus := SetAppFocus( oDlg ) ENDIF DO WHILE nEvent <> xbeP_Close nEvent := AppEvent( @mp1, @mp2, @oXbp ) IF nEvent == xbeM_LbDblClick PostAppEvent( xbeP_Close) ENDIF IF nEvent == xbeP_Keyboard DO CASE CASE mp1 == xbeK_ESC lFluchtB := .T. //+21.10.2018 18:41 ESC bricht jetzt das Drucken ab PostAppEvent( xbeP_Close) CASE mp1 == xbeK_F10 PostAppEvent( xbeP_Close) ENDCASE ENDIF oXbp:handleEvent( nEvent, mp1, mp2 ) ENDDO IF lFluchtB == .F. //+21.10.2018 18:42 zum Abbrechen des Drucks // wie Gather( aEditcontrols ) : FOR i := 1 TO len( aEditcontrols ) IF ValType( aEditcontrols[i] ) == "O" IF aNa[i] == "t" aText[i] := aEditcontrols[i]:getdata() ELSE aFeld[i] := aEditcontrols[i]:getdata() ENDIF ENDIF NEXT FOR i=1 to len(aBlatt) aBlattZ := { aSeite[i], aNa[i], aPrompt[i], Trim(aText[i]), aTFont[i], aBereich[i], ; IIf( ValType(aFeld[i])="C", Trim(aFeld[i]), aFeld[i]), ; aFFont[i], aZei[i], aSpa[i] } aBlatt[i] := aBlattZ NEXT ELSE aBlatt := .F. ENDIF oDlg:setModalState( XBP_DISP_MODELESS ) oDlg:destroy() SetAppFocus( oFocus ) SELECT &nOldArea RETURN aBlatt FUNCTION Z1214(a) DO CASE CASE cLPT = "LPTA" .and. a = chr(27)+z12p aFonts := {"12.COURIER NEW Fett"} a := "" CASE cLPT = "LPTA" .and. a = chr(27)+z14p aFonts := {"14.COURIER NEW Fett"} a := "" CASE cLPT = "LPTA" .and. a = chr(27)+znorm aFonts := {"12.COURIER NEW"} a := "" CASE cLPT != "LPTA" aFonts := {} ENDCASE //+25.06.2018 19:21 bei HTML-Druck auf Fettdruck schalten: vvvvvvvvvvvvvvv IF isMemVar("cDruckabr") .AND. "HTML"$cDruckabr IF "Fett"$aFonts[1] a := "" ELSEIF Len(aFonts) = 1 a := "" ENDIF ENDIF //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ RETURN a //+21.10.2018 19:22 macht das vor dem Drucken, was sonst erst vor dem Speichern in auftr.dbf gemacht wird: FUNCTION RechnungZeilenKorrektur(cAuf) LOCAL nOldArea := SELECT() LOCAL nZeile := 0, nRec := RecNo() DbSuspendNotifications() IF ConfirmBox( oCB, "Soll die Rechnung geprft und korrigiert werden?" + CRLF +; "(Zeilen ohne Artikelnr oder Artikelbezeichnung l”schen.)", ; "Abrechnungs-Zeilen Checken", ; XBPMB_YESNO, ; XBPMB_QUESTION ) == XBPMB_RET_NO DbResumeNotifications() RETURN .F. ENDIF SELECT 13 // DELETE ALL FOR 13->auftrnr <> Val( cAuf ) .OR. ( Empty(13->zugr_z_st) .AND. Empty(13->bezeichf1)) //+14.10.2018 13:43 statt der Vorzeile folgende Schleife: // hier wird die Temp-Datei von leeren und falschen Zeilen befreit (siehe auch BregieR5L.prg) *** DbGotop() DO WHILE !Eof() IF 13->auftrnr <> Val( cAuf ) .AND. ( !Empty(13->zugr_z_st) .AND. !Empty(13->bezeich)) IF ConfirmBox( oCB, "Zeile erg„nzen+behalten=ja - Zeile l”schen=nein", ; "Zeile "+13->zeile+" hat noch keine Auftragsnummer!", ; XBPMB_YESNO, ; XBPMB_QUESTION ) == XBPMB_RET_YES 13->auftrnr := Val(cAuf) ELSE DbDelete() ENDIF ELSEIF 13->auftrnr == Val( cAuf ) .AND. (Empty(13->zugr_z_st) .OR. Empty(13->bezeich)) IF ConfirmBox( oCB, "Zeile behalten=ja - Zeile l”schen=nein", ; "Zeile "+13->zeile+": Artikelnr oder -bezeichnung ist leer!", ; XBPMB_YESNO, ; XBPMB_QUESTION ) == XBPMB_RET_YES 13->auftrnr := Val(cAuf) // vorsichtshalber ... ELSE DbDelete() ENDIF ELSEIF 13->auftrnr <> Val( cAuf ) DbDelete() // der Rest: keine/falsche Auftragsnummer und leere Zeilen ENDIF DbSkip() ENDDO // bis hier geht die neue DELETE-Routine vom 14.10.2018 PACK IF .NOT. Bof() GO TOP ENDIF DO WHILE .NOT. Eof() ++nZeile REPLACE 13->zeile WITH Str( nZeile,2,0 ) DbSkip() ENDDO DO WHILE Recno() < 20 APPEND BLANK ENDDO SELECT &nOldArea DbCommit() DbResumeNotifications() DbGotop() DbGoto(nRec) RETURN .T. FUNCTION Wandeln_in_UTF8(cString) LOCAL aUml := {"„","”","","á","Ž","™","š"} LOCAL aUTF8 := {Chr(0xC3)+Chr(0xA4),Chr(0xC3)+Chr(0xB6),Chr(0xC3)+Chr(0xBC),Chr(0xC3)+Chr(0x9F),Chr(0xC3)+Chr(0x84),Chr(0xC3)+Chr(0x96),Chr(0xC3)+Chr(0x9C)} FOR i:=1 TO Len(cString) IF (n := AScan(aUml, cString[i])) > 0 cString := Stuff( cString, i, 1, aUTF8[n]) ++i ENDIF NEXT RETURN cString /* >>>>>>>>>>>>>>> Aus dem Makro ExportPDF der LibreOffice ZUGFeRD-L”sung: <<<<<<<<<<<<<<<<<<<<<<<<<< REM +++ Erstellung des Pfades zum Archivieren der Dateien. Achiv  Jahr  Monat  Dateiname REM +++ Abspeichern der *.odt-Datei und Erstellen einer *.pdf-Datei, die mit dem entsprechenden Namen versehen ebenfalls abgespeichert wird. REM +++ Wird aus FillTableCarryOver aufgerufen //SUB ExportPDF(oNewDoc AS OBJECT, stPrintDir AS STRING, oForm AS OBJECT, stTarget AS STRING, arSources(), boOhnePreis AS BOOLEAN) // DIM oFrames AS OBJECT, oFrame AS OBJECT, oOldDoc AS OBJECT // DIM stFile AS STRING, stDate AS STRING, stFilename AS STRING, stYear AS STRING, stMonth AS STRING // DIM stWriterFile AS STRING, stXRechnungFile AS STRING, stZUGFeRDFile AS STRING, stZUGFeRDPrintDir AS STRING, stPDFSource AS STRING // DIM stWinEnd AS STRING, stXMLSource AS STRING, stPDFTarget AS STRING, stProgUrl AS STRING // DIM inMonth as INTEGER, inOpen AS INTEGER, i AS INTEGER // DIM arg1(), arMonth(), ar() FUNCTION ExportPDF(oNewDoc AS OBJECT, stPrintDir AS STRING, oForm AS OBJECT, stTarget AS STRING, arSources(), boOhnePreis AS BOOLEAN) LOCAL oFrames AS OBJECT, oFrame AS OBJECT, oOldDoc AS OBJECT LOCAL stFile AS STRING, stDate AS STRING, stFilename AS STRING, stYear AS STRING, stMonth AS STRING LOCAL stWriterFile AS STRING, stXRechnungFile AS STRING, stZUGFeRDFile AS STRING, stZUGFeRDPrintDir AS STRING, stPDFSource AS STRING LOCAL stWinEnd AS STRING, stXMLSource AS STRING, stPDFTarget AS STRING, stProgUrl AS STRING LOCAL inMonth as INTEGER, inOpen AS INTEGER, i AS INTEGER LOCAL arg1(), arMonth(), ar() stFile = oForm.getString(oForm.findColumn("RechnungsnummerMitZusatz")) stFile = Join(Split(stFile, "/"),"_") stDate = oForm.getString(oForm.findColumn("Rechnungsdatum")) stKunde = Trim(oForm.getString(oForm.findColumn("KuerzelDatei"))) stRechnungsname = Trim(oForm.getString(oForm.findColumn("Rechnungsname"))) stDateiname = Trim(oForm.getString(oForm.findColumn("Dateiname"))) IF stKunde <> "" THEN stKunde = stKunde & "_" IF stDateiname <> "" THEN stFilename = Join(Split(stDateiname, "/"),"_") ELSEIF stRechnungsname <> "" THEN stFilename = stFile ELSE stFilename = stKunde & stFile & "_" & stDate END IF REM Bei eingegangenen Rechungen, die weitergeleitet werden, erscheint [WL-] IF arSources(0) = "viw_Lieferung_Spalten_Aenderung" THEN stFilename = "WL-" & stFilename IF arSources(0) = "-M" THEN stFilename = stFilename & arSources(1) stPfad = ArchivPfad(stDate,"",True) stFile = stPfad & stFilename stZUGFeRDDefault = ConvertFromUrl(stPfad & "xrechnung.xml") stWriterFile = stFile & ".odt" oNewDoc.DocumentProperties.Title = stFilename stXRechnungFile = stFile & ".xml" stZUGFeRDFile = stFile & "_zug" & ".xml" stPrintDir = stFile & ".pdf" stZUGFeRDPrintDir = stFile & "_zug" & ".pdf" stPDFSource = ConvertFromUrl(stPrintDir) stXMLSource = ConvertFromUrl(stZUGFeRDFile) stPDFTarget = ConvertFromUrl(stZUGFeRDPrintDir) DIM filterArgs(1) as New com.sun.star.beans.PropertyValue filterArgs(1).Name = "SelectPdfVersion" filterArgs(1).Value = 3 DIM arg(1) AS NEW com.sun.star.beans.PropertyValue arg(0).name = "FilterName" arg(0).value = "writer_pdf_Export" arg(1).Name = "FilterData" arg(1).Value = filterArgs oNewDoc.storeToURL(stPrintDir, arg()) REM Writer-Datei bleibt offen - erst kontrollieren, ob eine entsprechende Datei bereits offen ist oFrames = StarDesktop.getFrames() FOR i = 1 TO oFrames.getCount() oFrame = oFrames.getByIndex(i-1) IF InStr(oFrame.Title, stFilename & ".odt") > 0 THEN inOpen = 1 oOldDoc = oFrame.Controller.Model END IF NEXT IF inOpen = 1 THEN oOldDoc.close(True) END IF oNewDoc.storeAsURL(stWriterFile, arg1()) REM Nur als XRechnung erstellen und per Mail weiterleiten, wenn das Dokument Preise enth„lt. REM Ansonsten wird das Dokument nur gespeichert. IF boOhnePreis = False AND boXRErstellen = True THEN oDatasource = thisDatabaseDocument.CurrentController oConnection = oDatasource.ActiveConnection() oSQL_Statement = oConnection.createStatement() stSql = "SELECT ""Java_Pfad"" FROM ""tbl_Firma""" oResult = oSQL_Statement.executeQuery(stSql) WHILE oResult.Next stProgUrl = oResult.getString(1) WEND IF stProgUrl = "" THEN stProgUrl = "java" IF GetGuiType = 1 THEN stProgUrl = stProgUrl & ".exe"' Windows END IF stApp = ConvertFromUrl(StartPfad & "MustangZug.jar") 'Datei Mustang-CLI-2.20.0.jar einfach umbenannt, damit bei einem Tausch der Code nicht ge„ndert werden muss. Geht auch mit Link. IF stTarget = "ZUGFeRD" THEN SaveZUGFeRD(oForm,stZUGFeRDFile,arSources()) IF FileExists(stPDFTarget) THEN kill(stPDFTarget) 'šberschreiben geht sonst nicht mit Mustang stCommand = stProgUrl & " -jar """ & stApp & """ --action combine --source """ & stPDFSource & """ --source-xml """ & stXMLSource &_ """ --format zf --version 2 --profile X --out """ & stPDFTarget & """ --no-additional-attachments" Shell( stCommand, 1, "", true ) ELSE SaveXRechnung(oForm,stXRechnungFile,arSources()) END IF IF FileExists(StartPfad & "MustangZug.jar") THEN stMsg = "?? Soll die angezeigte Rechnung zus„tzlich validiert werden? ??" & CHR(13) & "Die Validierung kann ca. eine Minute in Anspruch nehmen." inMsg = MsgBox (stMsg, 292, "Validieren") '"Nein" (2. Button) ist der Defaulteintrag IF inMsg = 6 THEN IF stTarget = "ZUGFeRD" THEN stValTest = stPDFTarget REM Im Pfad der Datenbankdatei befindet sich ein Link zu dem Verzeichnis, in dem die Ergebnisdatei gesucht wird. Der Link ist mit "Validation" gekennzeichnet. stValidate = StartPfad & "Validation/" & stFilename & "_zug_result.pdf" ELSE stValTest = ConvertFromUrl(stXRechnungFile) REM Im Pfad der Datenbankdatei befindet sich ein Link zu dem Verzeichnis, in dem die Ergebnisdatei gesucht wird. Der Link ist mit "Validation" gekennzeichnet. stValidate = StartPfad & "Validation/" & stFilename & "_result.pdf" END IF REM Validierung der erzeugten Datei - bisher nur ber Umwege lauff„hig, da die erzeugte PDF-Datei an der Stelle abgeladen wird, von der aus die Base-Datei ge”ffnet wird. REM Wird die Base-Datei durch einen direkten Klick auf die Datei selbst ge”ffnet, so erscheint die Validierungsdatei an diesem Ort. REM Nur in diesem Fall sollte aus Link fr stValidate ® "Validation/" & ¯ entfernt werden. REM Wird die Base-Datei durch einen Link vom Desktop aus ge”ffnet, so erscheint die Validierungsdatei auf dem Desktop. REM Wird die Base-Datei ber das Start-Men des Betriebssystems ge”ffnet, so erscheint die Validierungsdatei direkt im eigenen Home-Verzeichnis. stCommand = stProgUrl & " -jar """ & stApp & """ --action validate --no-notices --source """ & stValTest & """ --log-as-pdf" Shell( stCommand, 1, "", true ) IF FileExists(stValidate) THEN REM Nur wenn die Datei existiert soll der Aufruf versucht werden. Ansonsten soll der (falsche) Pfad in einer Fehlermeldung ausgegeben werden. oShell = createUnoService("com.sun.star.system.SystemShellExecute") oShell.execute(stValidate,"",0) ELSE stValidate = ConvertFromUrl(stValidate) msgbox "Die PDF-Datei mit dem Ergebnis der Validierung konnte nicht gefunden werden." & CHR(13) & "Der angebliche Pfad sollte sein:" & CHR(13) & stValidate END IF END IF END IF stMsg = "?? Soll die Rechnung an das Mailprogamm weitergeleitet werden? ??" & CHR(13) & "Die Rechnung wird bei der ersten Weiterleitung" & CHR(13) & "mit einem entsprechenden Versanddatum gekennzeichnet." inMsg = MsgBox (stMsg, 36, "Mail erstellen") IF inMsg = 6 THEN StartMail(oForm,stFile,stTarget) END IF END IF END SUB */ //ENDE