Alter table

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

Moderator: Moderatoren

Antworten
Tracy
Rookie
Rookie
Beiträge: 1
Registriert: Di, 23. Feb 2010 9:18

Alter table

Beitrag von Tracy »

Hallo!
Von anderen Datenbanken her kenne ich die ALTER TABLE Befehle um die Struktur einer Tabelle zu verändern. Wie geht das bei den DBF-Dateien? Wie geht das aus XBase heraus? Gibt es ein Tool, mit dem man die Datenbankstruktur ansehen und verändern kann?
Danke
Andreas
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21200
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Re: Alter table

Beitrag von Manfred »

Hallo Andreas,

vom Grundkonzept her muß man alles von Hand selber machen. Es gab/gibt für Clipper dbu.exe, oder von Roger Donnay xdbu. Es gibt verschiedene Möglichkeiten.

Eine davon wäre z.B. eine leere Struktur anzulegen und dann Satz für Satz aus einer vorhandenen DB umzukopieren. Das wäre die simpelste Methode. Wobei man aber auch dabei auf evtl. Memodateien achten muß.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12909
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Re: Alter table

Beitrag von AUGE_OHR »

Tracy hat geschrieben:Von anderen Datenbanken her kenne ich die ALTER TABLE Befehle um die Struktur einer Tabelle zu verändern.
COPY STRUCTURE EXTENDED oder DbStruct()
Tracy hat geschrieben:Wie geht das bei den DBF-Dateien? Wie geht das aus XBase heraus?
siehe dir die Beispiele in der Hilfe an
Tracy hat geschrieben:Gibt es ein Tool, mit dem man die Datenbankstruktur ansehen und verändern kann?
DBU von Cli*pper als Source kann verwendet werden. Anleitung auf der Alaska Website.
ansonsten "jedes" DBF Tool ... aber nicht EXCEL ...
gruss by OHR
Jimmy
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:

Re: Alter table

Beitrag von brandelh »

Hi,

ich stelle mal meine Funktion hier rein. Ich hatte damit noch keine Probleme, dennoch KEINE GARANTIE !

Code: Alles auswählen

*--------------------------------------------------------------------------

#include "Dbstruct.ch"

