mit macro in Datenbank schreiben
Moderator: Moderatoren
mit macro in Datenbank schreiben
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?
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
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.
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/
Kostenlose OOo-CD in der Schweiz: http://www.office-cd.ch/
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]
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
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,
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
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/
Kostenlose OOo-CD in der Schweiz: http://www.office-cd.ch/
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
' 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
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.herbk hat geschrieben: ' in DB schreiben mit SQL
oResultSet = oStatement.executeUpdate( _
"INSERT INTO " & sTabellenName & _
" VALUES ( 'hans', 'weint', 'erbärmlich' ) " )
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/
Kostenlose OOo-CD in der Schweiz: http://www.office-cd.ch/
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....
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
Tja, das scheint mr auch nich funktionieren zu können . ICh schlage vor:herbk hat geschrieben:Statement.executeUpdate("INSERT INTO hauptbuch (BuNr, ReNr)").VALUES (bunmmr, renmmr)
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/
Kostenlose OOo-CD in der Schweiz: http://www.office-cd.ch/
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...
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
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:Ich denke dass - VALUES ('bunmmr', 'renmmr' ) - die beiden Variablen als string ausweist
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
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/
Kostenlose OOo-CD in der Schweiz: http://www.office-cd.ch/
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?
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
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)"
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/
Kostenlose OOo-CD in der Schweiz: http://www.office-cd.ch/
wenn ich das & durch ein + ersetze funktioniert es, denn meine Variablen sind fast alle numerisch
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)

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
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/
Kostenlose OOo-CD in der Schweiz: http://www.office-cd.ch/