ปกติในการทำรายงานเพื่อดึงข้อมูลจาก Oracle EBS นอกจากจะใช้ Oracle Report, Oracle Discoverer หรือ Tool อื่นๆ ของ Oracle แล้ว   ตัว Reporting Product (SSRS) ของ Microsoft ก็ดูน่าสนใจไม่น้อย  ยิ่ง version ใหม่มีฟีเจอร์ที่น่าใช้หน้าตาดูดีขึ้นมากเลยทีเดียว

ซึ่งปกติทั่วไป หากใครเคยใช้งาน SSRS มาบ้าง หลักการก็คือสร้าง DataSource เพื่อเป็นตัว Connect เข้ากับ Database ชนิดต่างๆ ขึ้นมา   ในตัวรายงานก็อ้างถึง DataSource ตัวนั้น  แล้วสร้าง DataSet ที่มีคำสั่ง Select statement ตามเงื่อนไขต่างๆ  แล้วลาก Field มาแปะวางบนรายงาน แบบที่เราเข้าใจกันดีอยู่แล้ว

สำหรับวันนี้ที่จะพูดถึง คือ หากเราเขียน Query เพื่อดึงข้อมูลจาก Oracle EBS มักจะพบว่าการดึงข้อมูลจาก View บางตัว จะไม่สามารถ Select ได้ข้อมูลออกมาได้ตรงๆ  จะต้องมีการรันคำสั่ง PL/SQL เพิ่มเติมเล็กน้อย เพื่อให้สามารถเข้าถึงข้อมูลใน view เหล่านั้นได้


begin
  mo_global.set_policy_context('S', 81);         -- Org ID
  fnd_global.apps_initialize(0,20639,200);       -- User id, Response id, Application id
end;

เช่นเมื่อเรา select * from ar_cash_receipts_v  จาก view ดังกล่าวจะไม่พบข้อมูลใดๆ  
ให้เรารันคำสั่งด้านบนก่อน แล้วค่อยทำการ select จะสามารถเข้าถึงข้อมูลได้ปกติ

คราวนี้ในการทำรายงานด้วย SSRS จะทำอย่างไร หากต้องการ select ข้อมูลจาก view ดังกล่าวตรงๆ
จะไม่พบข้อมูลใดๆ เลย  จึงจำเป็นต้องรันคำสั่งดังกล่าวก่อนเช่นกัน โดยสามารถทำได้ดังนี้

 

สร้างรายงานขึ้นมา ในส่วนของ Datasets ให้ใส่คำสั่ง apps_initialize ลงไปตามในรูป (Name อะไรก็ได้ที่สื่อ)




หลังจากนั้น สร้าง Datasets ที่จะใช้งานขึ้นมา  จากในรูป query ดึงข้อมูลจาก view AR_CASH_RECEIPTS_V ซึ่งหาก run sql เพื่อดูผลลัพธ์จะไม่พบข้อมูลอะไรดังรูป

 


ดึง Field เพื่อไปวางลงบนรายงาน

 

* ที่สำคัญในส่วนของ Data Sources  ที่ตัวรายงานอ้างถึง (ที่เชื่อมต่อกับ EBS)
ให้เลือก Use single transaction when processing the queries  เพื่อเป็นแบบ transaction เดียวกัน (ปกติเป็นแบบ pararell transaction) คือ ทำงานไล่ลำดับกันไป ไม่ให้ทำงานพร้อมกันต่างคนต่างทำ  เพราะเราต้องการให้รายงานทำคำสั่ง app_initialize ก่อนนั่นเอง 

 

ทดสอบรันรายงาน จะพบว่าสามารถแสดงผลข้อมูลจากใน View ได้แล้ว :)

 

 

  *ส่วนนี้ยังมีเทคนิคบางอย่างอยู่ คือ ลำดับของ Datasets นั้นก็มีผลกับผลลัพธ์ โดยคำสั่ง apps_initialize นั้นจำเป็นต้องรันก่อนเป็นลำดับแรก ถึงจะไป select ข้อมูลจาก view ได้  ดังนั้น Datasets คำสั่ง apps_initialize ก็ควรจะอยู่บนสุดเป็นลำดับแรก เช่นกัน  เพื่อให้ตัวรายงานทำคำสั่งดังกล่าวก่อน  

 

 

