Sehr geehrter "Next",
mit freundlicher Empfehlung von Herrn W. der Fa. Synerpy kann ich Ihnen folgendes Skript zur Verfügung stellen.
Dieses Skript über den Ibexpert einspielen und die fehlende Funktion ist vorhanden.
Code: Alles auswählen
SET TERM ^ ;
SET TERM ^;
CREATE PROCEDURE P_BSM_STDINFO(
BSM_ID INTEGER)
RETURNS (
GESAMT NUMERIC(15,2),
SOLLSTD NUMERIC(15,2),
SALDO NUMERIC(15,2),
SALDOZEIT VARCHAR(6),
BSMUK_URLAUB NUMERIC(15,2),
BSMB_ISTKZ VARCHAR(1),
BSMB_DATUM TIMESTAMP)
AS
DECLARE VARIABLE BDATUM DATE;
DECLARE VARIABLE EDATUM DATE;
DECLARE VARIABLE TEMPSALDO INTEGER;
DECLARE VARIABLE PLUSMINUS VARCHAR(1);
DECLARE VARIABLE NTEMP INTEGER;
DECLARE VARIABLE MYDATUMZEIT TIMESTAMP;
BEGIN
/* LETZTER STAND: 30.05.2005 13:33:41 GERD KROLL */
/* wird z.B. aus Maske FRMV_BSMBMAN aufgerufen */
/* PROTOKOLLIEREN, DASS AKTION HIER DURCHGELAUFEN IST */
IF (GEN_ID(GEN_ENTWICKLUNG,0) = 0) THEN
INSERT INTO A_WASMACHTIB (PROGRAMMTEIL) VALUES ('P_BSM_STDINFO');
IF (BSM_ID IS NULL) THEN EXIT;
BSMUK_URLAUB = 0;
SOLLSTD = 0;
SALDO = 0;
SALDOZEIT = '';
BSMUK_URLAUB = 0;
BSMB_ISTKZ = ' ';
BSMB_DATUM = NULL;
EDATUM = CURRENT_DATE -1; /* immer nur abgeschlossene Tage erten */
/* Monatsersten definieren */
BDATUM = '01.' || CAST(EXTRACT(MONTH FROM EDATUM) AS VARCHAR(2)) || '.' || CAST(EXTRACT(YEAR FROM EDATUM) AS VARCHAR(4));
/* Anfang Stundensaldo ermitteln */
SELECT GESAMT, SOLLSTD
FROM P_CZEITIST(:BSM_ID,:BDATUM,:EDATUM,1,1)
INTO :GESAMT, :SOLLSTD;
SALDO = GESAMT - SOLLSTD;
/* GESAMT (Plus/Minus) in Stunden (3 Stellen) und Minutenanzeige ( 2 tellen) errechnen */
SALDOZEIT = '+00000';
if (SALDO <> 0.0) then
BEGIN
TEMPSALDO = F_TRUNCATE(ABS(SALDO) * 60);
if (SALDO < 0) then PlusMinus = '-'; ELSE PlusMinus = '+';
SALDOZEIT = PlusMinus;
nTemp = F_TRUNCATE(TEMPSALDO / 60);
if (nTemp > 999) then nTemp = 999;
/* Stunden */
SALDOZEIT = SALDOZEIT || F_PADLEFT(CAST(nTemp AS VARCHAR(3)),'0',3);
/*Minuten*/
SALDOZEIT = SALDOZEIT || F_PADLEFT(CAST(F_MODULO(TEMPSALDO,60) AS VARCHAR(2)),'0',2);
/*SALDOZEIT = PlusMinus || F_PADLEFT(CAST((F_TRUNCATETEMPSALDO / 60)) AS VARCHAR(3)),'0',3) || F_PADLEFT(CAST(F_MODLO(TEMPSALDO,60) AS VARCHAR(2)),'0',2);*/
END
/* Ene Stundensaldo ermitteln */
/* Anfang Urlaubsspruch ( Resturlaub ) bestimmen */
SELECT VA.SUMMURL
FROM BSMUK VA
WHERE VA.BSM_ID_LINKKEY = :BSM_ID AND VA.MASKENKEY = CAST(EXTRACT(YEAR FROM CURRENT_DATE) AS VARCHAR(4))
INTO :BSMUK_URLAUB;
/* Ende Urlaubsspruch ( Resturlaub ) bestimmen */
/* Anfang letzten Ist-Buchungsdatensatz ermitteln */
MYDATUMZEIT = NULL;
SELECT MAX(VB.DATUM)
FROM BSMB VB
WHERE VB.BSM_ID_PER_NR = :BSM_ID AND VB.ISTKZ IN ('K','G') AND VB.PLANKZ = ' '
INTO :MYDATUMZEIT;
IF (MYDATUMZEIT IS NOT NULL) THEN
SELECT VB.ISTKZ, VB.DATUM
FROM BSMB VB
WHERE VB.BSM_ID_PER_NR = :BSM_ID AND VB.DATUM = :MYDATUMZEIT AND
VB.ISTKZ IN ('K','G') AND VB.PLANKZ = ' '
INTO :BSMB_ISTKZ, :BSMB_DATUM;
/* Ende letzten Ist-Buchungsdatensatz ermitteln */
SUSPEND;
END
^
SET TERM ; ^
DESCRIBE PROCEDURE P_BSM_STDINFO
'Aktuelle Zeitinfo (Std, Url etc.) fuer Mitarbeiter';
GRANT INSERT ON A_WASMACHTIB TO PROCEDURE P_BSM_STDINFO;
GRANT EXECUTE ON PROCEDURE P_CZEITIST TO PROCEDURE P_BSM_STDINFO;
GRANT SELECT ON BSMUK TO PROCEDURE P_BSM_STDINFO;
GRANT SELECT ON BSMB TO PROCEDURE P_BSM_STDINFO;
GRANT EXECUTE ON PROCEDURE P_BSM_STDINFO TO "PUBLIC";
GRANT EXECUTE ON PROCEDURE P_BSM_STDINFO TO SYSDBA;
Mit freundlichen Grüßen
Hendrik Hackmann