Seite 1 von 1

Gelöst :Datensatz an eine Tabelle über Basic-Makro anhängen?

Verfasst: So 20. Nov 2011, 17:39
von SignalSpirit
Hallo zusammen,

ich stehe momentan vor folgendem Problem:
Ich habe Daten aus einer Abfrage, die einem Formular dargestellt werden. In diesem Formular, kann dann ein Datensatz ausgewählt werden, der dann über ein Makro in eine andere Tabelle der Datenbank eingefügt werden soll. Ich möchte das Ganze über SDBC machen, da eine SQL-Anfügeabfrage sehr aufwendig wäre. Folgenden Code habe ich versucht.

Code: Alles auswählen

   oForm = ThisDatabaseDocument.FormDocuments.GetByName("LadebuchEingabe").component.drawpage.Forms.getByName("MainForm")
   '' Schreiben der Daten
   iDatum = oForm.getByName("eDatum").date
   sDatum = Str(iDatum\10000)+"-" + Str((idatum-((iDatum\10000)*10000))\100)+"-"+Str(idatum-((idatum-((iDatum\10000)*10000))\100)*100-(iDatum\10000)*10000)
   sAnzahl = str(oForm.getByName("eMenge").value)
   sBemerkungen = oForm.getByName("eBemerkungen").Text
   oStatement = oForm.ActiveConnection.createStatement()
   sSQL = "SELECT * FROM ""Ladebuch"""
   oStatement.ResultSetConcurrency = com.sun.star.sdbc.ResultSetConcurrency.UPDATABLE
   oStatement.ResultSetType = com.sun.star.sdbc.ResultSetType.SCROLL_SENSITIVE
   oTLadebuch = oStatement.executeQuery(sSQL)
   oTLadebuch.moveToInsertRow()
   oTLadebuch.updateString(1,sDatum)
   oTLadebuch.updateString(2,oForm.getString(2))
   oTLadebuch.updateString(3,oForm.getString(3))
   oTLadebuch.updateString(4,oForm.getString(4))
   oTLadebuch.updateString(5,oForm.getString(5))
   oTLadebuch.updateString(6,oForm.getString(6))
   oTLadebuch.updateString(7,oForm.getString(7))
   oTLadebuch.updateString(1,sAnzahl)
   oTLadebuch.updateString(1,sBemerkungen)
   oTLadebuch.insertRow()
   ''Ende des Schreibens
Leider bricht das Makro bei der Zeile " oTLadebuch.moveToInsertRow()" da das RecordSet angeblich "Read only" ist. Was mache ich falsch?

Re: Gelöst :Datensatz an eine Tabelle über Basic-Makro anhän

Verfasst: So 20. Nov 2011, 20:00
von SignalSpirit
Das Problem lag darin, dass das Statement oStatement die Parameter com.sun.star.sdbc.ResultSetType.SCROLL_SENSITIVE und com.sun.star.sdbc.ResultSetConcurrency.UPDATABLE nicht angenommen hat. Sieht mit nach einem Bug aus.

Ich habe das Ganze umschifft, indem ich dem Formular ein weiteres unsichtbares Form hinzugefügt habe, das die Verbindung zur Zieltabelle aufbaut.

Der Code funktioniert und sieht wie folgt aus:

Code: Alles auswählen

oZielform = ThisDatabaseDocument.FormDocuments.GetByName("LadebuchEingabe").component.drawpage.Forms.getByName("Zielform")
   oZielform.moveToInsertRow()
   oZielform.updateString(1,sDatum)
   oZielform.updateString(2,oForm.getString(2))
   oZielform.updateString(3,oForm.getString(4))
   oZielform.updateString(4,oForm.getString(5))
   oZielform.updateString(5,oForm.getString(6))
   oZielform.updateString(6,oForm.getString(7))
   oZielform.updateString(7,oForm.getString(8))
   oZielform.updateString(8,sAnzahl)
   oZielform.updateString(9,sBemerkungen)
   oZielform.insertRow()

Re: Gelöst :Datensatz an eine Tabelle über Basic-Makro anhän

Verfasst: Mo 21. Nov 2011, 11:43
von gogo
Direktes Iterieren ist in Base §"34""$6&%/(=?)(//(/7&%& !!! da diese Funktionalität naturgemäß stark mit mit verwendeten Backend abgestimmt sein muss. - Im Klartext: Die Update- oder Insert-Funktion bei Resultsets ist dermaßen instabil, dass ich sie prinzipiell nicht verwende.

Ein einfaches:
Insert into xyz select Datum, Feld1, ... from xyz where xyz.ID = 123456;

genügt nicht?

Re: Gelöst :Datensatz an eine Tabelle über Basic-Makro anhän

Verfasst: Di 22. Nov 2011, 18:35
von SignalSpirit
Normalerweise hätte ich auch den SQL Aufruf vorgezogen. Dummerweise enthält der Inhalt eines der Felder einen mehrzeiligen Text. Wenn ich SQL richtig verstehe, hätte ich diesen Feld extra analysieren und dann jeden Zeilenwechsel einzeln im SQL Befehl maskieren müssen.