Search code examples
javaoracle-adf

Fetch Selected LOV value and display corresponding data in other field


Table:Item

Columns:

  ItemNumber,
  Description

Transient Attribute1: Items

LOV created on Items which displays Item Number

Transient Attribute2:

 ItemsDescription-This should display Description of above item selected.Added following code on Attribute 2:


    if(ItemNumber!=null)
       { oracle.jbo.Key keyVal=new oracle.jbo.Key(ItemNumber); 
         return ItemVO1.findByKey(keyVal,1)[0].getAttribute("Description"); 
       } 
      else
         {
             return null; }

Need to display description on Attribute2 column


Solution

  • What I understood that your requirement is :

    You need to show item description based on item Number selection in LOV in ADF.

    Item Description and Item Number both are Transient field.

    I have used ADF 11g.

    I do not have any item related table. So I used 2 VO for Emp table itself.

       - One is base EmpVO
       - Second is LOV VO (empObjVO)
    

    Table : Emp

        - emp_id
        - emp_name
        - item_emp_id ( Transient variable - LOV - based on emp_id)
        - item_emp_desc (Output Transient variable - Output text - On selection of LOV)
    

    empObjVO - contains

         - emp_id ( This column is list for item_emp_id)
         - emp_name (This column will be description for selection of emp_id)
    

    EmpVo

         - item_emp_id has LOV of empObjVO1 with List Attribute and UI display attribute both.
          ( As you told item number is displayed in LOV. consider emp_id as item_number here).
    
           List type is choice list.
    

    After all above configuration, Place item_emp_id and item_emp_desc in a jsff page as select one choice and output text respectively.

    item_emp_id definition in page :

           <af:selectOneChoice value="#{bindings.item_emp_id.inputValue}"
                        label="#{bindings.item_emp_id.label}"
                        required="#{bindings.item_emp_id.hints.mandatory}"
                        shortDesc="#{bindings.item_emp_id.hints.tooltip}"
                        id="soc3"  autoSubmit="true"
                        valueChangeListener="#{bean1.changeVal}">
      <f:selectItems value="#{bindings.item_emp_id.items}" id="si3"/>
    </af:selectOneChoice>
    

    Make autosubmit=true for it.

    Create ValueChangeEventListner and create a method in a bean to trigger on change of value in LOV. item_emp_desc definition is :

        <af:outputText value="#{bindings.item_emp_desc.inputValue}" id="ot1"
                   partialTriggers="soc3"/>
    

    Use partial trigger as soc3 because it is dependent on soc3.

    public void changeVal(ValueChangeEvent vce) {
        // Add event code here...
        Integer selectedCode=null;
       //As we get indexes not value of LOV so need to map selected index with value.
    
        if (vce.getNewValue() != null) {
            this.setvalueToExpression("#{bindings.item_emp_id.inputValue}",
                                      vce.getNewValue()); //Updating Model Values
             selectedCode =
                Integer.parseInt(this.getValueFrmExpression("#{bindings.item_emp_id.attributeValue}").toString());
    
            System.out.println("******** Selected Value in List***** " +
                               selectedCode);
            System.out.println("*******Display Value in List ****" +
                               getValueFrmExpression("#{bindings.item_emp_id.selectedValue.attributeValues[1]}"));
        }
    
        String e_id=selectedCode.toString(); //It will contain selected item_emp_id
        DCBindingContainer bindings =
        (DCBindingContainer)BindingContext.getCurrent().getCurrentBindingsEntry();
        DCIteratorBinding dcIteratorBindings =
        bindings.findIteratorBinding("EmpView1Iterator"); // Base table Emp VO iterator
        DCIteratorBinding dcIteratorBindings1 =
        bindings.findIteratorBinding("empViewObj1Iterator"); // LOV table Emp Vo iterator
        ViewObject vo = dcIteratorBindings.getViewObject();
        ViewObject vo1 = dcIteratorBindings1.getViewObject();
        Row  r1 = vo.getCurrentRow(); // get current row of base table VO
    
    
        vo1.setWhereClause("e_id = " + e_id); // set where clause to get the description from LOV in VO1
        vo1.executeQuery(); //execute it.
        if(vo1.hasNext())
        {
        Row r=vo1.next(); // Get the row from LOV VO
    
        if(r!=null)
        {
           r1.setAttribute("item_emp_desc", r.getAttribute("EmpName")); //set it to item_emp_desc which is a transient variable for output.
        }
        }
    
    }
    
    
        public void setvalueToExpression(String el, Object val) {
            FacesContext facesContext = FacesContext.getCurrentInstance();
            ELContext elContext = facesContext.getELContext();
            ExpressionFactory expressionFactory = facesContext.getApplication().getExpressionFactory();
            ValueExpression exp = expressionFactory.createValueExpression(elContext, el, Object.class);
            exp.setValue(elContext, val);
        }
    
    
     public String getValueFrmExpression(String data) {
    FacesContext fc = FacesContext.getCurrentInstance();
    Application app = fc.getApplication();
    ExpressionFactory elFactory = app.getExpressionFactory();
    ELContext elContext = fc.getELContext();
    ValueExpression valueExp = elFactory.createValueExpression(elContext, data, Object.class);
    String Message = null;
    Object obj = valueExp.getValue(elContext);
            if (obj != null) {
    Message = obj.toString();
            }
            return Message;
        }
    

    For undestanding the index to value conversion I have taken reference from

     [http://www.awasthiashish.com/2014/05/getting-selected-value-not-index-display-value-of-select-one-choice-programmatically-in-adf.html][1]
    

    It may help you.