❤️ 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. 🌱


❤️ DANKE >> << DANKE ❤️

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

CALC ist die Tabellenkalkulation, die Sie immer wollten.
Antworten
Floba90
Beiträge: 2
Registriert: Mo 6. Mär 2017, 12:38

Export von Daten aus MS SQL in Calc

Beitrag von Floba90 » Mo 6. Mär 2017, 13:13

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

Floba90
Beiträge: 2
Registriert: Mo 6. Mär 2017, 12:38

Re: Export von Daten aus MS SQL in Calc

Beitrag von Floba90 » Di 7. Mär 2017, 13:56

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?

mikele
* LO-Experte *
Beiträge: 1947
Registriert: Mo 1. Aug 2011, 20:51

Re: Export von Daten aus MS SQL in Calc

Beitrag von mikele » Di 7. Mär 2017, 21:09

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.
Gruß,
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.



Antworten