====== 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