ปกติในการทำรายงานเพื่อดึงข้อมูลจาก 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 ก็ทำเสร็จไปนานแล้ว นั่นเอง ครับ

 

 

Comment

Comment:

Tweet