Seite 1 von 1
Daten per Makro in ein Base Formular eintragen
Verfasst: So, 31.10.2010 08:10
von hinki
Hallo,
ich bin neu in diesem Forum und benötige als absoluter Anfänger in Base eure Hilfe.
Meine Datenbank enthält eine Tabelle (1_Knd) und ein darauf basierendes Formular (1_Knd). Ein Feld der Tabelle und des Formulars heißt "Knd_ID".
Knd_ID enthält eine Nummer, die für jeden Eintrag in der DB-Tabelle einmalig ist.
Wenn ich das Formular öffne und anfange Daten einzugeben, möchte ich diese Knd_ID vergeben. Um nicht doppelte Knd_ID's zu vergeben, muss ich jedes Mal die Tabelle öffnen und den höchsten vergebenen Wert heraussuchen, plus eins nehmen und eintragen.
Meine Vorstellung ist, eine vorhandene Schaltfläche mit einem Makro zu hinterlegen, welches diesen Wert (Knd_ID +1) errechnet und dann in das Feld Knd_ID einträgt.
Was ich bis jetzt habe ist ein Makro, welches per SQL-Anweisung den höchsten Wert von Knd_ID aus der Tabelle ausliest und diesen Wert um 1 erhöht. Ich kann diesen auch in einer MsgBox anzeigen lassen.
Aber wie geht es weiter?
Ich benötige wirklich simpelste Erklärungen und nachvollziehbare Einzelschritte - weil ich verstehen möchte.
Ich hoffe die Frage und das Umfeld nachvollziehbar dargestellt zu haben.

Wenn nicht, bitte nachfragen.
Vielen Dank im Voraus.
Der bisherige Makrocode sieht wie folgt aus:
Code: Alles auswählen
Sub Knd_ID_ermitteln
Dim RowSet
' Create a row-set to query the database
RowSet = createUnoService("com.sun.star.sdb.RowSet")
RowSet.DataSourceName = "Tickets"
RowSet.CommandType = com.sun.star.sdb.CommandType.COMMAND
'Den Maximalwert des Feldes Knd_ID mittels SQL ermitteln
RowSet.Command = "SELECT max(""Knd_ID"") FROM ""1_Knd"""
RowSet.execute()
' it only returns 1 row
' so we need no loop
RowSet.next()
'RowSet ist ein String
'x = RowSet.getString(1)
'x wird der in eine Zahl umgewandelte String zugeordnet
x = Val (RowSet.getString(1))
'jetzt kann x hochgezählt werden
x = x + 1
'MsgBox "The MaxId is " + RowSet.getString(1)
MsgBox "The MaxId is " + x + " "
End Sub
Re: Daten per Makro in ein Base Formular eintragen
Verfasst: So, 31.10.2010 08:29
von turtle47
Hallo,
nehme dafür einfach die "Autowert" Funktion.

