kikimiki
Goto Top

MySQL Abfrage ausführen und als xls in bestimmten Ordner ablegen

Hallo,

ist es möglich eine MySQL Abfrage auszuführen und als xls in bestimmten Ordner abzulegen??

Keine Ahnung wie ich da vorgehen muss.
Mein SQL Statement ist fertig, bis jetzt führ ich es aus, speicher das Ergebnis dann als xls in einen bestimmten Ordner ab.
Kann man dies automatisieren?

Gruß

Content-Key: 110033

Url: https://administrator.de/contentid/110033

Printed on: April 20, 2024 at 02:04 o'clock

Member: godlie
godlie Feb 26, 2009 at 08:45:05 (UTC)
Goto Top
Hallo das ganze ist eig. nicht schwer, folgendes Script macht schon soetwas:

Option Explicit

'---- CursorTypeEnum Values ----  
Const adOpenForwardOnly = 0
' Const adOpenKeyset = 1  
' Const adOpenDynamic = 2  
' Const adOpenStatic = 3  

'---- LockTypeEnum Values ----  
Const adLockReadOnly = 1
' Const adLockPessimistic = 2  
' Const adLockOptimistic = 3  
' Const adLockBatchOptimistic = 4  

'---- CursorLocationEnum Values ----  
' Const adUseServer = 2  
Const adUseClient = 3

'---- ConnectModeEnum Values ----  
' Const adModeUnknown = 0  
Const adModeRead = 1
' Const adModeWrite = 2  
' Const adModeReadWrite = 3  
' Const adModeShareDenyRead = 4  
' Const adModeShareDenyWrite = 8  
' Const adModeShareExclusive = &Hc  
' Const adModeShareDenyNone = &H10  
' Const adModeRecursive = &H400000  
Dim objExcel
Dim Conn, RS
Dim cellCount, rowCount

cellCount = 1
rowCount = 1

Set objExcel = CreateObject("Excel.Application")  

objExcel.Visible = True
objExcel.Workbooks.Add

Set Conn = CreateObject("ADODB.Connection")  
Conn.Provider = "MSDASQL"  
Conn.Mode = adModeRead
Conn.CursorLocation = adUseClient
Conn.Open "DRIVER={MySQL ODBC 5.1 Driver};" & _  
          "DATABASE=database;" & _  
          "SERVER=192.168.x.x;", _  
          "user", "password"  

Set RS = CreateObject("ADODB.Recordset")  
RS.CursorLocation = adUseClient
RS.Source = "Select * from tools where id=120;"  
Set RS.ActiveConnection = Conn
RS.CursorType = adOpenForwardOnly
RS.LockType = adLockReadOnly
RS.Open          

Do While Not RS.EOF
	objExcel.Cells(cellCount, rowCount).Value = RS.Fields.Item("label").Value  
	objExcel.Cells(cellCount, rowCount+1).Value = RS.Fields.Item("dimension").Value  
        cellCount = cellCount + 1
	RS.MoveNext
Loop

RS.Close
Set RS = Nothing

Conn.Close
Set Conn = Nothing

Also ab Zeile 59er kommt der Teil mit dem einfügen ins Excel.
Wenn das ganze dann richtig funktioniert brauchst nur mehr die SaveAs funktion aufrufen das ganze speichern lassen und
objExcel.Visible auf false stellen dann siehst net mal was vom Excel dabei.

grüße
Member: KikiMiki
KikiMiki Feb 26, 2009 at 08:57:05 (UTC)
Goto Top
Hi Godie,

und wo trag ich mein SQL-Abfrage-Statement ein???
Member: godlie
godlie Feb 26, 2009 at 09:29:52 (UTC)
Goto Top
Zeile 52 hättest aber selbst auchs ehen können face-smile
Member: KikiMiki
KikiMiki Feb 26, 2009 at 09:55:20 (UTC)
Goto Top
Hi Godie,

stimmt wer lesen kann ist klar im Vorteil ;)
Wenn ich alles eingetragen habe speichere ich diese Datei dann als *. bat ab???

Zur Excelausgabe:
Muss ich die Spalten angeben oder erkennt er das automatisch???
Wo hinterleg ich den Dateinamen?

Danke für deine Unterstützung ;)
Member: godlie
godlie Feb 26, 2009 at 10:07:57 (UTC)
Goto Top
Also das abspeichern erfolgt als *.vbs

Das angeben der spalten wird dir nicht erspart bleiben, glaube weniger das es da einen Automodus für gibt.

Den Dateinamen musst du bei deiner Speicherfunktion vom objExcel hinterlegen welche nocht nicht da ist.

