Konvertierung von xls in dbf

Zugriff, Engines, Konvertierung. Von ADS über DBF bis zu SQL.

Moderator: Moderatoren

stevie
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 417
Registriert: Mo, 17. Sep 2007 18:20
Wohnort: Senftenberg
Kontaktdaten:

Konvertierung von xls in dbf

Beitrag von stevie »

Hallo. Ich bin neu hier. Ich heiße Stefan, komme aus Senftenberg und bin Fi (Ae) erstes Lehrjahr. Und gleich meine erste Frage. Bin noch blutiger Anfänger, deswegen....
Wie kann ich durch ein paar Zeilen Xbase-Code den Inhalt einer Exceldatei in
einer dbf speichern, die dann auch weiterverwendet werden kann?
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15706
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 70 Mal
Danksagung erhalten: 34 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo,

stelle doch bitte deine persönliche Vorstellung in den Vorstellungsthread.

Zu der Frage, also wenn du die 1.90 hast, kannst du ActiveX nutzen.
Allerdings kenne ich mich damit nicht so aus. Im Samples Ordner gibt es einen Ordner Activex - dort macht das Beispielprogramm excel2.prg genau das was du willst. DBF Felder in Excel-Arbeitsblätter eintragen und speichern. Excel1.prg nutzt die Importfunktion, die bestimmt schneller ist.

Ein anderer Weg wäre ODBC, dafür braucht man aber entweder die Prof. Subscription oder SQLexpress.

Mit der Suchen Funktion des Forums erhälst du unter ActiveX oder Excel eine Menge Fundstellen, denn das Thema war schon öffterst da ;-)
Gruß
Hubert
Alfred
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 476
Registriert: Do, 03. Mai 2007 12:37
Wohnort: München

Beitrag von Alfred »

Hallo stevie,

unter Active X, Daten aus Excel auslesen findest du ein Beispiel wie man
auf Excel zugreift. Auch unter Automations Error findest du ein Beispiel.

Gruß
Alfred
Benutzeravatar
andreas
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1902
Registriert: Mi, 28. Sep 2005 10:53
Wohnort: Osnabrück
Hat sich bedankt: 4 Mal
Kontaktdaten:

Beitrag von andreas »

oder wenn es einmalige Sache ist, dann aus Excel exportieren.
Gruß,

Andreas
VIP der XUG Osnabrück
stevie
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 417
Registriert: Mo, 17. Sep 2007 18:20
Wohnort: Senftenberg
Kontaktdaten:

aus excel exportieren

Beitrag von stevie »

das geht nicht, die db war, egal ob dbase 2, 3 oder 4 nicht mit xtree lesbar
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15706
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 70 Mal
Danksagung erhalten: 34 Mal
Kontaktdaten:

Re: aus excel exportieren

Beitrag von brandelh »

stevie hat geschrieben:das geht nicht, die db war, egal ob dbase 2, 3 oder 4 nicht mit xtree lesbar
Hi,

ich kenne jetzt xTree nicht, aber ein häufiger Fehler liegt in der sehr flexiblen Kennzeichnung der Überschriften in der ersten Zeile unter Excel (oder auch 123 ;-) ). Eine alte DBF ist da recht konservativ.
Diese werden ja als Feldnamen übernommen und da knallt es halt wenn 2 den gleichen haben oder Sonderzeichen drinn sind, oder mehr als 10 Zeichen etc....
Gruß
Hubert
stevie
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 417
Registriert: Mo, 17. Sep 2007 18:20
Wohnort: Senftenberg
Kontaktdaten:

Re: aus excel exportieren

Beitrag von stevie »

brandelh hat geschrieben: ich kenne jetzt xTree nicht, aber ein häufiger Fehler liegt in der sehr flexiblen Kennzeichnung der Überschriften in der ersten Zeile unter Excel (oder auch 123 ;-) ). Eine alte DBF ist da recht konservativ.
Diese werden ja als Feldnamen übernommen und da knallt es halt wenn 2 den gleichen haben oder Sonderzeichen drinn sind, oder mehr als 10 Zeichen etc....
xtree liest dbase3 dateien und zeigt sie an.
Ich nutze nun seit gut 6 Stunden hier und suche eine funktionierende Lösung und wäre ich daher sehr verbunden, wenn ihr mir mit nem konkreten Beispiel helfen könnt. Verzweifel nämlich langsam. Beispielsweise das was hier im Forum steht, scheitert schon daran, dass mir die Includes excel.ch und activex.ch fehlen. Egal wie, hauptsache es klappt.
Alfred
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 476
Registriert: Do, 03. Mai 2007 12:37
Wohnort: München

