[gelöst] Recordset des Formulars manipulieren

Datenbanklösungen mit AOO/LO

Moderator: Moderatoren

ejomi
***
Beiträge: 84
Registriert: Mi, 06.09.2006 15:20

[gelöst] Recordset des Formulars manipulieren

Beitrag von ejomi »

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
Zuletzt geändert von ejomi am Di, 19.06.2012 10:57, insgesamt 1-mal geändert.
F3K Total
********
Beiträge: 3720
Registriert: Mo, 28.02.2011 17:49

Re: Recordset des Formulars manipulieren

Beitrag von F3K Total »

Hallo, ich versuche mal dir Anregungen zu geben:

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)
Viel Erfolg,
Gruß R
RobertG
********
Beiträge: 2069
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: Recordset des Formulars manipulieren

Beitrag von RobertG »

... 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
ejomi
***
Beiträge: 84
Registriert: Mi, 06.09.2006 15:20

Re: Recordset des Formulars manipulieren

Beitrag von ejomi »

F3K Total hat geschrieben:Hallo, ich versuche mal dir Anregungen zu geben ...
... Jawoll - Danke - Prima - genau das war's, was ich wissen wollte!

Auch die darauf folgende Erläuterung von RobertG, wie man Werte direkt ins Formular schreiben kann, entspricht meiner Wunschvorstellung.
F3K Total hat geschrieben:Viel Erfolg,
Gruß R
... Na klar doch - Danke!

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
ejomi
***
Beiträge: 84
Registriert: Mi, 06.09.2006 15:20

Re: Recordset des Formulars manipulieren

Beitrag von ejomi »

RobertG hat geschrieben:Hier musst Du natürlich genauso wie bei der vorhergehenden Antwort wissen, welchen Feldtyp Du mit dem Update-Befehl bedienst
Erst mal: Danke Robert.

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)
Hab' etwas recherchieren müssen, ehe ich diese Methode entdeckt habe. Vielleicht hilft es ja auch anderen ....

Gruß an alle aus dem fernen Dresden:
ejomi
RobertG
********
Beiträge: 2069
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: [gelöst] Recordset des Formulars manipulieren

Beitrag von RobertG »

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
ejomi
***
Beiträge: 84
Registriert: Mi, 06.09.2006 15:20

Re: [gelöst] Recordset des Formulars manipulieren

Beitrag von ejomi »

RobertG hat geschrieben:Ich habe die Datumsfelder immer mit updateString bearbeitet
Hallo RobertG!

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
Man merkt: ich beschäftige mich z.Zt. intensiv mit Datums- und Zeit Funktionen!

Gruß: ejomi
Antworten