1180 lines
52 KiB
PHP
1180 lines
52 KiB
PHP
<% /*
|
|
$Revision$
|
|
$Id$
|
|
|
|
File: model_reports.inc
|
|
|
|
Description: rapport model voor *de data* van een specifiek rapport.
|
|
Zal rapporten uitvoeren dus. Het *bewerken* van rapporten gaat via model_reportsx
|
|
Parameters:
|
|
Context:
|
|
|
|
Notes:
|
|
*/
|
|
%>
|
|
<!-- #include file="./model_reportsx.inc" -->
|
|
<!-- #include file="../fac/fac_usrrap.inc" -->
|
|
<%
|
|
|
|
function model_reports_template()
|
|
{
|
|
this.table = "te bepalen";
|
|
this.primary = null;
|
|
this.records_name = "te bepalen";
|
|
this.record_name = "te bepalen";
|
|
this.fields = {/* te bepalen */};
|
|
this.autfunction = null;
|
|
|
|
this.REST_GET = report_GET;
|
|
|
|
this.REST_PUT = false;
|
|
this.REST_POST = false;
|
|
this.REST_DELETE = false;
|
|
|
|
// Let op: wordt ook vanuit fac/fac_report.asp gebruikt voor xml-styled rapporten
|
|
// Ook: de bevroren filtervelden er bij
|
|
this.addfixedfilters = function _addfixedfilters(filter)
|
|
{
|
|
filter.fclt_3d_user_key = user_key; // Die is gemakkelijk
|
|
for (var fld in this.fields)
|
|
{
|
|
var field = this.fields[fld];
|
|
if (!field.filterdefault)
|
|
continue;
|
|
|
|
// preferdefaultfilters is in queuemail_schedule_save.asp toegevoegd voor scheduled
|
|
// reports
|
|
if ((field.typ == "date" || field.typ == "datetime") && filter.preferdefaultfilters)
|
|
{
|
|
delete filter[fld];
|
|
delete filter["start_" + fld];
|
|
delete filter["end_" + fld];
|
|
}
|
|
|
|
var fixed = field.filterdefault.substr(0,2) == ":!";
|
|
if (!(fld in filter) || fixed) // Filter/fixed?
|
|
{
|
|
var defs = scf.parseDefault(field.filterdefault, field);
|
|
if (field.filter == "like" || field.filter == "exact" || !("filter" in field))
|
|
{
|
|
if (fixed || !(fld in filter))
|
|
filter[fld] = defs.vmin;
|
|
}
|
|
else if (field.filter == "range")
|
|
{
|
|
if (fixed || !("start_" + fld in filter))
|
|
filter["start_" + fld] = defs.vmin;
|
|
if (fixed || !("end_" + fld in filter))
|
|
filter["end_" + fld] = defs.vmax;
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
// Let op: wordt ook vanuit fac/fac_report.asp gebruikt voor xml-styled rapporten
|
|
// Deze zijn complexer en red ik niet via addfixedfilters
|
|
this.add3d = function _add3d(wheres)
|
|
{
|
|
if (this.autfunction)
|
|
{
|
|
var sql = "SELECT fac_functie_code, fac_functie_min_level, fac_functie_discipline"
|
|
+ " FROM fac_functie f"
|
|
+ " WHERE f.fac_functie_key = " + this.authparams.autfunctionkey;
|
|
var oRs = Oracle.Execute(sql);
|
|
|
|
var bMetALGAuth = (oRs("fac_functie_min_level").Value & 8) == 8;
|
|
var bMetPRSAuth = (oRs("fac_functie_min_level").Value & 4) == 4;
|
|
var bMetDiscipline = (oRs("fac_functie_discipline").Value == 1);
|
|
oRs.Close();
|
|
|
|
if (bMetALGAuth && "fclt_3d_regio_key" in this.fields && this.authparams.ALGreadlevel > -1)
|
|
{
|
|
wheres.push(" fclt_3d_regio_key IN"
|
|
+ "(SELECT alg_regio_key "
|
|
+ " FROM fac_v_my_regions "
|
|
+ " WHERE niveau ="+this.authparams.ALGreadlevel
|
|
+ " AND prs_perslid_key="+user_key+")");
|
|
}
|
|
if (bMetALGAuth && "fclt_3d_district_key" in this.fields && this.authparams.ALGreadlevel > -1)
|
|
{
|
|
wheres.push(" fclt_3d_district_key IN"
|
|
+ "(SELECT alg_district_key "
|
|
+ " FROM fac_v_my_districts "
|
|
+ " WHERE niveau ="+this.authparams.ALGreadlevel
|
|
+ " AND prs_perslid_key="+user_key+")");
|
|
}
|
|
if (bMetALGAuth && "fclt_3d_locatie_key" in this.fields && this.authparams.ALGreadlevel > -1)
|
|
{
|
|
wheres.push(" fclt_3d_locatie_key IN"
|
|
+ "(SELECT alg_locatie_key FROM fac_v_my_locations "
|
|
+ " WHERE niveau ="+this.authparams.ALGreadlevel
|
|
+ " AND prs_perslid_key="+user_key+")");
|
|
}
|
|
if (bMetALGAuth && "fclt_3d_gebouw_key" in this.fields && this.authparams.ALGreadlevel > -1)
|
|
{
|
|
wheres.push(" fclt_3d_gebouw_key IN"
|
|
+ "((SELECT alg_gebouw_key FROM fac_v_my_buildings "
|
|
+ " WHERE niveau ="+this.authparams.ALGreadlevel
|
|
+ " AND prs_perslid_key="+user_key+"))");
|
|
}
|
|
if (bMetPRSAuth && "fclt_3d_afdeling_key" in this.fields)
|
|
{
|
|
if (this.authparams.PRSreadlevel == 0)
|
|
{
|
|
wheres.push(" fclt_3d_afdeling_key IN"
|
|
+ " (SELECT a.prs_afdeling_key FROM prs_v_afdeling a "
|
|
+ " WHERE a.prs_bedrijf_key = " + user.afdeling().prs_bedrijf_key() + ")");
|
|
}
|
|
else if (this.authparams.PRSreadlevel > 0)
|
|
{
|
|
wheres.push(" fclt_3d_afdeling_key IN"
|
|
+ "(SELECT prs_afdeling_key FROM prs_v_afdeling_familie a"
|
|
+ " WHERE a.prs_afdeling_elder_key IN"
|
|
+ " (SELECT aa.prs_afdeling_elder_key"
|
|
+ " FROM prs_v_afdeling_familie aa"
|
|
+ " WHERE aa.prs_afdeling_key = " + user.prs_afdeling_key()
|
|
+ " AND aa.niveau = " + this.authparams.PRSreadlevel + "))");
|
|
}
|
|
}
|
|
if (bMetDiscipline && "fclt_3d_discipline_key" in this.fields)
|
|
{
|
|
var disciplines = [];
|
|
var sql = "SELECT ins_discipline_key"
|
|
+ " FROM fac_v_my_disciplines "
|
|
+ " WHERE fac_functie_code = " + safe.quoted_sql(this.autfunction)
|
|
+ " AND prs_perslid_key=" + user_key;
|
|
var oRs = Oracle.Execute(sql);
|
|
while (!oRs.Eof)
|
|
{
|
|
disciplines.push(oRs("ins_discipline_key").Value);
|
|
oRs.MoveNext();
|
|
}
|
|
oRs.Close();
|
|
if (!disciplines.length)
|
|
disciplines.push(-1);
|
|
|
|
var disc_3d = "fclt_3d_discipline_key IN (" + disciplines.join(",") + ")";
|
|
|
|
if ("fclt_3d_discipline2_key" in this.fields)
|
|
disc_3d = "(" + disc_3d + " OR "
|
|
+ "fclt_3d_discipline2_key IN (" + disciplines.join(",") + ")"
|
|
+ ")";
|
|
|
|
wheres.push(disc_3d);
|
|
}
|
|
}
|
|
|
|
if ("fac_functie_key" in this.fields)
|
|
{
|
|
var whereor = ["fac_functie_key IS NULL"]
|
|
whereor.push("fac_functie_key IN"
|
|
+ " (SELECT w.fac_functie_key"
|
|
+ " FROM fac_v_webgebruiker W"
|
|
+ " WHERE w.prs_perslid_key = " + user_key + ")");
|
|
if (user.has("WEB_UDRMAN"))
|
|
{
|
|
whereor.push("fac_functie_key NOT IN"
|
|
+ " (SELECT fac_functie_key"
|
|
+ " FROM fac_functie"
|
|
+ " WHERE fac_functie_code IN ('WEB_FACFAC', 'WEB_FACTAB'))");
|
|
}
|
|
wheres.push("(" + whereor.join(" OR ") +")");
|
|
}
|
|
};
|
|
|
|
this.search = { title: L("lcl_usrrap_report"),
|
|
filters: [],
|
|
keepfilters: true
|
|
}
|
|
}
|
|
|
|
// Voltooi model_reports_template voor een bepaald rapport
|
|
function model_reports(fac_usrrap_key)
|
|
{
|
|
var reportsx = new model_reportsx(fac_usrrap_key, { include: ["columns"], internal: true }); // Internal om wel alle properties te krijgen
|
|
var usrrap = reportsx.data;
|
|
user.auth_required_or_abort(usrrap);
|
|
|
|
var model = new model_reports_template();
|
|
model.table = usrrap.viewname;
|
|
|
|
var anyexpression = false;
|
|
for (var i = 0; i < usrrap.columns.length && !anyexpression; i++)
|
|
{
|
|
anyexpression = !!usrrap.columns[i].expression;
|
|
}
|
|
|
|
if (anyexpression)
|
|
{
|
|
var allfields = [];
|
|
for (var i = 0; i < usrrap.columns.length; i++)
|
|
{
|
|
if (usrrap.columns[i].expression)
|
|
allfields.push(usrrap.columns[i].expression.format(usrrap.viewname) + " " + usrrap.columns[i].name);
|
|
else
|
|
allfields.push(usrrap.columns[i].name);
|
|
}
|
|
var tabelized = ((usrrap.styling && usrrap.styling & 8) ? "T_" : "");
|
|
model.tablesql = "(SELECT " + allfields.join(", ") + " FROM " + tabelized + usrrap.viewname + ") " + tabelized + usrrap.viewname;
|
|
}
|
|
|
|
if (usrrap.styling && usrrap.styling & 8) // Tabelized
|
|
model.table = "T_" + usrrap.viewname.substring(0,28); // anders mogelijk te lang voor Oracle
|
|
|
|
model.record_name = usrrap.viewname.substring(0,1) + usrrap.viewname.substring(1).toLowerCase();
|
|
model.records_name = model.record_name + "s";
|
|
model.record_title = (usrrap.name).format(safe.html(user.naam())); // (initiele) titel bij urllink
|
|
model.records_title = (usrrap.name).format(safe.html(user.naam())); // met {0} kun je de usenaam in te titel krijgen
|
|
model.autorefresh = usrrap.autorefresh;
|
|
model.styling = usrrap.styling;
|
|
model.limit0 = usrrap.limit0;
|
|
model.limit1 = usrrap.limit1;
|
|
model.limit2 = usrrap.limit2;
|
|
model.limit3 = usrrap.limit3;
|
|
model.limit4 = usrrap.limit4;
|
|
model.sort = usrrap.sort;
|
|
model.maxrows = usrrap.maxrows || 0;
|
|
model.graph_options = usrrap.graph_options;
|
|
model.graph_type = usrrap.graph_type;
|
|
model.extras = usrrap.parameters;
|
|
model.list = { columns : []
|
|
, groupby : []
|
|
, canGroup: true
|
|
, canCSV: true
|
|
, autoCount: usrrap.count.id
|
|
, autoPivot: usrrap.pivot.id
|
|
, autoGraph: usrrap.graph.id
|
|
, autoRatio: usrrap.ratio.id
|
|
, autoCond: usrrap.condition.id
|
|
};
|
|
if (model.styling && (model.styling & 1))
|
|
model.list.fixedColumns = true;
|
|
model.search.title = L("lcl_usrrap_report") + " " + model.record_title;
|
|
|
|
model.fnrowClass = function _fnrowClass(oRs)
|
|
{
|
|
return oRs.Fields("hide_f_rowclass").Value;
|
|
}
|
|
|
|
var keyfield = null;
|
|
if (usrrap.urllink)
|
|
{
|
|
var mtc = usrrap.urllink.match(/(.*)\{(.*)\}(.*)/);
|
|
if (!mtc || mtc.length < 3)
|
|
shared.simpel_page("'{0}' <em>{1}</em> in report must have format 'xxxx/yyy.asp?key={keyfield}'".format(L("lcl_usrrap_urllink"), usrrap.urllink));
|
|
if (mtc.length == 4)
|
|
model.list.default_url = mtc[1].split("?")[0] + "?" + mtc[1].split("?")[1] + "{0}&" + mtc[3].substring(1);
|
|
else
|
|
model.list.default_url = mtc[1];
|
|
// Voorkom dat hij binnen menu-wrapper wordt getoond
|
|
if (mtc[1].indexOf("?u=") == 0)
|
|
model.list.default_url = "?internal=1&" + mtc[1].substring(1) + (mtc[3]? "{0}&" + mtc[3].substring(1) : "{0}");
|
|
keyfield = mtc[2];
|
|
var found = false;
|
|
for (var i = 0; !found && i < usrrap.columns.length; i++)
|
|
{
|
|
if (keyfield == usrrap.columns[i].name)
|
|
{
|
|
if (usrrap.columns[i].datatype.id != "number")
|
|
shared.simpel_page("Keyfield <em>{0}</em> in '{1}' {2} must be of type number.".format(keyfield, L("lcl_usrrap_urllink"), usrrap.urllink));
|
|
found = true;
|
|
}
|
|
}
|
|
if (!found)
|
|
shared.simpel_page("Keyfield <em>{0}</em> in '{1}' {2} does not exist as a column.".format(keyfield, L("lcl_usrrap_urllink"), usrrap.urllink));
|
|
}
|
|
|
|
if (usrrap.authorization)
|
|
{
|
|
var sql = "SELECT fac_functie_code FROM fac_functie WHERE fac_functie_key = " + usrrap.authorization.id;
|
|
var oRs = Oracle.Execute(sql);
|
|
model.autfunction = oRs("fac_functie_code").Value;
|
|
model.authparams = user.checkAutorisation(model.autfunction); // leesrechten is wel het minste
|
|
oRs.Close();
|
|
}
|
|
|
|
var url_column = [];
|
|
var url_groupby = [];
|
|
for (var i = 0; i < usrrap.columns.length; i++)
|
|
{
|
|
var label = safe.html(usrrap.columns[i].caption); // (lcl) Labels worden altijd geacht html-safe te zijn
|
|
label = label.replace(/\\n/g, "<br/>"); // Voor overulen van gewone LCL's ligt de verantwoordelijkheid
|
|
// bij een beheerder maar rapportages wordt misschien wel fe
|
|
|
|
if (usrrap.columns[i].name == "hide_f_rowclass")
|
|
{
|
|
model.list.rowClass = model.fnrowClass;
|
|
}
|
|
if (inArray(usrrap.columns[i].name, ["coordx", "coordy",
|
|
"fclt_3d_locatie_key", "alg_locatie_key", "locatie_key",
|
|
"fclt_3d_gebouw_key", "alg_gebouw_key", "gebouw_key"]))
|
|
{
|
|
model.list.canKaart = true;
|
|
}
|
|
if (usrrap.columns[i].name.toUpperCase() === "VAN" && inArray(usrrap.columns[i].datatype.id, ["date", "datetime"]))
|
|
{
|
|
model.list.canKalender = usrrap.columns[i].datatype.id == "date" ? 1 : 2;
|
|
}
|
|
|
|
var fixedlabel = false;
|
|
if (label && label.substr(0,1) == "!") // Als een label begint met een ! wordt hij niet aangepast bij groepperen
|
|
{
|
|
fixedlabel = true;
|
|
label = label.substr(1);
|
|
}
|
|
var field = { dbs: usrrap.columns[i].name,
|
|
label: label,
|
|
orglabel: label,
|
|
fixedlabel: fixedlabel,
|
|
typ: usrrap.columns[i].datatype.id,
|
|
orgtyp: usrrap.columns[i].datatype.id,
|
|
group: usrrap.columns[i].group,
|
|
sorting: usrrap.columns[i].sorting,
|
|
visible: usrrap.columns[i].visible.id
|
|
};
|
|
// Voor gewone rapporten zijn expressies via tablesql opgelost
|
|
// Styled rapporten gaan echter via xml.make_xml2 welke tablesql niet gebruikt
|
|
if (model.styling && (model.styling & 1))
|
|
{
|
|
field.sql = usrrap.columns[i].expression;
|
|
}
|
|
|
|
if (usrrap.columns[i].urllink)
|
|
field.urllink = usrrap.columns[i].urllink;
|
|
if (field.typ == "number" && field.dbs.match(/_key$/i)) // Vooral de FCLT_3D filters
|
|
field.typ = "key";
|
|
if (field.typ == "number")
|
|
{
|
|
field.total = true;
|
|
field.autofloat = !field.sql; // we weten het niet zeker als we autodetect hebben gedaan
|
|
}
|
|
if (field.typ == "currency")
|
|
field.total = true;
|
|
if (field.typ == "varchar")
|
|
field.autolike = true;
|
|
|
|
if (field.visible == "H" && field.dbs != keyfield) // Keyfield willen we eigenlijk altijd wel indien mogelijk
|
|
field.hidden = true;
|
|
|
|
if (usrrap.columns[i].filter)
|
|
{
|
|
if (usrrap.columns[i].filter.id == "A")
|
|
{
|
|
field.filter = { "date": "range",
|
|
"datetime": "range",
|
|
"time": "range",
|
|
"varchar": "exact"
|
|
}[ field.typ ] || "exact";
|
|
}
|
|
else
|
|
{
|
|
field.filter = api2.splitLOV("E;exact;L;like;R;range;P;parameter")[usrrap.columns[i].filter.id.substr(0,1)]; // voor filter alleen de eerste letter.
|
|
if (usrrap.columns[i].filter.id.substr(1,1) == "R") // als 2e letter een R is dan is filter verplicht
|
|
field.filterrequired = true;
|
|
if (field.filter == "parameter")
|
|
{
|
|
delete field.autolike;
|
|
delete field.autofloat;
|
|
delete field.total;
|
|
}
|
|
}
|
|
field.filterdefault = usrrap.columns[i].filterdefault;
|
|
}
|
|
var fld = field.dbs.toLowerCase();
|
|
|
|
if (fld == keyfield)
|
|
{
|
|
fld = "id"; // zodat scaffolding_list.inc daar automagisch op kan linken
|
|
}
|
|
|
|
if (field.typ == "key" && fld == "fac_bijlagen_key")
|
|
{
|
|
field.foreign =
|
|
{
|
|
"tbl": "fac_v_bijlagen",
|
|
"key": "fac_bijlagen_key",
|
|
"desc": "fac_bijlagen_filename"
|
|
}
|
|
field.nosearch = true; // Voorkom dat van de foreign een enorme listbox wordt gemaakt
|
|
field.listfunction = function(oRs) // maak hem klikbaar voor download
|
|
{
|
|
var filedata = oRs.Fields("fac_bijlagen_key").Value;
|
|
if (!filedata)
|
|
return "";
|
|
var deepurl = HTTP.urlzelf() + "/appl/shared/BijlagenStream.asp";
|
|
deepurl += "?bijlagen_key=" + filedata.id;
|
|
|
|
return "<a href='{0}' target='_blank'>{1}</a>".format(protectQS.create(deepurl),
|
|
safe.html(oRs.Fields("fac_bijlagen_key").Value.name));
|
|
}
|
|
model.has_bijlagen = true;
|
|
}
|
|
model.fields[fld] = field;
|
|
|
|
if (inArray(usrrap.columns[i].visible.id, ["V", "S", "U", "C"]))
|
|
{ // V=Zichtbaar, S=Zichtbaar, verberg herhalingen, U=Klik-actie, "C"=Visible combine, "I"=onzichtbaar, "H"=verborgen
|
|
if (usrrap.columns[i].visible.id == "U") // kolom wordt als url gebruikt.
|
|
{ // Als de kolom als url-key kolom wordt gebruikt dan deze als laatste kolom toevoegen zodat deze nooit als x-as genomen kan worden.
|
|
url_column.push(fld);
|
|
url_groupby.push(field.group.id);
|
|
}
|
|
else
|
|
{
|
|
if (usrrap.columns[i].visible.id == "C")
|
|
field.combine = true;
|
|
model.list.columns.push(fld);
|
|
model.list.groupby.push(field.group.id);
|
|
}
|
|
}
|
|
if (usrrap.columns[i].filter)
|
|
model.search.filters.push(fld);
|
|
}
|
|
|
|
if ((model.list.autoCount & 2) == 2)
|
|
{
|
|
model.list.columns.push("scf_count");
|
|
model.list.groupby.push("");
|
|
}
|
|
if ((model.list.autoRatio & 2) == 2)
|
|
{
|
|
model.list.columns.push("scf_ratio");
|
|
model.list.groupby.push("");
|
|
}
|
|
|
|
// De url-key kolom altijd als laatste kolom toevoegen zodat deze geen invloed heeft op de orderby en nooit als x-as genomen kan worden.
|
|
if (url_column.length)
|
|
{ // Er kan maar 1 kolom als url-key kolom optreden. We pakken de eerste.
|
|
model.list.columns.push(url_column[0]);
|
|
model.list.groupby.push(url_groupby[0]);
|
|
keyfield = url_column[0];
|
|
}
|
|
|
|
return model;
|
|
}
|
|
|
|
function report_GET(params)
|
|
{
|
|
function getPivotColumns(fields, jsondata, rapsort)
|
|
{
|
|
// Eerst een keer door de json data om de unieke pivotcol waardes te bepalen.
|
|
// Deze pivot kolommen stoppen we in het object "pcolumns".
|
|
var y_sort = (rapsort == 2 ? "desc" : "asc"); // Rapport "Sorteren op" (0=X-as, 1=Y-as oplopend, 2=Y-as aflopend).
|
|
var pcolumns = {};
|
|
for (var i = 0; i < jsondata.length; i++)
|
|
{
|
|
if (pivotcol in jsondata[i])
|
|
{ // Als er twee dezelfde subgroepen zijn van verschillende productgroepen, dan beide subgroepen tonen.
|
|
// Dan valt het ook op, anders niet. Er worden dan waarden niet meegenomen.
|
|
var colname = jsondata[i][pivotcol];
|
|
var coldata = {};
|
|
switch (fields[pivotcol].typ)
|
|
{
|
|
case "datetime":
|
|
pcolumns[colname] = { cnt: 1
|
|
, colname: colname.toString()
|
|
, collabel: toDateTimeString(colname)
|
|
, xas: json[i][sortcol]
|
|
, onsort: colname.getTime()
|
|
};
|
|
break;
|
|
case "date":
|
|
pcolumns[colname] = { cnt: 1
|
|
, colname: colname.toString()
|
|
, collabel: toDateString(colname)
|
|
, xas: json[i][sortcol]
|
|
, onsort: colname.getTime()
|
|
};
|
|
break;
|
|
case "time":
|
|
pcolumns[colname] = { cnt: 1
|
|
, colname: colname.toString()
|
|
, collabel: toTimeString(colname)
|
|
, xas: json[i][sortcol]
|
|
, onsort: parseInt(colname.getHours() + "." + colname.getSeconds())
|
|
};
|
|
break;
|
|
default:
|
|
pcolumns[colname] = { cnt: 1
|
|
, colname: colname
|
|
, collabel: colname
|
|
, xas: json[i][sortcol]
|
|
, onsort: colname
|
|
};
|
|
}
|
|
}
|
|
}
|
|
// pcolumns omzetten naar array.
|
|
var pcols = [];
|
|
for (var j in pcolumns)
|
|
{
|
|
pcols.push(pcolumns[j]);
|
|
}
|
|
// Sorteer de pivot kolommen.
|
|
// pcols.sort(); // sort() disturbes date sequence because of sort on day-name (Fri-Mon-Sat-Sun-Thu-Tue-Wed)
|
|
// -->maar is nodig als de eerste regel niet alle datapunten had.
|
|
// Als de kolomnaam een datum is wordt er op datum geselecteerd.
|
|
pcols.sort(usrrap.compareValues("onsort", y_sort));
|
|
|
|
// Het array "pcols" bevat nu de pivot kolommen gesorteerd op kolomnaam,
|
|
return pcols;
|
|
}
|
|
|
|
var model = this;
|
|
// Als parameters niet in de url zijn meegegeven is waarschijnlijk rechtstreeks de list
|
|
// aangeroepen. Pak dan de geconfigureerde defaults
|
|
def(params.filter, "scf_pivot", (this.list.autoPivot & 2) ? 1 : 0);
|
|
def(params.filter, "scf_graph", (this.list.autoGraph & 2) == 2 ? "on" : "");
|
|
def(params.filter, "scf_cond", (this.list.autoCond & 2) == 2 ? "on" : "");
|
|
def(params.filter, "scf_sort", model.sort.id);
|
|
if (!params.columns)
|
|
{
|
|
params.columns = this.list.columns;
|
|
params.groupby = this.list.groupby;
|
|
}
|
|
|
|
if (params.filter.aswidget) {
|
|
// Pak dan de default columns/groupby/graph_type
|
|
def(params.filter, "columns", params.columns.join(","));
|
|
def(params.filter, "groupby", params.groupby.join(","));
|
|
def(params.filter, "scf_graph_type", (this.list.autoGraph & 2) ? this.graph_type : 0);
|
|
}
|
|
|
|
var groupbys = [];
|
|
var hasAggregate = false; // Als er uitsluitend GROUP BY is zonder ook maar een enkele
|
|
// aggregate functie zouden effectief dubbelen verwijderd worden.
|
|
// Dat mag niet zo maar
|
|
|
|
if (params.columns && inArray("scf_count", params.columns))
|
|
{
|
|
if (params.columns.length == 1)
|
|
shared.simpel_page(L("lcl_empty_rstable"));
|
|
|
|
this.fields["scf_count"] = { dbs: "scf_count", sql: "COUNT(*)", typ: "number", label: L("lcl_count"), orglabel: L("lcl_count"), total: true };
|
|
hasAggregate = true;
|
|
}
|
|
if (params.columns && inArray("scf_ratio", params.columns))
|
|
{
|
|
if (params.columns.length == 1)
|
|
shared.simpel_page(L("lcl_empty_rstable"));
|
|
|
|
this.fields["scf_ratio"] = { dbs: "scf_ratio", sql: "RATIO_TO_REPORT(COUNT(*)) OVER() * 100", typ: "float", label: L("lcl_ratio"), orglabel: L("lcl_ratio"), total: true };
|
|
hasAggregate = true;
|
|
}
|
|
|
|
// Controleren of de aangevinkte kolommen, die zijn meegegeven in de link (params.columns), een "Optellen", "Tellen" of "Gemiddelde" groepering hebben.
|
|
for (var fld in model.fields)
|
|
{
|
|
// Alleen de aangevinkte kolommen controleren.
|
|
var found = false;
|
|
for (var j = 0; j < params.columns.length; j++)
|
|
{
|
|
if (params.columns[j] == fld && params.groupby[j] != "" && params.groupby[j] != "G")
|
|
{
|
|
hasAggregate = true;
|
|
break;
|
|
}
|
|
}
|
|
if (hasAggregate) break;
|
|
}
|
|
|
|
// CLOB (mld_melding_omschrijving) mag niet in de ORDER BY genoemd worden
|
|
// TODO: in de toekomst misschien explicieter rapport kolom type 'memo' onderkennen?
|
|
var sqlc = "SELECT column_name, data_type"
|
|
+ " FROM user_tab_columns"
|
|
+ " WHERE table_name = " + safe.quoted_sql_upper(model.table);
|
|
var oRs = Oracle.Execute(sqlc);
|
|
var isclob = {};
|
|
while (!oRs.EOF)
|
|
{
|
|
isclob[oRs("column_name").Value] = (oRs("data_type") == 'CLOB');
|
|
oRs.MoveNext();
|
|
}
|
|
oRs.Close()
|
|
|
|
// CLOB is problematisch in GROUP BY
|
|
for (var fld in model.fields)
|
|
{
|
|
var field = model.fields[fld];
|
|
if (isclob[field.dbs.toUpperCase()])
|
|
{
|
|
field.sql = "TO_CHAR(SUBSTR({0}, 1, 4000))".format(field.dbs);
|
|
}
|
|
}
|
|
|
|
// Controleren of de urllink parameter een &##TRANSIT## heeft. Dan geven wel alle filtervelden door
|
|
if (params.urllink && params.urllink.link && params.urllink.link.match(/&##TRANSIT##/i))
|
|
{
|
|
var transitList = [];
|
|
for (var fld in model.fields)
|
|
{
|
|
if (fld in params.filter)
|
|
transitList.push(fld);
|
|
}
|
|
params.urllink.link = params.urllink.link.replace(/\&##TRANSIT##/i, "&scf_transit=" + transitList.join(",") + buildTransitParam(transitList) + "&scf_transitend=1");
|
|
}
|
|
|
|
if (params.columns && params.groupby && params.groupby.length > 0)
|
|
{
|
|
if (params.columns.length != params.groupby.length)
|
|
{
|
|
__DoLog(params);
|
|
INTERNAL_ERROR_GROUP_MISMATCH;
|
|
}
|
|
|
|
// Bouw het fields object opnieuw op in de volgorde van params.columns. Goed voor sorteren later.
|
|
var has_hide_f = false;
|
|
for (var fld in this.fields) // hide_f sorteer velden maakt het veel te ingewikkeld
|
|
{
|
|
if (this.fields[fld].dbs.match(/^hide_f/))
|
|
{
|
|
has_hide_f = true;
|
|
break;
|
|
}
|
|
}
|
|
// De columns velden naar het begin van de fields verplaatsen.
|
|
// pivot needs to keep fields in place for sorting of hidden field
|
|
if (!has_hide_f && !params.filter.scf_pivot == 1)
|
|
{
|
|
var newfields = {};
|
|
for (var i=0; i < params.columns.length; i++)
|
|
{
|
|
var fld = params.columns[i];
|
|
if (fld in this.fields)
|
|
{
|
|
newfields[fld] = this.fields[fld];
|
|
delete this.fields[fld];
|
|
}
|
|
}
|
|
for (fld in this.fields)
|
|
newfields[fld] = this.fields[fld];
|
|
this.fields = newfields;
|
|
}
|
|
|
|
// Alle velden hidden maken, behalve de velden die mee gequeried moeten worden en dat zijn de velden in params.columns.
|
|
for (var fld in this.fields)
|
|
{
|
|
if (!inArray(fld, params.columns))
|
|
{
|
|
// Met groepering (Aantal, Percentage) moet de klikactie niet werken (!hasAggregate).
|
|
if (this.list && this.list.default_url && fld == "id" && params.groupby[0] != "U" && !hasAggregate)
|
|
{
|
|
groupbys.push(this.fields["id"].dbs);
|
|
}
|
|
else
|
|
{
|
|
if (params.groupby[0] != "U" && this.fields[fld].dbs.match(/^hide_f/)) // Doorgaans meenemen om te sorteren
|
|
{
|
|
this.fields[fld].hidden = false;
|
|
params.columns.splice(0, 0, fld);
|
|
params.groupby.splice(0, 0, "G");
|
|
}
|
|
else
|
|
{
|
|
this.fields[fld].hidden = true; // Onnodige velden niet ophalen
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
for (var i = 0; i < params.columns.length; i++)
|
|
{
|
|
var fld = params.columns[i];
|
|
if (fld == "scf_count" || fld == "scf_ratio" )
|
|
continue;
|
|
var field = this.fields[fld];
|
|
|
|
if (field.filter == 'parameter')
|
|
field.hidden = true; // die wil je nooit querieen omdat ze niet de view zitten
|
|
|
|
var field_expression = (field.sql ? field.sql : field.dbs);
|
|
var field_group = (field.sql && field.sql.toUpperCase().indexOf("SELECT") > 0 ? i+1 : null); // Voorkom dat er een subselect in de group_by komt te staan.
|
|
|
|
if (!field)
|
|
shared.internal_error("Column {0} not found in report".format(fld));
|
|
field.keepdbsforfilter = true;
|
|
field.orgtyp = field.typ; // wil grafiek graag weten
|
|
hasAggregate = hasAggregate || (params.groupby[i] || "G") != "G";
|
|
switch (params.groupby[i] || "G")
|
|
{
|
|
case "G":
|
|
if (!field_group)
|
|
groupbys.push(field_expression);
|
|
break;
|
|
case "U":
|
|
field.sql = "DISTINCT(" + field_expression + ")";
|
|
break;
|
|
case "S":
|
|
field.sql = "SUM(" + field_expression + ")";
|
|
if (!field.fixedlabel)
|
|
field.label = L("lcl_usrrap_label_SUM").format(field.label);
|
|
field.total = true;
|
|
break;
|
|
case "C":
|
|
field.sql = "COUNT(" + field_expression + ")";
|
|
if (!field.fixedlabel)
|
|
field.label = L("lcl_usrrap_label_CNT").format(field.label);
|
|
field.newtyp = "number";
|
|
field.total = true;
|
|
break;
|
|
case "A":
|
|
field.sql = "AVG(" + field_expression + ")";
|
|
if (!field.fixedlabel)
|
|
field.label = L("lcl_usrrap_label_AVG").format(field.label);
|
|
field.total = false;
|
|
field.newtyp = field.typ == "currency" ? "currency" : "float";
|
|
break;
|
|
case "H":
|
|
if (field.typ == "date" || field.typ == "datetime")
|
|
field.sql = "TO_CHAR(" + field_expression + ", 'YYYY-MM-DD HH24')||':00'";
|
|
else
|
|
field.sql = "TO_CHAR(" + field_expression + ", 'HH24')||':00'";
|
|
field.newtyp = "varchar";
|
|
groupbys.push(field_group || field.sql);
|
|
if (!field.fixedlabel)
|
|
field.label = L("lcl_usrrap_label_HOUR").format(field.label);
|
|
break;
|
|
case "D":
|
|
field.sql = "TRUNC(" + field_expression + ", 'DD')";
|
|
field.newtyp = "date";
|
|
groupbys.push(field_group || field.sql);
|
|
if (!field.fixedlabel)
|
|
field.label = L("lcl_usrrap_label_DAY").format(field.label);
|
|
break;
|
|
case "W":
|
|
field.sql = "TO_CHAR(" + field_expression + ", 'IYYY-IW')";
|
|
field.newtyp = "varchar";
|
|
groupbys.push(field_group || field.sql);
|
|
if (!field.fixedlabel)
|
|
field.label = L("lcl_usrrap_label_WEEK").format(field.label);
|
|
break;
|
|
case "M":
|
|
field.sql = "TO_CHAR(" + field_expression + ", 'YYYY-MM')";
|
|
field.newtyp = "varchar";
|
|
groupbys.push(field_group || field.sql);
|
|
if (!field.fixedlabel)
|
|
field.label = L("lcl_usrrap_label_MONTH").format(field.label);
|
|
break;
|
|
case "Q":
|
|
field.sql = "TO_CHAR(" + field_expression + ", 'YYYY-Q')";
|
|
field.newtyp = "varchar";
|
|
groupbys.push(field.sql || field.sql);
|
|
if (!field.fixedlabel)
|
|
field.label = L("lcl_usrrap_label_QUARTER").format(field.label);
|
|
break;
|
|
case "Y":
|
|
field.sql = "TO_CHAR(" + field_expression + ", 'YYYY')";
|
|
field.newtyp = "varchar";
|
|
groupbys.push(field_group || field.sql);
|
|
if (!field.fixedlabel)
|
|
field.label = L("lcl_usrrap_label_YEAR").format(field.label);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
for (var i=0; i < params.columns.length; i++)
|
|
{
|
|
var fld = params.columns[i];
|
|
var field = this.fields[fld];
|
|
if (!field)
|
|
shared.internal_error("Column {0} not found in report".format(fld));
|
|
if (field.dbs.match(/^hide_f/)) // Die willen we uiteindelijk niet zien
|
|
{
|
|
params.columns.splice(i, 1);
|
|
params.groupby.splice(i, 1);
|
|
i--;
|
|
}
|
|
}
|
|
|
|
// niveau 1: query voor de waarden uit de view plus eigen sql-expressies
|
|
//
|
|
var query = api2.sqlfields(params, this);
|
|
if (!query.selects.length)
|
|
abort_with_warning("No columns defined for report");
|
|
|
|
if ("addfixedfilters" in this)
|
|
this.addfixedfilters(params.filter);
|
|
var wheres = api2.sqlfilter(params, this);
|
|
|
|
if (params.filter.scf_cond == "on")
|
|
{
|
|
if (wheres.length)
|
|
wheres = ["(" + wheres.join(" OR ") + ")"];
|
|
}
|
|
|
|
if ("add3d" in this)
|
|
this.add3d(wheres);
|
|
|
|
query.wheres = query.wheres.concat(wheres);
|
|
|
|
var sql = "SELECT " + query.selects.join(", ")
|
|
+ " FROM " + query.tables.join(", ")
|
|
+ (query.wheres.length ? " WHERE " + query.wheres.join(" AND " ) : "")
|
|
|
|
// niveau 2: pas op niveau 1 eventuele aggregated functies toe.
|
|
//
|
|
// Dit moet op volgorde van params.columns, niet per se query.selects
|
|
// Gelukkig hebben we fields ondertussen al in de goede volgorde gezet
|
|
|
|
// query.selects bevat *echt* de velden in de sql
|
|
// die is gebaseerd op this.fields waarbij 'hidden' velden zijn uitgesloten
|
|
// elk veld heeft een 'sorting' property die aangeeft hoe je wilt sorteren.
|
|
// params.columns bevat de kolommen die we willen/gaan zien
|
|
var order = [];
|
|
var autosorting = true; // uitsluitend autosorting?
|
|
for (var fld in this.fields)
|
|
{
|
|
var field = this.fields[fld]
|
|
|
|
// Als er een kolom niet in de select aanwezig is (die we willen/gaan zien) dan deze kolom niet meenemen in de sortering.
|
|
var inselect = false;
|
|
for (var i = 0; i < params.columns.length; i++)
|
|
{
|
|
if (params.columns[i] === fld)
|
|
inselect = true;
|
|
}
|
|
|
|
if (inselect && field.sorting) // is er niet voor scf_count/scf_ratio
|
|
autosorting = autosorting && (field.sorting.id == 3)
|
|
}
|
|
|
|
if (autosorting)
|
|
{
|
|
for (var i=0; i < query.selects.length; i++)
|
|
{
|
|
var colname = query.selects[i].split(".").pop().toUpperCase(); // achterste stuk
|
|
if (!isclob[colname])
|
|
order.push(i+1);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
for (var fld in this.fields)
|
|
{
|
|
// Alleen de aangevinkte kolommen, die zijn meegegeven in de link (params.columns), aan de ORDER BY (order) toevoegen.
|
|
var found = false;
|
|
for (var j = 0; j < params.columns.length; j++)
|
|
{
|
|
found = found || (params.columns[j] == fld);
|
|
}
|
|
|
|
if (found && (!params.filter.distinct || (params.filter.distinct && (fld == params.filter.distinct))))
|
|
{
|
|
var field = this.fields[fld];
|
|
if (field.sorting && !isclob[field.dbs.toUpperCase()])
|
|
{
|
|
// Sortering op x-as of y-as gebeurt nu verder op.
|
|
// TODO: case 1 en 2 kunnen nu samen genomen worden.
|
|
switch (field.sorting.id)
|
|
{
|
|
case 1:
|
|
order.push(field.dbs);
|
|
break;
|
|
case 2:
|
|
order.push(field.dbs + " DESC");
|
|
break;
|
|
case 3: // Als er geen specifieke sortering voor een filter is gegeven moet dit veld wel in de order_by staan
|
|
if (params.filter.distinct)
|
|
order.push(field.dbs);
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (params.filter.distinct)
|
|
order.push(field.dbs);
|
|
}
|
|
}
|
|
}
|
|
|
|
// De parameters van orderby moeten ook in de groupby zitten. Ander krijg je de foutmelding "Geen GROUP BY-uitdrukking."
|
|
for (var i = 0; i < order.length; i++)
|
|
{
|
|
var found = false;
|
|
// strip DESC and ASC from orderby-fieldname
|
|
var orderstr = order[i].split(" ")[0];
|
|
for (var j = 0; j < groupbys.length; j++)
|
|
{
|
|
// remove a TO_CHAR expression to enable field - field comparison, preventing double group-by fields
|
|
var groupbystr = groupbys[j];
|
|
if (groupbys[j].indexOf("TO_CHAR(") > -1)
|
|
groupbystr = groupbys[j].replace("TO_CHAR(", "").split(",")[0];
|
|
else if (groupbys[j].indexOf("TRUNC(") > -1)
|
|
groupbystr = groupbys[j].replace("TRUNC(", "").split(",")[0];
|
|
else if (groupbys[j].indexOf("DISTINCT(") > -1)
|
|
groupbystr = groupbys[j].replace("DISTINCT(", "").split(")")[0];
|
|
else if (groupbys[j].indexOf("SUM(") > -1)
|
|
groupbystr = groupbys[j].replace("SUM(", "").split(")")[0];
|
|
else if (groupbys[j].indexOf("COUNT(") > -1)
|
|
groupbystr = groupbys[j].replace("COUNT(", "").split(")")[0];
|
|
else if (groupbys[j].indexOf("AVG(") > -1)
|
|
groupbystr = groupbys[j].replace("AVG(", "").split(")")[0];
|
|
found = found || (orderstr == groupbystr);
|
|
}
|
|
if (!found)
|
|
{ // De orderby waarde bestaat niet in de groupby array. Voeg de orderby waarde dan toe aan de groupby.
|
|
groupbys.push(orderstr)
|
|
}
|
|
}
|
|
}
|
|
|
|
if (groupbys.length && hasAggregate)
|
|
sql += " GROUP BY " + groupbys.join(", ");
|
|
|
|
if (order.length)
|
|
sql += " ORDER BY " + order.join(", ");
|
|
if (params.filter.limit > 0)
|
|
maxcnt = parseInt(params.filter.limit, 10);
|
|
else
|
|
var maxcnt = params.filter.showall == 1? S("qp_maxrows2"): (params.filter.ismobile? S("qp_maxrows_mobile") : S("qp_maxrows"));
|
|
if (params.filter.offset > 0)
|
|
maxcnt += parseInt(params.filter.offset, 10);
|
|
|
|
// Als er een url-key kolom op het eind aanwezig is dan deze kolom niet meetellen.
|
|
var urllink_index = params.urllink? params.urllink.index : -1;
|
|
if (params.filter.scf_pivot == 1)
|
|
{
|
|
if (params.columns.length < (2 + (urllink_index == -1? 0 : 1)))
|
|
shared.simpel_page(L("lcl_scf_pivot_needs_2cols"));
|
|
params.filter.nolimit = true;
|
|
}
|
|
else
|
|
{
|
|
if (params.filter.scf_sort > 0)
|
|
{
|
|
params.filter.nolimit = true;
|
|
}
|
|
}
|
|
|
|
var sql = "SELECT * FROM (" + sql + ")"
|
|
+ (params.filter.nolimit? "" : " WHERE ROWNUM <= " + (maxcnt + 1)); // Eentje extra om overflow-melding te triggeren in resultsettable
|
|
|
|
for (var fld in this.fields)
|
|
{ // Overrules voor groeperingen
|
|
this.fields[fld].typ = this.fields[fld].newtyp || this.fields[fld].typ;
|
|
}
|
|
params.errmsg = true; // Eventuele fout in query detecteren.
|
|
var json = api2.sql2json (params, sql, this);
|
|
|
|
// Als er een "Maximum aantal resultaten" is ingesteld, dan alleen het eerste *aantal* resultaten tonen afhankelijk waarbij de sortering de volgorde bepaald.
|
|
var usrrap_sort = model.sort.id; // Rapport "Sorteren op" (0=X-as, 1=Y-as oplopend, 2=Y-as aflopend).
|
|
var usrrap_maxresults = model.maxrows; // Rapport "Max. aantal regels".
|
|
|
|
if (params.filter.scf_pivot == 1) // Pivoteren!!!
|
|
{ // De laatste kolom beschouwen we als datacol die in de "cellen" komt
|
|
// De een-na-laatste kolom gaan we pivotteren naar kolomkoppen
|
|
|
|
// Als er een url-key kolom op het eind aanwezig is dan deze kolom niet meetellen.
|
|
var datacol = params.columns[params.columns.length - 1 - (urllink_index == -1? 0 : 1)];
|
|
var datagroup = params.groupby[params.groupby.length - 1 - (urllink_index == -1? 0 : 1)];
|
|
var pivotcol = params.columns[params.columns.length - 2 - (urllink_index == -1? 0 : 1)];
|
|
var urllinkcol = urllink_index > -1? params.columns[params.columns.length - 1] : null;
|
|
|
|
// Sortering op x-as(=0, laatste kolom) of y-as(=1 of 2, twee-na-laatste kolom (bijv. bedrag, aantal enz.))
|
|
var sortcol = params.columns[(params.columns.length - (urllink_index == -1? 0 : 1)) - (usrrap_sort == 0? 3 : 1)];
|
|
|
|
// Nog even de x-as (params.list.columns[0]) elementen bij elkaar zetten. Dan worden ze later allemaal samen genomen,
|
|
// en niet alleen de elementen die achter elkaar staan.
|
|
var xas_oms = params.columns[0];
|
|
for (var x = 1; x < json.length; x++)
|
|
{
|
|
for (var y = x; y < json.length; y++)
|
|
{
|
|
if (json[x-1][xas_oms] == json[y][xas_oms])
|
|
{
|
|
if (y != x)
|
|
// Verplaats array elementen: json.splice(naar, 0, json.splice(van, 1)[0])
|
|
json.splice(x, 0, json.splice(y, 1)[0]);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
var newdata = [];
|
|
var newrecord;
|
|
var teller;
|
|
var scf_urlkey;
|
|
for (var i = 0; i < json.length; i++)
|
|
{
|
|
var olddata = json[i];
|
|
var equal = !!newrecord;
|
|
// Is het huidige record nog gelijk aan het vorige record (exclusief pivotcol en datacol en eventueel url_key kolom)
|
|
for (var j = 0; equal && j < params.columns.length - 2 - (urllink_index == -1? 0 : 1); j++)
|
|
{
|
|
var col = params.columns[j];
|
|
equal = String(olddata[col]) == String(newrecord[col]); // Conversie naar String omdat date-objecten
|
|
// anders niet matchen
|
|
}
|
|
if (!equal)
|
|
{
|
|
if (newrecord)
|
|
{
|
|
newrecord.scf_urlkey = scf_urlkey;
|
|
newrecord.scf_subaantal = teller;
|
|
newdata.push(newrecord);
|
|
}
|
|
newrecord = {}; // Begin nieuwe regel in het rapport
|
|
scf_urlkey = {};
|
|
teller = 0;
|
|
// x-as regel toevoegen.
|
|
for (var k = 0; k < params.columns.length - 2 - (urllink_index == -1? 0 : 1); k++)
|
|
{
|
|
var col = params.columns[k];
|
|
newrecord[col] = olddata[col];
|
|
}
|
|
newrecord[datacol] = 0; // als datacol numeriek was bouw hier een regelsom.
|
|
}
|
|
newrecord[olddata[pivotcol]] = olddata[datacol];
|
|
scf_urlkey[olddata[pivotcol]] = olddata[urllinkcol];
|
|
newrecord[datacol] = newrecord[datacol] + olddata[datacol]; // Alle aantallen bij elkaar optellen in de regelsom.
|
|
teller++;
|
|
}
|
|
if (newrecord)
|
|
{
|
|
newrecord.scf_urlkey = scf_urlkey;
|
|
newrecord.scf_subaantal = teller;
|
|
newdata.push(newrecord);
|
|
}
|
|
|
|
// Nu de te tonen kolommen opnieuw opbouwen met de x-as + pivot kolommen.
|
|
|
|
// Originele pivotcol, datacol en eventueel url_key kolom verwijderen. Alleen de z-as (eerste) overhouden.
|
|
params.columns.splice(params.columns.length - 2 - (urllink_index == -1? 0 : 1), 2 + (urllink_index == -1? 0 : 1));
|
|
|
|
// Nieuwe pivot kolommen ook in fields toevoegen.
|
|
var pcolumns = getPivotColumns(this.fields, json, usrrap_sort);
|
|
|
|
// Nu de pivot kolommen toevoegen aan params.columns (Is referentie naar fac_reports.asp: scf_params.list.columns).
|
|
for (j=0; j< pcolumns.length; j++)
|
|
{
|
|
params.columns.push(pcolumns[j].colname);
|
|
this.fields[pcolumns[j].colname] = { label: safe.html(pcolumns[j].collabel)
|
|
, typ: this.fields[datacol].typ
|
|
};
|
|
if (this.fields[datacol].typ == "number" || this.fields[datacol].typ == "float" || this.fields[datacol].typ == "currency")
|
|
{
|
|
this.fields[pcolumns[j].colname].total = true;
|
|
}
|
|
}
|
|
|
|
// Een numerieke datacol voegen we (gesommeerd) achteraan alleen toe bij lijsten maar niet bij grafieken, daar laten we hem er af.
|
|
if (params.filter["scf_graph_type"] == 0 && params.filter["scf_cond"] != "on" &&
|
|
(this.fields[datacol].typ == "number" || this.fields[datacol].typ == "float" || this.fields[datacol].typ == "currency") &&
|
|
datagroup != 'A')
|
|
params.columns.push(datacol);
|
|
|
|
// Er kunnen x-waarden samengenomen zijn. Dan is total_count minder geworden.
|
|
this.total_count = usrrap_maxresults > 0 && usrrap_maxresults < newdata.length? usrrap_maxresults : newdata.length;
|
|
json = newdata;
|
|
}
|
|
else
|
|
{ // Sortering op x-as(=0, 1ste kolom) of y-as(=1 of 2, laatste kolom (bijv. bedrag, aantal enz.))
|
|
var sortcol = params.columns[usrrap_sort == 0? 0 : params.columns.length-1];
|
|
if (usrrap_maxresults > 0)
|
|
// Er is een maximum ingesteld.
|
|
this.total_count = usrrap_maxresults && usrrap_maxresults < this.total_count? usrrap_maxresults : this.total_count;
|
|
}
|
|
|
|
// Alleen sorteren als 1) de sortering op de y-as is (usrrap_sort > 0) OF
|
|
// 2) de sortering (op de x-as) oplopend of aflopend is (sorting.id < 3)
|
|
// Daarnaast is er geen sorting gedefinieerd bij aantal of percentage. Dit moet dus gecontroleerd worden
|
|
if (usrrap_sort > 0 || (sortcol && model.fields[sortcol].sorting && model.fields[sortcol].sorting.id < 3))
|
|
{ // Sortering op de x-as of y-as oplopend of aflopend.
|
|
var oplopend = (usrrap_sort == 1) || // Y-as oplopend.
|
|
(usrrap_sort == 0 && model.fields[sortcol].sorting.id == 1); // X-as oplopend.
|
|
json.sort(usrrap.compareValues(sortcol, (oplopend? "asc" : "desc")));
|
|
}
|
|
// else Sorting x-as automatisch. Wordt geregeld door de query.
|
|
|
|
// Voor de inhoud van de filter velden (fac_report_worker.asp) wordt showall meegegeven en moeten alle resultaten worden weergegeven. De instelling usrrap_maxresults heeft dan geen invloed.
|
|
if (!params.filter.showall && usrrap_maxresults && json.length > usrrap_maxresults)
|
|
// Er is een maximum ingesteld.
|
|
json.splice(usrrap_maxresults, json.length - usrrap_maxresults);
|
|
|
|
// Filterwaarden van de rapportages verzamelen. Filter parameters kunnen dan aan overzicht meegegeven worden zodat ze ook in de printafdruk worden vermeld.
|
|
json.filterstring = {};
|
|
var filterstring = json.filterstring;
|
|
var filter = params.filter;
|
|
for (var flt in filter)
|
|
{ // Ik heb nu een parameter die is doorgegeven.
|
|
// Alleen als een filterveld aanwezig is, wordt die parameter doorgegeven. Alleen dan is field gedefinieerd.
|
|
var l_flt = flt;
|
|
if (flt.substr(0, 6) == "start_")
|
|
l_flt = flt.substr(6);
|
|
else if (flt.substr(0, 4) == "end_")
|
|
l_flt = flt.substr(4);
|
|
var field = this.fields[l_flt];
|
|
if (field && (!field.filterdefault || field.filterdefault.substr(0,2) != ":!")) // do not show fixed fields in header
|
|
{ // Field is gedefinieerd, dan is het een parameter van een filterveld.
|
|
|
|
|
|
// Bij date of datetime filters wordt er bij het label " Van" en " Tot" achter geplakt.
|
|
var vantot = "";
|
|
var startend = "";
|
|
if (flt.substr(0, 6) == "start_")
|
|
{
|
|
vantot = " " + L("lcl_from");
|
|
startend = "start_";
|
|
}
|
|
else if (flt.substr(0, 4) == "end_")
|
|
{
|
|
vantot = " " + L("lcl_to");
|
|
startend = "end_";
|
|
}
|
|
|
|
var llabel;
|
|
var lval;
|
|
switch (field.orgtyp)
|
|
{
|
|
case "date": if (filter[flt] == "")
|
|
lval = "";
|
|
else
|
|
{
|
|
if (typeof filter[flt] === "string")
|
|
lval = new Date(parseInt(filter[flt], 10));
|
|
else
|
|
lval = filter[flt];
|
|
|
|
lval = toDateString(lval);
|
|
}
|
|
llabel = "fclt_f_" + startend + field.orglabel + vantot;
|
|
break;
|
|
case "datetime": if (filter[flt] == "")
|
|
lval = "";
|
|
else
|
|
{
|
|
if (typeof filter[flt] === "string")
|
|
lval = new Date(parseInt(filter[flt], 10));
|
|
else
|
|
lval = filter[flt];
|
|
|
|
lval = toDateTimeString(lval);
|
|
}
|
|
llabel = "fclt_f_" + startend + field.orglabel + vantot;
|
|
break;
|
|
default: lval = filter[flt];
|
|
if (typeof lval == "object")
|
|
{
|
|
for (var i in lval)
|
|
{ // De lege waarden die "NULL" zijn, de text van de lcl "lcl_shared_empty" geven,
|
|
// zodat deze filterwaarde in het filterblok als lege waarde wordt weergegeven.
|
|
if (lval[i] == "NULL")
|
|
lval[i] = L("lcl_shared_empty");
|
|
}
|
|
}
|
|
else if (lval == "NULL")
|
|
lval = L("lcl_shared_empty");
|
|
llabel = "fclt_f_" + startend + field.orglabel + vantot;
|
|
}
|
|
|
|
// Als lval uit meerdere waarden bestaat dan is lval een object (array).
|
|
if (typeof lval == "object")
|
|
lval = lval.join(", ");
|
|
filterstring[llabel] = lval;
|
|
}
|
|
}
|
|
|
|
// De filterwaarden van de rapportage zitten nu in json.filterstring.
|
|
return json;
|
|
};
|
|
%> |