Seite 1 von 1
DataObject MemVar löschen
Verfasst: Mi, 26. Sep 2018 17:46
von Jan
Hallo,
wenn ich mit SCATTER NAME oDataObject einen Satz einlese, dann habe ich natürlich alle Felder mit drin - was ja auch der Sinn der Sache ist. Bei SCATTER NAME oDataObject werden dann auch alle Felder geschrieben, die es in der zu füllenden dbf gibt. Was eventuell nicht gewünscht ist.
Stellt sich die Frage: Wie lösche ich eine der MemVar?
Jan
Re: DataObject MemVar löschen
Verfasst: Do, 27. Sep 2018 7:52
von brandelh
ich sehe nur die Möglichkeit, bei den ungewünschten Feldern den Inhalt der Zieldatei zu lesen und in das Objekt zu schreiben.
Weder bei DataObject() noch bei Abstract() ist das Löschen einer Instanzvariable vorgesehen ...
Oder du nutzt eben nicht die "Gieskanne" sondern machst eine eigene Routine.
Re: DataObject MemVar löschen
Verfasst: Do, 27. Sep 2018 10:05
von Tom
Der Zugriff auf eine DO-Instanzvariable, die nicht existiert, liefert NIL, und durch Zuweisung wird sie erzeugt. Es gibt keinen gelöschten Zustand, also etwas, das im Zugriff einen Laufzeitfehler generieren würde - das ist eine wesentliche Eigenschaft von Data Objects. Anders gesagt:
Code: Alles auswählen
o := DataObject():New()
? IsMemberVar(o,"Blubb") // .F.
? o:Blubb // NIL - aber kein Laufzeitfehler
o:Blubb := "Blubb"
? o:Blubb // Blubb
o:Blubb := NIL
? IsMemberVar(o,"Blubb") // .T., leider
Re: DataObject MemVar löschen
Verfasst: Do, 27. Sep 2018 11:21
von Jan
Moin,
schade. Ich hatte die Hoffnung das die Klassen-Cracks hier eine Idee haben dazu.
Was natürlich ginge ist, das ich das DO umkopiere in einer FOR...NEXT-Schleife, und dabei die entsprechende MeberVar auszulassen. Und dann das GATHER auf das kopierte DO zu machen.
Das Problem, um das es hier geht: Ich kopiere halt Sätze aus einer dbf in eine andere. Die Struktur ist die gleiche. Problem: Das ist eine FOXCDX im einem "S"-Feld. Das KANN man eben nicht einfach so beschreiben. Und GATHER scheint das (im Gegensatz zu DbImport()) nicht zu merken, und steigt dann mit einem Laufzeitfehler aus wegen dem schreibgeschützen Feld.
Ich hab mal eine Mail an den Support geschickt. Mal sehen was Alaska dazu sagt. Im Prinzip wäre es ja gut wenn GATHER sowas berücksichtigen würde.
Jan
Re: DataObject MemVar löschen
Verfasst: Do, 27. Sep 2018 13:13
von HaPe
Hallo Jan !
Im Prinzip wäre es ja gut wenn GATHER sowas berücksichtigen würde.
Noch besser wäre es wenn es wie in VFP eine FIELDS-Klausel mit EXCEPT und LIKE hätte
Re: DataObject MemVar löschen
Verfasst: Do, 27. Sep 2018 19:50
von AUGE_OHR
Jan hat geschrieben: ↑Do, 27. Sep 2018 11:21
Im Prinzip wäre es ja gut wenn GATHER sowas berücksichtigen würde.
wie wäre es wenn du dir eine eigene GATHER() Function schreibst ?
Code: Alles auswählen
Original \SOURCE\SYS\Blocks.prg
FUNCTION Gather( aValues )
IF Valtype( aValues ) == "A"
IF AScan( aValues, {|x| Valtype(x) <> "O" } ) > 0
AEval( aValues, {|x,i| FieldPut(i,x) } )
ELSE
AEval( aValues, {|o| o:getData() } )
ENDIF
ENDIF
RETURN aValues
wenn du die iVAR auf NIL setzt und das in deiner GATHER() Function prüfst
Code: Alles auswählen
FUNCTION Gather( aValues )
IF Valtype( aValues ) == "A"
iMax := LEN(aValues)
FOR i := 1 TO iMax
x := FieldGet(i)
IF x = NIL
ELSE
FieldPut(i,x)
ENDIF
NEXT
Re: DataObject MemVar löschen
Verfasst: Do, 27. Sep 2018 20:29
von Jan
Jimmy,
der Gedanke war mir inzwischen auch schon gekommen. Mir war vor der Antwort von Alaska nicht klar gewesen, das der Quellcode mitgeliefert wird.
Aber der Pfad ist nicht \SOURCE\SYS\Blocks.prg, sondern \SOURCE\runtime\SYS\Blocks.prg. Merkwürdig - Alaska Support hat exakt den gleichen Fehler gemacht...
Jan
Re: DataObject MemVar löschen
Verfasst: Do, 27. Sep 2018 20:30
von Jan
Alaska hat den PDR 7049 aufgemacht.
Jan