Konvertierung von xls in dbf

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

Moderator: Moderatoren

Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14658
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Beitrag von Jan »

Stevie,

dazu mußt Du Publics anlegen, aArray1, aArray2, ... Mit Locals ght das nicht wegen Makro.

Und dann als Zuweisung &("aArray" + alltrim(str(i))) := {} (Ungeprüft)

Keine gute Lösung, da Publics, bzw. es gibt elegantere Lösungen (nutz mal die Forensuche, da gibt es bereits mehrere intensive Diskussionen drüber, und wie man das umgeht).

Jan
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo,

so ganz habe ich deine Frage nicht verstanden. Der Variablenname des Arrays muss eindeutig sein. Vermutlich willst du den Feld/Variabennamen einer anderen Variable oder eines Feldes mit dem Inhalt im Array speichern. Das geht so:

Code: Alles auswählen

aArray := {}  // ein Array als Datencontainer
for x := 1 to 5 // nur wenn wir wissen wieviele Elemente.
     // aadd hängt einen Eintrag ins Array, dieser kann auch ein Array sein.
     // hier zuerst den Feldnamen, dann den Inhalt
     aadd( aArray, { DB->(fieldname(x)), DB->(fieldget(1)) } )
     // oder du hast den Namen einer Variablen in cVar gespeichert
     // die Variable in cVar hier also cTest, muss dann aber vom Typ
     // Private oder public sein, da local Variablen so nicht verarbeitet werden
     // können. Private soll man aber meiden.
     cVar := "cTest"
     aadd( aArray, { cVar, &(cVar) } )
     DB->(dbskip())
next
// zugriff auf die Elemente:
// 5. Variablenname:

Code: Alles auswählen

? aArray[5,1] 
// Inhalt 3 Feld

Code: Alles auswählen

? aArray[3,2]
// Alle Infos zum 2. Feld

Code: Alles auswählen

? aArray[2] -> { cFeld , cInhalt }
Gruß
Hubert
stevie
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 417
Registriert: Mo, 17. Sep 2007 18:20
Wohnort: Senftenberg
Kontaktdaten:

Beitrag von stevie »

brandelh hat geschrieben:Hallo,

so ganz habe ich deine Frage nicht verstanden. Der Variablenname des Arrays muss eindeutig sein. Vermutlich willst du den Feld/Variabennamen einer anderen Variable oder eines Feldes mit dem Inhalt im Array speichern. Das geht so:

Code: Alles auswählen

aArray := {}  // ein Array als Datencontainer
for x := 1 to 5 // nur wenn wir wissen wieviele Elemente.
     // aadd hängt einen Eintrag ins Array, dieser kann auch ein Array sein.
     // hier zuerst den Feldnamen, dann den Inhalt
     aadd( aArray, { DB->(fieldname(x)), DB->(fieldget(1)) } )
     // oder du hast den Namen einer Variablen in cVar gespeichert
     // die Variable in cVar hier also cTest, muss dann aber vom Typ
     // Private oder public sein, da local Variablen so nicht verarbeitet werden
     // können. Private soll man aber meiden.
     cVar := "cTest"
     aadd( aArray, { cVar, &(cVar) } )
     DB->(dbskip())
next
// zugriff auf die Elemente:
// 5. Variablenname:

Code: Alles auswählen

? aArray[5,1] 
// Inhalt 3 Feld

Code: Alles auswählen

? aArray[3,2]
// Alle Infos zum 2. Feld

Code: Alles auswählen

? aArray[2] -> { cFeld , cInhalt }
Nein ich will in der Schleife z. B. 5 oder 10 leere Arrays erstellen, die im Namen automatisch hochgezählt werden, wobei i der Zähler ist. D. h. array-name+Inhalt von i ist Name des zu erstellendes Arrays. aArrayi = aArray1
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14658
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Beitrag von Jan »

Was ist dann gegen die Lösung von Klemens in der Newsgroup oder die von mir einzuwenden? Die machen doch genau das. Oder auch wieder falsch gedacht?

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

