mit macro in Datenbank schreiben

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

herbk
**
Beiträge: 36
Registriert: Fr, 16.01.2004 14:29
Kontaktdaten:

mit macro in Datenbank schreiben

Beitrag von herbk »

ich möchte mit einem Macro die Werte a, b und c in eine dbase Datenbanktabelle schreiben.
Wie ich in die Datenbank komme, ist mir klar, das auslesen gelingt mir bereits....
wenn die Werte in die db-Tabelle geschrieben werden, dann soll es jeweils ein neuer Datensatz sein. Eine .txt würde ich einfach mit "for apend" öffnen - das soll also erreicht werden.
Die im StarOffice Handbuch Basic-programierung gegebene Hilfe bringt mich leider nicht weiter.
Kann mir von euch jemand helfen?
HerbK
openmind
****
Beiträge: 184
Registriert: So, 29.06.2003 15:00
Wohnort: Schweiz

Beitrag von openmind »

Ich versteh leider nicht was du machen willst. In die DB zu schreiben sollte eigentlich mit dem Programming Guide locker klappen (Connection öffnen, Statement kreiren, SQL absetzten).

Wenn du schon eine Abfrage gemacht und ein ResultSet hast, dann kannst du die neuen Zeilen auch über das ResultSet einfügen (moveToInsertRow oder ähnlich muss aufgerufen werden).


Falls Du eine (auch für mich) verständliche Angabe machen könntest, was Du machen willst kann ich dir vielleicht weiter helfen.
Meine Installation: AMD Athlon XP 1600+, 512 MB RAM, SuSE Linux 8.2, OpenOffice 1.1
Kostenlose OOo-CD in der Schweiz: http://www.office-cd.ch/
herbk
**
Beiträge: 36
Registriert: Fr, 16.01.2004 14:29
Kontaktdaten:

Beitrag von herbk »

sorry wenn ich mich da unklar ausgedrückt habe... also
Ich habe ein Tabellendokument in welchen mehrere Rechenergebnise anfallen. Diese Rechenergebnise sollen jetzt in einer DB-Tabelle (dbase) gespeichert werden. Jedes neue Rechenergebnis soll (nach klick auf einen Button) als neuer Datensatz in die DB eingefügt werden.

Eine Abfrag und ein Sesultset habe ich, weil ich auch immer einen der werte aus der DB benötige, die Abfrage funktioniert auch und der gewünschte Wert wird mir in der Calc-Tabelle angezeigt.

Zitat: "moveToInsertRow oder ähnlich muss aufgerufen werden"
Das ist genau das was ich eben nicht weiß und auch noch nirgens gefunden habe.
Das ResultSet, welches ich zum auslesen der DB erzeugt habe, enthält ja nur einen Wert.
Muss ich für jeden zu übergebenden Wert ein eigenes ResultSet erzeugen?
Um die DB auf einen neuen Datensatz zu "stellen" gibt es einen Befehl "afterLast" Wo muss der stehen?
Wie sage ich "diese Werte in der DB speichern?

Nehmen wir an ich habe die Werte "herbert" "12345" und "56789" die als neuer Datensatz in die DB-Tabelle eingefügt werden sollen.
wie währe das Script dafür?






[/quote]
HerbK
openmind
****
Beiträge: 184
Registriert: So, 29.06.2003 15:00
Wohnort: Schweiz

Beitrag von openmind »

Es gibt GRundsätzlich 2 Wege um in die Datenbank zu schreiben:

1. SQL-Query
Man generierst ein SQL-Statement (String) , welches mit einem Statement in die Datenbank gefeuert wird,

Code: Alles auswählen


