Konvertierung von xls in dbf
Moderator: Moderatoren
- Jan
- Marvin
- Beiträge: 14662
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
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
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
- brandelh
- Foren-Moderator
- Beiträge: 15710
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 73 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
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:
// zugriff auf die Elemente:
// 5. Variablenname:
// Inhalt 3 Feld
// Alle Infos zum 2. Feld
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
// 5. Variablenname:
Code: Alles auswählen
? aArray[5,1]
Code: Alles auswählen
? aArray[3,2]
Code: Alles auswählen
? aArray[2] -> { cFeld , cInhalt }
Gruß
Hubert
Hubert
-
- Rekursionen-Architekt
- Beiträge: 417
- Registriert: Mo, 17. Sep 2007 18:20
- Wohnort: Senftenberg
- Kontaktdaten:
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 = aArray1brandelh 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:
// zugriff auf die Elemente: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
// 5. Variablenname:
// Inhalt 3 FeldCode: Alles auswählen
? aArray[5,1]
// Alle Infos zum 2. FeldCode: Alles auswählen
? aArray[3,2]
Code: Alles auswählen
? aArray[2] -> { cFeld , cInhalt }
- Jan
- Marvin
- Beiträge: 14662
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Naja, dann bin ich ja beruhigt. Wobei Klemens und ich ja prinzipiell das gleiche meinten , 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
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
-
- Rekursionen-Architekt
- Beiträge: 417
- Registriert: Mo, 17. Sep 2007 18:20
- Wohnort: Senftenberg
- Kontaktdaten:
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.
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.
- brandelh
- Foren-Moderator
- Beiträge: 15710
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 73 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
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.
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
Hubert
-
- Rekursionen-Architekt
- Beiträge: 417
- Registriert: Mo, 17. Sep 2007 18:20
- Wohnort: Senftenberg
- Kontaktdaten:
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".
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".
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] ) )
- andreas
- Der Entwickler von "Deep Thought"
- Beiträge: 1902
- Registriert: Mi, 28. Sep 2005 10:53
- Wohnort: Osnabrück
- Hat sich bedankt: 4 Mal
- Kontaktdaten:
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.
Damit hast du denn Array mit der Datenstruktur in einer Text-Datei und kannst es normal ansehen.
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) )
Ich habe mir gerade eine Test-DBF erstellt, welche auch ein Feldnamen mit den Zeichen "-" und "." hatte.andreas hat geschrieben:Hallo Stevie,
ich glaube nicht, dass du das Feld "Serien-Nr." genauso ansprechen kannst!
In Verbindung mit FieldPos und Fieldput, so wie ich oben geschrieben habe, konnte ich jedenfalls problemlos Werte für dieses Feld eintragen.
- brandelh
- Foren-Moderator
- Beiträge: 15710
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 73 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
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.
DBFs von fremden Quellen (flexible Namen) sollte man also nicht über die Feldnamen sondern Feldnummern bedienen.
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 "
Gruß
Hubert
Hubert
- andreas
- Der Entwickler von "Deep Thought"
- Beiträge: 1902
- Registriert: Mi, 28. Sep 2005 10:53
- Wohnort: Osnabrück
- Hat sich bedankt: 4 Mal
- Kontaktdaten:
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.Robert hat geschrieben:Ich habe mir gerade eine Test-DBF erstellt, welche auch ein Feldnamen mit den Zeichen "-" und "." hatte.andreas hat geschrieben:Hallo Stevie,
ich glaube nicht, dass du das Feld "Serien-Nr." genauso ansprechen kannst!
In Verbindung mit FieldPos und Fieldput, so wie ich oben geschrieben habe, konnte ich jedenfalls problemlos Werte für dieses Feld eintragen.
-
- Rekursionen-Architekt
- Beiträge: 417
- Registriert: Mo, 17. Sep 2007 18:20
- Wohnort: Senftenberg
- Kontaktdaten:
Danke
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.Robert hat geschrieben:Ich habe mir gerade eine Test-DBF erstellt, welche auch ein Feldnamen mit den Zeichen "-" und "." hatte.andreas hat geschrieben:Hallo Stevie,
ich glaube nicht, dass du das Feld "Serien-Nr." genauso ansprechen kannst!
In Verbindung mit FieldPos und Fieldput, so wie ich oben geschrieben habe, konnte ich jedenfalls problemlos Werte für dieses Feld eintragen.