Files
Facilitor/APPL/Shared/getkenmerksql.inc
Maykel Geerdink 370b2107fe NYBU#77066: Kenmerkfilter sleutelbeheer geeft page not found.
svn path=/Website/trunk/; revision=60068
2023-04-18 11:54:36 +00:00

303 lines
14 KiB
C++

<% /*
$Revision$
$Id$
File: getkenmerksql.inc
Description: Functie die de sql oplevert van ingevulde kenmerk filters
Parameters:
Context: Vanuit xxx_list.inc
Note:
*/ %>
<%
function getKenmerkSql(pmodule, pkeyColumn, prequestForm)
{
var ktable = "";
var slecil = 0;
switch(pmodule)
{
case "ALG": ktable = "alg_onrgoedkenmerk";
break;
case "BES": ktable = "bes_kenmerkbestell";
break;
case "CNT": ktable = "cnt_kenmerkcontract";
break;
case "FAQ": ktable = "faq_kenmerkwaarde";
break;
case "FIN": ktable = "fin_kenmerkfactuur"; // TBD
break;
case "CIL":
case "SLE": ktable = "ins_kenmerkdeel";
slecil = (pmodule == "CIL"? 1 : 2);
pmodule = "INS";
break;
case "INS": ktable = "ins_kenmerkdeel";
break;
case "MLD": ktable = "mld_kenmerkmelding";
break;
case "OPD": ktable = "mld_kenmerkopdr";
pmodule = "MLD";
break;
case "PRS": ktable = "prs_kenmerklink";
break;
case "RES": ktable = "res_kenmerkwaarde";
break;
}
var kverwijder = ktable + "_verwijder"; // bes_kenmerkbestell_verwijder
var kwaarde = ktable + "_waarde"; // bes_kenmerkbestell_waarde
if (pmodule == "RES") kwaarde = "res_kenmerkreservering_waarde"; // RES is uitzondering
// b.bes_bestelling_key => tableref = "b" en tablekey = bes_bestelling_key
var pkeyColumn = pkeyColumn.split('.');
var tableref = pkeyColumn[0];
var tablekey = pkeyColumn[1];
var sql_k = "";
var where = "";
var validOperators = ["=", "<>", "<", ">", "<=", ">=", "LIKE", "NOT LIKE", "IS NOT NULL", "IS NULL"];
var k_all = (prequestForm? getFParamInt("k_all", -1) : getQParamInt("k_all", -1)); // Aantal kenmerken
if (!isNaN(k_all) && k_all > 0)
{
for (kenmerk = 1; kenmerk <= k_all; kenmerk++)
{
var kk = (prequestForm
? getFParamInt("k" + kenmerk + "key", -1)
: getQParamInt("k" + kenmerk + "key", -1)); // kenmerk key of bij INS: srtkenmerk_key
var kcount = (prequestForm
? getFParamInt("k" + kenmerk + "count", -1)
: getQParamInt("k" + kenmerk + "count", -1)); // (count <= 1) kk = kenmerk key [or] (count > 1) kk = srtkenmerk_key
var komsch = new String(
(prequestForm
? getFParam("k" + kenmerk + "omsch", "")
: getQParam("k" + kenmerk + "omsch", ""))); // (count <= 1) komsch = "" [or] (count > 1) komsch = kenmerk_omschrijving
var kv = (prequestForm
? getFParamArray("k" + kenmerk + "val", [], true)
: getQParamArray("k" + kenmerk + "val", [], true)); // kenmerk waarde
var ko = new String(
(prequestForm
? getFParam("ko" + kenmerk, "")
: getQParam("ko" + kenmerk, ""))); // kenmerk operand
var kt = (prequestForm
? getFParam("k" + kenmerk + "t", null)
: getQParam("k" + kenmerk + "t", null)); // kenmerk type
if (!kv.length || ((kt == "S" || kt == "R") && kv == [-1]))
kv = "";
else if (kv.length == 1)
kv = kv[0];
if (kk > 0 && (kv != "" || ko == "IS NOT NULL" || ko == "IS NULL"))
{
var where1 = kwaarde;
if (!inArray(ko, validOperators)) ERROR_BAD_KENMERK_OPERATOR;
var where2;
if (ko == "NOT LIKE")
where2 = "LIKE"; // key IN (kenmerk NOT LIKE 'x') -> key NOT IN (kenmerk LIKE 'x')
else if (ko == "<>")
where2 = "="; // key IN (kenmerk <> 'x') -> key NOT IN (kenmerk = 'x')
else
where2 = ko;
var where3 = "";
var where4 = "";
var add_b = true;
var add_c = pmodule == "INS" && tablekey == "ins_deel_key"
where = "";
var tablekey2 = tablekey;
var andALG = "";
var andPRS = "";
// Voor ALG en PRS tablekey2 aanpassen en extra AND conditie(s) toevoegen
if (pmodule == "ALG")
{
tablekey2 = "alg_onrgoed_key"
andALG = " AND alg_onrgoed_niveau = "
if (tablekey == "alg_regio_key")
andALG += "'R'"; // Regio
if (tablekey == "alg_district_key")
andALG += "'D'"; // District
if (tablekey == "alg_locatie_key")
andALG += "'L'"; // Locatie
if (tablekey == "alg_gebouw_key")
andALG += "'G'"; // Gebouw
if (tablekey == "alg_terreinsector_key")
andALG += "'T'"; // Terrein
if (tablekey == "alg_verdieping_key")
andALG += "'V'"; // Verdieping
if (tablekey == "alg_ruimte_key")
andALG += "'R'"; // Ruimte
andALG += " AND " + tableref + "." + tablekey + " = alg_onrgoed_key"
}
if (pmodule == "PRS")
{
tablekey2 = "prs_link_key"
andPRS = " AND prs_kenmerklink_niveau = "
if (tablekey == "prs_afdeling_key")
andPRS += "'A'"; // Afdeling
if (tablekey == "prs_perslid_key")
andPRS += "'P'"; // Persoon
if (tablekey == "prs_bedrijf_key")
andPRS += "'B'"; // Bedrijf
if (tablekey == "prs_contactpersoon_key")
andPRS += "'C'"; // Contactpersoon (FSN#15407)
}
if (slecil > 0)
{
tablekey2 = "ins_deel_key";
where3 = " AND ik.ins_srtinstallatie_key = " + (slecil == 1? S("cil_ins_srt_groep_key") : S("sle_ins_srt_groep_key"));
}
if (ko != "IS NOT NULL" && ko != "IS NULL")
{
add_b = false;
if (ko == "LIKE" || ko == "NOT LIKE")
{
where1 = "UPPER(" + where1 + ")";
kv = safe.quoted_sql_wild("%" + kv + "%");
}
else
{
if (kt == "D") // Beide kanten naar DATE converteren om te kunnen vergelijken "<" en ">"
{
if (kv.indexOf("-"))
{ // assume "-" format
kv = " fac.safe_to_date(" + safe.quoted_sql(kv) + ",'DD-MM-YYYY')";
where1 = " fac.safe_to_date(" + where1 + ",'DD-MM-YYYY')";
}
else
{ // assume "/" format
kv = " fac.safe_to_date(" + safe.quoted_sql(kv) + ",'DD/MM/YYYY')";
where1 = " fac.safe_to_date(" + where1 + ",'DD/MM/YYYY')";
}
}
else if (kt == "N" || kt == "V") // Beide kanten naar NUMBER converteren om te kunnen vergelijken "<" en ">"
{ // Een numeriek "N" kenmerk kan ook een checkbox "V" zijn.
if (kv == "on") kv = "1";
kv = " fac.safe_to_number(" + safe.quoted_sql(kv.replace(",", ".")) + ")" ; // Bij "Geavanceerd" kan het numerieke getal met de komma i.p.v. punt zijn ingevuld.
where1 = " fac.safe_to_number(" + where1 + ")" ;
}
else // kt=="C", "S", ..
{
if (kt != "R" && kt != "S") // Listbox en suggestbox zijn keys. Upper is dan niet nodig. Wordt de query alleen maar trager van.
where1 = "UPPER(" + where1 + ")";
if (typeof kv != "string" && kv.length > 1 && (ko == "=" || ko == "<>")) // e.g. 2042,723,341
{
kv = "(" + safe.quoted_sql_join(kv, true) + ")";
where2 = "IN"; // <> wordt -> key NOT IN (kenmerk IN (1, 2, 3))
}
else
kv = safe.quoted_sql(kv.toUpperCase());
}
}
where2 += " " + kv;
}
else
{
// add_b blijft true trouwens
// Bij INS bevat kk een ins_srtkenmerk_key, niet een ins_kenmerk_key zoals de rest.
// Dat is zo geregeld in INS/ins_flexkenmerk.inc
// We moeten nu wel de tabel ins_kenmerk er bij slepen
// Zelfde truc ook voor MLD
where = "(" + ((ko == "IS NULL") ? " NOT " : "")
+ " EXISTS (SELECT 'x'"
+ " FROM " + ktable
// Bij "INS" altijd ins_kenmerk er bij joinen omdat ins_kenmerk_bewerkniveau en ins_srtinstallatie_key er dan bij worden genomen als add_c.
+ (pmodule == "INS" || kcount > 1
? " , " + pmodule.toLowerCase() + "_kenmerk ik"
: "")
+ " WHERE "
+ (pmodule == "INS" || kcount > 1
? " ik." + pmodule.toLowerCase() + "_kenmerk_key = " + ktable + "." + pmodule.toLowerCase() + "_kenmerk_key AND "
: "")
+ (kcount == 1
? " " + ktable + "." + pmodule.toLowerCase() + "_kenmerk_key = " + kk
: " ik." + pmodule.toLowerCase() + "_srtkenmerk_key = " + kk)
+ " AND " + (add_c ? "((" : "") + tablekey2 + " = " + tableref + "." + tablekey;
if (add_c)
{
where += " AND ins_kenmerk_bewerkniveau <> 'S' AND ins_kenmerk_verwijder IS NULL)"
+ " OR (" + tablekey2 + " = " + tableref + ".ins_srtdeel_key"
+ " AND ins_kenmerk_bewerkniveau = 'S'))";
}
where += " AND " + where1 + " IS NOT NULL "
+ andALG + andPRS
+ where3
+ " AND " + kverwijder + " IS NULL) ";
}
// Ik zeg: een wat gekke constructie zo
sql_k += " AND " + where;
if (add_c)
{ // add_c is true dus: pmodule == "INS".
sql_k +=(add_b ? " OR " : "")
+ " (" + tableref + ".ins_srtdeel_key IN (SELECT " + tablekey2
+ " FROM " + ktable
+ " , ins_kenmerk ik"
+ " WHERE ik.ins_kenmerk_key = ins_kenmerkdeel.ins_kenmerk_key"
+ " AND ik." + pmodule.toLowerCase() + "_kenmerk_key = " + kk
+ " AND " + where1 + " " + where2
+ andALG + andPRS
+ where3
+ " AND ins_kenmerk_bewerkniveau = 'S'"
+ " AND " + kverwijder + " IS NULL)";
where4 = " AND ins_kenmerk_bewerkniveau <> 'S'";
}
// voor filter Geen Waarde zou ook nog: Wel een record maar met een NULL waarde kunnen gelden
// die nemen we ook nog mee. Alleen bij "Gevuld" (verwerkt in "where") hoeven we niet verder naar de waarden te kijken
// in alle andere gevallen komt hier de conditie "kenmerk=waarde" erbij
if (ko != "IS NOT NULL")
{
var negate = ko == "NOT LIKE" || ko == "<>";
if (kcount > 1)
{
sql_k +=((add_b || add_c) ? " OR " : "")
+ " " + tableref + "." + tablekey + (negate ? " NOT" : "") + " IN (SELECT " + tablekey2
+ " FROM " + ktable
+ (pmodule == "BES"? ", bes_kenmerk bk":"")
+ (pmodule == "CNT"? ", cnt_kenmerk ck":"")
+ (pmodule == "INS"? ", ins_kenmerk ik":"")
+ (pmodule == "MLD"? ", mld_kenmerk mk":"")
+ (pmodule == "RES"? ", res_kenmerk rk":"")
+ " WHERE "
+ (pmodule == "BES"? " bk.bes_srtkenmerk_key = " + kk + " AND bk.bes_kenmerk_key = "+ktable+".bes_kenmerk_key":"")
+ (pmodule == "CNT"? " ck.cnt_srtkenmerk_key = " + kk + " AND ck.cnt_kenmerk_key = "+ktable+".cnt_kenmerk_key":"")
+ (pmodule == "INS"? " ik.ins_srtkenmerk_key = " + kk + " AND ik.ins_kenmerk_key = ins_kenmerkdeel.ins_kenmerk_key":"")
+ (pmodule == "MLD"? " mk.mld_srtkenmerk_key = " + kk + " AND mk.mld_kenmerk_key = "+ktable+".mld_kenmerk_key":"")
+ (pmodule == "RES"? " rk.res_srtkenmerk_key = " + kk + " AND rk.res_kenmerk_key = "+ktable+".res_kenmerk_key":"")
+ (pmodule != "BES" && pmodule != "CNT" && pmodule != "INS" && pmodule != "MLD" && pmodule != "RES" ? pmodule.toLowerCase() + "_kenmerk_key = " + kk:"")
+ " AND " + where1 + " " + where2
+ (pmodule == "BES"? " AND (bk.bes_kenmerk_omschrijving = " + safe.quoted_sql(komsch) + " OR bk.bes_kenmerk_omschrijving IS NULL)" : "")
+ (pmodule == "CNT"? " AND (ck.cnt_kenmerk_omschrijving = " + safe.quoted_sql(komsch) + " OR ck.cnt_kenmerk_omschrijving IS NULL)" : "")
+ (pmodule == "INS"? " AND (ik.ins_kenmerk_omschrijving = " + safe.quoted_sql(komsch) + " OR ik.ins_kenmerk_omschrijving IS NULL)" : "")
+ (pmodule == "MLD"? " AND (mk.mld_kenmerk_omschrijving = " + safe.quoted_sql(komsch) + " OR mk.mld_kenmerk_omschrijving IS NULL)" : "")
+ (pmodule == "RES"? " AND (rk.res_kenmerk_omschrijving = " + safe.quoted_sql(komsch) + " OR rk.res_kenmerk_omschrijving IS NULL)" : "")
+ andALG + andPRS
+ where3 + where4
+ " AND " + kverwijder + " IS NULL)";
}
else
{
sql_k +=((add_b || add_c) ? " OR " : "")
+ " " + tableref + "." + tablekey + (negate ? " NOT" : "") + " IN (SELECT " + tablekey2
+ " FROM " + ktable
+ (pmodule == "INS"? ", ins_kenmerk ik" : "") // Omdat ins_kenmerk_bewerkniveau en ins_srtinstallatie_key er dan bij worden genomen als add_c.
+ " WHERE "
+ (pmodule == "INS"? " ik.ins_kenmerk_key = ins_kenmerkdeel.ins_kenmerk_key AND " : "")
+ ktable + "." + pmodule.toLowerCase() + ("_kenmerk_key = ") + kk
+ " AND " + where1 + " " + where2
+ andALG + andPRS
+ where3 + where4
+ " AND " + kverwijder + " IS NULL)";
}
}
sql_k += (add_b ? ")" : "");
sql_k += (add_c ? ")" : "");
}
}
}
return sql_k;
}
%>