[gelöst] externe SQL Datenbank

29. März 2006 12:42

ich möchte aus Navision (kein SQL) aus einer externen SQL Datenbank Informationen abrufen. Hat jemand Damit Erfahrung?
Zuletzt geändert von mespelage am 3. Februar 2009 09:28, insgesamt 1-mal geändert.

29. März 2006 13:43

Erfahrung nicht, aber du müßtest dafür zumindest einen SQL-ODBC-Treiber auf der entsprechenden Workstation haben, diesen als Automation in Navision einbinden und mit entsprechenden parametern ansteuern. Wenn du Visual-Basic oder Office mit installierter VBA-Hilfe hast, kannst du da einige Informationen über die Parameter bekommen.
Mehr kann ich Dir im Moment nicht helfen, aber ich bin ja nicht der einzige im Forum ;-)

29. März 2006 14:49

In Mibuso findet man dazu (ADO) eine Menge Informationen.

4. Januar 2007 16:32

mitlerweile bin ich bereits um einges weitergekommen mit meiner Abfrage aus der externen SQL Datenbank.
Was mir jetzt noch Probleme bereitet, ist der Feldtyp "tinyint" im SQL.
Laut Hilfe handelt es sich hier um ein Navisionfeldtyp "Boolean, Interger oder Option".

Weiß jemand wir ich Daten von diesem Typ in Navision übernehmen kann?

PS: Ich versuche Daten aus dem Programm "Diatec" in Navision zu übernehmen.

mfg Michael

4. Januar 2007 17:04

Man kann in einer Navision-Tabelle die Daten einer auf dem SQL-Server erstellten View anzeigen lassen. Dafür gibt es ein Property namens LinkedObject. Die Daten lassen sich dann ganz normal aus der Navision-Tabelle auslesen.

Hier ein Link zu einer Diskussion darüber hier im Forum

Linked Object

Re: externe SQL Datenbank

4. Januar 2007 17:07

mespelage hat geschrieben:... aus Navision (kein SQL) ...


Das habe ich erst gar nicht richtig gelesen. Ob meine Antwort auch gültig ist für eine Native-DB kann ich nicht sagen.

4. Januar 2007 18:19

Du solltest es als integer einbinden, wenn du nicht weißt, welche Daten in diesem Tinyint feld sind. Dann kann der Inhalt auf jeden Fall dargestellt werden, egal, was drin steht.

4. Januar 2007 18:24

mespelage hat geschrieben:
Was mir jetzt noch Probleme bereitet, ist der Feldtyp "tinyint" im SQL.
Laut Hilfe handelt es sich hier um ein Navisionfeldtyp "Boolean, Interger oder Option".
Weiß jemand wir ich Daten von diesem Typ in Navision übernehmen kann?

Das hängt von der Verwendung innerhalb der Tabelle ab. Eigentlich wird tinyint ( Tiny integer) als platzsparendes Feld ( nur 1 Byte) für ganzzahlige Feldwerte 0 bis 255 verwendet. Aber 0 und 1 kann man natürlich auch als Boolean interpretieren und 0,1,2.. als Optionswerte.

4. Januar 2007 23:34

Unabhängig davon was in der Hilfe steht: Der SQL Datatype "tinyint" wird in NAV ausschließlich für "Booleans" verwendet, "Option" (und "Integer" sowieso) als "int" (diese können lediglich als tinyint verwendet werden).

D.h. in NAV (SQL) findet man nur tinyint Werte 0 oder 1. Du solltest mal prüfen, welche Min/Max Werte die Spalte in deiner SQL Datenbank hat (SELECT MIN(MyField) FROM MyDatabase.dbo.MyTable bzw. SELECT MAX(MyField) FROM MyDatabase.dbo.MyTable). Wenn hier Werte < 0 oder > 1 angezeigt werden, dann sollte die Spalte in ein "Integer" Feld importiert werden.

Zum Import:

Option 1: Via MS ADO: SQL Query auf SQL DB absetzten und Resultset "zu Fuß" verarbeiten, d.h. in die entsprechenden NAV Tabellen schreiben. Je nach Art und Umfang kann dies recht komplex sein.

Option 2: Daten aus SQL DB via DTS (oder SSIS) in eine Datei exportieren und diese dann via Dataport nach NAV importieren. Drückt die Performance wenn die Datei recht groß wird.

Option 3: N/ODBC installieren & konfigurieren. Im SQL Server einen "Linked Server" auf die NAV DB via N/ODBC einrichten. Die Daten können dann u.U. direkt in die NAV Tabellen geschrieben werden, oder ebenfalls via DTS/SSIS kopiert werden.

Ich hoffe, es sind ein paar hilfreiche Inspirationen dabei.

Gruß & Viel Glück!

5. Januar 2007 08:45

Hallo Stryk,

Ich gehe davon aus dass es sich hier um ein Integer oder Boolean handelt. Bei dem Versuch die Daten zu lesen mit

ADO_Recordset.Open(V_String,ADO_Connect);
ADO_Recordset.MoveFirst;
ADO_Fields := ADO_Recordset.Fields;

MESSAGE('%1',ADO_Fields.Item(0).Value);

erhalte ich folgende Fehlermeldung:

Dieser Dateityp wird von C/SIDE nicht unterstützt.
Sie haben Zugriff auf folgende Dateitypen:
VT_VOID, VT_I2, VT_I4, VT_R4, VT_R8,VT_CY, VT_DATE, VT_BSTR, VT_BOOL

bei allen anderen Feldtype gibt es kein Problem

mfg Michael
Zuletzt geändert von mespelage am 10. August 2007 09:46, insgesamt 1-mal geändert.

6. Januar 2007 11:42

Wenn Du das Recordset definierst, nehme ich an Du setzt ein SQL Statement (SELECT ...) auf die Tabelle ab.
Vielleicht ist es möglich, hier die Spalte in einen anderen Datentyp zu konvertieren, also etwa

SELECT CONVERT(int, MyTinyIntField), ...

Hilft das was?

Re: externe SQL Datenbank

3. Februar 2009 09:28

ich habe mitlerweile eine Lösung gefunden
Code:
Funktion(AVariant : Variant) RetInt : Text[30]

IF ISCLEAR(ADOStream) THEN
   CREATE(ADOStream);
ADOStream.Open;
ADOStream.WriteText(AVariant);
ADOStream.Position:= 0;
EVALUATE(RetInt,ADOStream.ReadText);
ADOStream.Close;
EXIT(RetInt);

vielen Dank nochmals an alle

Michael