DCBROWSE Cell edit und Buffer

Moderator: Moderatoren

Antworten
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 19848
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 29 Mal
Danksagung erhalten: 29 Mal

DCBROWSE Cell edit und Buffer

Beitrag von Manfred »

Ich habe einen DCBROWSE, in dem ich Editieren erlaubt habe.
Wenn in einer Zelle ein Wert eingetragen wird, dann wird am Ende geprüft, ob es dazu etwas in einer DBF gibt. Ist das nicht der Fall, dann wird ein Auswahlfenster geöffnet und es kann händisch gesucht werden. Den gefundenen Satz kann der User übernehmen. So weit, so gut. DCBrowse wird mit Dataobjects gemacht. Sobald ich den Satz übernommen habe, werden alle benötigten Werte aus der DBF in die Dataobjects geschrieben und dann auch in den jeweiligen Zellen richtig angezeigt. Der einzige der aus der Reihe tanzt, ist der Wert in der Zelle, mit dem ich anfangs geprüft habe, ob er korrekt ist. Wenn ich zwischendurch ein :refreshall() auf das Browsobjekt mache (Debugger Einzelschritt), kann man sehen, wie der neue Wert angezeigt wird. Sobald aber alles upgedatet wurde, steht wieder der anfängliche, falsche Wert drin. Aber nur in besagter Zelle. Außerdem wurde der falsche Wert auch wieder ins Dataobject der Zelle eingetragen. Baut Roger irgendwas nach oder um, um die Zellen zu editieren und es gibt noch irgendwo einen alten Buffer, aus dem der ursprüngliche Wert wieder rekonstruiert wird? Wenn ja, wie komme ich daran um auch den Wert gegen den neuen richtigen zu tauschen? Oder ist es was ganz anderes?
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kannste sein, Hauptsache pfiffig!!
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 8253
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 10 Mal
Danksagung erhalten: 42 Mal
Kontaktdaten:

Re: DCBROWSE Cell edit und Buffer

Beitrag von Tom »

Möglich, dass Du irgendwo ein DC_GetRefresh() zu viel hast.
Herzlich,
Tom
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 19848
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 29 Mal
Danksagung erhalten: 29 Mal

Re: DCBROWSE Cell edit und Buffer

Beitrag von Manfred »

und das tauscht mir dann in dem BrowseArray den neuen Wert gegen den alten aus? Hm
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kannste sein, Hauptsache pfiffig!!
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 8253
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 10 Mal
Danksagung erhalten: 42 Mal
Kontaktdaten:

Re: DCBROWSE Cell edit und Buffer

Beitrag von Tom »

Ich hatte jedenfalls kürzlich ein ähnliches Problem mit einer DCCOMBOBOX mit aktiver REFRESH-Klausel, die in einem Dialog das erneute Einlesen von Variablen und damit indirekt das Umsetzen eines Browsepointers zur Folge hatte. DC_GetRefresh() validiert alle Datalinks erneut. Danach hat man u.U. einen Zustand, der nicht mehr aktuell ist.
Herzlich,
Tom
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 8253
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 10 Mal
Danksagung erhalten: 42 Mal
Kontaktdaten:

Re: DCBROWSE Cell edit und Buffer

Beitrag von Tom »

Wenn Du ein Cell-Edit machst - mit einem eingebetteten DCGET, nehme ich an -, dann schreibt Roger nach dem beendeten Edit den Wert zurück in die Datenquelle, wenn sie direkt verfügbar ist. Ich würde hier mal mit dem EXIT-Codeblock der EDIT-Klausel hantieren und schauen, ob es etwas hilft, hierin Code zu platzieren, der den Inhalt des DCGETs auch wirklich in die Tabelle schreibt. Sonst geschieht das möglicherweise nicht. Aber es hängt ein bisschen davon ab, wie das Browse aufgebaut ist. Ich arbeite nie mit Cell-Editing aus Rogers Werkstatt, weil ich solche unerwünschten Effekte befürchte. Ich lege lieber einen eigenen kleinen Dialog über die Zelle und sorge selbst dafür, dass die Datenquelle aktualisiert wird.
Herzlich,
Tom
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 19848
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 29 Mal
Danksagung erhalten: 29 Mal

Re: DCBROWSE Cell edit und Buffer

Beitrag von Manfred »

eingebettetes DCGET? Das vermute ich wohl, aber wo ist das abegelegt? Das hat ja dann sicherlich einen eigenen Buffer und den würde ich mir gerne mal dabei anschauen. Vielleicht ist das mein problem.
so sieht ein Auszug aus, den ich gebaut habe.

Code: Alles auswählen

