Seite 1 von 1

Export von Daten aus MS SQL in Calc

Verfasst: Mo 6. Mär 2017, 13:13
von Floba90
DataTakenFromSQL.xlsm
Datei mit Makros
(14.31 KiB) 113-mal heruntergeladen
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

Re: Export von Daten aus MS SQL in Calc

Verfasst: Di 7. Mär 2017, 13:56
von Floba90
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?

Re: Export von Daten aus MS SQL in Calc

Verfasst: Di 7. Mär 2017, 21:09
von mikele
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):

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
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.