Autor Thema: Datensätze mit der Maske berechnen (Refresh)  (Gelesen 5419 mal)

Jörg P

  • Gast
Datensätze mit der Maske berechnen (Refresh)
« am: 01.03.11 - 09:17:35 »
Hallo zusammen,

ich habe ein Script, mit dem Daten aus einer TXT- oder Excel-Datei eingelesen und
in den Datensätzen gespeichert werden. Anschließend sollen die Datensätze mit Hilfe
der Maske neu berechnet werden, da sich verschiedene berechnete Felder in der
Maske befinden. Hier ein Auszug aus dem Script:

...
Set docsuche = Viewsuche.GetDocumentByKey ( suchNr, True)
...
docsuche.FeldName = "neuer Wert"
...
Call docsuche.Save( True, True )

Kann ich dass per Script darstellen, ohne alle Berechnungen aus der Maske im Script zu wiederholen?
Oder ist der Ansatz falsch?

Für einen Denkansatz wäre ich sehr dankbar!!!



Offline udo187

  • Junior Mitglied
  • **
  • Beiträge: 98
Re: Datensätze mit der Maske berechnen (Refresh)
« Antwort #1 am: 01.03.11 - 09:29:23 »
Hallo !

Ich denke "ComputeWithForm"  kann dir helfen !

LG
Udo

Offline Axel

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.658
  • Geschlecht: Männlich
  • It's not a bug, it's Notes
Re: Datensätze mit der Maske berechnen (Refresh)
« Antwort #2 am: 01.03.11 - 09:48:52 »
Hallo !

Ich denke "ComputeWithForm"  kann dir helfen !

LG
Udo


Da denkst du leider falsch. ComputeWithForm wirkt sich nicht auf die Formeln in berechneten Felder aus.

Kann ich dass per Script darstellen, ohne alle Berechnungen aus der Maske im Script zu wiederholen?

Dir wird nichts anderes übrigbleiben als die Berechnungen nachzubilden.

Axel
Ohne Computer wären wir noch lange nicht hinterm Mond!

Jörg P

  • Gast
Re: Datensätze mit der Maske berechnen (Refresh)
« Antwort #3 am: 01.03.11 - 10:04:23 »
Hallo Udo,
hallo Axel,

vielen Dank für die schnellen Antworten!

"ComputeWithForm" hatte ich auch schon gefunden, doch die Hilfe hat nichts von berechneten Felder gesagt.
Daher klappt das nicht.

Besteht die Möglichkeit, über "uidoc.refresh" an die Berechnung zu kommen, oder ist das der falsche Weg?!?

Viele Grüße

Jörg


Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: Datensätze mit der Maske berechnen (Refresh)
« Antwort #4 am: 01.03.11 - 10:15:49 »
uidoc ist Frontend, Du wirst beim Import sicher nicht die Dokumente geöffnet haben (falls es ein periodischer Import ist, geht das sowieso nicht).

Hast Du ComputeWithForm ausprobiert, oder nur wegen der Beschreibung darauf verzichtet? Ich nutze das bei einem berechneten Feld (berechnet beim Anlegen), und da funktioniert es.

Jörg P

  • Gast
Re: Datensätze mit der Maske berechnen (Refresh)
« Antwort #5 am: 01.03.11 - 10:33:22 »
Hallo Peter,

ComputeWithForm habe es ausprobiert. Es funktioniert nicht. Die berechneten Felder stehen allerdings auf "berechnet" und nicht auf "berechnet beim Anlegen". Ob das einen Unterschied macht, weiß ich nicht.

Der Import wird vom User gestartet, es ist kein periodischer Agent. Die Datensätze sind nicht im Frontend, sie werden im Backend geschrieben. Da ich aber keinen anderen Befehl finde, dachte ich mir, es ist vielleicht möglich, die Datensätze anschließend im Agenten über den Befehl uidoc.refresh "nachzubearbeiten". Ob das aber sinnvoll ist, weiß ich nicht.

Viele Grüße

Jörg

