Base Suchabfrage per Makro exportieren - Fragen

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

Moderator: Moderatoren

born_001
*
Beiträge: 12
Registriert: Sa, 28.05.2022 17:20

Base Suchabfrage per Makro exportieren - Fragen

Beitrag von born_001 »

Hallo,
ich habe hier ein Makro gefunden, welches ich gerne einsetzen möchte:

http://oooforum.de/viewtopic.php?t=4552 ... 341053d774

Ich weiß jetzt nicht ob der User hier noch aktiv ist.

Der Einfachhalber hier nochmal das Makro:

Code: Alles auswählen

Sub ExportData
	REM Speicherpfad
	sPath = "C:" 
	REM Dateiname
	sTitle = "Datenexport vom " & Date & ".ods"
	REM Name der Abfrage, Tabelle oder SQL-Statement
	'sQueryName = "meineTabelle" 
	'sQueryName = "meineAbfrage"
	sQueryName = "SELECT * FROM ""meineTabelle"""
	
	sURL = ConvertToURL(sPath & "/" & sTitle)
	If FileExists(sURL) Then
		i = MsgBox(">" & sTitle & "<" & Chr(13) & "Datei existiert bereits." & _
						Chr(13) & Chr(13) & "Überschreiben?",52,"Hinweis")
		If i <> 6 Then
			Exit Sub
		End If
	End If
	oCon = thisComponent.Parent.CurrentController.ActiveConnection
	If oCon.Tables.hasByName(sQueryName) Then
		oPrepStatement = oCon.prepareCommand(sQueryName,0)
	ElseIf oCon.Queries.hasByName(sQueryName) Then
		oPrepStatement = oCon.prepareCommand(sQueryName,1)
	Else
		oPrepStatement = oCon.prepareCommand(sQueryName,2)
	End If
	oResult = oPrepStatement.executeQuery
	aColumns = oPrepStatement.Columns.ElementNames
	oDoc = StarDesktop.loadComponentFromURL("private:factory/scalc","_blank", 0, Array())
	oSheet = oDoc.Sheets(0)
	nColumnCount = UBound(aColumns)
	Dim aLine(nColumnCount)
	Dim aData(0)
	aData(0) = aColumns
	nUpperBoundary = 0
	Do While oResult.Next
		nUpperBoundary = UBound(aData)+1
		ReDim Preserve aData(nUpperBoundary)
		ReDim aLine(nColumnCount)
		For i = 0 To nColumnCount
			aLine(i) = oResult.getString(i+1)
		Next i
		aData(nUpperBoundary) = aLine
	Loop
	oRange = oSheet.getCellRangeByPosition(0,0,nColumnCount,nUpperBoundary)
	oRange.setDataArray(aData)
	Dim args(0) as New com.sun.star.beans.PropertyValue
	args(0).Name = "Overwrite"
	args(0).Value = True
	oDoc.StoreAsURL(sURL,args)
	oDoc.close(False)
End Sub
In meiner Datenbank habe ich ein Suchformular gebaut, in dem das Suchergebnis in einer Tabelle (Name: Tabelle) angezeigt wird. Dieses Ergebnis möchte ich, genauso wie in der Ursprungsfrage in ein Calc Dokument exportieren, um das Ergebnis auszudrucken.
Ich habe eine Tabelle, in der die eingegeben Daten erfasst werden (über ein Formular).
Name der Tabelle "01_Datenerfassung".
Dann gibt es noch Tabellen in denen Daten vorgegeben sind, die mittels Listenfeld ausgewählt werden können und eine Tabelle "10_Filter_komplett" in der die Suchparameter abgefragt werde.
Abfrage heißt "Abfrage_komplett".
In dem Abfrageformular "10_Abfrage_komplett" gibt es dann die Tabelle "Tabelle" als Formular in dem Formular "Filter".

Jetzt zu meinem Problem. Ich weiß nicht, welche Daten ich genau an Stelle von "meine Tabelle" einsetzen soll.
Die Abfrage ist klar.
Gebe ich beidemale ein "01_Datenerfassung", oder "10_Filter_komplett" und "01_Datenerfassung"werden alle Daten nach Calc übernommen.
Gebe ich ein "01_Datenerfassung" und "10_Filter_komplett", werden nur die Suchparameter exportiert. Ebenso bei 2x "10_Filter komplett".
Zudem frage ich mich, warum die Schriftfarbe bei "SELECT * FROM ""meineTabelle""" rot ist.

Dann würde ich auch noch gerne wissen, ob es möglich ist, die Vorgegebenen Daten, die zur Auswahl bei der Datenerfassung stehen, nicht als Zahl (ID in der Tabelle), sondern als Wort, welches zur ID gespeichert ist, einzutragen.

Kann mir da jemand weiterhelfen? Vielleicht muß ich noch an anderer Stelle etwas ändern. Ich bin kein Programmierer und kenne mich mit Makros nicht aus.Ich bedanke mich schonmal im Voraus und hoffe, alles verständlich beschrieben zu haben.
Grüße
F3K Total
********
Beiträge: 3704
Registriert: Mo, 28.02.2011 17:49

Re: Base Suchabfrage per Makro exportieren - Fragen

Beitrag von F3K Total »

Guten Morgen,
um Daten von Base nach Calc zu exportieren, benötigt man kein Makro, siehe
Videotutorial Nr. 9 ab Minute 1:56 auf Seite FAQ - Base Videotutorial 1-10

Gruß R
born_001
*
Beiträge: 12
Registriert: Sa, 28.05.2022 17:20

Re: Base Suchabfrage per Makro exportieren - Fragen

Beitrag von born_001 »

