Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

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

Frage Entwicklung Batch & Shell

Mitglied: KikiMiki

KikiMiki (Level 1) - Jetzt verbinden

26.02.2009, aktualisiert 09:11 Uhr, 6412 Aufrufe, 25 Kommentare

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ß
Mitglied: godlie
26.02.2009 um 09:45 Uhr
Hallo das ganze ist eig. nicht schwer, folgendes Script macht schon soetwas:

01.
Option Explicit 
02.
 
03.
'---- CursorTypeEnum Values ---- 
04.
Const adOpenForwardOnly = 0 
05.
' Const adOpenKeyset = 1 
06.
' Const adOpenDynamic = 2 
07.
' Const adOpenStatic = 3 
08.
 
09.
'---- LockTypeEnum Values ---- 
10.
Const adLockReadOnly = 1 
11.
' Const adLockPessimistic = 2 
12.
' Const adLockOptimistic = 3 
13.
' Const adLockBatchOptimistic = 4 
14.
 
15.
'---- CursorLocationEnum Values ---- 
16.
' Const adUseServer = 2 
17.
Const adUseClient = 3 
18.
 
19.
'---- ConnectModeEnum Values ---- 
20.
' Const adModeUnknown = 0 
21.
Const adModeRead = 1 
22.
' Const adModeWrite = 2 
23.
' Const adModeReadWrite = 3 
24.
' Const adModeShareDenyRead = 4 
25.
' Const adModeShareDenyWrite = 8 
26.
' Const adModeShareExclusive = &Hc 
27.
' Const adModeShareDenyNone = &H10 
28.
' Const adModeRecursive = &H400000 
29.
Dim objExcel 
30.
Dim Conn, RS 
31.
Dim cellCount, rowCount 
32.
 
33.
cellCount = 1 
34.
rowCount = 1 
35.
 
36.
Set objExcel = CreateObject("Excel.Application") 
37.
 
38.
objExcel.Visible = True 
39.
objExcel.Workbooks.Add 
40.
 
41.
Set Conn = CreateObject("ADODB.Connection") 
42.
Conn.Provider = "MSDASQL" 
43.
Conn.Mode = adModeRead 
44.
Conn.CursorLocation = adUseClient 
45.
Conn.Open "DRIVER={MySQL ODBC 5.1 Driver};" & _ 
46.
          "DATABASE=database;" & _ 
47.
          "SERVER=192.168.x.x;", _ 
48.
          "user", "password" 
49.
 
50.
Set RS = CreateObject("ADODB.Recordset") 
51.
RS.CursorLocation = adUseClient 
52.
RS.Source = "Select * from tools where id=120;" 
53.
Set RS.ActiveConnection = Conn 
54.
RS.CursorType = adOpenForwardOnly 
55.
RS.LockType = adLockReadOnly 
56.
RS.Open           
57.
 
58.
Do While Not RS.EOF 
59.
	objExcel.Cells(cellCount, rowCount).Value = RS.Fields.Item("label").Value 
60.
	objExcel.Cells(cellCount, rowCount+1).Value = RS.Fields.Item("dimension").Value 
61.
        cellCount = cellCount + 1 
62.
	RS.MoveNext 
63.
Loop 
64.
 
65.
RS.Close 
66.
Set RS = Nothing 
67.
 
68.
Conn.Close 
69.
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
Bitte warten ..
Mitglied: KikiMiki
26.02.2009 um 09:57 Uhr
Hi Godie,

und wo trag ich mein SQL-Abfrage-Statement ein???
Bitte warten ..
Mitglied: godlie
26.02.2009 um 10:29 Uhr
Zeile 52 hättest aber selbst auchs ehen können
Bitte warten ..
Mitglied: KikiMiki
26.02.2009 um 10:55 Uhr
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 ;)
Bitte warten ..
Mitglied: godlie
26.02.2009 um 11:07 Uhr
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.
Bitte warten ..
Mitglied: KikiMiki
26.02.2009 um 11:33 Uhr
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
Bitte warten ..
Mitglied: godlie
26.02.2009 um 11:34 Uhr
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
Bitte warten ..
Mitglied: KikiMiki
26.02.2009 um 11:39 Uhr
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
Bitte warten ..
Mitglied: godlie
26.02.2009 um 11:47 Uhr
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.

01.
	objExcel.Cells(cellCount, rowCount).Value = RS.Fields.Item("label").Value  