จึงไม่แปลกหากในบางครั้ง เรารันรายงานแล้วไม่พบข้อมูล แต่หากรันซ้ำจะได้ข้อมูล เพราะไม่ได้กำหนด apps_initialize เป็นลำดับแรก  

แต่ถ้ารายงานเราในส่วนของ Datasets หลักมีการระบุ parameter เอาไว้ โดย user ต้องเลือกก่อนกดปุ่ม View Report  ก็ไม่จำเป็นให้ apps_initialize เป็นลำดับแรกก็ได้  เพราะว่ายังไง Datasets ตัวหลักที่มี parameter จะถูกรันเป็นตัวสุดท้ายอยู่แล้ว เพราะต้องรอ user ระบุค่าให้ครบแล้วกดปุ่ม ซึ่งกว่า user จะทำเสร็จ apps_initialize ก็ทำเสร็จไปนานแล้ว นั่นเอง ครับ

 

 

AP Invoice cancelled not completed

posted on 07 Nov 2016 17:57 by lookpranoi in Oracle

 

ในบางครั้งการ Cancelled AP Invoice  ทำแล้วไม่สมบูรณ์ อย่างเช่น  ยังสามารถคีย์ข้อมูลหรือแก้ไขได้ใน Distribution,  รายการ Accounting ไม่เกิด เป็นต้น




ให้ทำการ Examine เพื่อดูค่า INVOICE_ID และใช้ Script ดังนี้ เพื่ออัพเดทข้อมูล

copy ข้อมูล invoice ที่จะแก้ไปเก็บไว้ใน table ใหม่ก่อน

create table AP_INVOICES_XCX as
select * from AP_INVOICES_ALL
where invoice_id = :p_invoice_id
and org_id = :p_org_id;

ตรวจสอบข้อมูลเพื่อให้แน่ใจก่อนว่าได้ copy ไปแล้วจริง

select * from AP_INVOICES_XCX


อัพเดทข้อมูลใน table ตามนี้

update AP_INVOICES_ALL
set CANCELLED_DATE='',
cancelled_by='',
cancelled_amount='',
temp_cancelled_amount=''
where invoice_id = :p_invoice_id
and org_id = :p_org_id;

อย่าลืม COMMIT  แล้วลองกลับไปหน้า App  เพื่อทำการ Cancel Invoice และ Create Accounting อีกครั้ง   หากไม่มีปัญหาจะสามารถ Cancel ได้


ปล. แนะนำให้ทำในตัว Test Instance ก่อน หรือหากทำใน Production ก็ควรจะทำตาม step มีการ copy ข้อมูลเดิมเก็บไว้ก่อน  เผื่อไม่สำเร็จจะได้คืนค่ากลับไปเป็นค่าเดิมได้ ครับ




APP-SQLAP-10771: Could not reserve record

posted on 29 Dec 2015 08:01 by lookpranoi in Oracle


Solution การแก้ปัญหา APP-SQLAP-10771 : Could not reserve record. อ่านจาก message เข้าใจว่าเกิด session lock  แต่พอเข้าไป monitor session กลับไม่เจอ  ใช้ solution นี้หากพอจะรู้ว่า table ที่มันน่าจะโดน lock ไว้เพือ่หา SID ตัวที่มีปัญหา แล้ว kill session ทิ้งซะ

Credit http://oracler12applicationfunctional.blogspot.com/2015/02/app-sqlap-10771-could-not-reserve-record.html

 

APP-SQLAP-10771: Could not reserve record.

Error:

APP-SQLAP-10771: Could not reserve record.

Unable to pay the AP invoice in full, Got above error while performing the action –> pay in full

Solution:

Database lock from another session is present on the table AP_INVOICES_ALL, AP_INVOICE_LINES_ALL, AP_INVOICE_DISTRIBUTIONS_ALL for the same record that user was trying to modify from application.

