Das Notes Forum

Domino 9 und frühere Versionen => ND7: Entwicklung => Thema gestartet von: nikon am 02.05.07 - 12:39:50

Titel: ComputeWithForm
Beitrag von: nikon am 02.05.07 - 12:39:50
Hallo zusammen,

ich habe ein merkwürdiges(?) Problem:

Ich hatte vor, meine über nun lange Zeit gewachsenen Daten einer DB durch einen Agent refreshen bzw. neu validieren zu lassen. Da mir im Backend wohl der ComputeWithForm als einzige Möglichkeit bleibt, habe ich einmal einen Scriptagenten geschrieben, der mit besagter Methode alle Dokumente durchläuft. Per ErrorHandler schreibe ich dann die aufgetretenen Fehler in die Dokumente (nur erstmal zu Testzwecken).

Jetzt habe ich allerdings zum einen das Problem, dass er ausschließlich einen "4000 User-defined Error" in die betroffenen Dokumente schreibt. Wenn ich den ErrorHandler temporär deaktiviere, bekomme ich einen "Notes error: Eine Ansicht mit diesem Namen wurde in der angegebenen Datenbank nicht gefunden". Mich wundert dass diese eigentlich öfter auftretende Fehlermeldung keinen eigenen Fehlercode hat aber nungut. Ist auch eigentlich nicht weiter tragisch, denn es geht mir ja hauptsächlich darum, dass überhaupt ein Fehler existent ist. Das Problem kommt eigentlich erst, wenn ich versuche die markierten Dokumente zu bereinigen. Augenscheinlich ist nämlich gar kein Fehler da. Ich kann ein betroffenes Dok öffnen, refreshen, speichern, schließen... alles kein Problem. Wo kommt denn da der Fehler her?

Hat einer nen Tip für mich bitte?

Gruß Dirk
Titel: Re: ComputeWithForm
Beitrag von: Axel am 02.05.07 - 22:10:37
Das hört sich in der Tat etwas merkwürdig an.

Kommt der Fehler bei allen Dokumenten? Hast du in deiner Datenbank eine Vorgabeansicht definiert? Wie sieht denn dein Code zum Refreshen aus?

Axel

Titel: Re: ComputeWithForm
Beitrag von: koehlerbv am 02.05.07 - 23:32:34
ComputeWithForm ist zahlreichen Einschränkungen unterworfen und eigentlich eher ein Backend-Instrument (auch wenn etwas anderes impliziert wird). Suche mal hier im Forum nach dieser Methode ...

Ich verwende derzeit ComputeWithForm überhaupt nicht mehr. Um die Schwierigkeiten zu verdeutlichen: Lege mal in einer Mail-DB eines neues Dokument an und lasse es mit ComputeWithForm fertig berechnen. Ein Code, der das fehlerfrei aushält, würde mich auch sehr interessieren.

Bernhard
Titel: Re: ComputeWithForm
Beitrag von: nikon am 03.05.07 - 09:14:27
@Axel: Schön dass Du das auch so siehst. ;)
Nein, der Fehler tritt auch nicht bei allen Dokumenten auf. In der Datenbank sind knapp 2000 Dokumente und nur ~400 sind betroffen.
Ja, eine Vorgabeansicht ist definiert.
Gut also der Code ist eigentlich denkbar unspektakulär, aber ich stell ihn mal gerade rein.

Code
Function UpdateAll() As Boolean

	On Error Goto ErrorHandler

	Dim i As Long
	Dim doc As NotesDocument
	Dim acol As NotesDocumentCollection

	Set acol = cdb.AllDocuments
	If acol.Count = 0 Then Exit Function

	For i = 1 To acol.Count
		
		Set doc = acol.GetNthDocument( i )
		Call doc.ComputeWithForm( True, True )
		Call doc.Save( True, False, True )

	Next

	UpdateAll = True

	Exit Function

ErrorHandler:
	
	doc.updateprob = Cstr( Err ) + " " + Error( Err )
	Resume Next

End Function

@Bernhard: Was heißt das ist eher ein Backend-Instrument? Ich suche doch genau ein solches... ich habe den Verdacht, als hätten wir uns misverstanden. ;)


