Per Makro Datensatz in Formular ansteuern
Moderator: Moderatoren
Per Makro Datensatz in Formular ansteuern
Hallo zusammen,
ich möchte ein Formular makrogesteuert öffnen (kein Problem) und in diesem Formular zu einem Datensatz springen. Das ganze soll NICHT per Abfrage a la [SELECT * fom addresses WHERE id=123] passieren, da ich in diesem Formular noch ein Tabellengrid habe, in dem die anderen Datensätze weiter angezeigt werden sollen.
Für die Datensatznavigation habe ich nur moveTo(Zeilennummer) gefunden, allerdings weiß ich vorher nicht welcher Datensatz in welcher Zeile steht. Hat jemand von Euch eine Idee wie ich das elegant lösen kann?
Besten Dank im Vorraus für Eure Bemühungen,
Steffan
ich möchte ein Formular makrogesteuert öffnen (kein Problem) und in diesem Formular zu einem Datensatz springen. Das ganze soll NICHT per Abfrage a la [SELECT * fom addresses WHERE id=123] passieren, da ich in diesem Formular noch ein Tabellengrid habe, in dem die anderen Datensätze weiter angezeigt werden sollen.
Für die Datensatznavigation habe ich nur moveTo(Zeilennummer) gefunden, allerdings weiß ich vorher nicht welcher Datensatz in welcher Zeile steht. Hat jemand von Euch eine Idee wie ich das elegant lösen kann?
Besten Dank im Vorraus für Eure Bemühungen,
Steffan
Hey Steffan,
Du kannst das ResultSet natürlich auch per Basic durchsuchen - mit einer Schleife über alle Datensätze und dem entsprechenden Suchkriterium. Dadurch erhälst du die gewünschen Datensatznummer - und kannst dort hinspringen
Gruss
Thomas
Ja, das ist so. Datensätze sind nicht geordnet in SQL Datenbanken. Also brauchst du ein eindeuiges Identifikationsmerkmal für den Datensatz - klassischerweise den Primärschlüssel.Für die Datensatznavigation habe ich nur moveTo(Zeilennummer) gefunden, allerdings weiß ich vorher nicht welcher Datensatz in welcher Zeile steht. Hat jemand von Euch eine Idee wie ich das elegant lösen kann?
Du kannst das ResultSet natürlich auch per Basic durchsuchen - mit einer Schleife über alle Datensätze und dem entsprechenden Suchkriterium. Dadurch erhälst du die gewünschen Datensatznummer - und kannst dort hinspringen

Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Hallo Thomas,
erst ein Mal Hut ab vor Deiner tollen Leistung hier im Forum! Vielen Dank für die vielen sachkundigen Erklärungen, die Du hier bisher abgegeben hast (und hoffentlich noch abgeben wirst)!
Aber nun zum Problem:
Den Primärschlüssel (ID) habe ich, allerdings fehlt mir die Beziehung zwischen ID und Zeilennummer. Geht das wirklich bloss mit einer Schleife über alle DS?
Beste Grüße,
Steffan.
erst ein Mal Hut ab vor Deiner tollen Leistung hier im Forum! Vielen Dank für die vielen sachkundigen Erklärungen, die Du hier bisher abgegeben hast (und hoffentlich noch abgeben wirst)!
Aber nun zum Problem:
Den Primärschlüssel (ID) habe ich, allerdings fehlt mir die Beziehung zwischen ID und Zeilennummer. Geht das wirklich bloss mit einer Schleife über alle DS?
Beste Grüße,
Steffan.
Hallo,
Das Problem ist, dass die Datensätze von vornherein nicht geordnet sind. Aber selbst wenn du sie nach der ID ordnest (also wenn 'ID' integer mit auto_increment ist) wird das nicht das gewünschte Ergebnis liefern, da die nicht lückenlos sein muss - sobald man einen Datensatz löscht hat man eine Lücke drin
Von daher bleibt nur entweder ein Filter - was du ja nicht willst - oder ein Makro. Aber ich sehe das Problem nicht, dürfte nicht sonderlich aufwendig werden.
Grüßle
Noch'n Thomas
Das Problem ist, dass die Datensätze von vornherein nicht geordnet sind. Aber selbst wenn du sie nach der ID ordnest (also wenn 'ID' integer mit auto_increment ist) wird das nicht das gewünschte Ergebnis liefern, da die nicht lückenlos sein muss - sobald man einen Datensatz löscht hat man eine Lücke drin

