[fast gelöst] Recordvariable dynamisch im Code erstellen

20. Juni 2011 14:05

Hallo zusammen,

gibt es irgendeine Möglichkeit, im Code dynamisch Record-Variablen zu erzeugen?
Ich hatte mal flüchtig was von einer Automation gelesen, die man bei NAV 3.xx benutzen konnte; das war aber eine ziemlich verrückte Lösung glaube ich; geht das nicht evtl. einfacher?
Zuletzt geändert von InfoWissler am 29. Juni 2011 08:33, insgesamt 1-mal geändert.

Re: Recordvariable dynamisch im Code erstellen

20. Juni 2011 14:10

Recordref FieldRef !??

Re: Recordvariable dynamisch im Code erstellen

20. Juni 2011 14:36

Der reicht mir leider nicht, da ich RecRef.Gettable(<RecVariable>) benutzen will. Diese Funktion braucht zwingend einen Record als Parameter; ein RecRef reicht nicht.

Re: Recordvariable dynamisch im Code erstellen

20. Juni 2011 15:03

Du kannst doch auf RecRefs nur mit der Tabellennr. zugreifen. Wo ist das Problem?

Re: Recordvariable dynamisch im Code erstellen

20. Juni 2011 16:38

Am besten erkläre ich mein ganzes Vorhaben...

Ich will die TableRelations von Feldern auslesen, die eine conditional TableRelation haben wie z.B. das Feld No. der Tabelle Sales Line (hängt von Type ab; wenn Type = Item, dann ist die TableRelation = Table 27 etc.).

So, jetzt möchte ich folgendes tun:

Eine Funktion schreiben, der man eine TabellenID und eine Feld-ID übergibt (z.B. 37 und 5). Die soll dann folgendes tun:
OptionString ermitteln
für jeden OptionString:
<Record>.<Feld> := aktuellerOptionString
RecRef.Gettable(TabellenID,FeldID)
//mithilfe der Tabelle "Field" die aktuelle TableRelation rausholen.

Re: Recordvariable dynamisch im Code erstellen

20. Juni 2011 16:43

Ich habe in meiner Tools-Sammlung eine Funktion, welche mit Hilfe einer RecRef-Variablen die TableRelation ermittelt:
Code:
GetTableRelation(TableID : Integer;FieldNumber : Integer) : Integer
// > TL5.00:05 >>>
RecRef2.CLOSE;
RecRef2.OPEN(TableID);
EXIT(RecRef2.FIELD(FieldNumber).RELATION);
// < TL5.00:05 <<<
Ist es das, was du suchst?

Re: Recordvariable dynamisch im Code erstellen

21. Juni 2011 11:28

Nein, weil da z.B. bei T37, Feld "No." rauskommt: "Standard Text".

Ich möchte aber "Standard Text", "Item", "G/L Account" etc. rausbekommen.

Und dazu muss ich folgendes tun:

//Schleife, die für alle Optionen im OptionString folgendes macht:
SalesLine.Type := SalesLine.Type::<Option> (z.B. "Item)
RecRef.Gettable(SalesLine);
CurrentRelation := RecRef.FIELD(FieldNumber).Relation

Re: Recordvariable dynamisch im Code erstellen

21. Juni 2011 12:04

Hallo,

in Erweiterung von Timos Lösung
Code:
GetTableRelation(TableID : Integer;FieldNumber : Integer) : Integer
// > TL5.00:05 >>>
RecRef2.CLOSE;
RecRef2.OPEN(TableID);
Fref := RecRef2.Field(5);
Fref.value:=2;
EXIT(RecRef2.FIELD(FieldNumber).RELATION);
// < TL5.00:05 <<<
RecRef2.CLOSE;


Das würde z.B. funktionieren. Ich frage mich allerdings wie du alle möglichen Kombinationen von Options und Konstanten ausprobieren willst, die bei der Table- Relation möglich sind. :mrgreen:

Wenn du tatsächlich alle Tablerelations wissen willst, dann bleibt dir nur die Analyse des Quelltextes. Wobei dann eine Lösung wie ObjectManager wahrscheinlich billiger ist (der kann das was du willst, und einiges mehr) :wink: .

Gruß, Fiddi

Re: Recordvariable dynamisch im Code erstellen

21. Juni 2011 13:02

Also es gibt diverse Module, die die Optionswerte von dynamischen Tabellen anzeigen. Dort wird dann einfach der OptionString bzw. die OptionCaption durchlaufen und die einzelnen Elemente aufgelistet.
Das müßte in etwa so gehen:
Code:
RecRef.CLOSE;
RecRef.OPEN(37);
FRef := RecRef.FIELD(5);

NoOfElements := STRLEN(
  DELCHR(FRef.OPTIONSTRING,'=',DELCHR(FRef.OPTIONSTRING,'=',','))) + 1;
FOR i := 1 TO NoOfElements DO BEGIN
  MESSAGE('%1',SELECTSTR(i,FRef.OPTIONSTRING));
END;


Problem ist allerdings, daß SELECTSTR nicht mit leeren Elementen und auch nicht mit doppelten Elementen klarkommt. Doppelte kann theoretisch in der Caption vorkommen, ist dann aber meiner Ansicht nach ein Fehler. Leere Elemente kommen immer dann vor, wenn man den Standard erweitern und hier noch Platz für etwaige Erweiterungen des Standards lassen will (Bsp.: Wert1,Wert2,Wert3,,,,,,,,MeineOption).

Re: Recordvariable dynamisch im Code erstellen

21. Juni 2011 16:49

Vielen Dank schonmal an fiddi, das hat mich schon einen Schritt weitergebracht.

Aber der Object Manager zeigt mir Conditional Table Relations doch auch nicht an, oder? Zumindest nicht, wenn ich im Object Explorer auf die TableInfo der Tabelle 37 gehe; da steht für Feld 6 unter Relation Table und Relation Field einfach gar nichts.


Danke für den Hinweis auf SelectStr an HattrickHorst, sieht interessant aus.

Habe hier einen Link gefunden, wie man durch OptionStrings loopt: http://cuberit.blogspot.com/

Ich glaube, mein größtes Problem ist noch, wie ich (ohne Solution Developer Lizenz, sodass auch der Kunde das machen kann) rauskriege, welche Felder überhaupt eine Conditional Table Relation haben.

Re: Recordvariable dynamisch im Code erstellen

21. Juni 2011 18:45

Aber der Object Manager zeigt mir Conditional Table Relations doch auch nicht an, oder?


Doch tut er ( mit V6.01 getestet). Wenn du dir im (Object Explorer) des OM (nicht Object-Designer) die Tabelle 37 mit 'Object/where used' ansiehst, dann gibt es dort oben auf der Karte den Eintrag "Relations", dort sind z.B. alle Relationen für "No." aufgeführt, und zwar auch mit dem richtigen Feld der verknüpften Tabelle, was in NAV selbst noch nicht einmal in den Properties stehen muss.

Gruß, Fiddi