Seite 1 von 3

DCBROWSE und DataObject [ERLEDIGT]

Verfasst: Fr, 09. Feb 2018 15:53
von Manfred
Hi,
wie macht man das eigentlich mit dem DCBROWSE DCBROWSECOL im Zusammenhang mit DataObjects als Array? Bisher gebe ich ja immer ELEMENT NR an, das ist ja nicht mehr Sinn und Zewck bei DataObject. Die können/werden ja jetzt direkt mit den Namen angesprochen. Aber wie hat Roger das vorgesehen? Oder geht dass gar nicht zu nutzen? Ich hatte mal kurz etwas probiert, bin aber damit auf die Schnauze gefallen. War sicherlich total falsch!

Re: DCBROWSE und DataObject

Verfasst: Fr, 09. Feb 2018 18:37
von Wolfgang Ciriack
Schau die mal das Beispiel unter Samples\Browse\objects.prg an, sollte als Grundlage passen. Hab es aber selbst noch nicht benutzt.

Re: DCBROWSE und DataObject

Verfasst: Fr, 09. Feb 2018 18:47
von Manfred
hervorragend. Das Zauberwort ist OBJECTVAR und name statt ELEMENT und nummer.
Danke, das hatte ich total überlesen.

Re: DCBROWSE und DataObject [ERLEDIGT]

Verfasst: Mo, 12. Feb 2018 14:18
von Manfred
leider ein weiteres Verständnisproblem.
Wie spreche ich denn das Objectvar an?
Ich habe ein logisches Feld in dem Dataobject und möchte gerne bei .T. "Ja" und bei .F. "Nein" anzeigen. Ich würge mir die ganze Zeit einen ab, aber es will nicht klappen.
Der nächste Schritt wäre dann mittels Doppelklick .T. gegen .F. zu tauschen. Ich bekomme das nicht hin. Ich weiß nicht, wie man das Object anspricht.

Re: DCBROWSE und DataObject [ERLEDIGT]

Verfasst: Mo, 12. Feb 2018 14:24
von Tom

Code: Alles auswählen

DCBROWSECOL OBJECTVAR {|o|IF(o:logischesFeld,"ja","nein")} PARENT oBROWSE HEADER "JaNein" WIDTH 6 
Statt "logischesFeld" der Name Deiner iVar/Objektinstanzvariable.

Re: DCBROWSE und DataObject [ERLEDIGT]

Verfasst: Mo, 12. Feb 2018 15:23
von Manfred
ach, darf da kein DATA vorstehen? Dann würde das den Fehler erklären.

Re: DCBROWSE und DataObject [ERLEDIGT]

Verfasst: Mo, 12. Feb 2018 15:50
von Tom
Auf OBJECTVAR folgt entweder der Name einer iVar oder ein Codeblock, der das Objekt als Parameter bekommt. DATA ist nur bei Arrays oder Tabellen nötig, wenn statt der direkten Daten auf das Ergebnis eines Codeblocks zugegriffen werden soll. Es ersetzt dort FIELD oder ELEMENT.

Re: DCBROWSE und DataObject [ERLEDIGT]

Verfasst: Fr, 28. Sep 2018 19:23
von Manfred
und wie setze ich COLOR in Abhängigkeit vom Wert? Also "JA" grün und "NEIN" rot.
ich habe naiverweise mal versucht

Code: Alles auswählen

COLOR {|o| IF(o:webfrei,GRA_CLR_GREEN,GRA_CLR_RED) };
Das gibt aber eine Fehlermeldung. Da wird wohl versucht auf eine Membervar zuzugreifen, was dann nicht klappt.

Re: DCBROWSE und DataObject [ERLEDIGT]

Verfasst: Fr, 28. Sep 2018 19:44
von Tom
Im Codeblock bekommst Du den Zelleninhalt als Parameter. Lass es Dir einfach mal anzeigen.

Re: DCBROWSE und DataObject [ERLEDIGT]

Verfasst: Sa, 29. Sep 2018 11:52
von Manfred
ich stehe mal wieder auf der Leitung. Wie mache ich das? Meine Versuche führen alle ins Leere.

