(Erledigt) VK Zeilentext automatisch füllen lassen

18. September 2023 16:30

Hallo Forumgemeinde,

ich versuche nun bereits den gesamten Tag eine Lösung für folgende Problemstellung zu finden.
Beim Erfassen von Verkaufszeilen (Angebot und Auftrag) soll im Hintergrund eine Prüfung bzgl. verfügbarem Bestand erfolgen.
Je nach Ergebnis dieser Prüfung soll ein Zeilentext automatisch hinterlegt werden.
Dazu haben ich in der T-37 nun verschiedenste Aufrufe versucht.
Aktuell folgender Code
Code:
recTextModuleLineDocument.INIT;
recTextModuleLineDocument."Line No." := 10000;
recTextModuleLineDocument.Text := 'TEST neuer Eintrag';
recTextModuleLineDocument."Print Mgt. Code" := 'S_ORDCONF';
recTextModuleLineDocument."Creation Date" := TODAY;
recTextModuleLineDocument."Created by" := USERID;
recTextModuleLineDocument."Text ID" := Rec."Text Set ID";

IF recTextModuleLineDocument.INSERT(TRUE) THEN BEGIN   
   dummy := recTextModuleLineDocument.GetTextSetID(recTextModuleLineDocument);
END;


Innerhalb der GetTextSetID Funktion wird z. B. auch ein Hashwert errechnet bei dem ich nun das Problem habe, das mein mitgegebener Datensatz nicht gefiltert wird. Es werden immer alle Datensätze der Tabelle 5060613 durchlaufen und das führt dann zu dem Fehler "Die arithmetische Operation hat einen Überlauf verursacht."

Code:
GetTextSetID(VAR TextSet : Record "Text Module Line Document") TextID : Integer
// Search if there is already an ID with the same text as the TestSet from parameter.
// If yes, then give back the found Text ID
// If nothing found, create a new ID and give back.

IF TextSet.ISEMPTY THEN BEGIN
  TextID := 0;
  EXIT;
END;

// Search for already existing identical text.
Found := FALSE;
CurrHashValue := TMEngine.CalcHashValue(TextSet);
....
....
 



Hier durchläuft die REPEAT Schleife nicht nur Zeilen für meinen mitgegebenen Datensatz sondern alle Einträge der Tabelle.
Woran liegt es das hier kein Filter auf den beim Aufruf übergebenen Datensatz greift?
Ich stehe wie gesagt bereits den gesamten Tag auf dem Schlauch )-:

Danke für eure Hilfe bereits im Voraus!

Code:
[b]CalcHashValue(VAR TempTextSet : TEMPORARY Record "Text Module Line Document") HashValue : Integer[/b]
// >> #TMW17.10.01:T100
// ATTENTION: If more fields get added here to calculate the hash code, pay attention to two issues:
// 1: The Hash Values of all existing text must be recalculated. Otherwise most text will be doubled
// 2: When a new field get added here, it must be also added at the function CompareText

MaxM := 2097133;  // big prim to calculate hash filter
Base := 1024;       // number of expected used different characters
HashValue := 0;

IF NOT TempTextSet.FINDSET THEN
  EXIT;

REPEAT

  CurrStringLength := STRLEN(TempTextSet.Text);
  FOR Position := 1 TO CurrStringLength DO BEGIN
    HashValue := (HashValue * Base + TempTextSet.Text[Position]) MOD MaxM;
  END;

  CurrStringLength := STRLEN(TempTextSet."Print Mgt. Code");
  FOR Position := 1 TO CurrStringLength DO BEGIN
    HashValue := (HashValue * Base + TempTextSet."Print Mgt. Code"[Position]) MOD MaxM;
  END;

  // >> CCFD,CCFTE
  CurrStringLength := STRLEN(TempTextSet."FD SHA-256");
  FOR Position := 1 TO CurrStringLength DO BEGIN
    HashValue := (HashValue * Base + TempTextSet."FD SHA-256"[Position]) MOD MaxM;
  END;
  // << CCFD,CCFTE

  IF TempTextSet.Italic THEN
    HashValue := (HashValue * Base + TempTextSet.FIELDNO(Italic)) MOD MaxM;

  IF TempTextSet.Bold THEN
    HashValue := (HashValue * Base + TempTextSet.FIELDNO(Bold)) MOD MaxM;

  IF TempTextSet.Underline THEN
    HashValue := (HashValue * Base + TempTextSet.FIELDNO(Underline)) MOD MaxM;

  HashValue := (HashValue * Base + TempTextSet.Color) MOD MaxM;

UNTIL TempTextSet.NEXT = 0
Zuletzt geändert von fuige am 19. September 2023 09:16, insgesamt 1-mal geändert.

Re: VK Zeilentext automatisch füllen lassen

18. September 2023 20:24

Tabelle 5060613 stammt ja offensichtlich aus einem Partner-Add-on, da müsstest du den vielleicht ansprechen, warum und wie seine Funktionen funktionieren.

Re: VK Zeilentext automatisch füllen lassen

19. September 2023 07:58

Hallo,

hast du schon einmal versucht, ein SETRECFILTER zu verwenden? Nur eine Idee.

Code:
IF recTextModuleLineDocument.INSERT(TRUE) THEN BEGIN
   recTextModuleLineDocument.SETRECFILTER(); // Neu
   dummy := recTextModuleLineDocument.GetTextSetID(recTextModuleLineDocument);
END;

Re: (Erledigt) VK Zeilentext automatisch füllen lassen

19. September 2023 09:16

Vielen Dank euch beiden für die Rückmeldungen.

@BastianB
Das war die Lösung!
Vielen, vielen Dank!