Autor Thema: Ansicht Replizierkonflikte  (Gelesen 7057 mal)

Offline vbis

  • Frischling
  • *
  • Beiträge: 23
Ansicht Replizierkonflikte
« am: 11.06.09 - 16:47:59 »
Hi,

in einer eingekauften Datenbank in unserem Hause habe ich eine Ansicht mit Replizierkonflikten entdeckt.
Diese Möglichkeit würde ich auch gerne für selbstprogrammierte Datenbanken einsetzen.

Wie erstelle ich eine solche Ansicht ?
Gibt es da eine Funktion oder muss man quasi die vorhandenen Dokumente vergleichen und nach gleichen Dok-ID´s suchen lassen ?

Vielen Dank für Eure Bemühungen
thomas

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Ansicht Replizierkonflikte
« Antwort #1 am: 11.06.09 - 17:05:59 »
Warum schaust Du Dir nicht einfach die Ansicht in der gekauften DB an?

Was verstehst Du unter "Dok-ID"? Wenn Du die UniversalID (alias UNID alias DocumentUniqueID) meinst - die Konfliktdokumente haben selbstverständliche ihre eigene UniversalID!

Ein Konfliktdokument zeichnet sich dadurch aus, dass es ein Item namens "$Conflict" hat - danach kannst Du in einer Ansicht selektieren.

Bernhard

Offline WildVirus

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 658
  • Geschlecht: Männlich
Re: Ansicht Replizierkonflikte
« Antwort #2 am: 11.06.09 - 17:07:51 »
Hallo Thomas,

wie Bernhard schon schreibt, ist das Kriterium @IsAvailable($Conflict ). Hab sowas vor Jahren in einer heute noch genutzten DB eingebaut.

Das habe ich garniert mit einer damals im Internet kursierenden Routine ActiveConflictSolver, so dass das Mischen des Konflikts mit dem Quelldokument auf Feldebene möglich ist.

Funktioniert problemlos.

CU,
Axel

Offline vbis

  • Frischling
  • *
  • Beiträge: 23
Re: Ansicht Replizierkonflikte
« Antwort #3 am: 12.06.09 - 09:59:36 »
Warum schaust Du Dir nicht einfach die Ansicht in der gekauften DB an?
Weil die Gestaltung verborgen ist natürlich. So wie bei den meisten gekauften Datenbanken.

Vielen Dank auch an WildVirus !

Offline LN4ever

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 505
  • Geschlecht: Männlich
Re: Ansicht Replizierkonflikte
« Antwort #4 am: 12.06.09 - 21:31:41 »
Bau in der Ansicht der Replizierkonflikte eine vernünftige Kategorisierung ein, die dir den Konflikt "sprechend" macht. Denn sonst mußt du jedes Konfliktdokument öffnen, damit du weißt, um welches Dokument es sich dabei handelt, also z.B. als Kategoriespalte:

form+"\\"+"Created at " + @Text(Created) + @If(@IsAvailable($UpdatedBy);" by " + @Subset($UpdatedBy;1);"") + @If(@IsAvailable(subject);" "+@Implode(subject;", ");"")

Bau eine Aktionsschaltfläche ein, mit der du den Konflikt mit dem Nicht-Konflikt vergleichen kannst. Empfehlen kann ich da z.B. etwas wie

http://www-10.lotus.com/ldd/sandbox.nsf/Threads/17C785F8028E7C8785256A7000497FD9?OpenDocument

Wenn du dich dafür entscheidest, dann lies und beherzige bitte auch die Kommentare, denn das Tool hat noch ein paar kleine Fallen, deren Lösung dort gleich beschrieben wird.

Ich selbst habe - gerade für die Verwendung in der dir vorschwebenden Ansicht - einen Teil der Script-Lib darum ergänzt, daß das Siegerdokument automatisch als Vergleich herangezogen wird, wenn man nur ein Dokument wählt (das wird dir in der Konfliktdokumentansicht eigentlich immer so gehen):

