Autor Thema: "Unique" für DocumentCollection  (Gelesen 1995 mal)

Offline Axel

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.658
  • Geschlecht: Männlich
  • It's not a bug, it's Notes
"Unique" für DocumentCollection
« am: 07.07.03 - 15:40:11 »
Hi,

heute will ich auch mal ein Problem haben. Ein etwas kniffliges sogar.

Ich brauche eine Aktion, die Dokumente anlegt. Sollte ja nicht so schwer sein.  ;D

Aber nu kommts. In der Aktion gehe ich auf eine DocumentCollection aus markierten Dokumenten. In diesen Dokumenten ist ein Feld mit einer DocID enthalten. Da liegt jetzt der Hase im Pfeffer. Es kann nämlich sein, dass in der Collection mehrere Dokumente mit der gleichen DocID vorhanden sind. Diese mehrfach vorhandenen Dokumente sollen, bevor ich die neuen Dokumente anlege aus der Collection gelöscht werden.

Wie kann ich sowas realisieren? Möglichst performant natürlich (was denn sonst) ?

Hat da jemand eine Idee?

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

Offline Meff

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.095
  • Geschlecht: Männlich
  • Das Denken der Zukunft muß Kriege unmöglich machen
    • apparet id etiam caeco
Re:"Unique" für DocumentCollection
« Antwort #1 am: 07.07.03 - 17:13:48 »
Wenn Du das Dokument hast, dann hast Du ja auch die DocId, erstelle doch dann einfach eine neue, prüfe ob der Collection.Count grösser 1 ist und lösche das entsprechende. Die Frage ist, was passiert mit Deiner Collection im Anschluß? Da kann dann ja eines fehlen. Wichtig ist dann eigentlich nur, dass Du nicht mittels GetNthDocument durch die Collection läufst, sondern mittels GetFirst - GetNextDocument, dann sollte der Count der Collection eigentlich unwichtig sein.


Meff
"Zwei Dinge sind zu unserer Arbeit nötig: Unermüdliche Ausdauer und die Bereitschaft, etwas, in das man viel Zeit und Arbeit gesteckt hat, wieder wegzuwerfen."
Albert Einstein

Offline animate

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.540
  • Uh, I'm just gonna go find a cash machine.
    • LA2
Re:"Unique" für DocumentCollection
« Antwort #2 am: 07.07.03 - 18:34:01 »
geht es dir darum, die Collection z ubereinigen oder nur keine doppelten Dokumente anzulegen?

bei ersterem find ich die idee meines Vorredners ziemlich cool.

beim zweiten könntest du evtl. die Dokumente in der Collection in einen Ordner verschieben, der nach diesem DocID-Feld sortiert ist und dann halt den Ordner zum Navigieren zu benutzen und dabei immer die DocID des aktuelllen mit der des vorhergehenden Dokuments zu vergleichen
Thomas

Fortunately, I'm adhering to a pretty strict, uh, drug, uh, regimen to keep my mind, you know, uh, limber.

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.728
  • Geschlecht: Männlich
Re:"Unique" für DocumentCollection
« Antwort #3 am: 07.07.03 - 19:05:10 »
Ich würde es folgendermaßen machen:

collection erzeugen
collection document für doc durchgehen
existiert die DocID in der Zieldatenbank ? wenn nei , neues doc erzeugen, ( Prüfung über GetDocumnetByKey )
wenn ja, weiter zum nächsten doc in der collection

pseudocode:

   GetCollection

   For i% = 0 to collection count

       if GetDocumentByKey(DocID) = false
           create NewDoc
       end if

   next Doc ( Collection )


eknori
Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

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:"Unique" für DocumentCollection
« Antwort #4 am: 08.07.03 - 08:24:53 »
Hi,

erstmal vielen Dank für die Tipps. Ich bin mir aber nicht ganz sicher, ob es mich wirklich weiter bringt. Ich glaube ich muss das noch ein bisschen genauer erklären.

Die Dokumente sind Vorgangsdokumente und das Feld mit der DocID ist die Verknüpfung zu dem dazugehörigen Adressdokument (liegt in einer anderen DB).

Der User markiert nun ein oder mehrere Vorgangsdokumente, um weitere Vorgänge anzulegen. Dabei kann es aber vorkommen das in den markierten Dokumenten (sind in der Collection) mehrere Docs zur gleichen Adresse (also DocID) vorhanden sind. Diese doppelten muß ich herausfiltern.

Dann gehe ich die Collection durch und hole mir die DocID und lege die Vorgänge an.

Ich weiß, das hört sich etwas kompliziert an, aber die User wollen aus allen möglichen und unmöglichen Lagen (sprich Ansichten und Dokumenten) solche Vorgangsdokumente anlegen.

