Ich habe ein Problem mit dem refesh eines Browses. Die Vorgehensweise ist folgende: In einem Thread wird der Browse gezeigt. In einem anderen Thread können die Datensätze des Browses bearbeitet oder neue hinzugefügt werden. Das funktioniert soweit auch alles.
Ändere ich einen Datensatz, dann arbeite ich mit oBrowse:refreshCurrent() aus dem bearbeitenden Thread heraus. Funktioniert einwandfrei.
Bei einem neuen Datensatz geht das nicht, denn dann muß ich ja nicht einen neuen Datensatz refreshen, sondern einen neuen Satz an der korrekten Stelle einfügen und dann korrekt einfügen. Da geht :refreshCurrent() also nicht mehr. Hier muß :refreshAll() ran. Das funktioniert aber nicht. Der neue Datensatz wird im Browse doppelt angezeigt, und alle anderen nicht. Gehe ich mit den Cursortasten runter, dann erscheinen auch die anderen Sätze.
Das Browseobjekt wird an den Bearbeitungs-Thread übergeben, ist da also sichtbar. Und wie gesagt, :refreshCurrent() funktioniert auch tadellos.
Jan
Threads und Browse
Moderator: Moderatoren
- Rolf Ramacher
- Der Entwickler von "Deep Thought"
- Beiträge: 1930
- Registriert: Do, 09. Nov 2006 10:33
- Wohnort: Bergheim
- Danksagung erhalten: 3 Mal
- Kontaktdaten:
Hallo Jan,
solche dinge habe ich folgendermaßen gelöst. Ich habe eine Function
DatenLaden in welcher der Browse mit den aktuellsten Daten aus einer temp-DBF befüllt wird. Sobald eine Änderung in der Browse-Maske (hier habe ich mehrere Buttons) durchgeführt wird, so wird die Function Datenladen wieder gestartet.
solche dinge habe ich folgendermaßen gelöst. Ich habe eine Function
DatenLaden in welcher der Browse mit den aktuellsten Daten aus einer temp-DBF befüllt wird. Sobald eine Änderung in der Browse-Maske (hier habe ich mehrere Buttons) durchgeführt wird, so wird die Function Datenladen wieder gestartet.
- brandelh
- Foren-Moderator
- Beiträge: 15697
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Hallo Jan,
Falls dein Browse sortiert bzw. gescopt oder gefiltert ist, musst du vor dem RefreshAll() die passenden Felder gefüllt haben. Dann in der DBF einen dbskip(0) dass da alles geschrieben ist. Nun würde ich mit RefreshAll() die Anzeige neu aufbauen lassen.
Für das Speichern eines neuen Satzes OHNE im alten Browser Satzbewegungen zu provizieren ist eine Funktion sinnvoll, der du die nötigen Infos mitgibst und die die DBF erneut öffnet und den Satz anlegt.
Unter VO hatte ich so ein ähnliches Problem gelöst.
Falls dein Browse sortiert bzw. gescopt oder gefiltert ist, musst du vor dem RefreshAll() die passenden Felder gefüllt haben. Dann in der DBF einen dbskip(0) dass da alles geschrieben ist. Nun würde ich mit RefreshAll() die Anzeige neu aufbauen lassen.
Für das Speichern eines neuen Satzes OHNE im alten Browser Satzbewegungen zu provizieren ist eine Funktion sinnvoll, der du die nötigen Infos mitgibst und die die DBF erneut öffnet und den Satz anlegt.
Unter VO hatte ich so ein ähnliches Problem gelöst.
Gruß
Hubert
Hubert
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9367
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 102 Mal
- Danksagung erhalten: 361 Mal
- Kontaktdaten:
Hallo, Jan.
Nur so am Rande: Warum laufen die Bearbeitungs- und Erfassungsfunktionen in einem getrennten Thread? Man kann doch eine DB innerhalb eines Threads auch einfach unter zwei Aliasen öffnen. Wie gesagt, nur am Rande gefragt. Mit Deinem Problem hat das, glaube ich, nämlich nichts zu tun.
Ich vermute, Du hast einen ColorBlock oder irgendwas anderes innerhalb des Browses belegt, und dieser Codeblock ist (vorübergehend) fehlerhaft, vielleicht verweist er auf irgendeine Information, die nicht verfügbar ist durch die neu angelegten Datensätze - oder Du belegst den Codeblock fälschlicherweise beim Neuerfassen mit irgendwas anderem. Dann verhalten sich Browses manchmal so, wie Du es schilderst. Es hat nichts mit Daten und Tabellen zu tun. Schmeiß mal alles raus, was Darstellungsgeschichten und ähnliches sind, und Du wirst sehen, daß sich das Browse ordnungsgemäß refresht. Oder häng mal ein oBrowse:ForceStable() an das RefreshAll. Und dann bau sukzessive wieder ein. Irgendwo ist ein Programmierfehler. Ziemlich sicher.
Nur so am Rande: Warum laufen die Bearbeitungs- und Erfassungsfunktionen in einem getrennten Thread? Man kann doch eine DB innerhalb eines Threads auch einfach unter zwei Aliasen öffnen. Wie gesagt, nur am Rande gefragt. Mit Deinem Problem hat das, glaube ich, nämlich nichts zu tun.
Ich vermute, Du hast einen ColorBlock oder irgendwas anderes innerhalb des Browses belegt, und dieser Codeblock ist (vorübergehend) fehlerhaft, vielleicht verweist er auf irgendeine Information, die nicht verfügbar ist durch die neu angelegten Datensätze - oder Du belegst den Codeblock fälschlicherweise beim Neuerfassen mit irgendwas anderem. Dann verhalten sich Browses manchmal so, wie Du es schilderst. Es hat nichts mit Daten und Tabellen zu tun. Schmeiß mal alles raus, was Darstellungsgeschichten und ähnliches sind, und Du wirst sehen, daß sich das Browse ordnungsgemäß refresht. Oder häng mal ein oBrowse:ForceStable() an das RefreshAll. Und dann bau sukzessive wieder ein. Irgendwo ist ein Programmierfehler. Ziemlich sicher.
Herzlich,
Tom
Tom
- AUGE_OHR
- Marvin
- Beiträge: 12909
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: Threads und Browse
hi,
gruss by OHR
Jimmy
den 2st Browse zu aktuallisieren mache ich anders :Jan hat geschrieben: Ändere ich einen Datensatz, dann arbeite ich mit oBrowse:refreshCurrent() aus dem bearbeitenden Thread heraus. Funktioniert einwandfrei.
Bei einem neuen Datensatz geht das nicht, denn dann muß ich ja nicht einen neuen Datensatz refreshen, sondern einen neuen Satz an der korrekten Stelle einfügen und dann korrekt einfügen. Da geht :refreshCurrent() also nicht mehr. Hier muß :refreshAll() ran.
Code: Alles auswählen
PRIVATE nEditRec := 0 // hier nur zu Demo PRIVATE !!!
...
tu_was_mit_den Daten()
...
oXbpSave:activate := {|| nEditRec := FIELD->RECNO() ,
PostAppEvent(xbeE_Refresh, nEditRec ,, oBrowse2 ) }
**********************************************************
nEvent := AppEvent(@mp1,@mp2,@oXbp,nTimeOut)
DO CASE
CASE nEvent = xbeE_Refresh
GOTO (mp1)
refreshall()
Jimmy