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
Alter table
Moderator: Moderatoren
- Manfred
- 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
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ß.
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!!
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!!
- AUGE_OHR
- 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
COPY STRUCTURE EXTENDED oder DbStruct()Tracy hat geschrieben:Von anderen Datenbanken her kenne ich die ALTER TABLE Befehle um die Struktur einer Tabelle zu verändern.
siehe dir die Beispiele in der Hilfe anTracy hat geschrieben:Wie geht das bei den DBF-Dateien? Wie geht das aus XBase heraus?
DBU von Cli*pper als Source kann verwendet werden. Anleitung auf der Alaska Website.Tracy hat geschrieben:Gibt es ein Tool, mit dem man die Datenbankstruktur ansehen und verändern kann?
ansonsten "jedes" DBF Tool ... aber nicht EXCEL ...
gruss by OHR
Jimmy
Jimmy
- brandelh
- 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
Hi,
ich stelle mal meine Funktion hier rein. Ich hatte damit noch keine Probleme, dennoch KEINE GARANTIE !
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
Hubert