- Autowert.jpg (18.68 KiB) 5083 mal betrachtet
Viel Erfolg.
Jürgen
Re: Daten per Makro in ein Base Formular eintragen
Verfasst: So, 31.10.2010 11:47
von hinki
Hallo Jürgen,
vielen Dank für die schnelle Antwort.
An die Möglichkeit die Funktion "Autowert" zu nutzen habe ich auch schon gedacht.
Ich hatte das allerdings wieder verworfen, weil ich die Lösung ein Feld per Makro zu füllen auch noch an anderer Stelle benötige.
Dort geht es dann um einen zusammengesetzten Wert aus Buchstabenkombinationen und Zahlenwerten.
Die ersten gedanklichen Schritte zur Lösung dieser Frage habe ich schon gemacht - aber das automatisierte bzw. auf Anforderung erfolgende Eintragen des Wertes fehlt mir.
Danke schön
Uli
Re: Daten per Makro in ein Base Formular eintragen
Verfasst: So, 31.10.2010 12:33
von turtle47
Hallo,
folgendes sollte im geöffneten Formular gehen
Code: Alles auswählen
Dim oForm, oField_KD As Object
.........
MsgBox "The MaxId is " + x + " "
oForm = oDoc.drawpage.forms.getbyindex(0)'Drawpage des Formulars
oField_KD = "Kunden_ID" 'Feldname für Kunden-ID
oForm.getByName(oField_KD).text = x 'berechnete Kunden-ID eintragen
oForm.getByName(oField_KD).commit(true)'Kunden-ID festschreiben
Jürgen
Re: Daten per Makro in ein Base Formular eintragen
Verfasst: So, 31.10.2010 15:24
von hinki
Hallo,
und danke schön für Deine Mühe.
Ich habe den Code (neugierig, wie ich bin) sofort ausprobiert. Leider funktioniert es bei mir noch nicht so ganz.
Bei meinen Versuchen ist mir folgendes aufgefallen:
1.Versuch
Den genannten Code eingefügt.
Meldung: Objektvariable nicht belegt.
Das Makro bleibt in der Zeile ---> oForm = oDoc.drawpage.forms.getbyindex(0)'Drawpage des Formulars <--- stehen.
2.Versuch
Den Code abgeändert durch hinzufügen der Zeile (in dem Glauben die Objektvariable dadurch zu belegen)
---> oDoc = ThisDatabaseDocument.FormDocuments.getByName("1_Knd").open <---
Meldung: Falsche Verwendung eines Objekts
Das Makro bleibt in der Zeile ---> oField_KD = "Knd_ID" 'Feldname für Kunden-ID <--- stehen.
und schon bin ich mit meinem Latein am Ende.
Der gesamte Code sieht jetzt wie folgt aus:
Code: Alles auswählen
Sub Knd_ID_ermitteln
Dim RowSet
Dim oForm, oField_KD As Object
' Create a row-set to query the database
RowSet = createUnoService("com.sun.star.sdb.RowSet")
RowSet.DataSourceName = "Tickets"
RowSet.CommandType = com.sun.star.sdb.CommandType.COMMAND
'Den Maximalwert des Feldes Knd_ID mittels SQL ermitteln
RowSet.Command = "SELECT max(""Knd_ID"") FROM ""1_Knd"""
RowSet.execute()
' it only returns 1 row
' so we need no loop
RowSet.next()
'RowSet ist ein String
'x = RowSet.getString(1)
'x wird der in eine Zahl umgewandelte String zugeordnet
x = Val (RowSet.getString(1))
'jetzt kann x hochgezählt werden
x = x + 1
'MsgBox "The MaxId is " + RowSet.getString(1)
MsgBox "The MaxId is " + x + " "
oDoc = ThisDatabaseDocument.FormDocuments.getByName("1_Knd").open
oForm = oDoc.drawpage.forms.getbyindex(0)'Drawpage des Formulars
oField_KD = "Knd_ID" 'Feldname für Kunden-ID
oForm.getByName(oField_KD).text = x 'berechnete Kunden-ID eintragen
oForm.getByName(oField_KD).commit(true)'Kunden-ID festschreiben
End Sub
Re: Daten per Makro in ein Base Formular eintragen
Verfasst: So, 31.10.2010 16:33
von turtle47
hinki hat geschrieben:Meldung: Falsche Verwendung eines Objekts
Oh sorry, da ist mir ein Fehler unterlaufen.
Das ist die Zeile:
Die Variable "oField_KD" ist ein doch in der Verwendung ein String.
So, aber jetzt:
Code: Alles auswählen
Dim oForm as Object
Dim sField_KD as String
.........
MsgBox "The MaxId is " + x + " "
oDoc= ThisComponent
oForm = oDoc.drawpage.forms.getbyindex(0)'Drawpage des Formulars
sField_KD = "Kunden_ID" 'Feldname für Kunden-ID
oForm.getByName(sField_KD).text = x 'berechnete Kunden-ID eintragen
oForm.getByName(sField_KD).commit(true)'Kunden-ID festschreiben
Re: Daten per Makro in ein Base Formular eintragen
Verfasst: So, 31.10.2010 16:56
von hinki
Hallo,
und danke das Du Dir so viel Zeit für mich nimmst. - Toll-
Ich habe den Code jetzt entsprechend abgeändert - jetzt tritt eine andere Meldung auf.
Meldung: BASIC-Laufzeitfehler. Es ist eine Exception aufgetreten Type:com.sun.star.container.NoSuchElementException Message:.
und das Makro steht in der Zeile --->oForm.getByName(sField_KD).text = x 'berechnete Kunden-ID eintragen<---
Ich setze den Code mal wieder mit dazu, denn vielleicht habe ich ja auch etwas falsch abgetippt oder so...
Code: Alles auswählen
Sub Knd_ID_ermitteln
Dim RowSet
Dim oForm as Object
Dim sField_KD as String
' Create a row-set to query the database
RowSet = createUnoService("com.sun.star.sdb.RowSet")
RowSet.DataSourceName = "Tickets"
RowSet.CommandType = com.sun.star.sdb.CommandType.COMMAND
'Den Maximalwert des Feldes Knd_ID mittels SQL ermitteln
RowSet.Command = "SELECT max(""Knd_ID"") FROM ""1_Knd"""
RowSet.execute()
' it only returns 1 row
' so we need no loop
RowSet.next()
'RowSet ist ein String
'x = RowSet.getString(1)
'x wird der in eine Zahl umgewandelte String zugeordnet
x = Val (RowSet.getString(1))
'jetzt kann x hochgezählt werden
x = x + 1
'MsgBox "The MaxId is " + RowSet.getString(1)
MsgBox "The MaxId is " + x + " "
oDoc = ThisComponent
oForm = oDoc.drawpage.forms.getbyindex(0)'Drawpage des Formulars
sField_KD = "Knd_ID" 'Feldname für Kunden-ID
oForm.getByName(sField_KD).text = x 'berechnete Kunden-ID eintragen
oForm.getByName(sField_KD).commit(true)'Kunden-ID festschreiben
End Sub
Re: Daten per Makro in ein Base Formular eintragen
Verfasst: So, 31.10.2010 17:11
von turtle47
Die Fehlermeldung sagt mir, dass es in Deinem Formular kein Feld mit dem Namen "Knd_ID" gibt und somit nicht gefunden wird.

