DataObject MemVar löschen

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Antworten
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

DataObject MemVar löschen

Beitrag 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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: DataObject MemVar löschen

Beitrag 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.
Gruß
Hubert
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: DataObject MemVar löschen

Beitrag 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
Herzlich,
Tom
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: DataObject MemVar löschen

Beitrag 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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
HaPe
1000 working lines a day
1000 working lines a day
Beiträge: 995
Registriert: So, 15. Nov 2015 17:44
Wohnort: 71665 Vaihingen-Enz
Hat sich bedankt: 17 Mal
Danksagung erhalten: 15 Mal

Re: DataObject MemVar löschen

Beitrag 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:
--
Hans-Peter
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: DataObject MemVar löschen

Beitrag 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
gruss by OHR
Jimmy
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: DataObject MemVar löschen

Beitrag 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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: DataObject MemVar löschen

Beitrag von Jan »

Alaska hat den PDR 7049 aufgemacht.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Antworten