Hallo R,
das Video kenne ich, ist mir aber viel zu umständlich. Ich möchte das gerne automatisiert machen per Schaltfläche, ohne immer von Hand alles zu öffnen und zu aktualisieren. Zudem weiß ich nicht, wie ich die ID's der Listenfelder durch die eingetragenen Wörter ersetzen kann. Anstatt z.B. der Farben, die ich vorher definiert habe, stehen dann da die ID's. Dann weiß man ja später nicht was da ursprünglich stehen sollte.
Viele Grüße
B.
Hiker
******
Beiträge: 590
Registriert: Mo, 08.09.2014 21:34
Wohnort: Berlin

Re: Base Suchabfrage per Makro exportieren - Fragen

Beitrag von Hiker »

born_001 hat geschrieben: Mi, 08.06.2022 20:06 ... viel zu umständlich. Ich möchte das gerne automatisiert machen per Schaltfläche, ...
was bedeuten würde, dass Du eine Schaltfläche mit einem Macro belegen müsstest, das "Daten -> aktualisieren" aufruft.

Zu Deinen Fragen:
born_001 hat geschrieben: Di, 07.06.2022 21:44 Gebe ich beidemale ein "01_Datenerfassung", oder "10_Filter_komplett" und "01_Datenerfassung"werden alle Daten nach Calc übernommen.
Hier stolpere ich über "beidemale" und vermute, dass Du übersehen oder nicht verstanden hast, dass die beiden Zeilen vor dem SELECT mit ' auskommentiert sind. Es wird also nur die letzte Zeile ausgeführt. Die anderen Zeigen nur, wie einfach Du auf eine bestehende Tabelle oder Abfrage über Ihren Namen zugreifen kannst. Dementsprechend ist nur wichtig, was Du im SELECT änderst.

Du könntest also den SELECT-Teil durch die Abfrage ersetzen, die derzeit in Deinem Formular steckt und unter Berücksichtigung der Filtertabelle selektiert. Ganz rund wird das dann trotzdem nicht laufen, da Du dann immer noch im Base-Formular den Filter setzen musst, dann in der Calc-Tabelle das Macro aufrufen. Also bräuchtst Du eine Zelle/Zeile in Calc zum Ersetzen der Filtertabelle in Base und musst die Werte von dort in das SELECT einbauen. Alternativ wäre eine Parameterabfrage möglich: ... WHERE column = :value

Was die Schriftfarbe angeht: alles innerhalb " " ist einfach nur Text, der von BASIC nicht interpretiert wird, sondern ohne Bearbeitung weitergegeben.
Libre Office 6.3.1 (Win 10 Pro) / Libre Office 6.0.7 (Win8.1 Pro, Win 7 Pro) / AOO (Win 7)
born_001
*
Beiträge: 12
Registriert: Sa, 28.05.2022 17:20

Re: Base Suchabfrage per Makro exportieren - Fragen

Beitrag von born_001 »

Hallo Hiker,
ich habe leider überhaupt keine Ahnung, was die ganzen Kommandozeilen zu bedeuten haben. Ich habe mir selber zusammengereimt, das in den 3 Zeilen, meine Abfragen bzw Tabellen eingesetzt werden, da das Makro ja die Daten von irgendwo herbekommen muss.
Mit "beidemale" meinte ich die beiden Platzhalter "meine tabelle".
In meiner Abfrage habe ich einen Schalter, der bei den Eigenschaften unter "Ereignisse" bei "Aktion ausführen", das Makro eingetragen hat.
Du könntest also den SELECT-Teil durch die Abfrage ersetzen, die derzeit in Deinem Formular steckt und unter Berücksichtigung der Filtertabelle selektiert.
Das habe ich jetzt mal probiert, aber anscheinend etwas dabei übersehen/falsch gemacht denn es gab Fehlermeldungen.
Ganz rund wird das dann trotzdem nicht laufen, da Du dann immer noch im Base-Formular den Filter setzen musst, dann in der Calc-Tabelle das Macro aufrufen. Also bräuchtst Du eine Zelle/Zeile in Calc zum Ersetzen der Filtertabelle in Base und musst die Werte von dort in das SELECT einbauen. Alternativ wäre eine Parameterabfrage möglich: ... WHERE column = :value
Davon war in dem urspünglichen Post nicht die Rede, da brachen Alle in Begeisterungsstürme aus, wie gut das Makro funktioniert. Ich wüßte jetzt auch nicht, wie ich das in Calc einbauen soll.
Hiker
******
Beiträge: 590
Registriert: Mo, 08.09.2014 21:34
Wohnort: Berlin

Re: Base Suchabfrage per Makro exportieren - Fragen

Beitrag von Hiker »

born_001 hat geschrieben: Do, 09.06.2022 08:23 ... Ich wüßte jetzt auch nicht, wie ich das in Calc einbauen soll.
Bedeutet ja nicht, dass es nicht geht.

Code: Alles auswählen

Cell = Sheet.getCellRangeByName("A1")
Filtertext = Cell.String
wurde z.B. aus Zelle A1 einen Text lesen und in der Variable Filtertext speichen. Dann musst Du "nur" die SQL-Abfrage anpassen.

Code: Alles auswählen

sQueryName = "SELECT * FROM ""meineTabelle"" WHERE "meinFeld""='_" + Filtertext + "_'_"
wobei Du die Unterstriche _ bitte weglässt. Die habe ich nur eingesetzt, damit die einfachen Anführungszeichen sichtbarer sind als in "'".

Achtung: Vorsicht mit dieser Art der Programmierung, die ich hier nur zur schnellen Verdeutlichung zeige, aber SQL-Injections ermöglicht: https://xkcd.com/327/
Libre Office 6.3.1 (Win 10 Pro) / Libre Office 6.0.7 (Win8.1 Pro, Win 7 Pro) / AOO (Win 7)
Antworten