❤️ Helfen Sie noch heute, unser LibreOffice Forum zu erhalten! ❤️
Unterstützen Sie das LibreOffice-Forum und helfen Sie uns, unser Ziel für 2025 zu erreichen!
🍀 Jeder Beitrag zählt – vielen Dank für Ihre Unterstützung!🍀
Mit Ihrer Spende sichern Sie den Fortbestand, den Ausbau und die laufenden Kosten dieses Forums. 🌱
>> Dank Ihrer Unterstützung -> Keine Werbung für alle registrierten LibreOffice-Forum User! <<
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗
Export von Daten aus MS SQL in Calc
Export von Daten aus MS SQL in Calc
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
Re: Export von Daten aus MS SQL in Calc
So mittlerweile konnte ich die Fehler eingrenzen.
Das Problem liegt wohl bei der For Each Schlaufe. Im Excel macht er nach der Zeile For Each auch die Einträge in die Tabelle. In Open Office verläst er die Schlaufe als ob die Bedingung falsch ist.
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
Kann mir einer erklären, wie ich die For Each (Codeteil in fetter Schrift)OpenOffice resp. LibreOffice tauglich machen kann, damit sie das selbe bewirken?
Das Problem liegt wohl bei der For Each Schlaufe. Im Excel macht er nach der Zeile For Each auch die Einträge in die Tabelle. In Open Office verläst er die Schlaufe als ob die Bedingung falsch ist.
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
Kann mir einer erklären, wie ich die For Each (Codeteil in fetter Schrift)OpenOffice resp. LibreOffice tauglich machen kann, damit sie das selbe bewirken?
Re: Export von Daten aus MS SQL in Calc
Hallo,
Datenbanken sind nicht so mein Thema, aber was ich dazu gefunden habe
hier:
https://forum.openoffice.org/en/forum/v ... 45&t=19548
http://www.imaccanici.org/en.libreoffic ... /6135.html
http://stackoverflow.com/questions/2494 ... am-in-jdbc
lässt mich vermuten, dass es irgendwie so klappen könnte (der Mix mit VBA macht es nicht einfacher und ich habe keine Testmöglichkeit):
Was ist eigentlich Tabelle2?
Grundsätzlich solltest du erst einmal eine ods-Datei daraus machen und allen VBA-Makro-Wust weglassen, sprich mit einer leeren ods-Datei anfangen.
Datenbanken sind nicht so mein Thema, aber was ich dazu gefunden habe
hier:
https://forum.openoffice.org/en/forum/v ... 45&t=19548
http://www.imaccanici.org/en.libreoffic ... /6135.html
http://stackoverflow.com/questions/2494 ... am-in-jdbc
lässt mich vermuten, dass es irgendwie so klappen könnte (der Mix mit VBA macht es nicht einfacher und ich habe keine Testmöglichkeit):
Code: Alles auswählen
If IsNull(rs) Then
MsgBox "No matching records found."
Else
row = 5
col = 1
metadata = rs.getMetaData()
columnCount = metadata.getColumnCount()
for i = 1 to columnCount
Tabelle2.Cells(row, col).Value=metadata.getColumnName(i) 'VBA-Syntax???
col=col+1
next
do while rs.next()
row=row+1
col=1
for i = 1 to columnCount
Tabelle2.Cells(row, col).Value=rs.getstring(i) 'VBA-Syntax???
col=col+1
next
loop
End If
Grundsätzlich solltest du erst einmal eine ods-Datei daraus machen und allen VBA-Makro-Wust weglassen, sprich mit einer leeren ods-Datei anfangen.
Gruß,
mikele
mikele
An alle, die das LibreOffice-Forum gern nutzen und unterstützen wollen:
Bitte helfen Sie uns mit 7 Euro pro Monat.
Durch Ihren Beitrag tragen Sie dazu bei, unsere laufenden Kosten für die kommenden Monate zu decken.
Unkompliziert per Kreditkarte oder PayPal.
Als ein kleines Dankeschön werden Sie im LO-Forum als SUPPORTER gekennzeichnet.