ASTE#37915 Bezettingsgraag timezone - proof maken

svn path=/Website/trunk/; revision=33187
This commit is contained in:
2017-03-17 16:25:36 +00:00
parent a012b67ca3
commit 20bd3681a9
2 changed files with 83 additions and 26 deletions

View File

@@ -31,6 +31,7 @@
<!-- #include file="../Shared/resultset_table_v2.inc" --> <!-- #include file="../Shared/resultset_table_v2.inc" -->
<!-- #include file="./res.inc" --> <!-- #include file="./res.inc" -->
<!-- #include file="../Shared/getkenmerksql.inc" --> <!-- #include file="../Shared/getkenmerksql.inc" -->
<!-- #include file="../Shared/Shared.inc" -->
<% <%
FCLTHeader.Requires({ plugins:["jQuery"], FCLTHeader.Requires({ plugins:["jQuery"],
@@ -132,6 +133,9 @@ function res_list_ppi(pautfunction, params)
var ora_date2 = dateto.beginToSQL(); var ora_date2 = dateto.beginToSQL();
var ora_date3 = datefrom.beginToSQL(); var ora_date3 = datefrom.beginToSQL();
var ora_date4 = dateto.endToSQL(); var ora_date4 = dateto.endToSQL();
var ora_date5 = toUserTimeZone(datefrom).toSQL(true);
var ora_date6 = toUserTimeZone(dateto).toSQL(true);
//date_sql = " AND beschik.res_reservering_van BETWEEN " + ora_date1 + " AND " + ora_date2; //date_sql = " AND beschik.res_reservering_van BETWEEN " + ora_date1 + " AND " + ora_date2;
if (room_key) if (room_key)
@@ -161,7 +165,10 @@ function forhours(fn)
var res = [] var res = []
// Wel met hele uren rekenen, anders geeft dat hier problemen. // Wel met hele uren rekenen, anders geeft dat hier problemen.
for (i = Math.floor(S("res_rap_t1")); i < Math.floor(S("res_rap_t2") + 0.6); i++) for (i = Math.floor(S("res_rap_t1")); i < Math.floor(S("res_rap_t2") + 0.6); i++)
res.push(fn.call(null, i)); {
var h = getServerHour(i)
res.push(fn.call(null, h, i));
}
return res; return res;
} }
//__Log(forhours(function (h) { return String(h); })); //__Log(forhours(function (h) { return String(h); }));
@@ -181,13 +188,13 @@ function forhours(fn)
+ " , rarg.res_discipline_key" + " , rarg.res_discipline_key"
+ (dayschedule + (dayschedule
? (" ," + forhours(function (h) { return " SUM(n" + String(h) + ") b" + String(h); })) ? (" ," + forhours(function (h) { return " SUM(n" + String(h) + ") b" + String(h); }))
: " , SUM(GREATEST(LEAST(to_number(TO_CHAR(res_rsv_ruimte_tot, 'SSSSS')) / 3600" : " , SUM(GREATEST(LEAST(to_number(TO_CHAR(res_rsv_ruimte_tot_tz, 'SSSSS')) / 3600"
+ " , COALESCE(res_ruimte_eindtijd, " + S("res_t2") + ")" + " , COALESCE(res_ruimte_eindtijd, " + S("res_t2") + ")"
+ " ," + S("res_rap_t2") + " ," + S("res_rap_t2")
+ " )" + " )"
+ " ," + (rap_t1_overruled? 0 : S("res_rap_t1")) // Als res_rap_t1 overruled is (geen waarde had) dan GREATEST automatisch 1-ste waarde te laten kiezen. + " ," + (rap_t1_overruled? 0 : S("res_rap_t1")) // Als res_rap_t1 overruled is (geen waarde had) dan GREATEST automatisch 1-ste waarde te laten kiezen.
+ " )" + " )"
+ " - LEAST(GREATEST(to_number(TO_CHAR(res_rsv_ruimte_van, 'SSSSS')) / 3600" + " - LEAST(GREATEST(to_number(TO_CHAR(res_rsv_ruimte_van_tz, 'SSSSS')) / 3600"
+ " , COALESCE(res_ruimte_begintijd, " + S("res_t1") + ")" + " , COALESCE(res_ruimte_begintijd, " + S("res_t1") + ")"
+ " ," + S("res_rap_t1") + " ," + S("res_rap_t1")
+ " )" + " )"
@@ -202,7 +209,9 @@ function forhours(fn)
? " ," + forhours(function (h) { return "r.n" + String(h); }) ? " ," + forhours(function (h) { return "r.n" + String(h); })
: "") : "")
+ " , r.res_rsv_ruimte_van" + " , r.res_rsv_ruimte_van"
+ oRaAsUserTZ('r', 'res_rsv_ruimte_van')
+ " , r.res_rsv_ruimte_tot" + " , r.res_rsv_ruimte_tot"
+ oRaAsUserTZ('r', 'res_rsv_ruimte_tot')
+ " , ra.res_alg_ruimte_aanmaak" + " , ra.res_alg_ruimte_aanmaak"
+ " , ra.res_alg_ruimte_verwijder" + " , ra.res_alg_ruimte_verwijder"
+ " , rr.res_ruimte_begintijd" + " , rr.res_ruimte_begintijd"
@@ -220,9 +229,9 @@ function forhours(fn)
+ " AND ro.res_ruimte_key = rr.res_ruimte_key" + " AND ro.res_ruimte_key = rr.res_ruimte_key"
+ " AND rr.res_ruimte_key = ra.res_ruimte_key) rarg" + " AND rr.res_ruimte_key = ra.res_ruimte_key) rarg"
+ " WHERE res_rsv_ruimte_van BETWEEN " + ora_date3 + " AND " + ora_date4 + " WHERE res_rsv_ruimte_van BETWEEN " + ora_date3 + " AND " + ora_date4
+ " AND TO_CHAR(res_rsv_ruimte_van, 'd') >= 2" // --veronderstelt NLS_TERRITORY='AMERICA', 2 is maandag + " AND TO_CHAR(res_rsv_ruimte_van_tz, 'd') >= 2" // --veronderstelt NLS_TERRITORY='AMERICA', 2 is maandag
+ " AND TO_CHAR(res_rsv_ruimte_van, 'd') <= 6" + " AND TO_CHAR(res_rsv_ruimte_van_tz, 'd') <= 6"
+ " AND TRUNC(res_rsv_ruimte_van) NOT IN (SELECT mld_vrije_dagen_datum FROM mld_vrije_dagen)" + " AND TRUNC(res_rsv_ruimte_van_tz) NOT IN (SELECT mld_vrije_dagen_datum FROM mld_vrije_dagen)"
+ " AND rarg.res_alg_ruimte_aanmaak <= " + ora_date2 + " AND rarg.res_alg_ruimte_aanmaak <= " + ora_date2
+ " AND (rarg.res_alg_ruimte_verwijder IS NULL" + " AND (rarg.res_alg_ruimte_verwijder IS NULL"
+ " OR rarg.res_alg_ruimte_verwijder >= " + ora_date1 + ")" + " OR rarg.res_alg_ruimte_verwijder >= " + ora_date1 + ")"
@@ -230,7 +239,7 @@ function forhours(fn)
+ " , rarg.res_discipline_key) bez" + " , rarg.res_discipline_key) bez"
+ " , (SELECT DISTINCT rr1.res_discipline_key" + " , (SELECT DISTINCT rr1.res_discipline_key"
+ " , ra.alg_ruimte_key" + " , ra.alg_ruimte_key"
+ " , ((fac.Count_Work_Days(" + ora_date1 + "-1 , " + ora_date2 + "))" + " , ((fac.Count_Work_Days(" + ora_date5 + "-1 , " + ora_date6 + "))"
+ (dayschedule + (dayschedule
? "" ? ""
: " * (LEAST(COALESCE(rr1.res_ruimte_eindtijd, " + S("res_t2") + ")" : " * (LEAST(COALESCE(rr1.res_ruimte_eindtijd, " + S("res_t2") + ")"
@@ -276,7 +285,9 @@ function forhours(fn)
? " ," + forhours(function (h) { return "r.n" + String(h); }) ? " ," + forhours(function (h) { return "r.n" + String(h); })
: "") : "")
+ " , r.res_rsv_ruimte_van" + " , r.res_rsv_ruimte_van"
+ oRaAsUserTZ('r', 'res_rsv_ruimte_van')
+ " , r.res_rsv_ruimte_tot" + " , r.res_rsv_ruimte_tot"
+ oRaAsUserTZ('r', 'res_rsv_ruimte_tot')
+ " , ra.res_alg_ruimte_aanmaak" + " , ra.res_alg_ruimte_aanmaak"
+ " , ra.res_alg_ruimte_verwijder" + " , ra.res_alg_ruimte_verwijder"
+ " , rr.res_ruimte_begintijd" + " , rr.res_ruimte_begintijd"
@@ -299,15 +310,15 @@ function forhours(fn)
if (groupres == 16) if (groupres == 16)
{ // Gebruik hele maanden in het berekenen van het aantal werkdagen. { // Gebruik hele maanden in het berekenen van het aantal werkdagen.
sql_sel_periode = "fac.count_Work_Days" sql_sel_periode = "fac.count_Work_Days"
+ "( DECODE(periode, TO_CHAR(" + ora_date1 + ",'yyyymm'), " + ora_date1 + ", fac.safe_to_date(periode || '01','yymmdd')) - 1" + "( DECODE(periode, TO_CHAR(" + ora_date5 + ",'yyyymm'), " + ora_date5 + ", fac.safe_to_date(periode || '01','yymmdd')) - 1"
+ ", DECODE(periode, TO_CHAR(" + ora_date2 + ",'yyyymm'), " + ora_date2 + ", last_day(fac.safe_to_date(periode || '01','yymmdd')))" + ", DECODE(periode, TO_CHAR(" + ora_date6 + ",'yyyymm'), " + ora_date6 + ", last_day(fac.safe_to_date(periode || '01','yymmdd')))"
+ ")" + ")"
sql_grp_periode = "TO_CHAR(res_rsv_ruimte_van, 'yyyymm')"; sql_grp_periode = "TO_CHAR(" + oRaAsUserTZ('', 'res_rsv_ruimte_van', true) + ", 'yyyymm')";
} }
if (groupres == 18 || groupres == 19) if (groupres == 18 || groupres == 19)
{ // Alle dagen zijn goed. //Is de huidig geselecteerde dag een werkdag. { // Alle dagen zijn goed. //Is de huidig geselecteerde dag een werkdag.
sql_sel_periode = "1"; //"fac.count_Work_Days(to_date(werkbaredagen.periode,'yyyymmdd')-1, to_date(werkbaredagen.periode,'yyyymmdd'))"; sql_sel_periode = "1"; //"fac.count_Work_Days(to_date(werkbaredagen.periode,'yyyymmdd')-1, to_date(werkbaredagen.periode,'yyyymmdd'))";
sql_grp_periode = "TO_CHAR(res_rsv_ruimte_van, 'yyyymmdd')"; sql_grp_periode = "TO_CHAR(" + oRaAsUserTZ('', 'res_rsv_ruimte_van', true) + ", 'yyyymmdd')";
} }
var sql_bezetting = "SELECT rarg.alg_ruimte_key" var sql_bezetting = "SELECT rarg.alg_ruimte_key"
@@ -315,8 +326,14 @@ function forhours(fn)
+ " , " + sql_grp_periode + " periode" + " , " + sql_grp_periode + " periode"
+ (dayschedule + (dayschedule
? (", " + forhours(function (h) { return " SUM(n" + String(h) + ") b" + String(h); })) ? (", " + forhours(function (h) { return " SUM(n" + String(h) + ") b" + String(h); }))
: " , SUM( LEAST(to_number(TO_CHAR(rarg.res_rsv_ruimte_tot, 'SSSSS')) / 3600, COALESCE(rarg.res_ruimte_eindtijd, " + S("res_t2") +"))" // This fails if you execute this querie from one timezone to gather data from multiple or other timezone(s)
+ " - GREATEST(to_number(TO_CHAR(rarg.res_rsv_ruimte_van, 'SSSSS')) / 3600, COALESCE(rarg.res_ruimte_begintijd," + S("res_t1") +"))" // because:
// 1. Reservations from another timezone may extend over 2 days when converted to the user's timezone, in which case the calculation is wrong
// 2. begin and end times from which to calculate is user bound, not location bound.
//
// Note: reservations outside 'opening' hours now result in 0 hours.
: " , SUM(LEAST(GREATEST(to_number(TO_CHAR(rarg.res_rsv_ruimte_tot_tz, 'SSSSS')) / 3600, COALESCE(rarg.res_ruimte_begintijd," + S("res_t1") +")), COALESCE(rarg.res_ruimte_eindtijd, " + S("res_t2") +"))"
+ " - GREATEST(LEAST(to_number(TO_CHAR(rarg.res_rsv_ruimte_van_tz, 'SSSSS')) / 3600, COALESCE(rarg.res_ruimte_eindtijd, " + S("res_t2") +")), COALESCE(rarg.res_ruimte_begintijd," + S("res_t1") +"))"
+ " ) bezetting") + " ) bezetting")
+ " FROM ("+ sql_reservering + ") rarg" + " FROM ("+ sql_reservering + ") rarg"
+ " WHERE rarg.res_rsv_ruimte_van BETWEEN " + ora_date3 + " AND " + ora_date4; + " WHERE rarg.res_rsv_ruimte_van BETWEEN " + ora_date3 + " AND " + ora_date4;
@@ -324,10 +341,10 @@ function forhours(fn)
// Ook zaterdag en zondag meetellen voor 18:Weekdag, 19:Datum. // Ook zaterdag en zondag meetellen voor 18:Weekdag, 19:Datum.
if (groupres == 16) if (groupres == 16)
{ {
sql_bezetting += " AND TO_CHAR(rarg.res_rsv_ruimte_van, 'd') >= 2" // --veronderstelt NLS_TERRITORY='AMERICA', 2 is maandag sql_bezetting += " AND TO_CHAR(rarg.res_rsv_ruimte_van_tz, 'd') >= 2" // --veronderstelt NLS_TERRITORY='AMERICA', 2 is maandag
+ " AND TO_CHAR(rarg.res_rsv_ruimte_van, 'd') <= 6"; + " AND TO_CHAR(rarg.res_rsv_ruimte_van_tz, 'd') <= 6";
} }
sql_bezetting += " AND TO_CHAR(rarg.res_rsv_ruimte_van, 'yyyymmdd') NOT IN" sql_bezetting += " AND TO_CHAR(rarg.res_rsv_ruimte_van_tz, 'yyyymmdd') NOT IN"
+ "(SELECT to_char(mld_vrije_dagen_datum, 'yyyymmdd')" + "(SELECT to_char(mld_vrije_dagen_datum, 'yyyymmdd')"
+ " FROM mld_vrije_dagen" + " FROM mld_vrije_dagen"
+ ")" + ")"
@@ -395,7 +412,6 @@ function forhours(fn)
+ sql_floor + sql_floor
+ sql_rooms; + sql_rooms;
} }
sql = discxalg3d(sql, sql = discxalg3d(sql,
"beschik.res_discipline_key", "beschik.res_discipline_key",
"di.alg_regio_key", "di.alg_regio_key",
@@ -423,7 +439,7 @@ function forhours(fn)
res_colums = [ [L("lcl_location"), "locatie", "string", false], res_colums = [ [L("lcl_location"), "locatie", "string", false],
[L("lcl_res_nr_of_rooms"), "aantal_ruimten", "number", true]]; [L("lcl_res_nr_of_rooms"), "aantal_ruimten", "number", true]];
res_colums = res_colums.concat(forhours(function (h) { return [String(h) + ":00", "t" + String(h), "float", true]; })); res_colums = res_colums.concat(forhours(function (i, h) { return [String(h) == "23" ? "23:00 - 00:00" : String(h) + ":00 - " + String(h + 1) + ":00", "t" + String(i), "float", false, true];}));
select_sql = ", " + forhours(function (h) { return "(CASE WHEN SUM(beschikbaar) = 0 THEN SUM(b"+String(h)+") ELSE ROUND((SUM(b"+String(h)+") / SUM(beschikbaar)) * 100, 2) END) t"+String(h)+""; }); select_sql = ", " + forhours(function (h) { return "(CASE WHEN SUM(beschikbaar) = 0 THEN SUM(b"+String(h)+") ELSE ROUND((SUM(b"+String(h)+") / SUM(beschikbaar)) * 100, 2) END) t"+String(h)+""; });
//order_by = "13"; //order_by = "13";
@@ -475,7 +491,7 @@ function forhours(fn)
if (dayschedule) if (dayschedule)
{ {
res_colums = [ [L("lcl_month"), fnrowMaand, "string", false] ]; res_colums = [ [L("lcl_month"), fnrowMaand, "string", false] ];
res_colums = res_colums.concat(forhours(function (h) { return [String(h) + ":00", "t" + String(h), "float", false, true]; })); res_colums = res_colums.concat(forhours(function (i, h) { return [String(h) == "23" ? "23:00 - 00:00" : String(h) + ":00 - " + String(h + 1) + ":00", "t" + String(i), "float", false, true];}));
sql = " SELECT periode res_keycolumn" sql = " SELECT periode res_keycolumn"
+ select_sql + select_sql
@@ -501,7 +517,7 @@ function forhours(fn)
if (dayschedule) if (dayschedule)
{ {
res_colums = [ [L("lcl_weekday"), fnrowMaand, "string", false] ]; res_colums = [ [L("lcl_weekday"), fnrowMaand, "string", false] ];
res_colums = res_colums.concat(forhours(function (h) { return [String(h) == "23" ? "23:00 - 00:00" : String(h) + ":00 - " + String(h + 1) + ":00", "t" + String(h), "float", false, true]; })); res_colums = res_colums.concat(forhours(function (i, h) { return [String(h) == "23" ? "23:00 - 00:00" : String(h) + ":00 - " + String(h + 1) + ":00", "t" + String(i), "float", false, true];}));
sql = " SELECT TO_CHAR(TO_DATE(periode,'yyyymmdd'),'d') res_keycolumn" sql = " SELECT TO_CHAR(TO_DATE(periode,'yyyymmdd'),'d') res_keycolumn"
+ select_sql + select_sql
@@ -528,7 +544,7 @@ function forhours(fn)
if (dayschedule) if (dayschedule)
{ {
res_colums = [ [L("lcl_date"), fnrowMaand, "string", false] ]; res_colums = [ [L("lcl_date"), fnrowMaand, "string", false] ];
res_colums = res_colums.concat(forhours(function (h) { return [String(h) + ":00", "t" + String(h), "float", false, true]; })); res_colums = res_colums.concat(forhours(function (i, h) { return [String(h) == "23" ? "23:00 - 00:00" : String(h) + ":00 - " + String(h + 1) + ":00", "t" + String(i), "float", false, true];}));
sql = " SELECT periode res_keycolumn" sql = " SELECT periode res_keycolumn"
+ select_sql + select_sql
@@ -586,7 +602,7 @@ function forhours(fn)
{ {
res_colums = [ [L("lcl_room"), "ruimte", "string", false] ]; res_colums = [ [L("lcl_room"), "ruimte", "string", false] ];
res_colums = res_colums.concat(forhours(function (h) { return [String(h) + ":00", "t" + String(h), "float", true]; })); res_colums = res_colums.concat(forhours(function (i, h) { return [String(h) == "23" ? "23:00 - 00:00" : String(h) + ":00 - " + String(h + 1) + ":00", "t" + String(i), "float", false, true];}));
//select_sql = ", " + forhours(function (h) { return "ROUND((SUM(b"+String(h)+") / SUM(beschikbaar)) * 100, 2) t"+String(h)+""; }) //select_sql = ", " + forhours(function (h) { return "ROUND((SUM(b"+String(h)+") / SUM(beschikbaar)) * 100, 2) t"+String(h)+""; })
sql = " SELECT rg.alg_ruimte_key res_keycolumn" sql = " SELECT rg.alg_ruimte_key res_keycolumn"
@@ -732,13 +748,13 @@ function forhours(fn)
if (res_rap_t1m < 10) res_rap_t1m = "0" + res_rap_t1m; if (res_rap_t1m < 10) res_rap_t1m = "0" + res_rap_t1m;
var res_rap_t1s = res_rap_t1h + ":" + res_rap_t1m var res_rap_t1s = res_rap_t1h + ":" + res_rap_t1m
var res_rap_t2h = Math.floor(S("res_rap_t2")); var res_rap_t2h = Math.floor(S("res_rap_t2"));
if (res_rap_t2h < 10) res_rap_t2h = "0" + res_rap_t2h; if (res_rap_t2h < 10) res_rap_t2h = "0" + res_rap_t2h;
var res_rap_t2m = Math.floor((S("res_rap_t2") - res_rap_t2h)*60); var res_rap_t2m = Math.floor((S("res_rap_t2") - res_rap_t2h)*60);
if (res_rap_t2m < 10) res_rap_t2m = "0" + res_rap_t2m; if (res_rap_t2m < 10) res_rap_t2m = "0" + res_rap_t2m;
var res_rap_t2s = res_rap_t2h + ":" + res_rap_t2m var res_rap_t2s = res_rap_t2h + ":" + res_rap_t2m
var doTotals = (groupres != 16 && groupres != 18 && groupres != 19) var doTotals = (groupres != 16 && groupres != 18 && groupres != 19)
var rst = new ResultsetTable({ keyColumn: "res_keycolumn", var rst = new ResultsetTable({ keyColumn: "res_keycolumn",
ID: "restable", ID: "restable",

View File

@@ -679,6 +679,47 @@ function transitQS()
function padout(number) { return (number < 10) ? "0" + number : number; } function padout(number) { return (number < 10) ? "0" + number : number; }
function oRaAsUserTZ(prefix, varName, isGroupClause)
{
if (prefix != "")
prefix += ".";
/////
// Returns;
// for GROUP BY Clause: the same prefix + "." + varName
// for SELECT Clause: the same prefix + "." + varName with correct syntax and an Alias as + "_tz"
/////
if (Session("time_zone") == "Europe/Amsterdam")
return (isGroupClause ? "" : " , ")
+ prefix + varName
+ (isGroupClause ? "" : " " + varName + "_tz");
/////
// Returns;
// for GROUP BY Clause: syntax for converted timezone
// for SELECT Clause: syntax for converted timezone with comma for SELECT Clause, named: [varName + "_tz"]
/////
return (isGroupClause ? "" : " , ")
+ "CAST(FROM_TZ(CAST(" + prefix + varName + " AS TIMESTAMP), TO_CHAR (SYSTIMESTAMP, 'tzr')) AT TIME ZONE SESSIONTIMEZONE AS DATE)"
+ (isGroupClause ? "" : " " + varName + "_tz");
}
function getServerHour(h)
{
var tempDate = new Date();
tempDate.setHours(h);
tempDate = toServerTimeZone(tempDate);
return tempDate.getHours();
}
function getUserHour(h)
{
var tempDate = new Date();
tempDate.setHours(h);
tempDate = toUserTimeZone(tempDate);
return tempDate.getHours();
}
function toUserTimeZone(thisDate) function toUserTimeZone(thisDate)
{ {
return convertTimeZone(thisDate, "Europe/Amsterdam", Session("time_zone")); return convertTimeZone(thisDate, "Europe/Amsterdam", Session("time_zone"));
@@ -715,7 +756,7 @@ function convertTimeZone(thisDate, fromTZ, toTZ)
// <20> never as part of a computation. // <20> never as part of a computation.
function toTimeString(jsDate, bWithSeconds, converted) function toTimeString(jsDate, bWithSeconds, converted)
{ {
if (jsDate===null) if (jsDate==null)
return ""; return "";
if (typeof jsDate == "object" && jsDate.type == 135/*adDBTimeStamp, oRs("datum")*/) if (typeof jsDate == "object" && jsDate.type == 135/*adDBTimeStamp, oRs("datum")*/)
@@ -751,7 +792,7 @@ function toDateString(jsDate, noDay, pretty, converted)
var tomorrow = (new Date(today)); var tomorrow = (new Date(today));
tomorrow.setDate(today.getDate()+1); tomorrow.setDate(today.getDate()+1);
if (jsDate===null) if (jsDate==null)
return ""; return "";
if (typeof jsDate == "object" && jsDate.type == 135/*adDBTimeStamp, oRs("datum")*/) if (typeof jsDate == "object" && jsDate.type == 135/*adDBTimeStamp, oRs("datum")*/)
@@ -784,7 +825,7 @@ function toDateString(jsDate, noDay, pretty, converted)
} }
function toDateTimeString(jsDate, bWithSeconds, noDay, prettyday) function toDateTimeString(jsDate, bWithSeconds, noDay, prettyday)
{ {
if (jsDate===null) if (jsDate==null)
return ""; return "";
if (typeof jsDate == "object" && jsDate.type == 135/*adDBTimeStamp, oRs("datum")*/) if (typeof jsDate == "object" && jsDate.type == 135/*adDBTimeStamp, oRs("datum")*/)