Ich bin an einer Lösung, bin aber noch nicht sicher ob's funktioniert. Wenn ja, informiere ich euch und stelle den Code rein.

Axel

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

Offline Meff

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.095
  • Geschlecht: Männlich
  • Das Denken der Zukunft muß Kriege unmöglich machen
    • apparet id etiam caeco
Re:"Unique" für DocumentCollection
« Antwort #5 am: 08.07.03 - 08:38:12 »
Nur zum Verständnis:

Willst Du nicht, dass mehrere Anwender ein und denselben Vorgang bearbeiten? Oder dass der Anwender nicht das Anlegen zu einem Vorgang mehrmals machen kann?

Meff
"Zwei Dinge sind zu unserer Arbeit nötig: Unermüdliche Ausdauer und die Bereitschaft, etwas, in das man viel Zeit und Arbeit gesteckt hat, wieder wegzuwerfen."
Albert Einstein

Glombi

  • Gast
Re:"Unique" für DocumentCollection
« Antwort #6 am: 08.07.03 - 09:00:50 »
Hi,
wie wär's mit der "Holzhammermethode".
Erstelle ein Array, dass die bereits bearbeiteten DocIDs speichert. Wenn Du dann über die Collection iterierst, prüfe zunächst, ob die DocID bereits bearbeitet wurde.

Also etwa so:
dim checkdoicids() as String
dim i as integer
dim lastdocid as string
dim ret as variant
... Collcection etc....

if dc.Count = 0 then exit sub

i = 0
set doc = dc.GetFirstDocument


do while not doc is nothing

lastdocid = doc.DocID(0)
if i > 0 then
'Prüfe ob DocID im Array ist. falls nicht: erstelle Dokument
ret = ArrayGetIndex(checkdoicids,doc.DocID(0))
if IsNull(ret) then
'erstelle neues Doc
end if
end if

checkdoicids(i) = lastdocid


i = i + 1
set doc = dc.GetNextDocument(doc)

if not doc is nothing then
redim preserve checkdoicids(i - 1) as string
checkdoicids(i-1) = lastdocid
end if

loop


Andreas

Offline Doc Torte

  • Aktives Mitglied
  • ***
  • Beiträge: 178
  • Geschlecht: Männlich
  • ...promovierter Bäcker... ;-)
    • ...that's me
Re:"Unique" für DocumentCollection
« Antwort #7 am: 08.07.03 - 09:40:02 »
... warum immer so kompliziert ?

eine Collection zu durchlaufen dauert doch...

ich arbeite für solche Vorgänge mit Listen. Du erstellst einfach eine Liste, in der Du die DocID als Listeneintrag nimmst, mit IsElement fragst Du ab, ob die angegebene ID schon existiert - das geht schneller und ist auch nicht so kompliziert, da ich mit den ID's arbeite und nicht jedesmal ein Doc zuweisen muß - nebenbei kannst Du die Werte, welche Du zur weiteren Verarbeitung brauchst auch in die Liste legen - und mit ner "List as String", kann das ruhig auch eine große Liste werden  !
« Letzte Änderung: 08.07.03 - 09:47:09 von Doc Torte »
Wer nicht ständig besser wird, hört bald auf gut zu sein !
Schritt für Schritt geht's immer vorwärts...

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:"Unique" für DocumentCollection
« Antwort #8 am: 08.07.03 - 11:13:35 »
Hi,

sodala, es ist vollbracht. Ich hab die Lösung. Hier ist ein Auszug aus dem Agenten:

Zitat
idx = 0
Redim arrID(collection.Count)
Set doc = collection.GetFirstDocument
While Not (doc Is Nothing)
   Set tmpdoc = collection.GetNextDocument(doc)
   If idx = 0 Then
      arrID(idx) = doc.xAdressID(0)
   Else
      strTemp = doc.xAdressID(0)
      If Isnull(Arraygetindex(arrID, strTemp)) Then
         arrID(idx) = doc.xAdressID(0)
      Else
         Call collection.DeleteDocument(doc)
      End If  'If Arraygetindex(arrID, doc.xAdressID, 0) <> Null Then         
   End If  'If idx = 0 Then
   idx = idx + 1
   Set doc = tmpdoc
Wend  'While Not (doc Is Nothing)

'Ab hier wird die Collection durchlaufen um die entsprechenden
Infos auszulesen und die Dokumente anzulegen

Das kommt der Lösung von Glombi sehr nahe.

@DocTorte
Hast recht, das durchlaufen der Collection dauert. Aber ich braucht die bereinigte Collection um weitere Infos auszulesen, die ich für die weiteren Aktionen benötige.

@Meff
Es soll ein Vorgang nicht mehrfach angelegt werden.

Vielen Dank an alle die sich Gedanken gemacht haben.

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

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz