🙏 Helfen Sie jetzt mit, unser LibreOffice Forum zu erhalten! 🙏
Mit Ihrer Spende sichern Sie den Fortbestand, den Ausbau und die laufenden Kosten dieses Forums. 🌱

🍀 Jeder Beitrag zählt – vielen Dank für Ihre Unterstützung!🍀

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

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

Base ermöglicht es Ihnen, Ihre Daten in einer Datenbank direkt mit LibreOffice zu bearbeiten.
Antworten
SignalSpirit
Beiträge: 10
Registriert: Do 10. Nov 2011, 02:01

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

Beitrag von SignalSpirit » So 20. Nov 2011, 17:39

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?

SignalSpirit
Beiträge: 10
Registriert: Do 10. Nov 2011, 02:01

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

Beitrag von SignalSpirit » So 20. Nov 2011, 20:00

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

gogo
* LO-Experte *
Beiträge: 1081
Registriert: Sa 5. Feb 2011, 19:07

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

Beitrag von gogo » Mo 21. Nov 2011, 11:43

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?
g
2008 LucidL./MaverickM./WinXP LibreOffice 3.3.2 > 02/13 LinuxMint13/Xubuntu > 09/13 Debian Wheezy+LO3.5.4.2 > 01/15 Debian Jessie KDE+LO4.3.3.2/Mint17 openbox auf USB+LO4.2.8.2 > 03/16 ArchLin & LO5.1+ff > 02/18 Kubuntu

SignalSpirit
Beiträge: 10
Registriert: Do 10. Nov 2011, 02:01

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

Beitrag von SignalSpirit » Di 22. Nov 2011, 18:35

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.


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