Archive for: ‘Dezember 2012’

Rückblick 2012

31. Dezember 2012, 12:15 Erstellt von motzet-online.de (286 clicks)

see the english version here Konferenzen 22. bis 23. März: BLUG in Antwerpen, eine sehr sehr beeindruckende Konferenz mit vielen guten Beiträgen vgl. dazu meine beiden Reviews hier im Blog: Teil 1 …

Einen guten Rutsch und ein gutes neues Jahr

31. Dezember 2012, 11:09 Erstellt von Ralf Petter (281 clicks)

Ein arbeitsreiches und spannendes Jahr mit vielen neuen Entwicklungen im Bereich der IT liegt hinter uns. Ein Jahr in dem ich sehr viel neues von vielen Leuten in der „Yellowbubble“ lernen durfte und hoffe, dass auch der eine oder andere aus meinen Blo…

[EN] 2013 #SocBiz Prediction: “Web Experience Management is Becoming the New ERP”

30. Dezember 2012, 15:32 Erstellt von StefanP. (241 clicks)

And another prediction for 2013, this time from Douglas Heise,  Product Marketing Director at CoreMedia: Web Experience Management is Becoming the New ERP In the traditional enterprise software world, people use enterprise resource planning (ERP) tools to integrate and optimize … Continue reading

Serverumzug – fast fertig

30. Dezember 2012, 13:45 Erstellt von motzet-online.de (253 clicks)

So nebenbei haben wir seit Anfang Dezenber den Umzug unseres Servers von Weißenburg nach Nürnberg vorangetrieben. Seit heute ist (fast) alles fertig, noch einige kleine Nacharbeiten, aber dann haben w …

Zeitgeist 2012 – Das Jahr im Rückblick

29. Dezember 2012, 17:36 Erstellt von Alexander Kluge (238 clicks)

[EN] 2013 #SocBiz Prediction: From Punk Rock to Mainstream?

29. Dezember 2012, 16:09 Erstellt von StefanP. (282 clicks)

This time the 2013 predictions from Tom Petrocelli, Senior Analyst investigating the Social Enterprise: If the enterprise social applications market was a music genre, it would be punk rock. Everything about it just seems faster and louder. As I look … Continue reading

Erste Eindrücke vom Browserplugin und iNotes

28. Dezember 2012, 18:51 Erstellt von Ralf Petter (514 clicks)

Nachdem ich im letzten Post bereits die ersten Eindrücke zum Notesclient festgehalten habe möchte ich jetzt auch meinen Eindruck zweier Features die wir zwar nicht verwenden, die aber sehr viele Entwicklungsressourcen im Notes Entwicklungsteam gebund…

Notes 9 als Anwender; erster Blick Hui, zweiter Blick leider Pfui.

28. Dezember 2012, 16:00 Erstellt von Ralf Petter (680 clicks)

Endlich über die Weihnachtsfeiertage bin ich auch mal dazu gekommen mir die Beta von Notes 9 Social Edition im Detail anzusehen. Vorweg schicken möchte ich, dass ich Notes seit über 12 Jahren sowohl als Anwender als auch als Administrator und auch a…

[EN] 2013 #SocBiz Prediction: “Mobile is the new normal”

28. Dezember 2012, 15:43 Erstellt von StefanP. (277 clicks)

And another expert looking forward into 2013. This time Brett Caine, senior vice president and general manager for the Citrix Online Services division: The number of work-at-home employees is increasing dramatically and not just day-extenders. For the first time we … Continue reading

Wie kann ich programmatisch private Gestaltungselemente auf Aktualität prüfen?

28. Dezember 2012, 08:13 Erstellt von Manfred Meise (9 clicks)

Wir setzen eine Anwendung mit privaten Ansichten und Ordnern ein, die regelmäßig weiterentwickelt wird und produktive Datenbanken durch Schalonenaktualisierung anpasst. Hierbei werden die privaten Kopien der Ansichten und Ordner nicht automatisch aktualisiert. Bei der Konzeption einer „selbstgestrikten“ Aktualisierungslogik stößt man schnell auf die Frage: „Wie kann ich erkennen, ob die private Kopie des Gestaltungselementes aktuell ist?“

Vergleich von Zeitstempeln

a) Einsatz von NotesView

Die Idee: Man öffnet die Ansicht und hat Zeitstempel (Erstelldatum; letzte Änderung) des jeweiligen gemeinsamen Gestaltungselementes und der privaten Kopie.. Klingt gut, ist es aber nicht!