Sub launch_program (program_name As String)
   '   2006-04-18   Norbert Goeth: Extensions for slections of only one document,
   
   Dim collection As NotesDocumentCollection
   Dim dcResp As NotesDocumentCollection
   Set collection = db.UnprocessedDocuments
   
   If (collection.count > 2) Then
      Msgbox "Usage: You can only compare 2 documents. Please don't select more", MB_OK, program_name
      Exit Sub
   Elseif collection.count=2 Then
      ' Get selected documents.
      Set docMain = collection.GetFirstDocument
      Set docConflict = collection.GetNextDocument (docMain)
   Elseif collection.Count=0 Then
      Msgbox "Usage: You must select 2 documents to compare.", MB_OK, program_name
      Exit Sub
   Else
      Set docMain = collection.GetFirstDocument
      If docMain.HasItem("$Conflict") Then
         Set docConflict=docMain
         Set docMain=db.GetDocumentByUNID(docConflict.ParentDocumentUNID)
      Else
         Set dcResp=docMain.Responses
         If dcResp.count=0 Then
            Msgbox "Usage: You have selected only 1 document without conflicts. You must select 2 documents to compare.", MB_OK, program_name
            Exit Sub
         Else
            Set docConflict=dcResp.GetFirstDocument
            Do While Not docConflict Is Nothing
               If docConflict.HasItem("$Conflict") Then
                  If dcResp.count>1 Then
                     Msgbox "The first conflict is taken for comparison with the selected doc.", MB_OK, program_name
                  End If
                  Exit Do
               End If
               Set docConflict=dcResp.GetNextDocument(docConflict)
            Loop
            If docConflict Is Nothing Then
               Msgbox "The selected document has no conflict document. You must select 2 documents to compare.", MB_OK, program_name
               Exit Sub
            End If
         End If
      End If
   End If
   
   Select Case program_name
      
   Case "Compare Documents"
      Call compare_documents
      
   Case "Examine Document Differences"
      Set docs (1) = docMain
      Set docs (2) = docConflict
      Call examine_document_differences
      
   End Select
   
End Sub

Diese Ansicht und die zugehörigen Aktionen gehört als Standard eigentlich in jede Datenbank. Allerdings gilt immer - und das betrifft das Programmierkonzept: Konflikte vermeiden ist besser als Konflikte zu lösen, und sei das Tool dafür auch noch so ausgefeilt.

Noch eins ist hilfreich, damit Anwender entdecken, daß sie ein Konfliktdokument öffnen oder daß sie ein Dokument öffnen, zu dem es einen Konflikt gibt:

1. Bau in den Header eine dicke, rote Zeile "KONFLIKTDOKUMENT" mit der HW-Formel @IsUnavailable($Conflict) ein.

2. Bau dir eine EmbeddedView mit der Kategorie
@If(@IsAvailable($Ref);@Text($Ref);@Text(@DocumentUniqueID))

Im (Haupt)dokument läßt du diese Ansicht mit der SingleCategory @Text(@DocumentUniqueID) anzeigen, wenn das (Haupt)dokument Antworten enthält. Damit wirfst du in jedem Dokument einen Blick auf die nächste Antwortebene - und siehst damit immer die Konfliktdokumente.

Ich packe diese Ansicht in eine Teilmaske und ziehe diese in der Maske als berechnete Teilmaske ein, z.B.

subform:="EmbZuordnung";
lookupview:="(EmbZuordnung)";
key:=@Text(@DocumentUniqueID);

xview:=@If(@IsNewDoc | d_PrevPane="1";"";subform);
WasDa:=@If(xview="";"";@DbLookup("":"";"";lookupview;key;1));
@If(@IsError(WasDa) | @Elements(WasDa)<2;"";xview)

Und jetzt viel Spaß bei der Konfliktbewältigung.

Gruß

Norbert
Situs vilate in isse tabernit.

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz