Und tatsächlich es gibt Befehle, die der MPR kann und die gar nicht in der Hilfe stehen.
Undokumentierte "Geheimbefehle".
Thema in Part I: Datumsberechnung und Zeitberechnung.
Es gibt hier so viele Befehle daß man alle Datums- und Zeitrechnungen mit dem MPR problemlos machen kann.
****************************
m_is_leapyear
****************************
Die Funktion ermittelt, ob das angegebene Jahr (im Bereich 0 bis 5000) ein Schaltjahr ist oder nicht.
Die Rückgabe ist dementsprechend 1 oder 0.
Fehlt die Jahresangabe, dann wird das aktuell auf dem PC eingestellte Datum zugrunde gelegt.
Beispiel:
Code: Select all
GRN\m_is_leapyear|1968>$$RES
GRN\m_is_leapyear|2015
VAR\$$RES=$v1$
' Im Folgenden wird das aktuelle Jahr zugrunde gelegt, da die Jahresangabe fehlt:
GRN\m_is_leapyear>$$RES
m_get_time
****************************
Die Funktion "m_get_time" ermittelt Zeit und/oder Datum. Darüber hinaus können auch Datumsberechnungen ausgeführt werden.
Da es hierbei wichtig ist, dass man genau das gewünschte Format erhält, unabhängig von den jeweiligen Ländereinstellungen, kann man hier das Format selbst angeben.
Dies geschieht unter Verwendung der folgenden Buchstaben:
y - Jahr
m - Monat
d - Tag
h - Stunde
n - Minute
s - Sekunde
t - Tick (Mikrosekunde)
Ein einfacher Aufruf der Funktion sieht so aus:
Code: Select all
GRN\m_get_time|dd>$$RES
Code: Select all
GRN\m_get_time|dddd>$$RES
Code: Select all
' Ein komplettes Datum erhält man so:
GRN\m_get_time|dd/mm/yyyy>$$RES
Auf die gleiche Weise kann man die Zeit ermitteln:
Code: Select all
GRN\m_get_time|nn>$$RES
Ergebnis wäre zum Beispiel 03 (falls es gerade 7:03 ist).
GRN\m_get_time|nn-ss-tttt>$$RES
' Hier erhält man zum Beispiel Minuten, Sekunden und Ticks.
' Zeitpunkt in 4 Jahren in einem User-definierten Format
GRN\m_get_time|dd/mm/yyyy|AY:4>$$RES
Dazu kann man als zweiten Parameter angeben, welcher Betrag von Tag, Monat, Jahr etc. abgezogen oder hinzuaddiert werden soll.
Diese Angabe erfolgt durch Buchstabenkombinationen von "A" (Add) oder "S" (Subtract) und dem jeweiligen Zeitbuchstaben wie folgt:
AY:(Zahl) ' Jahre hinzuzählen
SY:(Zahl) ' Jahre abziehen
AM:(Zahl) ' Monate hinzuzählen
SM:(Zahl) ' Monate abziehen
AD:(Zahl) ' Tage hinzuzählen
SD:(Zahl) ' Tage abziehen
AH:(Zahl) ' Stunden hinzuzählen
SH:(Zahl) ' Stunden abziehen
AN:(Zahl) ' Minuten hinzuzählen
SN:(Zahl) ' Minuten abziehen
AS:(Zahl) ' Sekunden hinzuzählen
SS:(Zahl) ' Sekunden abziehen
AT:(Zahl) ' Ticks hinzuzählen
ST:(Zahl) ' Ticks abziehen
Beispiele:
Code: Select all
GRN\m_get_time|yy-mm-dd|AH:200,SN:400>$$RES
' Es werden zum aktuellen Datum 200 Stunden hinzugezählt und dann 400 Sekunden abgezogen.
' Das Ergebnis wird im gewünschten Format ausgegeben.
Code: Select all
GRN\m_get_time|dd;mm;hh|AD:50,SH:90>$$RES
' Es werden zum aktuellen Datum 50 Tage hinzugezählt und dann 90 Stunden abgezogen.
' Das Ergebnis wird im gewünschten Format ausgegeben in die Variable $$RES.
Dazu wird die Startzeit mit den folgenden Optionen geändert:
NY: (geänderte Jahreszahl 0 ... 5000)
NM: (Monatszahl: 1 ... 12)
ND: (Tag: 1 ... 31)
NN: (Minute: 0 ... 59)
NS: (Sekunde: 0 ... 59)
NT: (Millisekunde: 0 ... 999)
Beispiel:
Code: Select all
GRN\m_get_time|yy-mm-dd|NY:2013,NM:5,ND:5,AH:200,SN:400>$$RES
Man kann so auch einfach ein Datum formatieren (ohne Berechnung):
Code: Select all
GRN\m_get_time|yy-mm-dd|NY:2013,NM:5,ND:5>$$RES
****************************
"dtn.","m_date_to_number"
****************************
Der Befehl wandelt ein Datum in eine 32 bit-Zahl um. Dadurch können Datumsvergleiche einfach mittels IVB\ erfolgen.
Beispiel 1:
Code: Select all
GRN\dtn.|15-03-2005
VAR\$$DAT=$v1$
GRN\ntd.|$$DAT
MBX\$v1$
Beispiel 2:
GRN\dtn.|15-03-2005
VAR\$$DAA=$v1$
GRN\dtn.|19-04-2005
VAR\$$DAB=$v1$
GRN\dtn.|20-04-2005
VAR\$$DAC=$v1$
IVB\$$DAC|$$DAA|$$DAB
MBX\Datum ist innerhalb des Zeitraumes
ELSE
MBX\Datum ist nicht innerhalb des Zeitraumes
EVB\
Code: Select all
' Lässt man das Datum weg, wird das heutige "Local Time" Datum verwendet.
GRN\dtn.|
VAR\$$DAA=$v1$
GRN\dtn.|17-04-2011
VAR\$$DAB=$v1$
CAL\$$DIF=$$DAB-$$DAA
MBX\$$DAA-$$DAB--$$DIF
"ntd.","m_number_to_date"
****************************
Der 15-03-2011 ergibt zum Beispiel 149823.
Der 16-04-2011 ist 32 Tage später ergibt also 149855.
Auf diese Weise kann man auch leicht DAtumsberechnungen ausführen, auf Tagesbasis.
Mit der "number_to_date" Funktion kann man dann die berechneten Werte wieder in Reale Daten zurückumwandeln.
****************************
"rdi.","m_return_date_info"
****************************
Returns Date-Info (Systemunabhängig). Je nach Angabe eines Zahlenparameters werden unterschiedliche Informationen zum aktuellen Zeitpunkt ermittelt und zurückgegeben:
0 - dayname,
1 - Monthname,
2 - Datenum,
3 - yearnum,
4 - time,
5 - Time + Milliseconds,
6 - DayOfWeek (as number 0-6),
7 - Datum (deutsche Schreibweise),
8 - Wochentag (immer Englisch!),
9 - Wochetag (nur 2 Buchstaben, gross)
10 - Zeit - nur Stunde und Minute
Beispielskript Datumsfunktionen:
Code: Select all
' Diese Angabe könnte in einer INI-Datei stehen.
' Sie sagt aus in welchen zeiträumen ein Unterskript ausgeführt werden soll (oder nicht)
VAR\$$INT=Mo*7:00-12:00,Di*9:00-10:00
FEM\1,|$$INT|DoIt|$$INA
MBX\Fertig
@
:DoIt
' Heutiger Tag als Zahl
GRN\m_return_date_info|6>$$DAN
' Erste Zwei Buchstaben aus Ini-Zeile sind der Tag
GSS\1,2|$$INA>$$DAY
GSB\Daynum
' Wenn nicht heutiger Tag gemeint ist
JIV\$$RES!$$DAN:enz
' Ab hier Uhrzeit prüfen
' Aktuelle Zeit holen
GRN\m_return_date_info|10>$$TIM
' Zeitangaben holen
SBD\|$$INA|*|2>$$TMS
' In von / bis aufspalten
SBD\|$$TMS|-|1
' Von-Zeit
VAR\$$TMA=$v1$
' Bis Zeit
VAR\$$TMB=$v2$
GRN\m_verify_time_format|$$TMA>$$TMA
GRN\m_verify_time_format|$$TMB>$$TMB
GRN\m_verify_time_format|$$TMS>$$TMS
GRN\m_time_to_number|$$TMA>$$TAN
GRN\m_time_to_number|$$TMB>$$TBN
GRN\m_time_to_number|$$TMS>$$TSN
IVB\$$TSN|$$TAN|$$TBN
' Zeit ist innerhalb der genannten Parameter
ELSE
' Zeit ist nicht innerhalb der genannten Parameter
EVB\
:enz
@
:Daynum
SLC\$$DAY
CSE\MO
VAR\$$RES=1
CSE\DI,TU
VAR\$$RES=2
CSE\MI,WE
VAR\$$RES=3
CSE\DO,TH
VAR\$$RES=4
CSE\FR
VAR\$$RES=5
CSE\SA
VAR\$$RES=6
CEL\
VAR\$$RES=7
ESL\
RET\
****************************
"vdf.","m_verify_date_format"
****************************
Der Befehl stellt sicher, dass ein String das notwendige deutsche Datumsformat DD-MM-YYYY hat.
Es wird auch geprüft ob die Zahlen im erforderlichen Bereich sind.
Der String wird falls erforderlich um führende "0" ergänzt und so zurückgegeben.
Beispiel:
Code: Select all
GRN\vdf.|41-2-99
MBX\$v1$
Ausgabe: 31-02-0099
****************************
"vtf.","m_verify_time_format"
****************************
Der Befehl stellt sicher, dass ein String das notwendige deutsche Zeitformat HH:MM:SS hat.
Es wird auch geprüft ob die Zahlen im erforderlichen Bereich sind.
Der String wird falls erforderlich um führende "0" ergänzt und so zurückgegeben.
Beispiel:
Code: Select all
GRN\vtf.|24-1-9
MBX\$v1$
@
****************************
"ttn.","m_time_to_number"
****************************
Erzeugt eine Zahl, die die Anzahl der Dekunde nseit Mitternacht angibt.
Dadurch lassen sich Zeitabfragen leicht via IVB\ ausführen.
Ebenso werden Zeitberechnungen mit Sekunden vereinfacht.
Beispiel:
Code: Select all
GRN\ttn.|10:09:00
VAR\$$DAT=$v1$
MBX\$$DAT
' Ausgabe: 36540
GRN\ntt.|$$DAT
MBX\$v1$
' Ausgabe: 10:09:00
@
"ntt.","m_number_to_time"
****************************
Gegenfunktion zu "m_time_to_number". Nach einer Zeitberechnung läßt sich damit die Anzahl der Sekunden wieder in die Tageszeit umrechnen.
Beispiel:
Code: Select all
GRN\ttn.|10:09:00
VAR\$$DAT=$v1$
MBX\$$DAT
' Ausgabe: 36540
GRN\ntt.|$$DAT
MBX\$v1$
' Ausgabe: 10:09:00
@