Sub selectStatement (  sDatenquellenName as String,  _
		   sTabellenName as String )
	
	' Variable deklarieren
	Dim oDatenbankKontext as Object
	Dim oDatenquelle as Object
	Dim oVerbindung as Object
	Dim oStatement as Object
	
	' Datenbank-Kontext holen
	oDatenbankKontext = createUnoService _
		( "com.sun.star.sdb.DatabaseContext" )
	
	' Datenquelle holen
	oDatenquelle = oDatenbankKontext._
		getByName( sDatenquellenName )
	
	' Verbindung erstellen
	oVerbindung = oDatenquelle.getConnection( "", "" )

	' Statement erzeugen
	oStatement = oVerbindung.createStatement()
	
	' in DB schreiben mit SQL
	oResultSet = oStatement.executeUpdate( _
		"INSERT INTO " & sTabellenName  & _
		" VALUES ( 'hans', 'weint', 'erbärmlich' ) " )
				
	' Verbindung und Statement schliessen
	oStatement.close()
	oVerbindung.close()		
End Sub

2. Mit einem ResultSet
Du machst erst eine Abfrage um eine ResultSet zu erhalten. Das ResultSet bietete eine Reihe von Interfaces, welche nützlich sind:

Das zum einen kann man im Suchresultat vor und zurück navigieren (XResultSet):

http://api.openoffice.org/docs/common/r ... ltSet.html

und zum anderen kann man damit wie angesprochen auch neue Einträge einfügen oder die im ResultSet enthaltenten Einträge bearbeiten. Dazu bewegt man sich auf die gewünschte Zeile mit um dan mit den updateXXX()-Methoden des Interfaces XRowUpdate die Werte zu ändern:

http://api.openoffice.org/docs/common/r ... pdate.html

Danach muss auch noch updateRow von XResultSetUpdate aufgerufen werden um die geänderten Werte der aktuellen Zeile auch in die DB zu schreiben:

http://api.openoffice.org/docs/common/r ... pdate.html

XResultSetUpdate beitet auch die Methode movetoInsertRow womit man sich auf die Zeiel bewegt, um einen neuen Datensatz einzufügen:
http://api.openoffice.org/docs/common/r ... oInsertRow

Variante 2 also:

a. Abfrage ausführen um ResultSet zu erhalten
b. Im ResultSet auf die zu ändernde (oder neue) Zeile bewegen
c. mit den UpdateXXX()-Methoden die Zeiel ändern
d. mit der Methode updateRow die Änderungen in die DB schreiben


bye
Meine Installation: AMD Athlon XP 1600+, 512 MB RAM, SuSE Linux 8.2, OpenOffice 1.1
Kostenlose OOo-CD in der Schweiz: http://www.office-cd.ch/
herbk
**
Beiträge: 36
Registriert: Fr, 16.01.2004 14:29
Kontaktdaten:

Beitrag von herbk »

vielen Dank

' in DB schreiben mit SQL
oResultSet = oStatement.executeUpdate( _
"INSERT INTO " & sTabellenName & _
" VALUES ( 'hans', 'weint', 'erbärmlich' ) " )

war das was mir gefehlt hat.
Die links sind auch sehr hilfreich (hab sie auch gebookmarkt), ich hatte das noch nicht gefunden....
Jetzt muss ichs "nur" noch umsetzten....
Das Ergebnis geb ich dann auch gerne als OO Vorlage weiter, ich denke der Eine oder Andere kann's gebrauchen

Gruss Herbert
HerbK
openmind
****
Beiträge: 184
Registriert: So, 29.06.2003 15:00
Wohnort: Schweiz

Beitrag von openmind »

herbk hat geschrieben: ' in DB schreiben mit SQL
oResultSet = oStatement.executeUpdate( _
"INSERT INTO " & sTabellenName & _
" VALUES ( 'hans', 'weint', 'erbärmlich' ) " )
Sorry der Code ist falsch. executeUpdate gibt nicht ein ResultSet zurück, sondern einen INteger, der anzeigt wieviele Einträge in der DB geändert wurden.
Meine Installation: AMD Athlon XP 1600+, 512 MB RAM, SuSE Linux 8.2, OpenOffice 1.1
Kostenlose OOo-CD in der Schweiz: http://www.office-cd.ch/
herbk
**
Beiträge: 36
Registriert: Fr, 16.01.2004 14:29
Kontaktdaten:

Beitrag von herbk »

Dieser befehl:
Statement.executeUpdate("INSERT INTO hauptbuch (BuNr, ReNr)").VALUES (bunmmr, renmmr)
ergibt die fehlermeldung:
Parse Error:unexpected $end, expecting VALUES
woher kommt jetzt das unerwartete String-Ende?
Laut SQL (MySQL) sollte das entsprechende SQL-Statement so aussehen:
("INSERT INTO hauptbuch (BuNr, ReNr) VALUES (bunmmr, renmmr)")
Fehlermeldung ist dann: Function secquence Error
wo klemmt das da noch - kann doch eigentlich nicht so weit weg sein....
HerbK
openmind
****
Beiträge: 184
Registriert: So, 29.06.2003 15:00
Wohnort: Schweiz

Beitrag von openmind »

herbk hat geschrieben:Statement.executeUpdate("INSERT INTO hauptbuch (BuNr, ReNr)").VALUES (bunmmr, renmmr)
Tja, das scheint mr auch nich funktionieren zu können . ICh schlage vor:

Code: Alles auswählen

Statement.executeUpdate("INSERT INTO hauptbuch (BuNr, ReNr) VALUES ('bunmmr', 'renmmr' )" )
Meine Installation: AMD Athlon XP 1600+, 512 MB RAM, SuSE Linux 8.2, OpenOffice 1.1
Kostenlose OOo-CD in der Schweiz: http://www.office-cd.ch/
herbk
**
Beiträge: 36
Registriert: Fr, 16.01.2004 14:29
Kontaktdaten:

Beitrag von herbk »

OK, der Schritt war gut...doch leider ist das Ergebnis noch nicht ganz richtig.
So wird mir zwar etwas in die Datenbank geschrieben, aber leider etwas falsches.
Ich denke dass - VALUES ('bunmmr', 'renmmr' ) - die beiden Variablen als string ausweist. Beides sind jedoch Integer und auch das zugehörige Feld der DB erwartet eine Integer, deshalb wird der Eintrag so mit 0 eingetragen.
Wenn ich die Hochkomma weg lasse, bekomme ich aber einen Fehler
Function sequence Error
angezeigt.
Die Werte der Variablen bunmmr und renmmr sind aber definitiv nicht null, lasse sie mir unmittelbar vor dem Eintrag in die DB mit einer MSGBox anzeigen...
HerbK
openmind
****
Beiträge: 184
Registriert: So, 29.06.2003 15:00
Wohnort: Schweiz

Beitrag von openmind »

Ich denke dass - VALUES ('bunmmr', 'renmmr' ) - die beiden Variablen als string ausweist
Ach so! bunmmr und remmr sind Variablen? Dann hast Du recht. Der Code behandelt bunmmr und renmmr nicht als Variablen sondern als Zeichenketten. Demnach must Du das ganze einfach als Zeichenkette zusammenfügen. Da der SQL-Befehl Integer einfügen soll müssen die Hochkommas weggelassen werden, die brauchts nur für Zeichenketten. Mit & lässt sich das Query zusammensetzen. In einem Schritt:

Code: Alles auswählen

Statement.executeUpdate("INSERT INTO hauptbuch (BuNr, ReNr) VALUES ( " & bunmmr & ", " & renmmr & " )" )

oder übersichtlicher (vielleicht musst Du den Code ja pflegen ;-)) :

Code: Alles auswählen


Dim query as String
Dim updateCount as Integer

query = "INSERT INTO hauptbuch (BuNr, ReNr) VALUES ( "
query = query & bunmmr 
query = query &  ", " 
query = query & renmmr 
query = query & " )"


updateCount = Statement.executeUpdate( query )

