Seite 1 von 1

Base & Calc & mysql verknüpfen

Verfasst: Sa, 21.01.2012 20:46
von Reginald
Hallo zusammen,

ich habe eine mysql Datenbank mit Base als Frontend, und habe in verschiedenen Calc-Dokumenten die selben Daten noch einmal bzw. Teile davon noch einmal, und ich kann auch weder auf Base noch Calc verzichten - beide haben ihre volle Berechtigung.

Ich brauche ein Makro, um in einem Calc-File Daten aus mysql auszulesen bzw. reinzuschreiben.

Es gibt immer eine eindeutige ID als Verknüpfung.

Hat jemand einen Codeschnipsel oder kann mir jemand helfen, so dass ich einen Ansatz habe. Was fürs erste reicht:

Ein Makro in Calc, wo Benutzername und PW hinterlegt sind und dann eine Verbindung zu mysql aufgemacht wird (via odbc) und wo dann beispielsweise aus dem Datensatz mit der UID 123 aus der Tabelle "Kunden" das Feld "Vorname" ausgelesen und nach A1 in Calc geschrieben wird. - Oder umgekehrt: Aus A1 ausgelesen und in mysql reingeschrieben in den Datensatz mit der UID 123 ins Feld "Vorname".

Damit als Ansatz kann ich mich mit meinem Halbwissen weiter vorarbeiten und das ganze automatisieren, dass z. B. erst geschaut wird, in welchem Datensatz in Calc (UID) ich mich befinde, in welcher Spalte (Name der Übschrift, so dass der mySQL Spaltenname ermittelt wird ...).

Ideale Szene wäre im Endergebnis ein Makro, das mir per Klick (mittels bedingter Formatierungen) in Calc alle Abweichungen zu den entsprechenden Daten der mysql-DB anzeigt, also z. B. alle verschiedenen Zellen in rot darstellt, und dann kann ich je Zelle mittels Tastenkombination entscheiden, ob ich den abweichenden Wert in mySQL reinschreibe - oder von mySQL auslese und übernehme. So kann ich meine Daten immer synchron halten.


Grüße
Reg 8)

Re: Base & Calc & mysql verknüpfen

Verfasst: So, 22.01.2012 18:32
von DPunch
Aloha

Wenn Du Base sowieso als Frontend im Einsatz hast, geht das prinzipiell ganz einfach so:

Code: Alles auswählen

	oDatabaseContext = CreateUnoService("com.sun.star.sdb.DatabaseContext")
	oDataSource = oDatabaseContext.getByName("meineDatenbank")
	oConnection = oDataSource.GetConnection("","")
	
	oStatement = oConnection.createStatement
	sSQL = "SELECT `Vorname` FROM `Kunden` WHERE `UID` = 123"
	oResult = oStatement.executeQuery(sSQL)
	
	If oResult.Next Then
		MsgBox oResult.getString(1)
	End If
	
	sSQL = "UPDATE `Kunden` SET `Vorname` = '" & sAusA1ausgelesenerString & "' WHERE `UID` = 123"
	nAffectedRows = oStatement.executeUpdate(sSQL)
	MsgBox "Es wurden " & nAffectedRows & " Zeilen aktualisiert"


Dabei musst Du "meineDatenbank" einfach nur durch den Namen ersetzen, unter dem Du die mit der MySQL-DB verknüpfte Base-Datei registriert hast.

Re: Base & Calc & mysql verknüpfen

Verfasst: Mo, 23.01.2012 21:26
von Reginald
Aloha!

Wow, das ist genau, wonach ich gesucht habe!

Habe mir inzwischen das ganze mit Codeschnipseln aus anderen Makros so umgebaut, dass er erkennt, in welcher Zelle ich bin, dann ermittelt er Spaltenname und ID (ID ist immer in Spalte A, Spaltenüberschrift immer in Zeile 1) und dann zeigt er mir in einer MsgBox an, welchen Wert ich in der Datenbank dort habe (bzw. schreibt ihn rein).

Noch sehr rudimentär (fängt keine Fehler ab ... ) - aber funzt prima!


Du läßt den Wert über eine Schleife anzeigen. Warum?

Code: Alles auswählen

   If oResult.Next Then
      MsgBox oResult.getString(1)
   End If
Ich bastle jetzt weiter damit rum. Habe auch mal eine Version, die mir die Zelle einfärbt, falls der Wert unterschiedlich ist. Klappt bisher nur für eine einzelne Zelle, aber ich kriege das auch noch mit Schleife hin :-)

Oder was denkst du: Macht man das besser über eine Funktion (so hieß das zumindest in VBA meines Wissens), so dass ich der Zelle irgendwie die Funktion zuordne - z. B. über die bedingte Formatierung, und dann das ganze darüber einfärbe? - Da bin ich insgesamt flexibler, denke ich - wenn es das in OO gibt.

Grüße
Reginald

Re: Base & Calc & mysql verknüpfen

Verfasst: Di, 24.01.2012 13:19
von DPunch
Aloha
Reginald hat geschrieben:Du läßt den Wert über eine Schleife anzeigen. Warum?
Das ist keine Schleife, sondern eine bedeingte Anweisung.

Der Hintergrund ist, dass ein ".executeQuery" immer ein ResultSet bestehend aus 0 bis n Ergebniszeilen zurückgibt.
Dabei steht der sogenannte "Cursor" zunächst vor(!) der ersten Ergebniszeile und wird mit jedem Aufruf ".Next" um eine Zeile weitergeschoben.
War die Navigation erfolgreich, gibt die ".Next"-Methode ein "True" zurück, ansonsten "False".
Die Anweisung

Code: Alles auswählen

   If oResult.Next Then
      MsgBox oResult.getString(1)
   End If
bedeutet also übersetzt nichts weiter als: setze den Cursor um eine Ergebniszeile weiter, wenn dies erfolgreich war (und somit ein "True" zrückgegeben wurde), gib den Inhalt der ersten Spalte diese Ergebniszeile aus.
Reginald hat geschrieben:Macht man das besser über eine Funktion, so dass ich der Zelle irgendwie die Funktion zuordne - z. B. über die bedingte Formatierung, und dann das ganze darüber einfärbe?
Ich persönlich würde sowas im Makro machen - allerdings vor allem deshalb, weil ich mit der Bedienung von Calc über die GUI bestenfalls auf Anfängerlevel vertraut bin und noch nie mit bedingten Formatierungen gearbeitet habe, und nicht unbedingt, weil es besser oder flexibler wäre.

Re: Base & Calc & mysql verknüpfen

Verfasst: Di, 24.01.2012 14:35
von Reginald
Okay, vielen Dank! Ich werde dann mal weiter basteln.
Grüße R