DataWindow, Server, Browser
Posted: Sat Mar 01, 2025 8:10 am
Hallo
Ich benötige mal eine Empfehlung wie ich meine 2 Probleme vernünftig lösen kann.
Das VO Programm wächst seit 25 bis 30 Jahren, nur für unsere Firma. Ich habe immer wieder 2 Probleme die ich mit den wildesten Methoden versucht habe zu beseitigen. Jetzt möchte ich es gerne vernünftig machen.
1) SLE sind ja per "Name based linkage" direkt mit einem Feld vom Server verbunden. Manchmal verliert ein SLE den Server und wird nicht mehr aktualisiert.
2) Ich habe auf meinem DataWindow diverse bBrowser mit den zugehörigen Daten. Wenn nun in einem Unterfenster Daten geändert werden, aktualisiert sich der bBrowser nicht immer. Selbst wenn ich im Hauptfenster hin und her skippe bleibt der Datensatz unverändert. Z.B. ich habe einen Lagerartikel der mir die dazugehörigen Bestellungen anzeigt. Nach dem eine neue Bestellung eingegeben wurde, sollte sich der Browser ändern. Entweder wenn mein Fenster den Focus erhält oder ich skip(1) und skip(-1) mache. Ich muss das Fenster schließen und wieder öffnen.
Mit diesen vielen wilden Methoden hat es am Ende geklappt.
An welcher Stelle und wie sollte die Aktualisierung erfolgen? Ich möchte den ganzen unnötigen Code rausschmeißen.
Mein Konzept beruht darauf, dass meine Eingabefelder gesperrt sind. Bei New, Change und Copy werden sie freigegeben und bei Cancel und Save wieder gesperrt. Die Eingaben werden in einem Array verwaltet
_alle_felder:={ {oDCBestellnr ,#bestellnr ,0 ,FALSE, "Bestellnummer" },;
{oDCbestellda ,#bestellda ,4 ,FALSE, "Bestelldatum" },;
Usw.
Variable über ein weiteres Arry z.B. für Variablen im Hintergrund, Checkboxen, Auswahl Combobox usw.
_alle_vari:={ {NIL ,#art ,FALSE, "Auftragsart" },; // 1
{NIL ,#ku_artnr1 ,TRUE, "Artikelbez.1" },; // 2
Usw.
Alles gesteuert über allgemein Speichermethoden wie AllPshSave() sowie IsMethod() und send()
Zu 1) Ich habe eine SLEServer Klasse der ein Server zugeordnet ist um bei einer Eingabe „on the fly“ den Text mit dem entsprechenden Server abzugleichen. Also Eingabe von einem Auftrag wo der Kunde in der Kundendatei vorhanden sein muss.
Diese SLEServer verliert das „Name based linkage“. Ich versuche es mit folgenden Code den ich beim speichern aufrufe. Es klappt aber nicht immer.
_alle_Felder[5,1]:server:close()
_alle_Felder[5,1]:linkDF(SELF:server,SELF:server:FieldPos(#Vertreter))
Zu 2) Verschiedene Methoden werden über die allgemeine Speicherroutine aufgerufen. Teilweise sogar doppelt. Zusätzlich noch über Activate. Über einen Kenner versuche ich Änderungen abzufangen den ich setze, wenn ich ein anderes Fenster aufrufe. Änderungen von einem anderen Fenster bzw. Rechner werden so nicht erfasst. Ich versuche über mehrere Methoden Server zu schließen, zu zerstören und wieder zu öffnen. Ich skippe hin und her (Skip1)/Skip(-1) usw. odb_Save_Kun_Anfrage :close(), odb_Save_Kun_Anfrage := null_object, SELF:server:skip(0), SELF:server:refresh(), Neuaufbau aller Server und Browser usw.
Ein heilloses Durcheinander was nur unser System langsam macht.
Gibt es eine Funktion die abfragt ob sich der Server verändert hat oder so ähnlich?
IschangeServer(oServer)== true oder so ?
Ich habe auch die Methode Notify() gefunden. Wie binde ich die Kommunikation zwischen dem Fenster bzw. Server ein.
Wo finde ich ein Beispiel?
Danke Martin
Ich benötige mal eine Empfehlung wie ich meine 2 Probleme vernünftig lösen kann.
Das VO Programm wächst seit 25 bis 30 Jahren, nur für unsere Firma. Ich habe immer wieder 2 Probleme die ich mit den wildesten Methoden versucht habe zu beseitigen. Jetzt möchte ich es gerne vernünftig machen.
1) SLE sind ja per "Name based linkage" direkt mit einem Feld vom Server verbunden. Manchmal verliert ein SLE den Server und wird nicht mehr aktualisiert.
2) Ich habe auf meinem DataWindow diverse bBrowser mit den zugehörigen Daten. Wenn nun in einem Unterfenster Daten geändert werden, aktualisiert sich der bBrowser nicht immer. Selbst wenn ich im Hauptfenster hin und her skippe bleibt der Datensatz unverändert. Z.B. ich habe einen Lagerartikel der mir die dazugehörigen Bestellungen anzeigt. Nach dem eine neue Bestellung eingegeben wurde, sollte sich der Browser ändern. Entweder wenn mein Fenster den Focus erhält oder ich skip(1) und skip(-1) mache. Ich muss das Fenster schließen und wieder öffnen.
Mit diesen vielen wilden Methoden hat es am Ende geklappt.
An welcher Stelle und wie sollte die Aktualisierung erfolgen? Ich möchte den ganzen unnötigen Code rausschmeißen.
Mein Konzept beruht darauf, dass meine Eingabefelder gesperrt sind. Bei New, Change und Copy werden sie freigegeben und bei Cancel und Save wieder gesperrt. Die Eingaben werden in einem Array verwaltet
_alle_felder:={ {oDCBestellnr ,#bestellnr ,0 ,FALSE, "Bestellnummer" },;
{oDCbestellda ,#bestellda ,4 ,FALSE, "Bestelldatum" },;
Usw.
Variable über ein weiteres Arry z.B. für Variablen im Hintergrund, Checkboxen, Auswahl Combobox usw.
_alle_vari:={ {NIL ,#art ,FALSE, "Auftragsart" },; // 1
{NIL ,#ku_artnr1 ,TRUE, "Artikelbez.1" },; // 2
Usw.
Alles gesteuert über allgemein Speichermethoden wie AllPshSave() sowie IsMethod() und send()
Zu 1) Ich habe eine SLEServer Klasse der ein Server zugeordnet ist um bei einer Eingabe „on the fly“ den Text mit dem entsprechenden Server abzugleichen. Also Eingabe von einem Auftrag wo der Kunde in der Kundendatei vorhanden sein muss.
Diese SLEServer verliert das „Name based linkage“. Ich versuche es mit folgenden Code den ich beim speichern aufrufe. Es klappt aber nicht immer.
_alle_Felder[5,1]:server:close()
_alle_Felder[5,1]:linkDF(SELF:server,SELF:server:FieldPos(#Vertreter))
Zu 2) Verschiedene Methoden werden über die allgemeine Speicherroutine aufgerufen. Teilweise sogar doppelt. Zusätzlich noch über Activate. Über einen Kenner versuche ich Änderungen abzufangen den ich setze, wenn ich ein anderes Fenster aufrufe. Änderungen von einem anderen Fenster bzw. Rechner werden so nicht erfasst. Ich versuche über mehrere Methoden Server zu schließen, zu zerstören und wieder zu öffnen. Ich skippe hin und her (Skip1)/Skip(-1) usw. odb_Save_Kun_Anfrage :close(), odb_Save_Kun_Anfrage := null_object, SELF:server:skip(0), SELF:server:refresh(), Neuaufbau aller Server und Browser usw.
Ein heilloses Durcheinander was nur unser System langsam macht.
Gibt es eine Funktion die abfragt ob sich der Server verändert hat oder so ähnlich?
IschangeServer(oServer)== true oder so ?
Ich habe auch die Methode Notify() gefunden. Wie binde ich die Kommunikation zwischen dem Fenster bzw. Server ein.
Wo finde ich ein Beispiel?
Danke Martin