- Thema
- VB6
- SDK-Mitglieder
- AddProduct_Comfort() AddSellerTAX() LastError Licensekey SaveXML() WriteSeller() ZUGFeRD_Profile
- Business Terms
- BG-4 Verkäufer BG-7 Käufer BG-25 Rechnungsposition
- Codebeispiele
- VB6 / VBScript (COM)
- Veröffentlicht
Kurz: Die Meldung „Prozedur zu groß“ (englisch „Procedure too large“) kommt von VBA selbst, nicht vom Aloaha ZUGFeRD SDK. Eine einzelne Prozedur (Sub oder Function) darf in VBA und VB6 höchstens etwa 64 KB übersetzten Code enthalten. Wer eine ganze E-Rechnung – Kopf, Verkäufer, Käufer, Zahlung, 50 Positionen, Steuer, Summen – in eine einzige Prozedur schreibt, erreicht diese Grenze schnell; die Zeile, bei der die Meldung erscheint, ist meist nur der Tropfen, der das Fass überlaufen lässt. Die Lösung: den Code auf mehrere kleine Prozeduren verteilen und das SDK-Objekt übergeben.
Lösung: eine Prozedur je Abschnitt
Public Sub ERechnungErstellen()
Dim alo As Object
Set alo = CreateObject("Aloaha_ZUGFeRD.XML")
alo.Licensekey = "IHR-LIZENZSCHLUESSEL"
alo.ZUGFeRD_Profile = 1
Call SetzeKopf(alo)
Call SetzeVerkaeufer(alo)
Call SetzeKaeufer(alo)
Call SetzeZahlung(alo)
Call SetzePositionen(alo)
Call SetzeSteuerUndSummen(alo)
If alo.SaveXML("C:\Rechnungen\RE-2027-0001.xml") = False Then MsgBox alo.LastError
End Sub
Public Sub SetzeVerkaeufer(alo As Object)
Call alo.WriteSeller("Muster GmbH", "20095", "Hamburg", "Hauptstr. 1", "", "DE", "DE123456789")
Call alo.AddSellerTAX("01423809276", "FC")
' ... weitere Verkäuferangaben
End Sub
Die Positionen gehören in eine Schleife statt in viele einzelne Zeilen – dann bleibt auch SetzePositionen klein, egal wie viele Positionen die Rechnung hat:
Public Sub SetzePositionen(alo As Object)
Dim rs As DAO.Recordset, nPos As Integer
Set rs = CurrentDb.OpenRecordset("SELECT * FROM Rechnungspositionen WHERE RechNr = '" & Forms!pruev!RechNr & "'")
Do While Not rs.EOF
nPos = nPos + 1
Call alo.AddProduct_Comfort(nPos, "", Nz(rs!ArtNr, ""), Betrag(rs!Menge), "C62", Nz(rs!Bezeichnung, ""), "", _
"", "EUR", "", "C62", False, "", "", "", Betrag(rs!Preis), "EUR", "1.00", "C62", "VAT", "S", Betrag(rs!MwSt), "", _
Betrag(rs!Menge * rs!Preis), "EUR", "", "")
rs.MoveNext
Loop
rs.Close
End Sub
Die Hilfsfunktion Betrag() für Beträge mit Dezimalpunkt steht in ZUGFeRD und XRechnung mit VB6, VB5 und VBA.
Zwei weitere typische Stolpersteine
- Typografische Anführungszeichen: Aus Word oder Outlook kopierter Code enthält oft „“ bzw. “ ” statt
". VBA kennt nur das gerade Anführungszeichen – Code deshalb im VBA-Editor tippen oder die Zeichen ersetzen. - Leere Felder (Null): Ein leeres Formular- oder Tabellenfeld liefert
Null; die Übergabe an das SDK bricht dann mit „Unzulässige Verwendung von Null“ ab. MitNz(Feld, "")sind Sie auf der sicheren Seite.
Welche Verkäuferangaben es gibt und wie sie heißen, zeigt USt-IdNr. und Steuernummer des Verkäufers setzen.
Häufige Fragen
Was bedeutet „Prozedur zu groß“ in Access?
Eine einzelne VBA-Prozedur darf höchstens etwa 64 KB übersetzten Code enthalten. Ist sie größer, meldet VBA „Prozedur zu groß“. Die Meldung kommt von VBA, nicht vom ZUGFeRD SDK.
Wie behebe ich „Prozedur zu groß“?
Teilen Sie den Code auf mehrere Prozeduren auf, zum Beispiel für Kopf, Verkäufer, Käufer, Positionen und Summen, und übergeben Sie das SDK-Objekt als Parameter. Positionen schreiben Sie in einer Schleife statt Zeile für Zeile.
Warum erscheint die Meldung bei einer harmlosen Zeile?
Weil genau diese Zeile die Prozedur über die Grenze bringt. Der eigentliche Grund ist die Gesamtgröße der Prozedur.
Warum meldet VBA einen Syntaxfehler bei Anführungszeichen?
Aus Word oder E-Mails kopierter Code enthält oft typografische Anführungszeichen. VBA erwartet das gerade Anführungszeichen.