Beitrag von stevie »

Jan hat geschrieben:Was ist dann gegen die Lösung von Klemens in der Newsgroup oder die von mir einzuwenden? Die machen doch genau das. Oder auch wieder falsch gedacht?

Jan
Nee Klemens hats mit der ersten Möglichkeit voll erfasst, hatte das nur noch nich gelesen.
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14658
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Beitrag von Jan »

Naja, dann bin ich ja beruhigt. Wobei Klemens und ich ja prinzipiell das gleiche meinten 8) , er hat es nur in 2 Zeilen gepackt, ich in eine, dafür habe ich die Next-Schleife vorausgesetzt und daher weggelassen.

Aber dennoch: Überleg Dir noch einmal, ob das nicht auch anders ginge. Ich weiß, der Code wird dadurch recht übersichtlich, weil man in einem Zug alle Arrays belegen kann. Ich hab das früher auch immer gemacht, dann aber mit Arrays, die ich für die Erstellung von SLEs genutzt habe. Ich bin aber aus verschiedenen Gründen inzwischen davon abgekommen. Jetzt lasse ich die Objektnamen in den Grundlagen-Arrays weg, hab da nur noch den Datalink, die Position, Größe, und die PP drinnstehen. Halt ebenfalls der Übrsichtlichkeit wegen. Aber nicht mehr die Objektnamen, die dann eben immer als Public und immer über Makro & angesprochen werden müssen.

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

Beitrag von stevie »

Wie verbinde ich dann direkt Variableninhalte miteinander.
Also:
cvar1 := 5
cvar2 := 7

cvar3 := cvar1 + cvar2

Ausgabe:
cvar3=57

str(cvar1) + str(cvar2) ergibt leider 5 7 und damit lässt sich nichts anstellen, wegen der vielen Leerzeichen zwischen 5 und 7. Dblocate soll diesen Wert nämlich in einer dbf finden.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hi,

Xbase++ nimmt es mit dem Typ nicht so genau, daher ist das kleine c vor deinen Variablen auch nur ein interner Hinweis, dass ein String gespeichert werden soll. Dann solltest du aber auch einen String zuweisen:

cVar1 := "5"
cVar2 := "7"

cVar3 := cVar1 + cVar2

? cVar3 -> "57"

Wenn du 5 und 7 numerisch brauchst, gibt es die Funktion alltrim() alle Leerzeichen weg, rtrim() nur die rechten weg etc. ltrim()....

nVar1 := 5
nVar2 := 6

cVar3 := alltrim(str(nVar1)) + alltrim(str(nVar2))

? cVar3 -> "57"

da man das recht häufig braucht, habe ich mir eine Funktion geschrieben:

function ntrim(nWert)
return alltrim(str(nWert))

Nachkommastellen etc werden hier je nach Bedarf gehandhabt.
Wenn man diese anders braucht, sieh dir mal transform() an.
Gruß
Hubert
stevie
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 417
Registriert: Mo, 17. Sep 2007 18:20
Wohnort: Senftenberg
Kontaktdaten:

Beitrag von stevie »

Jetzt geht eigentlich schon alles. Ich hab nur ein einziges Problem und zwar damit: Field -> Serien-Nr. := aArray4
Er kommt anscheinend mit dem - (minus) im Feldnamen nicht klar. Weiß jemand, wie man das anpassen kann? Spaltenname ist vorgegeben, sollte ich also nicht unbedingt verändern (die anstößigen Zeichen rausnehmen). Fehlermeldung beim Compilieren ist "Syntax error".
Robert
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 36
Registriert: Mo, 13. Feb 2006 12:47

Beitrag von Robert »

stevie hat geschrieben:Jetzt geht eigentlich schon alles. Ich hab nur ein einziges Problem und zwar damit: Field -> Serien-Nr. := aArray4


Mittels FieldPut() solltest du zum Ziel kommen

Code: Alles auswählen

DBALIAS -> ( FieldPut( FieldPos("Serien-Nr."), aArray4[i]  )   )
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 »

