DataWindow, Server, Browser

Deutschsprachiges X#-Forum – German language forum

Moderator: wriedmann

Post Reply
Tudorf
Posts: 50
Joined: Wed Feb 08, 2023 3:43 pm

DataWindow, Server, Browser

Post by Tudorf »

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
User avatar
wriedmann
Posts: 4018
Joined: Mon Nov 02, 2015 5:07 pm
Location: Italy

Re: DataWindow, Server, Browser

Post by wriedmann »

Hallo Martin,
ohne den entsprechenden Code zu sehen ist es schwierig, hier was zu sagen.
Die Methode Notify() des DataServers informiert alle zugeordneten Server, wenn sich was geändert hat. Das sollte aber eigentlich automatisch bei jeder Änderung am Satz bzgl. Wert und Positionierung der Fall sein.
Allerdings habe ich in meinem Code festgestellt, dass ein LinkDF() eines einzelnen Feldes nicht immer eine zuverlässige Verknüpfung herstellt, und entsprechende Notify-Aufrufe manchmal unterbleiben.
Wegen der Verknüpfung von zwei DBServer-Objekten: machst Du das mit SetSelectiveRelation()?
Wolfgang
Wolfgang Riedmann
Meran, South Tyrol, Italy
wolfgang@riedmann.it
https://www.riedmann.it - https://docs.xsharp.it
Tudorf
Posts: 50
Joined: Wed Feb 08, 2023 3:43 pm

Re: DataWindow, Server, Browser

Post by Tudorf »

Hallo Wolfgang

Die bBrowser sind wie folgt eingebunden.
// PDFKundendaten
SELF:BbrowserPDFKunde:use( _odbpdfLager,,{})
SELF:setSelectiveRelation(SELF:BbrowserPDFKunde,#artikel)

Läuft Notfy() selbstständig ? Muss man das Einbinden?

Martin
User avatar
wriedmann
Posts: 4018
Joined: Mon Nov 02, 2015 5:07 pm
Location: Italy

Re: DataWindow, Server, Browser

Post by wriedmann »

Hallo Martin,
normalerweise sollten die Notify()-Aufrufe automatisch laufen, es gibt nur seltene Fälle, wo man nachhelfen muss.
Ich würde das Use() erst nach dem SetSelectiveRelation() machen, und die nächste Frage wäre: wird der Order im untergeordneten Server richtig gesetzt, und wie schaut der Index-Ausdruck aus?
Wolfgang
Wolfgang Riedmann
Meran, South Tyrol, Italy
wolfgang@riedmann.it
https://www.riedmann.it - https://docs.xsharp.it
g.bunzel@domonet.de
Posts: 99
Joined: Tue Mar 01, 2016 11:50 am
Location: Germany

Re: DataWindow, Server, Browser

Post by g.bunzel@domonet.de »

Hallo Martin,

die Beschreibung deiner Abläufe im Programm lesen sich doch recht wild nach einem Workaround zu einem Workaround.
So etwas wird auf Dauer nicht sauber funktionieren und auch in der Zukunft schwer zu pflegen und bei der Weiterentwicklung sein.
Wir verwenden auch DataWindows, bBrowser und dbServer seit sehr vielen Jahren und haben mit der Verarbeitung der Daten oder auch bei der Aktualisierung im bBrowser keine Probleme.

>Läuft Notfy() selbstständig ?
Ja. Auf ein Notify() zu reagieren oder selbst so eine Nachricht auszulösen ist nur in sehr seltenen, besonderen Fällen erforderlich.

>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.
Nur mit einem Skip() im bBrowser wird nicht die gesamte Tabelle aktualisiert. Dafür gibt es oDCbBrowser:Refresh() oder oDCbBrowser:Refresh(#RefreshBuffer) - je nach Bedarf.

Wie Wolfgang bereits geschrieben hat - ohne den Code zu sehen, ist das schwer zu beurteilen.

Gerhard
Tudorf
Posts: 50
Joined: Wed Feb 08, 2023 3:43 pm

Re: DataWindow, Server, Browser

Post by Tudorf »

Hallo

Danke ersteinmal.

Beim zusammenschreiben der Probleme ist mir bewusst geworden das es sich bei falschen bBrowseranzeigen um Änderungen in den Filteranzeigen handelt. Ich versuche dieses erstmal selber zu lösen.

Ich komme vieleicht später nochmal auf meine Frage zurück.

Martin
User avatar
ArneOrtlinghaus
Posts: 478
Joined: Tue Nov 10, 2015 7:48 am
Location: Italy

Re: DataWindow, Server, Browser

Post by ArneOrtlinghaus »

Die Benachrichtigungen zu falschen Zeitpunkten oder fehlende Benachrichtigungen zu richtigen Zeitpunkten haben uns auch viel und regelmäßig Ärger beschert.
Besonders problematisch sind ein angekoppelter Server zusammen mit einem angekoppelten Datawindow. Der Browser hat so viele Freiheitsmöglichkeiten in der Bewegung und bei der Aktualisierung.

In den Griff bekommen haben wir das nur, dass bei Editierung der Browser nicht benachrichtigt wird, bis die Editierung im Datawindow abgeschlossen ist und umgekehrt das Datawindow entweder absichtlich nicht benachrichtigt wird, bzw. die Änderungen von Singlelineedits nur in bestimmten Fällen abgespeichert werden.

Gruß
Arne
Post Reply