Zugriff auf Excel bzw Access-Tabellendaten

1. August 2005 17:03

Moins,

ich habe versucht aus C/AL heraus auf Excel bzw Access Daten zuzugreifen.
Es geht darum anhand einer Artikelnummer bestimmte Datensätze/Tabellenzeilen zu finden und die restlichen Daten in die Navision-Tabelle zu importieren, da die XML-Datenquelle, die ich einlesen kann, nicht alle nötigen Daten enthält, weil das Quellprogramm diese nicht besitzt. Die Kunden sollen diese Tabelle im Vorfeld der Konvertierung bearbeiten, damit sie beim XML-Import mit herangezogen werden können.
bei Excel habe ich die richtige Tabelle geöffnet und sichtbar gemacht, einen Range definiert, der die Daten enthält und bin an der Find Methode gescheitert.
Ich habe die Parameter alle übergeben und die lapidare Antwort ist
Die Findmethode konnte nicht auf das Range-Objekt angewendet werden.
gebe ich nur den Suchtext als Parameter an, stürzt Navision sogar komplett ab.
Mit Access bekomme ich zwar die Datenbank geöffnet, finde aber kein Automation-Objekt, womit ich auf die Tabellen zugreifen kann.
Die Online-Hilfe und C/Side-Referenz sowie das ADG schweigen sich darüber völlig aus. Nur zur Datenausgabe (Serienbrief) und Kuchengrafik hab ich ein Beispiel gefunden, sonst wäre ich mit Excel nicht mal soweit gekommen.
hat vielleicht einer eine Idee?

Zur Zeit helfe ich mir so:
In Navision habe ich eine Hilfstabelle entsprechend der externen Tabelle erzeugt, die nach dem Import wieder gelöscht werden kann.
In Access verknüpfe ich diese Tabelle über ODBC auf dem SQL-Server und kopiere die Daten manuell von der Quell in die Zieltabelle.
In Excel exportiere ich die Daten (Kopfzeile vorher löschen), indem ich die Tabelle als CSV-Datei (TAB getrennt) speichere und diese über einen Dataport in die Hilfstabelle importiere.
Das ist bloss leider sehr umständlich und könnte Probleme geben, wenn die entsprechenden Tabellen und DAtaport-ID's schon belegt sind, dann muss wieder alles angepasst werden.

5. August 2005 08:21

Hmmm hat keiner eine Idee?
Dann bin ich wohl doch nicht zu blöd dazu, dann scheint das wohl wirklich nicht zu gehen.... :roll:

5. August 2005 08:46

Also ich kann dir da leider nicht weiterhelfen, da ich bisher recht wenig mit ODBC bzw. Zugriff auf Access zu tun hatte.

5. August 2005 09:15

Habsch mir schon fast gedacht, da du ja längst ne Antwort auf der Pfanne gehabt hättest, wie bei dem Kalenderproblem, woll? :wink:

5. August 2005 09:40

Wenn ich eine Lösung oder auch nur eine Idee habe, lasse ich euch natürlich daran teilhaben.

Vielleicht / Hoffentlich kann einer der anderen User hier einen Ratschlag abgeben, der dich dann zumindest in die richtige Richtung leitet.

17. August 2005 14:39

Hallo Michael,
wie übergibts Du denn die Parameter an die Find Methode ?

17. August 2005 15:17

Hallo Ufuk
ich habe alle möglichen schreibweisen versucht, die aus der Onlinehilfe hervorgehen könnten.

Der letzte Versuch mit Excel war der:
Code:
  suchtext:='KB 1853';  //artikelnummer, die in der ersten Spalte der Tabelle steht
  XLWkbook:=XLS.Workbooks.Open(filename);
  XLWksheet:=XLS.ActiveSheet;
  XLRange:=XLWksheet.Range('A1:F500');
  Range:=XLRange.Find(suchtext,'A1');


Excel wird geöffnet, das Sheet wird aktiviert
und bei der letzten Zeile knallts....

17. August 2005 15:37

Hallo Michael,

also beim Aufruf von Automation Objekten immer die Parameter als Variablen übergeben.

Ich hatte vor einiger Zeit mal bei einem Projekt ein ähnliches Problem, ich hatte damals zum testen auch Konstaten mit übergeben und die verdammte Automation lief einfach nicht, nach ein paar Stunden kam ich auf die Idee das ganze mit Variablen zu versuchen und siehe es lief.

