<% /* $Revision$ $Id$ File: model_report_columns.inc Description: rapport model voor de kolommen van rapporten. Parameters: Context: Notes: */ // model_reportcolumns is uitsluitend beschikbaar onder model_reports(x) die de autorisatie dan ook doet function model_reportcolumns(usrrap_key, params) { params = params || {}; this.table = "fac_usrrap_cols"; this.primary = "fac_usrrap_cols_key"; this.records_name = "columns"; this.record_name = "column"; this.records_title = L("lcl_rap_columns"); this.record_title = L("lcl_rap_column"); this.autfunction = "WEB_PRSSYS", this.edit = { modal: true }; this.fields = { "id" : { dbs: "fac_usrrap_cols_key", typ: "key", filter: "exact", seq: "fac_s_fac_usrrap_cols_key" }, "name" : { dbs: "fac_usrrap_cols_column_name", typ: "varchar", label: L("lcl_rap_column"), insertonly: true }, "datatype" : { dbs: "fac_usrrap_cols_datatype", typ: "varchar", label: L("lcl_rap_datatype"), required: true, LOV: L("lcl_rap_datatypeLOV")}, // "varchar;Tekst;date;Datum;datetime;Datumtijd;float;Float;currency;Bedrag;number;Getal" "sequence" : { dbs: "fac_usrrap_cols_volgnr", typ: "number", label: L("lcl_rap_sequence") }, "caption" : { dbs: "fac_usrrap_cols_caption", typ: "varchar", label: L("lcl_rap_caption"), translate: true}, "filter" : { dbs: "fac_usrrap_cols_filter", typ: "varchar", label: L("lcl_rap_filter"), LOV: L("lcl_rap_filterLOV") }, // "A;Automatisch" "filterdefault": { dbs: "fac_usrrap_cols_filterdefault", typ: "varchar", label: L("lcl_rap_filterdefault")}, "visible" : { dbs: "fac_usrrap_cols_visible", typ: "varchar", label: L("lcl_rap_visible"), required: true, LOV: L("lcl_rap_visibleLOV")}, // "V;Visible;I;Invisible;H;hidden" "group" : { dbs: "fac_usrrap_cols_group", typ: "varchar", label: L("lcl_rap_groupby"), required: true, LOV: L("lcl_rap_groupbyLOV") }, "fac_usrrap_key" : { dbs: "fac_usrrap_key", typ: "key" } }; this.list = { columns: ["sequence", "name", "caption", "datatype", "visible", "filter", "group"] }; this.hook_pre_edit = function (obj) { this.fields.filter.LOV = api2.filterLOV(L("lcl_rap_filterLOV"), "A,E,R"); // De meesten mogen L(ike) niet if (obj.datatype) { switch (obj.datatype.id) { case "date": case "datetime": this.fields.group.LOV = api2.filterLOV(L("lcl_rap_groupbyLOV"), "G,D,W,M,Q,Y,H"); this.fields.datatype.LOV = api2.filterLOV(L("lcl_rap_datatypeLOV"), "date,datetime,time"); break; case "time": this.fields.group.LOV = api2.filterLOV(L("lcl_rap_groupbyLOV"), "G,H"); this.fields.datatype.LOV = api2.filterLOV(L("lcl_rap_datatypeLOV"), "date,datetime,time"); break; case "varchar": this.fields.group.LOV = api2.filterLOV(L("lcl_rap_groupbyLOV"), "G"); this.fields.datatype.readonly = true; this.fields.filter.LOV = L("lcl_rap_filterLOV"); // die mag alle filters break; case "html": this.fields.group.LOV = api2.filterLOV(L("lcl_rap_groupbyLOV"), "G"); this.fields.datatype.readonly = true; this.fields.filter.LOV = L("lcl_rap_filterLOV"); break; case "float": case "number": case "currency": this.fields.group.LOV = api2.filterLOV(L("lcl_rap_groupbyLOV"), "G,S,C,A"); this.fields.datatype.LOV = api2.filterLOV(L("lcl_rap_datatypeLOV"), "float,currency,number"); break; default: this.fields.group.LOV = api2.filterLOV(L("lcl_rap_groupbyLOV"), "G"); } } }; // Maakt de default fac_usrrap_cols records aan aan de hand van de view of werk ze bij this._view2columns = function (usrrap_key, lastrefresh, oldcols) { var sql = "SELECT fac_usrrap_view_name" + " FROM fac_usrrap" + " WHERE fac_usrrap_key = " + usrrap_key; var oRs = Oracle.Execute(sql); var view_name = oRs("fac_usrrap_view_name").Value; oRs.Close(); // Rapport kan ook zijn XXXX.RAP_YYYYY? var view_name_short = view_name; var i = view_name_short.indexOf('.'); if (i != -1) view_name_short = view_name_short.substring(i+1); var sql = "SELECT object_name, object_type, last_ddl_time" + " FROM user_objects" + " WHERE object_type = 'VIEW'" + " AND object_name = UPPER(" + safe.quoted_sql(view_name_short) + ")"; var oRs = Oracle.Execute(sql); if (oRs.Eof) abort_with_warning("Unable to determine columns for report view '{0}'!".format(view_name_short)); var view_ddl_time = new Date(oRs("last_ddl_time").Value); oRs.Close(); var mustRefresh = (oldcols.length == 0 || !lastrefresh || view_ddl_time > lastrefresh); if (!mustRefresh) return; var sequence = 10; var sql = "SELECT INITCAP(column_name) column_name" + " , data_type" + " , data_length" + " , data_precision" + " , data_scale" + " FROM user_tab_columns" + " WHERE table_name = UPPER(" + safe.quoted_sql(view_name_short) + ")" + " ORDER BY column_id"; var oRs = Oracle.Execute(sql); var newcols = []; while (!oRs.eof) { var colname = oRs.Fields("column_name").Value.toLowerCase(); var colpar = { caption: oRs.Fields("column_name").Value, // Met de initcap name: colname, datatype: "varchar", group: 'G', sequence: sequence, visible: 'V', filter: null }; sequence += 10; var ucolname = colname.toUpperCase(); var special_cols = ucolname.match(/^(HIDE_F_|FCLT_X_|FCLT_3D_|FCLT_KEY|FCLT_F_|HTML_|FCLT_D_|FCLT_C_)/); if (special_cols) colpar.caption = colpar.caption.substring(special_cols[0].length); colpar.caption = colpar.caption.replace(/\_/g, " "); // underscores er uit if (ucolname.match(/^(HIDE_F_|FCLT_3D_|FCLT_KEY)/)) colpar.visible = 'H'; // Hidden if (ucolname.match(/^(FCLT_X_)/)) colpar.visible = 'I'; // Invisible, je mag hem wel aanzetten if (view_name_short.match(/_V_UDR/)) colpar.visible = 'H'; // Hidden, die hebben te veel kolommen if (ucolname.match(/^(FCLT_F_|FCLT_X_)/)) colpar.filter = 'A'; if (ucolname.match(/^(FCLT_D_)/)) colpar.filter = 'R'; // Altijd range var ora_type = oRs("data_type").Value; var ora_length = oRs("data_length").Value; var ora_precision = oRs("data_precision").Value; var ora_scale = oRs("data_scale").Value; if (ucolname.match("^FCLT_C_")) // Currency { colpar.datatype = 'currency'; } else if (ucolname.match("^HTML_")) { colpar.datatype = 'html'; } else if (ora_type == 'NUMBER') { colpar.datatype = 'number'; if (ora_scale > 0) { colpar.datatype = 'float'; } } else if (ora_type == "DATE") // { colpar.datatype = 'date'; } newcols.push(colpar); oRs.MoveNext(); } oRs.Close(); // Vervallen kolommen for (var o = 0; o < oldcols.length; o++) { var found = false; for (var n = 0; !found && n < newcols.length; n++) { if (newcols[n].name == oldcols[o].name) found = true; } if (!found) { __Log("Dropping column {0}".format(oldcols[o].name)); // We kennen geen REST_DELETE var sql = "DELETE fac_usrrap_cols" + " WHERE fac_usrrap_cols_key = " + oldcols[o].id; Oracle.Execute(sql); } } // Nieuwe en gewijzigde kolommen for (var n = 0; n < newcols.length; n++) { var found = false; for (var o = 0; !found && o < oldcols.length; o++) { if (newcols[n].name == oldcols[o].name) { found = true; if (newcols[n].datatype != oldcols[o].datatype.id) { __Log("Updating datatype column {0} to {1}".format(oldcols[o].name, newcols[n].datatype)); this.REST_PUT({}, { datatype: newcols[n].datatype }, oldcols[o].id) } } } if (!found) { __Log("Adding column {0}".format(newcols[n].name)); var params = { internal: true }; this._REST_POST(params, newcols[n], usrrap_key); // internal _REST_POST is er altijd } } // update lastrefresh. reports.REST_PUT is mij te kritisch op rechten var sql = "UPDATE fac_usrrap" + " SET fac_usrrap_col_refresh = SYSDATE" + " WHERE fac_usrrap_key = " + usrrap_key; Oracle.Execute(sql); }, this.REST_GET = function _GET(params) { // De modal detail popup gebruikt dit echter nog wel var query = api2.sqlfields(params, this ); var wheres = api2.sqlfilter(params, this); query.wheres = query.wheres.concat(wheres); var sql = "SELECT " + query.selects.join(", ") + " FROM " + query.tables.join(", ") + " WHERE " + query.wheres.join(" AND " ) + " ORDER BY fac_usrrap_cols_volgnr"; var json = api2.sql2json (params, sql, this ); if (!json.length) { INTERNAL_ERROR_MISSING_COLUMNS; } return json; }; this.REST_PUT = function (params, jsondata, the_key) /* update columns */ { var dbfields = api2.update_fields(params, this, jsondata); // Build updater var sql = buildUpdate("fac_usrrap_cols", dbfields, { noValidateToken: true }) + " fac_usrrap_cols_key = " + the_key; var err = Oracle.Execute(sql, true); if (err.friendlyMsg) abort_with_warning(err.friendlyMsg); return { key: the_key }; }, // Only internally used by report_clone and _view2columns this._REST_POST = function (params, jsondata, parent_key) /* insert columns */ { var dbfields = api2.update_fields(params, this, jsondata); // Build updater dbfields["id"] = this.fields["id"]; dbfields["xxx"] = { dbs: "fac_usrrap_key", typ: "key", val: parent_key }; var rapIns = buildInsert("fac_usrrap_cols", dbfields, { noValidateToken: true }); var col_key = rapIns.sequences["fac_usrrap_col_key"]; var err = Oracle.Execute(rapIns.sql, true); if (err.friendlyMsg) abort_with_warning(err.friendlyMsg); return { key: col_key, warning: "" }; } // REST_DELETE: not supported if (params.internal) { this.REST_POST = this._REST_POST; // Voor de clone-report } } %>