Checkbox wise Data Insert from Classic Report Query APEX_ITEM

 



সমস্যাটি:

  • APEX_ITEM.CHECKBOX2 (G_F01): এটি শুধুমাত্র সেই রোগুলোর মান পাঠায় যেগুলি আপনি Check করেছেন। আপনি যদি ১ নম্বর এবং ৩ নম্বর রো চেক করেন, তবে G_F01 এর কাউন্ট হবে ২ এবং এর ইনডেক্স হবে ১ এবং ২।

  • APEX_ITEM.TEXT (G_F03): এটি রিপোর্টের সবগুলো রো-এর মান পাঠায় (চেক করা থাক বা না থাক)।

  • ভুল ম্যাপিং: আপনার কোডে আপনি FOR i IN 1..APEX_APPLICATION.G_F01.COUNT লুপ চালাচ্ছেন এবং তার ভেতর apex_application.g_f03(i) ব্যবহার করছেন।

    • এর ফলে, আপনি যখন ১ ও ৩ নম্বর রো সিলেক্ট করছেন, লুপটি ২ বার ঘুরছে।

    • প্রথমবার সে G_F03(1) (১ম রো-এর ইনপুট) নিচ্ছে।

    • দ্বিতীয়বার সে G_F03(2) (২য় রো-এর ইনপুট) নিচ্ছে, যদিও আপনি ৩ নম্বর রো চেক করেছেন।


সমাধান (Solution)

step:1
=====

Create Classic Report.

SQL Query:
-------------

SELECT 

-- Checkbox Item

    APEX_ITEM.CHECKBOX2(
        p_idx   => 1,
        p_value => b.REQ_LINE_ID
    ) AS CONF,


-- Hidden (ROW mapping)

APEX_ITEM.text(2, b.REQ_LINE_ID) AS HID_ID,


       b.REQ_LINE_ID as  DOCUMENT_LINE_ID,

       b.LINE_NUM,

       b.ITEM_ID,

       c.XNAME as ITEM_NAME,

       b.ITEM_UOM as UOM,

       b.QUANTITY,

--- BALANCE_QUANTITY

'<span class="balqty" 
       data-balance="'||
       PO_PKG.GET_PR_QTY ( b.CID,b.REQ_HEADER_ID, b.REQ_LINE_ID,'BAL')

       ||'" 

       style="font-weight:bold; color:green; text-align:center; display:inline-block; min-width:60px;">' ||

       PO_PKG.GET_PR_QTY ( b.CID,b.REQ_HEADER_ID, b.REQ_LINE_ID,'BAL') ||

'</span>' AS BALANCE_QUANTITY,


--- INPUT_QUANTITY

       APEX_ITEM.text(

           p_idx        => 3,

           p_value      => PO_PKG.GET_PR_QTY ( b.CID,b.REQ_HEADER_ID, b.REQ_LINE_ID,'BAL'),

           p_attributes => 'class="inputqty" 

                            style="text-align:center; max-width:100px;"'

       ) AS INPUT_QUANTITY

  FROM TABLE_NAME   
WHERE a.REQ_HEADER_ID = :P12801_SRC_REQ_HEADER_ID ;

Step:2
=====

Select HID_ID column
Escape special characters: Off

Heading: Null

HTML Expression: <span style="display:none;">#HID_ID#</span>

Step:3
=====

PL/SQL Insert Process:
--------------------------

DECLARE

    v_input_qty    NUMBER;

    v_found_idx    NUMBER;

    v_inserted     NUMBER := 0;

    v_ipadr        VARCHAR2(500);

BEGIN

    -- ১. চেক করা হয়েছে কি না নিশ্চিত করা

    IF APEX_APPLICATION.G_F01.COUNT = 0 THEN

        RAISE_APPLICATION_ERROR(-20001, 'Please select at least one row!');

    END IF;


    -- ২. লুপ চলবে শুধুমাত্র সিলেক্ট করা আইডিগুলোর ওপর (G_F01)

    FOR i IN 1 .. APEX_APPLICATION.G_F01.COUNT LOOP

        

      -- ৩. ঐ আইডির বিপরীতে G_F03 (Input Qty) এর সঠিক ইনডেক্স খুঁজে বের করা
