Skip to content

Latest commit

 

History

History
157 lines (132 loc) · 8.56 KB

checking.md

File metadata and controls

157 lines (132 loc) · 8.56 KB

Prüfen

English

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.

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, ValidateBuffer und ValidateTarget. Ein Hauptschema gilt für mehrere Phasen (X84 hat ein eigenes); xml.xsd und xmldsig-core-schema.xsd müssen daneben liegen. 3.0 und 3.1 (2007-11) nennen ihr Hauptschema beide GAEB_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. ValidateModel und ValidateBill schreiben 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 sein OutputTarget, 3.3, geprüft).
  • Ein fehlendes oder nicht ladbares Schema löst ELandrixGaebError aus; False heißt immer, dass das Dokument ungültig ist. HasTarget fragt, ohne zu laden.
  • Befunde sind GAEB-XSD-001 (Fehler); der Code des Validators (Xerces, z. B. cvc-complex-type.2.4.a) steht in XsdCode der 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-003 bei jeder Prüfung; Verify vergleicht alle Dateien des Ordners.
  • Schemadokumente werden nur aus dem Ordner gelesen (die Suche folgt keinen Links); der Ordner ist vertrauenswürdige Eingabe. Ein TLandrixGaebXmlXsdSchemas behä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.

Konvertierung prüfen

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 mit gwmBestEffort, 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, gcrFailed oder gcrNotRun; eine Prüfung, die nicht lief, wird mit GAEB-CNV-002 und 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), Structure scheitert.
  • Die Meldungen des Lesens der Datei bleiben in der Liste, die LoadFromFile bekam (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 LandrixGaebXmlXsdValidateTarget gegen die Originalschemas zu prüfen.

CheckGaeb -convert=3.3 alt.x83 gibt die drei Zustände und beide Gruppen von Meldungen aus.

Meldungen

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.

Der Regelkatalog

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.