SQL-Decimal in Navision-Decimal [gelöst]

12. Mai 2017 12:06

Hallo,
z.Zt. versuche ich, den Wert eines Dezimalfeldes aus einer SQL-Datenbank in eine Navision-Datenbank zu importieren. Üblicherweise gestalte ich dies über ado recordset und eine Variable vom Typ Variant. Bei Dezimalfeldern scheint dies nicht zu gehen, wenn ich richtig verstanden habe wegen der Tatsache, dass es sich bei SQL-Dezimalfeldern um 9-Bit float, bei Navision-Dezimalfeldern hingegen um 8-Bit float handelt. Ich habe daher versucht, die SQL-Dezimalfelder vor dem Einlesen mit cast, bzw. convert in das passende Format umzuwandeln, ohne Erfolg. Es scheint so, als wenn Navision bei dem bloßen Versuch scheitert, den Wert der SQL-Dezimalfelder auch nur irgendwie irgendwo einzulesen. Hier einmal der entsprechende Code:

Code:
        gtxSQLStatementWeight := STRSUBSTNO(gTxSELECT,'*'+','+'convert (decimal(5,2),[max_ Loading Weight])',
                                                gTxT_ExportOrderHead,
                                                    gTxT_ExportOrderHead_Print,1,
                                                    gTxT_ExportOrderHeader_IsPrint,
                                                  0);

        gatADORecordSet3.Open(gtxSQLStatementWeight,gatADOConnection,ginOpenMethod,ginLockMethod);
        EVALUATE(lvaVariant, gatADORecordSet3.Fields.Item(FORMAT(gTxT_ExportOrderHead_maxWeight)).Value);



Mit dem SQL-Statement öffne ich das recordset und versuche dabei gleichzeitig, das Feld max_ Loading Weight in ein Dezimaldatenfeld mit 2 Nachkommastellen zu konvertieren. Anschließend versuche ich mit EVALUATE den Wert des (konvertierten) Feldes max_Loading Weight in die Variable lvaVariant zu übertragen. Hier zeigt sich im Debugger, dass das EVALUATE fehlschlägt; für den Wert der Variablen lvaVariant wird "Value" statt des eigentlichen Zahlenwertes angezeigt, wenn ich es richtig interpretiere verbirgt sich dahinter ein undefinierter Wert. Versuche, das Dezimalfeld in ein Feld vom Typ money oder float umzuwandeln, schlagen ebenso fehl.

Ich habe es dann noch mit einem Stream (genauer 'Microsoft ActiveX Data Objects 2.8 Library'.Stream und einem Feld adField vom Typ 'Microsoft ActiveX Data Objects 2.8 Library'.Field) versucht:

Code:
gvdReadADOFieldDec(adField : Automation "'Microsoft ActiveX Data Objects 2.8 Library'.Field") DecimalValue : Decimal
CREATE(adStream,FALSE,TRUE);
adStream.Open;
adStream.WriteText(FORMAT(adField.Value));
adStream.Position := 0;
IF EVALUATE(DecimalValue,adStream.ReadText) THEN;


Hier schlägt die WriteText-Methode fehl.

Was mir noch aufgefallen ist, wenn ich mir den Inhalt des Feldes max_ Loading Weight direkt im SQL-Server Management Studio ansehe, werden dort 20 Nachkommastellen angezeigt, einmal die eigentlichen Nachkommawerte, der Rest wird mit Nullen aufgefüllt. Ist das eventuell das Problem, und wie lässt es sich beheben? Wie gesagt, bis jetzt schlägt jeder Versuch, auf den Wert des Feldes von der Navision-Seite aus zuzugreifen, fehl.
Zuletzt geändert von FragenFrager am 18. Mai 2017 13:39, insgesamt 1-mal geändert.

Re: SQL-Decimal in Navision-Decimal

12. Mai 2017 15:38

Hallo,

warum holst du dir nicht die Tabelle per LinkedObject ins NAV?

Gruß

Michael

Re: SQL-Decimal in Navision-Decimal

12. Mai 2017 15:52

Hallo,
offen gestanden, ist mir das Konzept gänzlich fremd. Trotzdem danke für den Hinweis, vielleicht kann ich es in der Richtung einmal versuchen.

Re: SQL-Decimal in Navision-Decimal

15. Mai 2017 07:53

Hallo,

dieses Konzept wird hier beschrieben:

https://msdn.microsoft.com/en-us/library/dd338982(v=nav.90).aspx

Um ggf. Berechtigungsprobleme zu umgehen kannst du auf dem SQL-Server ein Verbindungsserver einrichten und diesem einen DB-Benutzer mit entsprechenden Rechten hinterlegen. In deiner View kannst du dann die Abfrage über den Verbindungsserver laufen lassen. Somit muss der Benutzer in NAV keine besonderen Rechten auf dem Fremdsystem haben.

Gruß

Michael

Re: SQL-Decimal in Navision-Decimal

18. Mai 2017 12:55

Gehört habe ich von dem Problem (siehe Links unten) , aber darauf gestoßen bin ich noch nicht. Wie sieht denn der Connectionstring aus?
Mit diesen vier Automationservern und ohne Variant, ohne Stream und ohne Cast ist das seit Jahren stabil bei einem meiner Kundenprojekte bei intensivster Dauernutzung im Einsatz.
SQLConnect.png

Ganz einfache Zuweisungen reichen nach dem Aufbau der Connection da völlig aus:
Code:
[…]
ADOField := ADOFields.Item(1);
NAVdecField1 := ADOField.Value;
ADOField := ADOFields.Item(2);
NAVdecField2 := ADOField.Value;
[…]

Im Connectionstring steht für Decimalfelder dabei an der jeweiligen Item-Position sinngemäß dieses:
Code:
[…],CONVERT(float,SQLServerTable.SQLdecField,[…]


https://dynamicsuser.net/nav/f/developers/12264/ado-recordsets-and-sqlserver-type-decimal
https://forum.mibuso.com/discussion/10348/ado-recordsets-and-sqlserver-type-decimal
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Re: SQL-Decimal in Navision-Decimal

18. Mai 2017 13:37

Hallo,
letztendlich hat es hierüber funktioniert:

Code:
gtxSQLStatement := STRSUBSTNO(gTxSELECT,'*'+','+'convert (varchar(38),[max_ Loading Weight]) as gewicht',
                                        gTxT_ExportOrderHead,
                                            gTxT_ExportOrderHead_Print,1,
                                            gTxT_ExportOrderHeader_IsPrint,
                                          0);


Aus der Variable gewicht baue ich mir dann mit String-Funktionen den Wert wieder zusammen, ist natürlich umständlich. Mit float habe ich es auch versucht, leider vergeblich.

Re: SQL-Decimal in Navision-Decimal [gelöst]

2. Juni 2017 15:34

Ich hab das letzte Woche so umgesetzt und es funktioniert einwandfrei.

Code:
  EVALUATE(Table123.Amount,STRSUBSTNO('%1',(ADO_RecSet.Fields.Item(6).Value)));