[Gelöst] Frage zu RECORDREF

2. April 2009 07:29

Guten Morgen,

ich weiss, es gibt sehr viele Beiträge zum Thema RECORDREF. Ich habe auch (fast) alles schon gelesen.
Aber vor lauter Bäumen sehe ich den Wald nicht mehr!!!

Könnt ihr mir bitte helfen?

In einer Funktion lese ich mehrere unterschiedliche Tabellen . Mit jedem gelesenen Datensatz sollte ich immer wieder dieselbe Codeunit / Funktion aufrufen. In dieser Codeunit / Funktion wird für jede Tabelle und Datensatz dieselbe Verarbeitung durchgeführt. Der einzige Unterschied ist jeweils der Tabellenname (Record).

Ich kann nun natürlich die Codeunit / Funktion mit der Anzahl Tabellen als Parameter aufrufen, also z.B. Codeunit.Function(RecordA, RecordB, RecordC, etc.) und ggf. noch angeben, welche TableID ich gerade verwende. Dann müsste ich aber in der aufgerufenen Codeunit mehrere Verarbeitungen durchführen.

Gibt es eine Möglichkeit (mit RecordRef, RecordID, etc.), dass ich die Codeunit immer genau gleich aufrufe (also z.B. Codeunit.Function(TableID, RecordRef,?????) und innerhalb der aufgerufenen Codeunit den entsprechenden Datensatz der Tabelle holen und verarbeiten kann ohne dass ich die Tabellen explizit als Variable definieren muss?

Ich hoffe ihr könnt mir ein wenig Licht ins Dunkle der REF-Funktionalitäten bringen.

VIELEN DANK, Beno
Zuletzt geändert von beno am 27. April 2009 10:17, insgesamt 1-mal geändert.

Re: Frage zu RECORDREF

2. April 2009 08:34

Klar geht das:

Ich hab mir vor einer Weile mal zum Debuggen eine Codeunit gebastelt, die neben Nachrichten auch Recordsets in eine Textdatei schreiben kann, da verwende ich RecordRefs zu Hauf, kannst du dir ja mal ansehen, z.B. in der Funktion logRecord:

Code:
IF gtFileName = '' THEN Init;

gfFile.TEXTMODE(FALSE);
gfFile.WRITEMODE(TRUE);
gfFile.OPEN(gtFileName);

gfFile.SEEK(gfFile.LEN);

IF pbPrintTableHeader THEN BEGIN
  lwriteTableHeader(prrRecordRef);
END;

//* Table Body
FOR viCountFields := 1 TO prrRecordRef.FIELDCOUNT DO BEGIN
  vfrFieldRef := prrRecordRef.FIELDINDEX(viCountFields);
  viMaxColWidth := giMinColWidth;

  IF STRLEN(vfrFieldRef.NAME) > viMaxColWidth THEN BEGIN
    viMaxColWidth := STRLEN(vfrFieldRef.NAME);
  END;

  FOR i := 1 TO viMaxColWidth DO BEGIN
    IF i <= STRLEN(FORMAT(vfrFieldRef.VALUE)) THEN BEGIN
      gfFile.WRITE(FORMAT(vfrFieldRef.VALUE)[i]);
    END ELSE BEGIN
      gfFile.WRITE(gtSpace[1]);
    END;
  END;

  IF viCountFields < prrRecordRef.FIELDCOUNT THEN BEGIN
    FOR i := 1 TO STRLEN(gtFieldSeparator) DO
      gfFile.WRITE(gtFieldSeparator[i]);
  END ELSE BEGIN
    FOR i := 1 TO STRLEN(gtLineSeparator) DO
      gfFile.WRITE(gtLineSeparator[i]);
  END;
END;

gfFile.CLOSE;


Beste Grüße
Falk
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Re: Frage zu RECORDREF

2. April 2009 09:01

Ich weiß ja nicht, ob ich das richtig verstehe, aber schätzungsweise war mit Verarbeitung etwas anderes als in eine Datei schreiben gemeint, oder?

Re: Frage zu RECORDREF

2. April 2009 09:06

Kann schon sein, spielt aber keine große Rolle, es geht um die Behandlung von RecordRefs und die steht in einer Ausprägung da drin.

Re: Frage zu RECORDREF

2. April 2009 09:18

FAFL hat geschrieben:Kann schon sein, spielt aber keine große Rolle, es geht um die Behandlung von RecordRefs und die steht in einer Ausprägung da drin.

Ich meinte doch gar nicht dich ;)

Re: Frage zu RECORDREF

2. April 2009 09:41

der Recordref ist fast wie ein "normaler" datensatz zu sehen, er kann gelöscht, geändert, gespeichert, ausgewertet werden.

da wo du deine Funktion startest steht eigentlich nur beispiel Tabelle (akt. DS)
Code:
QuellRef.GETTABLE(Rec);
deineCU.DeineFunktion(quellref);


in deiner CU kannst du dann "alles" mit machen

Re: Frage zu RECORDREF

2. April 2009 17:50

Okay, soweit so gut.

Wenn ich dann also einen Recordinhalt in eine andere Funktion als RecordRef über geben möchte, dann mache ich vorgängig kurz
RecordRef.GET und übergebe dies als Parameter?

RecRef.OPEN(36);
RecRef.GETTABLE(SalesHeader);
Codeunit.Function(RecRef);

In etwa so?