Re: DCBROWSE und DataObject [ERLEDIGT]

Verfasst: Sa, 29. Sep 2018 12:56
von Tom
Der COLOR-Codeblock bekommt das, was Dir oColumn:DataArea:GetCell() auch zurückliefern würde, also das konkrekte Datum in der Zelle. Wenn Du ein Array von Objekten im Browser braust und die Spalte enthält z.B. o:Name, dann wäre in "{|x| ... }" das x gleich o:Name.

Re: DCBROWSE und DataObject [ERLEDIGT]

Verfasst: Sa, 29. Sep 2018 13:38
von Manfred
hm,
ich habe den Code von mir weiter oben mit dem Color Block ausprobiert und das |o| angeschaut. da war ein leerer string drin.

Re: DCBROWSE und DataObject [ERLEDIGT]

Verfasst: Di, 08. Jan 2019 21:01
von Manfred
ich muß den Thread nochmal erweitern.
Das Array soll nun mit einem Filter versehen werden können. Das kommt aber jetzt erst zum Schluß, vorher muß ich noch etwas anderes klären. Ich habe mir einen Button gebaut, der, wenn er gedrückt wird, einen Codeblock erzeugen soll, der das Array im Browse filtern soll. Es gibt Browsespalten, die sortiert sind. Es soll so ablaufen: auf der Zeile, auf der der Cursor steht, soll die Spalte genommen werden, die sortiert ist und der Wert der dann in der sortierten Spalte steht soll als Grundlage für den Filter dienen. Welche Spalte sortiert ist, merke ich mir über eine Variable Jetzt dachte ich, es genügt, wenn ich in der aufgerufenen Funktion prüfe, von welcher Browserzeile ich komme und welche Spalte sortiert ist (siehe Variablen von vorhin) um dann auszulesen was in der besagten Zele/Spalte für ein Wert steht um den dann als Filter zu setzen und ein .T. zu erlangen, wenn es stimmt. Jetzt wurde meine Vorfreude dadurch getrübt, dass die Rückgabe der Sortierspalte leider nicht der Folge im DataObject folgt. Da ich zu dem Zeitpunkt zwar die Spalte wüßte, aber nicht die Dataobject Bezeichnung muß ich natürlich den Wert und nicht den Namen angeben. Damit lande ich aber auf die logische Reihenfolge im Object/Array und nicht der, die in der Browserspalten steht. Was mache ich nun?

Re: DCBROWSE und DataObject [ERLEDIGT]

Verfasst: Mi, 09. Jan 2019 7:47
von Manfred
hier mal ein wenig Code

Browser

Code: Alles auswählen

@ 15,5 DCBROWSE oDialogZusatz:oBrowse;
               CURSORMODE XBPBRW_CURSOR_ROW;
                     DATA oDialogZusatz:aAuftragoffen;
                   FILTER oDialogZusatz:bBrowsefilter;
               ITEMMARKED {|| ItemmarkedBrowse(oDialogZusatz),;
                              dc_getrefresh(getlist),;
                              dc_getorigset(getlist);
                          };
              NOSOFTTRACK;
                   PARENT oDialogZusatz:oRahmenBrowse;
                  PREEVAL {|| oDialogZusatz:oBrowse:headerRbDown := {|aMousePos, nColPos, self| MausImKopf(nColPos,oDialogZusatz,{1,2,4,6})}};
                     SIZE DCGUI_PARENTWIDTH-10,DCGUI_PARENTHEIGHT - 20
Code der aufgerufen wird vom Button um den Filter zu erstellen.

Code: Alles auswählen

IF ! ::lBrowseFilter
             nSortSpalte   := Val(SubStr(::cBrowseSort,7,3))                       // jetzt bekomme ich die Spalte, nach der sortiert ist.
             nZeile        := DC_GetColArray(0,::oBrowse)                          // jetzt die zeile von der wir kommen
             cBrowseInhalt := ::aAuftragOffen[nZeile,nSortSpalte]                  // und jetzt der Filterinhalt der Spaltenzeile
             ::bBrowseFilter := {|x| x[nSortSpalte] = cBrowseInhalt}
             ::lBrowseFilter := .T.
          ELSE
             ::bBrowseFilter := {|| .T.}
             ::lBrowseFilter := .F.
          ENDIF
          DC_GetBrowArray(::oBrowse,::aAuftragOffen)                            // das muß hier hin, damit das Array angezeigt wird im Browse
          ::oBrowse:gotop()
          ::oBrowse:refreshAll()

Re: DCBROWSE und DataObject [ERLEDIGT]

Verfasst: Mi, 09. Jan 2019 7:51
von Wolfgang Ciriack
Schau die mal die Funktion DC-GetColArray() an, die liefert die das Element, was du benötigst.

Re: DCBROWSE und DataObject [ERLEDIGT]

Verfasst: Mi, 09. Jan 2019 8:03
von Manfred
Hi Wolfgang,
wie müßte ich das angehen? Wenn ich statt der 0 die nSortSpalte angebe, bekomme ich das gleich Ergebnis wie mit meiner Methode. Und das ist nicht das wa sich brauche.

Re: DCBROWSE und DataObject [ERLEDIGT]

Verfasst: Mi, 09. Jan 2019 12:33
von Manfred
jetzt habe ich mir einen Workaround programmiert.
ich merke mir jetzt wie das DataObject IVar heißt und spreche es direkt an.

Code: Alles auswählen

IF ! ::lBrowseFilter
             nZeile        := DC_GetColArray(0,::oBrowse)                       // jetzt die zeile von der wir kommen
             cBrowseInhalt := ::aAuftragOffen[nZeile]:&(::cBrowseSortDoName)    // und jetzt der Filterinhalt der Spaltenzeile
             ::bBrowseFilter := {|x| x:&(::cBrowseSortDoName) = cBrowseInhalt}
             ::lBrowseFilter := .T.
          ELSE
             ::bBrowseFilter := {|| .T.}
             ::lBrowseFilter := .F.
          ENDIF
          DC_GetBrowArray(::oBrowse,::aAuftragOffen)                            // das muß hier hin, damit das Array angezeigt wird im Browse
//          ::oBrowse:gotop()
          ::oBrowse:refreshAll()
leider wird aber der Browser nicht aktualisiert. Was mache ich denn nun schon wieder falsch?
Beim Erststart stht der Filterblock auf {|| .T.} das klappt. selbst wenn ioch da direkt einen andere Bedingung rein schreibe, wird der Filter richtig interpretiert. Aber im nachhinein nicht mehr, wenn ich ihn ändere über oben angeführte Funktion. Ich dachte ein DC-GetBrowArray() genügt mit einem refreshall() dahinter? Stattdessen ändert sich nichts in der Anzeige, aber der Cursor läßt sich nicht mehr bewegen. Alles im Browse steht still.
Auch wenn ich den Filter wieder zurücksetze im Elsebereich, klappt es nicht mehr.

Re: DCBROWSE und DataObject [ERLEDIGT]

Verfasst: Mi, 09. Jan 2019 13:59
von Tom
Dir ist schon klar, dass es mit der FILTER-Klausel im DCBROWSE für Arrays einen Mechanismus gibt, der das automatisch erledigt - und der Dir eine Menge Arbeit abnehmen kann?

Re: DCBROWSE und DataObject [ERLEDIGT]

Verfasst: Mi, 09. Jan 2019 14:02
von Manfred
nein, nicht wirklich. Aber irgendwo muß ich ja anfangen. Welchen meinst Du denn?

Re: DCBROWSE und DataObject [ERLEDIGT]

Verfasst: Mi, 09. Jan 2019 14:46
von Tom
Den, von dem ich da geschrieben habe.

Code: Alles auswählen

