Sunday 3 July 2016

Field Locks In Oracle Apex

     

Step:1: On-change of items, insert into locks table.

Dynamic Action : On-Change
   Selector : JQuery Selector
             [name=f05]
Execute Javascript Code,
   /* Getting the Program Name Details*/

var c=($(this.triggeringElement ).attr('name').substr(0,3));
var d=this.triggeringElement.id;
//alert(d);
 var str = d.substring(4,8);
if(c=="f05")
{
// Assigning PDVD Type

var p_pdvd_type="Master";
//alert(p_pdvd_type);

//getting column header value

idheader ="#f05_0001_LABEL" ;
var p_field_name = $(idheader).closest("label").html();   
//alert(p_field_name);

//getting Master PDVD ID

var p_pdvd_id=$('#P77_MASTER_PDVD_ID').val();
//alert(p_pdvd_id);


//getting Item ID

var p_item_id=$(this.triggeringElement ).attr('id');
//alert(p_item_id);

//getting Item value

var p_item_val=$x(p_item_id).value;
//alert(p_item_val);

var p_item_val1    = $x("f04_"+str).value;
var p_mas_item_id  = $x("f03_"+str).value;
//alert(p_item_val1);

//p_item_val1  =$x("f03_"+new1).value;
//alert(p_item_val1);
//p_item_val2  =j_item_id;
apex.server.process ( 
  "AP_FIELD_LOCKS"
,   {   x01: p_pdvd_id
    ,   x02: p_pdvd_type
    ,   x03: p_field_name
    ,   x04: p_item_id
    ,   x05: p_item_val
    ,  x06:  p_item_val1
    ,  x07:  p_mas_item_id
    }
 , { dataType: 'text'
 ,success: function(pData){
//alert(pData)
}
}
);
};

Application Process: 
DECLARE
   lv_n_user_id   NUMBER;
BEGIN
   IF apex_application.g_x06 IS NOT NULL
   THEN
      lv_n_user_id := pdvd_pk_get_values.pdvd_fn_get_user_id (:app_user);

/*
      DELETE FROM pdvd_tb_mstr_user_restriction
            WHERE session_id = :app_session;
            */
      INSERT INTO pdvd_tb_field_locks
                  (lock_id, app_id, page_no,
                   session_id, pdvd_id,
                   pdvd_type, field_name,
                   item_id, item_value,PDVD_ITEM_ID,item_identifier,
                   created_by, created_date
                  )
           VALUES (pdvd_sq_field_locks.NEXTVAL, :app_id, :app_page_id,
                   :app_session, apex_application.g_x01,
                   apex_application.g_x02, apex_application.g_x03,
                   apex_application.g_x04, apex_application.g_x05,
                   apex_application.g_x07,apex_application.g_x06,
                   lv_n_user_id, SYSDATE
                  );
   END IF;
END;

Step:2:
On-page load check for locked items in field locks table and  locked field items been represented in different color using below javascript,

var example = $("#P77_RESTRICT_FIELD_NAME").val();
var session_id =$("#P77_SESSION").val();
var cur_session=$("#P77_CURRENT_SESSION").val();
var user_name =$("#P77_USER_NAME").val();
var session_spl =session_id.split(',');
var numbers = example.split(',');
var user_spl =user_name.split(',');
var my_condition = true;
var session_check="";
var user_check="";
var master_item_row ="";
for (var i = 0; i < numbers.length; i++) {
if  (typeof session_spl[i]  !== 'undefined')
{
session_spl[i] = session_spl[i].replace(/^\s*/, "").replace(/\s*$/, "");
if (typeof user_spl[i] !== 'undefined')
{    
user_spl[i] =  user_spl[i].replace(/^\s*/, "").replace(/\s*$/, "");
session_check=session_spl[i];
user_name = user_spl[i]; 

/*Checking for Session value that is not user's current session*/
   if (session_check !=cur_session)
{   
    var ind = numbers[i].indexOf(":");
    var len = numbers[i].length;
    var id = numbers[i].substring(0,ind);
if ( id.length !=0)
{
/*Getting Master Item ID*/ 
    var id1 =id.trim();
    var item_id = numbers[i].substring(ind+1,len);   
    var item_id1=item_id.trim();
//alert(item_id1);
    
/*Getting the Row Value Using the Master Item ID */
    for (K=0;K<=10;K++)
    {
     b = "000" + K;
    b = pad(K, 4);
    var item_check = $("#f03_"+b).val();
    if (item_check == item_id1)
    {
    master_item_row = b;       
numbers[i] = numbers[i].replace(/^\s*/, "").replace(/\s*$/, "");
var ind1 = numbers[i].indexOf(":");
/*Getting the Field Value from the field lock  table for the Master Item ID */
var id2 = numbers[i].substring(0,ind1);

/*Getting the Field Value first four Characters like  "f05_"*/
var ind_col_id =id2.substring(0,4);

/*Concatenate both field id and Master item id row*/  
   var id3 = ind_col_id+master_item_row;

/*Making a fields as read only*/ 
    $("#" + id3).prop("readonly", true);
    $("#" + id3).prop("onclick", false);
    $("#" + id3).css("color", "red");
    $("#" + id3).on('mousedown focus',function(e) {
        if (my_condition) {
            e.preventDefault();
/*Application Process for getting the User Name who Locked the fields*/
          var get = new htmldb_Get(null, $x('pFlowId').value,
    'APPLICATION_PROCESS=AP_USER_NAME', 0);
get.add('AI_USER_ID', user_name);
gReturn = get.get();
var ret = gReturn;
user_check=ret.trim();
          $("#alert").html("<font size=2>   This field has been locked by  " +user_check+"</font>");
           $("#alert").dialog({
                modal: true,
                resizable: false,
                minHeight: 105,
                width: 420,
                dialogClass: 'testclass'
            });  
}
    });
break;
    }  
    }    
    }
}
}
}
}

Application Process:
DECLARE
   lv_v_user_name   VARCHAR2 (50);
BEGIN
   SELECT initcap(first_name)||' '|| initcap(last_name) 
     INTO lv_v_user_name
     FROM pdvd_tb_user_defn
    WHERE user_id = :AI_USER_ID;

   IF lv_v_user_name IS NOT NULL
   THEN
      HTP.p (lv_v_user_name);
   END IF;
END;


Step:3: On-focus of locked items, alert been displayed with locked-user using following javascript,

var a = event.target.id;
if (a!==undefined)
{
var b=a.substring(0, 3);
//alert('b:'+b);
var c=a.replace(b,"f03");
//alert('c:'+c); 
var d=$("#"+c).val();
//alert('d: '+d);
var e=$("#"+a).val();
//alert('e:'+e);
var get = new htmldb_Get(null, $x('pFlowId').value,
    'APPLICATION_PROCESS=AP_FOCUS_CHECK', 0);
get.add('AI_MASTER_ITEM_ID', d);
get.add('AI_FIELD_ID', b);
gReturn = get.get();
var ret = gReturn.trim();
//alert ('ret:'+ ret);
if (ret != 'Not_Exists')
{
//alert('Can be locked');
         $("#"+a).prop("readonly", true);
         $("#"+a).prop("onclick", false);
         $("#"+a).css("color", "red");
         $("#"+a).on('click', function(e) {return false;});
 $("#" + a).on('mousedown focus',function(e) {
            e.preventDefault();
 $("#alert").html("<font size=2>   This field has been locked by  </font> "+ret);
           $("#alert").dialog({
                modal: true,
                resizable: false,
                minHeight: 105,
                width: 420,
                dialogClass: 'testclass'
            });  
    });
}
}

Application Process:

DECLARE
   lv_n_lock_id      NUMBER;
   lv_n_created_by   NUMBER;
   lv_v_result       VARCHAR2 (100);
BEGIN
   BEGIN
      SELECT lock_id, created_by
        INTO lv_n_lock_id, lv_n_created_by
        FROM pdvd_tb_field_locks
       WHERE UPPER (pdvd_type) = 'MASTER'
         AND pdvd_item_id = :ai_master_item_id
         AND SUBSTR (item_id, 1, INSTR (item_id, '_') - 1) = :ai_field_id
         AND session_id != :ai_app_session;
   EXCEPTION
      WHEN NO_DATA_FOUND
      THEN
         lv_n_lock_id := 0;
         lv_n_created_by := 0;
      WHEN TOO_MANY_ROWS
      THEN
         BEGIN
            SELECT DISTINCT created_by
                       INTO lv_n_created_by
                       FROM pdvd_tb_field_locks
                      WHERE UPPER (pdvd_type) = 'MASTER'
                        AND pdvd_item_id = :ai_master_item_id
                        AND SUBSTR (item_id, 1, INSTR (item_id, '_') - 1) =
                                                                  :ai_field_id
                        AND session_id != :ai_app_session;
         EXCEPTION
            WHEN OTHERS
            THEN
               lv_n_created_by := NULL;
         END;
   END;

   IF lv_n_lock_id <> 0
   THEN
      /*SELECT pdvd_pk_get_values.pdvd_fn_get_user_name (lv_n_created_by)
        INTO lv_v_result
        FROM DUAL;*/
      SELECT INITCAP (first_name) || ' ' || INITCAP (last_name)
        INTO lv_v_result
        FROM pdvd_tb_user_defn
       WHERE user_id = lv_n_created_by;

      HTP.p (lv_v_result);
   ELSE
      HTP.p ('Not_Exists');
   END IF;
END;

Field Locks - Link level
On-hover of link, field locks table been checked and alert been displayed of locked user.

No comments:

Post a Comment