Ergebnis von Select Anweisung in calc Sheet schreiben

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

Moderator: Moderatoren

Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Ergebnis von Select Anweisung in calc Sheet schreiben

Beitrag von komma4 »

ich habe vom Link Jürgens ausgehend einen Erfolg zu vermelden....

Mit der o.a. Beispieldatei und folgendem Code klappt es (es fehlt noch die Ausgabe der SQL-Abfrage nach "Tabelle3" und die dynamische Bestimmung des Datenbereichs):

Code: Alles auswählen

' 2008-08-04
CONST DATEN_TABELLE = "Tabelle3"
CONST AUSGABE_TABELLE = "dataPilot"
CONST AUSGABE_PILOT = "meinPilot"

'
Sub dataPilot

' objekte
oDok = ThisComponent
oAlle = oDok.Sheets()

' Blatt einfügen, wenn nicht vorhanden
If NOT oAlle.hasByName( AUSGABE_TABELLE ) Then
	oAlle.insertNewByName( AUSGABE_TABELLE, oAlle.getCount() ) 
End If

'
oAusgabeBlatt = oAlle.getByName( AUSGABE_TABELLE )

' Datenpilot
oDPT = oAusgabeBlatt.getDataPilotTables()

If oDPT.hasByName( AUSGABE_PILOT ) Then
print "vorhanden - refresh"
 ' oDTP.refresh()
Else
'print "erstelle"

aOutputAddress = _
 createUnoStruct( "com.sun.star.table.CellAddress" )
aOutputAddress.Sheet = oAusgabeBlatt.getRangeAddress().Sheet ' AUSGABE_TABELLE
aOutputAddress.Column = 0
aOutputAddress.Row = 0


' 
aRangeAddress = _
 createUnoStruct( "com.sun.star.table.CellRangeAddress" )
With aRangeAddress
 .Sheet = oAlle.getByName( DATEN_TABELLE ).getRangeAddress().Sheet ' DATEN_TABELLE 
 .StartColumn = 0
 .StartRow = 0
 .EndColumn = 2
 .EndRow = 17
End With

' 
xDescriptor = _
 oDPT.createDataPilotDescriptor()
 
With xDescriptor
 .setName( AUSGABE_PILOT ) 
 .setSourceRange( aRangeAddress ) 
End With 

' 
oFelder = xDescriptor.getDataPilotFields()

' Zeile
oFeld1 = oFelder.getByName( "monat" ) 
oFeld1.Orientation = com.sun.star.sheet.DataPilotFieldOrientation.ROW

' Spalte
oFeld2 = oFelder.getByName( "tat" ) 
oFeld2.Orientation = com.sun.star.sheet.DataPilotFieldOrientation.COLUMN

' Summe
oFeld3 = oFelder.getByName( "std" ) 
With oFeld3
 .Orientation = com.sun.star.sheet.DataPilotFieldOrientation.DATA
 .Function = com.sun.star.sheet.GeneralFunction.SUM
End With

' Ausgabe des Piloten
oDPT.insertNewByName( AUSGABE_PILOT, aOutputAddress , xDescriptor ) 

End If

End Sub
Relativ einfach - wenn man weiss, wie es geht!
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
sg1985
***
Beiträge: 89
Registriert: Mo, 07.07.2008 15:22

Re: Ergebnis von Select Anweisung in calc Sheet schreiben

Beitrag von sg1985 »

wow super! aber ich fürchte ich verstehe nicht ganz was du mit Ausgabe der SQL Abfrage nach Tabelle3 meinst?!

Meinst du, dass das Ergebnis der SQL Abfrage vorher ausgegeben werden muss (in dem man wie bisher spaltenweise ins calc Sheet schreibt) damit man dann auf dem aufbauend den Code von dir für den Datenpiloten verwenden kann?
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Ergebnis von Select Anweisung in calc Sheet schreiben

Beitrag von komma4 »