@ oDialogZUsatz:nOben,oDialogZusatz:nLinks DCBROWSE oDialogZusatz:oBrowseTagesDienste;
                     DATA oDialogZusatz:aTagesdienste;
                     EDIT xbeBRW_ItemSelected MODE DCGUI_BROWSE_EDITEXIT;
                HEADLINES 2;
               ITEMMARKED {|| oDialogZUsatz:itemmarkedBrowseTagesdienst()};
                  MESSAGE "Auswahl der einzelnen Fahrten" INTO oDialogZusatz:oMessageBox;
              NOSOFTTRACK;
                   PARENT oDialogZusatz:oRahmenBrowse2;
                     SIZE DCGUI_PARENTWIDTH-oSysPara:skaliereXbParts(10),DCGUI_PARENTHEIGHT - oDialogZUsatz:nOben - oDialogZusatz:nPbHoehe + oSysPara:skaliereXbParts(10);
             SORTUPBITMAP BITMAP_RD_UP_DARKGRAY;
           SORTDOWNBITMAP BITMAP_RD_DOWN_DARKGRAY;
                  TABSTOP

          DCBROWSECOL OBJECTVAR dienstbez;
                        COLOR {|| oDialogZusatz:sasook()};
                       HEADER "Stamm;Dienst";
                       PARENT oDialogZusatz:oBrowseTagesdienste;
                      PICTURE "@K XXXXXXXXXXXX";
                      PROTECT {|| pruefeAufAbgerechnet(oDialogZusatz)};
                         SORT {|aMousePos, nColPos, self| oDialogZusatz:MausImKopf(nColPos,"dienstbez")} DEFAULT;
                        VALID {|| oDialogZusatz:validCol("dienstbez")};
                        WIDTH oSysPara:skaliereXbParts(80)
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kannste sein, Hauptsache pfiffig!!
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2661
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Hat sich bedankt: 2 Mal
Kontaktdaten:

Re: DCBROWSE Cell edit und Buffer

Beitrag von Wolfgang Ciriack »

Du kannst ja für das Editieren ein eigenes GET object anlegen um das zu sehen:

Code: Alles auswählen

DCBROWSECOL .....  EDITOR "NEXT_DATE" 

@nil,nil DCGET xNIL ..... GETID "NEXT_DATE".....
Viele Grüße
Wolfgang
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 19848
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 29 Mal
Danksagung erhalten: 29 Mal

Re: DCBROWSE Cell edit und Buffer

Beitrag von Manfred »

Hi Wolfgang,
das hat mir Bertram auch schon gezeigt. Wobei ich nicht wirklich verstanden habe, oder einsehen konnte/wollte, warum man das so lösen soll. Der direkt Weg, so wie ich ihn mache ist doch auch in Rogers Anleitung so zu sehen. Bei eurem Vorschlag muß ich doch alle Zellen extra mit DCGET hinzuprogrammieren, was ich mit meiner Version nicht muß.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kannste sein, Hauptsache pfiffig!!
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2661
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Hat sich bedankt: 2 Mal
Kontaktdaten:

Re: DCBROWSE Cell edit und Buffer

Beitrag von Wolfgang Ciriack »

Normal nicht, aber wenn man noch z.B. einen Auswahlbutton oder eine Valid Prüfung im Get haben möchte...
Viele Grüße
Wolfgang
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 19848
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 29 Mal
Danksagung erhalten: 29 Mal

Re: DCBROWSE Cell edit und Buffer

Beitrag von Manfred »

die Validprüfung habe ich doch in der DCBRWOSECOL
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kannste sein, Hauptsache pfiffig!!
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2337
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 8 Mal
Kontaktdaten:

Re: DCBROWSE Cell edit und Buffer

Beitrag von Koverhage »

Wenn Du Cell edit machst wird der Satz automatisch gesperrt wenn Du die Celle per Klick zum editieren öffnest.
DBROWSE ..... EDIT xbeBRW_ItemSelected MODE DCGUI_BROWSE_EDITDOWN ;
Gruß
Klaus
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 19848
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 29 Mal
Danksagung erhalten: 29 Mal

Re: DCBROWSE Cell edit und Buffer

Beitrag von Manfred »

Hi Klaus,
ich rede von einem Array, nicht von einer DBF. Da wird nichts gesperrt. :wink:
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kannste sein, Hauptsache pfiffig!!
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 8253
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 10 Mal
Danksagung erhalten: 42 Mal
Kontaktdaten:

Re: DCBROWSE Cell edit und Buffer

Beitrag von Tom »

Bist Du eigentlich einer Lösung nähergekommen, Manfred? Ich habe Deine Problembeschreibung jetzt ein gutes Dutzend Mal gelesen und immer noch nicht präzise verstanden, was der Ablauf ist. Ich gebe mal meinen jetzigen Kenntnisstand wieder:

1. Eine DBF wird in ein Array aus DataObjects eingelesen.
2. Dieses Array aus DataObjects wird gebraust.
3. Man kann Einträge neu erfassen. Wenn man das macht, wird in der DBF geschaut, ob es diesen Eintrag gibt oder nicht. Wenn nichts gefunden wird, kann man einen irgendwie passenden Eintrag aussuchen und übernehmen. Was genau geschieht in diesem Moment, also beim Übernehmen? Es ist möglich, dass die DataSource des Browses nicht mit dem Array synchronisiert wird!
4. Nach dem Bearbeiten wird der Eintrag wie in die DBF zurückgeschrieben? Was ist jetzt falsch zu sehen, was richtig? Hier endet mein Verstehen Deiner Ausführungen. Jedenfalls wird jetzt das Grid aktualisiert, es ist kurz richtig, aber dann stehen wieder falsche Werte irgendwo. Ich nehme an, dass aus den DataObjects nicht in die Tabelle geschrieben wurde oder dass die DataObjects überhaupt nicht aktualisiert wurden. Was passiert, wenn Du ohne das ganze Auswahl- und Kontrollgedöns editierst? Landen dann die richtigen Werte irgendwo?

