Das Notes Forum
Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: sja am 23.05.05 - 11:31:26
-
Problembeschreibung:
Es gibt zwei Datenbanken:
1. Datenbank „Projekt“ -> Form = „projekt“ , Form = „brief“. Beide Form haben gemeinsames Feld „Projekt Titel“
2. Datenbank „Briefe“ -> Form = „brief“ -> Feld = „Projekt Titel“)
Es läuft einen Agent, der in der Db „Projekt“ für jedes Projekt alle Briefe seit letzte Woche und lädt die alle Briefe seit letzter Woche aus der Db „Briefe“ in der Db „Projekt“.
Es funktionierte alles wunderbar, wenn Form = „brief“ in der Db „Projekt“ von Typ „Dokument“ war.
Jetzt sollen die Briefe in der Db „Projekt“ von Typ „Antwort“ zum Projekt sein.
Ich habe den Agent entsprechend mit MakeResponse erweitert. Das alles funktioniert.
Aber wenn die Replik, wo Agent gelaufen war, wird mit einer zweite Replik repliziert entstehen in der zweite Replik Replizier-Speicherungskonflikt!
Was sollte unternommen werden, um das zu vermeiden???
Ich habe schon ausprobiert die Option „Konflikbehandl.“ mit
„Konflikte mischen“
„Mischen / Keine Konflikte“
„Konflikte nicht erstellen“
Und in allen drei Fällen habe Replizier-Speicherungskonflikt wieder bekommen
Für jede Hilfe, Verweis etc. werde unendlich dankbar.
Viele Gruesse
Sofia
-
Hallo Sofia,
ist das vielleicht ein zeitgesteuerter Agent, der auch auf der Replik läuft? Das könnte ich mir als Fehlerquelle mal so vorstellen....
Sollte das der Fall sein, so könnte man ja den Agent umstellen, dass er nur auf einem bestimmten Server läuft.
LG,
Max
-
Hallo Max,
Danke schön. Das ist ja eine Idee.
Es ist tatsächlich zeitgesteuerter Agent aber nur ein Server steht fest
Trotzdem ich überprüfe das, da ich 5 Server habe, wo die Repliken liegen.
Viele Gruesse
Sofia
-
habe überprüft.
Der Agent läuft nur auf einem Server.
Habe den Agent auf lokale Replik von Test-Datzenbank manuell aud der Menü ausgeführt, Schrittweise mit dem Debugger. die Dokumente wurden in der Db "Projekt"wirklich gelöscht und neu aus der Db "Briefe" kopiert. Dann habe ich die lokale Replik mit der Replik auf dem Server repliziert und in der Replik auf dem Server wurden die Replizier-Speicherungskonflikte entstanden. ???
-
Kann es sein, dass lediglich die Ansicht in der DB einen Schlag weg hat ? Hast Du mal mit Strg-Umsch-F9 alle Ansichten zwangsweise neu aufbauen lassen ? Existiert in den betroffenen Dokumenten wirklich ein $Conflict-Item ?
Wenn es aber doch Replizierkonflikte sind, dann muss tatsächlich auf dem anderen Server ein Prozess laufen, der ebenfalls die Dokumente manipuliert.
Bernhard
-
Hallo Bernhard,
erst herzlichen Dank für Deine Hilfe!
Der Agent läuft je nachts nur auf einem fest gelegten Server. Die Replizierung von Agenten zwischen Repliken ist ausgeschlossen. Der Agent in diesem Zustand (die Briefe sind als Antwortdokumente in der Projekt Db kopiert) ist dieser Nacht 1. Mal gelaufen und ich habe heute früh Replizier-Speicherungskonflikte entdeck.
Dann habe ich den Agent lokal in der Test-Datenbank manuell aus dem Menü ausgeführt und bei der Replizierung mit der Test-Datenbank auf dem Server sind da die Replizier-Speicherungskonflikte entstanden.
Dann habe ich, nach deinem Rat, mit Strg-Umsch-F9 alle Ansichten in der Test-Datenbank zwangsweise neu aufbauen lassen in beide Repliken lokal und auf dem Server und der Agent noch Mal lokal ausgeführt und repliziert. Keine Replizier-Speicherungskonflikte !
Habe zweimal wiederholt -> keine Replizier-Speicherungskonflikte !
Jetzt aktualisiere ich mit Strg-Umsch-F9 die Ansichte in der Produktions-Datenbank und morgen sage Bescheid, ob beim zeitgesteuerten Agent auch ohne Replizier-Speicherungskonflikte läuft.
Was bedeutet, dass "die Ansicht in der DB einen Schlag weg hat" ?
Danke für den Tipp mit Strg-Umsch-F9, davon wusste ich nicht.
Habe in der Domino-Hilfe gekuckt über $Conflict-Item und nichts gefunden? Wo entsteht den Item? in dem Konfliktdokument od. in dem Hauptdokument? Die Konfliktdokumente habe ich schon gelöscht und kann jetzt nicht nachvollziehen, in dem Hauptdokument in der Eigenschaften->Felder habe das Feld nicht gefunden.
Danke schön
Gruesse
Sofia
-
Hallo Sofia,
jeder Speicher- oder Replizierkonflikt hat ein Item $Conflict - und eben nur diese Konfliktdokumente. Fehlt da sItem, dann ist das Dokument auch kein Konfliktdokument.
"Einen Schlag weghaben" ist deutscher Slang und steht für "defekt sein" oder "sich merkwürdig verhalten". Es könnte also sein, dass Dokumente in einer Ansicht als scheinbare Konfliktdokumente angezeigt werden, obwohl sie gar keine sind - die Ansicht ist dann eben defekt oder - vornehmer ausgedrückt - nach dem Agentlauf nicht wieder korrekt aufgebaut worden.
Wenn sich diese Theorie als richtig herausstellt, dann kannst Du nach Abschluss des bisherigen Agentcodes dort ja noch einen Neuaufbau der Ansicht(en) anhängen mit NotesView.Refresh.
Bin gespannt, wie das ausgeht.
Bernhard
PS: Ich meinte übrigens nicht, dass der Agent auch woanders läuft, sondern irgendein anderer Code, der sich auch an den betreffenden Dokumenten vergreift. An sich kann das ja aber nicht sein, da die Dokumente ja durch den Agent gerade erst erzeugt wurden.
-
Hallo Bernhard,
vielen Dank für Erklärungen!
Möchte nur dazu sagen, dass in der Datenbank habe ich die Ansicht "Konflikte", also mit der Auswahlformel: @IsAvailable($Conflict) und da waren doch die Konflikte angezeigt, und da habe ich eigentlich die Konflikte gelöscht.
Ich habe erst Verstanden, dass nicht nur ein Item "$Conflict", sondern noch ein Item "$Conflict-Item" :)
Wie ich das jetzt verstehe die Konflikte waren doch da. Also warte ich ab bis morgen und bin auch gespannt.
Übrigens in der Datenbank ist die Option "Wiederherstellbare Löschungen zulassen" ist deaktiviert.
Habe in zwischen noch mal den Agent in der Test-Datenbank auf dem Server manuell ausgeführt und mit lokaler Replik repliziert -> keine Replizier-Speicherungskonflikte entstanden!
Vielen Dank und schöne Gruesse
Sofia
-
:'(
es ist eine Katostrofe bei mir.
Die Replizier-Speicherungskonflikte sind da.
Item $Conflict ist auch in der Konflikt-Dokumenten.
Die Konflikt-Dokumente sind in der Konflik-Ansicht mit der Auswahl @IsAvailable($Conflict) zu sehen.
Als ich die Konflikte löschte habe und wieder die Replike repliziert habe, wurden auch selbs Dokumente verschwunden.
Es funktionierte seit langem ohne Problem wenn die Dokumente nicht von Typ "Response", sondern von Typ "Dokument" waren. Jetzt ist alles durch einander.
Gruesse
Sofia
-
Hallo @All,
möchte gerne dieses Thread, nach einer Verzögerung wegen tragische Umstände in meines Leben (meine Mutti war sehr krank und gestorben), weiter fortsetzen.
Der Titel habe ich geändert von “Schon wieder Replizier-Speicherungskonflikt “ zum “1. Replizier-Speicherungskonflikt 2. Nicht alle Dokumente wurden repliziert “ und jetzt erkläre warum.
Ich versuche noch mal die Situation zu schildern. Von Anfang an, versuchte ich die Situationsbeschreibung vereinfachen, jetzt versuche ich das detaillierte zu machen.
Also, wir haben:
1.) eine Notes Datenbank “Projekte“.
Die Datenbank enthält die Projekt-Dokumente mit sehr komplexe Form “projekt“.
Jedes Projekt-Dokument hat Response-Dokumente, die mit verschiedener Form erstellt wurde.
Auf drei Server gibt es je eine Replik von der Datenbank “Projekt“ und die ganze Menge Notes-Clients haben lokale Replik davon. Die Replizierung allen Doku zwischen allen Repliken funktioniert seit langem ohne Problem.
2.) eine Notes Datenbank “Zeitaufwand“.
Die Datenbank enthält nur die Aufwand-Dokumente. Die Dokumente sind aus der Db SyBase per LEI übernommen und werden regelmässig mit SyBase per LEI replizieren und zwar in einer Richtung von SyBase zur Notes Datenbank “Zeitaufwand“ und in der Notes Datenbank “Zeitaufwand“ nicht bearbeitbar.
D. h. die Aufwand-Dokumente werden nur in SyBase erstellt, geändert und gelöscht und das alles wird in der Notes Datenbank “Zeitaufwand“ ein Mal je Nacht repliziert.
Also, die Notes Datenbank “Zeitaufwand“ ist nur Hilfs- bzw. Infodatenbank und keiner arbeitet damit.
Dieser Datenbank ist in der Notes Datenbank “Projekte“ benutzt und zwar:
1. Wenn ein Projekt auf “aktiv“ gesetzt wird, werden alle Aufwand-Dokumente erste mal per Agent aus der Datenbank “Zeitaufwand“ in der Datenbank “Projekte“ kopiert.
2. Je Nacht werden alle Aufwand-Dokumente in der Datenbank “Projekte“ für jedes aktive Projekt für 6 letzten Wochen ab aktuellem Datum gelöscht und aus der Notes Datenbank “Zeitaufwand“ in der Datenbank “Projekte“ neu geladen.
Die Projekt-Dokumente und Aufwand-Dokumente identifizieren einander nur durch gleiches Feld “ProjektTitel“.
!!! Die Replizierung zwischen Repliken lief ohne Problem!!!
Aber, da die Aufwand-Dokumente in der Datenbank “Projekte“ von Typ „Dokument“ kopiert wurden, waren damit verschiedene Unbequemlichkeiten verbunden u.a. z. B.
-> Könnte ich nicht in einer Ansicht aktive Projekte und nur dazu gehörige Aufwand-Dokumente anzeigen lassen. Mit der Auswahlformel
SELECT ((Form = "projekt")&(Status = "aktiv“)) | Form=“aufwand“
Kategorisiert durch Feld “ProjektTitel“
wurden aktive Projekte und alle Aufwand-Dokumente auch für „inaktive“ Projekte angezeigt
-> Für Archivierung von abgeschlossenen Projekten (die einfach mit allen zugehörigen Response archiviert worden) sollte ich für Aufwand-Dokumente was zusätzlich programmieren
usw.
Dann habe ich entschieden die Aufwand-Dokumente als Response für Projekte zu kopieren (ohne zu wissen, dass ich ein Trojanisches Pferd zu mir eingeladen habe).
1. Problem
Nachdem, als die Aufwand-Dokumente als Response in der Datenbank “Projekte“ kopiert wurden, kamen bei der Replizierung, in diesem Thread beschriebene, Replizier-Speicherungskonflikte die mich in der Verzweifelung gesetzt haben.
Dann habe ich alles zurück gespielt. D. h.
In der Replik auf dem Haupt-Server, wo auch der Agent für Laden und Update von Aufwand-Dokumenten läuft, habe ich alle Aufwand-Dokumente gelöscht und die wurden per Agent aber nicht als Response, sondern als Document geladen. Und dann bekamm ich
2. Problem
Dann wurde meine Arbeit auf eine bestimmte Zeit (wie o.g.) unterbrochen. Wenn ich zu meiner Arbeit zurück kehrte, habe ich folgendes:
1. In der Haup-Replik fehlte welche Aufwand-Dokumente, andere waren doppelt. Aber das war nicht für alle Projekte, nur für wenige.
2. Die Anzahl von Aufwand-Dokumenten stimmte überhaupt nicht mit der Haupt-Replik.
Ich habe die Haupt-Replik in Ordnung gebracht: Dopplungen gelöscht und fehlende Dokumente neu geladen. Drei Tage kontrollierte Ergebnisse nach der Ausführung des Agentes. In Haupt-Replik war alles richtig, aber in andere Repliken wurde das bei der periodische Replizierung nicht repliziert. Es fehlte da welche Dokumente. Dann habe ich die Replizierung manuell ausgeführt und !!! in der Haupt-Replik wurden einiege Dokumente gelöscht !!!.
Die Haupt-Replik habe ich wieder repariert und für einen Test erstellte eine neue lokale Replik von Haupt-Replik. Die Anzahl von Dokumenten und die Stundenzahl stimmte überein.
Nach Ausführung des Agentes, habe ich die Dokumente in der Haupt-Replik überprüft, es war alles richtig.
Dann habe ich die Haupt-Replik mit der neue lokale Replik manuell repliziert und zwar in einer Richtung: Dokumente von Haupt-Replik an lokale Replik senden. Ergebnis: 5 Aufwand-Dokumente waren in der lokale Replik gelöscht, in der Haupt-Replik waren die Dokumente da. Nach der Replizierung in der beide Richtungen wurden diese 5 Dokumente und noch welche aus der Haupt-Replik verschwunden.
Nach der Ausführung des Agentes in der Haupt-Replik waren die Dokumente wieder neu geladen.
Dann habe ich wieder die Haupt-Replik mit der lokale Replik manuell in einer Richtung Haupt-Replik -> lokale Replik repliziert. Die 5 Dokumenten wurden nicht in der lokale Replik repliziert!!!
Werde unbegrenzt dankbar, für jede Hilfe, Rat, Hinweis etc.
Ich bin wirklich verzweifelt!
Viele Gruesse
Sofia
-
Mein Beileid zum Verlust Deiner Mutter, solche Momente im Leben sind wirklich schwer.
Im Moment hab ich Dir allerdings keinen Tipp für Dein Problem, muss es noch einmal in Ruhe durchlesen.
-
Hallo Semeaphoros,
vielen Dank.
Gruesse
Sofia
-
Hallo sja
Du hast eine PM von mir.
Zum Problem:
Ich habe mal den ganzen Thread gelesen und irgendwie kommt mir das bekannt vor. Bei uns ist das passiert, als wir mit den verschiedenen Konflikteigenschaften der Dokumente rumgespielt haben. Wir haben auch nachträglich versucht, diese Maskeneigenschaften auf "Merge/No Conflicts" zu ändern, mit höchst interessanten Resultaten. Wir hatten wie Du Replizierkonflikte beim replizieren mit lokalen Repliken und haben nie herausfinden können, aus welchem Grund die entstehen. Heute bin ich etwas schlauer. Es funktioniert, wenn man immer ein computewithform im Skript hat. Macht es zwar langsam, aber es ist die einzige Möglichkeit (die ich gefunden habe), wie man diese Eigenschaft wirklich zum Funktionieren bringt.Auf jeden Fall ist es besser, wenn man alle lokalen Repliken ersetzt (löschen - neu).
Wenn Du nur die Maskeneigenschaften umstellst, hat das wenig bis keine Wirkung, ausser das irgendwelche verrückten Konflikte entstehen. So war das zumindest bei uns.
Ich würde jetzt mal alle Masken kontrollieren und die Maskeneigenschaften wieder auf "Create Conflicts" stellen. Dann sieht man beim Testen vielleicht einmal einen Unterschied zwischen den Dokumenten die einen Replizierkonflikt haben und den anderen.
Vielleicht fällt mir später noch mehr ein.
Tilsche
-
Hallo ctillmanns,
vielen Dank. Ich werde das alles mir merken.
Die Sache ist nur, dass die Replizier-Speicherungskonflikte entstanden, wenn die Aufwand-Dokumente als "Response" in der "Projekt"-Datenbank kopiert (und zwar für jedes Dokument) wurden.
Aber jetzt ist für mich aktuell 2. Problem und zwar "Nicht alle Dokumente wurden repliziert", weil ich habe alles zurück gespielt, d. h. die Aufwand-Dokumente sind als Typ "Document" in der "Projekt"-Datenbank kopiert. In diesem Fall entstehen keine Replizier-Speicherungskonflikte, sondern beim Replizierung mit anderen Repliken werden nicht alle Dokumente repliziert.
Gruesse
Sofia
-
Bei uns war das auch so, alles wunderbar umgestellt und die Serverreplik war perfekt, aber sobald repliziert wurde ging das Theater los. Konflikte und nicht replizierte Dokumente, Löschungen, so ziemlich alles ist beim ersten Mal passiert. Wir kriegten es nur damit in den Griff, dass wir alle lokalen Repliken gelöscht haben und dann neue erstellt haben. Danach war es dann sauber.
Eventuell hast Du jetzt Dokumente mit verschiedenen Konflikt Eigenschaften. Vielleicht gibt eine Ansicht in der das Feld $ConflictAction angezeigt wird mehr Aufschluss. Wenn es gar nicht vorhanden ist, kommt die Standardeinstellung "Create Conflicts" zum Zug. Wenn das nichts hilft, war ich auf dem falschen Dampfer.
Dann würde ich noch erst mal fixup und dann compact laufen lassen.
PM angekommen?
-
Hallo ctillmanns,
erst herzlichen Dank für PM.
Ich denke auch, dass alle Repliken gelöscht und neu erstellt werden sollen, was nicht ganz einfach ist in verschiedenen Städten. Die Datenbank ist mehr als 1,5G. Deshalb bevor ich diese Aktion durchsetze, möchte ich klar kommen, da folgendes mich irritiert:
wie schon gesagt, habe ich eine neue lokale Replik von der "gesunde" Haupt-Replik erstellt und die Dokumente stimmte dabei überein.
Aber nach der erste Replizierung waren schon einige Dokumente aus der lokale Replik gelöscht.
Und bei weiteren Replizierungen werden genau diese Dokumente in die lokale Replik nicht repliziert, obwohl die in der Haupt-Replik vorhanden sind. ???
Was meinst Du mit fixup und compact. Sollte das auf Haupt-Replik ausgeführt werden, und dann neue Repliken erstellt werden?
Gruesse
Sofia
-
@ctillmanns
Es funktioniert, wenn man immer ein computewithform im Skript hat. Macht es zwar langsam, aber es ist die einzige Möglichkeit (die ich gefunden habe), wie man diese Eigenschaft wirklich zum Funktionieren bringt.
verstehe nicht wozu computewithform könnte in meinem Fall gut sein.
Die Datenbanken "Projekte" und "Zeitaufwand" enthalten die absolut gleiche Form "aufwand". Es kommen keine neuen Felder vor. Der Inhalt soll auch gleich sein.
Die Dokumente werden in keiner von diesen Datenbanken bearbeitet werden.
Nur mit dem Agent Stundenzahl in den Aufwand-Dokumenten für je Projekt wird gelesen, addiert und in das entsprechende Projekt-Dokument gespeichert.
Ausserdem habe ich in dem Forum betreffend computewithform nachgeforscht und habe so verstanden, dass damit könnte zusätzliche Probleme auftauchen
???
Gruesse
Sofia
-
Keine Probleme zu erwarten, habe keine Ahnung, wo Du das gelesen hast. Das Schlimmste, was passieren kann, ist, dass es keinen Nutzen hat.
-
z. B.
hier
http://www.atnotes.de/index.php?PHPSESSID=ab95df7da0bc77587551ba67f3021101&topic=12987.0
oder hier
http://www.atnotes.de/index.php?PHPSESSID=ab95df7da0bc77587551ba67f3021101&topic=16893.0
denn ich selbst habe keine Erfahrung mit der Methode computewithform und befürchte noch schlimme bei mir zu machen, als schon ist.
-
Du solltest aber unbedingt den ganzen Thread lesen, die dort beschriebenen Probleme gehen darauf zurück, dass die Formeln im Formular nicht korrekt sind. Da ist es nicht erstaunlich, wenn es Probleme geben kann. Man muss natürlich mit den Mitteln auch korrekt umgehen, will man ihren Nutzen haben.
-
ok, alles klar.
Danke Semeaphoros.
Gruesse
Sofia
-
Guten Morgen
Das Computewithform macht dem Dokument klar, welche Konfliktaktion es auszuführen hat. Wenn man Dokumente mit Skript erstellt ist die Eigenschaft die man nur auf der Maske einstellt wirkungslos. Selbst wenn man nachträglich das Dokument im Frontend speichert, hat das laut IBM keine Wirkung mehr. Das Dokument muss ganz zu Anfang richtig erstellt werden, sonst wird das nichts. Man kann auch das Item $ConflictAction mit dem richtigen Wert drauf schreiben. Nur so zur Sicherheit.
Tilsche
-
Hallo ctillmanns,
vielen Dank für die Erklärung. Jetzt mit dem Computewithform ist mir alles klar.
Da noch weitere Fragen, wenn jemand damit Erfahrung hat:
- wozu in der Situation fixup und compact gut sind?
- sollen die nur auf Haupt-Replik ausgeführt werden?
- und wann am besten bevor alle Daten in der Haupt-Replik wieder richtig hergestellt werden oder nachdem?
Herzlichen Dank für Hilfe
Gruesse
Sofia
-
Bitte schön
Ich würde jetzt so vorgehen.
0. SICHERHEITSKOPIE von der Hauptreplik anlegen. Man weiss ja nie.
1. Alle verteilten Repliken - ausser der Hauptreplik natürlich - löschen. Wenn das möglich ist.
2. Die Hauptreplik in Ordnung bringen und zwar:
2.1 Überprüfen, ob noch irgendwelche Konfliktdokumente vorhanden sind.
2.2 Dann in einer Ansicht mit allen Dokumenten eine Aktion mit der Formel @command([ToolsRefreshAllDocs]) mal alle Masken durchrechnen lassen. Wenn diese Aktion nicht durchläuft, sind noch Dokumente vorhanden, die irgendwelche Fehler haben. In der Statusleiste steht zwar eine DokID für ein fehlerhaftes Dokument, aber mit dieser habe bisher nie was anfangen können, Bzw. ich habe das Dokument mit der ID nie gefunden. Aber Du kannst mit @command([ToolsRefreshSelectedDocs]) versuchen das fehlerhafte Dokument einzugrenzen. Ist halt ein Gefummele, bis man das alles hat.
3. Mit dem Administrator Client als erstes mal einen Fixup starten. Das sollte dann irgendwelche Fehler in der DB finden und korrigieren. Findet sich im Register "Files" wenn Du mit der rechten Maustaste auf die DB klickst.
4. Im Administrator Client in der Konsole compact für diese eine DB starten. Es gibt verschiedene Parameter dafür und die solltest Du Dir in der Hilfe mal gut durchlesen. compact copy style ist hier eine Möglichkeit die hilft, die DB wieder sauber zu machen.
5. Neue Repliken erstellen und beten.
Wenn das alles nicht hilft, pack die DB ein, mach eine Briefmarke drauf und schick sie an Jens und leg ein genug Euros dazu. Will heissen, dass Du Dich vielleicht an den Entwickler Deines Vertrauens wenden solltest, damit Ihr das mal zusammen anschaut.
Hoffe, dass dies jetzt hilft
Fröhliches Schwitzen noch.
Tilsche
-
Hallo ctillmanns,
erst Mal herzlichen Dank für so hilfreiche Information. Und ich werde ja nach diesem Plan vorgehen.
Nur möchte dazu sagen, dass ich jetzt überhaupt keine Konflikte habe, seit Afwand-Dokumente nicht als "Response", sondern als "Dokument" in der Projekt-Datenbank kopiert wurden. Die Eigenschaft "Konfliktbehandl." in der Maske "aufwand" in der Projekt-Datenbank ist auf "Konflikte nicht erstellen" gesetzt.
Im Gegenteil einige Dokumente verschwinden bei der Replizierung und obwohl die in der Haupt-Replik nach der Ausführung des Agentes wieder geladen werden, werden einige davon nicht in den anderen Repliken repliziert. ??? Das finde ich noch schlimmer als Konflikte.
Noch eine Frage. Nach meiner Meinung, spielt hier auch nicht letzte Rolle das, was in "Replizierparameter->Andere->Nur eingehende Dokumente replizieren, die gespeichert oder geändert wurden nach dem:" steht. Sollte die Eigenschaft am besten leer sein?
Vielen Dank im Voraus.
Was betrifft die bezahlte Hilfe, dann leider sieh es so aus, dass ich muss ohne zu Recht zu kommen, da unsere Firma kein Cent nach Draussen bezahlen wird, weil schon zweites Jahr steht die Frage "to be or not to be" und ich selbst bin nicht reich und glaube nicht, dass ich kann das entsprechend bezahlen. :(
Danke schön für so reiche Hilfe
Gruesse
Sofia
-
Hallo,
ob ich richtig verstehe, dass die Methode
removePermanently
löscht die Dokumente sofort aus der Datenbank.
Wenn in der Datenbank die Eigenschaft "Wiederherstellbare Löschungen zulassen" nicht aktiviert ist, werden die Dokumente aus der Datenbank mit der Methode
remove
auch sofort gelöscht, oder bleiben die noch eine Weile in der Datenbank, und wenn ja, dann wie lange?
Werden bei der Ausführung von compact alle soft deletion aus der Datenbank raus?
Vielen Dank schon mal im Voraus
Sofia
-
Sofia, es tut mir leid, das ich mich um Dein Problem nicht mehr kümmern konnte, aber momentan bi nich zeitlich extrem eingeschänkt. Und Dein Problem erfordert (und verdient) einigen Aufwand.
Du erwähnst jetzt SoftDeletions. Die können - gerade mit den von Dir beschriebenen Effekten - ein übles Problem hervorrufen.
Nochmals mit der Bitte um Entschuldigung für meine Nicht-Beteiligung an dieser so schwerwiegenden Fragestellung, aber an alle Mit-Macher: Richtet bitte mal das Augenmerk auf die Soft-Deletions. Ich habe da so eine Ahnung ... und leider nicht genug Zeit bis Sonntagabend für so ein ernsthaftes Problem.
Danke an alle Beteiligten,
Bernhard
-
Hallo
Bernhard, erst Mal vielen Dank für Deine Aufmerksamkeit.
Habe noch etwas in dem Ablauf diesen Funktionen in meinen Datenbanken entdeckt, was meiner Meinung nach, auf Soft-Deletions zeigen sollte.
Also, ich vorbereite eine abgespeckte Test-Version von meinen Datenbanken und dann melde mich.
Schöne Gruesse
Sofia
-
Hallo,
wie gesprochen sind hier die abgespeckte Test-Version von meinen Datenbanken:
1. "Proejekte“-> projekt.nsf (leer)
Die Felder
Feld = “AWNTitel“ in der Form = “projekt“
und
Feld = “projekt“ in der Form = “aufwand“ für
sind für die Identifizierung zwischen Projekt-Dokument und Aufwand-Dokumenten vorgesehen. D. h. es muss “AWNTitel“ = “projekt“ für das Projekt und dazu gehörige Aufwand-Dokumente
2. “Zeitaufwand“ -> aufwand.nsf (Agenten/Aktionen in der Db "Projekte“ sind für test\aufwand.nsf programmiert)
Form “aufwand“
enthält Beispiele Aufwand-Dokumente für drei Projekte mit Titel (Feld “projekt“):
Test1
Test2
Test3
Was sollte für Testen gemacht werden:
Wäre gut die Db “Zeitaufwand“ in dem Verzeichnis „test“ anlegen, sonst müssen die source für Agenten/Aktionen in der Db "Projekte“ korrigiert werden.
In der Db "Projekte“ (z.B. in der Ansicht “2.Projekte und Aufwand“) mit der Aktion "Projekt“ drei Projekte anlegen
In jedem Projekt in das Feld mit der Bezeichnung “Titel“ jeweils Test1, Test2, Test3 eintragen
In Db "Projekte“ sollte folgendes funktionieren
1.
Aktion “Agent starten“ in der Ansicht “2.Projekte und Aufwand“ (in der Produktions-Datenbank ist es periodischer Agent).
Der Agent lädt in der Db "Proejekte“ aus der Db “Zeitaufwand“ Aufwand-Dokumente
- alle, wenn das Projekt noch keine hat
- wenn das Projekt hat welche, dann werden alle Aufwand-Dokumente für das Projekt, die von aktuellem Datum 42 Tagen zurück liegen, gelöscht und aus der Db “Zeitaufwand“ alle Aufwand-Dokumente für letzten 42 Tagen in der Db "Projekte“ geladen werden
Dim s As NotesSession
'*************** Projekt ****************************************************
Dim db As NotesDatabase
Dim viewPYM As NotesView
Dim VEC As NotesViewEntryCollection
Dim ve As NotesViewEntry
Dim viewPymAWN As NotesView
Dim viewPymAWN6 As NotesView
Dim vecPymAWN As NotesViewEntryCollection
Dim vePymAWN As NotesViewEntry
Dim PymDoc As NotesDocument
Dim PymDocAWN As NotesDocument
Dim docTmp As NotesDocument
Dim tmpAWNTitel As String
Dim tmpAWNTitel_alt As String
Dim tmpIstWert As Single
Dim tmpSchaetzWert As Single
Dim tmpIstProzent As Single
Dim tmpIndikator As String
Dim dateTime As NotesDateTime
Dim searchFormulaPYM As String
Dim collection As NotesDocumentCollection
'*************** Zeitaufwand ************************************************
Dim dbAWN As NotesDatabase
Dim viewAWN As NotesView
Dim vecAWN As NotesViewEntryCollection
Dim veAWN As NotesViewEntry
Dim docAWN As NotesDocument
Dim tmpStunden As Single
Dim searchFormulaAWN As String
Dim collectionAWN As NotesDocumentCollection
Sub Initialize
Set s = New NotesSession
'*************** Projekte ****************************************************
Set db = s.CurrentDatabase
Set viewPYM =db.getview("tmpAWN_PYM")
Set viewPymAWN=db.getview("tmpAWN")
Set viewPymAWN6 =db.getview("tmpAWN6")
'*************** Aufwand ************************************************
Set dbAWN = s.GetDatabase( "", "test\aufwand.nsf" )
Set viewAWN =dbAWN.getview("awnPYM6")
'**************************************************************************
If Not(viewPYM.EntryCount = 0) Then
Set VEC = viewPYM.AllEntries
Set ve = VEC.GetFirstEntry()
Set PymDoc = ve.Document
While Not (ve Is Nothing)
Set PymDoc = ve.Document
'*****************Werte initialisieren ******************************************
'PymDoc.istProzent = tmpIstProzent
If Cstr(PymDoc.istProzent(0)) = "" Then
tmpIstProzent = 0
PymDoc.istProzent= 0
Else
tmpIstProzent = PymDoc.istProzent(0)
End If
If Cstr(PymDoc.Schaetzwert(0)) = "" Then
tmpSchaetzWert = 0
Else
tmpSchaetzWert = PymDoc.Schaetzwert(0)
End If
If Cstr(PymDoc.Istwert(0)) = "" Then
tmpIstWert = 0
Else
tmpIstWert = 8.5 * PymDoc.Istwert(0)
End If
'********************************************************************************
tmpAWNTitel = PymDoc.AWNTitel(0)
tmpAWNTitel_alt = PymDoc.AWNTitel_alt(0)
Messagebox tmpAWNTitel
If tmpAWNTitel_alt = "" Then
Call LoadAll(tmpAWNTitel)
Elseif tmpAWNTitel <> tmpAWNTitel_alt Then
Call RemoveAll(tmpAWNTitel_alt)
Call LoadAll(tmpAWNTitel)
Else
Call Remove6Wo(tmpAWNTitel)
Call Load6Wo(tmpAWNTitel)
End If
Call WerteBerechnung()
PymDoc.Istwert = tmpIstWert
PymDoc.istProzent = tmpIstProzent
PymDoc.Indikator = tmpIndikator
'PymDoc.AWNTitel_alt = tmpAWNTitel
Call PymDoc.Save( True, True )
Set ve = VEC.getNextEntry(ve)
Wend
End If
End Sub
Function LoadAll(AWNTitel As String)
'Kopieren alle Aufwand-Dokumente für das Projekt-Dokument aus der Db "Zeitaufwand" in die Db "Projekte"
searchFormula = |projekt = "| + AWNTitel +|"|
Set collectionAWN = dbAWN.Search(searchFormula, Nothing, 0)
Set docAWN = collectionAWN.GetFirstDocument
Messagebox "LoadAll " & collectionAWN.Count
If Not(collectionAWN.Count = 0) Then
tmpIstWert =0
While Not(docAWN Is Nothing)
'**********************************************************************************************
Set PymDocAWN = docAWN.CopyToDatabase( db )
'Call PymDocAWN.MakeResponse(PymDoc)
'Call PymDocAWN.ComputeWithForm(False, False)
Call PymDocAWN.Save(True, True)
'**********************************************************************************************
tmpStunden = docAWN.Stunden(0)
tmpIstWert = tmpIstWert +tmpStunden
'Messagebox Cstr(tmpIstWert)
Set docAWN = collectionAWN.GetNextDocument(docAWN)
Wend
PymDoc.AWNTitel_alt = tmpAWNTitel
PymDoc.awnFlag = "1"
Else
PymDoc.AWNTitel_alt = ""
End If
End Function
Function Load6Wo(AWNTitel As String)
'Kopieren Aufwand-Collection (letzten 6 Wochen) aus der Db "Zeitaufwand" in die Db "Projekte" für das Projekt-Dokument
Set vecAWN = viewAWN.GetAllEntriesByKey(AWNTitel, True)
Messagebox "Load6Wo " & vecAWN.Count
If Not(vecAWN.Count = 0) Then
Set veAWN = vecAWN.GetFirstEntry()
While Not(veAWN Is Nothing)
Set docAWN = veAWN.Document
'**********************************************************************************************
Set PymDocAWN = docAWN.CopyToDatabase( db )
'Call PymDocAWN.MakeResponse(PymDoc)
'Call PymDocAWN.ComputeWithForm(False, False)
Call PymDocAWN.Save(True, True)
'**********************************************************************************************
tmpStunden = docAWN.Stunden(0)
tmpIstWert = tmpIstWert +tmpStunden
Set veAWN = vecAWN.getNextEntry(veAWN)
Wend
PymDoc.AWNTitel_alt = tmpAWNTitel
End If
End Function
Function RemoveAll(AWNTitel As String)
'Löschen alle Aufwand-Dokumente für das Projekt-Dokument in der Db "Projekte"
tmpIstWert = 0
Set vecPymAWN = viewPymAWN.GetAllEntriesByKey(AWNTitel, True)
Messagebox "RemoveAll " & vecPymAWN.Count
If Not(vecPymAWN.Count = 0) Then
Set vePymAWN = vecPymAWN.GetFirstEntry()
While Not(vePymAWN Is Nothing)
Set PymDocAWN = vePymAWN.Document
Set docTmp = PymDocAWN
Set vePymAWN = vecPymAWN.getNextEntry(vePymAWN)
docTmp.Remove(True)
'docTmp.RemovePermanently(True)
Wend
PymDoc.awnFlag = ""
PymDoc.AWNTitel_alt = ""
End If
End Function
Function Remove6Wo(AWNTitel As String)
'Löschen Aufwand-Dokumente (letzten 6 Wochen) für das Projekt-Dokument in der Db "Projekte"
Set vecPymAWN = viewPymAWN6.GetAllEntriesByKey(AWNTitel, True)
Messagebox "Remove6Wo " & vecPymAWN.Count
If Not(vecPymAWN.Count = 0) Then
Set vePymAWN = vecPymAWN.GetFirstEntry()
While Not(vePymAWN Is Nothing)
Set PymDocAWN = vePymAWN.Document
tmpStunden = PymDocAWN.Stunden(0)
tmpIstWert = tmpIstWert - tmpStunden
Set docTmp = PymDocAWN
Set vePymAWN = vecPymAWN.getNextEntry(vePymAWN)
docTmp.Remove(True)
'docTmp.RemovePermanently(True)
Wend
End If
End Function
Function WerteBerechnung()
'Berechnung von Istwert und IstProzent in dem Projekt-Dokument
'@If(Schaetzwert = 0;@If(Istwert = 0; 0;100); (Istwert/ Schaetzwert *100))
'@If(istProzent > 100; "rot"; istProzent <= 75; "gruen"; "gelb")
tmpIstWert = tmpIstWert /8.5
If tmpSchaetzWert = 0 Then
If tmpIstWert = 0 Then
tmpIstProzent = 0
tmpIndikator = "gruen"
Else
tmpIstProzent = 100
tmpIndikator = "gelb"
End If
Else
tmpIstProzent = tmpIstWert *100/tmpSchaetzWert
If tmpIstProzent > 100 Then
tmpIndikator = "rot"
Elseif tmpIstProzent <= 75 Then
tmpIndikator = "gruen"
Else
tmpIndikator = "gelb"
End If
End If
End Function
2.
In dem Dokument “Projekt“
Button “Reset“
- löscht alle Aufwand-Dokumente für das Projekt
- aktualisiert die Aufwandschätzung für das Projekt
Button “Löschen und neu laden“
- löscht alle Aufwand-Dokumente für das Projekt
- lädt alle Aufwand-Dokumente für das Projekt aus der Db “Zeitaufwand“ neu
- aktualisiert die Aufwandschätzung für das Projekt
Problem-Beschreibung
TEST mit ComputeWithForm (bzw. auch wenn Aufwand-Dokumente als Response)
Keine Probleme zu erwarten, habe keine Ahnung, wo Du das gelesen hast. Das Schlimmste, was passieren kann, ist, dass es keinen Nutzen hat.
Für alle gelöschte und neu geladenen Aufwand-Dokumenten entstehen bei der Replizierung Replizier- Speicherungskonflikte.
Wobei die Eigenschaft "Konfliktbehandl." in der Maske "aufwand" in der Db “Projekt“ ist auf "Konflikte nicht erstellen" gesetzt.
TEST ohne ComputeWithForm (Aufwand-Dokumente als Document)
Wenn Aufwand-Dokumente (z. B. mit dem Button “Reset“) aus der Replik, wo Agent laufen sollte, gelöscht werden und mit anderer Replik repliziert werden. Dann nach der Ausführung des Agnetes, die Aufwand-Dokumente werden zwar in der Replik geladen, aber replizieren sich nicht in der Replik, wo die schon ein Mal gelöscht waren.
Meiner Meinung nach, liegt es in Verbindung mit Soft Deletion.
Wobei die Eigenschaft "Wiederherstellbare Löschungen zulassen" nicht aktiviert ist.
Bei meinen Testen habe ich folgendes entdeckt:
Wie bekannt,
hat jedes Dokument in der Lotus Notes Datenbank eine eindeutige ID.
Wenn man repliziert ein Dokument, dann haben die Replik-Dokumente die gleiche ID und diese ID wird von Notes für die Replizierung benutzt.
Wenn man erstellt eine Kopie (z.B. per copy&paste) von einem Dokument, dann haben die Dokumente verschiedene ID und können nicht repliziert werden. Bei Testen habe ich fest gestellt, dass das gelöschte Dokument und per Script in Agent neu kopiertes Dokument haben absolut gleiche ID. ???
Meiner Meinung nach, genau da liegt das Problem. Ich stelle mir vor, dass Soft Deletion für diese ID in der Db noch vorhanden sind ???
Vielen Dank für jede Hilfe, Tip, Hinweis
Gruesse
Sofia
-
Hallo Zusammen,
werde sehr dankbar, wenn jemand sagt mir was dazu:
- ist das sehr komplizierte Fall und nur bezahlte Beratung helfen könnte
oder
- meine Fragen sind sehr dumm, um was dazu man sagen könnte
oder
- meine keine perfekte deutsche Sprache ist so schlecht, dass meine Fragen und Beschreibungen unverständlich und falsch sind. In diesem Fall versuche ich noch Mal formulieren:
Passiert das folgendes nur bei mir?
wenn man erstellt eine Kopie (z.B. per copy&paste) von einem Dokument, dann haben die Original und weitere Kopien verschiedene ID
aber
in einem Script mit CopyToDatabase() alle weitere Kopien haben die gleiche ID.
?
Oder es ist sonicht nur bei mir, sondern allgemein?
Wenn es ist so, dann ob ich richtig verstehe, dass es den Grund für folgendes ist:
- Replizier- Speicherungskonflikte in dem Fall mit ComputeWithForm
- Die Dokumente lassen sich nicht mehr replizieren, wenn die Löschungen schon ein Mal repliziert wurden.
Danke viel Mals schon im Voraus für jeden Antwort
Schöne Gruesse
Sofia
-
Meine Meinung: Ich denke mal, das liegt ausserhalb der normalen Problematik. Sprich, um Dir helfen zu können, müsste man den Fall selber rekonstruieren und das braucht Zeit. Es liegt auf der Hand, dass man da nicht unbedingt verlangen kann, dass jemand seine Freizeit dafür spendet. Sinnvollerweise wirst Du Dir also Unterstützung einkaufen.
-
alles klar.
Danke schön
Sofia
-
Hallo Zusammen,
ich freue mich riesig mitzuteilen, dass danke Bernhard ist das Problem gelöst!
Hallo Sofia,
Du schreibst:
Bei Testen habe ich fest gestellt, dass das gelöschte Dokument und per Script in Agent neu kopiertes Dokument haben absolut gleiche ID.
Das ist genau richtig und ist auch von den Notes-Machern so vorgesehen: CopyToDatabase bewirkt, dass die Kopie des Dokuments die gleiche UNID behält - also ein Verfahren, dass man innerhalb von Repliken nicht verwenden darf.
Bevor wir jetzt lange probieren, mache doch mal bitte folgendes: Ändere den Code so ab, dass Du ohne CopyToDatabase auskommst (CreateDocument und dann CopyAllItems). Da Du mit CreateDocument innerhalb von Repliken sowieso in Trouble kommst, kann dieses Verfahren zumindest nicht schaden, und Du erzwingst neue UNIDs.
Liebe Grüsse und viel Glück,
Bernhard
Ich habe CopyToDatabase durch CreateDocument und CopyAllItems ersetzt und alles funktioniert ohne Problem.
Bernhard, noch Mal herzlichen unbegrenzten Dank!
Liebe Gruesse
Sofia