TabellenID auslesen

10. Februar 2010 15:39

Hallo an alle,

ich habe 2 Fragen, bei denen ich weder hier im Forum noch in der C/Side Hilfe fündig geworden bin:

1. Aus onInsert/onModify/onDelete Triggern mehrerer Tabellen möchte ich eine CU-Funktion aufrufen. Gibt es einen Weg die ID der jeweiligen Tabelle auszulesen und als Parameter zu übergeben? Per Rec.TABLECAPTION übergebe ich aktuell schon den Tabellennamen, evtl. gibt es ja auch einen Weg über den Tabellennamen später die Tabellen-ID zu bekommen?

2. In der aufgerufenen CU werden muss ich auf die Ursprungstabelle einen Filter setzen. (zum späteren Aufruf eines XML-Ports) Gibt es einen Weg das SETFILTER per TabellenID oder Tabellenamen zu setzen?

schonmal danke für eure Hilfe
Maik

Re: TabellenID auslesen

10. Februar 2010 15:59

Hallo Maik,

könnte das für dich etwas sein:
Aufruf im Trigger:
Code:
MEINECU.MEINEFUNKTION(IRGENDEINPARAMETER, DATABASE::"Item");

MEINEFUNKTION:
Code:
// ...
CASE TABLEPARAMETER OF:
  DATABASE::"Item": BEGIN
    // Mache etwas
  END;
// ...


Du bastelst eine Funktion ,welche in diesem Fall als 2. Parameter einen Integerwert übergibt. In der Funktion prüfst du dann mit CASE auf die Tabelle.

Grüße,
Sebastian

Re: TabellenID auslesen

10. Februar 2010 16:37

Hallo Sebastian,

danke für deine antwort, aber genauso mache ich es aktuell. :)
um es nochmal genauer auszudrücken:

1. ich möchte den funktionsaufruf generalisieren. in der art:

Code:
TABLENO:= Rec.TABLENO BZW. IRGENDWAS MIT RECORDID.TABLENO ?
MEINECU.MEINEFUNKTION(IRGENDEINPARAMETER, TABLENO);


2. anstatt einem riesen Case Verteiler möchte ich in meiner Funktion die Tabelle direkt per ID ansprechen. in der art:

Code:
TABLE(TABLENO).SETFILTER("No.",Nummer);

Re: TabellenID auslesen

10. Februar 2010 16:58

Hallo Maik,

dann hab ich da was für dich, das Ganze nennt sich RecRef und FieldRef (anstatt Record). Ein Beispiel:
Code:
MyRecRef.OPEN(MyTableID);
IF MyRecRef.FIELDEXIST(MyFieldID) THEN BEGIN
  MyFieldRef := MyRecRef.FIELD(MyFieldID);
  MyFieldRef.SETRANGE(Nummer);
END;


Du musst aber dafür Sorge tragen, dass die Felder auf die du zugreifst existieren und abprüfen, welchen Datentypen diese zugehören.

Grüße,
Sebastian

Re: TabellenID auslesen

10. Februar 2010 17:04

Hallo,

Vorsicht bei älteren 4er- Versionen. Wenn man zu oft in einem Programm mit RecRef und FieldRef arbeitet, wird der Client immer langsamer.

Gruß, Fiddi

Re: TabellenID auslesen

10. Februar 2010 17:08

Hi fiddi,

welche Clients sind denn für dich "älter" und fallen darunter? SP 3 dürfte nicht mehr betroffen sein, oder?

Grüße,
Sebastian

Re: TabellenID auslesen

10. Februar 2010 18:33

Ich meine, der 4er Patch, der mit Vista klarkommt, hat keine Probleme mehr.

Gruß, Fiddi

Re: TabellenID auslesen

12. Februar 2010 15:42

mhmmm danke für eure Antworten. ich hab nun meine Funktion neu aufgesetzt.

Die Funktion soll mir erstmal nur den "Spaltenamen: Wert" (nur Text) der übergebenen TabellenID eines bestimmten Datensatzes dieser Tabelle als Textfile ausgeben. Außerdem gehe ich jetzt der Einfachheit halber davon aus, das die 1.Spalte das Filterkriterium beinhaltet.

Auszug aus der Funktion:
tblField = Tabelle "Field"
buffer = Text[200]

Code:
ObjectRecRef.OPEN(TABELLENID);
IF ObjectRecRef.FIELDEXIST(1) THEN BEGIN
  ObjectFilterFieldRef := ObjectRecRef.FIELD(1);
  ObjectFilterFieldRef.SETRANGE(IRGENDWAS);
END;

tblField.SETRANGE(TableNo,TABELLENID);
IF tblField.FIND('-') THEN
REPEAT
    OutStreamObj.WRITETEXT(FORMAT(tblField.FieldName) + ': ');
    ObjectFieldRef:= ObjectRecRef.FIELD(tblField."No.");
    IF FORMAT(ObjectFieldRef.TYPE) = 'Text' THEN BEGIN
      Buffer:= ObjectFieldRef.VALUE;
      OutStreamObj.WRITETEXT(Buffer);
    END;
    OutStreamObj.WRITETEXT();