MsgBox "Anzahl geänderter Einträge: " & updateCount
hoffentlich hilfts
Meine Installation: AMD Athlon XP 1600+, 512 MB RAM, SuSE Linux 8.2, OpenOffice 1.1
Kostenlose OOo-CD in der Schweiz: http://www.office-cd.ch/
herbk
**
Beiträge: 36
Registriert: Fr, 16.01.2004 14:29
Kontaktdaten:

Beitrag von herbk »

folgendes hab ich jetzt erkannt:
statement.executUpdate (was da drinsteht) akzeptiert keine Variablen!
wenn ich bunmmr und renmmr durch eine Zahl ersetze wird alles schön in die DB geschrieben.
habe jetzt schon einen String aus
"INSERT INTO hauptbuch (BuNr, ReNr) VALUES (bunmmr, renmmr)")
gemacht und versucht diesen mit
Statement.executeUpdate(inhalt)
zu übergeben... mit dem Erfolg, dass ich einen "Syntax error in SQL expression" erhalten habe..
Das verstehe ich jetzt so, dass ich nur noch "inhalt" so auszeichnen muss, dass SQL eine Variable erkennt...
Nur wie kennzeichne ich "inhalt" als Varible?
HerbK
openmind
****
Beiträge: 184
Registriert: So, 29.06.2003 15:00
Wohnort: Schweiz

Beitrag von openmind »

SQL kennt keine Basic-Variablen! Woher auch? Die DB ist nicht in OOo drin, sondern wird über ein DB-Layer angesprochen. Du musst das Query so zusammensetzten das es ein korrektes SQL-Statenment ergibt. Siehe mein Beispiel oben.


Was bedeuten die doppelten Anführungszeichen für Basic?

"INSERT INTO hauptbuch (BuNr, ReNr) VALUES (bunmmr, renmmr)"
Meine Installation: AMD Athlon XP 1600+, 512 MB RAM, SuSE Linux 8.2, OpenOffice 1.1
Kostenlose OOo-CD in der Schweiz: http://www.office-cd.ch/
herbk
**
Beiträge: 36
Registriert: Fr, 16.01.2004 14:29
Kontaktdaten:

Beitrag von herbk »

danke, Deinen vorletzten Beitrag habe ich vor lauter probieren ganz übersehen....
HerbK
herbk
**
Beiträge: 36
Registriert: Fr, 16.01.2004 14:29
Kontaktdaten:

Beitrag von herbk »

wenn ich das & durch ein + ersetze funktioniert es, denn meine Variablen sind fast alle numerisch :D
das einzige Problem, das ich jetzt noch habe ist das übergeben eines Datumswertes. Dass SQL "Datum" in ' haben möchte, ist beachtet.
Es wird auch ein Wert übergeben, wenn ich den Eintrag in der DB kontrolliere steht aber etwas falsches drinn...
Datum ausgelesen 04.02.04 wird zum Eintrag 02.01.4 in der Datenbank.
Auch wenn ich das Datum mit "Date" direkt aus dem System hole, ist der DB 02.01.4
Ich denke eigentlich, dass das Prob durch unterschiedliche Formate verursacht wird, denn wenn ich das Format in der DB von "Datum" auf "String" ändere, werden die Werte korrekt übergeben.
Eigentlich hätte ich aber schon gerne das Datumsformat in der DB, da es sonst ja wohl nicht möglich ist eine Abfrage zu erstellen, welche sich auf Datumsbereiche bezieht... (hab ich aber noch nicht probiert)
HerbK
openmind
****
Beiträge: 184
Registriert: So, 29.06.2003 15:00
Wohnort: Schweiz

Beitrag von openmind »

da bleibt die wohl nichts als die DOku zu deiner DB in die Hand zu nehmen
Meine Installation: AMD Athlon XP 1600+, 512 MB RAM, SuSE Linux 8.2, OpenOffice 1.1
Kostenlose OOo-CD in der Schweiz: http://www.office-cd.ch/
Antworten