objExcel.Save "C:\ActiveDirectoryVBScripts\test.xls" <-- das zum ende hin pappen und ein
objExcel.Quit oder so damit sich das excel auch wieder schliest.
Member: KikiMiki
KikiMiki Feb 26, 2009 at 10:33:04 (UTC)
Goto Top
Hi,

habe die Zeile
objExcel.Save "H:\sql\test.xls"
ganz am Ende des Codes hinzugefügt


Führe ich das aus kommt als Fehlermedung
Stop
Windows Script Host
Zeile 45
Zeichen 1
Fehler: {Microsoft][ODBC Driver Manager] Der Datenquellenname wurde nicht gefunden, und es wurde kein Standardtreiber angegeben
Code
80004005
Quelle: Microsoft OLE DB Provider for ODBC Drivers
Member: godlie
godlie Feb 26, 2009 at 10:34:53 (UTC)
Goto Top
tja dir fehlt noch der passende odbc treiber von mysql ist auf der mysql seite zu finden.
oder einfahc nach dem hier googeln: MySQL ODBC 5.1 Driver
Member: KikiMiki
KikiMiki Feb 26, 2009 at 10:39:30 (UTC)
Goto Top
Ok,
mühsam ernährt sich das Eichhörnchen ;)

Habe installiert
Jetzt wird bei Zeile 59 gemeckert

Zeile 59
Zeichen 2
Fehler: ein Objekt, das dem angeforderten Namen oder dem Ordinalverweis entspricht, kann nicht gefunden werden.
Code: 800A0CC1
:Quelle ADODB.Fields
Member: godlie
godlie Feb 26, 2009 at 10:47:56 (UTC)
Goto Top
nur mal so ne Frage machst du dir auch Gedanken über das Script oder schaues es nur an und wunderst dich das es nicht geht.

	objExcel.Cells(cellCount, rowCount).Value = RS.Fields.Item("label").Value   
	objExcel.Cells(cellCount, rowCount+1).Value = RS.Fields.Item("dimension").Value   

hier bei RS.Fields.Item("label").Value bezieht sich das label auf eine column in meiner tabelle.
d.h. das musst du dann anpassen gehen an deine Tabelle und deine Gegebenheiten.
Für jedes Feld das du brauchst wirst du so eine Zeile schreiben müssen.
Ansonsten gib her alle Daten die du hast und sag was haben willst dann bau ich das auf dei schnelle um
Member: KikiMiki
KikiMiki Feb 26, 2009 at 10:52:42 (UTC)
Goto Top
Sorry wenn ich nicht den Profieindruck mache
Bin ein völliger Neuling... ;)

Also hier mein SQL-Statement

Select pkey AS Schlüssel, reporter AS Ersteller from jiraissue;

Als Ergebnis kommt eine Spalte Schlüssel und eine Spalte Ersteller
Momentan sind es über 5000 Zeilen

Und diese soll als rohdaten.xls in H:\Auswertung gespeichert werden


Habe das SQL-Statment stark vereinfacht
Wenn ich es aber an dem Beispiel dann sehe könnte ich es dann anpassen

Hoffe ich mal

Nochmal danke für deine Unterstützung
Member: godlie
godlie Feb 26, 2009 at 10:56:44 (UTC)
Goto Top
Is ja ganz einfach:

	objExcel.Cells(cellCount, rowCount).Value = RS.Fields.Item("Schlüssel").Value   
	objExcel.Cells(cellCount, rowCount+1).Value = RS.Fields.Item("Ersteller").Value   
Member: KikiMiki
KikiMiki Feb 26, 2009 at 11:10:14 (UTC)
Goto Top
Boah ich flippe aus, es geht ;)

Nur noch Kleinigkeiten ;)

1.Wie muss ich den Code ändern das er mir auch die Spaötenüberschriften (Schlüssel und Ersteller) in Excel ausgibt?
Bis jetzt gibt er nur die Werte aus ohne Spaltenüberschrift in Excel.
2. Wenn er alles in Excel geladen hat fragt Excel micht: Speichern unter... Dann muss ich den Pfad angeben
Es soll aber fest und immer unter H:\Auswertung\rohdaten.xls gespeichert werden.
Wenn die Datei bereits existiert einfach überschreiben ohne nachzufragen ;)
3. Kann man im auch angeben in welches Tabellenblatt von rohdaten.xls er die Daten schreiben soll?


Auf jeden Fall klappt es bisher prima ;)
Member: godlie
godlie Feb 26, 2009 at 11:51:38 (UTC)
Goto Top
Sodala

Option Explicit

'---- CursorTypeEnum Values ----  
Const adOpenForwardOnly = 0
' Const adOpenKeyset = 1  
' Const adOpenDynamic = 2  
' Const adOpenStatic = 3  

'---- LockTypeEnum Values ----  
Const adLockReadOnly = 1
' Const adLockPessimistic = 2  
' Const adLockOptimistic = 3  
' Const adLockBatchOptimistic = 4  

'---- CursorLocationEnum Values ----  
' Const adUseServer = 2  
Const adUseClient = 3

'---- ConnectModeEnum Values ----  
' Const adModeUnknown = 0  
Const adModeRead = 1
' Const adModeWrite = 2  
' Const adModeReadWrite = 3  
' Const adModeShareDenyRead = 4  
' Const adModeShareDenyWrite = 8  
' Const adModeShareExclusive = &Hc  
' Const adModeShareDenyNone = &H10  
' Const adModeRecursive = &H400000  
Dim objExcel
Dim objSheet
Dim Conn, RS
Dim rowCount, i, headerSet

rowCount = 1

Set objExcel = CreateObject("Excel.Application")  

objExcel.Visible = True
objExcel.Workbooks.Add

'Angabe des Tabellenblattes  
Set objSheet = objExcel.ActiveWorkbook.WorkSheets(2)

Set Conn = CreateObject("ADODB.Connection")  
Conn.Provider = "MSDASQL"  
Conn.Mode = adModeRead
Conn.CursorLocation = adUseClient
Conn.Open "DRIVER={MySQL ODBC 5.1 Driver};" & _  
          "DATABASE=database;" & _  
          "SERVER=192.168.x.x;", _  
          "user", "passwd"  

Set RS = CreateObject("ADODB.Recordset")  
RS.CursorLocation = adUseClient
RS.Source = "Select * from tools where id=120 OR id=122;"  
Set RS.ActiveConnection = Conn
RS.CursorType = adOpenForwardOnly
RS.LockType = adLockReadOnly
RS.Open          

Do While Not RS.EOF
'Die Spalenüberschriften einfügen  
	If( headerSet = 0 ) Then
		For i = 0 to RS.Fields.Count - 1
		  objSheet.Cells(rowCount, i+1).Value = RS.Fields.Item(i).Name
		Next
		headerSet = 1
    End If
'Die dazugehörigen Werte einfügen  
	For i = 0 to RS.Fields.Count -1 
	  objSheet.Cells(rowCount+1, i+1).Value = RS.Fields.Item(i).Value
	Next
    rowCount = rowCount + 1
	RS.MoveNext
Loop

RS.Close
Set RS = Nothing

Conn.Close
Set Conn = Nothing

'Speichern und überschreiben  
objExcel.Application.DisplayAlerts = false
objExcel.ActiveWorkbook.SaveAs "E:\vbs-sql-xls\test.xls"  
objExcel.ActiveWorkbook.Close
objExcel.Application.Quit
Member: KikiMiki
KikiMiki Feb 26, 2009 at 12:01:22 (UTC)
Goto Top
Ich möchte dich echt nicht nerven, aber bin voll der Prog-Newbie face-smile

Wie muss ich diese Passage auf meine Beispiel anpassen
d.h. in Excel dier Spaltenüberschriften Schlüssel und Ersteller einzufügen und dann die Werte dazu

Do While Not RS.EOF
'Die Spalenüberschriften einfügen  
	If( headerSet = 0 ) Then
		For i = 0 to RS.Fields.Count - 1
		  objSheet.Cells(rowCount, i+1).Value = RS.Fields.Item(i).Name
		Next
		headerSet = 1
    End If
'Die dazugehörigen Werte einfügen  
	For i = 0 to RS.Fields.Count -1 
	  objSheet.Cells(rowCount+1, i+1).Value = RS.Fields.Item(i).Value
	Next
    rowCount = rowCount + 1

Blick da nicht durch

Das speichern klappt super ;)
Member: godlie
godlie Feb 26, 2009 at 12:02:49 (UTC)
Goto Top
Das ding macht das von alleine, je nachdem welche Felder du im Query benötigst trägt er dir zuerst mal die Ganzen Spaltennamen ein dann erst die Werte....
Member: KikiMiki
KikiMiki Feb 26, 2009 at 12:09:32 (UTC)
Goto Top
Ich weiss ich nerve aber ich hab echt kein Plan wie du das meinst??? ;)
Ich muss doch irgednwo in dieser Passage die Spaltenüberschriften Schlüssel und Ersteller hinterlegen
und dann die Werte???
Member: godlie
godlie Feb 26, 2009 at 12:13:29 (UTC)
Goto Top
Nein musst du nicht mehr.
Das macht das ding jetzt von selber ich war nur zu faul das vorher einzubauen.

