Datensatz in Formular per Macro speichern

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

Moderator: Moderatoren

laura36
**
Beiträge: 27
Registriert: Fr, 24.03.2006 16:29

Datensatz in Formular per Macro speichern

Beitrag von laura36 »

Hallo,

nochmal eine Frage:

mit

Code: Alles auswählen

Sub Reload
    dim oDoc as object, oForm as object
    oDoc = ThisComponent
    oForm = oDoc.DrawPage.Forms(0)
    oForm.reload
End Sub
kann mich mein Formular, das an eine Datenbank angebunden ist neu laden.

Aber wie kann ich per Macro einen Datensatz speichern?

Code: Alles auswählen

Sub Reload
    dim oDoc as object, oForm as object
    oDoc = ThisComponent
    oForm = oDoc.DrawPage.Forms(0)
    oForm.submit 
    oForm.reload
End Sub
funktioniert nicht. Da bekomme ich folgende Fehlermeldung: "Arguments len differ!." (soll wohl "leng" heißen??)

Was mache ich falsch?

Ich habe ein Unterformular, in einem Formular: Das Problem ist nun, dass bei einem neuen Datensatz dieser erst gespeichert werden muß und das ganze Formular neu geladen, damit ich auch in das Unterformular entsprechend den neuen Datensatz eintragen kann. (Klar, sonst weiß das Unterformular ja noch nichts von dem Wert des Verknüpften Feldes). Ich wollte das per Macro so lösen, dass, sobald das Feld des Unterformulars angeklickt wird, das übergeordnete gespeichert und neu geladen wird.

Jemand eine Idee.

Danke schon mal

grüße
laura

P.S. habe gerade gemerkt, dass das noch keine Lösung wäre. Datensatz speichern ist gut. Aber reload ist nicht gut, weil ich dann ja gar nicht bei meinem gerade eingefügten Datensatz bin, sondern ganz am Anfang. Aber die Frage mit dem submit bleibt bestehen. Wenn jemand für die Anwendung noch eine Idee hat, würde ich mich freuen.
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hey Laura,

Stück für Stück tastest du dich ran - was :wink:

Eigentlich ist es einfacher, zu beschreiben, was du willst - dann deine Ideen auflisten und gemeinsam diskutieren - dann programmieren.

Also, lass mich raten: Du möchtest eine Auswahlbox haben, die dir einen Auszug aus einer Datenbank anzeigt (z.B. Namen) , dann wälst du einen Namen und es sollen die Details hierzu aus einer anderen Tabelle in das Unterformular geladen werden? Richtig?
Also: Zur Lösung gehe ich hier über eine dritte Tabelle, welche nur einen Datensatz beinhaltet - den Namen des ausgewählten (oder was du sonst für daten nimmst. Das Unterformular (das jetzt gar keins mehr ist) holt sich immer die Daten per SQL Selectbefehl mit dem Kriterium des ersten (und einzigen) Datensatzes der dritten tabelle.

Um jetzt Deine Frage mit dem Makro zu beantworten:

mit updateRow() schreibst du einen geänderten Datensatz in dei Datenbank zurück, dein Makro müsste also heissen:

Code: Alles auswählen

Sub Reload
    dim oDoc as object, oForm as object
    oDoc = ThisComponent
    oForm = oDoc.DrawPage.Forms(0)
    oForm.updateRow()
    oForm.reload
End Sub 
gibt es nur eine Reihe (Auswahl), dann funktioniert das einwandfrei :-)

Ein ähnliches Beispiel habe ich in meinem Base-Buch beschrieben :wink:

Viele Grüße
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
laura36
**
Beiträge: 27
Registriert: Fr, 24.03.2006 16:29

Beitrag von laura36 »

Hi Toxitom,

danke für die schnelle Antwort.