Ja, das meinte ich.
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
sg1985
***
Beiträge: 89
Registriert: Mo, 07.07.2008 15:22

Re: Ergebnis von Select Anweisung in calc Sheet schreiben

Beitrag von sg1985 »

den Unterschied zwischen DATEN_TABELLE und AUSGABE_TABELLE versteh ich noch nicht ganz, ich möchte den Datenpilot immer auf das aktuelle Tabellenblatt aufrufen, das kann ich nun entweder mit activeSheet() machen oder mir immer den Namen vom aktuellen Tabellenblatt holen.

Weißt du vielleicht den Befehl mit dem ich mir den Tabellennamen vom aktiven Tabellenblatt holen kann?
In dem Fall würden die Variablen DATEN_TABELLE und AUSGABE_TABELLE beide den gleichen Inhalt haben (Name des aktiven Tabellenblatts) oder?
sg1985
***
Beiträge: 89
Registriert: Mo, 07.07.2008 15:22

Re: Ergebnis von Select Anweisung in calc Sheet schreiben

Beitrag von sg1985 »

jetzt habe ich schon einiges ausprobiert, werde aber immer verwirrter :lol:

mein Problem ist folgendes: das Ergebnis der SQL Abfrage wird ins aktive Tabellenblatt geschrieben, genau dort hin soll aber nachher auch das Ergebnis des Datenpiloten hingeschrieben werden, also muss das Ergebnis der SQL Abfrage wieder verschwinden sobald der Datenpilot seine benötigten Daten ausgelesen hat, dazu wollte ich den Inhalt des Tabellenblatts löschen (vor der Codezeile oDPT.insertNewByName( AUSGABE_PILOT, aOutputAddress , xDescriptor ) die für die Ausgabe der Datenpilotentabelle verantwortlich ist), aber dann schreibt auch der Datenpilot sein Ergebnis nicht mehr rein und das Tabellenblatt bleibt leer.

Ich habs zwar auch mit Ausblenden des Tabellenblatts (wo das Ergebnis der SQL Abfrage steht) probiert, aber das bringt mir nichts, weil das Ergebnis des Datenpilots ja genau in dieses Tabellenblatt mit dem gleichen Index kommen soll, also darf ich es nicht ausblenden.
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Ergebnis von Select Anweisung in calc Sheet schreiben

Beitrag von komma4 »

Du kannst die Daten und die Ausgabe als DatenPilot dahin packen wo Du möchtest.

Das geht beides auch auf die gleiche Seite: nach der SQL-Abfrage weisst Du, wie viele Datensätze (Zeilen) vorhanden sind, und packst den DP einfach darunter (Zeile) oder dahinter (Spalte).

Bedeutet hier: ich sehe hier kein Problem - die Daten müssen vorhanden sein (Löschen geht nicht), und wenn der DP auf dem gleichen Blatt sein soll, geht auch Ausblenden nicht.
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
sg1985
***
Beiträge: 89
Registriert: Mo, 07.07.2008 15:22

Re: Ergebnis von Select Anweisung in calc Sheet schreiben

Beitrag von sg1985 »

achso, das ist jetzt etwas blöd... das Ergebnis der SQL Abfrage sollte deswegen wieder verschwinden, weil das viel zu viel Platz verschwendet, wenn man das Tabellenblatt ausdruckt... daher sollte das Ergebnis vom Datenpilot auch bei 0/0 zu schreiben beginnen.

Aktuell fällt mir aber auch keine Lösung zu diesem Problem ein...
sg1985
***
Beiträge: 89
Registriert: Mo, 07.07.2008 15:22

Re: Ergebnis von Select Anweisung in calc Sheet schreiben

Beitrag von sg1985 »

Was mir gerade noch eingefallen ist:
eine Möglichkeit wäre, das Ergebnis des Datenpilots trotzdem bei 0/0 beginnend ausgeben zu lassen, dann überschreibt man eben bereits einen Teil des Ergebnisses der SQL Abfrage, und dann alles was noch darunter ist einfach weg löschen, indem man die Position ermittelt, aber der das Löschen beginnen soll. Die Position, ab wo gelöscht werden soll, würde sich nämlich leicht ermitteln lassen...

