Autor Thema: Refresh fields in Script  (Gelesen 7002 mal)

Offline ewald

  • Aktives Mitglied
  • ***
  • Beiträge: 140
  • Geschlecht: Männlich
Refresh fields in Script
« am: 15.03.06 - 15:56:25 »
Hallo zusammen,
nachdem meine Suche erfolglos war hier mal die Frage zu meinem Problem:

Ich kopiere über einen Agent ein Doc

        Call docA.CopyAllItems( docB, True )

funktioniert.
Dann werden in dem neuen, kopierten Doc Felder geändert

        Call docB.ReplaceItemValue( "StartDateReq", Blank )
                                              :
                                              :
funktioniert.
Und am Ende vor dem Save

        Call docB.Save( True, True )

möcht' ich einen Refresh der Felder machen, und das haut irgendwie nicht hin. Hab schon alle möglichen Refreshs und Reloads probiert, krieg aber immer "Illegal use of property"
Welchen Refresh kann ich denn vor dem Save hier absetzen?

Grüsse Ewald

Offline m3

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.102
  • Geschlecht: Männlich
  • Non ex transverso sed deorsum!
    • leyrers online pamphlet
Re: Refresh fields in Script
« Antwort #1 am: 15.03.06 - 15:58:50 »
ComputeWithForm
HTH
m³ aka. Martin -- leyrers online pamphlet | LEYON - All things Lotus (IBM Collaborations Solutions)

All programs evolve until they can send email.
Except Microsoft Exchange.
    - Memorable Quotes from Alt.Sysadmin.Recovery

"Lotus Notes ist wie ein Badezimmer, geht ohne Kacheln, aber nicht so gut." -- Peter Klett

"If there isn't at least a handful of solutions for any given problem, it isn't IBM"™ - @notessensai

Offline ewald

  • Aktives Mitglied
  • ***
  • Beiträge: 140
  • Geschlecht: Männlich
Re: Refresh fields in Script
« Antwort #2 am: 15.03.06 - 16:07:11 »
Hy m3,

danke, funktioniert. Hab mir das mal in der Designer Help angeschaut Wenn ich das richtig verstanden hab, wird einfach alles neu berechnet.
Seh ich das richtig so?

Ewald

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Refresh fields in Script
« Antwort #3 am: 15.03.06 - 18:45:40 »
Das ist nicht ganz richtig, denn

Zitat
Validates a document by executing the default value, translation, and validation formulas, if any are defined in the document form.
Berechnete Felder fallen also ganz schlicht weg. Es gibt auch Troubles mit @dbColumns / @dbLookups und weitere Feinheiten.

Wenn Du sauber arbeiten willst, dann trenne FrontEnd-Funktionalität (= Maske) vom Backend und berechne explizit nach, was Dir erforderlich erscheint. Verlasse Dich NICHT auf ComputeWithForm!

Bernhard

Glombi

  • Gast
Re: Refresh fields in Script
« Antwort #4 am: 15.03.06 - 18:53:23 »
Hi Bernhard,

im Falle von ComputeWithForm ist die Designer Hilfe mal wieder falsch.

Es werden ALLE Formeln im Dokument neu berechnet. Falls bspw. ein neues Autorfeld (Berechnet beim Anlagen) mit der Formel @Username zur Maske hinzugefügt wird, wird mittels ComputeWithForm dieses Item sogar mit der Property AUTHOR erstellt.

Ich benutze ComputeWithForm oft, aber dann so:

call doc.Save( false, True )
call doc.ComputeWithForm( false, false )
call doc.Save( false, True, True )

Andreas

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: Refresh fields in Script
« Antwort #5 am: 15.03.06 - 19:06:41 »
Andreas, bist du dir da sicher?

Ich war der gleichen Meinung wie Bernhard. Und in einigen Fällen konnte ich schon beobachten, dass eben nicht alle Formeln berechnet wurden.

Ich bin der Ansicht, dass man ComputeWithForm nach wie vor mit Vorsicht genießen sollte.


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

Glombi

  • Gast
Re: Refresh fields in Script
« Antwort #6 am: 15.03.06 - 19:10:34 »
Andreas, bist du dir da sicher?

Ich war der gleichen Meinung wie Bernhard. Und in einigen Fällen konnte ich schon beobachten, dass eben nicht alle Formeln berechnet wurden.

Ich bin der Ansicht, dass man ComputeWithForm nach wie vor mit Vorsicht genießen sollte.


