Auslesen von Daten aus Formularen (Value)

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

Moderator: Moderatoren

willie
Beiträge: 9
Registriert: Mo, 21.02.2005 12:37

Auslesen von Daten aus Formularen (Value)

Beitrag von willie »

Hallo,

seit einiger Zeit versuche ich Daten, die gerade angezeigt werden, aus Feldern eines Formulars auszulesen. Leider funktioniert die Value Funktion nicht.
Ich habe folgendes Makro verfasst, das aus dem aktuellen Formular (einziges vorhandenes) den Wert des Feldes Position auslesen und anzeigen soll. Als Datenbank verwende ich MySQL mit ODBC-Treiber.

Sub Main

DIM oDoc As Object
DIM oPage As Object
DIM oForm As Object
Dim oField As Object
Dim n AS Variant

oDoc = thisComponent
oPage = oDoc.DrawPage
oForm = oPage.Forms.GetByIndex(0)

oField = oForm.GetByName("Position")
n = oField.Value
msgbox("The value of Number:",,n)

End Sub

Das Makro bricht jedes Mal an der Zeile n = oField.Value ab mit der Fehlermeldung
Basic Laufzeitfehler.
Eigenschaft oder Methode nicht gefunden
In einem anderen Forumsbeitrag habe ich gefunden, dass die Funktion Value nur mit einem numerischen Feld funktioniert. Dies ist beim Feld Position aber der Fall (Dezimal 3,2). Die bei der Tabellendefinition im OpenOffice mögliche Auswahl für den Typ "Zahl (numeric)" wird grundsätzlich nicht akzeptiert und immer in Dezimal umgewandelt, was nach meinem Verständnis aber kein Problem sein dürfte, da es in MySQL den expliziten Datentyp Numeric nicht gibt und z.B. Dezimal aber einer der numerischen Datentypen ist.

Wo liegt der Haken??, hoffentlich kann mir jemand weiterhelfen...

Mit freundlichen Grüßen

Willie
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

In einem anderen Forumsbeitrag habe ich gefunden, dass die Funktion Value nur mit einem numerischen Feld funktioniert. Dies ist beim Feld Position aber der Fall (Dezimal 3,2).


Das kann ich jetzt nicht exakt deuten. Es gibt numerische und Textfelder in dem Zusammenhang, die sehen im Formular gleich aus "funktionieren" aber etwas anders. Ein Textfeld kann auch den Wert 3,2 enthalten muß aber trotzdem mit n=oField.Text gelesen werden.
Abgesehen davon das Deine MessageBox wohl nicht genau so funktioniert wie Du das willst funktioniert Dein Code bei mir.


Gruß
Stephan
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hey Willie,
gibt es eine Möglichkeit den aktuellen Inhalt eines Kombinationsfeldes analog auszulesen?
Ja. Da das Kombinationsfeld eine Kombination aus Textfeld und Listbox darstellt, kannst du den Inhalt des Textfeldes ebenfalls mit .text auslesen.

Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

Wie kann ich die per Makro in Formular-Felder eingetragenen Werte auch in die Datenbank übernehmen?


Der Grund das die nicht übernommen werden ist das der aktuelle Satz in der Datenbank erst geändert wird wenn Du die Formularanzeige auf den nächsten Satz wechselst. (die Werteänderungen im Formular sind zunächst nur temporär) Das kannst Du zur Not mit dem Makrorekorder aufzeichenen, also: "gehe einen Satz vor und einen wieder zurück".

Vielleicht weiß Thomas einen Code dafür.


Gruß
Stephan
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

Zu der Sache mit der Ereignissteuerung kann ich aus dem Stehgreif nichts sagen, ich sehe es zunächst so wie Du.
Nur irgendwie verstehe ich das Ganze Verfahren nicht. Wenn Du Werte in die Maske einträgst, dann doch wohl nur aus dem Grund das der User sie später ändert oder ergänzt. Der User wird dann also den Datensatz manuell wechseln. Du must also per Code doch nur dann ein Schreiben in die Datenbank erzwingen wenn der User absichtlich nicht speichern will, wenn er das Formular schließt. Das ist dann aber wirklich nur einmal nötig und mit einem Makro das Du dem Ereignis "Schließen" zuordnetst einfach zu bewerkstellingen.

Gruß
Stephan
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

Ich bin ja gerne bereit zuzugeben das ich mich irre, nur ich verstehe es nicht.