Von daher bleibt nur entweder ein Filter - was du ja nicht willst - oder ein Makro. Aber ich sehe das Problem nicht, dürfte nicht sonderlich aufwendig werden.
Grüßle
Noch'n Thomas
Hey Steffan,
Du musst dir das so vorstellen: Dein Formular (Das Formualrobjekt) beinhaltet die Datensätze. Angezeigt wird der erste - oder bei Tabellen fortlaufend.
Per Basic kannst du natürlich auch die Datensätze des Resultsets durchgehen und analysieren.
So in der Form:
Tia, und so erhälst du die Nummer deines Datensatzes 
Gruss
Thomas
Nicht über alle Datensätze, aber über alle DS des Resultsetzs (das kann identisch sein.Geht das wirklich bloss mit einer Schleife über alle DS?
Du musst dir das so vorstellen: Dein Formular (Das Formualrobjekt) beinhaltet die Datensätze. Angezeigt wird der erste - oder bei Tabellen fortlaufend.
Per Basic kannst du natürlich auch die Datensätze des Resultsets durchgehen und analysieren.
So in der Form:
Code: Alles auswählen
oForm.beforeFirst() 'Zeiger vor den ersten Datensatz stellen
Do until oForm.afterLast()
oForm..next() 'nächster Datensatz
sTxt = oForm.getString(1) 'dein Selektionskriterium, anpassen!
if sTxt = "meinVergleichswert" then exit do 'DS gefunden
next
iDatensatzNr = oForm.getRow()

Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Ich würde aus ästhetischen Gründen die Schleife anders formulieren:

Code: Alles auswählen
oForm.beforeFirst() 'Zeiger vor den ersten Datensatz stellen
Do while oForm.next() 'nächster Datensatz
(...)
Loop

Hey Thomas,
klar, du hast recht.... wäre auch der bessere und richtigere Weg. Manchmal sieht man den Wald vor lauter Bäumen nicht
Danke.
Thomas
klar, du hast recht.... wäre auch der bessere und richtigere Weg. Manchmal sieht man den Wald vor lauter Bäumen nicht

Danke.
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Hallo,
danke für Eure Tips. Ich hab den Schleifendurchlauf eingebaut und bin auf eine seltsame Sache gestoßen. Wenn ich mein Dokument öffne, befindet es sich IMMER im Entwurfsmodus, egal in welchem Modus es gespeichert wurde! Nach einer Weile rumprobieren, habe ich herausbekommen, dass die Eingabe eines Wait-Befehles nach dem öffnen des Dokuments diesem seltsamen Verhalten abhilft.
Der Vollständigkeit halber hier noch mal mein Code als Beispiel:
Beste Grüße,
Steffan
danke für Eure Tips. Ich hab den Schleifendurchlauf eingebaut und bin auf eine seltsame Sache gestoßen. Wenn ich mein Dokument öffne, befindet es sich IMMER im Entwurfsmodus, egal in welchem Modus es gespeichert wurde! Nach einer Weile rumprobieren, habe ich herausbekommen, dass die Eingabe eines Wait-Befehles nach dem öffnen des Dokuments diesem seltsamen Verhalten abhilft.
Der Vollständigkeit halber hier noch mal mein Code als Beispiel:
Code: Alles auswählen
...
Dim myProps() as New com.sun.star.beans.PropertyValue
oDoc = StarDesktop.loadComponentFromURL(sFile, "_blank", 0, myProps())
'Zeilenweiser Durchlauf über alle DS bis ID aus Center = ID aus Projektformular
wait 1
oDoc.lockcontrollers()
...
Steffan
der Modus in welchem Du speicherst hat auch keinerlei Einfluß auf den Öffnungsmodus.Wenn ich mein Dokument öffne, befindet es sich IMMER im Entwurfsmodus, egal in welchem Modus es gespeichert wurde!
Den bestimmst Du durch aktivieren oder nichtaktivieren der Schaltfläche "im Entwurfsmodus öffnen" (auf der Steuerelentsymbolleiste)
da weiß ich nichts drüber, aber ich nehme das als InfoNach einer Weile rumprobieren, habe ich herausbekommen, dass die Eingabe eines Wait-Befehles nach dem öffnen des Dokuments diesem seltsamen Verhalten abhilft.
Gruß
Stephan
Ach ja, noch was: Nach einer solchen Schleife stürtzt OOo recht gern ab - zumindest bei mir. Grund ist vermutlich, dass es ihn verwirrt, dass er nach der Schleife hinter den letzten Datensatz zeigt.
Wenn du also so eine Schleife durchführst solltest du hinterher noch auf irgendeinen Datensatz zeigen, etwa:
oder statt .First() eben ein .absolute(int) oder ähnliches.
Wenn du also so eine Schleife durchführst solltest du hinterher noch auf irgendeinen Datensatz zeigen, etwa:
Code: Alles auswählen
oForm.beforeFirst() 'Zeiger vor den ersten Datensatz stellen
While oForm.next() 'nächster Datensatz
(...)
WEnd
oForm.First
Das ist bei mir nicht das Problem, da ich ja immer eine ID übergebe, die auf einen 'gültigen' Datensatz verweist, also komme ich nie hinter den letzten Datensatz. Nein, es läuft mit der Schleife wunderbar und der gewünschte Datensatz wird ausgewählt, was ja auch Sinn diese Threads war.Ach ja, noch was: Nach einer solchen Schleife stürtzt OOo recht gern ab - zumindest bei mir. Grund ist vermutlich, dass es ihn verwirrt, dass er nach der Schleife hinter den letzten Datensatz zeigt.
Beste Grüße,
Steffan.
In diesem Fall ja. Aber falls du mal ein anderes Makro programmierst und dich dann wunderst, dass er permanent abstürzt...Steffan hat geschrieben:Das ist bei mir nicht das Problem, da ich ja immer eine ID übergebe, die auf einen 'gültigen' Datensatz verweist, also komme ich nie hinter den letzten Datensatz.

Grüße
Thomas
Re: Per Makro Datensatz in Formular ansteuern
Bei
Do Until oSubForm.afterLast()
kommt eine Fehlermeldung:
Unzulässiger Wert oder Datentyp
Kann mir das jemand erklären?
Do Until oSubForm.afterLast()
kommt eine Fehlermeldung:
Unzulässiger Wert oder Datentyp
Kann mir das jemand erklären?
Code: Alles auswählen
Sub SendMailSerie
Dim oDoc, oForm as Object
Dim betr, sMail_Adr, sMail_Anr as String
oDoc = thisComponent
oForm = oDoc.drawpage.forms.getbyindex(0)
oSubForm = oForm.getByName("F_Kontakte").getByName("Kontakte")
oSubForm.beforeFirst() 'Zeiger vor den ersten Datensatz stellen
Do Until oSubForm.afterLast()
sTxt = oSubForm.getByName("txtEmail").Text
oSubForm.next()
if sTxt <> "" then
sMail_Adr = oSubForm.getByName("txtEmail").Text
sMail_betr = oSubForm.getByName("Mails").getByName("txtBetreff").Text
sMail_Inh = oSubForm.getByName("Mails").getByName("txtInhalt").Text
sMail_Anr = oSubForm.getByName("txtAnrede").Text
sMail_nix = oSubForm.getByName("listAnrede")
attN = oSubForm.getByName("Mails").getByName("txtAnhang").Text
sMail_Vorn = oSubForm.getByName("txtVorname").Text
oCombobox = oSubForm.getbyname("combAnrede")
oCombobox.refresh
oListsource = "SELECT ""ID"" FROM ""Anrede"""
oCombobox.ListSource = oListsource
oCombobox.refresh
oComboWert=oCombobox.currentValue
oCombobox2 = oSubForm.getbyname("combUmgang")
oCombobox2.refresh
oListsource2 = "SELECT ""ID"" FROM ""SiezenDuzen"""
oCombobox2.ListSource = oListsource2
oCombobox2.refresh
oComboWert2=oCombobox2.currentValue
if oComboWert = "" then
sMail_Gen = ""
elseif oComboWert = "0" then
sMail_Gen = "Frau "
elseif oComboWert = "1" then
sMail_Gen = "Herr "
else
sMail_Gen = "Falsche Eingabe"
end if
if oComboWert2 = "" then
sMail_Umg = ""
elseif oComboWert2 = "0" then
sMail_Umg = sMail_Vorn
elseif oComboWert2 = "1" then
sMail_Umg = (sMail_Gen + sMail_Anr)
else
sMail_Gen = "Falsche Eingabe"
end if
if attN = "" then
attA = ""
else
attA = ConvertToURL (attN)
end if
empf = (sMail_Adr)
betr = (sMail_betr) 'Betreffzeile
anrT = ("Hallo "+ sMail_Umg + "," + " " + "<br><br>" + sMail_Inh)
shell("C:\Program Files\Mozilla Thunderbird\thunderbird.exe",1,"-compose to=" + empf +",attachment=" + attA + ",subject=" + betr + ",body=" + anrT)
end if
LOOP
End Sub
Re: Per Makro Datensatz in Formular ansteuern
Hallo Tobis,
... dürfte nicht funktionieren, weil oSubForm.afterLast der Sprung hinter die letzte Datenzeile ist. Da gibt es keinen Rückgabewert. Versuche einmal
... das gibt als Boolean den Standort zurück.
Gruß
Robert
Code: Alles auswählen
Do Until oSubForm.afterLast()
Code: Alles auswählen
Do Until oSubForm.isAfterLast()
Gruß
Robert