02.
	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
Bitte warten ..
Mitglied: KikiMiki
26.02.2009 um 11:52 Uhr
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
Bitte warten ..
Mitglied: godlie
26.02.2009 um 11:56 Uhr
Is ja ganz einfach:

01.
	objExcel.Cells(cellCount, rowCount).Value = RS.Fields.Item("Schlüssel").Value  
02.
	objExcel.Cells(cellCount, rowCount+1).Value = RS.Fields.Item("Ersteller").Value 
Bitte warten ..
Mitglied: KikiMiki
26.02.2009 um 12:10 Uhr
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 ;)
Bitte warten ..
Mitglied: godlie
26.02.2009 um 12:51 Uhr
Sodala

01.
Option Explicit 
02.
 
03.
'---- CursorTypeEnum Values ---- 
04.
Const adOpenForwardOnly = 0 
05.
' Const adOpenKeyset = 1 
06.
' Const adOpenDynamic = 2 
07.
' Const adOpenStatic = 3 
08.
 
09.
'---- LockTypeEnum Values ---- 
10.
Const adLockReadOnly = 1 
11.
' Const adLockPessimistic = 2 
12.
' Const adLockOptimistic = 3 
13.
' Const adLockBatchOptimistic = 4 
14.
 
15.
'---- CursorLocationEnum Values ---- 
16.
' Const adUseServer = 2 
17.
Const adUseClient = 3 
18.
 
19.
'---- ConnectModeEnum Values ---- 
20.
' Const adModeUnknown = 0 
21.
Const adModeRead = 1 
22.
' Const adModeWrite = 2 
23.
' Const adModeReadWrite = 3 
24.
' Const adModeShareDenyRead = 4 
25.
' Const adModeShareDenyWrite = 8 
26.
' Const adModeShareExclusive = &Hc 
27.
' Const adModeShareDenyNone = &H10 
28.
' Const adModeRecursive = &H400000 
29.
Dim objExcel 
30.
Dim objSheet 
31.
Dim Conn, RS 
32.
Dim rowCount, i, headerSet 
33.
 
34.
rowCount = 1 
35.
 
36.
Set objExcel = CreateObject("Excel.Application") 
37.
 
38.
objExcel.Visible = True 
39.
objExcel.Workbooks.Add 
40.
 
41.
'Angabe des Tabellenblattes 
42.
Set objSheet = objExcel.ActiveWorkbook.WorkSheets(2) 
43.
 
44.
Set Conn = CreateObject("ADODB.Connection") 
45.
Conn.Provider = "MSDASQL" 
46.
Conn.Mode = adModeRead 
47.
Conn.CursorLocation = adUseClient 
48.
Conn.Open "DRIVER={MySQL ODBC 5.1 Driver};" & _ 
49.
          "DATABASE=database;" & _ 
50.
          "SERVER=192.168.x.x;", _ 
51.
          "user", "passwd" 
52.
 
53.
Set RS = CreateObject("ADODB.Recordset") 
54.
RS.CursorLocation = adUseClient 
55.
RS.Source = "Select * from tools where id=120 OR id=122;" 
56.
Set RS.ActiveConnection = Conn 
57.
RS.CursorType = adOpenForwardOnly 
58.
RS.LockType = adLockReadOnly 
59.
RS.Open           
60.
 
61.
Do While Not RS.EOF 
62.
'Die Spalenüberschriften einfügen 
63.
	If( headerSet = 0 ) Then 
64.
		For i = 0 to RS.Fields.Count - 1 
65.
		  objSheet.Cells(rowCount, i+1).Value = RS.Fields.Item(i).Name 
66.
		Next 
67.
		headerSet = 1 
68.
    End If 
69.
'Die dazugehörigen Werte einfügen 
70.
	For i = 0 to RS.Fields.Count -1  
71.
	  objSheet.Cells(rowCount+1, i+1).Value = RS.Fields.Item(i).Value 
72.
	Next 
73.
    rowCount = rowCount + 1 
74.
	RS.MoveNext 
75.
Loop 
76.
 
77.
RS.Close 
78.
Set RS = Nothing 
79.
 
80.
Conn.Close 
81.
Set Conn = Nothing 
82.
 
