Data binding für Control Add-In

21. April 2010 11:31

Okay, ich schreibe gerade mein erstes Control Add-In für eine Page im RTC. Ich möchte ein TreeControl anzeigen. Das klappt auch, d.h., ich habe die C# library richtig eingebunden, mein (im Moment noch recht leerer) Tree wird angezeigt und ich kann von meinem Control events an den RTC schicken, die dann den entsprechenden Trigger aufrufen. Mein Control kann also mit dem RTC "reden". Die Kommunikation in die andere Richtung macht mir allerdings Probleme. Genaugenommen mindestens zwei :-?

Problem 1:
Ich habe gelesen, dass man mit dem SourceExpr property eine globale Variable oder eine CodeUnit an das Control binden kann. Weil ich mir bei der CodeUnit noch nicht so genau vorstellen kann, was das heißt, habe ich das zum Testen jetzt erstmal mit einem String versucht. Damit ich sehe, ob der String bei meinem Control ankommt, zeigt mein erster TreeNode als Text jetzt einfach das an, was ihm in der Value.Set Methode übergeben wird. Soweit so gut. Das Dumme ist nur, dass der RTC (oder welcher Teil von Navision auch immer) jedesmal zuerst die Value.Get Methode aufruft und seinen String mit dem Ergebnis überschreibt. Danach setzt er dann den String, den ihm mein Control vorher mitgeteilt hat. Das ist blöd, denn mein Control hat ja keine Ahnung, was der richtige Wert sein könnte. Und ich kann offenbar keinen Wert zurückliefern der als ungültig erkannt wird (ich habe es mit "null" versucht, aber dann stürzt der RTC ab, ich vermute mit einer nicht gefangenen Exception). Egal wie ich meinen globalen String im RTC initialisiere, er wird dann immer mit dem Wert aus dem Control AddIn überschrieben und in meinem Control AddIn kommt nie ein Wert an, der tatsächlich aus Navision stammt. Ich habe versucht, bei "HasValueChanged" immer "false" zurückzugeben, aber das ändert nichts am Verhalten (ich habe aus lauter Verzweiflung auch schon immer "true" zurückgegeben, aber das ändert auch nichts). Da ist doch irgendwas kaputt :cry: Wenn ich den String später im C/AL Code ändere (tue ich z.B. in meinem OnControlAddIn Trigger, damit ich weiß, wann das passiert), passiert wieder das Gleiche ... der RTC fragt erst mein Control nach dem Wert für den String und setzt diesen Wert dann erneut. Das macht doch keinen Sinn.

Problem 2:
Ist weniger ein Problem, sondern mehr eine Verständnisfrage (das Problem ist also, dass ich zu wenig weiß). Wenn ich in der SourceExpr eine CodeUnit angebe, wie genau mache ich das? Und was passiert dann in meinen Value.Set und Value.Get Methoden (wann werden die Aufgerufen und was wird bei Set übergeben bzw. was passiert mit dem Value das Get zurückliefert?). Mir ist der Kontroll- und Datenfluss da überhaupt nicht klar und die Angaben in der msdn zu dem Thema fand ich ausgesprochen mager.

Insgesamt habe ich sowieso das Gefühl, dass ich hier versuche, ein Kamel durch ein Nadelör zu zwängen. Ich muss ziemlich viele Daten aus dem RTC in das TreeControl bekommen und bisher sind mir nur zwei Möglichkeiten eingefallen, das zu tun ... entweder konvertiere ich die Daten (die fein säuberlich und extra für diesen Zweck alle in einer Tabelle stehen) in eine XML Datei und übergebe die (scheint mir aber für große Datenmengen viel zu langsam zu sein) oder ich übergebe Servername, Datenbankname, und Authorisation und lese mir das Zeug dann selbst per SQL aus der Tabelle aus. Häßlich! Und die Synchronization wird ein Albtraum. Das muss doch besser gehen. Wäre das evtl. ein Fall für einen Webservice? Und kann mein eigenes Control, das im RTC eingebunden ist, einen Webservice nutzen? Fragen über Fragen. Und übermorgen soll's fertig sein ...

Tips, Ratschläge, Hinweise, tröstende Worte?
Jutta

Re: Data binding für Control Add-In

21. April 2010 12:11

Wegen Zeitmangel kann ich spontan nur zu 2. Antworten:
Das man dort eine Codeunit angeben kann ist mir neu! (heisst nich, dass es nich geht :D) Eine Funktion die ein XML String zurück gibt, ist möglich. Und große Datenmengen würde ich derzeit auch über XML Strukturen hin und her übertragen. Oder du könntest auch, wie du schon festgestellt hast, ein Webservice nutzen, bleibt aber die Frage der Performance an dieser Stelle. Evtl. könnte man eine Stored Proc. die dir deine Datein in eine, nur für dieses Addin existierende, Tabelle schreibt und diese dann in C# im Addin aufrufen und direkt auslesen. Letzteres waere wohl das schnellste.

Re: Data binding für Control Add-In

29. April 2010 10:25

Ich habe mich jetzt für die StoredProc Variante entschieden, bzw. ich schreibe eine Art StagingTable in Navision, die ich dann von meinem Control AddIn per SQL auslese. Soweit so gut. Im Moment bekommt mein AddIn die Verbindungsinformationen zur Datenbank und den Namen dieser Tabelle über einen String, der von einer C/AL Funktion in einer CodeUnit zusammen gebaut wird. Klappt ganz gut, offenbar wird die Funktion beim Erstellen meines AddIns aufgerufen, wenn ich sie als SourceExpr angebe.

Wie bekomme ich aber jetzt später neue Daten in mein ControlAddIn, ohne die Page komplett zu zerstören und neu zu erstellen? Wenn ich eine globale Variable als SourceExpr angebe, dann bekommt mein ControlAddIn ja über diese get/set Value Aufrufe mit, wenn sich die geändert hat. Wie ist das aber bei einer Funktion? Habe ich da die Möglichkeit, später nochmal Daten in mein ControlAddIn zu bekommen? Und wenn ja, wie? Mir ist der Kontrollfluss da irgendwie nicht klar. Die Funktion einfach später nochmal aufzurufen hat offenbar nicht den Effekt, dass das ControlAddIn das mitbekommt.

Gruß,
Jutta