[Gelöst] Formular aus DBC-ORDNER mit BASIC öffnen?

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

ejomi
***
Beiträge: 84
Registriert: Mi, 06.09.2006 15:20

[Gelöst] Formular aus DBC-ORDNER mit BASIC öffnen?

Beitrag von ejomi »

Allen OOBase-Spezis einen schönen Tag!

Begriffsklärung:
Als "DBC" bezeichne ich den "Database-Container", genauer: die Bedienoberfläche von OOBase. Als "Ordner" bezeichne ich das gleichnamige Organisationsmittel innerhalb des DBC - also nicht irgendwelche Ordner des Dateisystems!!

Worum es geht:
Innerhalb der DBC-Ansicht "Formulare" lassen sich über das Hauptmenü "Einfügen" neben Formularen, Abfragen, Tabellen usw. im Fenster "Formulare" auch sogenannte "Ordner" erstellen.

Meine Frage:
Wie spricht man Formulare, die sich in solchen Ordnern befinden per Makro an?

Die einfachste Methode ein Formular per Makro zu öffnen lautet bekanntlich:

Code: Alles auswählen

ThisDatabaseDocument.FormDocuments.getByName(sFormName).open
wobei "sFormName" für den Namen des zu öffnenden Formulars steht.
Etwas umständlicher geht’s dann noch mit "createUnoService", was aber von der Sache her nichts ändert.

Meine diversen "trial and error"-Versuche, mit dem Formularnamen auch den Ordnername (also quasi als "Pfad") zu übergeben, funktionierten nicht. Als Separator habe ich Slash, Punkt, Unterstrich und Plus-Zeichen ausprobiert und/oder alternativ den Ordner- und/oder Formularnamen in runde und/oder eckige Klammern gestellt ... alles ohne Erfolg.


Formular-Aufzählung hilft auch nicht weiter:
Die Namen aller im DBC existierenden Formulare lassen sich wunderbar mit folgendem Algo vorführen:

Code: Alles auswählen

DocObject = ThisDatabaseDocument.FormDocuments
NameArray = DocObject.getParent.FormDocuments.ElementNames
For n = 0 To Ubound(NameArray)
	MsgBox "Index-Nr." & CStr(n) & ", Formular-Name: " & NameArray(n)
Next
Alles schick - nur dass hierbei auch die Ordner-Namen als Formular-Namen aufgelistet werden!
Auch mit Xray konnte ich keine andere Eigenschaft dieser Objekte gegenüber den "normalen" Formularen entdecken.


Details:
In die unter OO-Base angelegten Ordner lassen sich z.B. thematisch zusammengehörige Formulare sehr übersichtlich einsortieren. Wer mit vielen unterschiedlichen Formularen innerhalb einer DB arbeitet, wird dieses Organisations-Hilfsmittel sehr schnell lieben lernen und nicht mehr missen wollen.

MSAccess-Spezis nennen diese Technik "gruppieren". Diese "Gruppen" sind dort aber in Wahrheit nur Verknüpfungen zu den diversen Datenbank-Objekten, die aber weiterhin fest an ihrem alten "Platz" (innerhalb des DBC) stehen bleiben.

Ganz anders OpenOffice: Hier kann man Formulare tatsächlich in Ordner "echt" verschieben oder kopieren. Damit lassen sich sogar Kopien gleichen Namens in verschiedenen Ordner (einschließlich Hauptfenster) verteilen. In solche Ordner kann man dann z.B. auch eigene Templates archivieren, die dadurch nicht flüchtige Vorlage von OpenOffice, sondern dauerhafter Bestandteil der unabhängigen ODB bleiben.

Die Technik, Formulare mit Ordnern zu sortieren wird seltsamerweise nirgendwo erwähnt: Star-Basic Handbücher, OO-Tutorials, Thomas Krummbein, Mathew Pitonyak, OO-Wicki, alle OO-Foren und auch Google kennt's nicht ... !

Handelt es sich bei diesen Formular-Ordnern um eine steckengebliebene OO-Entwicklung oder um einen Bug, der deshalb nirgendwo kommentiert wird?

Ich würde mich über eine zeitnahme Resonanz riesig freuen, weil sich bei meiner z.Zt. neu zu entwerfenden Datenbank ein "geht" oder "geht nicht" ganz maßgeblich auf die Organisations-Struktur (die ja bekanntlich imme ganz am Anfang seht) auswirken wird.

Herzliche Grüße aus Dresden: ejomi
Zuletzt geändert von ejomi am Di, 06.09.2011 18:33, insgesamt 1-mal geändert.
F3K Total
********
Beiträge: 3724
Registriert: Mo, 28.02.2011 17:49

Re: Formular aus DBC-ORDNER mit BASIC öffnen?

Beitrag von F3K Total »

Hi,
bei mir geht es so, falls der Ordner sFoldername heißt

Code: Alles auswählen

ThisDatabaseDocument.FormDocuments.sFoldername.getByName(sFormName).open
oder auch, falls der Ordnername Leerzeichen enthält, so:

Code: Alles auswählen

ThisDatabaseDocument.FormDocuments.getByname(sFoldername).getByName(sFormName).open
Gruß R
ejomi
***
Beiträge: 84
Registriert: Mi, 06.09.2006 15:20

Re: [Gelöst] Formular aus DBC-ORDNER mit BASIC öffnen?

Beitrag von ejomi »

Hallo F3K Total!

Wo hast Du denn bloß diese (wirklich einfache) syntax gefunden?
Wie auch immer: Danke, danke, danke - es klappt genauso wie von Dir beschrieben und ich kann jetzt fein meine Formular-Sammlungen sortieren!

(Ich finde es trotzdem erstaunlich, dass über die Möglichkeit, Formulare zu gruppieren in den - jedenfalls mir bekannten - Lehrbüchern nichts zu finden ist.)

Nochmals Danke und einen schönen Tag.

Gruß: ejomi

P.S.:
Äh - ich hätte zu dem Thema doch noch ein kleines Problem:
Wie kann man denn die Formular-Namen aus solchen Ordnern auflisten (ähnlich wie in meinem Beispiel-Algo von oben) bzw. erkennen, bei welchen Namen aus der "Hauptliste" es sich um Formulare bzw. um Ordner handelt?
F3K Total
********
Beiträge: 3724
Registriert: Mo, 28.02.2011 17:49

Re: [Gelöst] Formular aus DBC-ORDNER mit BASIC öffnen?

Beitrag von F3K Total »

Hallo,
vielleicht hilft Dir das hier:

Code: Alles auswählen

Sub start_analyse
oForms=ThisDatabaseDocument.FormDocuments
analyse_Formfolders_and_Forms(oForms)
end sub

Sub analyse_Formfolders_and_Forms(oForms)
oFormsEnum=oForms.createEnumeration
while oFormsEnum.hasmoreelements()
oform=oFormsEnum.nextelement
if oform.supportsservice("com.sun.star.sdb.Forms") then
msgbox "Ordner: '"+oform.name+"'"
analyse_Formfolders_and_Forms(oform)
else
msgbox "Formular: '"+oform.name+"'"
endif
wend
end sub
Einfach Makro start_analyse starten
Gruß R
ejomi
***
Beiträge: 84
Registriert: Mi, 06.09.2006 15:20

Re: [Gelöst] Formular aus DBC-ORDNER mit BASIC öffnen?

Beitrag von ejomi »

F3K Total hat geschrieben:Hallo,
vielleicht hilft Dir das hier ...
Jawoll Mr. "R" - das wars!

Habe mir erlaubt, Deinen Code in der Art umzugestalten, dass a) alle Formular-Namen in einer Array-Liste verfuegbar sind und b) die die Ornder-Namen nicht separat ausgewiesen werden, sondern - wie bei einem Dateipfad - zum Bestandteil des Formular-Namens werden (durch Slash getrennt).

Es ergeben sich damit folgende Möglichkeiten:
1. Ein vermisstes Formular, bei dem nur der Name bekannt ist, kann mit einem Rutsch durch sämtliche Ordner gesucht werden.
2. Die Existenz spezieller Formulare kann über alle Ordner hinweg geprüft/bestätigt werden.
3. Der "Pfad" eines gewünschten Formulars, bei dem nur der Name bekannt ist, kann ermittelt werden.

Hier der Code (aufgerufen wird das Programm mit der Sub "ListFormDirectory"):

Code: Alles auswählen

Sub ListFormDirectory
	' Sub "ListFormDirectory" shows a list of all existing forms in a message-box.
	' Dependencies: Function "GetFormsDir(oForms)" !!
	Dim oForms As Object, aFormNames() As String, sNameList As String
	oForms=ThisDatabaseDocument.FormDocuments
	' fill an text-array with all the names:
	aFormNames = GetFormsDir(oForms)
	' Note: form-names are unsorted!
	For n = LBound(aFormNames) To UBound(aFormNames)
		sNameList = sNameList & aFormNames(n) & Chr(13)
	Next
	MsgBox sNameList, MB_ICONINFORMATION, "Formular-Directory:"
End Sub

Function GetFormsDir(oForms, Optional sFldrName)
	' Global function "GetFormsDir" returns an array as formname-collection including
	' all containing sub-foldernames (if any) separated by "sFileSeparator".
	Const sFileSeparator = "/"
	Dim n As Integer, iActSize As Integer, aActNameList() As String, aNestNameList() As String, oFormsEnum As Object, oElement As Object
	If IsMissing(sFldrName) Then sFldrName = ""
	iActSize = 0
	oFormsEnum=oForms.createEnumeration
	While oFormsEnum.hasMoreElements()
		oElement=oFormsEnum.nextElement
		If oElement.supportsservice("com.sun.star.sdb.Forms") Then
			' it's a folder:
			aNestNameList = GetFormsDir(oElement, sFldrName & oElement.name & sFileSeparator)
			' append nested array-values to the current:
			For n = LBound(aNestNameList) To UBound(aNestNameList)
				Redim Preserve aActNameList(iActSize + n)
				aActNameList(iActSize + n) = aNestNameList(n)
			Next
			iActSize = UBound(aActNameList) + 1
		Else
			' it's a form:
			Redim Preserve aActNameList(iActSize) 
			aActNameList(iActSize) = sFldrName & oElement.name
			iActSize = iActSize + 1
		EndIf
	Wend
	GetFormsDir = aActNameList
End Function
Hält man sich an eine spezielle Namenskonvention (hier: keine Schrägstriche im Formular- oder Ordnernamen), kann man der folgenden Routine "OpenAnyForm" entweder einen Namen oder Pfad übergeben und damit wahlweise ein Formular aus dem Hauptverzeichnis (= normaler Ablageort) oder innerhalb eines Ornders (= einsortierte Formulare) öffnen:

Code: Alles auswählen

Sub OpenAnyForm(sFormName)
	' Subroutine "OpenAnyForm(sFormName)"
	' Opens any form, even if nested within a DBC-folder where
	' subfolders name in "sFormName" is separated by "sFileSeparator".
	' Attention: This version supports only one folder-level!

	On Error GoTo FrmOpenErr

	Const sFileSeparator = "/"
	Dim iFndPos As Integer

	iFndPos = InStr(1, sFormName, sFileSeparator)
	If iFndPos > 0 Then
		sFolderName = Trim(Left(sFormName, iFndPos - 1))
		sFormName = Trim(Mid(sFormName, iFndPos + 1))
	Endif

	If sFormName <> "" Then
		If sFolderName > "" Then
			ThisDatabaseDocument.FormDocuments.getByname(sFoldername).getByName(sFormName).open
		Else
			ThisDatabaseDocument.FormDocuments.getByName(sFormName).open
		EndIf
	Else
		msgbox "Formname void: '" & sFormName & "'", MB_ICONSTOP, "Error opening a form!"
	EndIf
Exit Sub
FrmOpenErr:
	MsgBox "Error" & Err & ", line" & Erl & ":" & Chr$(13) & Error$ & Chr$(13) & Chr$(13) & _
       "Could'nt open <" & sFormName & ">", MB_ICONSTOP, "Error opening a form!"
End Sub
Die Routine enthält sogar einen Error-Handler.
Möglicherweise hilft dieser Code auch anderen Usern mit ähnlichen Ansprüchen - viel Spaß dabei!

Gruß aus Dresden: ejomi
Antworten