@ 1,1 DCBROWSE oBrowse DATA aMyArray .... FILTER {|a|IF(lFilter,a[nAktuelleSpalte] = <irgendwas>,.T.)}
Der FILTER-Codeblock wird für jede Browsezeile evaluiert. Ich mache es meistens so, dass ich über eine Variable festlege, ob überhaupt ein Filter aktiv ist ("lFilter"), dann wird die Zeile entsprechend ausgewertet, meistens allerdings über eine Funktion, weil die Parameter komplexer sind. Ist kein Filter aktiv, wird jede Zeile angezeigt.

Re: DCBROWSE und DataObject [ERLEDIGT]

Verfasst: Mi, 09. Jan 2019 14:50
von Manfred
verstehe ich nicht. Wo liegt der Unterschied zu dem was ich bisher gebaut habe? Es muß doch ein logischer Wert zurückgeliefert werden und das tut es doch bei mir, oder nicht?

Re: DCBROWSE und DataObject [ERLEDIGT]

Verfasst: Mi, 09. Jan 2019 15:12
von Tom
Habe ich übersehen, Du verwendest ja die FILTER-Klausel. Dann brauchst Du aber den ganzen DC_GetBrowArray-Schnödeldödel nicht, weil die FILTER-Klausel mit jedem :RefreshAll() evaluiert wird. Mit DC_GetBrowArray() jubelst Du dem Browse ja eine neue Datenquelle unter (oBrowse:DataSource), während Du aber eigentlich nur willst, dass die Anzeige auf bestimmte Zeilen begrenzt wird. Das Array darf dafür unverändert bleiben, weil DCBROWSE die Bedingungen ja selbst in allen Navigationsblöcken prüft. Du musst nur für den Filter eine Bedingung formulieren, die er auch auswerten kann. bFilterBlock muss dafür einzelne Arrayzeilen als Parameter entgegennehmen und für diese jeweils .T. oder .F. zurückliefern, je nachdem, ob sie angezeigt werden sollen oder nicht.

Re: DCBROWSE und DataObject [ERLEDIGT]

Verfasst: Mi, 09. Jan 2019 15:20
von Manfred
irgendwas ist da faul. Der Codeblock muß doch nur .T. oder .F. zurückliefern..... was bedutet: Entweder alles oder gar nichts anzeigen, wenn nur mit .T. und .F. gearbeitet wird
ich habe das mal gemacht nur um zu sehen, ob einmal alles und einmal nmichts angezeigt wird.

Code: Alles auswählen

IF ! ::lBrowseFilter
             nZeile        := DC_GetColArray(0,::oBrowse)                       // jetzt die zeile von der wir kommen
             cBrowseInhalt := ::aAuftragOffen[nZeile]:&(::cBrowseSortDoName)    // und jetzt der Filterinhalt der Spaltenzeile
             ::bBrowseFilter := {|| .F.}
             ::lBrowseFilter := .T.
          ELSE
             ::bBrowseFilter := {|| .T.}
             ::lBrowseFilter := .F.
          ENDIF
          ::oBrowse:refreshAll()
Resultat: beim 1.Aufruf ist der Codeblock {|| .T. } und es wird alles angezeigt. So ist es ja richtig.
wenn ich den Button drücke, dann wird der Codeblock auf .F. gesetzt und alles friert ein im Browser ich komme auch mit Rückstellung auf .T. nicht wieder in den Scrollmodus. Tilt, Finito, Feierabend.
Was mache ich da falsch?

Re: DCBROWSE und DataObject [ERLEDIGT]

Verfasst: Mi, 09. Jan 2019 16:01
von Tom
Mmh. Ich habe noch keinen Array-Filter ausprobiert, bei dem nichts mehr übrig bleibt. Wie verhält sich Dein Browse, wenn das Array schon beim Aufruf leer ist? Genau diese Situation generierst Du ja mit diesem Radikalfilter. Was passiert, wenn Du eine vernünftigere Bedingung wählst, etwa ein Filter auf ungerade Werte in irgendeiner numerischen Spalte oder so?

Re: DCBROWSE und DataObject [ERLEDIGT]

Verfasst: Mi, 09. Jan 2019 16:04
von Manfred
ich habe beim Start einmal einen Wert eingegeben von dem ich weiß, das er ein parmal vorhanden ist. Das klappt.