END;


Die Spaltennamen gibt mir Navision auch aus, nur keine Werte. Weder mit ObjectFieldRef.VALUE noch mit FORMAT(ObjectFieldRef). Evtl. hab ich ja auch nen Denkfehler drin, für Hinweise bin ich dankbar...

Re: TabellenID auslesen

12. Februar 2010 17:00

Code:
// ...
IF tblField.FINDSET(FALSE) THEN
  REPEAT
    // ...
  UNTIL NEXT = 0;


Wie wäre es damit? Wenn du loopen willst, am besten wo es geht FINDSET (außer du sortierst descending). Außerdem musst du auch die Datensätze mit NEXT durchgehen.

Re: TabellenID auslesen

12. Februar 2010 17:11

joa scho klar, ich hatte nur die UNTIL Zeile vergessen beim posten zu kopieren. 8-)
mein problem ist der Zugriff auf die Daten der FieldRef Variablen.

Re: TabellenID auslesen

12. Februar 2010 17:28

Du musst natürlich nicht nur die Tabelle Field sondern auch die referenzierte Tabelle loopen (der Field-Ref steht dann immer auf dem richtigen Datensatz).

Re: TabellenID auslesen

12. Februar 2010 18:02

ok nur damit ich es richtig verstehe:

1. zunächst filtere ich einen datensatz irgendeiner tabelle (z.B. einen bestimmten Artikel aus "Item"):

Code:
ObjectRecRef.OPEN(27);
IF ObjectRecRef.FIELDEXIST(1) THEN BEGIN
  ObjectFilterFieldRef := ObjectRecRef.FIELD(1);
  ObjectFilterFieldRef.SETRANGE('Artikel0815');
END;


2. die tabelle "fields" enthält doch alle spalten aller tabellen in navision als einzelne datensätze. also filtere ich als nächstes die datensätze, die zu meiner zieltabelle ("Item") gehören:

das passiert mit:
Code:
tblField.SETRANGE(TableNo,27);


3. nun gehe ich mit der Schleife alle Spalten von "Item" durch:

IF tblField.FIND('-') THEN
REPEAT
...
UNTIL tblField.NEXT = 0;


4. innerhalb der Schleife lasse ich mir zunächst den Namen der Spalte anzeigen:

OutStreamObj.WRITETEXT(FORMAT(tblField.FieldName) + ': ');


was soweit auch funktioniert. Aber wenn ich nun ebenfalls innerhalb der Schleife die konkreten Werte aus der Tabelle "Item" auslesen will:

Code:
ObjectFieldRef:= ObjectRecRef.FIELD(tblField."No.");
    IF FORMAT(ObjectFieldRef.TYPE) = 'Text' THEN BEGIN
      Buffer:= ObjectFieldRef.VALUE;
      OutStreamObj.WRITETEXT(Buffer);
    END;


Navision springt auch in die IF Anweisung hinein, erkennt also den Typ, allerdings ist FORMAT(ObjectFieldRef.VALUE) oder FORMAT(ObjectFieldRef) immer ein leerer String.

Ich verstehe nun nicht so ganz warum ich noch einen zusätzliche Schleife brauche, könntest du das bitte in einem Pseudo Code kurz erklären? :-(

Re: TabellenID auslesen

12. Februar 2010 21:27

Da fehlt nicht einfach nur das ObjectRecRef.findfirst bzw. find('-')? Oder hast du das nur nicht mit hierher kopiert?

Re: TabellenID auslesen

14. Februar 2010 14:28

Die Tabellen-ID kannst Du auch ganz einfach über die Tabelle Object ermitteln. Einfach auf ObjectType Table und den Tablename filtern und schon hast Du die ObjectID. Obendrein ist die ganze Übung auch noch recht fix.
Das funktioniert im Übrigen auch mit Forms, Reports usw. und dann kannst Du dir dort den "Klimmzug" mit der Objectname Funktion sparen - da musst Du nämlich immer noch das Wort Report/Form aus dem Ergebnisstring entfernen.

Gruß
42

Re: TabellenID auslesen

14. Februar 2010 14:57

Bakkir hat geschrieben:Per Rec.TABLECAPTION übergebe ich aktuell schon den Tabellennamen

Vorsicht, das stimmt nicht - wenn du wie eben vorgeschlagen über die Object-Tabelle an die ID gelangen willst, musst du mit TABLENAME arbeiten. TABLECAPTION varriert je nach eingestellter Sprache.

Edit: Sorry, 42 hatte den TABLENAME durchaus genannt - aber mangels Großschreibung habe ich dies nicht sofort gesehen.

Re: TabellenID auslesen

15. Februar 2010 09:56

@alle, danke an eure Antworten.

Mit "ObjectRecRef.FINDFIRST" funktioniert es jetzt wie gewünscht. :-D

@42

danke für die info, ich denke so werd ich das machen.