Allgemeine Fragen zur PROFAN Programmierung
Views (Heute): 240895 (2331)
  Suchen
 Zurück zur Übersicht
 AutorThema: Datumsfunktion
Bernhard Künzel
Datum:24.08.02 23:16 Antwortenals Email verschicken (b.kuenzel@chello.at) 


Hallo Profaner,
habe eine bitte an euch, könntets ihr mir die untenstehende funktion auf richtigkeit testen, habe zwar über 50 tests durchgeführt, aber man weiss ja nie.
Wer will kann sie natürlich auch für sich verwenden.

Gruß
Bernhard

Def DB_DeltaTage(2) ABS(Sub(Add(Add(Sub(Int(Mul(If(GT(Val(Mid$($(1),5,2)),2),Val(Left$($(1),4)),\
Sub(Val(Left$($(1),4)),1)),365.25)),693975),\
Int(Mul(If(GT(Val(Mid$($(1),5,2)),2),Add(Val(Mid$($(1),5,2)),1),\
Add(Val(Mid$($(1),5,2)),13)),30.6))),Val(Right$($(1),2))-1),\
Add(Add(Sub(Int(Mul(If(GT(Val(Mid$($(2),5,2)),2),Val(Left$($(2),4)),\
Sub(Val(Left$($(2),4)),1)),365.25)),693975),\
Int(Mul(If(GT(Val(Mid$($(2),5,2)),2),Add(Val(Mid$($(2),5,2)),1),\
Add(Val(Mid$($(2),5,2)),13)),30.6))),Val(Right$($(2),2))-1)))

'Par 1= erstes Datum in Datenbankformat
'Par 2= zweites Datum in Datenbankformat
'Ergebnis: Die Tage zwischen den zwei Datums

'Aufrufbeispiel
Print DB_DeltaTage("20020918","19980425")
Print DB_DeltaTage("19950425",Date$(3))




Jörg Sellmeyer
Datum:25.08.02 23:58 Antwortenals Email verschicken (joerse@gmx.de) 


Coooole Funktion !
Scheint hinzuhauen. Bisher im "normalen" Datumsbereich keine Probleme.
Gruß
Jörg


Bernhard Künzel
Datum:25.08.02 23:57 Antwortenals Email verschicken (b.kuenzel@chello.at) 


Hallo Jörg,
danke fürs testen
anbei noch zwei funktionen für die bemühungen.

Gruß
Bernhard

Def DB_DateWochentag$(1) ExtString$(%HInstance,Add(65511,\
MOD(Add(Add(Add(Sub(Div&(Sub(Mul(158,Val(Mid$($(1),5,2))),157),5),\
Mul(Add(Val(Mid$($(1),5,2)),1),GT(Val(Mid$($(1),5,2)),2))),\
AND(GT(Val(Mid$($(1),5,2)),2),XOR(XOR(Equ(MOD(Val(Left$($(1),4)),4),0),\
Equ(MOD(Val(Left$($(1),4)),100),0)),Equ(MOD(Val(Left$($(1),4)),400),0)))),\
Val(Right$($(1),2))),\
Sub(Add(Val(Left$($(1),4)),Add(Add(Sub(Div&(Val(Left$($(1),4)),4),\
Div&(Val(Left$($(1),4)),100)),Div&(Val(Left$($(1),4)),400)),6)),\
AND(GT(Val(Mid$($(1),5,2)),2),XOR(XOR(Equ(MOD(Val(Left$($(1),4)),4),0),\
Equ(MOD(Val(Left$($(1),4)),100),0)),Equ(MOD(Val(Left$($(1),4)),400),0))))),7)))
'Par 1= Datum in Datenbankformat
'Ergebnis: Wochentag

Def DB_DrawDate$(2) Add$(Add$(Add$(If(%(2)=1,Add$(DB_DateWochentag$($(1))," , der "),""),\
Format$("0'. '",Val(Right$($(1),2)))),\
ExtString$(%HInstance,Add(65487,Val(Mid$($(1),5,2))))),Add$(" ",Left$($(1),4)))
'Par 1= Datum in Datenbankformat
'Par 2= bei 0--> Langform (z.B. "24. März 1998")
' 1--> Langform mit Tag (z.B. "Dienstag, der 24. März 1998")




Jörg Sellmeyer
Datum:26.08.02 00:01 Antwortenals Email verschicken (joerse@gmx.de) 


Du meine Güte..
Nur mal so aus Neugier. Wie lange hast Du für die Funktion gebraucht ?
Gruß
Jörg


Bernhard Künzel
Datum:26.08.02 01:06 Antwortenals Email verschicken (b.kuenzel@chello.at) 


