Änderung von Feldlängen
Moderator: Moderatoren
-
- UDF-Programmierer
- Beiträge: 68
- Registriert: Do, 14. Dez 2006 20:55
- Wohnort: 22946 Trittau
- Kontaktdaten:
Änderung von Feldlängen
Hallo Leute,
heute melde ich mich mal wieder nach langer Zeit mit einem neuen Problem. Meine Triebfahrzeugsdatenbank LOKLISTE läuft seit langer Zeit ohne nennenswerte Probleme. Jetzt hat aber die Deutsche Bahn AG mir ein Bein gestellt, in dem Sie 4-stellige Reihenbezeichnungen eingeführt hat. Dazu ist eine Felderweiterung der entsprechenden Datenbankfelder von 3 auf 4 Stellen erforderlich.
Grundsätzlich würde ich wie folgt vorgehen (ohne Details) :
SET ORDER TO
aDRREIHE := ARRAY(LASTREC())
FOR n := 1 TO LASTREC()
aDRREIHE(n) := PadL(ALLTRIM(F_drreihe),4)
DbSkip(1)
NEXT
Feldverlängerung der Gesamtdatei F_drreihe von 3 auf 4 Stellen, Kardinalfrage ist aber wie ?
GO TOP
FOR n := 1 TO LASTREC()
F_drreihe := aDRREIHE(n)
DbSkip(1)
NEXT
Natürlich bin ich für andere Vorgehensweisen auch dankbar
Gruß Dipl. Ing. Karl-Heinz Kahl
heute melde ich mich mal wieder nach langer Zeit mit einem neuen Problem. Meine Triebfahrzeugsdatenbank LOKLISTE läuft seit langer Zeit ohne nennenswerte Probleme. Jetzt hat aber die Deutsche Bahn AG mir ein Bein gestellt, in dem Sie 4-stellige Reihenbezeichnungen eingeführt hat. Dazu ist eine Felderweiterung der entsprechenden Datenbankfelder von 3 auf 4 Stellen erforderlich.
Grundsätzlich würde ich wie folgt vorgehen (ohne Details) :
SET ORDER TO
aDRREIHE := ARRAY(LASTREC())
FOR n := 1 TO LASTREC()
aDRREIHE(n) := PadL(ALLTRIM(F_drreihe),4)
DbSkip(1)
NEXT
Feldverlängerung der Gesamtdatei F_drreihe von 3 auf 4 Stellen, Kardinalfrage ist aber wie ?
GO TOP
FOR n := 1 TO LASTREC()
F_drreihe := aDRREIHE(n)
DbSkip(1)
NEXT
Natürlich bin ich für andere Vorgehensweisen auch dankbar
Gruß Dipl. Ing. Karl-Heinz Kahl
Mit xbase habe ich ein Triebfahrzeugsarchiv "LOKLISTE" erstellt. Dieses Archiv enthält Daten aller Eisenbahntriebfahrzeuge vom "ADLER" bis zum ICE. Genaueres erfährt man unter www.lokliste.de, wo man auch eine kostenlose DEMO-Version herrunterladen kann !!!
- Martin Altmann
- Foren-Administrator
- Beiträge: 16517
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 111 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
Re: Änderung von Feldlängen
Moin,
ich liege schon im Bett und habe keine Lust, so viel auf dem Smartphone zu tippen. Darum nur kurz angerissen:
Du öffnest deine Datenbank, liest die Struktur in ein Array mittels DBStruct() und schließt sie wieder.
Dann suchst du in dem Array mittels aScan() nach dem betreffenden Feld (in der Spalte für den Namen) und änderst die Feldlänge auf vier. Dann legst du eine neue Datei an, die auf der geänderten Struktur beruht (mittels DBCreate()) und hängst alle Datensätze aus der alten Datenbank mittels APPEND FROM an.
Viele Grüße,
Martin
ich liege schon im Bett und habe keine Lust, so viel auf dem Smartphone zu tippen. Darum nur kurz angerissen:
Du öffnest deine Datenbank, liest die Struktur in ein Array mittels DBStruct() und schließt sie wieder.
Dann suchst du in dem Array mittels aScan() nach dem betreffenden Feld (in der Spalte für den Namen) und änderst die Feldlänge auf vier. Dann legst du eine neue Datei an, die auf der geänderten Struktur beruht (mittels DBCreate()) und hängst alle Datensätze aus der alten Datenbank mittels APPEND FROM an.
Viele Grüße,
Martin
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/
Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
- AUGE_OHR
- Marvin
- Beiträge: 12907
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 45 Mal
Re: Änderung von Feldlängen
wie Martin schon sagte musst du dazu an die DBF ran was du so machen könntestKHKDampflok hat geschrieben:Dazu ist eine Felderweiterung der entsprechenden Datenbankfelder von 3 auf 4 Stellen erforderlich.
...
Feldverlängerung der Gesamtdatei F_drreihe von 3 auf 4 Stellen, Kardinalfrage ist aber wie ?
Code: Alles auswählen
#INCLUDE "DBSTRUCT.CH"
PROCEDURE MAIN
LOCAL aListe := {}
// Liste der Felder die du bearbeiten willst
AADD(aListe,{"AKTION","C", 11})
// DBF Namen mit übergeben
UPGRADE("TIMEWORK.DBF",aListe)
RETURN
PROCEDURE UPGRADE(DbfDatei,aListe)
LOCAL i,iMax
LOCAL cFeld
LOCAL nLen
LOCAL aStructure
LOCAL nPosi
LOCAL lDoIt := .F.
LOCAL cNewFile := "NewFile.DBF"
USE (DbfDatei)
// DBF-Struktur ermitteln
aStructure := DbStruct()
CLOSE
iMax := LEN(aListe)
FOR i := 1 TO iMax
cFeld := aListe[i][DBS_NAME]
nLen := aListe[i][DBS_LEN]
// suche nach dem FELD Namen
nPosi := ASCAN( aStructure, { | x | x[ DBS_NAME ] = cFeld } )
IF nPosi > 0
// nur wenn ungleich ( sonst wurde es schon korrigiert )
IF aStructure[nPosi][DBS_LEN] <> nLEN
aStructure[nPosi][DBS_LEN] := nLEN
lDoIt := .T.
ENDIF
ENDIF
NEXT
// nur bei Structure Änderrung
IF lDoIt = .T.
// neue Structure anlegen
DbCreate(cNewFile, aStructure , "DBFNTX")
// alte Daten übernehmen
USE (cNewFile) EXCLUSIVE
APPEND FROM (DbfDatei)
CLOSE
// alte Datei löschen
FERASE (DbfDatei)
// evtl DBT / FPT Memo Dateien
// FERASE ( STRTRAN(DbfDatei,".DBF",".DBT") )
// neue DBF umbenennen in alten DBF Namen
RENAME (cNewFile) TO (DbfDatei)
// evtl DBT / FPT Memo Dateien
ENDIF
RETURN
gruss by OHR
Jimmy
Jimmy
- Jan
- Marvin
- Beiträge: 14653
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: Änderung von Feldlängen
Ein original Codeteil, in dem ich sowas mache:
Ich frage nicht nur den Feldnamen ab, sondern auch die Länge. Der Grund ist, das ich eine komplette Updateroutine habe, die bei jedem Programmstart durchlaufen wird. Im laufe der Jahre hat es so einige Datenbankänderungen gegeben (Feldnamen ändern, Längen ändern, neue Felder, ...). Und wenn die Änderung vollzogen wurde, soll das beim nächsten Start natürlich nicht noch einmal gemacht werden. Was eben nicht passiert, wenn die Feldlänge dann passt.
Jan
Code: Alles auswählen
IF File(MEMVAR->gcDatenpfad + "\Hochzeit.dbf")
IF NetUse(MEMVAR->gcDatenpfad + "\hochzeit", , , .T.) == .T.
aStructure := hochzeit->(DbStruct())
DbCloseAll()
AEval(aStructure, {|e| IIf(e[2]=="S", (e[3] := 1, e[4] := 1), NIL)})
AEval(aStructure, {|e| IIf(e[1]=="NAME" .AND. e[3] == 25, (e[3] := 50, lModify := .T.), NIL)})
IF lModify == .T.
DbCreate(MEMVAR->gcDatenpfad + "\temp", aStructure)
DbUseArea(.T., , MEMVAR->gcDatenpfad + "\temp")
temp->(DbImport(MEMVAR->gcDatenpfad + "\Hochzeit"))
DbCloseAll()
FErase(MEMVAR->gcDatenpfad + "\hochzeit.dbf")
FRename(MEMVAR->gcDatenpfad + "\temp.dbf", MEMVAR->gcDatenpfad + "\Hochzeit.dbf")
ENDIF
lModify := .F.
ENDIF
ENDIF
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- Martin Altmann
- Foren-Administrator
- Beiträge: 16517
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 111 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
Re: Änderung von Feldlängen
Moin Jan,
Viele Grüße,
Martin
war bei Jimmys Beispiel auch drin - direkt vor der Änderung.Jan hat geschrieben:Ich frage nicht nur den Feldnamen ab, sondern auch die Länge.
Viele Grüße,
Martin
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/
Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
- Jan
- Marvin
- Beiträge: 14653
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: Änderung von Feldlängen
Martin,
ich hatte mein Beispuel nur gepostet, um eine andere Vorgehensweise zu zeigen. Daß mein Code ansonsten insgesamt gesehen ungefähr das Gleiche macht wie Jimmys ist schon klar.
Jan
ich hatte mein Beispuel nur gepostet, um eine andere Vorgehensweise zu zeigen. Daß mein Code ansonsten insgesamt gesehen ungefähr das Gleiche macht wie Jimmys ist schon klar.
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.