Axel

Na, ich bin sicher.
Selbst Änderungen des Feldtypen werden nachgezogen. Ich denke, IBM hat ab V6 einiges an der Funktion optimiert, denn früher war das zugegebenermaßen nicht so stabil.

Also bis heute habe ich keine negativen Erfahren gemacht (oder diese verdrängt ;-) )

Andreas

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Refresh fields in Script
« Antwort #7 am: 15.03.06 - 19:12:10 »
Zitat
Falls bspw. ein neues Autorfeld (Berechnet beim Anlagen) mit der Formel @Username zur Maske hinzugefügt wird, wird mittels ComputeWithForm dieses Item sogar mit der Property AUTHOR erstellt.

DAS funktioniert, Andreas. Ist ja auch ein neues Feld (was hier wegen CopyAllItems eher nicht ansteht, aber wer weiss ...).

Versuche einfach mal nur, ein neues Appointment-Doc in einem Mail-File zu erzeugen und mit ComputeWithForm wirklich alle Items nachberechnen zu lassen. Viel Vergnügen, kann ich da nur sagen  ;D Gerade ab R6! Die Items, die dabei vorab belegt sein müssen (bzw. sollten), sind dann auch noch zwischen den einzelnen Releases unterschiedlich - ComputeWithForm läuft immer erst ab anderen Stellen ohne Gemecker durch.
Du kennst ja mein herangehen an solche Probleme: Bei aller Systematik bleibt ComputeWithForm nur für allereinfachste Fälle brauchbar. Es tut auf jeden Fall nicht das, was ein F9 im Frontend "von oben nach unten" ausführen würde.

Fazit: Ich verwende ComputeWithForm gar nicht mehr: Sind die Masken einfach, kann ich es auch selber machen. Sind sie kompliziert, muss ich immer mit dem Wasserstand des Chiemsees oder der Lunation rechnen ...

Bernhard

PS: Mit all doc.ComputeWithForm (False, False) bekommst Du ja noch nicht einmal eine Rückmeldung, ob das Ganze funktioniert hat ...

Glombi

  • Gast
Re: Refresh fields in Script
« Antwort #8 am: 15.03.06 - 19:13:12 »
Mal sehen, was die KBASE so an Issues liefert:


ComputeWithForm does not set the Summary flag for text fields over 15KB
Product:
Lotus Notes  >  Lotus Notes  >  Versions 6.0, 6.5
Platform(s):
Platform Independent
Doc Number:
1090219

When using the LotusScript ComputeWithForm method (of the NotesDocument class), the Summary flag is not set as expected with Text fields of certain sizes. It is not set in cases where the size of the field is greater than 15KB and less than the Notes Domino 6.0 maximum of 32KB. If the field is less than 15KB, calling the method works as expected.

Glombi

  • Gast
Re: Refresh fields in Script
« Antwort #9 am: 15.03.06 - 19:13:36 »
LotusScript Agent to Recalculate Documents on a Schedule
Product:
Lotus Notes  >  Lotus Notes  >  Versions 6.0, 5.0, 4.6, 4.5, 6.5
Platform(s):
Platform Independent
Doc Number:
1099014

Published   27.08.2004
Technote

Problem

How can you have documents recalculate in the background so that computed fields are up to date and accurate?  For example, a database has documents that do @DbLookups, @DbColumns, etc. to other documents that are occasionally updated with new information.  If a document is opened, @Db formulas will not recalculate until you press F9; therefore, the data may not be accurate.

Solution
The following script can be run as a scheduled agent to 'tickle' and save documents on the back end.  The method that is actually doing the recalc is the ComputeWithForm method of the NotesDocument class. This method will recalculate @Db formulas only when run on Notes 4.5a (and above) clients and servers.