So erhält man mit

 
Dim view as NotesView
set view = db.getView ("Meine Ansicht")

jeweils die gemeinsame Ansichtsvorlage, wenn die private Kopie nicht existiert, jedoch die private Kopie des Ansicht, wenn diese exisiert. Somit kann man im Regelfall (wenn die private Kopie NICHT existiert) nicht auf die gemeinsame Vorlage zu Vergleichszwecken zugreifen.

Ergebnis: Nicht praktikabel !

b) Einsatz von NotesDatabase.Views

Die Idee: Man arbeitet alle Ansichten (gemeinsame Vorlagen und private Kopien) einer Datenbank ab und muss die jeweiligen Exemplare (Vorlage  / Kopie) einander zuordnen, um sie zu vergleichen.. Das muĂź doch gehen!

So durchsucht folgendes Skript die Datenbank nach Ordnern mit dem AliasNamen „F2-DE“ und listet jeweils die Universal-ID der Gestaltungselemente auf:

 
Sub
Initialize

Dim
s                         As New NotesSession
Dim
db                         As NotesDatabase
Dim
view                 As NotesView
Dim
vViewNames        As Variant

Set
db = s.Currentdatabase

ForAll
v In db.Views
      Set view = v
      vViewNames = view.Aliases
      If Not IsEmpty (vViewNames) then
              If vViewNames(0) = "F2-DE" Then    
                      If Not IsEmpty (view.Readers) Then
                              MessageBox |Private Kopie des Ordners "F2" gefunden: | & view.Universalid
                      Else
                              MessageBox |Gemeinsame Vorlage des Ordner "F2" gefunden: | & view.Universalid
                      End If
              End If
      End If
End
ForAll
End
Sub

Interessant und noch nicht vollständig erforscht: Dieses Skript findet sogar private Kopien von Ordnern (in Datenbank gespeichert), welche der Domino Designer nicht anzeigt! Nach anfänglicher Begeisterung über diesen Lösungsansatz, habe ich dieses Skript gegen eine große produktive Datenbank laufen lassen und musste feststellen, dass jeweils beim Zugriff auf ein Ansichtsobjekt die Ansichtsindizes aktualisiert werden, um nur auf unwesentliche Merkmale der Ansicht zuzugreifen. Ein echter Performance-Killer, wollte ich diese Logik in einem Datenbank-Script beim Öffnen der Datenbank einsetzen. In meinen Testfällen habe ich teilweise 15 Sekunden warten müssen, bevor ich mein Ergebnis hatte.

Hinweis: Es ist darauf zu achten, NICHT auf die gemeinsame Vorlage der Ansicht/des Ordners zuzugreifen, da dieses einen Laufzeitfehler 4005 „Index is not to be generated on server“ verursacht. Somit ist stets z.B. mit isEmpty(view.Readers) zu prĂĽfen, dass auf eine private Kopie zugegriffen wird (die PrĂĽfung anderer Attribute ist nicht möglich).

Ergebnis: Zu langsam fĂĽr den Produktionsbetrieb!

b) Einsatz von NotesNoteCollection>

Die Idee: Man kann doch die Gestaltungselemente sammeln und auf diese als NotesDocument zugreifen!. So erhalte ich Informationen zum Gestaltungselement, ohne den Indexer zu triggern!

Schon häufig habe ich mit der NotesNoteCollection Klasse auf Gestaltungslemente (Ansichten, Felder, Agenten, Teilmasken) zugegriffen und hierfĂĽr u.A. auch eine Selektionsformel einsetzen können, nach Elementen mit speziellen Attributen zu suchen. So wĂĽrde ich mit den Werten des „$Flags“ Items auf bestimmte Ansichts-/Ordner-Typen zugreifen und mit Auswertung des „$Readers“ Felders den EigentĂĽmer einer privaten Kopie identifizieren können.

siehe dieses Codebeispiel …

Beim Einsatz dieses Skriptes gegen eine groĂźe produktive Datenbank ist dieses schneller als das zuvor, jedoch immer noch zu langsam, da eine Datenbanksuche angestoĂźen wird.. Ein echter Performance-Killer, wollte ich diese Logik in einem Datenbank-Script beim Ă–ffnen der Datenbank einsetzen.

Ergebnis: Besser, doch noch zu langsam für den Produktionsbetrieb! Vorteil: Ich kann die Namen der Ansichten/Ordner ermitteln, die ich behandeln möchte.

