Guten Tag
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
🍀 Das LibreOffice Forum braucht HEUTE Ihre Hilfe! 🍀
❤️ Spenden Sie jetzt und sichern Sie die Zukunft unseres LibreOffice-Forums ❤️
Ihre Spende hilft, die Community offen, werbefrei (bei Registrierung) und lebendig zu halten. Vielen lieben Dank!
>> Das LibreOffice-Forum lebt von Ihnen – und von vielen Experten, die freiwillig und kostenlos ihr Wissen teilen.<<
Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet.
Export von Daten aus MS SQL in Calc
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 IfGrundsä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:
Bitte beteiligen Sie sich mit 7 Euro pro Monat und helfen uns bei unserem Budget für das laufende.
Einfach per Kreditkarte oder PayPal. Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet.
❤️ Vielen lieben Dank für Ihre Unterstützung ❤️