Note:  If a form contains a Computed field (for example, a field called "Count") with a formula which is based on its own field value (for example, "Count+1"), then the ComputeWithForm method is not suitable for use in refreshing that document.  This is because the ComputeWithForm method triggers recalculation twice.  For more information on this topic see the related document, "Is it Possible to Refresh Documents Using LotusScript ?" (#1092630).


IMPORTANT NOTE:  The following is a sample script, provided only to illustrate one way to approach this issue.  Notes Support will not be able to customize this script for a customer's own configuration.

Sub Initialize
     Dim session As New NotesSession
     Dim db As NotesDatabase
     Dim collection As NotesDocumentCollection     
     Dim doc As NotesDocument
     
     Set db=session.currentDatabase
     Set collection=db.AllDocuments
     Set doc=collection.GetFirstDocument
     Do Until doc is Nothing
          Call doc.ComputeWithForm(False,False)     
          Call doc.save(False,False)
          Set doc=collection.GetNextDocument( doc )
     Loop

   

Related Documents:

Is it Possible to Refresh Documents Using LotusScript ?
Document #:   1092630    (176609)


Glombi

  • Gast
Re: Refresh fields in Script
« Antwort #10 am: 15.03.06 - 19:15:52 »
@Bernhard: Ich tippe mal, dass im Frontend durch F9 einige Script-Events getriggert werden, die tonnenweise Felder setzen/manipulieren.

DAS kann ComputeWithForm natürlich nicht.

Ich lasse das auch nur auf Anwendungen los, die ich selbst gestrickt habe bzw. von denen ich weiß, was da genau abgeht. Ich glaube, vom Mail kann ich das nicht behaupten  ;D

Andreas
« Letzte Änderung: 15.03.06 - 19:17:38 von Glombi »

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Refresh fields in Script
« Antwort #11 am: 15.03.06 - 19:27:20 »
Ich lasse das auch nur auf Anwendungen los, die ich selbst gestrickt habe bzw. von denen ich weiß, was da genau abgeht. Ich glaube, vom Mail kann ich das nicht behaupten  ;D

Gut gebrüllt, Löwe  ;D

A-Bär: ComputeWithForm scheitert bei Appointments (wenn man es an der falschen und releaseabhängig falschen Stelle einsetzt), sprich: Es wirft einen Fehler. Mit den LS-Events kann das nun nicht zusammenhängen.

Vulgo: Bei eigenen Anwendungen verwende ich auch meine eigenen Update-Routinen und denke nicht mehr über ComputeWithForm nach. Einsetzbare Fälle kann ich mir aber vorstellen.

Und: Vielen Dank für die KBase-Recherchen. Das war sehr interessant.

Bernhard

Offline Tode

  • Moderatoren
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 6.885
  • Geschlecht: Männlich
  • Geht nicht, gibt's (fast) nicht... *g*
Re: Refresh fields in Script
« Antwort #12 am: 16.03.06 - 13:09:56 »
muss ich auch noch meinen Senf dazugeben.

Ich habe mal einen Beitrag zum "kontrollieren" der ComputeWithForm geschrieben (ist sicher noch irgendwo auffindbar).

Zusammenfassend ist zu sagen:
ComputeWithform ist ein wenig "empfindlicher" als das Frontend: wenn hier Felder z.B. nicht mit dem richtigen Feldtyp gesetzt sind, dann bricht der gerne mal ab. man erkennt das daran, dass alle Felder über dem betroffenen Fehlerhaften Feld neu berechnet wurden, und alle darunter nicht.
Er geht also durchaus "von oben nach unten, von links nach rechts" wie ein F9 im Frontend.

ABER: eine ganz grosse Einschränkung hat er seit R6: Computed for Display- Felder werden nicht mehr berücksichtigt. In R5 war es so, dass Formeln basierend auf Computed for Display- Feldern korrekt berechnet wurden, inzwischen ist es als ob das Feld nicht existiert (was im Backend ja auch korrekt ist). Deshalb die manchmal "seltsamen" Ergebnisse des ComputeWithForm.

Im Grossen und ganzen ist zu sagen, dass ich es ab und zu als "Quick&Dirty"- Methode verwende um Dokumente neuzuberechnen, und meistens funktioniert es einwandfrei (oben genannte Bedingungen ausgeschlossen), aber wenn es nur um wenige Felder geht, dann programmiere ich deren Formeln lieber in einem Formel- Agenten bzw. Script- Agenten nach.

Besonders bei grossen Datenmengen kann man so schon mal die ein oder andere Stunde Agentenlauf verhindern...

Gruss
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)

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: Refresh fields in Script
« Antwort #13 am: 06.11.06 - 10:56:13 »
Ich kann das bei mir auch nachvollziehen,
Berechnete Felder mit @DBLookup oder @DBColumn werden bei ComputeWithForm definitiv nicht berechnet.

Echt ein Sch***

Aber gut, dass hier schon darüber diskutiert wurde, das verschafft mir die Gewissheit, dass deer Fehler nicht bei mir zwischen den Ohren liegt ;-)

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

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz