RODINNÁ FIRMA

Hromadná změna vlastností návrhových prvků


30.12.2014

Někdy se stane, že je potřeba hromadně změnit vlastnosti návrhových prvků v aplikaci (nabo i více aplikacích). Jde například o zákaz změny návrhu ze šablon. Ale pomocí postupu uvedeného níže lze měnit i mnoho dalších vlastností.

Ale jak jsem se k tomuto problému vlastně dostal? U zákazníka měli nainstalovaný Webex, což je systém pro online komunikace běžící nad Dominem. Výrobcem je Cisco. Vše fungovalo ke spokojenosti uživatelů, než došlo k migraci serverů Domino ze starých verzí na verzi 9.

Proběhla migrace, a na první pohled se zdálo, že vše běží, jak má. Ale problém nastal ve chvíli, kdy první uživatel chtěl naplánovat skupinovou schůzku, a z klienta Lotus Notes na něj vyskočila chyba, že je problém při zpracování skriptu. Po chvíli bádání jsme přišli na to, že Webex pozmění poštovní databáze, resp. přidá si do ní vlastní návrhové prvky a přepíše některé stávající...A aby to nebylo jednoduché, zakáže změnu návrhu ze šablony. A to byl kámen úrazu, když při migraci proběhla úloha convert, která měla povýšit poštovní databáze na novou verzi, zůstali v nich knihovny pozměněné Webexem, které ale ve verzi 9 nefungují.

Tak, a teď se konečně dostávám k řešení. Musel jsem napsal skript, který projde všechny poštovní databáze, a zkontroluje, jestli u konkrétních návrhových prvků nen& iacute; zakázána změna návrhu a pak tuto volbu změnit.

Konkrétně šlo o změnu vlastností skriptových knihoven:

  • CSEventClass_cs-CZ
  • CSCalendarEntry_cs-CZ
  • CSEventNotes_cs-CZ
  • CSEventWeb_cs-CZ
  • CSUIViewClass_cs-CZ
  • CSUIViewExt_cs-CZ

U těchto knihoven Webex zakázal změnu návrhu.

A teď k samotnému skriptu. Pokud chceme v LotusScriptu pracovat se samotnými návrhovými prvky, zde s knihovnami, je to v zásadě jednoduché. Každý návrhový prvek je v databázi uložen jako dokument. Jde jen o to, najít ten správný záznam. Pro zjednodušení budeme předpokládat, že už máme databázi ve skriptu otevřenou, v našem příkladu jako objekt pdb.

Nejdříve si vytvoříme objekt s note kolekcí ncc. Vybereme návrhové prvky. Zadáme nad kolekcí dotaz:

nnc.SelectionFormula = | @Matches($Flags; "*{sh}*") & !@Contains($FlagsExt; "W")|

A v tomto bodě se dostáváme k tomu důležitému. Každý návrhový prvek v aplikaci má své příznaky, pomocí kterých můžeme vyfiltrovat konrétní typ návrhového prvku. Příznaky jsou zejména v polích $Flags a $FlagsExt a jsou dány většinou písmeny a čísly. Obsah pole $Flags vypadá například takto: "fPL3". Ohledně příznaků jednotlivých návrhových prvků je výborná stránka http://www-10.lotus.com/ldd/ ddwiki.nsf/dx/view-of-design-elements.htm.

Dále ve skriptu procházíme nalezené objekty dodané z výsledků dotazu. Pokud je při procházení nalezena jedna z požadovaných knihoven, otestujeme, zda je zadána volba zákazu změny návrhu. Toto je v dokumentu návrhového prvku v poli $Flags označeno písmenem P (velké P).

Pro vypnutí zákazu změny návrhu stačí znak "P" nahradit prázdným řetězcem a pak dokument návrhového prvku uložit.

Set nnc = pdb.CreateNoteCollection(False)
nnc.SelectAllDesignElements True
nnc.SelectionFormula = | @Matches($Flags; "*{sh}*") & !@Contains($FlagsExt; "W")|
nnc.BuildCollection
If nnc.Count > 0 Then
	nid = nnc.GetFirstNoteId

	For i = 1 To nnc.Count
		nextid = nnc.GetNextNoteId(nid)
		Set doc = pdb.
GetDocumentByID(nid)
		Let title = doc.Getitemvalue("$Title")(0)
		'CSCalendarEntry_cs-CZ
		If title = "CSEventClass_cs-CZ" Then
			'Print "Title lib: " + title
			Let flags = doc.Getitemvalue("$Flags")(0)
			pos = InStr(flags, "P")
			If pos > 0 Then
				'Print flags
				flags = Replace(flags, "P", "")
				'Print "Fl=" + flags
				Call doc.Replaceitemvalue("$Flags", flags)
				Call doc.Save(True, False)
				changed = True
			End If
		ElseIf title = "CSCalendarEntry_cs-CZ" Then
			'Print "Title lib: " + title
			Let flags = doc.Getitemvalue("$Flags")(0)
			pos = InStr(flags, "P")
			If pos > 0 Then
				'Print flags
				flags = Replace(flags, "P", "")
				'Print "Fl=" + flags
				Call doc.Replaceitemvalue("$Flags", flags)
				Call doc.Save(True, False)
				changed = True
			End If
		ElseIf title = "CSEventNotes_cs-CZ" Then
			'Print "Title lib: " + title
			Let flags = doc.Getitemvalue("$Flags")(0)
			pos = 
InStr(flags, "P")
			If pos > 0 Then
				'Print flags
				flags = Replace(flags, "P", "")
				'Print "Fl=" + flags
				Call doc.Replaceitemvalue("$Flags", flags)
				Call doc.Save(True, False)
				changed = True
			End If
		ElseIf title = "CSEventWeb_cs-CZ" Then
			'Print "Title lib: " + title
			Let flags = doc.Getitemvalue("$Flags")(0)
			pos = InStr(flags, "P")
			If pos > 0 Then
				'Print flags
				flags = Replace(flags, "P", "")
				'Print "Fl=" + flags
				Call doc.Replaceitemvalue("$Flags", flags)
				Call doc.Save(True, False)
				changed = True
			End If
		ElseIf title = "CSUIViewClass_cs-CZ" Then
			'Print "Title lib: " + title
			Let flags = doc.Getitemvalue("$Flags")(0)
			pos = InStr(flags, "P")
			If pos > 0 Then
				'Print flags
				flags = Replace(flags, "P", "")
				'Print "Fl=" + flags
				Call doc.Replaceitemvalue("$Flags", flags)
				Call doc.Save(True, False)
				changed = True
r
			End If
		ElseIf title = "CSUIViewExt_cs-CZ" Then
			'Print "Title lib: " + title
			Let flags = doc.Getitemvalue("$Flags")(0)
			pos = InStr(flags, "P")
			If pos > 0 Then
				'Print flags
				flags = Replace(flags, "P", "")
				'Print "Fl=" + flags
				Call doc.Replaceitemvalue("$Flags", flags)
				Call doc.Save(True, False)
				changed = True
			End If
		End If
		nid = nextid
	Next
End If

Takto je to jednoduché. Podobným způsobem lze samozřejmě měnit i ostatní návrhové prvky. Jen dotaz je vždy jiný.

Pavel Švec