Dynamisches Anzeigen eines beliebigen Records

18. November 2005 13:34

Hallo Leute,

heute wende ich mich mal mit einer Navision-Frage an euch, da ich selber keine Idee habe.

Ich programmiere gerne mit RecordRef & Co. und stolper jetzt über folgendes Problem:

Ich stelle in einer Tabelle die Position (z. B. Customer.GETPOSITION(FALSE)) eines Datensatzes sowie dessen Tabellen Nr. (z. B. 18 für Debitor) ab.

Gibt es jetzt eine Möglichkeit, ohne riesige CASE-Anweisung, den dort abgestellten Datensatz in der dazugehörigen Form (z. B. Debitorenkarte) anzuzeigen?
Schön wäre es natürlich, wenn man FORM.RUN(0,RecRef) machen könnte, aber leider verlangt der Befehl eine echte Record-Variable.

18. November 2005 23:15

Hi Timo,
ich reflektiere, du möchtest einen Record (zB. Customer/Vendor oder Item) in einer Tabelle ablegen, jedoch nicht den Rec, sondern dessen RecID.
Später soll die Referenz aufgerufen werden und Automatisch die dazugehörige Form öffnen.
Ist das Richtig?

Eine passende Lösung habe ich nicht, aber vieleicht eine Frage die dich einen Schritt weiter bringt. An welchen Kriterium soll Festgelegt werden, welche Form geöffnet werden soll?
Ich kenne mich mit Record ID´s nicht gut (Eigentlich ganicht) aus, aber wenn meine angestaubte C++ Erfahrung mich nicht täuscht, müsstest du den Record Rückwärts wieder auflösen. (Pointer Aritmetic!)

In einer Funktion könnte der Record wieder hergestellt werden anhand der ID, um dann die Form aufzurufen (FORM.RUN(0,RecRef)) aber das macht ja nicht wirklich Sinn! Und das Problem der Automatischen Formauswahl bleibt!

19. November 2005 01:04

Genau da liegt mein Problem.
RecordRef arbeitet ähnlich wie ein Pointer in C, jedoch ist es kein echter Pointer, da Navision ja sonst den Unterschied gar nicht erkennen dürfte.

Da FORM.RUN(0,Record) immer die LookupFormID auswertet, wäre ja sichergestellt, welche Form geöffnet würde.

Ich helfe mir derzeitig mit einer CASE-Anweisung mit folgendem Aufbau:
Code:
CASE "Table No." OF
  DATABASE::Customer:
    BEGIN
      Cust.SETPOSITION("Record Position");
      FORM.RUN(0,Cust);
    END;
  DATABASE::Vendor:
    BEGIN
      Vend.SETPOSITION("Record Position");
      FORM.RUN(0,Vend);
    END;
  DATABASE::"Sales Header":
    BEGIN
      SalesHeader.SETPOSITION("Record Position");
      FORM.RUN(0,SalesHeader);
    END;
  [...]
END;

21. Mai 2007 15:09

Huhu,

also ich habe genau das selbe das Problem. Und zwar habe ich die die Table ID und möchte gerne die zugehörige Lookupform aufrufen.
Nur wie komme ich an die ID der Form ? In keine der Systemtabellen (ausser ich habs übersehen) finde ich keinen hinweis dazu wo diese hinterlegt wird.

Und auch ich möchte es ungern per CASE Anweisung lösen, da das bei ca 20+ Möglichkeiten doch zu aufwenig wird.

Einer ne Ahnung wie ich nur mit der Tabellen ID nun die Lookup öffnen kann ?

Hoffe ich konnte mein Problem verständlich erläutern.
Danke schon mal für eure Mühen.



MFG

Khristan

P.S. Mein erster Post in eurem Forum (echt super hat mir schon oft weitergeholfen 8-) )

21. Mai 2007 16:48

Dieses Problem ist definitiv nicht dynmaisch zu lösen. Ich habe mich da früher schon mal intensiv damit beschäftigt.

Die Krux liegt darin, dass der RUN oder RUNMODAL Befehl als zweiten Parameter eine Record-Variable erwartet, die genau mit jener im Form hinterlegten SourceTable übereinstimmen muss.

Schade, ist aber leider so :-(

22. Mai 2007 08:32

hm schade.

Die LookupformID wird auch nirgends wirklich hinterlegt oder ? (z.B. in Objects oder so steht sie nicht).

Weil darüber könnte man zur not ja was machen da ich ja die TableID hab.

Schade eigentlich.

22. Mai 2007 09:41

Khristan hat geschrieben:Huhu,


Huhu / Hallo zurück :-)
"Herzlich Wilkommen" hier im Forum.
Deine Frage hört sich ein wenig nach der Standard-Lookupform an!
Meinst du die evtl.?
(Die ist in den Tabellenproperties hinterlegt!)
Oder willst du definitiv per Tabellen-ID die Form ID herausfinden?
(Das geht nicht wie Rotsch bereits geschrieben hat)

Als Lösung fällt mir nur ein eine Tabelle mit entsprechenden Informationen (in Handarbeit) anzulegen.
Gruß Mikka

22. Mai 2007 10:15

Hallo,

ich sehe hier 2 Probleme die für die Case-Lösung sprechen:

1. Anhang der Table-ID lässt sich die Form nicht zuweisen
2. Anhand des RecordRef lässt sich keine Form aufrufen

Zu 1. kann vielleicht eine selbst erstellte Tabelle helfen - evtl. kann auch aus einen Textexport der Tabellenobjekte die LookUp-Form extrahiert und die Tabelle dadurch gefüllt werden. Das wäre schon mal eine schöne Herausforderung.

