Änderung von Feldlängen

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Antworten
KHKDampflok
UDF-Programmierer
UDF-Programmierer
Beiträge: 68
Registriert: Do, 14. Dez 2006 20:55
Wohnort: 22946 Trittau
Kontaktdaten:

Änderung von Feldlängen

Beitrag von KHKDampflok »

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
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 !!!
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16511
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Änderung von Feldlängen

Beitrag von Martin Altmann »

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
:grommit:
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.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Änderung von Feldlängen

Beitrag von AUGE_OHR »

KHKDampflok 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 ?
wie Martin schon sagte musst du dazu an die DBF ran was du so machen könntest

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
Benutzeravatar
Jan
Marvin
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

Beitrag von Jan »

Ein original Codeteil, in dem ich sowas mache:

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
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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16511
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Änderung von Feldlängen

Beitrag von Martin Altmann »

Moin Jan,
Jan hat geschrieben:Ich frage nicht nur den Feldnamen ab, sondern auch die Länge.
war bei Jimmys Beispiel auch drin 8) - direkt vor der Änderung.

Viele Grüße,
Martin
:grommit:
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.
Benutzeravatar
Jan
Marvin
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

Beitrag von Jan »

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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Antworten