- Knd_ID.jpg (16.35 KiB) 5037 mal betrachtet
Re: Daten per Makro in ein Base Formular eintragen
Verfasst: So, 31.10.2010 17:23
von hinki
Hallo Jürgen,
danke für Deine Hilfe - es funktioniert !!!!!!!!
Und Du hattest Recht. Die Feldbezeichnung ist laut Formularnavigator anders.
Kaum macht man es richtig - schon funktioniert es

Ist doch immer wieder beeindruckend.
Hab' nochmals vielen, lieben Dank für Deine Mühe und Ausdauer - ich bin begeistert und habe mit Deiner Hilfe eine Menge lernen können - ganz, ganz toll.
Viele Grüße
Uli
Re: Daten per Makro in ein Base Formular eintragen
Verfasst: Mi, 15.12.2010 22:13
von hinki
Hallo Frank,
ich hoffe ich kann Dir mit meinen bescheidenen Mitteln helfen.
Wenn ich mir den geposteten Code ansehe, fällt mir folgendes auf:
DataSourceName ist der Name der Datenbank. (Du hast den Namen der Tabelle eingetragen)
1_Knd ist in meinem Fall der Name der Tabelle. ( Da muss bei Dir dann Kontakte stehen)
Ich rufe das Makro im Formular per Schaltfläche auf. Deshalb bezieht sich oDoc auf ThisComponent.
Die MsgBox ist nur zur Kontrolle da und kann im Nachgang auskommentiert werden.
Hilft Dir das ein wenig?
Ebenso liebe Grüße
Uli
Re: Daten per Makro in ein Base Formular eintragen
Verfasst: Do, 16.12.2010 12:46
von HTTPCore
Hallo Uli,
vielen Dank das hat mir schon sehr geholfen. Die ersten Hürden sind genommen.
Problem
Nun ist es so, dass ich ebenfalls eine Schaltfläche mit dem Makro belegt habe und diese den höchsten Wert in einträgt. Will ich dann aber den Datensatz speichern ist das Symbol zum Abspeichern noch immer inaktiv / grau. Wenn ich darauf verzichte und einen neuen Datensatz anlege, verschwindet der Wert, wenn ich wieder den vorhergehenden Datensatz aufrufe. Trage ich den Wert per Hand ein, bleibt er erhalten das Speichern-Symbol wird bunt.
Mein Verdacht geht dahin, dass der Fehler in den letzten drei Zeilen verborgen ist, denn für "sField_KD" habe ich keine Entsprechung in meiner Tabelle, Formular etc. Ich hatte es dann durch meine "KundenID" ausgetauscht, aber das brachte nur eine neue Fehlermeldung.
Code: Alles auswählen
Sub Knd_ID_ermitteln
Dim RowSet
Dim oForm as Object
Dim sField_KD as String
' Create a row-set to query the database
RowSet = createUnoService("com.sun.star.sdb.RowSet")
RowSet.DataSourceName = "Klienten DB OpenOffice"
RowSet.CommandType = com.sun.star.sdb.CommandType.COMMAND
'Den Maximalwert des Feldes Knd_ID mittels SQL ermitteln
RowSet.Command = "SELECT max(""KundenID"") FROM ""Kontakte"""
RowSet.execute()
' it only returns 1 row
' so we need no loop
RowSet.next()
'RowSet ist ein String
'x = RowSet.getString(1)
'x wird der in eine Zahl umgewandelte String zugeordnet
x = Val (RowSet.getString(1))
'jetzt kann x hochgezählt werden
x = x + 1
'MsgBox "The MaxId is " + RowSet.getString(1)
MsgBox "The MaxId is " + x + " "
oDoc = ThisComponent
oForm = oDoc.drawpage.forms.getbyindex(0)'Drawpage des Formulars
sField_KD = "KundenID" 'Feldname für Kunden-ID
oForm.getByName(sField_KD).text = x 'berechnete Kunden-ID eintragen
oForm.getByName(sField_KD).commit(true)'Kunden-ID festschreiben
End Sub
Liebe Grüße,
Frank
Re: Daten per Makro in ein Base Formular eintragen
Verfasst: Do, 16.12.2010 13:39
von hinki
Hallo Frank,
vielen Dank für die Rückmeldung.
Aus Deiner Beschreibung werde ich leider noch nicht ganz schlau.
...Makro belegt habe und diese den höchsten Wert in einträgt.
Verstehe ich das richtig, dass der Wert im Formular an der richtigen Stelle eingetragen wird? (Oder wird er nur in der MsgBox richtig angezeigt?)
Für "sField_KD" kannst Du keine Entsprechung haben, weder in Tabellen noch in Formularen. Der Grund dafür: sField_KD ist eine Variable.
Diese Variable nimmt den Feldnamen des Formularfeldes (Ziel) auf, damit im weiteren Verlauf der Wert der Variablen x, die ja den berechneten Wert enthält, in das Formularfeld (Ziel) geschrieben werden kann.
Hilft Dir das weiter?
Liebe Grüße aus dem verschneiten Norden, der noch Lichtjahre von einem Chaos entfernt ist.
Uli
Re: Daten per Makro in ein Base Formular eintragen
Verfasst: Do, 16.12.2010 14:21
von DPunch
Aloha
Hol Dir den genauen Namen des Feldes, in dem Du Dir das Feld anschaust, wie turtle47 es ein paar Posts vorher anschaulich per Screenshot gezeigt hat.
Hast Du diesen Namen (ich gehe jetzt einfach mal davon aus, dass das Feld im Formular den Namen "KundenID" trägt).
Dann ersetzt Du die letzten 3 Zeilen Deines Basic-Codes durch
Code: Alles auswählen
oForm.getByName("KundenID").BoundField.updateInt(CInt(x))
Re: Daten per Makro in ein Base Formular eintragen
Verfasst: Fr, 17.12.2010 14:42
von hinki
Hallo Frank,
ich kann leider erst jetzt antworten, da das Forum gestern Abend nicht mehr erreichbar war. Da die Antwort von DPunch Dir weiter geholfen hat, erübrigt sich meine Nachfrage. Aus meiner Sicht war nur noch nicht klar, an welcher Stelle genau der Fehler auftrat.
Automatisch eintragen lassen? Ja, das geht auch.
Du kannst das über die Funktion Autowert im Bereich der Tabellenfelddefinition realisieren.
Sieh Dir hierzu einmal in diesem Beitrag den zweiten Eintrag von turtle47/Jürgen an.
Hinweise zu Informationen findest Du zum Beispiel im ersten Eintrag des Forums OOo Basic und Java / "Informationen zur StarBasic-Programmierung".
Als weitere Hilfe bist Du ja bereits hier im Forum angekommen.
Viel Erfolg und einen schönen Tag
Uli