Einen schönen Tag alle Miteinander!
Ich möchte im aktuellen Datensatz aus einem gefilterten Formular per Makro einzelne Felder mit veränderlichen Default-Werten vorbelegen (Textfelder mit Standardwerten statisch im Formular vorzubelegen ist hier also nicht gefragt). Unter ACCESS gabs mal soetwas wie recordsets und resultsets, die man wunderbar auf Makro-Ebene bearbeiten konnte. Wie funktioniert das uner OO?
Konkret:
1. Wie erstellt man einen neuen, leeren Datensatz per Makro?
2. Wie befüllt man gezielt einzelne Felder dieses (oder eines anderen) Datensatzes per Makro?
3. Wie kann ich das Ergebnis des (vom Formular) gefilterten recordsets auslesen?
3. Wie speichert man einen aktuell per Makro geänderten Datensatz per Makro?
4. Wie werden solche Änderungen danach im Formular sichbar?
... ja, ja, ich weiß: zu viele Fragen - aber ich hoffe auf eine Prizip-Lösung, die alle Fragen auf einmal beantwortet (wie gesagt: ich hoffe!)
Übrigens: Textinhalte einfach per Makro in die Formularfelder zu schreiben funktioniert leider nicht. Der Wert steht dann zwar im Formularfeld, ist aber noch nicht im Datensatz - d.h. OO hat noch nicht "gemerkt", dass hier eine Makro-gesteuerte Eingabe erfolgt ist und bietet folglich auch nicht an, den so "geänderten" Datensatz zu speichern.
Im Voraus lieben Dank für Eure Hilfe
Ein schönes Wochenende wünscht Euch aus dem fernen Dresden:
ejomi
[gelöst] Recordset des Formulars manipulieren
Moderator: Moderatoren
[gelöst] Recordset des Formulars manipulieren
Zuletzt geändert von ejomi am Di, 19.06.2012 10:57, insgesamt 1-mal geändert.
Re: Recordset des Formulars manipulieren
Hallo, ich versuche mal dir Anregungen zu geben:
Angenommen dein Formular heisst im Formularnavigator MainForm
Dann geht:
Viel Erfolg,
Gruß R
Angenommen dein Formular heisst im Formularnavigator MainForm
Dann geht:
Code: Alles auswählen
oform = thisComponent.drawpage.forms.MainForm
'1.) neuen leeren DS:
oform.movetoinsertrow
'2a.) Spalte 1 der Tabelle, Integer
oform.updateint(1, deinWert)
'2b.) Spalte 2 der Tabelle, Varchar
oform.updatestring(2, deinText)
'3a.)
oform.getint(1)
'3b.)
oform.getstring(2)
'4., bei die die zweite 3)
if oform.isnew then oform.insertrow else oform.updaterow
'5.)
nrow = oform.row
oform.reload
oform.absolute(nrow)
Gruß R
- miniKasse MMove 1.0.6 Base Videotutorial
- Windows 11: AOO, LO Linux Mint: AOO, LO
Re: Recordset des Formulars manipulieren
... und wenn Dir die Felder bekannt sind, dann kannst Du die Werte auch direkt in die Felder schreiben:
oFeld.BoundField.updateInt(11)
schreibt in das namentlich oder per Index bekannte Feld, das einen Integer-Wert weitergeben soll, z.B. 11. Das ist sichtbar und wird von der Datenbank als Änderung bemerkt, also beim weiteren Navigieren automatisch gespeichert.
Hier musst Du natürlich genauso wie bei der vorhergehenden Antwort wissen, welchen Feldtyp Du mit dem Update-Befehl bedienst: updateString(), updateBoolean(), updateNull() ...
Dann ist das Ganze das, was Du mit "Textinhalte in Formularfelder schreiben" meinst, auch von der Datenbank verarbeitbar.
Gruß
Robert
oFeld.BoundField.updateInt(11)
schreibt in das namentlich oder per Index bekannte Feld, das einen Integer-Wert weitergeben soll, z.B. 11. Das ist sichtbar und wird von der Datenbank als Änderung bemerkt, also beim weiteren Navigieren automatisch gespeichert.
Hier musst Du natürlich genauso wie bei der vorhergehenden Antwort wissen, welchen Feldtyp Du mit dem Update-Befehl bedienst: updateString(), updateBoolean(), updateNull() ...
Dann ist das Ganze das, was Du mit "Textinhalte in Formularfelder schreiben" meinst, auch von der Datenbank verarbeitbar.
Gruß
Robert
Re: Recordset des Formulars manipulieren
... Jawoll - Danke - Prima - genau das war's, was ich wissen wollte!F3K Total hat geschrieben:Hallo, ich versuche mal dir Anregungen zu geben ...
Auch die darauf folgende Erläuterung von RobertG, wie man Werte direkt ins Formular schreiben kann, entspricht meiner Wunschvorstellung.
... Na klar doch - Danke!F3K Total hat geschrieben:Viel Erfolg,
Gruß R
Ich staune doch immer wieder: OO ist zwar etwas lendenlahm, aber man kann wirklich (fast) alles damit machen, was man von einem DB-Frontend erwartet.
Nochmals Danke Ihr Beiden und ein schönes Wochenende:
ejomi
Re: Recordset des Formulars manipulieren
Erst mal: Danke Robert.RobertG hat geschrieben:Hier musst Du natürlich genauso wie bei der vorhergehenden Antwort wissen, welchen Feldtyp Du mit dem Update-Befehl bedienst
Dazu habe ich aber noch einen selbst ermittelten Nachtrag bezüglich Datumsfelder:
Versucht man nämlich mit der Methode "updateDate" einfach eine DATE-formatierte Variable zu übergeben, bekommt man die überraschende Fehlermeldung Objektvariable nicht belegt - Hä?! Hmm, die Ursache liegt darin, dass "updateDate" einen speziellen Strukt erwartet (darauf muß man erst mal kommen) - und das geht wie folgt:
'
Code: Alles auswählen
Strukt bereitstellen:
Dim unoDate
unoDate = createUnoStruct("com.sun.star.util.Date")
' Strukt auffuellen:
unoDate.Year = Year(TodaysDate)
unoDate.Month = Month(TodaysDate)
unoDate.Day = Day(TodaysDate)
' Datumsfeld aktualisieren (angenommen, das Datumsfeld wurde
' mit einer Objektvariable namens "MyDateField" refferenziert):
MyDateField.BoundField.updateDate(unoDate)
Gruß an alle aus dem fernen Dresden:
ejomi
Re: [gelöst] Recordset des Formulars manipulieren
Hallo Ejomi,
Ehrlich: Ich habe die Datumsfelder immer mit updateString bearbeitet - hat dann auch funktioniert. Mit dem Datums hin- und her kam ich nämlich nicht zurecht.
Man wird so alt wie 'ne Kuh und lernt immer noch dabei.
Gruß
Robert
Ehrlich: Ich habe die Datumsfelder immer mit updateString bearbeitet - hat dann auch funktioniert. Mit dem Datums hin- und her kam ich nämlich nicht zurecht.
Man wird so alt wie 'ne Kuh und lernt immer noch dabei.
Gruß
Robert
Re: [gelöst] Recordset des Formulars manipulieren
Hallo RobertG!RobertG hat geschrieben:Ich habe die Datumsfelder immer mit updateString bearbeitet
Zur Vollständigkeit muß ich noch den Timestamp nachschieben.
Ich habe gelesen, dass die Verwendung der UNO-Strukte der String-Übergebe vorzuziehen sei, weil diese 100% Plattformunabhängig ist - hier also die ganze Geschichte:
Das updaten eines Timestamp-Feldes (es enthält sowohl Datum als auch Uhrzeit) ist etwas problematisch, wenn dieses im Formular in 2 getrennten Feldern dargestellt wird. Das ist z.B. die Voreinstellung des Formular-Assistenten: Er baut für ein Timestamp-Feld automatisch immer ein Zeitfeld und ein Datumsfeld nebeneinander - das ist praktisch und sieht gut aus, hat aber auch seine Tücken!
Will man nämlich diese Felder getrennt updaten (also das Zeitfeld mit "updateTime" und das Datumsfeld mit "updateDate") wird das jeweils andere Feld auf 0 gestellt (beim Datumsfeld erkennbar als 01.01.1800)!!
Hier muß der Uno-Strukt "util.DateTime" und die Update-Methode "updateTimestamp" verwendet werden.
Bei einem Formular mit getrennten Feldern für Datum + Uhzeit muß dann nur das Datumsfeld mit "updateTimestamp" befüllt werden - das Zeitfeld wird dabei nämlich automatisch mit aktualisiert!
Nachfolgend habe ich noch einmal alle 3 Strukte und Methoden zur Datums- und Zeit-Manipulation als Code zusammengefasst:
Code: Alles auswählen
' Strukte fuer Zeit, Datum und Zeitstempel bereitstellen:
Dim unoTime As New com.sun.star.util.Time
Dim unoDate As New com.sun.star.util.Date
Dim unoStmp As New com.sun.star.util.DateTime
' Beispielhaft mal Systemdatum und -Zeit in einer separaten Variablen bereitstellen:
Dim ActDate As Date
ActDate = Now()
' Jetzt die Strukte einzeln mit den gewuenschten Zeitraeumen auffuellen
' (Millisekunden werden von BASIC nicht verarbeitet
' und werden hier nur zur Vollstaendigekeit gezeigt):
With unoTime
.HundredthSeconds = 0
.Seconds = Second(ActDate)
.Minutes = Minute(ActDate)
.Hours = Hour(ActDate)
End With
With unoDate
.Day = Day(ActDate)
.Month = Month(ActDate)
.Year = Year(ActDate)
End With
With unoStmp
.HundredthSeconds = 0
.Seconds = Second(ActDate)
.Minutes = Minute(ActDate)
.Hours = Hour(ActDate)
.Day = Day(ActDate)
.Month = Month(ActDate)
.Year = Year(ActDate)
End With
' Zeit-, Datums- und Zeitstempelfeld aktualisieren (angenommen, die Felder wurden mit
' Objektvariablen namens "MyTimeField", "MyDateField" und "MyStampField" refferenziert):
MyTimeField.BoundField.updateTime(unoTime) ' ACHTUNG: loescht bei einem Timestamp das Datum!
MyDateField.BoundField.updateDate(unoDate) ' ACHTUNG: loescht bei einem Timestamp die Uhrzeit!
MyStampField.BoundField.updateTimestamp(unoStmp) ' setzt sowohl Datum als auch Uhrzeit
Gruß: ejomi