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
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