Hallo Stevie,

ich glaube nicht, dass du das Feld "Serien-Nr." genauso ansprechen kannst!
Normalerweise ersetzt XBase Sonderzeichen automatisch durch "_".
Liess die Datenbankstruktur aus und kontrolliere, wie die Felder unter XBase lauten.

Code: Alles auswählen

aStruct := dbstruct()
Memowrit("test.txt", var2char(aStruct) )
Damit hast du denn Array mit der Datenstruktur in einer Text-Datei und kannst es normal ansehen.
Gruß,

Andreas
VIP der XUG Osnabrück
Robert
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 36
Registriert: Mo, 13. Feb 2006 12:47

Beitrag von Robert »

andreas hat geschrieben:Hallo Stevie,

ich glaube nicht, dass du das Feld "Serien-Nr." genauso ansprechen kannst!
Ich habe mir gerade eine Test-DBF erstellt, welche auch ein Feldnamen mit den Zeichen "-" und "." hatte.

In Verbindung mit FieldPos und Fieldput, so wie ich oben geschrieben habe, konnte ich jedenfalls problemlos Werte für dieses Feld eintragen.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hi,

Clippers DBU verweigert sowas, aber Xbase++ scheint flexibler zu sein, da ja die ODBC Datenquellen oder eben mit Excel erzeugte DBF sowas enthalten können. Es knallt im obigen Programm ja auch nicht deshalb, weil ein Name mit - angesprochen wird, sondern deshalb, weil der Compiler daraus 2 Variablen (Felder) macht, die von einander abgezogen werden:

Feld: "Haus-Nr." -> HAUS - NR (der Punkt hat auch eine Sonderfunktion). Wären beide zufällig auch vorhanden, müsste es nur eine ungewollte Berechnung aber keinen Fehler geben. Habe es gerade probiert.

Code: Alles auswählen

DBF: 

"DAS-GEHT" , "C", 10, 0
"DAS" , "C", 10, 0
"GEHT" , "C", 10, 0

fieldput(1,"NIX")
DAS := "O"
GEHT := "K"

? DAS-GEHT ->   "OK        "
DBFs von fremden Quellen (flexible Namen) sollte man also nicht über die Feldnamen sondern Feldnummern bedienen.
Gruß
Hubert
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 »

Robert hat geschrieben:
andreas hat geschrieben:Hallo Stevie,

ich glaube nicht, dass du das Feld "Serien-Nr." genauso ansprechen kannst!
Ich habe mir gerade eine Test-DBF erstellt, welche auch ein Feldnamen mit den Zeichen "-" und "." hatte.

In Verbindung mit FieldPos und Fieldput, so wie ich oben geschrieben habe, konnte ich jedenfalls problemlos Werte für dieses Feld eintragen.
Ich meine die Struktur der Excel-Tabelle, um nachzusehen, was XBase mit den Feldnamen macht. Aus Erfahrung weiss ich, dass XBase die Zeichen in den Feldnamen ersetzen kann.
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:

Danke

Beitrag von stevie »

Robert hat geschrieben:
andreas hat geschrieben:Hallo Stevie,

ich glaube nicht, dass du das Feld "Serien-Nr." genauso ansprechen kannst!
Ich habe mir gerade eine Test-DBF erstellt, welche auch ein Feldnamen mit den Zeichen "-" und "." hatte.

In Verbindung mit FieldPos und Fieldput, so wie ich oben geschrieben habe, konnte ich jedenfalls problemlos Werte für dieses Feld eintragen.
Ich konnte es auch. Ansonsten danke ich für eure Hilfe. Es war ein harter Weg zum Ziel, aber jetzt funktioniert alles. Erst kommt die Excelverbindung, dann lese ich alle benötigten Felder ein und setze die zu berechnenden auf 0 und speichere damit Zeile für Zeile ins Array. Dann nehme ich alle Berechnungen vor und setze sie an den freien Stellen ein. Am Ende erstelle ich eine dbf, in die ich dann die Inhalte des Arrays speichere.
Antworten