[Gelöst] Excel IMPORT nach Navision 4.0 (für Anfänger)

18. April 2006 17:01

Hallo zusammen,

als neuer und begeisterter NAVSION Anwender haben wir so unsere Probleme mit dem importieren von Exeldateien (nicht mit Dataport CSV).

Es soll eine Exceldatei die täglich immer weiter wächst mit einem Report importiert werdern. Der Dateiname und das entsprechende Blatt sind immer gleich und bekannt. Die Datensätze sollen 1:1 in eine Navision Tabelle eingelesen werden. Mehr nicht ohne Abfragen oder Requestforms oder der gleichen - nur dumm einlesen. Ich habe mir den Bericht 81 und 82 schon angeschaut die sind aber leider für einen Anfänger zu kompliziert. :-( (Jeder fängt mal klein an) :cry:

Vielleicht hat jemand einen Tipp oder noch besser ein Beispiel wie man das am Besten löst.

Besten Dank schon mal für Eure Mühe

Roland
Zuletzt geändert von Roland am 5. Mai 2006 13:00, insgesamt 1-mal geändert.

18. April 2006 17:20

Hi Roland,

lege eine Variable vom Typ "Record" und Subtype "Excel Buffer" an. Ich habe die Variable in dem folgenden Beispiel "ExcelBuffer" genannt. Im Programmcode muss dann folgendes stehen:
Code:
ExcelBuffer.OpenBook('C:\Test.xls', 'Blattname');
ExcelBuffer.ReadSheet;

Beim Ausführen der beiden o. g. Zeilen öffnet Navision die Exceldatei und schiebt den Inhalt der entsprechend gewählten Mappe (Blattname) in die Tabelle "Excel Buffer" (ID: 370). Du hast dann die Möglichkeit die Daten aus der Tabelle "Excel Buffer" zu lesen und in deine Tabellen zu verschieben.

Gruß, Marc

19. April 2006 10:50

Hallo Marc,

Danke erst mal für Deine schnelle Antwort. Das Importieren in den Buffer hat jetzt soweit funktioniert. Manchmal läuft er auf einen Fehler, wenn in der Exceldatei ein '#WERT!' steht, dann wird der Import abgebrochen und die Datei bleibt gesperrt. Muss ich mal schaun, dass der Fehler schon in Excel abgefangen wird. Wenn nicht, kann ich die Sperrung auch so in NAV wieder aufheben?

Mit dem verschieben in die Tabelle habe ich aber meine liebe Not. Ich habe mir nochmal den Report 81 angeschaut werde aber nicht schlau daraus, was ich da machen muss.

Vielleicht hat jemand erbarmen, und schreibt mir ein paar Codezeilen, die den Buffer in eine Tabelle übertragen.
Wäre wirklich nett.

Besten Dank schon mal

Gruss
Roland

19. April 2006 10:55

Also ich würde mir nicht den Report 81 anschauen. Der ist echt sehr groß und somit auch für jemanden der sich mit Navision noch nicht hunderprozentig auskennt unübersichtlich.

Wie sieht denn die Struktur der Zieltabelle aus?

19. April 2006 11:04

Hallo Marc,

die Zieltabelle hat vorerst folgende Felder:


Enabled Field No. Field Name Data Type Length Description
Yes 1 ZEICHNR Code 20
Yes 2 ART Text 50
Yes 3 Datum DateTime
Yes 4 ZNG NR Code 20
Yes 5 PROJEKT NR Code 10
Yes 6 Grafikname Text 40


die Quelldatei natürlich die gleichen.

Wenn das alles mal richtig läuft, kann es sein, dass weitere Felder in der Exceldatei angelegt werden die dann ebenfalls in der Tabelle noch angelegt werden.
Wenns hilft, kann ich auch die Tabelle und xls mailen.

Gurss
Roland

19. April 2006 11:25

Hey Roland,
auf die schnelle würde ich mal sagen, kann man das ungefähr so abbilden:
Code:
ExcelBuffer.OpenBook('C:\\Test.xls','Tabelle1');
ExcelBuffer.ReadSheet;

IF ExcelBuffer.FIND('+') THEN
  CountRows:=ExcelBuffer."Row No.";

FOR Idx:=1 TO CountRows DO BEGIN
  TargetTable.INIT;

  IF ExcelBuffer.GET(Idx, 1) THEN
    TargetTable.ZEICHNR:=ExcelBuffer."Cell Value as Text";
  IF ExcelBuffer.GET(Idx, 2) THEN
    TargetTable.ART:=ExcelBuffer."Cell Value as Text";
  IF ExcelBuffer.GET(Idx, 3) THEN
    TargetTable.Datum:=ExcelBuffer."Cell Value as Text";
  IF ExcelBuffer.GET(Idx, 4) THEN
    TargetTable."ZNG NR":=ExcelBuffer."Cell Value as Text";
  IF ExcelBuffer.GET(Idx, 5) THEN
    TargetTable."PROJEKT NR":=ExcelBuffer."Cell Value as Text";
  IF ExcelBuffer.GET(Idx, 6) THEN
    TargetTable.Grafikname:=ExcelBuffer."Cell Value as Text";

  TargetTable.INSERT;
END;


Die Variablen "ExcelBuffer" und "TargetTable" sind vom Typ Record. "CountRows" und "Idx" vom Typ Integer.

Ich habe den Code nicht selber getestet...

Gruß, Marc

19. April 2006 14:09

bei Zielfeldern, die nicht vom Typ Text oder Code sind, wirst Du aber wohl
Code:
evaluate(TargetTable.Datum,ExcelBuffer."Cell Value as Text");

verwenden müssen.

19. April 2006 14:16

Stimmt, da hast du recht.

19. April 2006 14:22

Michael Schumacher hat geschrieben:bei Zielfeldern, die nicht vom Typ Text oder Code sind, wirst Du aber wohl 'evaluate(TargetTable.Datum,ExcelBuffer."Cell Value as Text")' verwenden müssen.


Ich verwende in solchen Fällen den evaluate-Befehl immer zusammen mit einer IF-Abfrage, also z.B.

Code:
IF NOT evaluate(TargetTable.Datum,ExcelBuffer."Cell Value as Text") THEN ...


So lassen sich Fehlermeldungen bei falschen Werten (blank anstelle 0 in Integer usw.) abfangen, rsp. mit einem gültigen Default-Wert versehen

@schumi
Bitte nicht als Kritik an Deiner Antwort verstehen :-)

