Files
Facilitor/APPL/Shared/get_objecten_sql.inc
Jos Groot Lipman fc2d0a1be1 MNNL#41309 Meldingen op meerdere disciplines: performance
svn path=/Website/trunk/; revision=36706
2018-01-24 12:26:17 +00:00

227 lines
10 KiB
C++

<% /*
$Revision$
$Id$
File: get_objecten_sql.inc
Parameters:
Context: Vanuit ins EN mld
*/
function get_objecten_sql(alg_key, alg_niveau, prs_key, dept_key, stdmld_key)
{
// Het aantal objecten kan ook ingeperkt worden door mld_stdmelding_srtinst.ins_srtinstallatie_key
var sql = "";
var first_time = true;
sql = "SELECT msi.ins_srtinstallatie_key"
+ " , msi.ins_srtinstallatie_niveau"
+ " , msm.alg_org_obj_niveau"
+ " FROM mld_stdmelding msm"
+ " , mld_stdmelding_srtinst msi"
+ " WHERE msm.mld_stdmelding_key = msi.mld_stdmelding_key(+)"
+ " AND msm.mld_stdmelding_key = " + stdmld_key;
oRs = Oracle.Execute(sql);
while (!oRs.eof || first_time)
{
var inst_key = (oRs("ins_srtinstallatie_key").Value ? oRs("ins_srtinstallatie_key").Value : -1);
var inst_type = (oRs("ins_srtinstallatie_niveau").Value ? oRs("ins_srtinstallatie_niveau").Value : "");
var org_obj_niveau = (oRs("alg_org_obj_niveau").Value ? oRs("alg_org_obj_niveau").Value : 9);
var obj_niveau_sql = get_obj_niveau_sql(org_obj_niveau, prs_key, dept_key);
var alg_niveau_sql = get_alg_niveau_sql(alg_niveau, alg_key);
var gebouw_persoon_sql = get_gebouw_persoon_sql(alg_niveau, alg_key, prs_key);
var afdeling_persoon_sql = get_afdeling_persoon_sql(dept_key, prs_key);
var stdmelding_where = get_stdmelding_where(inst_type, inst_key);
var afdelingsobjecten = (org_obj_niveau < 9 || prs_key != -1 || (dept_key && dept_key > 0));
var melding_sql = get_stdmelding_sql(alg_niveau_sql, obj_niveau_sql, gebouw_persoon_sql, afdeling_persoon_sql, stdmelding_where, afdelingsobjecten);
if (first_time)
{
sql = melding_sql;
first_time = false;
}
else
{
sql += " UNION " + melding_sql;
}
oRs.MoveNext();
}
oRs.Close();
sql += " ORDER BY 2";
return sql;
}
function get_obj_niveau_sql(p_org_obj_niveau, p_prs_key, p_dept_key)
{
var v_obj_niveau_sql = "";
if (p_org_obj_niveau < 9)
{ // Autlevel is het afdelingsobjecten niveau (stdmelding.alg_org_obj_niveau) van waaruit objecten gekozen kunnen worden (null=alle, 0=bedrijf, ...., 9=geen).
var autlevel = p_org_obj_niveau;
if (autlevel == 0)
var departmentsql = "SELECT a.prs_afdeling_key"
+ " FROM prs_v_afdeling a"
+ " WHERE a.prs_bedrijf_key = " + user.afdeling().prs_bedrijf_key();
else if (autlevel > 0)
var departmentsql = "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 = " + autlevel + ")"
+ " AND a.prs_afdeling_key = d.ins_alg_ruimte_key";
else
var departmentsql = "d.ins_alg_ruimte_key";
v_obj_niveau_sql = " (ins_alg_ruimte_type = 'A' AND d.ins_alg_ruimte_key IN (" + departmentsql + "))"
+ (p_prs_key != -1 || (p_dept_key && p_dept_key > 0)? " OR" : "");
}
return v_obj_niveau_sql;
}
function get_alg_niveau_sql(p_alg_niveau, p_alg_key)
{
var v_alg_niveau_sql = " (1 = 0)";
if (p_alg_niveau == "R" || p_alg_niveau == "V" || p_alg_niveau == "G" || p_alg_niveau == "L")
{
// In welke ruimtes keuren we objecten goed?
var roomsql = "SELECT -1 FROM DUAL";
if (p_alg_niveau == "R")
roomsql = "SELECT " + p_alg_key + " FROM DUAL";
else if (p_alg_niveau == "V")
roomsql = "SELECT alg_ruimte_key"
+ " FROM alg_ruimte"
+ " WHERE alg_verdieping_key = " + p_alg_key;
else if (p_alg_niveau == "G") // en !isTerra?
roomsql = "SELECT alg_ruimte_key"
+ " FROM alg_ruimte ar"
+ " , alg_verdieping av"
+ " WHERE ar.alg_verdieping_key = av.alg_verdieping_key"
+ " AND alg_gebouw_key = " + p_alg_key;
else if (p_alg_niveau == "L") // en !isTerra?
roomsql = "SELECT alg_ruimte_key"
+ " FROM alg_ruimte ar"
+ " , alg_verdieping av"
+ " , alg_gebouw ag"
+ " WHERE ar.alg_verdieping_key = av.alg_verdieping_key"
+ " AND av.alg_gebouw_key = ag.alg_gebouw_key"
+ " AND alg_locatie_key = " + p_alg_key;
v_alg_niveau_sql = " (ins_alg_ruimte_type = 'R' AND ins_alg_ruimte_key IN (" + roomsql + "))"
+ " OR (ins_alg_ruimte_type = 'W' AND ins_alg_ruimte_key IN"
+ " (SELECT prs_werkplek_key FROM prs_werkplek "
+ " WHERE prs_alg_ruimte_key IN (" + roomsql + ")))";
}
return v_alg_niveau_sql;
}
function get_gebouw_persoon_sql(p_alg_niveau, p_alg_key, p_prs_key)
{
var v_gebouw_persoon = ( p_alg_niveau == "G" // Gebouw kan ook een Terrein zijn
? " OR (ins_alg_ruimte_type = 'T' AND ins_alg_ruimte_key = " + p_alg_key + ")"
: ""
)
+ ( p_prs_key != -1
? " OR (ins_alg_ruimte_type = 'P' AND ins_alg_ruimte_key = " + p_prs_key + ")"
: ""
);
return v_gebouw_persoon;
}
function get_afdeling_persoon_sql(p_dept_key, p_prs_key)
{
var v_afdeling_persoon = ( p_dept_key && p_dept_key > 0
? " (ins_alg_ruimte_type = 'A' AND ins_alg_ruimte_key = " + p_dept_key + ")"
: "")
+ ( p_prs_key != -1
? " (ins_alg_ruimte_type = 'P' AND ins_alg_ruimte_key = " + p_prs_key + ")"
+ (p_dept_key && p_dept_key > 0? " OR" : "")
: "");
return v_afdeling_persoon;
}
function get_stdmelding_sql(p_alg_niveau_sql, p_obj_niveau_sql, p_gebouw_persoon_sql, p_afdeling_persoon_sql, p_stdmelding_where, p_afdelingsobjecten)
{
var plaatsaanduiding = ( S("prs_wpprefix_objectid") == 1
? " CASE"
+ " WHEN o.prs_werkplek_omschrijving IS NOT NULL"
+ " THEN ' ' || o.prs_werkplek_omschrijving"
+ " ELSE ''"
+ " END"
: "''");
// JGL: bovenstaande even uitgeschakeld en ins_v_alg_overzicht niet meer joinen
// !!! Dat joinen nekte de performance namelijk. Bovendien toch overkill voor uitsluitend een prs_werkplek_omschrijving
plaatsaanduiding = ", d.ins_deel_omschrijving || " /* weggehaald + plaatsaanduiding */
+ " || ' (' || " + lcl.xsql("s.ins_srtdeel_omschrijving", "s.ins_srtdeel_key")
+ " || ') ' || d.ins_deel_opmerking deel";
var sql = "SELECT d.ins_deel_key"
+ plaatsaanduiding
+ " , d.ins_alg_ruimte_key"
+ " , d.ins_alg_ruimte_type"
+ " , a.alg_ruimte_nr" // JGL: Ik vermoed dat deze effectief niet gebruikt wordt
+ " , CASE"
+ " WHEN d.ins_deel_t_uitvoertijd.eenheid = 'U'"
+ " THEN d.ins_deel_t_uitvoertijd.tijdsduur / 24"
+ " ELSE d.ins_deel_t_uitvoertijd.tijdsduur"
+ " END uitvoertijd" // Uitvoertijd in dagen.
+ " FROM ins_v_aanwezigdeel d"
+ " , alg_v_aanwezigruimte a"
+ " , ins_srtdeel s"
+ " , ins_srtgroep g"
+ " WHERE (" // let op het haakje hier
+ p_alg_niveau_sql
+ p_gebouw_persoon_sql
+ " )" // en het sluithaakje hier
+ " AND d.ins_alg_ruimte_key = a.alg_ruimte_key(+)" // outer join voor werkplekken (en locatie-objecten?)
+ p_stdmelding_where;
// Als persoons key is meegegeven dan niet meer eigen afdeling bepalen.
// Eigen afdelings objecten worden nu meegenomen in autorisatie van departmentsql
if (p_afdelingsobjecten)
{
sql += " UNION"
+ " SELECT d.ins_deel_key"
+ plaatsaanduiding
+ " , d.ins_alg_ruimte_key"
+ " , d.ins_alg_ruimte_type"
+ " , NULL alg_ruimte_nr"
+ " , CASE"
+ " WHEN d.ins_deel_t_uitvoertijd.eenheid = 'U'"
+ " THEN d.ins_deel_t_uitvoertijd.tijdsduur / 24"
+ " ELSE d.ins_deel_t_uitvoertijd.tijdsduur"
+ " END uitvoertijd" // Uitvoertijd in dagen.
+ " FROM ins_v_aanwezigdeel d"
+ " , ins_srtdeel s"
+ " , ins_srtgroep g"
+ " WHERE (" // let op het haakje hier
+ p_obj_niveau_sql
+ p_afdeling_persoon_sql
+ " )" // en het sluithaakje hier
+ p_stdmelding_where;
}
return sql;
}
function get_stdmelding_where(p_inst_type, p_inst_key)
{
var v_common_where = " AND (d.ins_deel_vervaldatum IS NULL OR d.ins_deel_vervaldatum > TRUNC(SYSDATE))"
+ " AND d.ins_srtdeel_key = s.ins_srtdeel_key"
+ " AND s.ins_srtgroep_key = g.ins_srtgroep_key"
+ (p_inst_type == "D" ? " AND g.ins_discipline_key = " + p_inst_key : "")
+ (p_inst_type == "G" ? " AND s.ins_srtgroep_key = " + p_inst_key : "")
+ (p_inst_type == "S" ? " AND d.ins_srtdeel_key = " + p_inst_key : "");
return v_common_where;
}
%>