Gruß Dirk
Titel: Re: ComputeWithForm
Beitrag von: koehlerbv am 03.05.07 - 09:21:42
Backend-Instrument schon - aber es versucht Sachen aus dem Frontend zu erledigen. Wenn Du zum Beispiel ein Feld "computed for display" hast und auf Basis dieses Wertes in einem anderen Feld etwas berechnen musst, dann fällt das System "ComputeWithForm" schon auf die Schnauze.

Bernhard
Titel: Re: ComputeWithForm
Beitrag von: nikon am 03.05.07 - 09:51:10
Aber würde dann nicht auch der normale refresh, bzw speichern und schließen auf die Schnauze fallen? Weiß gar nicht mehr genau wie das war... ich benutze eigentlich immer berechneten Text, wenn ich etwas nur zur Anzeige brauche.

Ich habe zwar die Maske schonmal auf Ungereimtheiten untersucht, aber nichts gefunden. Das mache ich aber gleich zur Sicherheit noch einmal. Vielleicht habe ich etwas übersehen...

Beim schreiben fällt mir aber gerade mal so auf... bei einem solchen Fehler in der Maske würden doch ALLE Dokumente diesen Fehler bringen und nicht nur ca. 400 oder?!


Gruß Dirk
Titel: Re: ComputeWithForm
Beitrag von: ata am 03.05.07 - 10:59:11
... der Fehlermeldung nach versucht er auf eine Ansicht zuzgreifen, die es nicht mehr gibt. Hast du in den Masken Lookups, oder DBColumns verbaut, die eventuell so etwas verursachen könnten.

Übrigens würde ich nicht GetNthDocument verwenden. Je mehr Dokumente du durchläufst, um so langsamer wird der Ablauf - verwende lieber While <=> Wend

Toni
Titel: Re: ComputeWithForm
Beitrag von: nikon am 03.05.07 - 11:05:42
Ich bin im ersten Durchlauf alle Felder im Hinblick auf solche Lookups durchgegangen und habe keine gefunden. Mit dem zweiten bin ich noch nicht ganz durch, denn leider ist die Maske nicht sonderlich klein.  >:(

Könnte das unter Umständen auch von gemeinsamen Aktionen herrühren? Ich meine es klingt nich sonderlich logisch... aber ich habe schon so einige Mysterien in Bezug auf besagte gemeinsame Aktionen mitmachen müssen... ;) Naja ich guck sie mir im Anschluss einfach auch mal an.

Da gebe ich Dir Recht - danke für den Tip! Ist wohl die Macht der Gewohnheit gewesen, da ich normalerweise nicht ganz so viele Dokumente in meinen Collections durchlaufe.


Gruß Dirk
Titel: Re: ComputeWithForm
Beitrag von: ata am 03.05.07 - 11:34:16
... Gemeinsame Aktionen sind bei mir schon lange draussen - genau aus diesen Erfahrungen, und die Umbauten kosten dann eine Menge Zeit und Nerven...

Toni
Titel: Re: ComputeWithForm
Beitrag von: thomson666 am 08.05.07 - 07:53:50
von gemeinsamen Aktionen ist prinzipiell abzuraten, auch wenn Sie ibm seitig in der mailschablone verwendet werden.
die seiteneffekte sind pervers! zum Beispiel die Änderung der gemeinsamen Aktion greift nur bei der Hälfte der Ansichten/Masken...
Titel: Re: ComputeWithForm
Beitrag von: ata am 08.05.07 - 09:35:41
... da er nur bei bestimmten Dokumenten reagiert, könnte der Hinweis von Bernhard durchaus möglich sein. Zwischen einem Refresh im Frontend und dem Ablauf bei ComputeWithForm werden keine Display-Felder berücksichtigt.

Zum debuggen könnte es auch helfen, die Dokumente zu separieren und die Felder der Maske einzeln im Design der Maske hinzuzufügen - Ist zwar mühsam, aber damit müsste sich dann das Quellfeld ermitteln lassen...

Toni
Titel: Re: ComputeWithForm
Beitrag von: nikon am 08.05.07 - 12:46:21
Hallo zusammen,

also irgendwie komme ich da gar nicht mehr klar mit meinem Projekt. :o

Ich bin mittlerweile mal alle kritischen Elemente in der Maske durchgegangen. Es gibt eigentlich nichts, was Probleme besagter Art verursachen könnte.