19. April 2006 14:50

rotsch hat geschrieben:@schumi
Bitte nicht als Kritik an Deiner Antwort verstehen :-)


Keine Panik, war ja auch nur als Hinweis und nicht als völlig ausformulierter Code gedacht.
Ich verwende da auch immer eine If Abfrage, zur Not mit "then;" ;-)

19. April 2006 16:52

Hallo zusammen,

erst mal ein DICKES LOB an Euch und DANKE hat mir sehr geholfen :lol:

der Import funktioniert jetzt soweit. Dank Eurer Hilfe konnte ich die Probleme mit dem Format jetzt auch lösen. Jetzt gibt's noch eine Hürde mit dem Primärkey es gibt kein Feld in der Tabelle, das eindeutig ist. Somit bekomme ich immer Probleme wenn doppelte Datensätze eingefügt werden. Wahrscheinlich werde ich in der Exceldatei eine lfd Nr noch anlegen und die ebenfalls importieren. Das kommt aber erst morgen dran. Für heute ist erst mal Feierabend.

Viele Grüsse

Roland

19. April 2006 17:24

gibt es auch keine eindeutige Kombination von Feldern?

19. April 2006 18:57

Es muss nicht unbedingt eine "Lfd. Nr." importiert werden. Es kann auch im OnInsert-Trigger eine Nummer ermittelt und eingefügt werden.
Da du mit 4.00 arbeitest, könnte sogar AutoIncrement verwendet werden.

Eleganter wäre natürlich, wenn die Kombination von zwei oder drei Feldern schon eindeutig wäre, da "Lfd. Nr." als Primärschlüssel immer nur eine Notlösung sein sollte.

25. April 2006 12:09

Hi,

der Import funktioniert jetzt. Das Problem mit dem Key ist auch gelöst, habe 3 Felder zusamen gelegt - Dank Dir Michael :-D

Den anderen sei natürlich auch gedankt für Ihre Hilfe..


Eine kurze Frage generell zum Import. Muss zwingen, auf dem Rechner, auf dem der Import ausgeführt wird Excel installiert sein??
Oder kann man das umgehen??

Ich wollte den Excelimport alle 10 min automatisch über den Objektaufrufplaner auf dem Server ausführen und nicht unbedingt Excel auf dem Server installieren müssen.

Besten Dank schon mal

25. April 2006 12:19

Roland hat geschrieben:Eine kurze Frage generell zum Import. Muss zwingen, auf dem Rechner, auf dem der Import ausgeführt wird Excel installiert sein??


Wenn du die Tabelle 370 für den Import benutzt, muss Excel installiert sein.

Gruß, Marc

25. April 2006 12:56

das hab ich mir fast gedacht :cry:


Gruss Roland