Hallo Jörg,
habe diese funktion als Procedur eigentlich schon seit 1986 noch unter Dos aus der Zeitschrift Computer persönlich von 1984 habe sie dann in laufe der zeit von DOS auf GFA-WinBasic umgeändert, dann fand ich in der Zeitschrift PC-Praxis vom Jänner 1994 noch weitere trixs zum verkürzen, mit der Profanversion ab 3.0 schrieb ich sie dann wieder neu um, und je nach syntaxerweiterung verkürzte ich die prozedur.
Da ich jetzt gerade bei einer Zinzeszinsberechnung arbeitete, brauchte ich eben diese procedur als funktion zum einbau in die funktion der zinsformel.
Habe dann 8 teilfunktionen wegen der übersichtlichkeit erstellt, und dann nach und nach in eine funktion eingebaut.
Das war eigentlich in 3 stunden erledigt und habe dann noch ca 2 stunden mit der exeltabelle verglichen.

Anmerkung:
Fehlerabfrage für das richtige datum ist nicht eingebaut
der datumbereich sollte von 1901 bis 2999 funktionieren

Gruß
Bernhard



Bernhard Künzel
Datum:27.08.02 10:53 Antwortenals Email verschicken (b.kuenzel@chello.at) 


Hallo Jörg,
bei der wochentagsfunktion ist leider ein fehler enthalten.
Bei einem schaltjahr wird bereits zwischen 1. jänner und 28. februar das schaltjahr dazugerechnet.
Anbei die neue funktion in der hoffnung ohne fehler !!!!!!
Gruß
Bernhard
'//
Def DB_DateWochentag$(1) ExtString$(%HInstance,Add(65511,\
MOD(Add(Int(Sub(Mul(Sub(Val(Left$($(1),4)),1),365.25),693975)),\
Add(Add(Sub(Div&(Sub(Mul(158,Val(Mid$($(1),5,2))),157),5),\
Mul(Add(Val(Mid$($(1),5,2)),1),GT(Val(Mid$($(1),5,2)),2))),\
AND(GT(Val(Mid$($(1),5,2)),2),XOR(XOR(Equ(MOD(Val(Left$($(1),4)),4),0),\
Equ(MOD(Val(Left$($(1),4)),100),0)),Equ(MOD(Val(Left$($(1),4)),400),0)))),\
Add(Val(Right$($(1),2)),1))),7)))
'Par 1= Datum in Datenbankformat
'Ergebnis: Wochentag



Roland G. Hülsmann
Datum:27.08.02 11:36 Antwortenals Email verschicken (rgh-soft@t-online.de) 


Hallo,

HUT AB vor diesen Funktionen! Eine so tief verschachtelte definierte Funktion habe ich selbst für meine Tests nicht geschrieben.

So wird meine Datums-DLL ( http://www.profan2.de/download/datum.zip ) nahezu überflüssig. Diese enthält nahezu die gleichen Funktionen (Include-Datei 32 Bit):
' PROFAN²-Deklarationen für: PRFDAT32.DLL
' Profan-Datum DLL 2.0 (c) 1993-1998 by Roland G. Hülsmann
'
' DToN(D&) : Umwandlung einmes Datums im Format JJJJMMTT (als LongInt)
'            in das interne Datumsformat (Anzahl der Tage seit 1.1.1600)
'            Ergebnis: LongInt. Bei -1 war das Datum ungültig.
'            Funktioniert ab 01.01.1600 bis 31.12.3999
' Das interne Format wird für die folgenden Funktionen genutzt und ist ideal
' zum Rechnen
'
' NToD(N&) : Umkehrfunktion zur vorhergehenden.
' DOW(N&)  : Ermittelt den Wochentag (1-7) eines Datums im internen Format ( 1 = Sonntag)
' Day(N&)  : Ermittelt die Tageszahl (1-31) eines Datums im internen Format
' Month(N&): Ermittelt die Monatszahl (1-12) eines Datums im internen Format
' Year(N&) : Ermittelt die Jahreszahl (1600-3999) eines Datums im internen Format

DEF DToN(1)  !"PRFDAT32.DLL","DToN"
DEF NToD(1)  !"PRFDAT32.DLL","NToD"
DEF DOW(1)   !"PRFDAT32.DLL","DOW"
DEF Day(1)   !"PRFDAT32.DLL","Day"
DEF Month(1) !"PRFDAT32.DLL","Month"
DEF Year(1)  !"PRFDAT32.DLL","Year"


Gruß
Roland




Bernhard Künzel
Datum:05.09.02 01:33 Antwortenals Email verschicken (b.kuenzel@chello.at) 


Hallo,
Habe jetzt alle meine datumsproceduren als funktionen umgeändert
es kann jetzt mit diesen funktionen in formeln gerechnet werden
es ist auch eine funktion für die kat. beweglichen feiertage dabei und das alles ohne dll-datei
falsche datumseingabe wird abgefangen
gültiges datum ist zwischen 1.1.1901 und 31.12.2099
erforderliche profanversion ab 7.0 wegen zeichenlänge über 255
es ist auch ein kleines testprogramm zum testen der datumsfunktionen dabei
wer interresse hat hat kann sie per email anfordern.
Gruß
Bernhard


Horst Horn
Datum: 07.09.02 20:48 Antwortenals Email verschicken (info@web-treffpunkt.de) 


Hallo Bernhard
Da kann man nur noch eines sagen: Der Kandidat hat 100 Punkte ! - Ein ganz tolles Teil !
CU
horst


 Zurück zur Übersicht