Ich beschreibe noch mal, was ich vorhabe:
Also, lass mich raten: Du möchtest eine Auswahlbox haben, die dir einen Auszug aus einer Datenbank anzeigt (z.B. Namen) , dann wälst du einen Namen und es sollen die Details hierzu aus einer anderen Tabelle in das Unterformular geladen werden? Richtig?
Also: Zur Lösung gehe ich hier über eine dritte Tabelle, welche nur einen Datensatz beinhaltet - den Namen des ausgewählten (oder was du sonst für daten nimmst. Das Unterformular (das jetzt gar keins mehr ist) holt sich immer die Daten per SQL Selectbefehl mit dem Kriterium des ersten (und einzigen) Datensatzes der dritten tabelle.
Ich bin mir nicht sicher, ob ich das ganz verstanden habe (wobei ich das in einem anderen fall mglw. brauchen kann.) Mein Fall ist - glaube ich - anders gelagert:

Ich habe eine Tabelle, die in einem Formular angezeigt wird.
*Hier sieht man die Daten einer Insitution (organisationen)

Es gibt zwei weitere Tabelle.
*Eine (rubriken) in der Kriterien definiert sind (sozusagen Rubriken der Institutionen)
*und eine (beziehungen) many to many, in denen diese den Datensätzen der Institutionen zugeordnet sind Also: ein Datensatz aus den Institutionen kann so oft in der Tabelle "beziehungen" stehen wie es unterschiedliche Rubriken gibt. So gibt es die Möglichkeit, einer Institution verschiedene Eigenschaften zuzuweisen...

In einem Unterformular werden nun in einer Tabelle alle Datensätze aus "beziehungen" angezeigt, die mit der im Formular angezeigten Organisation verknüpft sind (also ein bis mehrere Zeilen) Über eine Listbox als Tabellenelement können hier wiederum die Namen der Kriterien direkt ausgewählt werden.

Das Problem besteht darin, dass zwar alles korrekt angezeigt wird, auch bearbeiten kann man die Daten bestens, aber bei einem neuen Datensatz gibt es noch nicht die Möglichkeit in die Tabelle im Unterformular etwas einztragen. Erst nach dem der Datensatz gespeichert wurde (z.B. dadurch, dass man zum nächsten geht und wieder zurück) läßt sich auch hier etwas eintragen.

Ich wollte das mit dem Macro lösen, indem der Datensatz automatisch gespeichert wird, und das Formular mit dem aktuellen Datensatz als Inhalt nochmals geladen wird (mit den beschriebenen Schwierigkeiten). Sehr elegant scheint das aber wahrlich nicht zu sein.

Es gab hier im Forum schon mal die gleiche Frage - allerdings ohne Lösung:

viewtopic.php?t=7659&highlight=unterformular

(nur Problem b trifft zu)

grüße
carsten
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hey Carsten,
Das Problem besteht darin, dass zwar alles korrekt angezeigt wird, auch bearbeiten kann man die Daten bestens, aber bei einem neuen Datensatz gibt es noch nicht die Möglichkeit in die Tabelle im Unterformular etwas einztragen. Erst nach dem der Datensatz gespeichert wurde (z.B. dadurch, dass man zum nächsten geht und wieder zurück) läßt sich auch hier etwas eintragen.
OK, jetzt verstanden. Tia, das ist das Problem der "eierlegenden Wollmilchsau" :wink:
Es macht schon durchaus Sinn, getrennte Formulare zur "nur" Eingabe und zur Anzeige/Plege der Datensätze zu benutzen.
Technisch gesehen hast du recht - das geht nicht anders. Erst wenn ein Datensatz "gespeichert" wird, hat er einen Primärschlüssel und die Unterformulare können ahängige Datensätze speichern/erzeugen - vorher geht das nicht.
Man kann das mit einem Makro "abfangen", jetzt wäre aber richtig "Handarbeit" angesagt. Du brauchst zuerst ein Ereignis (zum Beispiel Fokusverlust) eines Feldes - jetzt prüfst du (per Makro), ob der Datensatz schon existiert (Select-Anweisung), wenn ja, führst du einen "Update" Befehl aus, ansonsten einen "Insert" Befehl. Anchliessend lädst du den aktuellen Datensatz wieder in das Formular. Dadurch hättest du alles automatisiert, ein zusätzlicher Button würde entfallen.
Also, hier ist - wie gesagt - ein wenig mehr Handfarbeit nötig :wink:

Gruß
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Mihilist
****
Beiträge: 120
Registriert: Di, 25.04.2006 15:27
Wohnort: Nürnberg
Kontaktdaten:

Beitrag von Mihilist »

Hey laura, carsten, wie auch immer ;o)
laura36 hat geschrieben:Das Problem besteht darin, dass zwar alles korrekt angezeigt wird, auch bearbeiten kann man die Daten bestens, aber bei einem neuen Datensatz gibt es noch nicht die Möglichkeit in die Tabelle im Unterformular etwas einztragen. Erst nach dem der Datensatz gespeichert wurde (z.B. dadurch, dass man zum nächsten geht und wieder zurück) läßt sich auch hier etwas eintragen.
Mein aktuelles Projekt ist so ähnlich aufgebaut, und ich hab das jetzt eben mal überprüft. Und tatsache: Beim simplen Speichern einer neuen Row im Main-Formular wird keine insertrow für das Sub-Formular angezeigt, erst nachdem man beispielsweise einen Datensatz zurück und wieder vor geht.

Ich hab das allerdings recht schnell gelöst, indem ich beim speichern überprüfe, ob der Fall auftritt ;) dh Speichern muss der Benutzer immer noch, aber nicht diesen Vorwärts-Rückwärts-Tanz aufführen:

Code: Alles auswählen

Sub update_beim_speichern
	DIM frmMain AS OBJECT
	DIM frmSub AS OBJECT

	frmMain = ThisComponent.Drawpage.Forms.getByName("Main")
	frmSub = frmPerson.getByName("Sub")

	if frmSub.rowcount = 0 then
		frmSub.reload
	end if
End Sub
Scheint auf den ersten Blick zu funktionieren.
Allerdings hab ich noch keine Ahnung, ob das Formular dadurch nicht ziemlich verlangsamt wird...

Wenn du das Übernimmst und testest wär's nett, wenn du mir eventuelle Mängel mitteilst, hab nämlich grad noch anderes zu tun ;)
laura36
**
Beiträge: 27
Registriert: Fr, 24.03.2006 16:29

Beitrag von laura36 »

Hi Mihilist,

vielen Dank für die Antwort, das ist genau das, was ich gesucht habe. Ich habe es mittlerweile in das Projekt integriert. Den Praxistest hat es noch nicht bestanden, aber im Testlauf macht es genau was es soll. Ich habe das Makro mit dem Ereignis des übergeordneten Formulars "Nach Datensatzaktion" verbunden. Jetzt reicht es sogar, wenn das Unterformular angeklickt wird. Da dadurch der Datensatz automatisch gespeichert wird, taucht sofort die Möglichkeit zur Eingabe im Unterformular auf.

Da du einen Variablenname für das Forum im Beispielscript nicht geändert hattest und dadurch ein kleiner Fehler im Script war (frmPerson statt frmMain), hier nochmal das lauffähige:

Code: Alles auswählen

Sub update_beim_speichern
   DIM frmMain AS OBJECT
   DIM frmSub AS OBJECT

   frmMain = ThisComponent.Drawpage.Forms.getByName("Main")
   frmSub = frmMain.getByName("Sub")

   if frmSub.rowcount = 0 then
      frmSub.reload
   end if
End Sub
Also vielen Dank. War eine große Hilfe

grüße
laura
Antworten