Einsatz eines Namensschemas

Nach intensiven Tests habe ich alle oben beschriebenen Lösungsansätze verworfen und mich für die Variante entschieden (welche in diesem Beitrag nicht näher beschrieben ist):

  • Ich fĂĽhre ein Namensschema (speziell fĂĽr Ansichten, die lokal statt in der Datenbank gespeichert werden) ein und ändere die Namen der Gestaltungselemente, wenn ich diese aktualisiere
  • Ich akzeptiere, durch EinfĂĽhrung eines Versionskennzeichens fĂĽr die gesamte Anwendung, dass ich ggf. Elementen aktualisiere, deren Gestaltung sich zur Vorversion nicht geändert haben


Ergebnis:
Sehr performant, da keinerlei PrĂĽfungen

Dieser Artikel ist Teil der Artikelserie:  Gestaltungsaktualisierung privater Ansichten und Ordner stellt eine echte Herausforderung dar

Wie kann ich programmatisch private Gestaltungselemente auf Aktualität prüfen?

28. Dezember 2012, 08:13 Erstellt von Manfred Meise (2 clicks)

Wir setzen eine Anwendung mit privaten Ansichten und Ordnern ein, die regelmäßig weiterentwickelt wird und produktive Datenbanken durch Schalonenaktualisierung anpasst. Hierbei werden die privaten Kopien der Ansichten und Ordner nicht automatisch ak…

Wie kann ich programmatisch private Gestaltungselemente auf Aktualität prüfen?

28. Dezember 2012, 08:13 Erstellt von Manfred Meise (9 clicks)

Wir setzen eine Anwendung mit privaten Ansichten und Ordnern ein, die regelmäßig weiterentwickelt wird und produktive Datenbanken durch Schalonenaktualisierung anpasst. Hierbei werden die privaten Kopien der Ansichten und Ordner nicht automatisch aktualisiert. Bei der Konzeption einer „selbstgestrikten“ Aktualisierungslogik stößt man schnell auf die Frage: „Wie kann ich erkennen, ob die private Kopie des Gestaltungselementes aktuell ist?“

Vergleich von Zeitstempeln

a) Einsatz von NotesView

Die Idee: Man öffnet die Ansicht und hat Zeitstempel (Erstelldatum; letzte Änderung) des jeweiligen gemeinsamen Gestaltungselementes und der privaten Kopie.. Klingt gut, ist es aber nicht!

So erhält man mit

 
Dim view as NotesView
set view = db.getView ("Meine Ansicht")

jeweils die gemeinsame Ansichtsvorlage, wenn die private Kopie nicht existiert, jedoch die private Kopie des Ansicht, wenn diese exisiert. Somit kann man im Regelfall (wenn die private Kopie NICHT existiert) nicht auf die gemeinsame Vorlage zu Vergleichszwecken zugreifen.

Ergebnis: Nicht praktikabel !

b) Einsatz von NotesDatabase.Views

Die Idee: Man arbeitet alle Ansichten (gemeinsame Vorlagen und private Kopien) einer Datenbank ab und muss die jeweiligen Exemplare (Vorlage  / Kopie) einander zuordnen, um sie zu vergleichen.. Das muß doch gehen!

So durchsucht folgendes Skript die Datenbank nach Ordnern mit dem AliasNamen „F2-DE“ und listet jeweils die Universal-ID der Gestaltungselemente auf:

 
Sub
Initialize

Dim
s                         As New NotesSession
Dim
db                         As NotesDatabase
Dim
view                 As NotesView
Dim
vViewNames        As Variant

Set
db = s.Currentdatabase

ForAll
v In db.Views
      Set view = v
      vViewNames = view.Aliases
      If Not IsEmpty (vViewNames) then
              If vViewNames(0) = "F2-DE" Then    
                      If Not IsEmpty (view.Readers) Then
                              MessageBox |Private Kopie des Ordners "F2" gefunden: | & view.Universalid
                      Else
                              MessageBox |Gemeinsame Vorlage des Ordner "F2" gefunden: | & view.Universalid
                      End If
              End If
      End If
End
ForAll
End
Sub

Interessant und noch nicht vollständig erforscht: Dieses Skript findet sogar private Kopien von Ordnern (in Datenbank gespeichert), welche der Domino Designer nicht anzeigt! Nach anfänglicher Begeisterung über diesen Lösungsansatz, habe ich dieses Skript gegen eine große produktive Datenbank laufen lassen und musste feststellen, dass jeweils beim Zugriff auf ein Ansichtsobjekt die Ansichtsindizes aktualisiert werden, um nur auf unwesentliche Merkmale der Ansicht zuzugreifen. Ein echter Performance-Killer, wollte ich diese Logik in einem Datenbank-Script beim Öffnen der Datenbank einsetzen. In meinen Testfällen habe ich teilweise 15 Sekunden warten müssen, bevor ich mein Ergebnis hatte.

Hinweis: Es ist darauf zu achten, NICHT auf die gemeinsame Vorlage der Ansicht/des Ordners zuzugreifen, da dieses einen Laufzeitfehler 4005 „Index is not to be generated on server“ verursacht. Somit ist stets z.B. mit isEmpty(view.Readers) zu prüfen, dass auf eine private Kopie zugegriffen wird (die Prüfung anderer Attribute ist nicht möglich).

Ergebnis: Zu langsam für den Produktionsbetrieb!

b) Einsatz von NotesNoteCollection>

Die Idee: Man kann doch die Gestaltungselemente sammeln und auf diese als NotesDocument zugreifen!. So erhalte ich Informationen zum Gestaltungselement, ohne den Indexer zu triggern!

Schon häufig habe ich mit der NotesNoteCollection Klasse auf Gestaltungslemente (Ansichten, Felder, Agenten, Teilmasken) zugegriffen und hierfür u.A. auch eine Selektionsformel einsetzen können, nach Elementen mit speziellen Attributen zu suchen. So würde ich mit den Werten des „$Flags“ Items auf bestimmte Ansichts-/Ordner-Typen zugreifen und mit Auswertung des „$Readers“ Felders den Eigentümer einer privaten Kopie identifizieren können.

siehe dieses Codebeispiel …

Beim Einsatz dieses Skriptes gegen eine große produktive Datenbank ist dieses schneller als das zuvor, jedoch immer noch zu langsam, da eine Datenbanksuche angestoßen wird.. Ein echter Performance-Killer, wollte ich diese Logik in einem Datenbank-Script beim Öffnen der Datenbank einsetzen.

Ergebnis: Besser, doch noch zu langsam für den Produktionsbetrieb! Vorteil: Ich kann die Namen der Ansichten/Ordner ermitteln, die ich behandeln möchte.

Einsatz eines Namensschemas

Nach intensiven Tests habe ich alle oben beschriebenen Lösungsansätze verworfen und mich für die Variante entschieden (welche in diesem Beitrag nicht näher beschrieben ist):

  • Ich führe ein Namensschema (speziell für Ansichten, die lokal statt in der Datenbank gespeichert werden) ein und ändere die Namen der Gestaltungselemente, wenn ich diese aktualisiere
  • Ich akzeptiere, durch Einführung eines Versionskennzeichens für die gesamte Anwendung, dass ich ggf. Elementen aktualisiere, deren Gestaltung sich zur Vorversion nicht geändert haben


Ergebnis:
Sehr performant, da keinerlei Prüfungen

Dieser Artikel ist Teil der Artikelserie:  Gestaltungsaktualisierung privater Ansichten und Ordner stellt eine echte Herausforderung dar

Wie kann ich programmatisch private Gestaltungselemente auf Aktualität prüfen?

28. Dezember 2012, 08:13 Erstellt von Manfred Meise (23 clicks)

Wir setzen eine Anwendung mit privaten Ansichten und Ordnern ein, die regelmäßig weiterentwickelt wird und produktive Datenbanken durch Schalonenaktualisierung anpasst. Hierbei werden die privaten Kopien der Ansichten und Ordner nicht automatisch aktualisiert. Bei der Konzeption einer „selbstgestrikten“ Aktualisierungslogik stößt man schnell auf die Frage: „Wie kann ich erkennen, ob die private Kopie des Gestaltungselementes aktuell ist?“

Vergleich von Zeitstempeln

a) Einsatz von NotesView

Die Idee: Man öffnet die Ansicht und hat Zeitstempel (Erstelldatum; letzte Änderung) des jeweiligen gemeinsamen Gestaltungselementes und der privaten Kopie.. Klingt gut, ist es aber nicht!

So erhält man mit

 
Dim view as NotesView
set view = db.getView ("Meine Ansicht")

jeweils die gemeinsame Ansichtsvorlage, wenn die private Kopie nicht existiert, jedoch die private Kopie des Ansicht, wenn diese exisiert. Somit kann man im Regelfall (wenn die private Kopie NICHT existiert) nicht auf die gemeinsame Vorlage zu Vergleichszwecken zugreifen.

Ergebnis: Nicht praktikabel !

b) Einsatz von NotesDatabase.Views

Die Idee: Man arbeitet alle Ansichten (gemeinsame Vorlagen und private Kopien) einer Datenbank ab und muss die jeweiligen Exemplare (Vorlage  / Kopie) einander zuordnen, um sie zu vergleichen.. Das muĂź doch gehen!

So durchsucht folgendes Skript die Datenbank nach Ordnern mit dem AliasNamen „F2-DE“ und listet jeweils die Universal-ID der Gestaltungselemente auf:

 
Sub
Initialize

Dim
s                         As New NotesSession
Dim
db                         As NotesDatabase
Dim
view                 As NotesView
Dim
vViewNames        As Variant

Set
db = s.Currentdatabase

ForAll
v In db.Views
      Set view = v
      vViewNames = view.Aliases
      If Not IsEmpty (vViewNames) then
              If vViewNames(0) = "F2-DE" Then    
                      If Not IsEmpty (view.Readers) Then
                              MessageBox |Private Kopie des Ordners "F2" gefunden: | & view.Universalid
                      Else
                              MessageBox |Gemeinsame Vorlage des Ordner "F2" gefunden: | & view.Universalid
                      End If
              End If
      End If
End
ForAll
End
Sub

Interessant und noch nicht vollständig erforscht: Dieses Skript findet sogar private Kopien von Ordnern (in Datenbank gespeichert), welche der Domino Designer nicht anzeigt! Nach anfänglicher Begeisterung über diesen Lösungsansatz, habe ich dieses Skript gegen eine große produktive Datenbank laufen lassen und musste feststellen, dass jeweils beim Zugriff auf ein Ansichtsobjekt die Ansichtsindizes aktualisiert werden, um nur auf unwesentliche Merkmale der Ansicht zuzugreifen. Ein echter Performance-Killer, wollte ich diese Logik in einem Datenbank-Script beim Öffnen der Datenbank einsetzen. In meinen Testfällen habe ich teilweise 15 Sekunden warten müssen, bevor ich mein Ergebnis hatte.

Hinweis: Es ist darauf zu achten, NICHT auf die gemeinsame Vorlage der Ansicht/des Ordners zuzugreifen, da dieses einen Laufzeitfehler 4005 „Index is not to be generated on server“ verursacht. Somit ist stets z.B. mit isEmpty(view.Readers) zu prĂĽfen, dass auf eine private Kopie zugegriffen wird (die PrĂĽfung anderer Attribute ist nicht möglich).

Ergebnis: Zu langsam fĂĽr den Produktionsbetrieb!

b) Einsatz von NotesNoteCollection>

Die Idee: Man kann doch die Gestaltungselemente sammeln und auf diese als NotesDocument zugreifen!. So erhalte ich Informationen zum Gestaltungselement, ohne den Indexer zu triggern!

Schon häufig habe ich mit der NotesNoteCollection Klasse auf Gestaltungslemente (Ansichten, Felder, Agenten, Teilmasken) zugegriffen und hierfĂĽr u.A. auch eine Selektionsformel einsetzen können, nach Elementen mit speziellen Attributen zu suchen. So wĂĽrde ich mit den Werten des „$Flags“ Items auf bestimmte Ansichts-/Ordner-Typen zugreifen und mit Auswertung des „$Readers“ Felders den EigentĂĽmer einer privaten Kopie identifizieren können.

siehe dieses Codebeispiel …

Beim Einsatz dieses Skriptes gegen eine groĂźe produktive Datenbank ist dieses schneller als das zuvor, jedoch immer noch zu langsam, da eine Datenbanksuche angestoĂźen wird.. Ein echter Performance-Killer, wollte ich diese Logik in einem Datenbank-Script beim Ă–ffnen der Datenbank einsetzen.

Ergebnis: Besser, doch noch zu langsam für den Produktionsbetrieb! Vorteil: Ich kann die Namen der Ansichten/Ordner ermitteln, die ich behandeln möchte.

Einsatz eines Namensschemas

Nach intensiven Tests habe ich alle oben beschriebenen Lösungsansätze verworfen und mich für die Variante entschieden (welche in diesem Beitrag nicht näher beschrieben ist):

  • Ich fĂĽhre ein Namensschema (speziell fĂĽr Ansichten, die lokal statt in der Datenbank gespeichert werden) ein und ändere die Namen der Gestaltungselemente, wenn ich diese aktualisiere
  • Ich akzeptiere, durch EinfĂĽhrung eines Versionskennzeichens fĂĽr die gesamte Anwendung, dass ich ggf. Elementen aktualisiere, deren Gestaltung sich zur Vorversion nicht geändert haben


Ergebnis:
Sehr performant, da keinerlei PrĂĽfungen

Dieser Artikel ist Teil der Artikelserie:  Gestaltungsaktualisierung privater Ansichten und Ordner stellt eine echte Herausforderung dar

Wie kann ich programmatisch private Gestaltungselemente auf Aktualität prüfen?

28. Dezember 2012, 08:13 Erstellt von Manfred Meise (13 clicks)

Wir setzen eine Anwendung mit privaten Ansichten und Ordnern ein, die regelmäßig weiterentwickelt wird und produktive Datenbanken durch Schalonenaktualisierung anpasst. Hierbei werden die privaten Kopien der Ansichten und Ordner nicht automatisch aktualisiert. Bei der Konzeption einer „selbstgestrikten“ Aktualisierungslogik stößt man schnell auf die Frage: „Wie kann ich erkennen, ob die private Kopie des Gestaltungselementes aktuell ist?“

Vergleich von Zeitstempeln

a) Einsatz von NotesView

Die Idee: Man öffnet die Ansicht und hat Zeitstempel (Erstelldatum; letzte Änderung) des jeweiligen gemeinsamen Gestaltungselementes und der privaten Kopie.. Klingt gut, ist es aber nicht!

So erhält man mit

 
Dim view as NotesView
set view = db.getView ("Meine Ansicht")

jeweils die gemeinsame Ansichtsvorlage, wenn die private Kopie nicht existiert, jedoch die private Kopie des Ansicht, wenn diese exisiert. Somit kann man im Regelfall (wenn die private Kopie NICHT existiert) nicht auf die gemeinsame Vorlage zu Vergleichszwecken zugreifen.

Ergebnis: Nicht praktikabel !

b) Einsatz von NotesDatabase.Views

Die Idee: Man arbeitet alle Ansichten (gemeinsame Vorlagen und private Kopien) einer Datenbank ab und muss die jeweiligen Exemplare (Vorlage  / Kopie) einander zuordnen, um sie zu vergleichen.. Das muß doch gehen!

So durchsucht folgendes Skript die Datenbank nach Ordnern mit dem AliasNamen „F2-DE“ und listet jeweils die Universal-ID der Gestaltungselemente auf:

 
Sub
Initialize

Dim
s                         As New NotesSession
Dim
db                         As NotesDatabase
Dim
view                 As NotesView
Dim
vViewNames        As Variant

Set
db = s.Currentdatabase

ForAll
v In db.Views
      Set view = v
      vViewNames = view.Aliases
      If Not IsEmpty (vViewNames) then
              If vViewNames(0) = "F2-DE" Then    
                      If Not IsEmpty (view.Readers) Then
                              MessageBox |Private Kopie des Ordners "F2" gefunden: | & view.Universalid
                      Else
                              MessageBox |Gemeinsame Vorlage des Ordner "F2" gefunden: | & view.Universalid
                      End If
              End If
      End If
End
ForAll
End
Sub

Interessant und noch nicht vollständig erforscht: Dieses Skript findet sogar private Kopien von Ordnern (in Datenbank gespeichert), welche der Domino Designer nicht anzeigt! Nach anfänglicher Begeisterung über diesen Lösungsansatz, habe ich dieses Skript gegen eine große produktive Datenbank laufen lassen und musste feststellen, dass jeweils beim Zugriff auf ein Ansichtsobjekt die Ansichtsindizes aktualisiert werden, um nur auf unwesentliche Merkmale der Ansicht zuzugreifen. Ein echter Performance-Killer, wollte ich diese Logik in einem Datenbank-Script beim Öffnen der Datenbank einsetzen. In meinen Testfällen habe ich teilweise 15 Sekunden warten müssen, bevor ich mein Ergebnis hatte.

Hinweis: Es ist darauf zu achten, NICHT auf die gemeinsame Vorlage der Ansicht/des Ordners zuzugreifen, da dieses einen Laufzeitfehler 4005 „Index is not to be generated on server“ verursacht. Somit ist stets z.B. mit isEmpty(view.Readers) zu prüfen, dass auf eine private Kopie zugegriffen wird (die Prüfung anderer Attribute ist nicht möglich).

Ergebnis: Zu langsam für den Produktionsbetrieb!

b) Einsatz von NotesNoteCollection>

Die Idee: Man kann doch die Gestaltungselemente sammeln und auf diese als NotesDocument zugreifen!. So erhalte ich Informationen zum Gestaltungselement, ohne den Indexer zu triggern!

Schon häufig habe ich mit der NotesNoteCollection Klasse auf Gestaltungslemente (Ansichten, Felder, Agenten, Teilmasken) zugegriffen und hierfür u.A. auch eine Selektionsformel einsetzen können, nach Elementen mit speziellen Attributen zu suchen. So würde ich mit den Werten des „$Flags“ Items auf bestimmte Ansichts-/Ordner-Typen zugreifen und mit Auswertung des „$Readers“ Felders den Eigentümer einer privaten Kopie identifizieren können.

siehe dieses Codebeispiel …

Beim Einsatz dieses Skriptes gegen eine große produktive Datenbank ist dieses schneller als das zuvor, jedoch immer noch zu langsam, da eine Datenbanksuche angestoßen wird.. Ein echter Performance-Killer, wollte ich diese Logik in einem Datenbank-Script beim Öffnen der Datenbank einsetzen.

Ergebnis: Besser, doch noch zu langsam für den Produktionsbetrieb! Vorteil: Ich kann die Namen der Ansichten/Ordner ermitteln, die ich behandeln möchte.

Einsatz eines Namensschemas

Nach intensiven Tests habe ich alle oben beschriebenen Lösungsansätze verworfen und mich für die Variante entschieden (welche in diesem Beitrag nicht näher beschrieben ist):

  • Ich führe ein Namensschema (speziell für Ansichten, die lokal statt in der Datenbank gespeichert werden) ein und ändere die Namen der Gestaltungselemente, wenn ich diese aktualisiere
  • Ich akzeptiere, durch Einführung eines Versionskennzeichens für die gesamte Anwendung, dass ich ggf. Elementen aktualisiere, deren Gestaltung sich zur Vorversion nicht geändert haben


Ergebnis:
Sehr performant, da keinerlei Prüfungen

Dieser Artikel ist Teil der Artikelserie:  Gestaltungsaktualisierung privater Ansichten und Ordner stellt eine echte Herausforderung dar

Wie kann ich programmatisch private Gestaltungselemente auf Aktualität prüfen?

28. Dezember 2012, 08:13 Erstellt von Manfred Meise (10 clicks)

Wir setzen eine Anwendung mit privaten Ansichten und Ordnern ein, die regelmäßig weiterentwickelt wird und produktive Datenbanken durch Schalonenaktualisierung anpasst. Hierbei werden die privaten Kopien der Ansichten und Ordner nicht automatisch aktualisiert. Bei der Konzeption einer „selbstgestrikten“ Aktualisierungslogik stößt man schnell auf die Frage: „Wie kann ich erkennen, ob die private Kopie des Gestaltungselementes aktuell ist?“

Vergleich von Zeitstempeln

a) Einsatz von NotesView

Die Idee: Man öffnet die Ansicht und hat Zeitstempel (Erstelldatum; letzte Änderung) des jeweiligen gemeinsamen Gestaltungselementes und der privaten Kopie.. Klingt gut, ist es aber nicht!

So erhält man mit

 
Dim view as NotesView
set view = db.getView ("Meine Ansicht")

jeweils die gemeinsame Ansichtsvorlage, wenn die private Kopie nicht existiert, jedoch die private Kopie des Ansicht, wenn diese exisiert. Somit kann man im Regelfall (wenn die private Kopie NICHT existiert) nicht auf die gemeinsame Vorlage zu Vergleichszwecken zugreifen.

Ergebnis: Nicht praktikabel !

b) Einsatz von NotesDatabase.Views

Die Idee: Man arbeitet alle Ansichten (gemeinsame Vorlagen und private Kopien) einer Datenbank ab und muss die jeweiligen Exemplare (Vorlage  / Kopie) einander zuordnen, um sie zu vergleichen.. Das muß doch gehen!