Du hast ein Formular mit mehreren Feldern. Ein Teil davon wird direkt aus der Datenbank übernommen, ein Teil der Werte per Makro eingetragen oder meinetwegen auch geändert. Der Nutzer sieht jetzt einen(!) Datensatz der Datenbank, alle Werte die hierbei direkt aud der Datenbank stammen stehen im Formular und in der Datenbank, Werte die per Makro eingetragen oder geändert wurden stehen zunächst temporär im Formular. Ändert oder ergänzt der Nutzer Werte stehen die ebenfalls im Formular. Solange der Nutzer den Datensatz nicht wechselt sind alle Werte vorhanden. Sobald der Nutzer den Datensatz wechselt werden alle Temporärwerte in die Datenbank geschrieben. Versucht der Nutzer das Formular zu schließen kann es sein das die Werte eines Datensatzes nicht geschrieben werden, weil der Nutzer die Sicherheitsabfrage verneint. Nur im letzteren Fall mußt Du ein Makro starten was sicherstellt das die Werte geschrieben werden.
Alle anderen Werte werden zu jeder Zeit automatisch in der Datenbank geändert oder ergänzt, vorausgesetzt das das Formular korrekt mit der Datenbank verknüpft ist und die Datenbank nicht schreibgeschützt ist. Ich sehe bei konkreter Verknüpfung nicht mal die Möglichkeit ein Schreiben der aktualisierten Werte bei Wechsel des Datensatzes zu verhindern, selbst wenn ich das wollte. Ich könnte nur wenn ich das will unmittelbar nach dem Schreiben gleich wieder löschen. (Ja klar ich kann mir einen Code ausdenken der zu Beginn des Wechsels des Datensatzes die Formularfelder löscht o.ä. bloß das wäre dann alles absichtlich.)

Ja und ich kann natürlich nicht sagen, wie Du Dein Formular erstellt hast. Ein 'normal' mittels Assitent erstelltest Formular wird sich IMHO immer so verhalten wie geschildert.


Also bitte erkläre mir das nochmal, ich verstehe es nicht.

Und ich habe das mit Fokuserhalt und Verlust nicht geprüft, bloß selbst wenn es nur bei Fokusverlust gehen sollte, wo ist das Problem? Die Anzahl der Elemente auf dem Formular ist endlich. Willst Du für ein Element das Ereignis Fokuserhalt auswerten und es geht nicht direkt werte einfach für alle Übrigen das Ereignis Fokusverlust aus. Denn wenn Du z.B. 10 Steuerelemente hast (Nr.1 bis Nr.10) und eines der Elemente von Nr.1 bis Nr.9 den Fokus verliert, muß zwangsläufig Nr.10 ihn gerade erhalten haben.


P.S.
Nur um sicher zu gehen: Wir reden über ein (Datenbank)formular im Sinne der OOo-Terminologie und nicht über einen Basic-Dialog. (dieses Mißverständnis gab es hier nämlich schon öfter weil bei MS Office eine Userforn eine Form oder ein Formular umgangssprachlich dasselbe meinen, aber ebend etwas völlig anderes als ein Formular bei OOo)

Gruß
Stephan
fichte.buche
***
Beiträge: 55
Registriert: Di, 29.03.2005 12:38

Bitte Helfen wie geht der Vor-Rückwertssprung

Beitrag von fichte.buche »

Hallo

Könnt Ihr mir bitte helfen. Ich bräuchte das mit dem Vor-Rückwärtssprung. Ich habs bisher leider nicht finden können wie ich das machen soll.
Denn derzeit schreibt mir das Makro zwar den Text in das Textfeld aber der wird gelöscht sobald ich mit der Maus irgendwo anders hingehe.

DANKE
Baum
fichte.buche
***
Beiträge: 55
Registriert: Di, 29.03.2005 12:38

über Makro Text schreiben funktioniert nicht

Beitrag von fichte.buche »

Hallo,

Hab jetzt folgendes ausprobiert:
Ich hab ein Datenbankformular unter OOo1.9.100 mit einer Tabelle.

Wenn ich in die Tabelle in einer Spalte einen Text hineinschreiben will muß ich vorher manuell mit der Maus den Cursor zu diesem Feld setzten. Dann wird zwar der Text über das Makro in das Feld geschrieben, aber ich muß nachträglich den Text nochmals von Hand editieren (z.B. hinten ein Leerzeichen einfügen und wieder löschen) damit bei welches zum nächsten Datensatz der Text auch in die Datenbank geschrieben wird.

Laß ich den Text in ein Textfeld schreiben, muß ich mit dem Cursor nicht dort sein und der Text wird dort hineingeschrieben. Allerdings ist bei wechseln in den nächsten Datensatz und wieder retour der Text auch wieder weg.

Woran kann das liegen?

Hier ein Ausschnitt des jetzigen Codes.

Doc = thisComponent
Page = Doc.DrawPage
Form = Page.Forms.GetByIndex(0)

Field = Form.GetByName("Bestell")
Liefnr = Field.GetByIndex(2).Text

'Hier hab ich dann eine Verbindung zu einem Datensatz einer anderen Datenbank eingefügt

msgbox ResultSet.getString(4)
'Field.getByIndex(4).Text = ResultSet.getString(4)
'msgbox Field.getByIndex(4).Text
Field = Form.GetByName("Name2")
Field.Text = ResultSet.getString(4)
msgbox Field.Text

Die Msgboxen sind nur zur Kontrolle ob auch das richtige passiert.

Ich hab versucht ein Makro aufzuzeichnen mit dem einfügen eines Leerzeichens und dann wieder löschen. Aber hier zeichnet der Makrorecorder nichts auf.

Kann mir jemand helfen wie ich den Text so schreiben kann, daß er dann auch in der Datenbank landet.

Viele Grüße
Fichte.Buche
Antworten