1) To determine what session has a lock on this record, please execute the following steps:
         a) Run the following to determine what tables are locked:
                --- --- ---
                SELECT a.object_id, a.session_id, substr(b.object_name, 1, 40)
                FROM v$locked_object a, dba_objects b
                WHERE a.object_id = b.object_id
                AND b.object_name like 'AP_%'
                ORDER BY b.object_name;
                --- --- ---
         b) Look at the results and insert whatever AP_% tables are returned from a) into the script below:
                --- --- ---
                SELECT l.*, o.owner object_owner, o.object_name
                FROM SYS.all_objects o, v$lock l
                WHERE l.TYPE = 'TM'
                AND o.object_id = l.id1
                AND o.object_name in ('AP_INVOICES_ALL', 'AP_INVOICE_LINES_ALL', 'AP_INVOICE_DISTRIBUTIONS_ALL');
                --- ---
                SELECT SID, SERIAL#
                FROM v$session
                WHERE SID = <SID from b)>;
                --- --- ---
  2) Once the locking sessions have been identified, please use the below command to kill such sessions.
            --- --- ---
            ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE;
            ---
            Note: SID and serial# to be taken from the output from 1c).
            --- --- ---


Alternative Solution
==============

If there are many items locked you may find it easier to follow this alternative solution:
   a) Ensure no-one is working and no processes are running in the system.
   b) Bounce the database.
   c) Retest the issue.

เทคนิคการ custom folder บน Oracle EBS

posted on 29 Oct 2015 10:41 by lookpranoi in Oracle

ว่าด้วยเรื่องการ custom Folder ในหน้า Form ของ Oracle EBS  นั้นสามารถทำได้ดังนี้

เปิดหน้า Form ที่ต้องการขึ้น ไปที่เมนู Folder -> Folder Tool


 

หน้าตาของ Folder Tool ดังรูป

เม้าส์คลิกใน field ที่ต้องการทำรายการ  ลองกดลูกศรเลื่อนซ้าย เพื่อขยับ Field ใน Form ไปยังตำแหน่งที่ต้องการ  ใช้สำหรับในการจัดตำแหน่งของข้อมูลตามความต้องการของผู้ใช้งาน

 

เมนูการเลือก Show Field และ Hide Field  เพื่อแสดงหรือซ่อน ข้อมูลเพิ่มเติม

 


ตัวอย่าง เทคนิค Custom Folder 
จากในรูป Show Field ที่ชื่อว่า Approval Status เพิ่มเข้ามาใน Form

 

หลังจากนั้นเข้าสู่โหมด enter query เพื่อต้องการ filter ข้อมูลที่ต้องการ  และทำการ Ctrl + F11 เพื่อ Query ข้อมูล

 

สังเกตว่าเมื่อได้ข้อมูลที่ต้องการแล้ว  ให้เข้าไป Folder -> View Query จะปรากฎเงื่อนไขของ Query ที่ได้มาของข้อมูลบนหน้าจอ

 

เลือกเมนู Folder -> Save As เพื่อบันทึก Folder นี้ โดยจะมี option ต่างๆ ดังนี้

Folder : กำหนดชื่อ Folder   จากในตัวอย่างต้องการแสดงข้อมูล JV ที่สถานะอนุมัติแล้ว และเป็นของปี 2015 เดือน 3  โดยตั้งชื่อ JV_ApproveMAR2015 เพื่อให้สื่อ เป็นต้น

Autoquery : Always เรียกข้อมูลอัติโนมัติที่เปิด Form , Never ไม่ทำการเรียกข้อมูล , Asl each time ถามก่อนทุกครั้งที่จะเรียกข้อมูล

Open as default : หากเลือกจะเป็นการกำหนด folder นี้เป็น default ทุกครั้งที่เปิด form

Public : หากเลือก Folder นี้ user อื่นๆ จะสามารถเห็นและใช้งานได้

Include Query : ให้เลือกด้วยหากต้องการให้ folder นี้แสดงข้อมูลแบบมีเงื่อนไข

 

 

 

เมื่อเปิด Form จะเป็นไปตามเงื่อนไขที่กำหนด คือ default folder ไปที่ JV_ApproveMAR2015 พร้อมทั้งแสดงข้อมูลให้โดยอัติโนมัติ

 

 

การแก้ไข Folder สามารถทำได้โดยก