Edit: DCBROWSE hat eine iVar, die DataSource heißt. Diese enthält beim Arraybrausen eine Kopie (!) des Arrays, das man braust. Wenn man das Quell-Array irgendwie ändert, muss man es mit DC_GetBrowArray(oBrowse,aArray) erneut dem Browse-Objekt als Datenquelle zuweisen. Umgekehrt kann man das "alte" Array jederzeit mit der Kopie vergleichen, die man über DC_GetBrowArray(oBrowse) bekommt. Ich benutze Cell-Editing aus diesem Grund niemals (bei Arrays), weil man nicht sicher sein kann, wo die Daten landen. Vielleicht schaust Du an dieser Stelle mal.
Herzlich,
Tom
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 19848
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 29 Mal
Danksagung erhalten: 29 Mal

Re: DCBROWSE Cell edit und Buffer

Beitrag von Manfred »

Hi Tom,
es geht so.
1) Es ist ein Array, mit Dataobjects
2) Es wird ein leerer Satz in einer DBF angelegt
3) dann wird das Array geleert
4) und die Daten (nebst dem neuen leeren Satz) wieder ins Array eingelesen.
5) Jetzt steht der Cursor auf dem neuen leeren Satz 1.Spalte im Array
6) jetzt wird ein Doppelklick auf die Zelle gemacht um die Eingabe zu aktivieren
7) in die bis jetzt leere Zelle des ArrayBrowses wird ein Wert geschrieben. z.B. 317k
8) jetzt wird die Zelle verlassen (egal wie) und der Inhalt wird geprüft, ob es dazu einen DAtensatz gibt.
9) in meinem Fall wird er nicht gefunden und es geht ein Suchfenster auf, in dem die DBF gebrowsed wird um selbst suchen zu können
10) man hat einen Wert gefunden und drückt auf übernehmen
11) der gefundene Satz wird aus der DBF in den Speicher geholt
12) dann wird der leere Arraysatz aus den Speichervars gefüllt
wenn man jetzt an der Stelle ein :refresh() auf das Array macht im Debugger, dann wird der neue Wert angezeigt. (z.B. 317a)
Dann wir das Programm mit F10 fortgesetzt und schwuppdiwupp, wird der anfängliche Wert wieder übernommen (317k), der eingetippt wurde, aber falsch war, weil kein Satz dazu gefunden wurde.
Und dafür habe ich keine Erklärung. In dem Array stand kurzzeitig nach der Übernahme der DAten aus der DBF der richtige Wert, auch Datasource des Arraysatzes, aber dann steht wierder in beiden der alte, erste. falsche Wert drin.

So jetzt verständlicher?
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kannste sein, Hauptsache pfiffig!!
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 8253
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 10 Mal
Danksagung erhalten: 42 Mal
Kontaktdaten:

Re: DCBROWSE Cell edit und Buffer

Beitrag von Tom »

Machst Du zwischen 4) und 5) ein DC_GetBrowArray?
Herzlich,
Tom
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 19848
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 29 Mal
Danksagung erhalten: 29 Mal

Re: DCBROWSE Cell edit und Buffer

Beitrag von Manfred »

sagen wir mal so, wenn da nichts im Hintergrund passiert, dann nein. Zumindest habe ich nichts dazwischen eingegeben. Und z.B. ein DC_getrefresh() liegt auch nicht vor. Ich habe einen breakpoint darauf gesetzt, wird aber nirgends aufgerufen.
Wie schon erwähnt, ALLE Werte werden neu gesetzt in den Speichervars, aber ganz zum Schluß wird der eigentliche Wert in der Zelle wieder auf den eingetippten zurückgesetzt. Und ich habe keine Ahnung warum, weshalb, weswegen. Irgendwo muß ja dann wohl ein "refresh" auf alte Daten stattfinden. Vermutlich wird der Ursprungsbuffer wieder restored. Keine Ahnung wo. Deshalb ja meine Frage, ob Roger da GETs drüberlegt, die dann dieses Problem verursachen.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kannste sein, Hauptsache pfiffig!!
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 8253
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 10 Mal
Danksagung erhalten: 42 Mal
Kontaktdaten:

Re: DCBROWSE Cell edit und Buffer

Beitrag von Tom »

Dann mach das doch mal, Manfred. Wenn Du das Array sozusagen von außen veränderst, setz ein DC_GetBrowArray(oBrowse,aArray) ab.
Herzlich,
Tom
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 19848
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 29 Mal
Danksagung erhalten: 29 Mal

Re: DCBROWSE Cell edit und Buffer

Beitrag von Manfred »

hilft auch nicht.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kannste sein, Hauptsache pfiffig!!
Antworten