IN den 2 For schleifen durchläuft er alle vorhanden Felder. Proviers einfach mal aus
Member: KikiMiki
KikiMiki Feb 26, 2009 at 12:32:45 (UTC)
Goto Top
Also ich hab diese Passage eingefügt:

Do While Not RS.EOF
'Die Spalenüberschriften einfügen  
	If( headerSet = 0 ) Then
		For i = 0 to RS.Fields.Count - 1
		  objSheet.Cells(rowCount, i+1).Value = RS.Fields.Item(i).Name
		Next
		headerSet = 1
    End If
'Die dazugehörigen Werte einfügen  
	For i = 0 to RS.Fields.Count -1 
	  objSheet.Cells(rowCount+1, i+1).Value = RS.Fields.Item(i).Value
	Next
    rowCount = rowCount + 1

und diese gelöscht:


Do While Not RS.EOF
	objExcel.Cells(cellCount, rowCount).Value = RS.Fields.Item("Schlüssel").Value   
	objExcel.Cells(cellCount, rowCount+1).Value = RS.Fields.Item("Ersteller").Value   
        cellCount = cellCount + 1


Aber es klappt nicht face-sad
Member: godlie
godlie Feb 26, 2009 at 12:35:24 (UTC)
Goto Top
Da hat sich wesentlich mehr verändert in dem Script deswgen hab ich das ja auch komplett reingestellt wieder.
Nimm das ganze script her von meinem post oben weiter.
Member: KikiMiki
KikiMiki Feb 26, 2009 at 12:45:42 (UTC)
Goto Top
Man bin ich blöd
Es ging die ganze Zeit ;)
Er hat es nur in die 2. Mappe gemacht, aber die erste war aktiviert, hab dann nix gesehen
Voll peinlich

Klappt prima ;)

Kann man noch was an der Performance drehen
Das der Import ewtwas schneller läuft?
Member: godlie
godlie Feb 26, 2009 at 12:57:18 (UTC)
Goto Top
Ne da glaub ich wirst nimmer viel machen können. weiso von welcher Import zeit sprechen wir denn?
Member: KikiMiki
KikiMiki Feb 26, 2009 at 13:06:27 (UTC)
Goto Top
Es sind ca. 3 bis 4 min
Es werden ca. 1500 Zeilen bei 13 Spalten importiert.

Wenn ich das Skript laufen lasse und am Rechner nix mache geht das ganz stabil
Doch wenn ich nebnher was mache
Outlook bedienen surfen, ist es schon 2 bis 3 mal abgebrochen
Im Excel selbst z.B. scrollen um zu sehen wieviele Zeilen importiert wurden bricht er auch ab
Es geht nur wenn ich meine Maus für diese Zeit in Ruhe lasse ;)
Kommt immer diese Fehlermedung:

bei dieser Zeile

objSheet.Cells(rowCount+1, i+1).Value = RS.Fields.Item(i).Value

Zeichen:4
Fehler: Unbekannter Laufzeitfehler
Code: 800AC472
Quelle: Laufzeitfehler in Microsoft VB Script

Woran könnte das liegen?
Member: KikiMiki
KikiMiki Feb 27, 2009 at 09:59:17 (UTC)
Goto Top
Hi godie,

kurze Frage noch. Kann man dieses Skript nur für MySQL Datenbanken verwenden??
Member: godlie
godlie Feb 27, 2009 at 11:21:31 (UTC)
Goto Top
Hm theoretisch dürfte es durch das ADO.NET konzept auch für andere dbs funktionieren.
Du musst dann in der zeile 48 dann den passenden odbc treiber reinsetzen mal ein wenig recherche dann bekommst das auch hin

grüße
Member: KikiMiki
KikiMiki Feb 27, 2009 at 11:29:48 (UTC)
Goto Top
Ok mach ich danke

Könntest du mir noch bei einem Problem helfen

ich möchte nicht das ein neues xls erstellt wird und dann importiert wird
sondern in ein vorhandenes xls:
also 1 vorhandenes xls soll geöffnet werden, und in das Tabellenblatt "Datenbasis" von dieser Datei sollen die Daten importiert werden

habe es so versucht:

Set objExcel = CreateObject("Excel.Application")  
Set objWorkbook = objExcel.Workbooks.Open("H:\sql\rohdaten.xls")  

Er öffnet zwar die rohdaten.xls aber der Import läuft in der neu erstellten Datei