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

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