"Überschüssige" Felder mit Script entfernen ?

  • Hi,


    ich hoffe, ich kann Euch vermitteln, was mein Problem ist :roll: !


    Also:
    Ich habe zwei Datenbanken. Beide enthalten Dokumente vom gleichen Typ. Die Dokumente enthalten jeweils ca. 500 Felder.


    Aus Datenbank 1 werden einige dieser Dokumente, die bestimmte Kriterien erfüllen, in Datenbank 2 gemailt.


    In Datenbank 2 werden allerdings "nur" ca. 300 Felder aus den Dokumenten benötigt. Daher wird zur Anzeige in dieser Datenbank eine "abgespeckte" Maske verwendet.


    Schön wäre es nun, wenn man diejenigen Felder aus den Dokumenten in Datenbank 2 automatisiert löschen könnte, die ohnehin durch die verkleinerte Maske nicht angezeigt werden.
    Allerdings würde ich die ca. 200 zu löschenden Felder ungerne im Klartext in den Code schreiben wollen.
    Kennt Ihr eine Methode, wie ich per Script vergleichen kann, ob in einer Maske enthaltene Felder tatsächlich auch im Dokument vorhanden sind ?


    Wir reden hier von einer Dokumentenanzahl > 300000, Tendenz wachsend, daher würde sich die Verkleinerung der Dokumente sicherlich positiv auf Performance und Platzbedarf der Datenbank 2 auswirken.


    Wie immer bin ich für jeden Hinweis dankbar ! :D


    Grüssings


    Ozzy

  • Man koennte natuerlich Notesform.Fields mit Notesdocument.Items vergleichen und dann halt loeschen, sollte ein Item nicht in Fields auftauchen oder umgekehrt oder so.

  • Das setzt aber voraus, dass es in den Dokumenten unter keinen Umständen administrativ / programmatisch verwendete Items gibt, für die es keine Entsprechung in einer Maske gibt - und sowas ist doch eher seltener.
    Weiterhin muss sichergestellt sein, dass Felder nicht auf Items verweisen, die dann nicht mehr vorhanden sind.


    Automatisiert über den Vergleich mit einem Designelement würde ich eine solche Bereinigung niemals durchführen.


    Bernhard

    • Offizieller Beitrag

    einfach wird es nicht und ein bissel Arbeit steckt auch drin.


    Folgendes habe ich schon gemacht.


    Ein Agent geht alle Dokument mit einer bestimmten Form durch und schreibt alle gefundenen Felder in ein 2D-Array. An der 2. Stelle des Array werden dann die Anzahl, wie oft ein Feld in den Dokumenten gefunden wird aufsummiert.


    Danach gehst Du die Liste per Hand durch und entscheidest welches Feld entfernt werden kann. Danach einen neuen Agenten bauen, der eine Liste der zu entfernenden Felder durchgeht und diese aus den Dokumenten entfernt.


    Gruß
    Dirk

    Rein logisches Denken verschafft uns keine Erkenntnis über die wirkliche Welt.
    Alle Erkenntnis der Wirklichkeit beginnt mit der Erfahrung und endet mit ihr.
    Alle Aussagen, zu denen man auf rein logischen Wegen kommt, sind, was die Realität angeht, vollkommen leer.
    Albert Einstein

  • Überflüssige Felder löschen ist ja in vielen Datenbanken ein immer wiederkehrendes Thema. Deshalb rate ich zu wiederverwendbarem Code - und ich rate dringendst von Automatismen ab, die sich aus einem nackten Vergleich der in Masken aufgeführten Felder ergeben. Dein Agent, der Erinnerungen versendet, notiert sich garantiert in einem Feld, wann er die letzte Erinnerung versendet hat - und das Feld ist vermutlich in keiner Maske vorhanden. Schwups, ist es weg. Du kommst um die manuelle Festlegung der zu löschenden Feldnamen nicht drumherum.


    Ich habe in vielen DBs eine Script-Library namens APPSPEC, in der es eine Sub gibt, in der die für diese DB nicht (mehr) benötigten Felder aufgeführt werden.


    Sub Loeschliste(appspec_LL)
    Redim appspec_LL(45)
    appspec_LL(0)="Text_x"
    appspec_LL(1)="dummy"
    ...


    appspec_LL(43)="Test_1"
    appspec_LL(44)="zwisch_1"
    appspec_LL(45)="blabla_1"
    ' REDIM setzen ganz oben nicht vergessen
    End Sub


    Dann kannst du in einer Schleife deine Dokumente durchlaufen und die Felder löschen - und diesen Code kannst du in jeder DB wieder einsetzen.


    Options
    Use "APPSPEC"


    (Declarations)
    Dim appspec_LL() As String


    Sub Initialize
    ...
    Call Loeschliste
    Hole erstes Dokument
    While Not doc Is Nothing
    DocWasChanged=False
    Forall LL In appspec_LL
    If docSource.HasItem(LL) Then
    doc.RemoveItem(LL)
    docWasChanged=True
    End If
    End Forall
    ...
    If DocWasChanged Then Call doc.Save(False,False)
    Hole naechstesDokument
    Wend


    Der Vorteil der Deklaration im aufrufenden Part ist, daß du nicht immer wieder mit jeder Änderung der Löschliste selbst alles rekursiv durchkompilieren mußt, was sie verwendet.



    Von den Fehlern, die daraus resultieren, haben wir in letzter Zeit ja häufiger hier gelesen.

  • Hi zusammen,


    danke für Eure Anregungen / Tipps, damit kann ich was anfangen !


    Ich denke mal, es macht wohl Sinn, nicht Dokument und Maske sondern zunächst Original-Maske und verkleinerte Maske miteinander zu vergleichen.


    Aus dieser Differenz kann ich mir ja dann eine Löschliste generieren.


    Beste Grüße


    Ozzy

    • Offizieller Beitrag

    ist trotzdem riskannt.


    Nachdem Du die Liste aller verwendeten Felder generiert hast, würde ich mit TeamStudio Analyser oder mit einer Übersicht versuche zu ermitteln wann und wieso die Felder gesetzt wurden. Manche Felder werden auch per Script erzeugt. Außerdem könnten diese Felder auch aus anderen Anwendungen erzeugt werden.


    Gruß
    Dirk

    Rein logisches Denken verschafft uns keine Erkenntnis über die wirkliche Welt.
    Alle Erkenntnis der Wirklichkeit beginnt mit der Erfahrung und endet mit ihr.
    Alle Aussagen, zu denen man auf rein logischen Wegen kommt, sind, was die Realität angeht, vollkommen leer.
    Albert Einstein

  • Also wenn ich dich wäre dann würde ich das mit einen einfachen formel agent tun, und diesen danach einfach verstecken, und damit als klartext nicht zu sehen.
    Field Weg_Damit := @Deletefield;
    ist der einfachste weg felder zu entfernen, und du kannst damit einen wesentliche menge tun. Alphabetisch sortiert nach feldname, und du hast auch direkt ein überblick.


    Ronka