====== std.edi.rfq ====== Anfrage- und Angebotsprozess per EDIFACT: Käufer sendet eine Angebotsanfrage (REQOTE), Lieferant antwortet mit einem Angebot (QUOTES). Der Kreuzreferenz-Mechanismus über ''RFF+RFQ'' ist Pflicht — jedes QUOTES muss die Nummer des zugehörigen REQOTE tragen. * **REQOTE** (BGM 311) — Request for Quotation: Artikel, Mengen, Wunsch-Liefertermine * **QUOTES** (BGM 315) — Quotation: Preise, Verfügbarkeit, Liefertermine import std.edi.rfq; // REQOTE mit 2 Positionen schreiben var lines: int64 := alloc(2 * EDI_RFQ_LINE_SIZE); // Zeile 1: GTIN 04012345678901, Menge 50, benötigt bis 20261231 poke64(lines + EDI_RFQ_LINE_GTIN, "04012345678901" as int64); poke64(lines + EDI_RFQ_LINE_GTINLEN, 14); poke64(lines + EDI_RFQ_LINE_QTY, 50); poke64(lines + EDI_RFQ_LINE_DATE, "20261231" as int64); // Zeile 2: GTIN 04012345678918, Menge 100 var line2: int64 := lines + EDI_RFQ_LINE_SIZE; poke64(line2 + EDI_RFQ_LINE_GTIN, "04012345678918" as int64); poke64(line2 + EDI_RFQ_LINE_GTINLEN, 14); poke64(line2 + EDI_RFQ_LINE_QTY, 100); var out: int64 := alloc(8192); var n: int64 := EdiReqoteWrite( "RFQ-2026-042" as int64, "20261201" as int64, lines, 2, out, 8192); free(lines, 2 * EDI_RFQ_LINE_SIZE); free(out, 8192); ---- ===== Imports ===== * ''std.edi.core'' * ''std.alloc'' ---- ===== Structs ===== ==== EdiRfqLine (EDI_RFQ_LINE_SIZE = 48 Bytes) ==== Eine Position in einer Angebotsanfrage. ^ Offset-Konstante ^ Inhalt ^ | ''EDI_RFQ_LINE_GTIN / EDI_RFQ_LINE_GTINLEN'' | GTIN-Zeiger und -Länge | | ''EDI_RFQ_LINE_QTY'' | Angefragte Menge | | ''EDI_RFQ_LINE_UNIT / EDI_RFQ_LINE_UNITLEN'' | Mengeneinheit (z. B. "PCE", optional) | | ''EDI_RFQ_LINE_DATE'' | Zeiger auf 8-stelliges Wunschdatum "YYYYMMDD" (0 = keins) | ==== EdiQuoteLine (EDI_QUOTE_LINE_SIZE = 56 Bytes) ==== Eine Position in einem Angebot. ^ Offset-Konstante ^ Inhalt ^ | ''EDI_QUOTE_LINE_GTIN / EDI_QUOTE_LINE_GTINLEN'' | GTIN-Zeiger und -Länge | | ''EDI_QUOTE_LINE_PRICE'' | Preis × 100 (Festkomma; 1999 = 19,99 €) | | ''EDI_QUOTE_LINE_CURRENCY / EDI_QUOTE_LINE_CURRENCYLEN'' | Währung (z. B. "EUR") | | ''EDI_QUOTE_LINE_DATE'' | Zeiger auf Lieferdatum "YYYYMMDD" (0 = keins) | | ''EDI_QUOTE_LINE_AVAIL'' | Verfügbarkeit: 1 = verfügbar, 0 = nicht verfügbar | ==== EdiRfqHdr (EDI_RFQHDR_SIZE = 32 Bytes) ==== Kopfdaten eines eingehenden REQOTE. ^ Offset-Konstante ^ Inhalt ^ | ''EDI_RFQHDR_NUM / EDI_RFQHDR_NUMLEN'' | RFQ-Nummer (Zeiger in Empfangspuffer) | | ''EDI_RFQHDR_DATE / EDI_RFQHDR_DATELEN'' | Dokumentdatum | ==== EdiQuoteHdr (EDI_QUOTEHDR_SIZE = 32 Bytes) ==== Kopfdaten eines eingehenden QUOTES. ^ Offset-Konstante ^ Inhalt ^ | ''EDI_QUOTEHDR_NUM / EDI_QUOTEHDR_NUMLEN'' | Angebotsnummer | | ''EDI_QUOTEHDR_RFQREF / EDI_QUOTEHDR_RFQREFLEN'' | Rückverweis auf REQOTE-Nummer (''RFF+RFQ'') | ---- ===== Funktionen ===== ==== REQOTE ==== ^ Signatur ^ Beschreibung ^ | ''EdiReqoteWrite(rfqNum: int64, date: int64, lines: int64, lineCount: int64, out: int64, outMax: int64): int64'' | Schreibt REQOTE. ''rfqNum'' ist Pflicht (0 → gibt ''-1'' zurück). ''date'' = Zeiger auf "YYYYMMDD" oder 0. | | ''EdiReqoteRead(buf: int64, bufLen: int64, hdr: int64, lines: int64, maxLines: int64): int64'' | Parst REQOTE; befüllt ''hdr'' (EDI_RFQHDR_SIZE) und ''lines''-Array. Gibt Zeilenanzahl zurück. Zero-Copy: Zeiger in ''hdr/lines'' zeigen in ''buf''. | ==== QUOTES ==== ^ Signatur ^ Beschreibung ^ | ''EdiQuotesWrite(rfqRef: int64, quoteNum: int64, lines: int64, lineCount: int64, out: int64, outMax: int64): int64'' | Schreibt QUOTES. ''rfqRef'' ist Pflicht (0 → gibt ''-1'' zurück). ''quoteNum'' = eigene Angebotsnummer (optional, 0 erlaubt). | | ''EdiQuotesRead(buf: int64, bufLen: int64, hdr: int64, lines: int64, maxLines: int64): int64'' | Parst QUOTES; befüllt ''hdr'' und ''lines''. Gibt Zeilenanzahl zurück. | ---- ===== Codebeispiel — Angebot lesen und auswerten ===== import std.edi.rfq; var hdr: int64 := alloc(EDI_QUOTEHDR_SIZE); var lines: int64 := alloc(50 * EDI_QUOTE_LINE_SIZE); var count: int64 := EdiQuotesRead(inBuf, inBufLen, hdr, lines, 50); // Rückverweis auf REQOTE prüfen var rfqRef: int64 := peek64(hdr + EDI_QUOTEHDR_RFQREF); PrintLn("Angebot auf RFQ: " + (rfqRef as pchar)); var i: int64 := 0; while (i < count) { var line: int64 := lines + i * EDI_QUOTE_LINE_SIZE; var preis: int64 := peek64(line + EDI_QUOTE_LINE_PRICE); var avail: int64 := peek64(line + EDI_QUOTE_LINE_AVAIL); PrintLn(" Preis: " + IntToStr(preis / 100) + "." + IntToStr(preis - (preis / 100) * 100) + " EUR, verfügbar: " + IntToStr(avail)); i := i + 1; } free(lines, 50 * EDI_QUOTE_LINE_SIZE); free(hdr, EDI_QUOTEHDR_SIZE); ---- ===== Hinweise ===== * **rfqRef Pflicht in QUOTES**: ''EdiQuotesWrite'' gibt ''-1'' zurück, wenn ''rfqRef'' null oder leer ist. EDIFACT fordert diesen Rückverweis (''RFF+RFQ'') für die Auftragszuordnung. * **Preise als Festkomma**: Preise werden als ''int64 × 100'' gespeichert. ''1999'' bedeutet ''19,99''. Beim Schreiben wird daraus ''19.99'' im EDIFACT-Format. * **Datum-Format**: Alle Datum-Felder erwarten genau 8 Zeichen ''YYYYMMDD'' — keine Trennzeichen. ---- ===== Quelldatei ===== ^ Unit ^ Datei ^ | ''std.edi.rfq'' | ''std/edi/rfq.lyx'' | Letzte Aktualisierung: 2026-06-16