Aber ist das überhaupt möglich anzugeben, zum Beispiel ab Zeile 13 die ersten 3 Spalten zu löschen?
Die Anzahl der zu löschenden Spalten wäre ohnehin immer 3, nur die Zeile (ab der begonnen werden soll) würde sich immer ändern.
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Ergebnis von Select Anweisung in calc Sheet schreiben

Beitrag von komma4 »

verstehe das Problem immer noch nicht:


wenn Du die Daten ausblenden kannst / willst, dann kannst Du sie doch auch auf einem anderen Blatt platzieren und dieses verstecken?

Oder (je nach Datenmenge) gebe das SQL-Ergebnis ab Zeile, let's say, 10000 aus (und definiere einen Druckbereich, um den Ausdruck zu verhindern)

Ich würde den Piloten keine Daten überschreiben lassen - das geht nur gut, wenn der DP sich alles merkt - und kein Anwender den REFRESH-Button drückt (die Funktion Daten>Bereich aktualisieren aufruft).


Hilft Dir das?
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
sg1985
***
Beiträge: 89
Registriert: Mo, 07.07.2008 15:22

Re: Ergebnis von Select Anweisung in calc Sheet schreiben

Beitrag von sg1985 »

das Problem mit dem Ausblenden ist folgendes:

der User steht auf einem ganz bestimmten Tabellenblatt und ruft das Makro auf, genau auf diesem Tabellenblatt soll dann das Ergebnis des Datenpilots hinkommen. Man weiß im vorhinein auch nicht wie viele Tabellenblätter es geben wird in dem Dokument, sonst könnte ich das Ergebnis der SQL Abfrage immer ins letzte Tabellenblatt schreiben und ausblenden... aber so weiß ich nicht wo ich das Ergebnis der SQL Abfrage hinschreiben und dann ausblenden sollte?!
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Re: Ergebnis von Select Anweisung in calc Sheet schreiben

Beitrag von turtle47 »

Hallo Zusammen,
sg1985 hat geschrieben:Man weiß im vorhinein auch nicht wie viele Tabellenblätter es geben wird in dem Dokument, sonst könnte ich das Ergebnis der SQL Abfrage immer ins letzte Tabellenblatt schreiben und ausblenden
Dann füge doch einfach ein Tabellenblatt ein setze es an die Position wo Du es hinhaben willst, schreibe die Daten da rein und blende das Tabellenblatt aus.

Code: Alles auswählen

Sub TabelleEinfuegen
	myDoc = thisComponent
	Sheet=MyDoc.createInstance("com.sun.star.sheet.Spreadsheet")
	myDoc = thisComponent
	Anzahl=myDoc.Sheets.count
	For i= 0 to Anzahl-1
	mySheet = myDoc.Sheets(i)
	if mysheet.name = "SQL_Abfrage" Then 'wenn Tabelle vorhanden
	exit sub 'oder mache was anderes
	end if
	Next i
	myDoc.Sheets.insertByName("SQL_Abfrage" , Sheet)'Tabelle einfügen
	myDoc.Sheets.moveByName("SQL_Abfrage",Anzahl)'an letzte Position setzen
	'obiges ist eigentlich nicht nötig, da die neue Tabelle sowieso hinten angehängt wird
	mySheet = myDoc.Sheets().getByName("SQL_Abfrage")
	mysheet.isvisible=false
End Sub
Jürgen
Software hat keinen Verstand - benutze deinen eigenen...!

Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Ergebnis von Select Anweisung in calc Sheet schreiben

Beitrag von komma4 »

ich steh' heute auf'm Schlauch....


Der Benutzer hat ein Blatt vor sich.
Dann soll auf diesem Blatt der Datenpilot erscheinen (die Daten werden aber zuvor durch einen SQL-Befehl erst ermittelt)....