Vielleicht verfolge ich ja einen komplett falschen Ansatz.

Ich möchte wie gesagt "einfach nur" alle Dokumente in meiner Datenbank einmal refreshen und dem User eine Möglichkeit geben, mögliche Verknüpfungs-, Validierungs-Probleme o.Ä. zu lösen. Zum einen habe ich versucht, mit einem Agent im Backend und dem ComputeWithForm zurecht zu kommen. Das funktionierte allem Anschein nach zuerst recht gut. Dann hat sich allerdings herausgestellt, dass ich die von ihm gemeldeten Probleme nicht nachvollziehen konnte.

Im nächsten Step bin ich einmal hingegangen und hole mir jetzt jedes Dokument ersteinmal ins UI, refreshe, speichere und schließe es um wenigstens dabei auch das QuerySave ausgeführt zu wissen. Das hat allerdings auch mehr Probleme verursacht als es gelöst hat. Ich konnte nicht alle Fehler mit dem ErrorHandler abfangen und hatte nachher zig Tabs offen in meinem Client. Da habe ich diese Idee auch wieder verworfen. ;)

Ich habe mir überlegt, ob ich die Sache einfach in 2 Steps realisiere. Zum einen könnte ich einen Agenten mit einem ToolsRefreshAllDocs laufen lassen und die Verknüpfungen erst im Anschluss daran prüfen. Allerdings bin ich mir da jetzt wiederum unschlüssig, weil in der Hilfe zu besagtem @Command steht, dass er mit dem Script-Befehl call view.Refresh äquivalent wäre. Das wiederum wäre aber ja auch nicht das was ich brauche... argh!

Bin für jeden Denkanstoss dankbar!


Gruß Dirk
Titel: Re: ComputeWithForm
Beitrag von: ata am 08.05.07 - 15:37:21
... sind die Neuberechnungen - Refresh's denn sehr umfangreich? Sonnst mach es über's Backend...

Toni
Titel: Re: ComputeWithForm
Beitrag von: nikon am 08.05.07 - 16:17:35
Naja die Frage dich sich mir momentan stellt ist wie? ???

Die Felder um die es mir geht, sind eigentlich hauptsächlich einige per Formel in der Maske berechnete Felder und einige hinzugekommene Felder, da es sich wie gesagt eine gewachsene Applikation ist.

Die weiterführenden Sachen wie die Verknüpfung zu anderen Dokumenten in der gleichen und in anderen Datenbanken kann ich per Script verifizieren... das wird kein Problem sein.


Gruß Dirk
Titel: Re: ComputeWithForm
Beitrag von: ata am 09.05.07 - 15:53:28
... wo ist dein Problem? Die Umsetzung der Formeln in LS?

Toni
Titel: Re: ComputeWithForm
Beitrag von: nikon am 09.05.07 - 16:00:51
Achso jetzt weiß ich glaub ich was Du meinst...

Die Formeln aller Felder in Script "evaluaten" und somit die Feldinhalte über die Schiene neu schreiben/aktualisieren? Puh - das bedeutet wirklich Arbeit! Eine andere Chance habe ich keine mehr?


Gruß Dirk
Titel: Re: ComputeWithForm
Beitrag von: ata am 09.05.07 - 17:37:56
... zumindest die Formeln, die du brauchst...

Toni
Titel: Re: ComputeWithForm
Beitrag von: jBubbleBoy am 15.05.07 - 14:33:11
also ich hatte den gleichen Fehler, und bei mir gab es ein Feld das auf der Grundlage einer Formel eine Ansicht holen wollte die es nicht gab. Du musst dieses Formel finden. Ein nachprogrammieren würde dich nur zu dieser Stelle führen.
Du kannst das auch so schreiben:

doc.computewithform(false, false)

dann wirft er keinen Fehler, aber er macht auch nichts.
der bubble
Titel: Re: ComputeWithForm
Beitrag von: thomson666 am 16.05.07 - 11:58:01
ich würde die formeln in LS schreiben und Formula komplett aus der MAske schmeißen. beim öffnen der MAske befüllst du die Felder mit den Werten die du brauchst und beim schließen der Maske rechnest sie um.

der Vorteil ist das du auch in Zukunft einfach nur den Debugger einschaltest und weißt wo es hackt..