Beitrag von Alfred »

Hallo stevie,

excel.ch gibt es erst seit xbase++ 1.9.

Diese findest du unter xppw32\source\samples\msexcel\

Gruß
Alfred
stevie
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 417
Registriert: Mo, 17. Sep 2007 18:20
Wohnort: Senftenberg
Kontaktdaten:

Beitrag von stevie »

Alfred hat geschrieben:Hallo stevie,

excel.ch gibt es erst seit xbase++ 1.9.

Diese findest du unter xppw32\source\samples\msexcel\

Gruß
Alfred
und ich hab 1.82
Alfred
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 476
Registriert: Do, 03. Mai 2007 12:37
Wohnort: München

Beitrag von Alfred »

Hallo stevie,

wenn es nur eine einmalige Aktion ist, dann export nach csv und in
xbase mit low-level einlesen.

Gruß
Alfred
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9394
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 104 Mal
Danksagung erhalten: 364 Mal
Kontaktdaten:

Beitrag von Tom »

Hallo, Stevie.

Wenn es wirklich eine einmalige Sache ist:

Feldnamen (also Tabellenüberschriften) in Großschreibung, maximal zehn Zeichen, keine Doppelungen (sicherheitshalber: FELD1, FELD2, FELD3 usw.). Alle Feldlängen optimieren, also die gesamte Tabelle wählen und "optimale Spaltenbreite" aufrufen. Sonst schneidet Excel beim Export Daten ab. Dann nach Dbase 3 (!) exportieren. Diese Datei sollte sich in jedem Fall lesen lassen, es sei denn, Du hast Spalten mit mehr als 255 Zeichen. Memo funzt aus Excel heraus nicht.

Wenn es keine einmalige Sache ist:

Auf 1.9 umsteigen oder Dir - das gibt es inzwischen als Freeware, ich weiß aber leider nicht, wo - JazzAge besorgen. Das ist eine Active-X-Library für Xbase (< 1.9). Dann allerdings wird's richtig kompliziert.
Herzlich,
Tom
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9394
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 104 Mal
Danksagung erhalten: 364 Mal
Kontaktdaten:

Beitrag von Tom »

Ergänzung: Du kannst auch die ODBCDBE benutzen, sofern Du die bei Deinem Xbase 1.8 dabei hast. Dafür gibt es Beispiele zum Auslesen einer Excel-Datei direkt in Xbase.
Herzlich,
Tom
stevie
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 417
Registriert: Mo, 17. Sep 2007 18:20
Wohnort: Senftenberg
Kontaktdaten:

Beitrag von stevie »

Tom hat geschrieben:Hallo, Stevie.

Wenn es wirklich eine einmalige Sache ist:

Feldnamen (also Tabellenüberschriften) in Großschreibung, maximal zehn Zeichen, keine Doppelungen (sicherheitshalber: FELD1, FELD2, FELD3 usw.). Alle Feldlängen optimieren, also die gesamte Tabelle wählen und "optimale Spaltenbreite" aufrufen. Sonst schneidet Excel beim Export Daten ab. Dann nach Dbase 3 (!) exportieren. Diese Datei sollte sich in jedem Fall lesen lassen, es sei denn, Du hast Spalten mit mehr als 255 Zeichen. Memo funzt aus Excel heraus nicht.
Hab ich alles gemacht. Keine Chance.
Wenn es keine einmalige Sache ist:

Auf 1.9 umsteigen oder Dir - das gibt es inzwischen als Freeware, ich weiß aber leider nicht, wo - JazzAge besorgen. Das ist eine Active-X-Library für Xbase (< 1.9). Dann allerdings wird's richtig kompliziert.
Das ist doch so schon kompliziert genug. Ich meine nicht mal das Beispiel bei ODBCDBE funktioniert. Er bekommt angeblich keine Verbindung zum DBE was aber direkt dort aufgerufen wird. Für 1,9 werd ich meinen Chef wohl kaum überreden können.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9394
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 104 Mal
Danksagung erhalten: 364 Mal
Kontaktdaten:

Beitrag von Tom »

Hallo, Stevie.

Die ODBCDBE-Beispiele muß man anpassen (Text am Anfang der Beispiele lesen!). Und Du mußt ODBC aktiv haben. Zudem muß es eine Benutzer-Datenquelle (DSN) geben, die namentlich im Beispiel angesprochen wird (dort steht "Excel Files", aber eine deutsche ODBC kennt standardmäßig "Excel-Dateien"). Derlei stellst Du in der ODBC-Datenquellen-Administration ein (Ausführen -> ODBCAD32.EXE).
Herzlich,
Tom
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15706
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 70 Mal
Danksagung erhalten: 34 Mal
Kontaktdaten:

Beitrag von brandelh »

Hi,

wenn du es nur sporadisch brauchst, kannst du auch die DEMO von SQLExpress nutzen. Der Link steht auch hier in der Rubrik Links ...

Da ist ein Beispiel für Excel und 1.82 über ODBC Dabei.

Aber beschreibe doch mal genauer dein Problem.
Excel kann wenn man einiges beachtet ganz gut DBF exportieren.
Gruß
Hubert
stevie
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 417
Registriert: Mo, 17. Sep 2007 18:20
Wohnort: Senftenberg
Kontaktdaten:

Zugriff auf Excel

Beitrag von stevie »

Hallo
Der odbcdbe Hilfe in xbase zufolge müsste man mit dem Code hier auf Excel zugreifen können, kann aber nicht.
#include "Odbcdbe.ch"

PROCEDURE Main
LOCAL cConnect, oSession

cConnect := "DBE=ODBCDBE"
cConnect += ";DRIVER=Microsoft Excel Driver (*.xls)"
cConnect += ";FIL=excel 9.0"
cConnect += ";UID=Admin"
cConnect += ";DBQ=D:\XBASE\testdb.xls"

oSession := DacSession():new( cConnect )
IF oSession:isConnected()
USE Customer
Browse()
USE
oSession:disconnect()

ENDIF
RETURN
Wenn ich nämlich unter if osession... eine Meldung ausgeben lasse, wird die niemals angezeigt. Wenn ich das richtig gesehen habe, ist die Bedingung erfüllt, wenn auf testdb.xls zugegriffen werden konnte. Was läuft da falsch? Odbc-Treiber sind installiert und laufen. In der Excel-Datei steht eine Tabelle mit dem Namen Customer und der Bereich mit den Daten heißt auch Customer.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9394
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 104 Mal
Danksagung erhalten: 364 Mal
Kontaktdaten:

Beitrag von Tom »

Hallo, Stevie.

Mindestens das hier fehlt:

Code: Alles auswählen

DbeLoad( "ODBCDBE" )
DbeSetDefault( "ODBCDBE" )
Herzlich,
Tom
stevie
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 417
Registriert: Mo, 17. Sep 2007 18:20
Wohnort: Senftenberg
Kontaktdaten:

Beitrag von stevie »

Tom hat geschrieben:Hallo, Stevie.

Mindestens das hier fehlt:

Code: Alles auswählen

DbeLoad( "ODBCDBE" )
DbeSetDefault( "ODBCDBE" )
Damit lässt sich erstmal lesen. Ich werd ma versuchen, das dann in eine dbf zu schreiben.
stevie
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 417
Registriert: Mo, 17. Sep 2007 18:20
Wohnort: Senftenberg
Kontaktdaten:

Beitrag von stevie »

Wie im vorigen gezeigt hab ich die Excel-Datei ausgelesen. Jetzt hab ich mit
DbExport("test.dbf")
innerhalb der Verbindung versucht die Daten zu exportieren. Das Problem ist, dass statt der test.dbf eine test.xls gemacht wurde. Wie kriege ich den dazu, dass er eine test.dbf erstellt?
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9394
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 104 Mal
Danksagung erhalten: 364 Mal
Kontaktdaten:

Beitrag von Tom »

Hallo, Stevie.

Das liegt daran, daß die ODBCDBE jetzt Deine Standard-Datenbankengine ist.

Code: Alles auswählen

DbExport( "text.dbf",,,,,,, "DBFDBE")
Herzlich,
Tom
stevie
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 417
Registriert: Mo, 17. Sep 2007 18:20
Wohnort: Senftenberg
Kontaktdaten:

Beitrag von stevie »

Tom hat geschrieben:Hallo, Stevie.

Das liegt daran, daß die ODBCDBE jetzt Deine Standard-Datenbankengine ist.

Code: Alles auswählen

