AAIT#36710 Aanzet afsplitsen/maken FLX package met evaluateexpression
svn path=/Database/trunk/; revision=31758
This commit is contained in:
@@ -32,6 +32,7 @@
|
||||
#include "fac_pacx.src"
|
||||
#include "fac_pacf.src"
|
||||
#include "fac_pacl.src"
|
||||
#include "fac_pacflex.src"
|
||||
|
||||
CREATE OR REPLACE PACKAGE fac
|
||||
AUTHID CURRENT_USER -- zodat CREATE TABLE lukt
|
||||
@@ -306,60 +307,13 @@ CREATE OR REPLACE PACKAGE BODY fac AS
|
||||
END;
|
||||
|
||||
/*
|
||||
* Levert de gerefereerde waarde van een flexkenmerk op, gegeven de fac_kenmerkdomein_key en de waarde
|
||||
* Ten behoeve van de XML-generatie is parameter ignorewhenxmlnode; daarmee kan worden aangegeven (1)
|
||||
* dat in geval van een referentiekenmerk met een xmlnode niet de waarde maar gewoon de oorspronkelijke
|
||||
* key moet worden teruggeven waarmee later een complete subnode wordt gemaakt. Het teruggeven van de naam
|
||||
* zou die key kwijtmaken.
|
||||
* Deprecated. Gebruik de flx versie.
|
||||
*/
|
||||
FUNCTION getdomeinwaarde (dkey IN NUMBER, waarde IN VARCHAR2, ignorewhenxmlnode IN NUMBER DEFAULT 0)
|
||||
RETURN VARCHAR2
|
||||
IS
|
||||
sresult VARCHAR2 (255);
|
||||
kolomnaam fac_kenmerkdomein.fac_kenmerkdomein_kolomnaam%TYPE;
|
||||
kolomtxt fac_kenmerkdomein.fac_kenmerkdomein_kolomtxt%TYPE;
|
||||
objectnaam fac_kenmerkdomein.fac_kenmerkdomein_objectnaam%TYPE;
|
||||
xmlnode fac_kenmerkdomein.fac_kenmerkdomein_xmlnode%TYPE;
|
||||
resultvalue VARCHAR2 (1000);
|
||||
BEGIN
|
||||
IF waarde IS NULL
|
||||
THEN
|
||||
resultvalue := NULL; -- gauw klaar mee
|
||||
ELSE
|
||||
SELECT rsk.fac_kenmerkdomein_kolomnaam,
|
||||
rsk.fac_kenmerkdomein_kolomtxt,
|
||||
rsk.fac_kenmerkdomein_objectnaam,
|
||||
rsk.fac_kenmerkdomein_xmlnode
|
||||
INTO kolomnaam,
|
||||
kolomtxt,
|
||||
objectnaam,
|
||||
xmlnode
|
||||
FROM fac_kenmerkdomein rsk
|
||||
WHERE rsk.fac_kenmerkdomein_key = dkey;
|
||||
|
||||
IF (xmlnode IS NOT NULL AND ignorewhenxmlnode = 1)
|
||||
THEN
|
||||
RETURN waarde;
|
||||
END IF;
|
||||
|
||||
-- Optimalisatie: meestal is het dezelfde query op de usrdata-tabel
|
||||
-- Dan hoeven we niet te bouwen en steeds te parsen (FSN#25653)
|
||||
IF kolomtxt = 'FAC_USRDATA_OMSCHR'
|
||||
AND objectnaam = 'FAC_USRDATA'
|
||||
AND kolomnaam = 'FAC_USRDATA_KEY'
|
||||
THEN
|
||||
SELECT fac_usrdata_omschr
|
||||
INTO resultvalue
|
||||
FROM fac_usrdata
|
||||
WHERE fac_usrdata_key = fac.safe_to_number(waarde);
|
||||
ELSE
|
||||
sresult := 'SELECT MIN(' || kolomtxt || ') FROM ' || objectnaam || ' WHERE ' || kolomnaam || ' = :bd_waarde';
|
||||
EXECUTE IMMEDIATE sresult INTO resultvalue USING waarde;
|
||||
END IF;
|
||||
|
||||
END IF;
|
||||
|
||||
RETURN resultvalue;
|
||||
RETURN flx.getdomeinwaarde (dkey, waarde, ignorewhenxmlnode);
|
||||
END;
|
||||
|
||||
-- Sluit weekend en vrije dagen uit
|
||||
|
||||
295
FAC/FAC_PACFLEX.SRC
Normal file
295
FAC/FAC_PACFLEX.SRC
Normal file
@@ -0,0 +1,295 @@
|
||||
/* $Revision$
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
/* FAC_PACFLEX
|
||||
*
|
||||
* Contains all functions for flex values.
|
||||
*
|
||||
*/
|
||||
|
||||
CREATE OR REPLACE PACKAGE flx
|
||||
AS
|
||||
PROCEDURE evaluateflexexpresions (pmodule IN VARCHAR2, prefkey IN NUMBER);
|
||||
FUNCTION getflex (pmodule IN VARCHAR2,
|
||||
p_kenmerk_key IN NUMBER,
|
||||
p_ref_key IN NUMBER,
|
||||
p_niveau IN VARCHAR2 DEFAULT NULL) RETURN VARCHAR2;
|
||||
PROCEDURE setflex (pmodule IN VARCHAR2,
|
||||
p_kenmerk_key IN NUMBER,
|
||||
p_ref_key IN NUMBER,
|
||||
p_waarde IN VARCHAR2);
|
||||
PROCEDURE setflex (pmodule IN VARCHAR2,
|
||||
p_kenmerk_key IN NUMBER,
|
||||
p_ref_key IN NUMBER,
|
||||
p_niveau IN NUMBER,
|
||||
p_waarde IN VARCHAR2);
|
||||
FUNCTION getdomeinwaarde (dkey IN NUMBER,
|
||||
waarde IN VARCHAR2,
|
||||
ignorewhenxmlnode IN NUMBER DEFAULT 0) RETURN VARCHAR2;
|
||||
|
||||
END flx;
|
||||
/
|
||||
|
||||
|
||||
CREATE OR REPLACE PACKAGE BODY flx
|
||||
AS
|
||||
FUNCTION getflex (pmodule IN VARCHAR2,
|
||||
p_kenmerk_key IN NUMBER,
|
||||
p_ref_key IN NUMBER,
|
||||
p_niveau IN VARCHAR2 DEFAULT NULL) RETURN VARCHAR2
|
||||
IS
|
||||
BEGIN
|
||||
RETURN NULL; -- TODO
|
||||
END;
|
||||
|
||||
PROCEDURE setflex (pmodule IN VARCHAR2,
|
||||
p_kenmerk_key IN NUMBER,
|
||||
p_ref_key IN NUMBER,
|
||||
p_waarde IN VARCHAR2)
|
||||
AS
|
||||
BEGIN
|
||||
setflex(pmodule, p_kenmerk_key, p_ref_key, NULL, p_waarde);
|
||||
END;
|
||||
|
||||
PROCEDURE setflex (pmodule IN VARCHAR2,
|
||||
p_kenmerk_key IN NUMBER,
|
||||
p_ref_key IN NUMBER,
|
||||
p_niveau IN NUMBER,
|
||||
p_waarde IN VARCHAR2)
|
||||
AS
|
||||
BEGIN
|
||||
NULL; -- TODO
|
||||
END;
|
||||
|
||||
/*
|
||||
* Levert de gerefereerde waarde van een flexkenmerk op, gegeven de fac_kenmerkdomein_key en de waarde
|
||||
* Ten behoeve van de XML-generatie is parameter ignorewhenxmlnode; daarmee kan worden aangegeven (1)
|
||||
* dat in geval van een referentiekenmerk met een xmlnode niet de waarde maar gewoon de oorspronkelijke
|
||||
* key moet worden teruggeven waarmee later een complete subnode wordt gemaakt. Het teruggeven van de naam
|
||||
* zou die key kwijtmaken.
|
||||
*/
|
||||
FUNCTION getdomeinwaarde (dkey IN NUMBER, waarde IN VARCHAR2, ignorewhenxmlnode IN NUMBER DEFAULT 0)
|
||||
RETURN VARCHAR2
|
||||
IS
|
||||
sresult VARCHAR2 (255);
|
||||
kolomnaam fac_kenmerkdomein.fac_kenmerkdomein_kolomnaam%TYPE;
|
||||
kolomtxt fac_kenmerkdomein.fac_kenmerkdomein_kolomtxt%TYPE;
|
||||
objectnaam fac_kenmerkdomein.fac_kenmerkdomein_objectnaam%TYPE;
|
||||
xmlnode fac_kenmerkdomein.fac_kenmerkdomein_xmlnode%TYPE;
|
||||
resultvalue VARCHAR2 (1000);
|
||||
BEGIN
|
||||
IF waarde IS NULL
|
||||
THEN
|
||||
resultvalue := NULL; -- gauw klaar mee
|
||||
ELSE
|
||||
SELECT rsk.fac_kenmerkdomein_kolomnaam,
|
||||
rsk.fac_kenmerkdomein_kolomtxt,
|
||||
rsk.fac_kenmerkdomein_objectnaam,
|
||||
rsk.fac_kenmerkdomein_xmlnode
|
||||
INTO kolomnaam,
|
||||
kolomtxt,
|
||||
objectnaam,
|
||||
xmlnode
|
||||
FROM fac_kenmerkdomein rsk
|
||||
WHERE rsk.fac_kenmerkdomein_key = dkey;
|
||||
|
||||
IF (xmlnode IS NOT NULL AND ignorewhenxmlnode = 1)
|
||||
THEN
|
||||
RETURN waarde;
|
||||
END IF;
|
||||
|
||||
-- Optimalisatie: meestal is het dezelfde query op de usrdata-tabel
|
||||
-- Dan hoeven we niet te bouwen en steeds te parsen (FSN#25653)
|
||||
IF kolomtxt = 'FAC_USRDATA_OMSCHR'
|
||||
AND objectnaam = 'FAC_USRDATA'
|
||||
AND kolomnaam = 'FAC_USRDATA_KEY'
|
||||
THEN
|
||||
SELECT fac_usrdata_omschr
|
||||
INTO resultvalue
|
||||
FROM fac_usrdata
|
||||
WHERE fac_usrdata_key = fac.safe_to_number(waarde);
|
||||
ELSE
|
||||
sresult := 'SELECT MIN(' || kolomtxt || ') FROM ' || objectnaam || ' WHERE ' || kolomnaam || ' = :bd_waarde';
|
||||
EXECUTE IMMEDIATE sresult INTO resultvalue USING waarde;
|
||||
END IF;
|
||||
|
||||
END IF;
|
||||
|
||||
RETURN resultvalue;
|
||||
END;
|
||||
|
||||
PROCEDURE evaluateflexexpresions (pmodule IN VARCHAR2, prefkey IN NUMBER)
|
||||
AS
|
||||
l_sql_waarde VARCHAR2 (4000);
|
||||
l_sql_insert VARCHAR2 (4500);
|
||||
l_sql_update VARCHAR2 (4500);
|
||||
l_sql VARCHAR2 (4500);
|
||||
l_module VARCHAR2 (3);
|
||||
l_rowsprocessed NUMBER DEFAULT 0;
|
||||
l_rowsproces_cnt NUMBER DEFAULT 0;
|
||||
l_cursor_expr INTEGER DEFAULT DBMS_SQL.open_cursor;
|
||||
l_cursor_update INTEGER DEFAULT DBMS_SQL.open_cursor;
|
||||
l_expression VARCHAR2 (4000);
|
||||
l_cntbind NUMBER;
|
||||
l_cnt NUMBER;
|
||||
l_bvar VARCHAR2 (1000);
|
||||
l_rflex VARCHAR2 (1000) DEFAULT '(\:flex[0-9_]+)'; -- supports ':flex111 = ''538'''
|
||||
l_kenmerkwaarde fac_kenmwaarden.fac_kenmwaarden_waarde%TYPE;
|
||||
l_kenmerk_key fac_kenmwaarden.fac_kenmwaarden_kenmerk_key%TYPE;
|
||||
|
||||
l_kenmerk_table VARCHAR2 (30);
|
||||
l_kcolumn_kkey VARCHAR2 (30);
|
||||
l_kenmerk_default VARCHAR2 (4000);
|
||||
l_kcolumn_refkey VARCHAR2 (30);
|
||||
l_kcolumn_waarde VARCHAR2 (30);
|
||||
l_kcolumn_delete VARCHAR2 (30);
|
||||
l_kcolumn_niveau VARCHAR2 (30) DEFAULT '';
|
||||
|
||||
l_niveau_col VARCHAR2 (30);
|
||||
l_niveau_val VARCHAR2 (1);
|
||||
|
||||
CURSOR c_expressions
|
||||
IS
|
||||
SELECT fcw.fac_kenmwaarden_kenmerk_key,
|
||||
fcw.fac_kenmwaarden_kenmerktype,
|
||||
fcw.fac_kenmwaarden_niveau
|
||||
FROM fac_kenmwaarden fcw
|
||||
WHERE fcw.fac_kenmwaarden_module = pmodule
|
||||
AND fcw.fac_kenmwaarden_refkey = prefkey
|
||||
AND fcw.fac_kenmwaarden_isexpr = 1;
|
||||
BEGIN
|
||||
l_module := pmodule;
|
||||
CASE
|
||||
WHEN pmodule = 'ALG'
|
||||
THEN l_kenmerk_table := 'alg_onrgoedkenmerk';
|
||||
l_kcolumn_refkey := 'alg_onrgoed_key';
|
||||
l_kcolumn_niveau := 'alg_onrgoed_niveau';
|
||||
WHEN pmodule = 'BES'
|
||||
THEN l_kenmerk_table := 'bes_kenmerkbestell';
|
||||
l_kcolumn_refkey := 'bes_bestelling_key';
|
||||
WHEN pmodule = 'CNT'
|
||||
THEN l_kenmerk_table := 'cnt_kenmerkcontract';
|
||||
l_kcolumn_refkey := 'cnt_contract_key';
|
||||
WHEN pmodule = 'FAQ'
|
||||
THEN l_kenmerk_table := 'faq_kenmerkwaarde';
|
||||
l_kcolumn_refkey := 'fac_faq_key';
|
||||
WHEN pmodule = 'FIN'
|
||||
THEN l_kenmerk_table := 'fin_kenmerkfactuur';
|
||||
l_kcolumn_refkey := 'fin_factuur_key';
|
||||
WHEN pmodule = 'CIL' OR pmodule = 'SLE'
|
||||
THEN l_kenmerk_table := 'ins_kenmerkdeel';
|
||||
l_kcolumn_refkey := 'ins_deel_key';
|
||||
WHEN pmodule = 'INS'
|
||||
THEN l_kenmerk_table := 'ins_kenmerkdeel';
|
||||
l_kcolumn_refkey := 'ins_deel_key';
|
||||
WHEN pmodule = 'MLD'
|
||||
THEN l_kenmerk_table := 'mld_kenmerkmelding';
|
||||
l_kcolumn_refkey := 'mld_melding_key';
|
||||
WHEN pmodule = 'OPD'
|
||||
THEN l_kenmerk_table := 'mld_kenmerkopdr';
|
||||
l_kcolumn_refkey := 'mld_opdr_key';
|
||||
l_module := 'MLD';
|
||||
WHEN pmodule = 'PRS'
|
||||
THEN l_kenmerk_table := 'prs_kenmerklink';
|
||||
l_kcolumn_refkey := 'prs_kenmerklink_key';
|
||||
l_kcolumn_niveau := 'prs_kenmerklink_niveau';
|
||||
WHEN pmodule = 'RES'
|
||||
THEN l_kenmerk_table := 'res_kenmerkwaarde';
|
||||
l_kcolumn_refkey := 'res_rsv_ruimte_key';
|
||||
END CASE;
|
||||
|
||||
IF l_module = 'RES'
|
||||
THEN l_kcolumn_waarde := 'res_kenmerkreservering_waarde'; -- RES is uitzondering
|
||||
ELSE l_kcolumn_waarde := l_kenmerk_table || '_waarde';
|
||||
END IF;
|
||||
|
||||
l_kcolumn_kkey := l_module || '_kenmerk_key';
|
||||
l_kcolumn_delete := l_kenmerk_table || '_verwijder';
|
||||
|
||||
FOR expr IN c_expressions
|
||||
LOOP
|
||||
l_niveau_col := '';
|
||||
l_niveau_val := '';
|
||||
|
||||
-- Waarde berekenen
|
||||
l_sql_waarde := 'SELECT (SUBSTR (' || l_module || '_kenmerk_default, 9))' ||
|
||||
' FROM ' || l_module || '_kenmerk' ||
|
||||
' WHERE ' || l_kcolumn_kkey || ' = ' || expr.fac_kenmwaarden_kenmerk_key;
|
||||
|
||||
DBMS_SQL.parse (l_cursor_expr, l_sql_waarde, DBMS_SQL.native);
|
||||
DBMS_SQL.define_column(l_cursor_expr, 1, l_expression, 4000);
|
||||
l_rowsprocessed := DBMS_SQL.execute_and_fetch (l_cursor_expr);
|
||||
DBMS_SQL.CLOSE_CURSOR(l_cursor_expr);
|
||||
DBMS_SQL.column_value (l_cursor_expr, 1, l_expression);
|
||||
|
||||
l_sql_update := 'UPDATE ' || l_kenmerk_table ||
|
||||
' SET ' || l_kcolumn_waarde || ' = (' || l_expression || ')' ||
|
||||
' WHERE ' || l_kcolumn_refkey || ' = ' || prefkey ||
|
||||
' AND ' || l_kcolumn_kkey || ' = ' || expr.fac_kenmwaarden_kenmerk_key ||
|
||||
' AND ' || l_kcolumn_delete || ' IS NULL';
|
||||
|
||||
IF l_kcolumn_niveau != ''
|
||||
THEN
|
||||
l_niveau_col := ', ' || l_kcolumn_niveau;
|
||||
l_niveau_val := ', ' || expr.fac_kenmwaarden_niveau;
|
||||
END IF;
|
||||
|
||||
l_sql_insert := 'INSERT INTO ' || l_kenmerk_table ||
|
||||
' (' || l_kcolumn_refkey ||
|
||||
' , ' || l_kcolumn_kkey ||
|
||||
' , ' || l_kcolumn_waarde ||
|
||||
l_niveau_col ||
|
||||
' )' ||
|
||||
' VALUES (' || prefkey ||
|
||||
' , ' || expr.fac_kenmwaarden_kenmerk_key ||
|
||||
' , ' || '(' || l_expression || ')' ||
|
||||
l_niveau_val ||
|
||||
' )';
|
||||
|
||||
-- TODO: Nu update gekozen, maar uitzoeken of het een insert moet zijn?
|
||||
l_sql := l_sql_update;
|
||||
|
||||
DBMS_OUTPUT.put_line ('l_sql: ' || l_sql);
|
||||
DBMS_SQL.parse (l_cursor_update, l_sql, DBMS_SQL.native);
|
||||
|
||||
l_cntbind := REGEXP_COUNT (l_sql,
|
||||
l_rflex,
|
||||
1,
|
||||
'i');
|
||||
|
||||
FOR l_cnt IN 1 .. l_cntbind
|
||||
LOOP
|
||||
l_bvar := REGEXP_SUBSTR (l_sql,
|
||||
l_rflex,
|
||||
1,
|
||||
l_cnt,
|
||||
'i');
|
||||
l_kenmerk_key := TO_NUMBER (SUBSTR (l_bvar, 6));
|
||||
|
||||
BEGIN
|
||||
SELECT fac_kenmwaarden_waarde
|
||||
INTO l_kenmerkwaarde
|
||||
FROM fac_kenmwaarden
|
||||
WHERE fac_kenmwaarden_module = l_module
|
||||
AND fac_kenmwaarden_refkey = prefkey
|
||||
AND fac_kenmwaarden_kenmerk_key = l_kenmerk_key;
|
||||
EXCEPTION
|
||||
WHEN NO_DATA_FOUND
|
||||
THEN
|
||||
l_kenmerkwaarde := NULL;
|
||||
END;
|
||||
|
||||
DBMS_SQL.bind_variable (l_cursor_update, l_bvar, l_kenmerkwaarde);
|
||||
END LOOP;
|
||||
|
||||
l_rowsprocessed := DBMS_SQL.EXECUTE (l_cursor_update);
|
||||
DBMS_SQL.CLOSE_CURSOR(l_cursor_update);
|
||||
l_rowsproces_cnt := l_rowsproces_cnt + l_rowsprocessed;
|
||||
|
||||
END LOOP;
|
||||
END;
|
||||
|
||||
END flx;
|
||||
/
|
||||
REGISTERRUN('$Id$')
|
||||
Reference in New Issue
Block a user