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 SubRe: 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