Falls DU das ganze noch nicht mit Variablen versucht hast, ist es alle mal einen Test wert.

gruß
Ufuk

17. August 2005 17:50

das könnte ich mal versuchen, das Startfeld hab ich bisher immer nur als Konstante übergeben.

Im Moment komme ich aber nicht dazu, ich muss erst die XMLports alle fertig programmieren, damit wir unsere Kunden nach Navision konvertieren können.

21. August 2005 23:24

@Ufuk:

So ich habe das jetzt mal nur mit variablen getestet.


hier der Codebereich:
Code:
filename:='D:\Navision\Projekt\artikeldaten.xls';
startrange:='A2:F500';
ItemNo:='kd 1853';
Startfield:='A2';

IF CREATE(XLS) THEN BEGIN;
  XLS.Visible:=TRUE;
  XLWkbook:=XLS.Workbooks.Open(filename);


  XLWksheet:=XLS.ActiveSheet;
  XLRange:=XLWksheet.Range(startrange);
  Range:=XLRange.Find(itemno,startfield);        //vor dieser Zeile hält der Debugger!!!
MESSAGE(FORMAT(Range));

   CLEAR(XLS)
END;


Excel 2000 öffnet zwar die Tabelle und zeigt sie an, es knallt aber immer noch. Als Anhang hab ich mal die Fehlermeldung und die fragliche XLS-Datei angehangen.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

22. August 2005 11:56

Hallo Michael,

so gehts :-D
Code:

filename:='D:\artikeldaten.xls';
startrange:='A2:F500';
ItemNo:='kd 1853';
Startfield:='A2';

IF CREATE(XLS) THEN BEGIN;
  XLS.Visible:=TRUE;
  XLWkbook:=XLS.Workbooks.Open(filename);


  XLWksheet:=XLS.ActiveSheet;
  XLRange:= XLWksheet.Range(startrange).Find(ItemNo);
  XLRange.Activate;
  info:= FORMAT(XLRange.Value);
  MESSAGE(info);
  CLEAR(XLS)
END;


Gruß
Ufuk

22. August 2005 12:40

Fein, jetzt bekomme ich die Message, die mir die gesuchte Artikelnummer ausgibt.
Dafür erstmal meinen herzlichsten Dank!

Jetzt brauch ich nur noch einen Tip, wie ich den gesamten Datensatz (Zeile) zurückbekomme, um einzelne Felder den Zielvariablen zuweisen zu können.....

15. September 2005 19:14

In Tabelle 370 "Excel Buffer" und Report 81 "Import Budget from Excel" sind etliche Funktionen zum Einlesen von Daten aus Excel.

15. September 2005 19:32

Jo, nur leider:
Unknown Automation Server.Application


weder mit excel2K noch mit Excel2003 auf dem Rechner sehe ich da was

Nachtrag:
auf einem Rechner mit Excel97 wurde ich fündig......
ok, das sollte zu realisieren sein.
Ausserdem hab ich vom Marije Brummel aus MiBuSo.Com die Objekte vom Implementation Tool bekommen, das sollte mir weiterhelfen.
Im Moment haben hier aber die XML-Ports zum Auftragsimport Vorrang


trotzdem erst mal Danke!

16. September 2005 12:30

Die unterschiedlichen Excel Versionen haben alle verschiedene ObjectLibrary -Nummern und die Navision Objekte müssen leider immer auf diese abgestimmt werden ( dies dauert nur ein paar Minuten).
Wenn ein User Excel 2000 , der nächste Excel 97 hat, der nächste Excel 2003, dann müssen verschiedene Versionen dieser Objekte kreiert werden und jeder kann nur die benutzen welche für seine Excel Version abgestimmt sind. Also am besten vorher alle Client-PC's auf eine Excel Version festlegen.

16. September 2005 13:02

Danke Kai,
Im Nachtrag habe ich das ja auch schon festgestellt ;-)

Da ich das ja nur für den Konvertierungsprozess brauche, der in unserem Hause stattfindet, kann ich mich hier auf XL2K3 beschränken.

28. September 2005 10:43

Wir hab die "Problematik" bzgl unterschiedlicher Office Versionen dahingehend geköst, das wir in den Automation codeunits, prüfen welche Version(en) auf dem Client installiert ist und benutzen die entsprechenden passenden Funktionen