-- G_F02 হলো আপনার Hidden REQ_LINE_ID। এটি অবশ্যই রিপোর্টে থাকতে হবে।

        v_found_idx := 0;

        FOR j IN 1 .. APEX_APPLICATION.G_F02.COUNT LOOP

            IF APEX_APPLICATION.G_F02(j) = APEX_APPLICATION.G_F01(i) THEN

                v_found_idx := j;

                EXIT;

            END IF;

        END LOOP;


        -- ৪. যদি ইনডেক্স পাওয়া যায়, তবে ইনসার্ট হবে

        IF v_found_idx > 0 THEN

            v_input_qty := TO_NUMBER(APEX_APPLICATION.G_F03(v_found_idx));


            FOR r1 IN (

                SELECT b.CID, b.ZID, b.XLID, b.XBID, a.REQ_HEADER_ID, b.REQ_LINE_ID,

                       b.ITEM_ID, c.XNAME AS ITEM_NAME, b.ITEM_UOM, b.UNIT_PRICE,

                       b.WAREHOUSE_ID, b.PROJECT_ID, b.XREMARKS

                FROM PO_REQ_HEADERS a, PO_REQ_LINES b, INV_ITEMS c

                WHERE a.REQ_HEADER_ID = b.REQ_HEADER_ID

                  AND b.ITEM_ID = c.XITEM_ID

                  AND b.REQ_LINE_ID = APEX_APPLICATION.G_F01(i)

                  AND a.CID = :G_CID

                  AND a.XBID = :G_XBID

            ) LOOP

                INSERT INTO PO_LINES (

                    CID, ZID, XLID, XBID, PO_HEADER_ID, REQ_HEADER_ID, REQ_LINE_ID,

                    ITEM_ID, ITEM_NAME, ITEM_UOM, QUANTITY, UNIT_PRICE, 

                    WAREHOUSE_ID, PROJECT_ID, ZACTIVE, XREMARKS, 

                    ZTIME, ZUTIME, ZEMAIL, ZUEMAIL, XAPPID, XPAGEID, XSESSION, XIPADR

                ) VALUES (

                    r1.CID, r1.ZID, r1.XLID, r1.XBID, :P12801_PO_HEADER_ID, r1.REQ_HEADER_ID, r1.REQ_LINE_ID,

                    r1.ITEM_ID, r1.ITEM_NAME, r1.ITEM_UOM, v_input_qty, r1.UNIT_PRICE,

                    r1.WAREHOUSE_ID, r1.PROJECT_ID, 1, r1.XREMARKS, 

                    SYSDATE, SYSDATE, :APP_USER, :APP_USER, :APP_ID, :APP_PAGE_ID, :SESSION, v_ipadr

                );

                v_inserted := v_inserted + 1;

            END LOOP;

        END IF;

    END LOOP;


    -- ৫. সাকসেস মেসেজ বা এরর ডিবাগ

    IF v_inserted > 0 THEN

        apex_application.g_print_success_message := v_inserted || ' Row(s) successfully added.';

    ELSE

        -- যদি কোড রান হয় কিন্তু ইনসার্ট না হয়, তবে নিচের এররটি দেখাবে

        RAISE_APPLICATION_ERROR(-20002, 'Matching failed! Checkbox (G_F01) values found, but Hidden (G_F02) array is empty or not matching.');

    END IF;



EXCEPTION

    WHEN OTHERS THEN

        IF SQLCODE = -20002 OR SQLCODE = -20001 THEN RAISE;

        ELSE 

            generate_errorlog_prc(:g_zid,:g_xbid,'ERROR','PROCESS:ADD_PR_TO_PO_DML',SQLCODE,SQLERRM,null,:APP_USER,:APP_ID,:APP_PAGE_ID,:SESSION,v_ipadr,null);

            RAISE_APPLICATION_ERROR(-20010, 'Error: '||SQLERRM);

        END IF;

END;


When Button Press: Save




Post a Comment

Previous Post Next Post