Eine GAEB-Datei wird in Stufen geprüft. Jede Stufe fügt ihre Befunde einer
TLandrixGaebDiagnostics hinzu; die Erkennung liefert einen Record mit Accepted, die übrigen
Stufen liefern True, wenn sie keinen Fehler gefunden haben.
| Stufe | Funktion | Unit | Was |
|---|---|---|---|
| 1 | LandrixGaebDetectFile |
LandrixGaebDetect |
Format, Version, Ausgabe, Phase aus dem Anfang der Datei; lehnt Eingaben ab, die nicht verarbeitet werden dürfen (Größengrenze, Dokumenttyp-Deklaration, im gelesenen Teil nicht wohlgeformt, unbekanntes Format); die ganze Datei prüfen das Lesen oder Stufe 2 auf Wohlgeformtheit |
| 2 | LandrixGaebXmlCheckFile |
LandrixGaebXmlCheck |
Inhaltsmodelle des Schemas des angegebenen Ziels: Reihenfolge und Anzahl der Elemente, einfache Typen mit allen Facetten, ID und IDREF |
| 3 | LandrixGaebCheckRules |
LandrixGaebRules |
Geschäftsregeln der Phase auf dem Syntaxmodell |
| 4 | LandrixGaebCheckPair |
LandrixGaebRules |
Paarregeln zwischen zwei Dokumenten: X83 -> X84, X84 -> X86, X86 -> X87 |
Ok := LandrixGaebXmlCheckFile('bid.x84', Diags, 0, Det);
Doc := LandrixGaebXmlReadFile('bid.x84', Diags, 0, Det);
try
Ok := LandrixGaebCheckRules(Doc, Det.Target, Diags) and Ok;
finally
Doc.Free;
end;
Write(Diags.ToText);Das Beispiel CheckGaeb führt alle Stufen aus und mit
einer zweiten Datei die Paarregeln; mit -xsd=<Ordner> auch die Prüfung gegen die
Originalschemas.
Stufe 2 ist kein allgemeiner XML-Schema-Validator: Sie kennt genau die Schemas der unterstützten Ziele. Maßstab bleibt die Prüfung gegen die Originalschemas.
LandrixGaebXmlXsd (ab 1.1.0) prüft gegen die originalen GAEB-XSD-Dateien mit dem
XML-Schema-Validator von LandrixXml. Die Schemas gehören nicht zur Bibliothek: Sie laden sie von
gaeb.de in einen eigenen Ordner, zum Beispiel mit
pwsh tools/fetch-gaeb-xsd.ps1 -Folder C:\GAEB\Schemas
Das Skript holt die Pakete für GAEB DA XML 3.2 (2013-10), 3.3 (2021-05) und 3.1 (2007-11 und
2009-12) und prüft jede Datei gegen die SHA-256, die die Bibliothek kennt. Die Ausgabe 2019-11 von
3.3 und 3.0 (2004-07) bietet der GAEB nicht mehr an; wer sie braucht, legt die Schemas selbst in
den Ordner (3.0: GAEB_DA_XML.xsd mit seiner xml.xsd und xmldsig-core-schema.xsd in einem
eigenen Ordner).
Schemas := TLandrixGaebXmlXsdSchemas.Create('C:\GAEB\Schemas');
try
Ok := LandrixGaebXmlXsdValidateFile(Schemas, 'bid.x84', Diags, 0, Det);
{ das LV so, wie SaveToFile es schreiben würde, vor dem Speichern }
Ok := LandrixGaebXmlXsdValidateBill(Schemas, Bill, Diags);
finally
Schemas.Free;
end;- Ein Hauptschema (
GAEB_DA_XML_84_3.3_2021-05.xsd) wird über seinen Namen irgendwo unterhalb des Ordners gesucht; seine Lib-Datei muss daneben liegen. Ein doppelt gefundenes Hauptschema ist ein Fehler. - Dateien in GAEB DA XML 3.0 und 3.1 (ab 1.2.0) werden so geprüft, wie sie gelesen werden, gegen
ihre eigenen Originalschemas:
ValidateFile,ValidateStream,ValidateBufferundValidateTarget. Ein Hauptschema gilt für mehrere Phasen (X84 hat ein eigenes);xml.xsdundxmldsig-core-schema.xsdmüssen daneben liegen. 3.0 und 3.1 (2007-11) nennen ihr Hauptschema beideGAEB_DA_XML.xsd: eine solche Datei wird nur verwendet, wenn sie die GAEB-Datei der Version ist, eine geänderte wird nie durch Raten einer Version zugeordnet. Die Prüfsummen von 3.0 sind die einer Referenzkopie einer älteren GAEB-Distribution.ValidateModelundValidateBillschreiben zuerst, und 3.0/3.1 lassen sich nicht schreiben: sie lösen für diese Ziele eine Ausnahme aus (ein aus 3.x gelesenes LV wird als seinOutputTarget, 3.3, geprüft). - Ein fehlendes oder nicht ladbares Schema löst
ELandrixGaebErroraus;Falseheißt immer, dass das Dokument ungültig ist.HasTargetfragt, ohne zu laden. - Befunde sind
GAEB-XSD-001(Fehler); der Code des Validators (Xerces, z. B.cvc-complex-type.2.4.a) steht inXsdCodeder Meldung und in Klammern im Text. Meldungen zitieren nie Werte des Dokuments.GAEB-XSD-002(Warnung) sagt, dass ein Teil nicht geprüft wurde (nach 1000 Fehlern hört der Validator auf). - Eine Schemadatei, die von der offiziellen Datei abweicht, wird verwendet, mit der Warnung
GAEB-XSD-003bei jeder Prüfung;Verifyvergleicht alle Dateien des Ordners. - Schemadokumente werden nur aus dem Ordner gelesen (die Suche folgt keinen Links); der Ordner
ist vertrauenswürdige Eingabe. Ein
TLandrixGaebXmlXsdSchemasbehält die geladenen Schemas: einmal anlegen, eines je Thread.
Die XSD-Prüfung ergänzt Stufe 2, sie ersetzt sie nicht: Stufe 2 ist schneller und Teil jedes Schreibens.
LandrixGaebCheckConversion (Unit LandrixGaebConversion) prüft, was aus einem LV wird, wenn
es für ein anderes Ziel gespeichert wird, etwa eine Datei in GAEB DA XML 3.0 oder 3.1, die nur
gelesen wird, gespeichert als 3.3. Das LV wird nicht geändert und nichts repariert.
ReadDiags := TLandrixGaebDiagnostics.Create;
Diags := TLandrixGaebDiagnostics.Create;
Bill := TLandrixGaebBillOfQuantities.LoadFromFile('alt.x83', ReadDiags, 0);
try
R := LandrixGaebCheckConversion(Bill, Bill.OutputTarget, Diags, nil);
if (R.Writing = gcrPassed) and (R.Structure = gcrPassed) and (R.Rules <> gcrFailed) then
Bill.SaveToFile('neu.x83', nil);
finally
Bill.Free;
end;Writing: bestanden, wenn beim Schreiben nichts verloren geht (GAEB-WRT-001,-002,-004); geschrieben wird mitgwmBestEffort, die Ausgabe entsteht also auch mit Verlusten.Structure: Stufe 2 an genau dieser Ausgabe.Rules: die Geschäftsregeln der Ausgabephase an der Ausgabe, wie diese Bibliothek sie zurückliest; sie laufen auch, wenn eine frühere Prüfung gescheitert ist.- Jeder Zustand ist
gcrPassed,gcrFailedodergcrNotRun; eine Prüfung, die nicht lief, wird mitGAEB-CNV-002und dem Grund gemeldet.GAEB-CNV-001: ein Wert enthält Zeichen, die XML nicht tragen kann, es wurde nichts geschrieben.GAEB-CNV-003: die Ausgabe überschreitet eine Grenze des XML-Lesers (etwa die Schachtelungstiefe),Structurescheitert. - Die Meldungen des Lesens der Datei bleiben in der Liste, die
LoadFromFilebekam (Pfade der Datei); die der Konvertierung tragen Pfade der Ausgabe. Meldungen des Schreibers haben keine Zeile, die der späteren Prüfungen Zeilen der Ausgabe. - Mit einem Stream als letztem Parameter wird die Ausgabe herausgegeben, etwa zum Speichern oder
um genau diese Bytes mit
LandrixGaebXmlXsdValidateTargetgegen die Originalschemas zu prüfen.
CheckGaeb -convert=3.3 alt.x83 gibt die drei Zustände und beide Gruppen von Meldungen aus.
Jeder Befund hat eine stabile Regelkennung (RuleId), eine Schwere (gsInformation, gsWarning,
gsError, gsFatal), den Pfad des Elements, Zeile und Spalte, soweit bekannt, und einen
englischen Text. Die Texte enthalten keine Werte des LV (Texte, Mengen, Preise); einige nennen,
was die Eingabe angibt, etwa einen fremden Namensraum, daher Protokolle wie die Eingabe behandeln.
| Präfix | Herkunft |
|---|---|
GAEB-DET-... |
Erkennung |
GAEB-XML-... |
Lesen |
GAEB-CHK-... |
Prüfung der Inhaltsmodelle |
GAEB-WRT-... |
Schreiben (Verluste, ersetzte Werte) |
GAEB-BR-... |
Geschäfts- und Paarregeln |
GAEB-PRC-... |
Prozessfunktionen |
Diags.ToText liefert eine Zeile je Befund zur Anzeige; ToWideText behält jedes Zeichen der
Pfade auch unter Compilern, deren string nicht Unicode ist.
LandrixGaebRuleCount, LandrixGaebRuleAt(I) und LandrixGaebRuleIndex(ID) führen die Regeln mit
Kennung, Titel, Schwere, den Phasen, für die sie gelten, ob sie zwei Dokumente brauchen, und dem
Abschnitt der GAEB-Dokumentation, auf dem sie beruhen. LandrixGaebRuleSetVersion nennt die
Version des Regelwerks; sie ändert sich unabhängig von der Bibliotheksversion.
Fehler sind Verstöße, die ein Dokument mehrdeutig oder seine Beträge falsch machen: OZ eindeutig und passend zur Gliederung, Mengen, Pauschale und vom Bieter einzutragende Menge, EP-Anteile, Gesamtbeträge der Positionen und Summen der Bereiche und des LV (exakt gerechnet, kaufmännisch gerundet), Bezugsbeschreibungen, Ausführungsbeschreibungen, Zuschlagspositionen und zwischen Anfrage und Angebot die Positionen, Bereiche, Stellen der Einheitspreise, Summen und Textergänzungen. Formverstöße, die echte Exportprogramme erzeugen, sind Warnungen. Zwischen Angebot, Auftrag und Auftragsbestätigung dürfen sich Preise in der Verhandlung ändern, daher sind diese Paarregeln Warnungen.