Evtl. lässt sich aber auch beim Speichern der Tabellenposition bereits die Form-ID mit speichern? Dazu müsste man sehen, wie/wodurch das Speichern erfolgt.

Zu 2. muss die RecordRef in einen Record überführt werden. Dazu muss ich sämtliche in Frage kommenden Tabellen als Variable vorhalten und dann über die Case-Verzweigung den richtigen Datensatz aufrufen.

Vielleicht lässt sich aber auch etwas über einen Link machen. Es gibt ja die Möglichkeit eine Form mit der aktuellen Ansicht als Link auf den Desktop abzulegen oder zu versenden. Wenn dieser Link nun aus den Daten Form-ID (wie immer wir auch daran gekommen sind) und den Daten des RecordRef zusammengestellt würde - danach über HYPERLINK aufrufen ...? :roll: - Ich kann das gerade nicht testen, aber eine Anzeige sollte schon möglich sein.

Gruß
Frank

23. Mai 2007 12:36

Hallo.

Ich glaube , man kann aus einer Table ID die zugehörige
LookupFormID herausfinden:

Code:
IF Obj.GET(Obj.Typ::Table, '', TableID) THEN BEGIN
  Obj.CALCFIELDS("BLOB Referenz");
  Obj."BLOB Referenz".CREATEINSTREAM(InStr);
  WHILE NOT InStr.EOS DO BEGIN
    InStr.READ(NxtInt);
    IF (NxtInt = 283207) AND (NOT InStr.EOS) THEN BEGIN
      InStr.READ(NxtInt);
      EXIT(NxtInt);
    END;
  END;
END;
EXIT(0);


Das Ganze gabs mal umgekehrt, d.h. aus einer FormID den
dazugehörenden Sourcetable rausfinden. War galube ich ein
Download bei MIBUSO. Den hab ich genommen und ein wenig
rumprobiert. Scheint zu funktionieren.

23. Mai 2007 13:57

Der Ansatz ist genial, löst das Problem aber auch nicht.
Bei einem Form.Run muss aber als 2. Parameter eine Variable vom Typ Record und nicht RecordRef angegeben werden. :-(

Gruss

23. Mai 2007 14:39

Du kannst den 2. Parameter auch komplett weglassen, die Formnummer reicht. Natürlich kannst du dann keine Filter übergeben....

23. Mai 2007 15:12

Du kannst den 2. Parameter auch komplett weglassen, die Formnummer reicht. Natürlich kannst du dann keine Filter übergeben....


Und auf welchem Record stehst Du?

23. Mai 2007 15:18

@Timo
mal eine andere Denkrichtung, wenn NICHT die Standardform angezeigt werden muß, geht evtl. auch eine neue Form, die z.Bsp. die ersten 20 Felder deines Recordrefs anzeigt? du musst dann aber Leider auf alle Funktionsbuttons verzichten.

23. Mai 2007 15:28

Hallo.

martinst hat geschrieben:Der Ansatz ist genial, löst das Problem aber auch nicht.
Bei einem Form.Run muss aber als 2. Parameter eine Variable vom Typ Record und nicht RecordRef angegeben werden. :-(


Schon klar. War auch nur als Idee gedacht.

Habe übrigens noch was bei MIBUSO gefunden:

http://www.mibuso.com/forum/viewtopic.php?p=41023

Da wird das Ganze mittels HYPERLINK gelöst.
Vielleicht wäre das auch eine Möglichkeit.
Habs aber nicht ausprobiert.

23. Mai 2007 15:31

Schon klar. War auch nur als Idee gedacht.

Aber genial ist es trotzdem.

Habe übrigens noch was bei MIBUSO gefunden:


Schon gesehen.
Das kommt mir aber eher so Bastler-mässig vor.

Gruss

23. Mai 2007 15:47

Hallo.

Aber genial ist es trotzdem.


Ist ja nicht auf meinem Mist gewachsen (wie gesagt, fast alles geklaut...)



Schon gesehen.
Das kommt mir aber eher so Bastler-mässig vor.


Ja. Ziemlich krasses Zeug. Vor allem das Zusammenbauen des
HYPERLINK-Strings mit allen Filtern usw. dürfte schon heftig werden.
Allerdings ist das vielleicht doch die einzige halbwegs brauchbare Lösung.

23. Mai 2007 16:45

martinst hat geschrieben:
Du kannst den 2. Parameter auch komplett weglassen, die Formnummer reicht. Natürlich kannst du dann keine Filter übergeben....


Und auf welchem Record stehst Du?


auf dem zuletzt geöffneten natürlich, ich hätte oben einen Smiley einsetzen sollen ;-)
wenn keine Filter übergeben werden können ist natürlich auch kein spezieller Datensatz ausgewählt....
eins von beiden muss explizit gesetzt sein, entweder eine Formvariable, der du den Filter über settableview mitgibst oder eben die Recordvariable mit angewendetem Filter....

25. Mai 2007 09:29

Hi MartinR,

hast du zufällig noch den Schnipsel, mit dem man die SourceTable zu einem Formular bestimmen kann?

25. Mai 2007 10:47

Klar doch.

Code:
IF Obj.GET(Obj.Typ::Form, '', FormID) THEN BEGIN
  Obj.CALCFIELDS("BLOB Referenz");
  Obj."BLOB Referenz".CREATEINSTREAM(InStr);
  WHILE NOT InStr.EOS DO BEGIN
    InStr.READ(NxtInt);
    IF (NxtInt = 283173) AND (NOT InStr.EOS) THEN BEGIN
      InStr.READ(NxtInt);
      EXIT(NxtInt);
    END;
  END;
END;
EXIT(0);