Das Notes Forum

Domino 9 und frühere Versionen => ND7: Entwicklung => Thema gestartet von: ch am 13.12.07 - 17:05:39

Titel: Es ist bereits ein uidokument geöffnet
Beitrag von: ch am 13.12.07 - 17:05:39


Halllo liebe Notes Gemeinde ich habe bei dem Aufruf des folgenden Code ein Problem:
Wenn ich ich das zweite Dokument in der collection speichern möchte bekomme ich die Fehlermeldung:
"Eine weitere Kopie dieses Dokumentes wurde gespeichert. Wollen Sie ein Konfliktdokument erzeugen?"
Ich arbeite alleine auf dem Testserver und es passiert bei unterschiedlichen Datensätzen - Hat jemand von euch eine Idee?
lg claudia


      VarSearch0 = "@Contains(MonPrdDocIDAnlage;{" & x & "})"
      VarSearch1 = "@Contains(@text(MonPrdMonat);{" & VarMY & "})"
      VarSearch2 = "@Contains(@text(MonPrdMonat);{" & VarMY2 & "})"
      VarSearch3 = "@Contains(Form ; ""frmMonatsblattWasserverteilungsanlage"")"
      VarSearch4 = "@Contains(Form ; ""frmMonatsblattWasserproduktionsanlage"")"
      
      Set dc = db.Search(VarSearch0 & " & (" & VarSearch1 & " | " & VarSearch2 &") & (" & VarSearch3 & " | " & VarSearch4 & ")", Nothing, 0)      
      
      Set doc = dc.GetFirstDocument()
      If dc.Count >2 Then
         VarReplizierkonflikt = VarReplizierkonflikt & "-" & doc.UniversalID
      Else
         While Not(doc Is Nothing)
            Set doc2 = db.GetDocumentByUNID(doc.UniversalID)
            Set uidoc = ws.EditDocument(True, doc2)
            Set doc2 = Nothing
            Call uidoc.Save
            Call uidoc.Close(True)
         Wend
      End If
   End Forall
Titel: Re: Es ist bereits ein uidokument geöffnet
Beitrag von: DerAndre am 13.12.07 - 17:13:10
Ich bin zwar nicht mehr ganz denkgeeignet. A-Bär

>2 bedeutet ja mindestens drei, oder?

Die whileschleife kannst Du dir ja sparen wenn es nur ein Doc geben sollte. Dann machst Du ein if not doc is nothing dahin.

So, mache jetzt Feierabend...
Titel: Re: Es ist bereits ein uidokument geöffnet
Beitrag von: flaite am 13.12.07 - 17:24:45
Was willst du damit eigentlich damit erreichen?

Code
set uidoc = ws.EditDocument(True, doc2)
Set doc2 = Nothing
Call uidoc.Save
Call uidoc.Close(True)

Mit solchen gesprungenen Ridberger zwischen Backend-Objekten und Frontend/UI-Objekten sollte man vorsichtig umgehen. Vielleicht macht doc.computeWithForm genau was du willst und du benötigst gar keine Frontend Operationen?
Titel: Re: Es ist bereits ein uidokument geöffnet
Beitrag von: koehlerbv am 13.12.07 - 17:31:18
Ich sehe das genauso wie Axel. Das kann nicht gut gehen.

Wozu soll dieser Stunt überhaupt gut sein? Das lässt sich bestimmt anders lösen.

Und das
Code
         While Not(doc Is Nothing)
            Set doc2 = db.GetDocumentByUNID(doc.UniversalID)
            Set uidoc = ws.EditDocument(True, doc2)
            Set doc2 = Nothing
            Call uidoc.Save
            Call uidoc.Close(True)
         Wend
ist "'In Ewigkeit, Amen', sprach die Endlosschleife"!

Oder fehlt da Code?

Bernhard
Titel: Re: Es ist bereits ein uidokument geöffnet
Beitrag von: ch am 13.12.07 - 17:31:45
ich habe dokumente in einer exceltabelle und die sollen in ein DB eingetragen werden die eine fremdfirma erstellt hat. um zu vermeiden dass berechnungen die im hintergrund nicht durchgeführt werden habe ich den import ins Frontend gelegt.
lg claudia
Titel: Re: Es ist bereits ein uidokument geöffnet
Beitrag von: ch am 13.12.07 - 17:47:42
ich bin so doof...
habe vergessen das nächste Dokument in der Schleife aufzurufen und damit hat er das selbe dokument zwei mal hintereinander geöfnet.
jetzt stellt sich mir nur die frage wenn ich das dokument speichere und schließe und dann das selbe dokument nocheinmal aufrufe wieso kommt es dann zu einem replizierkonflikt?
lg claudia
Titel: Re: Es ist bereits ein uidokument geöffnet
Beitrag von: koehlerbv am 13.12.07 - 18:02:16
Du bekommst auf jeden Fall ein Timingproblem.

Warum machst Du die Sache nicht sauber und machst die erforderlichen Berechnungen auch im Backend? Das ist der übliche Weg.

Bernhard
Titel: Re: Es ist bereits ein uidokument geöffnet
Beitrag von: ch am 13.12.07 - 18:14:45
würde ich gern - aber das programmierproject der DB von der fremdfirma weist fehler und performanceprobleme auf und wenn ich per backend daten importier  entfällt der support und damit ich firmenanweisung frontend

lg claudia
Titel: Re: Es ist bereits ein uidokument geöffnet
Beitrag von: koehlerbv am 13.12.07 - 18:22:51
... und wenn ich per backend daten importier  entfällt der support und damit ich firmenanweisung frontend ...

