Dynamisches Anzeigen eines beliebigen Records

Bild Microsoft Dynamics NAV 4.xx
(ehem. Microsoft Business Solutions-Navision)

Dynamisches Anzeigen eines beliebigen Records

Beitragvon Timo Lässer » 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.
Gruß, Timo Lässer

Frage beantwortet? Schreibe bitte "[Gelöst]" vor den Titel deines ersten Beitrags.
Bitte erst suchen, dann fragen. Bitte beachte den kleinen Community-Knigge.
Kein Support per PN, E-Mail, Instant Messanger, Soziale Netzwerke, Telefon oder Fax! DafĂĽr ist dieses Forum da.
Hier kannst du fĂĽr MSDynamics.de spenden.
Benutzeravatar
Timo Lässer
Administrator
Administrator
 
Beiträge: 5274
Registriert: 14. November 2004 22:18
Wohnort: DE 49716 Meppen
Arbeitsort: DE 49733 Haren (Ems)
Bezug zu Microsoft Dynamics: End-Anwender
Microsoft Dynamics Produkt: Microsoft Dynamics NAV
Microsoft Dynamics Version: 1.10a - 2018, BC14, BC21

Beitragvon mikka » 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!
GruĂź, Mikka

Frage beantwortet? Schreibe bitte [Gelöst] vor den Titel des ersten Beitrags.
Bitte erst suchen, dann fragen. Bitte beachte den kleinen Community-Knigge.
Kein Support per PN, Mail, IM oder Telefon! DafĂĽr ist dieses Forum da.
Benutzeravatar
mikka
Microsoft Partner
Microsoft Partner
 
Beiträge: 1832
Registriert: 26. September 2005 11:54
Wohnort: Bremen
Realer Name: Michael
Bezug zu Microsoft Dynamics: Microsoft Partner
Microsoft Dynamics Produkt: Microsoft Dynamics NAV
Microsoft Dynamics Version: 2.6, 3.7, 4, 5, 2009/13/15

Beitragvon Timo Lässer » 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: Alles auswählen
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;
Gruß, Timo Lässer

Frage beantwortet? Schreibe bitte "[Gelöst]" vor den Titel deines ersten Beitrags.
Bitte erst suchen, dann fragen. Bitte beachte den kleinen Community-Knigge.
Kein Support per PN, E-Mail, Instant Messanger, Soziale Netzwerke, Telefon oder Fax! DafĂĽr ist dieses Forum da.
Hier kannst du fĂĽr MSDynamics.de spenden.
Benutzeravatar
Timo Lässer
Administrator
Administrator
 
Beiträge: 5274
Registriert: 14. November 2004 22:18
Wohnort: DE 49716 Meppen
Arbeitsort: DE 49733 Haren (Ems)
Bezug zu Microsoft Dynamics: End-Anwender
Microsoft Dynamics Produkt: Microsoft Dynamics NAV
Microsoft Dynamics Version: 1.10a - 2018, BC14, BC21

Beitragvon Khristan » 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-) )
Khristan
 
Beiträge: 10
Registriert: 21. Mai 2007 14:59
Wohnort: Witten