Offline oxyd21

  • Senior Mitglied
  • ****
  • Beiträge: 371
  • Geschlecht: Männlich
Re: Datensätze mit der Maske berechnen (Refresh)
« Antwort #6 am: 01.03.11 - 10:53:14 »
Ob das aber sinnvoll ist, weiß ich nicht.
Meistens nicht. Warum legst du nicht alles ins Backend. Die Berechnung erfolgt schön beim Import und Änderungen im Frontend kannst z.B. beim QuerySave auch damit berechnen.

VG, Michael

Offline atbits

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 708
  • Geschlecht: Männlich
  • sei Du selbst die Veränderung, die Du Dir wünschst
    • atBits
Re: Datensätze mit der Maske berechnen (Refresh)
« Antwort #7 am: 01.03.11 - 10:58:39 »
Meiner Meinung nach ist das nicht nur nicht sinnvoll,
sondern schlichtweh unmöglich in einem Backend-Agent ein uidoc.refresh zu machen.

Zumindest wenn es sich bei uidoc um ein Objekt der Klasse NotesUIDocument handelt...

Grüße David
David Schiffer
================================
atBits GmbH & Co. KG - https://atbits.de
im Einsatz: Lotus Domino 8.5, 9, 10

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: Datensätze mit der Maske berechnen (Refresh)
« Antwort #8 am: 01.03.11 - 10:59:58 »
Es liegt sicher nicht an berechnet oder berechnet beim Anlegen, sondern an der Komplexität der Berechnungen, in meinem Fall ist es eine ganz simple Formel, die funktioniert.

uidoc.Refresh geht nur, wenn das Dokument geöffnet ist. Um das unzusetzen, müsstest Du das importierte Dokument öffnen, refreshen, speichern und schließen. Mit einer handvoll Dokumenten geht das, aber wenn es zu viele werden, fliegt Dir der Client um die Ohren. Habe für solch eine ähnliche Aktion (kein Import, aber uidoc notwendig) mal eine funktionierende Zahl von ca. 40 Dokumenten ermittelt (allerdings unter Notes 7). Bis dahin könntest Du das probieren. Der Vorteil wäre ganz klar, die doppelte Erstellung der Berechnungsmethode im Import und im Dokument läuft Dir bei Updates irgendwann auseinander.

Michaels Hinweis, die Berechnung in Script auszulagern, ist, wenn möglich, natürlich die beste Option. In gewachsenen Anwendungen kann das aber eine ziemlich große Baustelle werden ...

Mitch

  • Gast
Re: Datensätze mit der Maske berechnen (Refresh)
« Antwort #9 am: 01.03.11 - 11:09:10 »
Würde ein Agent (Ziel: Alle neuen oder geänderten Dokumente) mit @Command([ToolsRefreshSelectedDocs]) funktionieren?

Oder könnte man den nicht aus dem Backend anstoßen? Der Befehl aktualisiert doch auch berechnete Felder oder nicht?

Gruß,

Mitch

Offline oxyd21

  • Senior Mitglied
  • ****
  • Beiträge: 371
  • Geschlecht: Männlich
Re: Datensätze mit der Maske berechnen (Refresh)
« Antwort #10 am: 01.03.11 - 11:13:32 »
Das hört sich jetzt für mich wie unterste Trickkiste an...
Wenn nur eine Person mit der DB arbeitet wäre das vielleicht noch akzeptabel tolerierbar, aber bei mehreren Usern sollte das keine Lösung sein.

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: Datensätze mit der Maske berechnen (Refresh)
« Antwort #11 am: 01.03.11 - 11:20:26 »
@Command([ToolsRefreshSelectedDocs]) wird deshalb schon nicht funktionieren, da keine Dokumente markiert sind. Dann müsste es schon @Command([ToolsRefreshAllDocs]) sein, aber da kann ich Michael nur zustimmen, das ist keine Lösung.

Mitch

  • Gast
Re: Datensätze mit der Maske berechnen (Refresh)
« Antwort #12 am: 01.03.11 - 11:24:45 »
@Command([ToolsRefreshSelectedDocs]) wird deshalb schon nicht funktionieren, da keine Dokumente markiert sind. Dann müsste es schon @Command([ToolsRefreshAllDocs]) sein, aber da kann ich Michael nur zustimmen, das ist keine Lösung.

@Command([ToolsRefreshSelectedDocs]) funktioniert wenn der Agent als Ziel die neuen/geänderten Dokumente hat. Die zählen dann als markiert.

Jörg P

  • Gast
Re: Datensätze mit der Maske berechnen (Refresh)
« Antwort #13 am: 01.03.11 - 11:28:13 »
Hallo,

Ich glaube auch, dass @Command([ToolsRefreshAllDocs]) nicht die richtige Lösung ist und uidoc.... auch nicht.
Axel's Ansatz, alle nötigen Berechnungen im Script abzubilden, ist die sicherste! So mach ich's.

Vielen Dank für Eure umfangreiche und schnelle Hilfe!!

Viele Grüße

Jörg

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: Datensätze mit der Maske berechnen (Refresh)
« Antwort #14 am: 01.03.11 - 11:29:53 »
@Command([ToolsRefreshSelectedDocs]) funktioniert wenn der Agent als Ziel die neuen/geänderten Dokumente hat. Die zählen dann als markiert.
Oh, danke, wieder was gelernt ...

Offline Tode

  • Moderatoren
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 6.885
  • Geschlecht: Männlich
  • Geht nicht, gibt's (fast) nicht... *g*
Re: Datensätze mit der Maske berechnen (Refresh)
« Antwort #15 am: 01.03.11 - 12:05:49 »
Also zunächst mal: Dass ComputeWithForm keine berechneten Felder kann ist Humbug.
Für Deine Frage ist das genau die richtige Methode.
Jetzt kommt das grosse ABER:

Man muss wissen, wie ComputeWithForm arbeitet, um nicht auf die Schnauze zu fallen:

Der Befehl arbeitet die Maske von oben nach unten ab. Läuft er an einer Stelle auf einen Fehler, dann wird der Rest der Maske nicht mehr berechnet.
Man hat also einen inkonsistenten Datensatz: Oberhalb des Fehlers berechnet, unterhalb des Fehlers nicht.

Ein "Fehler" kann dabei auch entstehen an Stellen, an denen der [ToolsRefreshSelectedDocuments] oder auch ein frontend- F9 keinen Fehler werfen: Die Formel- Sprache ist "Fehlertoleranter" und macht wesentlich mehr interne Typen- Umwandlungen als das im Backend passiert.

Ein Beispiel:
Wenn Du ein Datumsfeld über doc.ReplaceItemValue( "Feld" , "01.03.2011" ) befüllst, und dann das Dokument im Frontend (oder per ToolsRefresh) aktualisierst, dann klappt das alles, im Anschluss ist das Feld sauber mit einem Notes- Datumswert befüllt.

Rufst Du aber ComputeWithForm auf, dann wird er mit einem Fehler "Datum erwartet" abbrechen...

Deshalb muss man bei ComputeWithForm immer beide Parameter auf True setzen und den Fehler abfangen. Dummerweise ist die Meldung, die ComputeWithForm auswirft nicht sonderlich aussagekräftig, und das herausfinden, welches Feld den Fehler wirft, ist nicht immer trivial.
Ich bin schon ab und zu hingegangen und habe ein berechnetes Feld "Test" in meiner Maske eingefügt, das sich z.B. auf die aktuelle Uhrzeit berechnet.

Dann habe ich mir die oben genannte Eigenschaft zu Nutze gemacht und das Feld immer weiter in der Maske nach unten geschoben, bis es nach ComputeWithForm (beide Parameter auf False, da man sonst das Dokument nicht speichern kann) nicht mehr korrekt gefüllt war. Direkt oberhalb des Test- Feldes ist dann das fehlerhafte Feld.

Zu beachten ist also bei der Verwendung von ComputeWithForm folgendes:

