Spaltenköpfe einer Datenbank ändern, zufügen und löschen
Moderator: Moderatoren
Spaltenköpfe einer Datenbank ändern, zufügen und löschen
Hallo zusammen
Habe leider keinen Beitrag zu dem Thema Spaltenköpfe von Datenbanken gefunden.
Wie kann ich vorhandene Spaltenköpfe einer Datenbank ändern oder löschen und neue hinzufügen?
Vielen Dank!
Gruß,
Josua Wilhelm
Habe leider keinen Beitrag zu dem Thema Spaltenköpfe von Datenbanken gefunden.
Wie kann ich vorhandene Spaltenköpfe einer Datenbank ändern oder löschen und neue hinzufügen?
Vielen Dank!
Gruß,
Josua Wilhelm
- Manfred
- Foren-Administrator
- Beiträge: 21224
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 67 Mal
Re: Spaltenköpfe einer Datenbank ändern, zufügen und löschen
Hi,
meinst Du damit das Ändern der DBF-Struktur?
meinst Du damit das Ändern der DBF-Struktur?
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!!
- Manfred
- Foren-Administrator
- Beiträge: 21224
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 67 Mal
Re: Spaltenköpfe einer Datenbank ändern, zufügen und löschen
es kommt darauf an, was Du möchtest.
Ich habe mir eine Routine geschrieben, die eine neue DBF mit der neuen gewünschten Struktur erstellt und dann die Daten aus der alten dbf übernimmt. Das geht allerdings nicht mal eben so. Man muß/ sollte wissen, wie man sich verhält, wenn sich Felderbreiten, Feldtypen usw. ändern. Die Frage stellt sich hier, ob Du etwas pauschales machen möchtest, oder bis ins kleinste Detail geplante?
Wie gesagt, sobald sich z.B. feldbreiten, oder Feldtypen ändern, muß aufgepasst und evtl. angepasst werden beim Import. Wenn nur neue Spalten hinzugefügt oder entfernt werden, dann kann einfach importiert werden.
Ich habe mir eine Routine geschrieben, die eine neue DBF mit der neuen gewünschten Struktur erstellt und dann die Daten aus der alten dbf übernimmt. Das geht allerdings nicht mal eben so. Man muß/ sollte wissen, wie man sich verhält, wenn sich Felderbreiten, Feldtypen usw. ändern. Die Frage stellt sich hier, ob Du etwas pauschales machen möchtest, oder bis ins kleinste Detail geplante?
Wie gesagt, sobald sich z.B. feldbreiten, oder Feldtypen ändern, muß aufgepasst und evtl. angepasst werden beim Import. Wenn nur neue Spalten hinzugefügt oder entfernt werden, dann kann einfach importiert werden.
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!!
- Armin
- Rekursionen-Architekt
- Beiträge: 394
- Registriert: Mo, 26. Sep 2005 12:09
- Wohnort: 75331 Engelsbrand
- Danksagung erhalten: 3 Mal
- Kontaktdaten:
Re: Spaltenköpfe einer Datenbank ändern, zufügen und löschen
Hallo Josua Wilhelm,
z.B. per eigenem Programm:
z.B. per eigenem Programm:
Code: Alles auswählen
AAdd( aStructure, {"FREI_TERMS","D",8,0} )
AAdd( aStructure, {"FREI_TERMI","D",8,0} )
ADDFIELDS(cPath, cAlias, aStructure)
FUNCTION ADDFIELDS(cPfad, cAlias, aNeu)
// Datei um Felder erweitern oder falls bereits vorhanden, in der Größe ändern
// Vorsicht, wenn Felder kleiner gemacht werden, kann Inhalt verloren gehen
LOCAL aStructure
LOCAL I := 0
LOCAL nPos := 0
LOCAL cDat := ""
LOCAL cTemp:= ""
local cFullPath := cPfad+cAlias
dbUseArea( .t. ,,cFullPath, cAlias,.t.,.f.) // shared
aStructure := DbStruct() // Datei-Struktur einlesen
(cAlias)->DbCloseArea()
FOR I:= 1 TO len(aNeu)
nPos := ascan(aStructure, {|a| a[1] == aNeu[I,1]})
if nPos > 0
// Feld bereits vorhanden, Grösse ändern
aStructure[nPos,3] := aNeu[I,3]
aStructure[nPos,4] := aNeu[I,4]
else
AAdd( aStructure, aNeu[I] ) // neu
endif
NEXT
DbCreate(cPfad+"TEMP", aStructure ) // Temporaere Datei mit neuer Struktur erzeugen
dbUseArea( .t. ,,cPfad+"TEMP", "TEMP",.t.,.f.) // exclusive
APPEND FROM &cFullPath // Datensaetze laden aus Quelldatei
CLOSE TEMP
COPY FILE (cFullPath+".dbf") TO (cFullPath+"_si.dbf") // Quelldatei sichern
FERASE(cFullPath+".dbf") // Quelldatei löschen
cTemp:= cPfad+"TEMP.DBF"
cDat := cFullPath+".dbf"
RENAME (cTemp) TO (cDat) // Temporäre Datei umbenennen
IF File( cPfad+"TEMP.DBT" ) // Wenn Memo-Datei existiert
COPY FILE (cFullPath+".dbt") TO (cFullPath+"_si.dbt")
FERASE(cFullPath+".dbt") // Alte Datei l”schen
cTemp:= cPfad+"TEMP.DBT"
cDat := cFullPath+".dbt"
RENAME (cTemp) TO (cDat) // Temporäre Datei umbenennen
ENDIF
RETURN .T.
- azzo
- Rekursionen-Architekt
- Beiträge: 483
- Registriert: So, 28. Mär 2010 19:21
- Danksagung erhalten: 11 Mal
Re: Spaltenköpfe einer Datenbank ändern, zufügen und löschen
Hallo,
könnte man, wenn es zB nur um das Ändern der Spaltenköpfe einer Datenbank geht das einfach mit Überschreiben im Spaltenkopf lösen.
lg
Otto
könnte man, wenn es zB nur um das Ändern der Spaltenköpfe einer Datenbank geht das einfach mit Überschreiben im Spaltenkopf lösen.
lg
Otto
- brandelh
- Foren-Moderator
- Beiträge: 15706
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 70 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Spaltenköpfe einer Datenbank ändern, zufügen und löschen
war das nun eine Frage ?
Da die DBF ja vom Aufbau her bekannt ist, könnte man tatsächlich mit fopen() etc. die passende Stelle (feldname) überschreiben.
Gemacht habe ich das aber noch nicht.
Ich nutze eine Funktion, die ein Array oder 2 dbf miteinander vergleicht und neue Felder aufnimmt.
Felder löschen geht nicht damit und bei Typänderungen bin ich mir jetzt nicht sicher, ich bin ja im Urlaub ... auf Fuerteventura.
Die Tage schaue ich mal nach, wobei es einige Beispiele bei copy structure gibt (aus dem Gedächtnis).
Da die DBF ja vom Aufbau her bekannt ist, könnte man tatsächlich mit fopen() etc. die passende Stelle (feldname) überschreiben.
Gemacht habe ich das aber noch nicht.
Ich nutze eine Funktion, die ein Array oder 2 dbf miteinander vergleicht und neue Felder aufnimmt.
Felder löschen geht nicht damit und bei Typänderungen bin ich mir jetzt nicht sicher, ich bin ja im Urlaub ... auf Fuerteventura.
Die Tage schaue ich mal nach, wobei es einige Beispiele bei copy structure gibt (aus dem Gedächtnis).
Gruß
Hubert
Hubert
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: Spaltenköpfe einer Datenbank ändern, zufügen und löschen
interessante Idee ... aber der Name muss dann "genau so lang" (?) sein wie der alter sonst stimmt die Grösse ( Header ) nicht mehrbrandelh hat geschrieben:Da die DBF ja vom Aufbau her bekannt ist, könnte man tatsächlich mit fopen() etc. die passende Stelle (feldname) überschreiben.
Gemacht habe ich das aber noch nicht.
unter dBase III+ war es der Befehl "MODI STRU" was unter Cl*pper dann DbStruct() -> Array ergab.
wenn man nun einen "bestehenden" Feldnamen ändert wird beim anschliessenden APPEND FROM das Feld nicht gefüllt !
gruss by OHR
Jimmy
Jimmy
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9394
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 104 Mal
- Danksagung erhalten: 364 Mal
- Kontaktdaten:
Re: Spaltenköpfe einer Datenbank ändern, zufügen und löschen
Ja, das kann man so machen. Die Header sind simpel. Einfach mal z.B. mit einem Hex-Editor ausprobieren! Das geht sogar bei Memos.
Herzlich,
Tom
Tom
- brandelh
- Foren-Moderator
- Beiträge: 15706
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 70 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Spaltenköpfe einer Datenbank ändern, zufügen und löschen
soweit ich mich erinnere sind da genau 10 Zeichen vorgesehen, nicht mehr aber auch nicht weniger.AUGE_OHR hat geschrieben: ... aber der Name muss dann "genau so lang" (?) sein wie der alter sonst stimmt die Grösse ( Header ) nicht mehr
Gruß
Hubert
Hubert
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9394
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 104 Mal
- Danksagung erhalten: 364 Mal
- Kontaktdaten:
Re: Spaltenköpfe einer Datenbank ändern, zufügen und löschen
Genau: Maximal 10 Großbuchstaben (!), fehlende Zeichen aufgefüllt durch 0-Strings (Chr(0)). Danach folgen Typ, Länge usw. Es gibt keine Prüfsummen oder ähnliches. Trotzdem würde ich viel mehr als den Feldnamen auf diese Weise nicht ändern. Das geht auch eleganter mit DbStruct()/DbImport()/DbExport usw.
Herzlich,
Tom
Tom
-
- Rekursionen-Architekt
- Beiträge: 205
- Registriert: Mo, 07. Aug 2006 10:18
- Wohnort: Leipzig
- Danksagung erhalten: 11 Mal
Re: Spaltenköpfe einer Datenbank ändern, zufügen und löschen
Hallo Josua,
zu dem, was Tom oben beschrieben hat, hier eine Funktion zur Änderung des Feldnamens einer DBF-Tabelle:
zu dem, was Tom oben beschrieben hat, hier eine Funktion zur Änderung des Feldnamens einer DBF-Tabelle:
Code: Alles auswählen
// - Feldnamen einer DBF (mittels Low-Level-Dateifunktionen) aendern
// - die DBF darf nicht in Benutzung sein, da die Funktion sie exklusiv oeffnen muss
// - bei erfolgreicher Aenderung des Feldnamens wird .T. zurueckgegeben, andernfalls .F.
// - Bsp.: RenameField( "d:\temp\artikel.dbf", "artnr", "artikelnr" )
FUNCTION RenameField( cFileName, cOldFieldName, cNewFieldName )
LOCAL lSuccess := .F.
LOCAL nHandle
LOCAL nHeaderLength
LOCAL nPointer := 32, nPos
LOCAL cFieldName, aFieldNames := {}
LOCAL cBytes
cFileName := AllTrim( cFileName )
cOldFieldName := Upper( AllTrim( cOldFieldName ) )
cNewFieldName := Upper( AllTrim( cNewFieldName ) )
// Feldname darf nicht laenger als 10 Zeichen sein
if Len( cNewFieldName ) > 10
RETURN .F.
endif
// File konnte geoeffnet werden
if ( nHandle := FOpen( cFileName, FO_READWRITE ) ) != -1
cBytes := Space( 2 )
FSeek( nHandle, 8, FS_SET ) // beim 8ten Byte steht die Groesse des Dateiheaders
FRead( nHandle, @cBytes, 2 ) // die 2 Bytes, die die Laenge des Dateiheaders enthalten, auslesen
nHeaderLength := Bin2I( cBytes ) // in numerischen Wert umwandeln
// - die Feldbeschreibung beginnt bei Byte 32
// - die Angaben fuer ein Feld sind 32 Bytes lang
// - im Folgenden werden alle Feldnamen mit Pointer in das Array aFieldNames eingelesen
cBytes := Space( 10 )
while ( nPointer + 32 ) < nHeaderLength // in 32er Schritten, so lange bis nHeaderLength ueberschritten
FSeek( nHandle, nPointer, FS_SET ) // auf Feldbeschreibung f. Feld n positionieren
// - Feldnamen lesen (10 Zeichen)
// - Chr(0) durch Nullstring "" ersetzen
FRead( nHandle, @cBytes, 10 ) // Feldnamen einlesen
cFieldName := StrTran( cBytes, Chr(0), "" )
cFieldName := Upper( AllTrim( cFieldName ) )
AAdd( aFieldNames, { cFieldName, nPointer } )
nPointer += 32
enddo
// neuer Feldname existiert noch nicht
if AScan( aFieldNames, { |a| a[1] == cNewFieldName } ) == 0
// alter Feldname wurde gefunden
if ( nPos := AScan( aFieldNames, { |a| a[1] == cOldFieldName } ) ) > 0
// ggf. auf 11 Zeichen mit Chr(0) auffuellen
cNewFieldName := PadR( cNewFieldName, 11, Chr(0) )
nPointer := aFieldNames[nPos][2]
FSeek( nHandle, nPointer, FS_SET ) // auf zu aendernden Feldnamen positionieren
if ( FWrite( nHandle, cNewFieldName ) > 0 ) // neuen Feldnamen in Datei schreiben
lSuccess := .T.
endif
endif
endif
FClose( nHandle )
endif
RETURN lSuccess
Beste Grüße,
Sören
Sören
- brandelh
- Foren-Moderator
- Beiträge: 15706
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 70 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Spaltenköpfe einer Datenbank ändern, zufügen und löschen
genau meine Meinung, beim reinen Namen geht es grad so aber ansonsten ... umkopieren.Tom hat geschrieben:Genau: Maximal 10 Großbuchstaben (!), fehlende Zeichen aufgefüllt durch 0-Strings (Chr(0)). ... Trotzdem würde ich viel mehr als den Feldnamen auf diese Weise nicht ändern.
Gruß
Hubert
Hubert
- Schorsch
- Cut&Paste-Entwickler
- Beiträge: 45
- Registriert: So, 21. Sep 2008 19:21
- Wohnort: Sinsheim im Kraichgau
Re: Spaltenköpfe einer Datenbank ändern, zufügen und löschen
Hallo Josua,
der Kollege Hubert Brandel hat mir mal mit dem Programm DBU.EXE geholfen und das verwende ich heute noch zur Administration von DBF Dateien und damit sind Umbenennungen und Typ-Änderungen etc alles möglich.
Gruß
Georg
der Kollege Hubert Brandel hat mir mal mit dem Programm DBU.EXE geholfen und das verwende ich heute noch zur Administration von DBF Dateien und damit sind Umbenennungen und Typ-Änderungen etc alles möglich.
Gruß
Georg
Gruß
Schorsch
Schorsch
- brandelh
- Foren-Moderator
- Beiträge: 15706
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 70 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Spaltenköpfe einer Datenbank ändern, zufügen und löschen
wobei DBU standardmäßig Probleme damit hat wenn die Datentypen sich ändern.
Gruß
Hubert
Hubert
Re: Spaltenköpfe einer Datenbank ändern, zufügen und löschen
Hallo zusammen,
vielen Dank Euch für Eure Antworten und Programm-Beispiele!
Probiere diese gerade aus und melde mich wieder ...
Danke und liebe Grüße,
Josua Wilhelm
vielen Dank Euch für Eure Antworten und Programm-Beispiele!
Probiere diese gerade aus und melde mich wieder ...
Danke und liebe Grüße,
Josua Wilhelm
Re: Spaltenköpfe einer Datenbank ändern, zufügen und löschen
Ich habe es mit diesem Programm versucht, aber irgendwie funktioniert das Löschen mit FErase() jeweils nicht.Armin hat geschrieben:Hallo Josua Wilhelm,
z.B. per eigenem Programm:
Code: Alles auswählen
AAdd( aStructure, {"FREI_TERMS","D",8,0} ) AAdd( aStructure, {"FREI_TERMI","D",8,0} ) ADDFIELDS(cPath, cAlias, aStructure) FUNCTION ADDFIELDS(cPfad, cAlias, aNeu) // Datei um Felder erweitern oder falls bereits vorhanden, in der Größe ändern // Vorsicht, wenn Felder kleiner gemacht werden, kann Inhalt verloren gehen LOCAL aStructure LOCAL I := 0 LOCAL nPos := 0 LOCAL cDat := "" LOCAL cTemp:= "" local cFullPath := cPfad+cAlias dbUseArea( .t. ,,cFullPath, cAlias,.t.,.f.) // shared aStructure := DbStruct() // Datei-Struktur einlesen (cAlias)->DbCloseArea() FOR I:= 1 TO len(aNeu) nPos := ascan(aStructure, {|a| a[1] == aNeu[I,1]}) if nPos > 0 // Feld bereits vorhanden, Grösse ändern aStructure[nPos,3] := aNeu[I,3] aStructure[nPos,4] := aNeu[I,4] else AAdd( aStructure, aNeu[I] ) // neu endif NEXT DbCreate(cPfad+"TEMP", aStructure ) // Temporaere Datei mit neuer Struktur erzeugen dbUseArea( .t. ,,cPfad+"TEMP", "TEMP",.t.,.f.) // exclusive APPEND FROM &cFullPath // Datensaetze laden aus Quelldatei CLOSE TEMP COPY FILE (cFullPath+".dbf") TO (cFullPath+"_si.dbf") // Quelldatei sichern FERASE(cFullPath+".dbf") // Quelldatei löschen cTemp:= cPfad+"TEMP.DBF" cDat := cFullPath+".dbf" RENAME (cTemp) TO (cDat) // Temporäre Datei umbenennen IF File( cPfad+"TEMP.DBT" ) // Wenn Memo-Datei existiert COPY FILE (cFullPath+".dbt") TO (cFullPath+"_si.dbt") FERASE(cFullPath+".dbt") // Alte Datei l”schen cTemp:= cPfad+"TEMP.DBT" cDat := cFullPath+".dbt" RENAME (cTemp) TO (cDat) // Temporäre Datei umbenennen ENDIF RETURN .T.
Wenn ich andere Dateinamen inklusiv Pfad an dieser Stelle eintrage, werden sie gelöscht.
Kann es sein, dass Xbase die dbfs noch irgendwo geöffnet hält und sie deshalb nicht gelöscht werden können?
Der Rückgabewert von FErase() beträgt "-1".
- brandelh
- Foren-Moderator
- Beiträge: 15706
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 70 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Spaltenköpfe einer Datenbank ändern, zufügen und löschen
es könnte sein, dass append from eine Datei noch offen hält, oder ein Virenscanner ...
Diese Funktion wird von mir benutzt:
Diese Funktion wird von mir benutzt:
Code: Alles auswählen
*--------------------------------------------------------------------------
function DBMixStru(cZielDBF,acHinzu, nZielDBF) // cZielDBF = Pfad+Dateiname der alten DBF.
// acHinzu = Array mit neuen Feldern nach dbstru()
// oder = Pfad+Dateiname der hinzuzufügenden DBF.
// nZielDBF = wenn cZielDBF schon exclusiv offen ist, hier den Selectbereich oder Alias angeben.
// DATEN werden nicht hinzugefügt !
// 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
/*
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 ! empty(nZielDBF)
if ! (nZielDBF)->(used())
nZielDBF := NIL
endif
endif
if right(cZielDBF,4) = ".DBF" // Endung abtrennen
cZielDBF := left(cZielDBF,len(cZielDBF)-4)
endif
cTempDat := cZielDBF+"_TMP_"+strTran(time(),":","")
if empty(nZielDBF) // nil oder leer => cZielDBF ist nicht offen.
USE (cZielDBF) NEW exclusive alias MixStruQuelle // diese Datei muß exclusiv öffenbar sein.
if neterr()
lFehler := .t.
else
nZielDBF := select()
endif
endif
if ! lFehler
// die Quelldatei bleibt offen, bis geklärt ist ob eine Anpassung nötig ist.
// sonst könnte ein anderes Programm die Datei öffnen.
aQuellStru := (nZielDBF)->(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())
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] == upper(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.
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
else // neues Feld, alles übernehmen
lStruNeu := .t.
aadd(aQuellStru, {aHinzuStru[x,1],aHinzuStru[x,2],aHinzuStru[x,3],aHinzuStru[x,4]})
endif
next
endcase
// nun haben wir die neue Struktur der Datei falls Änderungen vorhanden waren.
if (nZielDBF)->(USED())
(nZielDBF)->(dbCloseArea())
endif
if USED("MixStruHinzu")
close MixStruHinzu
endif
// Ä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
// alte Versionen bis zur nächsten Anpassung stehen lassen
* delete file (cTempDat+".DBF")
* delete file (cTempDat+".DBT")
* delete file (cTempDat+".FPT")
endif
return ! lFehler
Gruß
Hubert
Hubert
Re: Spaltenköpfe einer Datenbank ändern, zufügen und löschen
Ok, das mit dem FErase() hat jetzt funktioniert nachdem ich davor noch CLOSE DATABASES eingefügt habe.
Aber bei allen aufgeführten Beispielen finde ich die Funktion nicht für das Löschen eines Spaltenkopfes.
Es werden nur die Optionen für das Ändern oder Hinzufügen einer Spalte aufgeführt.
Liege ich da richtig oder habe ich etwas übersehen?
Aber bei allen aufgeführten Beispielen finde ich die Funktion nicht für das Löschen eines Spaltenkopfes.
Es werden nur die Optionen für das Ändern oder Hinzufügen einer Spalte aufgeführt.
Liege ich da richtig oder habe ich etwas übersehen?
- brandelh
- Foren-Moderator
- Beiträge: 15706
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 70 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Spaltenköpfe einer Datenbank ändern, zufügen und löschen
Das stimmt wohl, denn ich füge nur Felder hinzu, aber wenn du dir AADD() bei der Struktur ansiehst:
das Gegenteil davon ist einfach eine Felddefinition zu löschen, wie gesagt wenn das bei dir vorkommt ...
früher musste man da zwei Befehle ausführen:
beim Append From werden ja alle Felder ignoriert, die in der neuen Datei nicht mehr vorhanden sind.
Code: Alles auswählen
AAdd( aStructure, {"FREI_TERMS","D",8,0} )
AAdd( aStructure, {"FREI_TERMI","D",8,0} )
Code: Alles auswählen
ARemove( <aArray> , [<nStartPos>], [<nCount>] )
Code: Alles auswählen
ADel()
ASize()
Gruß
Hubert
Hubert