Seite 1 von 1

Gibt es berechnete Felder in Base? (gelöst)

Verfasst: Do, 24.11.2011 22:32
von Noebian
Hallo erstmal,
ich möchte in einem Formular ein Feld haben, das das Lebensalter einer Person basierend auf deren Geburtsdatum (worauf auch sonst :-) ) anzeigt.
In Access kann man in ein Textfeld einfach eine Formel einfügen, die dann entsprechend ausgerechnet wird.
Ist das in Base auch möglich?
Ich habe in den Eigenschaften des Textfeldes "Daten" > Datenfeld den Eintrag "Geburtsdatum" ausgewählt und dann eine Formel drumherum gestrickt. Ergebnis: keine Anzeige - ist das ein Fehler in meiner Formel oder geht das grundsätzlich nicht?
Wie gelange ich am besten an mein Ziel?

Re: Gibt es berechnete Felder in Base?

Verfasst: Do, 24.11.2011 23:03
von gogo
Lass Dir diesen Wert in der Datenquelle als Feld berechnen - dann kannst Du dieses dem Textfeld einfach zuweisen.

Re: Gibt es berechnete Felder in Base?

Verfasst: Do, 24.11.2011 23:27
von F3K Total
... und das ist nicht ganz einfach ...mit der embedded HSQLDB
viewtopic.php?f=8&t=13861#p162786

gruß R

Re: Gibt es berechnete Felder in Base?

Verfasst: Do, 24.11.2011 23:50
von Noebian
Das heißt also, mit einem Text- oder Irgendwas-anderes-Feld geht es nicht?

Re: Gibt es berechnete Felder in Base?

Verfasst: Fr, 25.11.2011 09:09
von gogo
es gibt noch die Möglichkeit das über ein Makro zu lösen:

Das Feld mit dem Geburtsdatum heißt bei mir: "datGeburtstag"
Erstelle weiters ein ungebundenes Numerisches Feld in Deinem Formular mit dem Namen "Alter_in_Tagen"

Dann folgendes Makro dem Ereignis "Nach dem Datensatzwechsel" des Formulars, bzw. dem Ereignis "Nach dem Aktualisierem" des Kontrollelementes "datGeburtstag" zuweisen:

Code: Alles auswählen

sub NACH_DatensatzWechsel

	oForm = thisComponent.drawpage.forms.getbyindex(0)

	select case oForm.getByName("datGeburtstag").date
	case null,0,""
		oForm.getByName("Alter_in_Tagen").value = 0
	case else	
		sGebDatum = cstr(oForm.getByName("datGeburtstag").date)
		oForm.getByName("Alter_in_Tagen").value = datevalue(date) - datevalue(left(sGebDatum,4) & "." & mid(sGebDatum,5,2) & "." & right(sGebDatum,2))
	end select	

end sub
Der Weg dorthin: Datevalue kann mit dem long-Wert den die .date Property des Geburtstagsfeldes liefert nichts anfangen - also wird dieser in einen String umgewandelt, zerlegt und mit Punkten versehen und dann erst mit Datevalue umgerechenet etc. Welchen Sinn es hat, dass .date einen long-Wert zurückgibt darfst Du mich aber nicht fragen ;)

Diese Berechnung berücksichtigt auch Schaltjahre!

Re: Gibt es berechnete Felder in Base?

Verfasst: So, 27.11.2011 18:53
von Noebian
Moin, moin und danke schön.
Ich habe es jetzt ähnlich gelöst - allerdings interessiert mich schlicht das aktuelle Alter in Jahren.
Das sieht bei mir jetzt so aus:

Code: Alles auswählen

sub Alter_nach_Datensatz_wechsel
dim oForm as Object
dim sDatum as String
dim iJahr, iMonat, iTag, iAlter as Integer

oForm = thisComponent.drawpage.forms.getbyindex(0)
sDatum = oForm.getByName("datGebDatum").date

if sDatum = "" then
	oForm.getbyName("Alter").text =""
	exit sub
end if

iJahr = cint(left(sDatum,4))
iMonat = cint(mid(sDatum,5,2))
iTag = cint(right(sDatum,2))

If iMonat < month(date()) then ' in diesem Jahr bereits Geburtstag gehabt
	iAlter = year(date()) - iJahr
end if

If iMonat > month(date()) then ' in diesem Jahr noch nicht Geburtstag gehabt
	iAlter = year(date()) - iJahr - 1
end if

If iMonat = month(date()) then ' in diesem Monat Geburtstag
	if iTag <= day(date()) then ' bereits Geburtstag gehabt
		iAlter = year(date()) - iJahr
	else
		iAlter = year(date()) - iJahr - 1
	end if
end if

oForm.getbyName("Alter").text = cstr(iAlter)

End Sub