1. Beide Parameter auf True setzen, sonst bekommt man inkonsistente Daten
2. Im Script alle Felder mit den richtigen Datentypen befüllen, sonst läuft ComputeWithForm eventuell auf einen Fehler
3. (optional) Die Formeln in der Maske "Bulletproof" machen, indem man z.B. in Datumsberechnungen auf gültige Datumswerte abfragt bzw. per @ToTime konvertiert und auch bei Zahlenberechnungen mit @ToNumber arbeitet, auch wenn man (eigentlich) erwartet, dass da immer ne Zahl drin steht
4. Es gibt einen Bug in ComputeWithForm in der Version 8.5.x: Wenn nicht VOR dem ComputeWithForm dem NotesDocument- Objekt mindestens 1 Wert zugewiesen wurde, dann tut ComputeWithForm schlicht und ergreifend nichts.
Code
set doc = db.GetDocumentByUnid( strUnid )
call doc.ComputeWithForm( True , True)
call doc.Save( True , True )

ändern NICHTS am Dokument

Code
set doc = db.GetDocumentByUnid( strUnid )
call doc.ReplaceItemValue( "IrgendeinFeld" , "irgeneinWert" )
oder
doc.IrgendeinFeld = "Irgendeinwert"
call doc.ComputeWithForm( True , True)
call doc.Save( True , True )

funktioniert.

In seltenen Fällen kann es auch sein, dass man die Maske gar nicht in den Griff bekommt. Dann hat man zwei Optionen:

1. Wirklich alle Formeln in Script nachprogrammieren (sehr aufwändig und ich muss zwei Stellen pflegen, wenn sich was ändert)
2. Eine "Compute- Maske" erstellen, die nur die Felder enthält, die ich neu berechnen will, eventuell als gemeinsame Felder, und dann
vor dem ComputeWithForm einfach die Maske über doc.ReplaceItemValue( "Form" , "Compute-Maske" ) umsetzen und nach dem ComputeWithForm wieder zurück auf die Original- Maske setzen

HTH
Tode
« Letzte Änderung: 01.03.11 - 15:24:51 von Tode »
Gruss
Torsten (Tode)

P.S.: Da mein Nickname immer mal wieder für Verwirrung sorgt: Tode hat NICHTS mit Tod zu tun. So klingt es einfach, wenn ein 2- Jähriger versucht "Torsten" zu sagen... das klingt dann so: "Tooode" (langes O, das r, s und n werden verschluckt, das t wird zum badischen d)

Jörg P

  • Gast
Re: Datensätze mit der Maske berechnen (Refresh)
« Antwort #16 am: 01.03.11 - 13:10:23 »
Hallo Tode,

danke für Deine Erklärungen zu ComputeWithForm.

Das hat geholfen - hätte ich so nicht aus der Hilfe rausgelesen...

Habe die Fehler anhand Deiner Infos gefunden - ich hatte einen Feldinhalt falsch übergeben...
Die anderen berechneten Felder werden anschließend auch wieder weiter berechnet.

Super! Danke Dir!!!

Gruß Jörg

Offline marschul

  • Senior Mitglied
  • ****
  • Beiträge: 280
  • Geschlecht: Männlich
Re: Datensätze mit der Maske berechnen (Refresh)
« Antwort #17 am: 01.03.11 - 13:17:45 »
@Tode:
Klasse Erklärung :) Die Idee mit dem "wandernden @Now-Feld" kann ich direkt benutzen, da ich auch auf der Suche nach einem Feld bin, welches Computewithform abbrechen lässt.

Gruß
Marco
Gruß
Marco

Ich, der ich weiß, mir einzubilden, dass ich weiß, nichts zu wissen, weiß, dass ich nichts weiß. (Sokrates)
Keiner ist unnütz, er kann immer noch als schlechtes Beispiel dienen. (unbekannt)

Offline udo187

  • Junior Mitglied
  • **
  • Beiträge: 98
Re: Datensätze mit der Maske berechnen (Refresh)
« Antwort #18 am: 01.03.11 - 14:08:10 »
Ende gut - alles gut mit  "ComputeWithForm"   :)

LG
Udo

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz