Files
Facilitor/APPL/FAC/fac_usrrap.inc
Jos Groot Lipman 046429d320 FSN#31698 Rapportgenerator
Verder verwerkt dat model.field geen array maar een object is tegenwoordig
Vertaalbaarheid userrap kolommen verder uitgewerkt

svn path=/Website/trunk/; revision=24428
2015-03-12 19:25:20 +00:00

322 lines
14 KiB
C++

<% /*
$Revision$
$Id$
File: fac_usrrap.inc (voorheen Where3d.inc)
Description: Handige functies voor de usrrap's
defines function for Build WHERE-clause for the report to apply 3D autorization
Globals:
p_tableName The selected FAC_USR_REPORT name
Result: returns where3D clause
Context:
Note: When FAC_FUNCTIE.FAC_FUNCTIE_DISCIPLINE==1 column FCLT_3D_DISCIPLINE_KEY
will be filtered in the view (when [present)
When '8'-bit set in FAC_FUNCTIE.FAC_FUNCTIE_MIN_LEVEL then
column FCLT_3D_LOCATIE_KEY will be filtered in the view (when [present)
When '4'-bit set in FAC_FUNCTIE.FAC_FUNCTIE_MIN_LEVEL then
column FCLT_3D_AFDELING_KEY will be filtered in the view (when [present)
So care must be taken in selecting the appropriate FAC_FUNCTIE!
Independent from bitsettings allow filtering on FCLT_3D_USER_KEY
*/
usrrap = {
create3Dclause: function (ptableName, fac_functie_key)
{
if (!fac_functie_key)
return "";
var sql;
sql = "SELECT FAC_FUNCTIE_CODE, FAC_FUNCTIE_MIN_LEVEL, FAC_FUNCTIE_DISCIPLINE"
sql += " FROM FAC_FUNCTIE F "
sql += " WHERE F.FAC_FUNCTIE_KEY = " + fac_functie_key;
var oRs = Oracle.Execute(sql)
var where3D = "" // Default no autorization
var autfunction = oRs("FAC_FUNCTIE_CODE").Value;
var bMetALGAuth = (oRs("FAC_FUNCTIE_MIN_LEVEL") & 8) == 8;
var bMetPRSAuth = (oRs("FAC_FUNCTIE_MIN_LEVEL") & 4) == 4;
var bMetDiscipline = (oRs("FAC_FUNCTIE_DISCIPLINE")=="1");
var has3D_INS = false;
var has3D_LOC = false;
var has3D_BLD = false;
var has3D_PRS = false;
var has3D_USR = false;
// Check for our special 3D column names
sql = "SELECT INITCAP(column_name) column_name"
+ " FROM user_tab_columns"
+ " WHERE table_name = " + safe.quoted_sql_upper(ptableName)
+ " AND column_name LIKE 'FCLT_3D_%'"
+ " ORDER BY COLUMN_ID";
var oRsCol = Oracle.Execute(sql);
var column_name;
while (!oRsCol.eof)
{
column_name = (oRsCol.Fields("column_name").Value).toUpperCase();
if (column_name.substring(0,7) == "FCLT_3D")
{
has3D_INS = has3D_INS || column_name == "FCLT_3D_DISCIPLINE_KEY"
has3D_LOC = has3D_LOC || column_name == "FCLT_3D_LOCATIE_KEY"
has3D_BLD = has3D_BLD || column_name == "FCLT_3D_GEBOUW_KEY"
has3D_PRS = has3D_PRS || column_name == "FCLT_3D_AFDELING_KEY"
has3D_USR = has3D_USR || column_name == "FCLT_3D_USER_KEY"
}
oRsCol.MoveNext();
}
__Log("autfunction="+autfunction+", MIN_LEVEL="+oRs("FAC_FUNCTIE_MIN_LEVEL")+", FUNCTIE_DISCIPLINE="+oRs('FAC_FUNCTIE_DISCIPLINE'))
__Log("bMetALGAuth="+bMetALGAuth+", bMetPRSAuth="+bMetPRSAuth+", bMetDiscipline="+bMetDiscipline)
__Log("Column names: has3D_LOC="+has3D_LOC+", has3D_PRS="+has3D_PRS+", has3D_INS="+has3D_INS + ", has3D_USR="+has3D_USR)
var authparams = user.checkAutorisation(autfunction);
if (has3D_INS && bMetDiscipline)
{
var disciplines = "";
sql = "SELECT ins_discipline_key FROM fac_v_my_disciplines "
+ " WHERE fac_functie_code = "+safe.quoted_sql(autfunction)
+ " AND prs_perslid_key="+user_key;
oRs = Oracle.Execute(sql);
while (!oRs.Eof) {
if (disciplines == "") disciplines = oRs("INS_DISCIPLINE_KEY").value;
else disciplines += ", " + oRs("INS_DISCIPLINE_KEY").value;
oRs.MoveNext();
}
if (disciplines == "") disciplines = "-1"
where3D = " FCLT_3D_DISCIPLINE_KEY IN (" + disciplines + ")";
}
if (has3D_LOC && bMetALGAuth && authparams.ALGreadlevel > 0)
{
if (where3D != "") where3D += " AND "
where3D += " FCLT_3D_LOCATIE_KEY IN"
+ "(SELECT alg_locatie_key FROM fac_v_my_locations "
+ " WHERE niveau ="+authparams.ALGreadlevel
+ " AND prs_perslid_key="+user_key+")"
}
if (has3D_BLD && bMetALGAuth && authparams.ALGreadlevel > 0)
{
if (where3D != "") where3D += " AND "
where3D += " FCLT_3D_GEBOUW_KEY IN"
+ "(SELECT alg_gebouw_key FROM fac_v_my_buildings "
+ " WHERE niveau ="+authparams.ALGreadlevel
+ " AND prs_perslid_key="+user_key+")"
}
if (has3D_PRS && bMetPRSAuth && authparams.PRSreadlevel > 0)
{
if (where3D != "") where3D += " AND "
where3D += " 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 = " + authparams.PRSreadlevel + "))"
}
if (has3D_USR )
{
if (where3D != "") where3D += " AND "
where3D += " FCLT_3D_USER_KEY = " + user_key
}
return where3D;
},
// Aborts als pcolname geen filtercol is van ptableName!
requireFilterCol: function _requireFilterCol(ptableName, pcolname)
{
// deze check even vrij laten voor infobord 'misbruik'
// het is ook amper een lek te noemen omdat je er alleen de dataset
// verder kunt beperken dat het systeem al doet.
// if (pcolname.toUpperCase().substr(0, 7) != 'FCLT_F_')
// shared.internal_error("Invalid filter column name");
// mbmb
var i = ptableName.indexOf('.');
if (i != -1){
ptableName = ptableName.substring(i+1);
}
var sql = "SELECT 1"
+ " FROM user_tab_columns"
+ " WHERE table_name = " + safe.quoted_sql_upper(ptableName)
+ " AND column_name = " + safe.quoted_sql_upper(pcolname);
var oRs = Oracle.Execute(sql);
if (oRs.Eof)
shared.internal_error("Invalid filter column name");
oRs.Close()
},
// Bepaal de naam van de equivalente getabelliseerde view, en controleer ook of die bestaat
// Zo niet, dan krijg je gewoon de viewnaam terug
tabelizedViewname: function (pviewname)
{
var lviewname = "";
if (typeof pviewname == 'string')
lviewname = 'T_'+pviewname.substring(0,28);
// controleer of die echt bestaat
var sql = "SELECT 1"
+ " FROM user_tables"
+ " WHERE table_name = " + safe.quoted_sql_upper(lviewname);
var oRs = Oracle.Execute(sql);
if (oRs.Eof) {
lviewname = pviewname; // bestaat niet (job niet gescheduled of ORA-1031 ?)
__DoLog('<p style="color:red">tabelized view bestaat niet, check de tabelizer-job</p>');
}
oRs.Close()
return lviewname;
},
// We kennen (helaas) drie varianten om de info van de kolommen te bepalen
// A) Opzoeken viewnaam in Oracle user_tab_columns. Dit is heel efficient maar wel beperkt in de typering
// B) Openen Recordset en uit de ADO properties halen. Potentieel traag (is deze versie echt nog nodig?)
// C) (nieuw) uit FAC_USRRAP_COLS handmatig gespecificeerd
fac_usrrap_info: function (usrrap_key)
{
var sql = "SELECT "+lcl.xsqla('fac_usrrap_info','fac_usrrap_key')
+ " , "+lcl.xsqla('fac_usrrap_omschrijving', 'fac_usrrap_key')
+ " , fac_usrrap_vraagbegindatum"
+ " , fac_usrrap_vraageinddatum"
+ " , fac_usrrap_view_name"
+ " , fac_functie_key"
+ " , fac_usrrap_functie"
+ " FROM fac_usrrap"
+ " WHERE fac_usrrap_key = " + usrrap_key;
var oRs = Oracle.Execute(sql);
var result = { info : oRs.Fields("fac_usrrap_info").value,
omschrijving : oRs.Fields("fac_usrrap_omschrijving").value,
vraagbegindatum: oRs.Fields("fac_usrrap_vraagbegindatum").value=="1",
vraageinddatum: oRs.Fields("fac_usrrap_vraageinddatum").value=="1",
view_name: oRs.Fields("fac_usrrap_view_name").value,
fac_functie_key: oRs.Fields("fac_functie_key").value,
functie: oRs.Fields("fac_usrrap_functie").value,
columns: []
}
oRs.Close();
var sql = "SELECT *"
+ " FROM fac_usrrap_cols"
+ " WHERE fac_usrrap_key = " + usrrap_key
+ " ORDER BY fac_usrrap_cols_volgnr";
var oRs = Oracle.Execute(sql);
if (!oRs.Eof)
{
while (!oRs.eof)
{
var colpar = {
id: oRs("fac_usrrap_cols_key").Value,
caption: oRs("fac_usrrap_cols_caption").Value,
column_name: oRs("fac_usrrap_cols_column_name").Value,
datatype: oRs("fac_usrrap_cols_datatype").Value,
group: oRs("fac_usrrap_cols_group").Value==1,
filter: oRs("fac_usrrap_cols_filter").Value, // 'A'=Automatic
sequence: oRs("fac_usrrap_cols_volgnr").Value,
align: null,
visible: 'V'
};
result.columns.push(colpar);
oRs.MoveNext()
}
oRs.Close();
}
else // Oldstyle uit user_tab_columns afleiden
{
oRs.Close();
// Stored procedures zijn XXXX.RAP_YYYYY
result.view_name_short = result.view_name;
var i = result.view_name_short.indexOf('.');
if (i != -1)
result.view_name_short = result.view_name_short.substring(i+1);
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(result.view_name_short) + ")"
+ " ORDER BY column_id";
var oRs = Oracle.Execute(sql);
while (!oRs.eof)
{
var colpar = { caption: oRs.Fields("column_name").Value,
column_name: oRs.Fields("column_name").Value.toLowerCase(),
datatype: null,
group: 'G',
align: null,
visible: 'V',
filter: null
};
var special_cols = colpar.column_name.toUpperCase().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);
var ucolname = colpar.column_name.toUpperCase();
if (ucolname.match(/^(HIDE_F_|FCLT_X_|FCLT_3D_|FCLT_KEY)/))
colpar.visible = 'H'; // Hidden
if (result.view_name_short.match(/_V_UDR/))
colpar.visible = 'H'; // Hidden, die hebben te veel kolommen
if (ucolname.match(/^(FCLT_F_|FCLT_D_)/))
colpar.filter = 'A';
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_F_|FCLT_X_")) // Filter, altijd varchar
{
colpar.filter = 'A';
}
else 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';
colpar.align = "right"
}
}
else if (ora_type == "DATE") //
{
colpar.datatype = 'date';
}
else if (ucolname.match("^FCLT_D_"))
{
result.vraagbegindatum = true;
result.vraageinddatum = true;
// colpar.datatype = 'date'; neen, het is char
}
result.columns.push(colpar);
oRs.MoveNext();
}
oRs.Close();
}
return result;
}
}
%>