Code: Alles auswählen

sNameAktuellesBlatt = _
 ThisComponent.getCurrentController().getActiveSheet().getName() 

print _
" angezeigt wird Blatt " & _
sNameAktuellesBlatt  & _
"; dieses Blatt hat den Index " & _
ThisComponent.Sheets().getByName( sNameAktuellesBlatt ).getRangeAddress().Sheet
aber so weiß ich nicht wo ich das Ergebnis der SQL Abfrage hinschreiben und dann ausblenden sollte?!
füge einfach ein Blatt ein und blende es aus:

Code: Alles auswählen

' Blatt einfügen, löschen wenn vorhanden
sTempBlatt = "Arbeitsdaten"
If NOT oAlle.hasByName( sTempBlatt ) Then
   oAlle.removeByName( sTempBlatt )
End If

' einfügen als letztes Blatt
oAlle.insertNewByName( sTempBlatt , oAlle.getCount() )
' verstecken
oAlle.getByName( sTempBlatt ).isVisible = FALSE

Kommen wir weiter Richtung Ziel?
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
sg1985
***
Beiträge: 89
Registriert: Mo, 07.07.2008 15:22

Re: Ergebnis von Select Anweisung in calc Sheet schreiben

Beitrag von sg1985 »

Guten morgen,

danke Winfried, ich glaube das könnte so funktionieren...

also ich füge mit diesem Code das Tabellenblatt ein, wo das Ergebnis der SQL hingeschrieben wird (immer ins Tabellenblatt nach dem letzten vorhandenen Tabellenblatt und das blende ich dann aus)

Code: Alles auswählen

sTempBlatt = "Arbeitsdaten"
oAlle = ThisComponent.Sheets()

If NOT oAlle.hasByName( sTempBlatt ) Then
   oAlle.removeByName( sTempBlatt )
End If

oAlle.insertNewByName( sTempBlatt , oAlle.getCount())
oAlle.getByName( sTempBlatt ).isVisible = FALSE
oBlatt = sTempBlatt
Leider bekomme ich immer einen Fehler vom Typ RuntimeException mit der Message "."
Der Interpreter bleibt in der Zeile oAlle.insertNewByName( sTempBlatt , oAlle.getCount()) stehen, aber ich habe keine Ahnung was da falsch ist?!

Achja und eine Frage noch Winfried:
gehört bei dem IF NOT das "NOT" nicht weg? Das Tabellenblatt soll ja nur gelöscht werden, wenn es schon vorhanden ist und nicht wenn es nicht vorhanden ist oder?
sg1985
***
Beiträge: 89
Registriert: Mo, 07.07.2008 15:22

Re: Ergebnis von Select Anweisung in calc Sheet schreiben

Beitrag von sg1985 »

Fehler gefunden, die Codezeile vom insertNewByName muss ein bisschen anders ausschauen:

Code: Alles auswählen

oDok = ThisComponent.Sheets
index = oAlle.getCount()
oDok.insertNewByName(sTempBlatt, index)
sg1985
***
Beiträge: 89
Registriert: Mo, 07.07.2008 15:22

Re: Ergebnis von Select Anweisung in calc Sheet schreiben

Beitrag von sg1985 »

Sorry, ich muss noch mal etwas fragen... und zwar bezgl. deines Codes vom Datenpilot, da hattest du folgenden Code Abschnitt drinnen:

Code: Alles auswählen

oDPT = oAusgabeBlatt.getDataPilotTables()

If oDPT.hasByName( AUSGABE_PILOT ) Then
  print "vorhanden - refresh"
  'oDTP.refresh()
Else
  'erstellen
  [...]
end if
das refresh() war bei dir auskommentiert, ich würde es nun aber brauchen... jedoch weiß ich nicht wie es funktioniert, wenn ich es nämlich so aufrufe, dann bekomme ich die Fehlermeldung "objektvariable nicht belegt"
Antworten