Ergebnis von Select Anweisung in calc Sheet schreiben

Antwort erstellen


BBCode ist eingeschaltet
[img] ist ausgeschaltet
[url] ist eingeschaltet
Smileys sind ausgeschaltet

Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: Ergebnis von Select Anweisung in calc Sheet schreiben

Re: Ergebnis von Select Anweisung in calc Sheet schreiben

von komma4 » Mi, 06.08.2008 23:04

Über welche Datenmengen reden wir?

Gebe die SQLDaten ab Zeile 10000 aus und zeige den DP ab 0,0
Damit brauchst Du nur ein Blatt.

sg1985 hat geschrieben:wüsste ich später nicht mehr welches Datenpilotblatt zu welchem ausgeblendeten SQLAbfrageBlatt gehören würde
Nenne sie nach gleichem Muster:
data_Einkauf_Nord und pilot_Einkauf_Nord

Andererseits: ich mache mir heute kaum noch Sorgen um Speicherplatz.

Wie gross ist Deine Calc-Datei? 700kB?
WIe gross ist sie mit 12 Abfragen? 1MB?
Daten nehmen wenig Platz ein, Formeln und Bilddateien "kosten".

Und: den "Aufwand" mit Basic, SQL-Abfrage und dynamischer Erstellung hast Du investiert, damit die Ergebnisse korrekt und aktuell sind. Also: spare das .refresh() und erstelle immer neu.
Geht das (Verbindung online zur DB?, Performance ausreichend?)

Re: Ergebnis von Select Anweisung in calc Sheet schreiben

von sg1985 » Mi, 06.08.2008 11:02

Wenn ich nun aktualisiere, bleibt der Datenpilot leer.

Der Grund ist klar: ich lösche das temporäre Blatt, das nur fürs Ergebnis der SQL Abfrage dient, immer sobald ich wieder ein neues temporäres Blatt brauche um den Datenpilot ausführen zu können bzw. das Ergebnis der SQL Abfrage eben zwischen zu speichern.

Wenn der User nun mehrere Tabellenblätter mit den Ergebnissen vom Datenpilot hat, unter später irgendeines davon aktualisieren möchte, funktioniert das klarerweise nicht mehr, da der Datenpilot fürs Aktualisieren wieder das Ergebnis der SQL Abfrage braucht, und dieses nicht mehr vorhanden ist.

Ich würde das löschen des temporären Blatts gerne beibehalten, da ich nicht so viel Speicherplatz durch unnötige Tabellenblätter verschwenden will.
Selbst wenn ich das temporäre Blatt für jedes Ergebnis der SQL Abfragen nicht wieder löschen würd, wüsste ich später nicht mehr welches Datenpilotblatt zu welchem ausgeblendeten SQLAbfrageBlatt gehören würde, um beim aktualisieren eines Datenpilotblatts wieder auf das richtige SQLAbfrageBlatt zugreifen zu können.

Hat da vielleicht jemand einen Lösungsvorschlag für dieses Problem?

Re: Ergebnis von Select Anweisung in calc Sheet schreiben

von komma4 » Mi, 06.08.2008 10:22

1. reply: ja, das NOT muss weg, wenn Du das Blatt immer löschen möchtest


2. reply:

Code: Alles auswählen

If oDPT.hasByName( AUSGABE_PILOT ) Then
' print "vorhanden - refresh"
	oDPT.getByName( AUSGABE_PILOT ).refresh()
End If
Du musst Dir echt Xray holen, installieren und nutzen. Damit findest Du so etwas selbst in einer Minute raus.
Für Dein Fragen brauchst Du Dich nicht entschuldigen ... wir haben hierbei alle etwas gelernt.

Weiterhin viel Erfolg!

Re: Ergebnis von Select Anweisung in calc Sheet schreiben

von sg1985 » Mi, 06.08.2008 09:16

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"

Re: Ergebnis von Select Anweisung in calc Sheet schreiben

von sg1985 » Mi, 06.08.2008 08:53

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

von sg1985 » Mi, 06.08.2008 08:16

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

von komma4 » Di, 05.08.2008 15:52

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

von turtle47 » Di, 05.08.2008 15:41

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

von sg1985 » Di, 05.08.2008 14:58

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

von komma4 » Di, 05.08.2008 14:39

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

von sg1985 » Di, 05.08.2008 14:30

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

von sg1985 » Di, 05.08.2008 14:10

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

von komma4 » Di, 05.08.2008 14:03

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

von sg1985 » Di, 05.08.2008 09:47

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.

Re: Ergebnis von Select Anweisung in calc Sheet schreiben

von sg1985 » Di, 05.08.2008 08:03

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?

Nach oben