Seite 2 von 3
Re: Ergebnis von Select Anweisung in calc Sheet schreiben
Verfasst: Mo, 04.08.2008 17:21
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!
Re: Ergebnis von Select Anweisung in calc Sheet schreiben
Verfasst: Di, 05.08.2008 07:37
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?
Re: Ergebnis von Select Anweisung in calc Sheet schreiben
Verfasst: Di, 05.08.2008 07:39
von komma4
Ja, das meinte ich.
Re: Ergebnis von Select Anweisung in calc Sheet schreiben
Verfasst: Di, 05.08.2008 08:03
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?
Re: Ergebnis von Select Anweisung in calc Sheet schreiben
Verfasst: Di, 05.08.2008 09:47
von sg1985
jetzt habe ich schon einiges ausprobiert, werde aber immer verwirrter
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.
Re: Ergebnis von Select Anweisung in calc Sheet schreiben
Verfasst: Di, 05.08.2008 14:03
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.
Re: Ergebnis von Select Anweisung in calc Sheet schreiben
Verfasst: Di, 05.08.2008 14:10
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...
Re: Ergebnis von Select Anweisung in calc Sheet schreiben
Verfasst: Di, 05.08.2008 14:30
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.
Re: Ergebnis von Select Anweisung in calc Sheet schreiben
Verfasst: Di, 05.08.2008 14:39
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?
Re: Ergebnis von Select Anweisung in calc Sheet schreiben
Verfasst: Di, 05.08.2008 14:58
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?!
Re: Ergebnis von Select Anweisung in calc Sheet schreiben
Verfasst: Di, 05.08.2008 15:41
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
Re: Ergebnis von Select Anweisung in calc Sheet schreiben
Verfasst: Di, 05.08.2008 15:52
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?
Re: Ergebnis von Select Anweisung in calc Sheet schreiben
Verfasst: Mi, 06.08.2008 08:16
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?
Re: Ergebnis von Select Anweisung in calc Sheet schreiben
Verfasst: Mi, 06.08.2008 08:53
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)
Re: Ergebnis von Select Anweisung in calc Sheet schreiben
Verfasst: Mi, 06.08.2008 09:16
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"