Ufuk

28. September 2005 13:27

Hi Ufuk,

wie machst du die Überprüfung?

28. September 2005 13:40

Hallo Michael,
Code:
AutoServerRec.SETRANGE(AutoServerRec.Name, 'Microsoft Word 11.0 Object Library');//Wibo.UA.04
IF AutoServerRec.FIND('-') THEN BEGIN
  blbl
  blbl
  blbl
END ELSE BEGIN
  AutoServerRec.SETRANGE(AutoServerRec.Name, 'Microsoft Word 9.0 Object Library');
  IF AutoServerRec.FIND('-') THEN BEGIN
    blbl
    blbl
  END ELSE
     blbl;
END;//Wibo.UA.04



Code:
AutoServerRec = Record = Automation Servers


Da war bei uns Office 2000 und Office 2003 im Einstatz haben, prüfen wir auch nur diese Versionen ab.

Ufuk Altinkaynak

28. September 2005 14:30

Danke Ufuk,
auf die Idee mit den Automation Servers bin ich nämlich nicht gekommen.
Das sollte mir jetzt wohl weiterhelfen.

Bleibt nur noch die Hoffnung, dass da nicht auch noch total unterschiedliche Befehle in den Automations sind.... :wink:

28. September 2005 14:46

Michael Schumacher hat geschrieben:Bleibt nur noch die Hoffnung, dass da nicht auch noch total unterschiedliche Befehle in den Automations sind.... :wink:


gern geschehen, aber leider sind nicht alle Abläufe identisch, z.B. die Serienbrief Funktion Aufrufe von Office 2000 zu 2003 :evil:

Ufuk Altinkaynak

28. September 2005 14:54

Naja, Serienbriefe interessieren mich im Moment weniger,
mir geht es darum, für den Import von Stammdaten im XML-Port aus einer Excel-Tabelle einige benötigte Zusatzinformationen zu holen.
also in einer Tabelle die Artikelnummer suchen und aus den Spalten dieser Zeile die Infos zu holen....

29. Mai 2007 12:10

Hallo!

hast du das Problem nun gelöst?

Am Anfang hast du geschrieben:
"...Mit Access bekomme ich zwar die Datenbank geöffnet, finde aber kein Automation-Objekt, womit ich auf die Tabellen zugreifen kann..."

Falls Du für Access noch ne Loesung brauchst den Tabellenzugriff hab ich hinbekommen!?

Gruss
Silvia

29. Mai 2007 12:59

Hallo Silvia,
Im Moment brauche ich das zwar nicht, aber wer weiss.....
Aber da es ja auch für andere interessant sein könnte, wäre es nett, wenn Du Deine Lösung hier posten könntest.

30. Mai 2007 09:21

Code:
Diese Automations sind notwendig:
Name                      
ADOConnection   Automation   'Microsoft ActiveX Data Objects 2.8 Library'.Connection   
ADORecSet       Automation   'Microsoft ActiveX Data Objects Recordset 2.8 Library'.Recordset   
ADOStream       Automation   'Microsoft ActiveX Data Objects 2.8 Library'.Stream   



//C/AL-CODE

//Erstellen des Connectionstring

ADOConnection.ConnectionString('Provider=Microsoft.Jet.OLEDB.4.0;'
                 + 'Data Source=test.mdb;'
                 + 'User Id=; Password=;');

ADOConnection.Open;
SQLString := 'SELECT * FROM <access-tabelle>';

ADORecSet := ADOConnection.Execute(SQLString);
ADORecSet.MoveFirst;

REPEAT  //Spaltenzugriff
  i := ADORecSet.Fields.Count - 1;
  FOR j:=0 TO i DO BEGIN
    ADOStream.Open; 
    ADOStream.WriteText(ADORecSet.Fields.Item(j).Value);
    ADOStream.Position := 0;
    FieldValue := ADOStream.ReadText;
    ADOStream.Close;

// hier könnte jetzt eine Navision-Tabelle gefüllt werden,
// bzw. der Inhalt der Spalten weiterverwendet werden...
// -->der Inhalt liegt als String vor und muss noch gewandelt werden


  ADORecSet.MoveNext;
UNTIL ADORecSet.EOF;
ADORecSet.Close;
DOConnection.Close;