So durchsucht folgendes Skript die Datenbank nach Ordnern mit dem AliasNamen „F2-DE“ und listet jeweils die Universal-ID der Gestaltungselemente auf:

 
Sub
Initialize

Dim
s                         As New NotesSession
Dim
db                         As NotesDatabase
Dim
view                 As NotesView
Dim
vViewNames        As Variant

Set
db = s.Currentdatabase

ForAll
v In db.Views
      Set view = v
      vViewNames = view.Aliases
      If Not IsEmpty (vViewNames) then
              If vViewNames(0) = "F2-DE" Then    
                      If Not IsEmpty (view.Readers) Then
                              MessageBox |Private Kopie des Ordners "F2" gefunden: | & view.Universalid
                      Else
                              MessageBox |Gemeinsame Vorlage des Ordner "F2" gefunden: | & view.Universalid
                      End If
              End If
      End If
End
ForAll
End
Sub

Interessant und noch nicht vollständig erforscht: Dieses Skript findet sogar private Kopien von Ordnern (in Datenbank gespeichert), welche der Domino Designer nicht anzeigt! Nach anfänglicher Begeisterung über diesen Lösungsansatz, habe ich dieses Skript gegen eine große produktive Datenbank laufen lassen und musste feststellen, dass jeweils beim Zugriff auf ein Ansichtsobjekt die Ansichtsindizes aktualisiert werden, um nur auf unwesentliche Merkmale der Ansicht zuzugreifen. Ein echter Performance-Killer, wollte ich diese Logik in einem Datenbank-Script beim Öffnen der Datenbank einsetzen. In meinen Testfällen habe ich teilweise 15 Sekunden warten müssen, bevor ich mein Ergebnis hatte.

Hinweis: Es ist darauf zu achten, NICHT auf die gemeinsame Vorlage der Ansicht/des Ordners zuzugreifen, da dieses einen Laufzeitfehler 4005 „Index is not to be generated on server“ verursacht. Somit ist stets z.B. mit isEmpty(view.Readers) zu prüfen, dass auf eine private Kopie zugegriffen wird (die Prüfung anderer Attribute ist nicht möglich).

Ergebnis: Zu langsam für den Produktionsbetrieb!

b) Einsatz von NotesNoteCollection>

Die Idee: Man kann doch die Gestaltungselemente sammeln und auf diese als NotesDocument zugreifen!. So erhalte ich Informationen zum Gestaltungselement, ohne den Indexer zu triggern!

Schon häufig habe ich mit der NotesNoteCollection Klasse auf Gestaltungslemente (Ansichten, Felder, Agenten, Teilmasken) zugegriffen und hierfür u.A. auch eine Selektionsformel einsetzen können, nach Elementen mit speziellen Attributen zu suchen. So würde ich mit den Werten des „$Flags“ Items auf bestimmte Ansichts-/Ordner-Typen zugreifen und mit Auswertung des „$Readers“ Felders den Eigentümer einer privaten Kopie identifizieren können.

siehe dieses Codebeispiel …

Beim Einsatz dieses Skriptes gegen eine große produktive Datenbank ist dieses schneller als das zuvor, jedoch immer noch zu langsam, da eine Datenbanksuche angestoßen wird.. Ein echter Performance-Killer, wollte ich diese Logik in einem Datenbank-Script beim Öffnen der Datenbank einsetzen.

Ergebnis: Besser, doch noch zu langsam für den Produktionsbetrieb! Vorteil: Ich kann die Namen der Ansichten/Ordner ermitteln, die ich behandeln möchte.

Einsatz eines Namensschemas

Nach intensiven Tests habe ich alle oben beschriebenen Lösungsansätze verworfen und mich für die Variante entschieden (welche in diesem Beitrag nicht näher beschrieben ist):

  • Ich führe ein Namensschema (speziell für Ansichten, die lokal statt in der Datenbank gespeichert werden) ein und ändere die Namen der Gestaltungselemente, wenn ich diese aktualisiere
  • Ich akzeptiere, durch Einführung eines Versionskennzeichens für die gesamte Anwendung, dass ich ggf. Elementen aktualisiere, deren Gestaltung sich zur Vorversion nicht geändert haben


Ergebnis:
Sehr performant, da keinerlei Prüfungen

Dieser Artikel ist Teil der Artikelserie:  Gestaltungsaktualisierung privater Ansichten und Ordner stellt eine echte Herausforderung dar

What's hot