Muss ich jetzt verstehen, was Du damit sagen willst? Nö.

Bernhard
Titel: Re: Es ist bereits ein uidokument geöffnet
Beitrag von: ch am 13.12.07 - 18:50:04
da habe ich mich vielleicht ein bisschen kompliziert ausgedrückt
wir verlieren die garantie und supportanspruch wenn wir backend daten einbringen

lg claudia
Titel: Re: Es ist bereits ein uidokument geöffnet
Beitrag von: koehlerbv am 13.12.07 - 19:14:12
Claudia, bitte besorge Dir eine Tastatur, an der die Grossbuchstaben noch funktionieren. Dieser SMS style-Text liest sich zu schwer und das haben wir nicht verdient.

Ich verstehe aber Euer Grundproblem nicht: Du hantierst doch schon im Backend herum, und der Import muss ja auch im Backend passieren. Wenn ich der Hersteller wäre und ich würde sowas entdecken, würde ich auch auf meinen Garantieanschluss pochen. Ihr habt also sowieso schon verloren.

Wenn Ihr mit der DB sowieso Schwierigkeiten habt: Warum löst Ihr das Problem denn nicht prinzipiell (und schmeisst den Hersteller 'raus)?

Bernhard
Titel: Re: Es ist bereits ein uidokument geöffnet
Beitrag von: flaite am 13.12.07 - 20:31:48
Zitat
Leute, die sich auf so etwas einlassen, halte ich für unprofessionell. Die Risiken von Arbeiten für die Tonne sind einfach zu hoch.
Ich meine damit das Management, nicht Claudia.
Titel: Re: Es ist bereits ein uidokument geöffnet
Beitrag von: pete_bla am 13.12.07 - 20:51:22
Hi,

scheinbar ist das Problem ja gelöst, mit dem set doc = dc.GetNextDocument(doc).

Ich verstehe aber noch immer nicht was deine Funktion nun mit "nicht backend" zu tun hat.
Nur weil Du dein erstelltes Dokument einmal UI aufmachst, UI.Save() und zu machst ist das noch lange nicht "Frontend" -
Normalerweise kann man ja davon ausgehen, dass dies genügt,
aber Du hast die DB ja so beschrieben:
würde ich gern - aber das programmierproject der DB von der fremdfirma weist fehler und performanceprobleme auf und wenn ich per backend daten importier  entfällt der support und damit ich firmenanweisung frontend

lg claudia
Und wenn sie so toll ist, kannst du sicher davon ausgehen, dass es hier irgendwelche Aktionen wie
- Daten eintragen, wenn das Dokument über eine Schaltfläche erzeugt wird,
- Daten verarbeiten, wenn das Dokument über eine Schaltfläche geschlossen wird,
- Feldvalidierungen und umsetzungen in z.B. Exiting()
...
und für sowas reicht ein UIDoc = WS.Edit + UIDoc.Save noch lange nicht aus.

Den Knaller hierzu habe ich neulich in einer DB gesehen:
im Exiting() von mehreren Feldern: ein db.search(), ob der eingegebene Wert eindeutig in der db ist....
(Ich dachte zuerst mir schläft das Gesicht ein  ^-^ , als ich ausversehen in das Feld geklickt habe und dann zum nächsten wollte!)

jetzt bin ich auch abgeschweift.... sorry

Also zum Thema:
Damit bekommst Du GARANTIERT ein Laufzeitproblem
Code
   While Not(doc Is Nothing)
            Set doc2 = db.GetDocumentByUNID(doc.UniversalID)
            Set uidoc = ws.EditDocument(True, doc2)
            Set doc2 = Nothing
            Call uidoc.Save
            Call uidoc.Close(True)
            set doc = dc.GetNextDocument(doc)
   Wend
uidoc.Close(imidiate) ist auch nicht wirklich sofort
und Du stolperst über es selbst selbst backend und frontend, da Dir anfänglich ja noch das
            set doc = dc.GetNextDocument(doc)
fehlte!
Das UIDoc war trotzt  Call uidoc.Close(True) zum zeitpunkt des nächsten
Set uidoc = ws.EditDocument(True, doc2) noch nicht zu!

Und wo / wie schreibst Du denn die Daten rein ? (Ist ja wohl backend!)
Ein doc.ComputeWithForm() ergibt eingentlich (fast) das selbe her,
ansonsten gäbe es noch
@Command( [ToolsRefreshSelectedDocs] )
bzw.
@Command( [ToolsRefreshAllDocs] )
die an deine Vorgehensweise auch herankommen!

Und wenn Du solche oder ähnliche Aktionen wie ich oben beschrieben habe in der DB hast,
Dann hast Du auch mit Deiner Aktion keine Chance!

-> am besten nachsehen, welche Aktionen da in der DB vorgehen.

Oft reicht aber der Import mit "sauberem" Datenbefüllen
und dann ein doc.computewithForm aus.
oder noch "simpler" eine saubere "Excelvorlage" als ".wk3/.wk4"
und ein Import mit "Lotus 123" sowie einem "Felder von Maske berechnen" beim importieren. (Ganz ohne Programmierung!)  ;)

Gruss, Pete(r)

PS: 23764273027282480476772824782236106480890947906260282406424809582554281
48 65 78 61 64 65 7A 69 6D 61 6C 20 67 65 68 74 73 20 61 62 65 72 20 64 61 6E 6E 20 6C 65 69 63 86 74 65 72 20 2D 20 64 61 6E 6B 20 54 6F 6F 6C 73 21