Das Notes Forum
Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: jr am 25.11.03 - 14:33:56
-
Hallo zusammen,
in einer Web-Datenbank habe ich ein ganz seltsames Problem:
Eine Maske soll über einfache Felder (Berechnet zur Anzeige) sprachabhängig sein, d. h. es gibt einfache Formeln der Art "wenn Sprache = Deutsch dann Adresse sonst Address". So oder so ähnlich. Die Begriffe werden aus einem Konfigurationsdokument gelesen was auch alles einwandfrei funktioniert.
Jetzt soll es aber möglich sein, mit Aktionsknöpfen zwischen den Sprachen hin- und herzuschalten. Und da gibt es Problem. Mittlerweile habe ich wahrscheinlich 20 verschiedene Ansätze versucht, alle mit dem gleichen Ergebnis. Nach dem Refresh hat er manchmal die richtige Sprache und manchmal nicht. Wenn ich ein manualles Aktualisieren des Frames im Browser mache, stimmt es immer.
Die Aktionsknöpfe sehen sinngemäß folgendermaßen aus:
@SetProfileField("Sprachprofil"; "Sprache"; "Deutsch"; @Username);
@Command([ViewRefreshFields]);
""
In der Maske lese ich die Sprache in einem Feld so aus:
@GetProfileField("Sprachprofil"; "Sprache"; @UserName)
Sieht eigentlich alles ganz easy aus, aber es klappt halt nur manchmal. Wenn ich so zwischen Deutsch und Englisch hin und herschalte, dann geht es zwei, drei mal gut, und dann bleibt dreimal Deutsch stehen und dann geht es wieder, usw...
Das Sprachfeld zeigt eine Sprache an. Wenn ich mir das Profildokument dann gleichzeitig im Notes ansehe, ist es aber geändert. Anscheinend hat das der Web-Browser oder der Notes-Server nicht mitbekommen.
Anstatt mit Profildokumenten habe ich es auch schon mit Konfigurationsdokumenten versucht. Weil ich dachte, es liegt vielleicht an der Geschwindigkeit zwischen @Set... und @GetProfileField habe ich eine Warteschleife eingebaut. Und, und, und... Hat alles nichts genützt immer wieder das gleiche Problem.
Hat schon einmal jemand so ein Problem gehabt und kann mir einen Lösungsvorschlag geben? Wäre echt nett, wenn mir da jemand helfen könnte.
Viele Grüße,
JR
-
ich weiß es zwar nicht aber einen versuch ist es doch wert..
vielleicht ist das ein cache probelm des browsers?
probier mal auf der seite dieses meta tag unterzubringen
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
vielleicht hilfts :-)
Grüße
-
Danke,
die idee mit dem Pragma-Tag war gut, habe sie auch gleich ausprobiert - funktioniert leider trotzdem nicht.
JR
-
Scheint mir eher ein Server-Caching problem zu sein, aber das müsste man im Serverdokument abstellen, ob das Sinn macht, ist fraglich.
Andere Frage: Warum rufst Du bei Sprachwechsel nicht ein neues/anderes Dokument auf oder verwendest eine andere Maske? Das dürfte ein eventuelles Server-Cache Problem wahrscheinlich umgehen
-
Der Kunde möchte dies über Konfigurationsdokumente lösen, weil dadurch jederzeit neue Sprachen hinzugefügt werden können, ohne ins Design zu wechseln. Ein neues Dokument öffnen ist so leider auch nicht möglich, weil der Anwender ja bereits ein paar Felder gefüllt haben kann.
Aber zur Idee mit dem Server-Cache: wo kann man das einstellen? Da gibt es ja dutzende Felder, die etwas mit dem cachen zu tun haben.
Im Voraus vielen Dank,
JR
-
Sorry, kann ich im Moment auch nicht sagen .... bin immer zwischen zwei Testläufen hier drin und dazwischen eilt es ....
Müsste irgendwo unter den HTTP-Einstellungen sein ....
-
Kannst Du das ganze nicht über Java Script lösen? Setzen der entsprechenden Strings hierüber? Dann muss das Dokument auch nicht neu geladen werden und die Informationen bleiben erhalten.
-
Sicher besser, als den Servercache zu manipulieren
-
Anstelle von Feldern kannst Du auch berechneten Text verwenden - mit den gleichen Formeln.
Ansonsten gibt es unter R6 noch die Funtkion @SetHTTPHeader. Damit kann man das Caching beeinflussen.
Andreas
-
@Ghandi,
ich wüsste im nicht, wie ich auf ein Konfiguraitonsdokument über Java-Script zugreifen kann. Ich müsste wahrscheinlich erst die richtigen Sprach-Werte in ein Feld laden, wozu aber wieder auf das Profildokument zugegriffen werden muss, und dann habe ich wieder das gleiche Problem...
@Glombi,
auch mit berechnetem Text habe ich das gleiche Problem. Im Browser dürfte da wohl kein Unterschied zwischen berechnten Feldern und berechnetem Text bestehen.
Das Problem ist ja, dass der Wert des Profildokuments nicht richtig gezogen wird.
JR
-
Warum lädst Du nicht die infragekommenden Phrasen in verschiedenen Sprachen - ist nur Text - und wenn es nicht exorbitant viel ist sollte das kein Problem sein.
-
Das wäre wahrscheinlich möglich. Aber es sind schon zwei Felder mit Namen vorhanden, deren Auswahlliste so groß ist, dass Anpassungen an beiden nicht mehr möglich waren, weil das Feld zu groß wurde.
Außerdem würde damit das eigentliche Problem nicht gelöst: Auch wenn ich alle Daten in einem Feld habe, brauche ich den Wert aus dem Profildokument, der mir sagt, welche Werte ich brauch. Und der ist halt manchmal falsch...
JR
-
Hast Du schon
@Command([ReloadWindow] )
probiert?
Du sagtest ja, dass ein manuelles Laden des Rahmens funktioniert.
Andreas
-
Hatte ich bisher noch nicht versucht. Klappt aber leider auch nicht. Auch mit @Command([RefreshWindow]) funktioniert es nicht.
Wenn ich mit der rechten Maustaste in das Browserfenster klicke und "Aktualisieren" wähle, dann stimmt es... ??? ??? ???
JR
-
Du darfst aber keine Profile verwenden, da die während der Browsersitzung gecached werden.
-
Wie gesagt, habe ich es auch schon ohne Profildokumente versucht, mit dem gleichen Ergebnis.
Die Idee war:
Ein Konfigurationsdokument "Sprache" enthält für jeden Benutzer einen Eintrag der Form
Vorname Nachname=Sprache
z. B.
Donald Duck=Englisch
Gustav Gans=Deutsch
Der Code in den Aktionen:
all := @DbLookup("":"NoCache"; "":""; "viewConfig"; "Sprache"; 2);
id := @DbLookup("":"NoCache"; "":""; "viewConfig"; "Sprache"; 3);
user := @Name([CN]; @UserName);
lang := @Trim(@Right(all; user + "="));
old := @Trim(@Replace(all; user + "=" + lang; ""));
@SetDocField(id; "value"; (user + "=" + "Deutsch") : old);
@Command([ReloadWindow]);
""
Der Code in der Maske:
all := @DbLookup("":"NoCache"; "":""; "viewConfig"; "Sprache"; 2);
user := @Name([CN]; @UserName);
lang := @Trim(@Right(all; user + "="));
@If(lang != ""; lang; "Deutsch")
Klappt aber auch nicht. Anscheinend kann ich nichts verändern, was ich kurz danach wieder auslesen möchte?
Also, so langsam bin ich am verzweifeln..
JR
-
Sehe ich das richtig, dass Du die Spracheinstellungen für alle Anwender in einem einzigen Konfig-Dokument machst? Das gibt aber bestimmt Speicherkonflikte. Ausserdem könnte das Textfeld mit den Namen und Sprachen größer 32 K werden.
Besser und performanter wäre es, pro Anwender ein Konfig.-Dokument zu machen.
Wie sieht denn der Code für die Felder aus, bswp. Adresse?
Ausserdem würde ich mal folgendes machen:
@SetDocField(id; "value"; (user + "=" + "Deutsch") : old);
@Command([ReloadWindow]);
@Command([ViewRefreshFields]);
oder
@SetDocField(id; "value"; (user + "=" + "Deutsch") : old);
@Command([ViewRefreshFields]);
@Command([ReloadWindow]);
Andreas
-
Zuerst einmal vielen Dank für die vielen Tipps.
Ich habe bereits alle Kombinationen mit ReloadWindow, RefreshWindow und ViewRefreshFields durchprobiert - klappt alles nicht. Auch mehrere Aufrufe hintereinander ändern nichts.
Mit dem Konfigurationsdokument hast Du sicher recht. Das würde ich so auch nicht ausliefern, aber es war nur ein weiterer Test, weil das mit den Profildokumenten nicht geklappt hat. Aber ich denke, wenn es mit einem Konfigurationsdokument nicht klappt wird es mit mehreren wohl auch nicht klappen.
Das ursprüngliche Problem ist und bleibt das Einlesen des Sprachwertes, der gerade zuvor erst gespeichert wurde (Dokument, Profildokument, Environment (geht nicht im Web), ...).
Danke,
JR
-
Hast Du eine Möglichkeit, das mal unter einem R5 Server zu testen. Ich habe die leidvolle Erfahrung gemacht, dass der HTTP Task in R6 "überoptimiert" wurde.
Dazu hatte ich bzgl @SetHTTPHeader mal was gepostet. Siehe
http://www.atnotes.de/index.php?board=2;action=display;threadid=10961;start=0
Andreas
-
Einen R5-Server habe ich seit letzter Woche nicht mehr, da habe ich jetzt endlich umgestellt. Nur noch R6 bzw. R6.5 (auf Windows und Linux).
Würde aber auch nichts nutzen. Ich kann kaum von meinem Kunden verlangen, dass er seine R6-Server wieder abstellt... ;)
Das mit dem @SetHTTPHeader("Expires"; "0") habe ich auch getestet. Dut ach net.
JR