83.
'Speichern und überschreiben 
84.
objExcel.Application.DisplayAlerts = false 
85.
objExcel.ActiveWorkbook.SaveAs "E:\vbs-sql-xls\test.xls" 
86.
objExcel.ActiveWorkbook.Close 
87.
objExcel.Application.Quit
Bitte warten ..
Mitglied: KikiMiki
26.02.2009 um 13:01 Uhr
Ich möchte dich echt nicht nerven, aber bin voll der Prog-Newbie

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

01.
Do While Not RS.EOF 
02.
'Die Spalenüberschriften einfügen 
03.
	If( headerSet = 0 ) Then 
04.
		For i = 0 to RS.Fields.Count - 1 
05.
		  objSheet.Cells(rowCount, i+1).Value = RS.Fields.Item(i).Name 
06.
		Next 
07.
		headerSet = 1 
08.
    End If 
09.
'Die dazugehörigen Werte einfügen 
10.
	For i = 0 to RS.Fields.Count -1  
11.
	  objSheet.Cells(rowCount+1, i+1).Value = RS.Fields.Item(i).Value 
12.
	Next 
13.
    rowCount = rowCount + 1
Blick da nicht durch

Das speichern klappt super ;)
Bitte warten ..
Mitglied: godlie
26.02.2009 um 13:02 Uhr
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....
Bitte warten ..
Mitglied: KikiMiki
26.02.2009 um 13:09 Uhr
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???
Bitte warten ..
Mitglied: godlie
26.02.2009 um 13:13 Uhr
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
Bitte warten ..
Mitglied: KikiMiki
26.02.2009 um 13:32 Uhr
Also ich hab diese Passage eingefügt:

01.
Do While Not RS.EOF 
02.
'Die Spalenüberschriften einfügen 
03.
	If( headerSet = 0 ) Then 
04.
		For i = 0 to RS.Fields.Count - 1 
05.
		  objSheet.Cells(rowCount, i+1).Value = RS.Fields.Item(i).Name 
06.
		Next 
07.
		headerSet = 1 
08.
    End If 
09.
'Die dazugehörigen Werte einfügen 
10.
	For i = 0 to RS.Fields.Count -1  
11.
	  objSheet.Cells(rowCount+1, i+1).Value = RS.Fields.Item(i).Value 
12.
	Next 
13.
    rowCount = rowCount + 1
und diese gelöscht:


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

Aber es klappt nicht
Bitte warten ..
Mitglied: godlie
26.02.2009 um 13:35 Uhr
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.
Bitte warten ..
Mitglied: KikiMiki
26.02.2009 um 13:45 Uhr
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?
Bitte warten ..
Mitglied: godlie
26.02.2009 um 13:57 Uhr
Ne da glaub ich wirst nimmer viel machen können. weiso von welcher Import zeit sprechen wir denn?
Bitte warten ..
Mitglied: KikiMiki
26.02.2009 um 14:06 Uhr
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

01.
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?
Bitte warten ..
Mitglied: KikiMiki
27.02.2009 um 10:59 Uhr
Hi godie,

kurze Frage noch. Kann man dieses Skript nur für MySQL Datenbanken verwenden??
Bitte warten ..
Mitglied: godlie
27.02.2009 um 12:21 Uhr
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
Bitte warten ..
Mitglied: KikiMiki
27.02.2009 um 12:29 Uhr
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:

01.
Set objExcel = CreateObject("Excel.Application") 
02.
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
Bitte warten ..
Neuester Wissensbeitrag
Internet

Unbemerkt - Telekom Netzumschaltung! - BNG - Broadband Network Gateway

(3)

Erfahrungsbericht von ashnod zum Thema Internet ...

Ähnliche Inhalte
PHP
MySQL-Abfrage mit php: Wert + true bzw. false (2)

Frage von tomolpi zum Thema PHP ...

Datenbanken
gelöst MYSQL Abfrage (20)

Frage von datadexx zum Thema Datenbanken ...

Outlook & Mail
gelöst Outlook 2010 Dateianhänge von bestimmten Exchange Mails in Ordner verschieben (5)

Frage von Kineas zum Thema Outlook & Mail ...

Heiß diskutierte Inhalte
Switche und Hubs
Trunk für 2xCisco Switch. Wo liegt der Fehler? (17)

Frage von JayyyH zum Thema Switche und Hubs ...

Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...

DSL, VDSL
DSL-Signal bewerten (14)

Frage von SarekHL zum Thema DSL, VDSL ...