Per Makro Datensatz in Formular ansteuern

Datenbanklösungen mit AOO/LO

Moderator: Moderatoren

Steffan
****
Beiträge: 125
Registriert: Mi, 21.06.2006 10:07
Wohnort: Dresden

Per Makro Datensatz in Formular ansteuern

Beitrag von Steffan »

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
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hey Steffan,
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?
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.
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
Steffan
****
Beiträge: 125
Registriert: Mi, 21.06.2006 10:07
Wohnort: Dresden

Beitrag von Steffan »

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.
Mihilist
****
Beiträge: 120
Registriert: Di, 25.04.2006 15:27
Wohnort: Nürnberg
Kontaktdaten:

Beitrag von Mihilist »

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
Steffan
****
Beiträge: 125
Registriert: Mi, 21.06.2006 10:07
Wohnort: Dresden

Beitrag von Steffan »

Hallo Noch'n Thomas,

ist natürlich kein Problem, ich dachte bloss es gibt auch dafür einen einzelnen Befehl und ich könnte mir einen ansonsten sinnlosen Schleifendurchlauf sparen.

Beste Grüße,
Steffan.
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hey Steffan,
Geht das wirklich bloss mit einer Schleife über alle DS?
Nicht über alle Datensätze, aber über alle DS des Resultsetzs (das kann identisch sein.
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()
Tia, und so erhälst du die Nummer deines Datensatzes :-)

Gruss
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 »

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
:)
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hey Thomas,

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

Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Steffan
****
Beiträge: 125
Registriert: Mi, 21.06.2006 10:07
Wohnort: Dresden

Beitrag von Steffan »

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:

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() 
...
Beste Grüße,
Steffan
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

Wenn ich mein Dokument öffne, befindet es sich IMMER im Entwurfsmodus, egal in welchem Modus es gespeichert wurde!
der Modus in welchem Du speicherst hat auch keinerlei Einfluß auf den Öffnungsmodus.
Den bestimmst Du durch aktivieren oder nichtaktivieren der Schaltfläche "im Entwurfsmodus öffnen" (auf der Steuerelentsymbolleiste)
Nach einer Weile rumprobieren, habe ich herausbekommen, dass die Eingabe eines Wait-Befehles nach dem öffnen des Dokuments diesem seltsamen Verhalten abhilft.
da weiß ich nichts drüber, aber ich nehme das als Info


Gruß
Stephan
Mihilist
****
Beiträge: 120
Registriert: Di, 25.04.2006 15:27
Wohnort: Nürnberg
Kontaktdaten:

Beitrag von Mihilist »

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:

Code: Alles auswählen

oForm.beforeFirst()  'Zeiger vor den ersten Datensatz stellen
While oForm.next()        'nächster Datensatz
    (...)
WEnd
oForm.First
oder statt .First() eben ein .absolute(int) oder ähnliches.
Steffan
****
Beiträge: 125
Registriert: Mi, 21.06.2006 10:07
Wohnort: Dresden

Beitrag von Steffan »

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.
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.

Beste Grüße,
Steffan.
Mihilist
****
Beiträge: 120
Registriert: Di, 25.04.2006 15:27
Wohnort: Nürnberg
Kontaktdaten:

Beitrag von Mihilist »

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.
In diesem Fall ja. Aber falls du mal ein anderes Makro programmierst und dich dann wunderst, dass er permanent abstürzt... ;)

Grüße
Thomas
TobiS
Beiträge: 5
Registriert: Mi, 01.10.2014 13:35

Re: Per Makro Datensatz in Formular ansteuern

Beitrag von TobiS »

Bei
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 + "&#44;" + " " + "<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
RobertG
********
Beiträge: 2067
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: Per Makro Datensatz in Formular ansteuern

Beitrag von RobertG »

Hallo Tobis,

Code: Alles auswählen

Do Until oSubForm.afterLast()
... dürfte nicht funktionieren, weil oSubForm.afterLast der Sprung hinter die letzte Datenzeile ist. Da gibt es keinen Rückgabewert. Versuche einmal

Code: Alles auswählen

Do Until oSubForm.isAfterLast()
... das gibt als Boolean den Standort zurück.

Gruß

Robert
Antworten