Daten per Makro in ein Base Formular eintragen

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

Moderator: Moderatoren

Benutzeravatar
hinki
**
Beiträge: 27
Registriert: So, 31.10.2010 06:45

Daten per Makro in ein Base Formular eintragen

Beitrag 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
NeoOffice 3.1.2 Patch 2 auf MacBookPro (OS 10.6.6)

If you make people think they're thinking, they'll love you. But if you really make them think, they'll hate you.
Harold Kroto
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Re: Daten per Makro in ein Base Formular eintragen

Beitrag von turtle47 »

Hallo,


nehme dafür einfach die "Autowert" Funktion. :D
Autowert.jpg
Autowert.jpg (18.68 KiB) 5087 mal betrachtet
Viel Erfolg.

Jürgen
Software hat keinen Verstand - benutze deinen eigenen...!

Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
Benutzeravatar
hinki
**
Beiträge: 27
Registriert: So, 31.10.2010 06:45

Re: Daten per Makro in ein Base Formular eintragen

Beitrag 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
NeoOffice 3.1.2 Patch 2 auf MacBookPro (OS 10.6.6)

If you make people think they're thinking, they'll love you. But if you really make them think, they'll hate you.
Harold Kroto
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Re: Daten per Makro in ein Base Formular eintragen

Beitrag 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
Software hat keinen Verstand - benutze deinen eigenen...!

Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
Benutzeravatar
hinki
**
Beiträge: 27
Registriert: So, 31.10.2010 06:45

Re: Daten per Makro in ein Base Formular eintragen

Beitrag 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

NeoOffice 3.1.2 Patch 2 auf MacBookPro (OS 10.6.6)

If you make people think they're thinking, they'll love you. But if you really make them think, they'll hate you.
Harold Kroto
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Re: Daten per Makro in ein Base Formular eintragen

Beitrag von turtle47 »

hinki hat geschrieben:Meldung: Falsche Verwendung eines Objekts
Oh sorry, da ist mir ein Fehler unterlaufen. :oops:

Das ist die Zeile:

Code: Alles auswählen

Dim oForm, oField_KD As Object
Die Variable "oField_KD" ist ein doch in der Verwendung ein String. :lol:

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
Software hat keinen Verstand - benutze deinen eigenen...!

Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
Benutzeravatar
hinki
**
Beiträge: 27
Registriert: So, 31.10.2010 06:45

Re: Daten per Makro in ein Base Formular eintragen

Beitrag 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
NeoOffice 3.1.2 Patch 2 auf MacBookPro (OS 10.6.6)

If you make people think they're thinking, they'll love you. But if you really make them think, they'll hate you.
Harold Kroto
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Re: Daten per Makro in ein Base Formular eintragen

Beitrag 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
Knd_ID.jpg (16.35 KiB) 5041 mal betrachtet
Software hat keinen Verstand - benutze deinen eigenen...!

Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
Benutzeravatar
hinki
**
Beiträge: 27
Registriert: So, 31.10.2010 06:45

Re: Daten per Makro in ein Base Formular eintragen

Beitrag 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 :wink: 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
NeoOffice 3.1.2 Patch 2 auf MacBookPro (OS 10.6.6)

If you make people think they're thinking, they'll love you. But if you really make them think, they'll hate you.
Harold Kroto
Benutzeravatar
hinki
**
Beiträge: 27
Registriert: So, 31.10.2010 06:45

Re: Daten per Makro in ein Base Formular eintragen

Beitrag 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
NeoOffice 3.1.2 Patch 2 auf MacBookPro (OS 10.6.6)

If you make people think they're thinking, they'll love you. But if you really make them think, they'll hate you.
Harold Kroto
HTTPCore
Beiträge: 1
Registriert: Mi, 15.12.2010 17:14

Re: Daten per Makro in ein Base Formular eintragen

Beitrag 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
Benutzeravatar
hinki
**
Beiträge: 27
Registriert: So, 31.10.2010 06:45

Re: Daten per Makro in ein Base Formular eintragen

Beitrag 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
NeoOffice 3.1.2 Patch 2 auf MacBookPro (OS 10.6.6)

If you make people think they're thinking, they'll love you. But if you really make them think, they'll hate you.
Harold Kroto
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Daten per Makro in ein Base Formular eintragen

Beitrag 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))
Benutzeravatar
hinki
**
Beiträge: 27
Registriert: So, 31.10.2010 06:45

Re: Daten per Makro in ein Base Formular eintragen

Beitrag 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
NeoOffice 3.1.2 Patch 2 auf MacBookPro (OS 10.6.6)

If you make people think they're thinking, they'll love you. But if you really make them think, they'll hate you.
Harold Kroto
Antworten