DbExport( "text.dbf",,,,,,, "DBFDBE")
Jetzt ist es zwar eine dbf aber, die sieht grässlich aus. In der dbf sind zwar die Spaltennamen aber in den Datensätzen steht überall Memo. Entsprechend wurde eine dbt angelegt, in der die Memo-Felder stehen. Andere Idee, wenn man jeden Datensatz per FieldGet in einer Schleife ausliest und in ein Array speichert, könnte man das dann in eine dbf schreiben, oder? Problem ist, wie müsste so ein Array aussehen?
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15706
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 70 Mal
Danksagung erhalten: 34 Mal
Kontaktdaten:

Beitrag von brandelh »

Hi Stevie,

du solltest dringend die Grundlagenkapitel in der Onlinehilfe nachlesen.

Um kompatibel zu Clipper zu sein werden in jedes Xbase Programm mehrere Prozeduren automatisch eingebunden. Die dazugehörenden Quellcodes kann man unter ..\source\sys\ finden.

Eine davon ist die AppSys.prg die sich um ein Grundfenster kümmert (CRT), das man später nicht mehr möchte.

Die Dateizugriffe sind in der DbeSys.PRG festgelegt.
Standardmäßig wird dort der DBFNTX Treiber festgelegt.

Wenn du ausschließlich über ODBC arbeiten willst ist das erste Beispiel von Tom richtig gewesen, ansonsten würde ich den default Treiber nicht auf ODBC setzen, sondern eher bei dem USE Commando die VIA ODBCDBE verwenden. In beiden Fällen muss man die ODBCDBE dem System wie oben angeführt verfügbar machen, genauso wie z.B. ein eventueller FOXCDX Treiber für die moderneren Fox-DBF und CDX Dateien. Deren Vorteil liegt in mehr Datentypen, besseren Memofeldern und kleineren Indexdateien.

Um das aber zu verstehen muss man die Grundlagenkapitel wahrscheinlich mehrfach lesen.
Gruß
Hubert
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9394
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 104 Mal
Danksagung erhalten: 364 Mal
Kontaktdaten:

Beitrag von Tom »

Code: Alles auswählen

aDataArray := {}
Do While !Eof()
  aAdd(aDataArray,{})
  For i := 1 TO FCount()
    aAdd(aDataArray[Len(aDataArray)],FieldGet(i))
  Next
  DbSkip()
EndDo
(ungetesteter Code)

aDataArray dürfte dann (zweidimensional) alle Feldinhalte der Datei enthalten.

Du kannst aber auch eine DBF anlegen (mit DbCreate() oder irgendeinem Tool) und die Inhalte aus Deiner Excel-Datei direkt hineinschreiben. Dabei müssen natürlich Typen und Feldlängen übereinstimmen:

Code: Alles auswählen

Select ex // angenommen, der Alias der Excel-Datei lautet so
Do While !Eof()
  Select MyDb
  Append Blank
  MyDb->Name := ex->name
  MyDb->Vorname := ex->vorname
  * usw.
  Unlock
  Select ex
  DbSkip()
EndDo
Herzlich,
Tom
Alfred
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 476
Registriert: Do, 03. Mai 2007 12:37
Wohnort: München

Beitrag von Alfred »

Hallo stevie,

so legt man eine Datei per Programm an:

Code: Alles auswählen

PROCEDURE Main
      LOCAL aStructure := { ; 
              { "Betrag" ,"N",  10, 2 }, ; 
              { "BELEG1" , "C", 10, 0 }, ; 
              { "BUCHDAT", "D", 10, 0 },;
                          } 
      SET DATE GERMAN
      SET CHARSET TO ANSI

      DbCreate( "erffib", aStructure, "DBFNTX" ) 

 RETURN 
Gruß
Alfred
stevie
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 417
Registriert: Mo, 17. Sep 2007 18:20
Wohnort: Senftenberg
Kontaktdaten:

Arrays

Beitrag von stevie »

Ich möchte gern Arrays dynamisch erstellen.
for i:=1 to 5
aArray := { }
next

Ausgabe: aArray1
aArray2 usw.

Kann ich jetzt gleich aus aArray dann aArrayi machen, oder wie muss das aussehen, damit der Variablenname bei der Erstellung des Arrays mit angehängt wird?
Zuletzt geändert von stevie am Do, 20. Sep 2007 11:07, insgesamt 1-mal geändert.
Antworten