====== std.edi.catalog ======
Stammdaten-Austausch per EDIFACT: Artikelkataloge mit Preisen und Gültigkeitszeiträumen (PRICAT) sowie Partnerdaten mit GLN-Adressen (PARTIN). GS1-Validierungsfunktionen für GTIN und GLN sind in dieser Unit enthalten.
* **PRICAT** — Price/Sales Catalogue: GTINs, Brutto-/Nettopreise, Mengeneinheiten, Gültigkeitszeiträume
* **PARTIN** — Party Information: GLN-basierte Adressen und Kontaktdaten
GS1-Validierungen:
^ Funktion ^ Unterstützte Längen ^ Algorithmus ^
| ''EdiGtinCheck'' | 8, 12, 13, 14 Stellen | GS1 Mod-10 (Prüfziffer) |
| ''EdiGlnCheck'' | 13 Stellen | GS1 Mod-10 |
**Achtung**: ''EdiPricatWrite'' validiert GTINs **nicht** — das liegt in der Verantwortung des Callers.
import std.edi.catalog;
// GTIN validieren
var gtin: pchar := "04012345678901";
if (EdiGtinCheck(gtin as int64, 14) == 1) {
PrintLn("GTIN gültig");
}
// Preiskatalog mit einem Artikel aufbauen
var item: int64 := alloc(EDI_PRICAT_ITEM_SIZE);
poke64(item + EDI_PRICAT_GTIN, gtin as int64);
poke64(item + EDI_PRICAT_GTINLEN, 14);
poke64(item + EDI_PRICAT_DESC, "Schrauben M6x20" as int64);
poke64(item + EDI_PRICAT_DESCLEN, 16);
poke64(item + EDI_PRICAT_GROSSPRICE, 299); // 2,99 €
poke64(item + EDI_PRICAT_NETPRICE, 251); // 2,51 €
poke64(item + EDI_PRICAT_CURRENCY, "EUR" as int64);
poke64(item + EDI_PRICAT_CURRENCYLEN,3);
poke64(item + EDI_PRICAT_VALIDFROM, "20260101" as int64);
poke64(item + EDI_PRICAT_VALIDTO, "20261231" as int64);
var out: int64 := alloc(8192);
var n: int64 := EdiPricatWrite(item, 1, out, 8192);
free(item, EDI_PRICAT_ITEM_SIZE);
free(out, 8192);
----
===== Imports =====
* ''std.edi.core''
* ''std.alloc''
----
===== Structs =====
==== EdiPricatItem (EDI_PRICAT_ITEM_SIZE = 96 Bytes) ====
^ Offset-Konstante ^ Inhalt ^
| ''EDI_PRICAT_GTIN / EDI_PRICAT_GTINLEN'' | GTIN-Zeiger und -Länge |
| ''EDI_PRICAT_DESC / EDI_PRICAT_DESCLEN'' | Artikelbeschreibung |
| ''EDI_PRICAT_GROSSPRICE'' | Bruttopreis × 100 (z. B. 299 = 2,99 €) |
| ''EDI_PRICAT_NETPRICE'' | Nettopreis × 100 |
| ''EDI_PRICAT_CURRENCY / EDI_PRICAT_CURRENCYLEN'' | Währungscode (z. B. "EUR") |
| ''EDI_PRICAT_UNIT / EDI_PRICAT_UNITLEN'' | Mengeneinheit (z. B. "PCE", optional) |
| ''EDI_PRICAT_VALIDFROM'' | Zeiger auf Gültigkeitsbeginn "YYYYMMDD" (0 = keins) |
| ''EDI_PRICAT_VALIDTO'' | Zeiger auf Gültigkeitsende "YYYYMMDD" (0 = keins) |
==== EdiParty (EDI_PARTY_SIZE = 112 Bytes) ====
^ Offset-Konstante ^ Inhalt ^
| ''EDI_PARTY_GLN / EDI_PARTY_GLNLEN'' | GLN-Zeiger und -Länge |
| ''EDI_PARTY_NAME / EDI_PARTY_NAMELEN'' | Firmenname |
| ''EDI_PARTY_STREET / EDI_PARTY_STREETL'' | Straße + Hausnummer |
| ''EDI_PARTY_CITY / EDI_PARTY_CITYL'' | Ort |
| ''EDI_PARTY_POSTCODE / EDI_PARTY_POSTCODEL'' | Postleitzahl |
| ''EDI_PARTY_COUNTRY / EDI_PARTY_COUNTRYL'' | Ländercode (z. B. "DE") |
| ''EDI_PARTY_ROLE / EDI_PARTY_ROLEL'' | Parteirolle (z. B. "SU", "BY") |
==== EdiProact (EDI_PROACT_SIZE = 40 Bytes) ====
Aktivitätsdaten (PROACT) für Warengruppen-Berichte.
^ Offset-Konstante ^ Inhalt ^
| ''EDI_PROACT_GTIN / EDI_PROACT_GTINLEN'' | GTIN-Zeiger und -Länge |
| ''EDI_PROACT_QTY'' | Menge × 1000 (3 Dezimalstellen) |
| ''EDI_PROACT_DATE'' | Zeiger auf Datum "YYYYMMDD" |
| ''EDI_PROACT_TYPE'' | Aktivitätstyp: 1=Verkauf, 2=Rückgabe, 3=Transfer |
----
===== Funktionen =====
==== GS1-Validierung ====
^ Signatur ^ Beschreibung ^
| ''EdiGtinCheck(ptr: int64, len: int64): int64'' | Prüft GTIN-Prüfziffer (Mod-10). Gibt 1=gültig, 0=ungültig. Unterstützt Längen 8, 12, 13, 14. |
| ''EdiGlnCheck(ptr: int64, len: int64): int64'' | Prüft GLN-Prüfziffer (Mod-10). Gibt 1=gültig, 0=ungültig. Erwartet exakt 13 Stellen. |
==== PRICAT ====
^ Signatur ^ Beschreibung ^
| ''EdiPricatWrite(items: int64, count: int64, out: int64, outMax: int64): int64'' | Schreibt PRICAT. GTINs werden **nicht** validiert (Caller-Verantwortung). |
| ''EdiPricatRead(buf: int64, bufLen: int64, items: int64, maxItems: int64): int64'' | Parst PRICAT; gibt Artikelanzahl zurück. Zero-Copy: Zeiger in ''items'' zeigen in ''buf''. |
==== PARTIN ====
^ Signatur ^ Beschreibung ^
| ''EdiPartinWrite(party: int64, out: int64, outMax: int64): int64'' | Schreibt PARTIN (eine Partei) |
| ''EdiPartinRead(buf: int64, bufLen: int64, party: int64): int64'' | Parst PARTIN; gibt ''EDI_OK'' oder Fehlercode |
----
===== Codebeispiel — Eingehenden Katalog lesen =====
import std.edi.catalog;
var items: int64 := alloc(500 * EDI_PRICAT_ITEM_SIZE);
var count: int64 := EdiPricatRead(inBuf, inBufLen, items, 500);
var i: int64 := 0;
while (i < count) {
var item: int64 := items + i * EDI_PRICAT_ITEM_SIZE;
var gptr: int64 := peek64(item + EDI_PRICAT_GTIN);
var glen: int64 := peek64(item + EDI_PRICAT_GTINLEN);
// GTIN validieren
if (EdiGtinCheck(gptr, glen) == 0) {
PrintLn("Ungültige GTIN in Position " + IntToStr(i + 1));
}
i := i + 1;
}
free(items, 500 * EDI_PRICAT_ITEM_SIZE);
----
===== Quelldatei =====
^ Unit ^ Datei ^
| ''std.edi.catalog'' | ''std/edi/catalog.lyx'' |
Letzte Aktualisierung: 2026-06-16