Export von Daten aus MS SQL in Calc
Verfasst: Mo 6. Mär 2017, 13:13
Verwendete Testumgebung:
MS SQL Standard 2012 (Server 2012 R2, 64 Bit)
LibreOffice V 5.2.5.1
JRE 1.8.0_121 (Makroaufzeichnung aktivier, Laufzeitumgebung gewählt)
Ich habe aus diversen Gründen ein VBA Code in damals Excel geschrieben welcher mir die Daten einer Tabelle von MS SQL exportiert und in die Excel Tabelle einträgt. Vorteile dabei waren unter anderem, dass der Export schneller ging und ich die Tabelle bereits vorformatieren konnte als wenn ich ein Export über das GUI, welches auf die DB zugreift gemacht habe.
Da ein Kunde von mir nun aber kein MS Office lizenzieren möchte, kam mir die Idee die über LibreOffice zu betreiben. Ich stellte relativ schnell fest, dass der Code anders sein muss, da er eigentlich gar nicht funktionierte... (Installation JRE, Aktualisierung LibreOffice auf V 5.2, Treiberwahl, Auskommentierung "DieseArbeitsmappe" da LibreOffice anscheinend dieses Objekt nicht kennt keine Ahnung warum aber gut, etc.)
Der Code scheint zu funktionieren jedoch habe ich immer eine leere Liste im Calc (Tabelle2) wieso das? Wenn keine Einträge gefunden werden kommt auch eine Meldung "No matching records found." somit gehe ich davon aus, dass die Connection und die Query gut funktionieren (Parameterübergabe aus dem Blatt Controlling funktioniert). Wenn er aber was findet, wäre toll wenn er mir diese dann auch eintragen würde... hat jemand eine Idee an was das liegen könnte?
Hier der Code:
Rem Attribute VBA_ModuleType=VBAModule
Option VBASupport 1
sub SQLDATAEVNT()
Dim oConn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim fld As ADODB.Field
Dim mssql As String
Dim row As Long
Dim Col As Integer
Rem Dim ws As DieseArbeitsmappe (Versteht VBA LibreOffice nicht)
Rem Set ws = DieseArbeitsmappe
Worksheets("Controlling").Activate
SrvIP = ActiveSheet.Range("C6").Value
usr = ActiveSheet.Range("C8").Value
pwdu = ActiveSheet.Range("C10").Value
Db = ActiveSheet.Range("C12").Value
Application.ScreenUpdating = False
Set oConn = CreateObject("ADODB.Connection")
oConn.ConnectionTimeout = 30
oConn.CommandTimeout = 30
Set rs = New ADODB.Recordset
mssql = "SELECT [EVN_EVT_EVENT_DATE_TIME] AS [Date],[EVN_EVT_EVENT_DATE_TIME] AS [Time], [EVN_EVT_BDG_BADGE_NR] AS [Badge N°],[EVN_EVT_BDG_TYPE] AS [Badge Type],[EVN_EVT_PRS_CODE] AS [Pers. ID],[EVN_EVT_PRS_FIRST_NAME] AS [Firstname],[EVN_EVT_PRS_NAME] AS [Lastname],[EVN_EVT_EVENT_ID] AS [Event ID],[EVN_EVT_DESCRIPTION] AS [Description],[EVN_EVT_SCP_NUMBER] AS [Control Point],[EVN_EVT_SCP_DOOR_CODE] AS [Door],[EVN_EVT_SCP_LOCATION] AS [Emplacement],[EVN_EVT_SCP_TO_ZONE] AS [To Zone]" & _
"FROM [ATLAS].[dbo].[EVN_EVENT]" & _
"WHERE NOT [EVN_EVT_BDG_BADGE_NR] = '0' AND [EVN_EVT_EVENT_DATE_TIME] BETWEEN CONVERT(DATE, (DATEADD(MONTH, -3, GETDATE()))) AND GETDATE() AND ([EVN_EVT_CNT_SHORT_NAME] = 'ACU53' OR [EVN_EVT_CNT_SHORT_NAME] = 'ACU69')" & _
"ORDER BY [EVN_EVT_EVENT_DATE_TIME] ASC"
oConn.ConnectionString = "Provider=SQLOLEDB;" & _
"server=" & SrvIP & ";uid=" & usr & ";pwd=" & pwdu & ";database=" & Db & ""
oConn.Open
rs.Open mssql, oConn
If rs.EOF Then
MsgBox "No matching records found."
rs.Close
oConn.Close
Exit Sub
End If
row = 5
Col = 1
For Each fld In rs.Fields
Tabelle2.Cells(row, Col).Value = fld.Name
Col = Col + 1
Next
rs.MoveFirst
row = row + 1
Do While Not rs.EOF
Col = 1
For Each fld In rs.Fields
Tabelle2.Cells(row, Col).Value = fld
Col = Col + 1
Next
row = row + 1
rs.MoveNext
Loop
rs.Close
oConn.Close
End Sub
freunldiche Grüsse
Florian