Beitragvon rotsch » 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 :-(
Gruss und besten Dank, Roger
Benutzeravatar
rotsch
Microsoft Partner
Microsoft Partner
 
Beiträge: 1703
Registriert: 8. März 2006 14:44
Bezug zu Microsoft Dynamics: Freiberufler
Microsoft Dynamics Produkt: Microsoft Dynamics NAV
Microsoft Dynamics Version: Ab Version 1.3 bis Aktuell

Beitragvon Khristan » 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.
Khristan
 
Beiträge: 10
Registriert: 21. Mai 2007 14:59
Wohnort: Witten

Beitragvon mikka » 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
GruĂź, Mikka

Frage beantwortet? Schreibe bitte [Gelöst] vor den Titel des ersten Beitrags.
Bitte erst suchen, dann fragen. Bitte beachte den kleinen Community-Knigge.
Kein Support per PN, Mail, IM oder Telefon! DafĂĽr ist dieses Forum da.
Benutzeravatar
mikka
Microsoft Partner
Microsoft Partner
 
Beiträge: 1832
Registriert: 26. September 2005 11:54
Wohnort: Bremen
Realer Name: Michael
Bezug zu Microsoft Dynamics: Microsoft Partner
Microsoft Dynamics Produkt: Microsoft Dynamics NAV
Microsoft Dynamics Version: 2.6, 3.7, 4, 5, 2009/13/15

Beitragvon Frank » 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
Frank
 
Beiträge: 84
Registriert: 26. März 2007 17:23
Wohnort: nähe Dortmund

Beitragvon MartinR » 23. Mai 2007 12:36

Hallo.

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

Code: Alles auswählen
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.
MartinR
 
Beiträge: 25
Registriert: 15. Mai 2007 11:03
Wohnort: Weinheim

Beitragvon martinst » 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
martinst
 
Beiträge: 621
Registriert: 24. August 2005 18:27
Bezug zu Microsoft Dynamics: Microsoft Partner
Microsoft Dynamics Produkt: Microsoft Dynamics NAV
Microsoft Dynamics Version: 2.x, 3.x, 4.x, 5.x, 2009

Beitragvon Michael Schumacher » 23. Mai 2007 14:39

Du kannst den 2. Parameter auch komplett weglassen, die Formnummer reicht. NatĂĽrlich kannst du dann keine Filter ĂĽbergeben....
mfg
Michael Schumacher


Frage beantwortet? Schreibe bitte [Gelöst] vor den Titel des ersten Beitrags.
Bitte erst suchen, dann fragen. Bitte beachte den kleinen Community-Knigge.
Kein Support per PN, Mail, IM oder Telefon! DafĂĽr ist dieses Forum da.
Hmmm, ach heut' ist Backup-Tag, also alles schnell nach /dev/nul sichern!
Benutzeravatar
Michael Schumacher
Ehrenmitglied
 
Beiträge: 1762
Registriert: 1. August 2005 11:12
Bezug zu Microsoft Dynamics: Microsoft Partner
Microsoft Dynamics Produkt: Microsoft Dynamics NAV
Microsoft Dynamics Version: 3.x, 4.x, 5.x

Beitragvon martinst » 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?
martinst
 
Beiträge: 621
Registriert: 24. August 2005 18:27
Bezug zu Microsoft Dynamics: Microsoft Partner
Microsoft Dynamics Produkt: Microsoft Dynamics NAV
Microsoft Dynamics Version: 2.x, 3.x, 4.x, 5.x, 2009

Beitragvon tba » 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.
GrĂĽĂźe aus Berlin
Thomas
Benutzeravatar
tba
Microsoft Partner
Microsoft Partner
 
Beiträge: 430
Registriert: 22. Februar 2007 13:57
Wohnort: Berlin
Realer Name: Thomas Barthel
Arbeitsort: Berlin
Bezug zu Microsoft Dynamics: Microsoft Partner
Microsoft Dynamics Produkt: Microsoft Dynamics NAV
Microsoft Dynamics Version: 2.00 - 2013

Beitragvon MartinR » 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.
MartinR
 
Beiträge: 25
Registriert: 15. Mai 2007 11:03
Wohnort: Weinheim

Beitragvon martinst » 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
martinst
 
Beiträge: 621
Registriert: 24. August 2005 18:27
Bezug zu Microsoft Dynamics: Microsoft Partner
Microsoft Dynamics Produkt: Microsoft Dynamics NAV
Microsoft Dynamics Version: 2.x, 3.x, 4.x, 5.x, 2009

Beitragvon MartinR » 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.
MartinR
 
Beiträge: 25
Registriert: 15. Mai 2007 11:03
Wohnort: Weinheim

Beitragvon Michael Schumacher » 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....
mfg
Michael Schumacher


Frage beantwortet? Schreibe bitte [Gelöst] vor den Titel des ersten Beitrags.
Bitte erst suchen, dann fragen. Bitte beachte den kleinen Community-Knigge.
Kein Support per PN, Mail, IM oder Telefon! DafĂĽr ist dieses Forum da.
Hmmm, ach heut' ist Backup-Tag, also alles schnell nach /dev/nul sichern!
Benutzeravatar
Michael Schumacher
Ehrenmitglied
 
Beiträge: 1762
Registriert: 1. August 2005 11:12
Bezug zu Microsoft Dynamics: Microsoft Partner
Microsoft Dynamics Produkt: Microsoft Dynamics NAV
Microsoft Dynamics Version: 3.x, 4.x, 5.x

Beitragvon forki » 25. Mai 2007 09:29

Hi MartinR,

hast du zufällig noch den Schnipsel, mit dem man die SourceTable zu einem Formular bestimmen kann?
forki
Microsoft Partner
Microsoft Partner
 
Beiträge: 29
Registriert: 25. Mai 2007 08:44

Beitragvon MartinR » 25. Mai 2007 10:47

Klar doch.

Code: Alles auswählen
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);
MartinR
 
Beiträge: 25
Registriert: 15. Mai 2007 11:03
Wohnort: Weinheim


ZurĂĽck zu NAV 4.xx

Wer ist online?

Mitglieder in diesem Forum: DotBot [Bot] und 1 Gast