function DBMixStru(cZielDBF,acHinzu,nPos)// cZielDBF = Pfad+Dateiname der alten DBF.
                                         // acHinzu  = Array mit neuen Feldern nach dbstru()
                                         // oder     = Pfad+Dateiname der hinzuzufügenden DBF.
                                         // DATEN werden nicht hinzugefügt !
                                         // nPos     = an dieser Stelle soll das Feld stehen
                                         // nur neue Felder / Feldlängen als Vorbereitung
                                         // Wenn beide gleich sind, wird nichts geändert.
                                         // .t. -> keine Fehler
                                         // .f. -> Fehler sind aufgetreten.
   local lFehler     := .f.
   local aQuellStru, aHinzuStru, cTempDat
   local lStruNeu    := .f.
   local x, nQI

   DEFAULT nPOS TO 0                     // am Ende anfügen !

   /*
      die DBF etc. Endungen müssen entfernt werden, da
          1. temporäre Dateinamen gebildet werden müssen
          2. eventuelle DBT oder FPT Dateien vorhanden sein könnten.
   */

   if right(cZielDBF,4) = ".DBF"    // Endung abtrennen
      cZielDBF := left(cZielDBF,len(cZielDBF)-4)
   endif

   cTempDat := cZielDBF+"_TMP_"+strTran(time(),":","")

   USE (cZielDBF) NEW exclusive alias MixStruQuelle  // diese Datei muß exclusiv öffenbar sein.
   if neterr()
      lFehler := .t.
   else
      // die Quelldatei bleibt offen, bis geklärt ist ob eine Anpassung nötig ist.
      // sonst könnte ein anderes Programm die Datei öffnen.
      aQuellStru := MixStruQuelle->(dbstruct())
   endif
   // Strukturarrays erzeugen
   do case
      case lFehler
           // ohne Quelldatei geht nichts mehr.
      case ValType(acHinzu) = "A"
           aHinzuStru := acHinzu
      case ValType(acHinzu) = "C"
           if right(acHinzu,4) = ".DBF"    // Endung abtrennen
              acHinzu := left(acHinzu,len(acHinzu)-4)
           endif
           USE (acHinzu) NEW readonly alias MixStruHinzu
           if neterr()
              lFehler := .t.
           else
              aHinzuStru := MixStruHinzu->(dbstruct())
              close MixStruHinzu
           endif
      otherwise
           lFehler := .t.
   endcase
   // Neue Struktur ermitteln
   do case
      case lFehler
           // ohne Quelldatei geht nichts mehr.
      case empty(aQuellStru) .or. empty(aHinzuStru)
           lFehler := .t.
      otherwise
           for x := 1 to len(aHinzuStru) // alle neuen Felder prüfen !
               nQI := aScan(aQuellStru,{|aF| aF[DBS_NAME] == aHinzuStru[x,DBS_NAME]})
               if nQI > 0               // Feld ist vorhanden, TYP und Längen prüfen
                  if aQuellStru[nQI,DBS_TYPE] == aHinzuStru[x,DBS_TYPE] // TYP ist gleich
                     if aQuellStru[nQI,DBS_LEN] # aHinzuStru[x,DBS_LEN] .or. ;
                        aQuellStru[nQI,DBS_DEC] # aHinzuStru[x,DBS_DEC]
                        lStruNeu := .t.     // Länge der Felder wurde geändert.
                        aQuellStru[nQI,DBS_LEN] := max(aQuellStru[nQI,DBS_LEN],aHinzuStru[x,DBS_LEN])
                        aQuellStru[nQI,DBS_DEC] := max(aQuellStru[nQI,DBS_DEC],aHinzuStru[x,DBS_DEC])
                     endif
                  else                  // Neuer TYP, neue Werte übernehmen
                     lStruNeu := .t.     // Länge der Felder wurde geändert.
                     aQuellStru[nQI,DBS_TYPE] := aHinzuStru[x,DBS_TYPE]
                     aQuellStru[nQI,DBS_LEN]  := aHinzuStru[x,DBS_LEN]
                     aQuellStru[nQI,DBS_DEC]  := aHinzuStru[x,DBS_DEC]
                  endif
                  if nPOS > 0           // Altes Feld freiräumen, löschen und verschieben
                     // zwischenspeichern
                     aHinzuStru[x,1] := aQuellStru[nQI,1]
                     aHinzuStru[x,2] := aQuellStru[nQI,2]
                     aHinzuStru[x,3] := aQuellStru[nQI,3]
                     aHinzuStru[x,4] := aQuellStru[nQI,4]
                     // alte Zeile löschen, Rest rückt auf und hinten entsteht eine leere Zeile
                     adel(aQuellStru,nQI)
                     // an gewünschter Stelle einfügen, Rest wird verschoben.
                     ains(aQuellStru,nPos, {aHinzuStru[x,1],aHinzuStru[x,2],aHinzuStru[x,3],aHinzuStru[x,4]})
                     nPos++
                     lStruNeu := .t.    // Position wurde geändert.
                  endif
               else                     // neues Feld, alles übernehmen
                  lStruNeu := .t.       // Länge der Felder wurde geändert.
                  aadd(aQuellStru, {aHinzuStru[x,1],aHinzuStru[x,2],aHinzuStru[x,3],aHinzuStru[x,4]})
                  if nPOS > 0           // verschieben, Platz wurde schon erstellt
                     ains(aQuellStru,nPos, {aHinzuStru[x,1],aHinzuStru[x,2],aHinzuStru[x,3],aHinzuStru[x,4]})
                     nPos++
                  endif
               endif
           next
   endcase
   // nun haben wir die neue Struktur der Datei falls Änderungen vorhanden waren.
   close MixStruQuelle
   // Änderungen nötig ?
   if lStruNeu   // Anpassungen nötig
      // dürfte nicht vorkommen, aber sicher ist sicher
      delete file (cTempDat+".DBF")
      delete file (cTempDat+".DBT")
      delete file (cTempDat+".FPT")
      rename (cZielDBF+".DBF") to (cTempDat+".DBF")
      rename (cZielDBF+".DBT") to (cTempDat+".DBT")
      rename (cZielDBF+".FPT") to (cTempDat+".FPT")
      dbcreate(cZielDBF, aQuellStru)
      use (cZielDBF) NEW exclusive ALIAS MixStruZiel
      DbImport(cTempDat)
      close MixStruZiel
      delete file (cTempDat+".DBF")
      delete file (cTempDat+".DBT")
      delete file (cTempDat+".FPT")
   endif

return ! lFehler
Gruß
Hubert
Antworten