সমস্যাটি:
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
