Was macht Append Blank ?

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

Moderator: Moderatoren

Antworten
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:

Was macht Append Blank ?

Beitrag von brandelh »

Nach Problemen mit einer Fremdsoftware die DBF Dateien einliest, stellte ich fest, dass sowohl bei Clipper als auch bei Xbase++
Append Blank nur einen Satz mit Blanks anlegt, egal welcher Datentyp tatsächlich definiert ist.
Erst wenn ein Feld mit REPLACE einen Feldtyp konformen Text erhält, wird dieses Feld nach Typ formatiert.
Logische Felder werden übrigens intern mit "F" und "T" bestückt, nicht mit 0 und 1 wie in anderen Systemen üblich.

Falls Ihr also Daten mit Fremdsystemen austauscht und die Probleme melden, nutzt COPY TO zur Erstellung einer Exportdatei.
Diese wird dann alle Infos mit Grundwerten enthalten. :D
Gruß
Hubert
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9363
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: Was macht Append Blank ?

Beitrag von Tom »

Was erzählst Du denn da? Append Blank erzeugt einen neuen, physisch vorhandenen Datensatz in der Tabelle, Zeichenfelder sind leer, retournieren aber ihre Länge in Blanks, numerische Felder enthalten 0/0.00, logische .F. und Datumsfelder ein leeres Datum. Außerdem wird der Datensatz gesperrt.
Herzlich,
Tom
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: Was macht Append Blank ?

Beitrag von brandelh »

Hallo Tom,

ich habe hier mit DBU die DBF erzeugt, im Textfeld was eingegeben, Pfeil ab und 10 Datensätze erzeugt.
Mit Clipper DBU und Xbase++ DBU - ein direktes Programm habe ich nicht geschrieben, aber DBU muss ja auch Append Blank benutzen ;-)

Und die DBF sieht im HEX-EDITOR genauso aus wie ich beschrieben habe !

Xbase++ selbst hat damit aber natürlich keine Probleme, das wollte ich nicht zum Ausdruck bringen !
Gruß
Hubert
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9363
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: Was macht Append Blank ?

Beitrag von Tom »

Hallo, Hubert.

Jetzt verstehe ich. Ja, ein Append Blank reserviert zunächst nur den Raum, den ein Datensatz in einer Tabelle einnehmen würde, und füllt ihn mit Blanks. Das ist per Definition beim Tabellenmodell DBF so (so steht es auch schon im "Handbuch der Dateiformate", International Thomson Publishing, Günter Born, 1985) - es ist die Aufgabe der Engine bzw. der verwendeten Software, diesen Fall abzufangen. Alle Programme, die mit DBF hantieren, sollten das beherrschen. Erst ein physikalisches Replace bzw. eine Bestückung der Felder findet erst statt, wenn die Datensätze manipuliert werden. Diese Verfahrensweise ist nicht unüblich und gilt auch für andere Dateitypen.
Herzlich,
Tom
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: Was macht Append Blank ?

Beitrag von brandelh »

OK, prüfen wir das mit dem Programm ... 8)

Code: Alles auswählen

#include "Gra.ch"
#include "Xbp.ch"
#include "Common.ch"

proc main
   dbcreate("TestEXE",{ { "Text","C",10,0},;
                        { "L1"  ,"L", 1,0},;
                        { "T2"  ,"C", 1,0},;
                        { "Zahl","N", 5,2} } )
   use testexe exclusive
   append blank
   replace field->Text with "1234567890"
   append blank
   replace field->L1   with .t.
   append blank
   append blank
   replace field->T2   with "#"
   append blank
   replace field->zahl with 1
   append blank
   ? "OK"
   copy to testCopy
return
DBF-Inhalt.png
DBF-Inhalt.png (14.13 KiB) 3532 mal betrachtet
wie man sieht sind NUR die REPLACE-Felder sind gesetzt. Mit einem COPY TO kann man aber die Struktur richtig stellen.

PS: du hast es zwar schon erkannt - ich war zu langsam - aber mein Beispiel möchte ich doch anbringen ;-)

Nochmal, das ist eigentlich kein Problem, aber wenn man DBF Daten mit fremden Tools (oder Lowlevel) weiter verarbeitet, kann dieses zu Problem führen.
Gruß
Hubert
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9363
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: Was macht Append Blank ?

Beitrag von Tom »

Man kann auch so etwas machen:

Code: Alles auswählen

APPEND BLANK
RepDefaults()

...

FUNCTION RepDefaults()
LOCAL n
FOR n := 1 to FCount()
  DO CASE
    CASE FieldInfo(n,FLD_TYPE) == "N" // FLD_TYPE ist als 1 in DMLB.CH definiert
    FieldPut(n,0)
    CASE FieldInfo(n,FLD_TYPE) == "L"
    FieldPut(n,.F.)
    CASE FieldInfo(n,FLD_TYPE) == "D"
    FieldPut(n,CtoD("  .  .    "))
  ENDCASE
NEXT
RETURN NIL
Herzlich,
Tom
Antworten