คิดว่าหลายๆ คน คงเคยเจอปัญหา select ข้อมูล view บน ebs แล้วไม่พบข้อมูล no data กันมาแล้วแน่ๆ  ซึ่งตัว view หลายๆ ตัวบน ebs นั้น บางส่วนมีการ protect ข้อมูลเอาไว้สำหรับ user บน application เท่านั้นที่จะ access ได้  หรือบางส่วนก็มีการ protect ข้อมูลในส่วนของภาษาไว้ เช่น ข้อมูลชุดนี้ให้เห็นสำหรับประเทศนี้ ดังเช่น พวกข้อมูลเกี่ยวกับภาษี ที่แต่ละประเทศก็จะมีข้อมูลแตกต่างกัน เป็นต้น

  ซึ่งวันนี้จะแนะนำวิธีในการเข้าถึงข้อมูลดังกล่าว ทำยังไงให้ select ข้อมูลจาก view เหล่านั้นได้

วิธีที่ 1  จากในรูปลอง select ข้อมูลจาก view ดังกล่าว แต่ไม่พบข้อมูล



ให้รันสคริปตามในกรอบสีแดง  แล้วลอง select อีกครั้งจะได้ข้อมูลใน view ทันที

declare
  v_user_id number;
  v_resp_id number;
  v_appl_id number;
begin

mo_global.set_policy_context('S', 81);

select fnd.user_id , fresp.responsibility_id, fresp.application_id
    into v_user_id, v_resp_id, v_appl_id
from fnd_user fnd , fnd_responsibility_tl fresp
where fnd.user_name = 'SYSADMIN'
and fresp.responsibility_name = 'Receivables Manager';

fnd_global.apps_initialize(v_user_id, v_resp_id, v_appl_id); 
end;




เกี่ยวกับ mo_global.set_policy_context และ fnd_global.app_initialize หลักการคือรันคำสั่งเหล่านี้เพื่อให้ session ของเราเสมือนว่า log in เข้าใช้งานผ่านหน้าจอ application เพื่อจะสามารถ access data ได้นั่นเอง


วิธีที่ 2   หากลองวิธีแรกแล้วยังไม่ได้ผล อาจะเป็นเรื่องของ NLS_LANG ซึ่ง view บางตัวมีการกำหนดเรื่องของการเข้าถึงแต่ Region Setting เอาไว้ด้วย  

ตัวอย่าง  select ข้อมูลจาก view นี้แล้วไม่พบข้อมูล

select * from fa_additions;

เข้าไปดู SQL ของ view นี้ พบว่ามีเงื่อนไข T.LANGUAGE = userenv(‘LANG’)



ซึ่งค่าใน Field LANGUAGE นั้นมีแต่แค่ “US” เท่านั้น




ลอง Select ค่า userenv(‘LANG’) ได้ค่า TH   นั่นคือสาเหตุว่าทำไม select แล้ว no data
เพราะเงื่อนไข TH <> US




ให้รันคำสั่ง dbms_session.set_nls ตามในรูป  ค่าของ userenv(‘LANG’) ก็จะถูกกำหนดตามที่เราต้องการ  


ลอง select ข้อมูลอีกครั้ง ก็จะได้ข้อมูลขึ้นมาแล้ว






https://docs.oracle.com/cd/E18727_01/doc.121/e12897/T302934T462356.htm



edit @ 2 Jun 2017 13:59:24 by Lookpranoi


Using Email (utl_smtp) in Oracle 11g (results in ORA-24247) – Network Access Control List (ACL).

กรณีเจอปัญหา เมื่อส่งเมล์ด้วย code  UTL_SMTP.OPEN_CONNECTION

 ORA-24247: network access denied by access control list (ACL)


http://remidian.com/2013/01/email-network-access-in-oracle-11g-network-access-control-list-acl/#comment-160512

Oracle EBS with Chrome - Try again with ThinForms

posted on 14 Feb 2017 15:49 by lookpranoi in Oracle


     จากที่เคยได้เขียนวิธีใช้ Chrome ในการเข้าใช้งาน Oracle EBS เอาไว้ตามบทความเก่านี้ ... 
http://lookpranoi.exteen.com/20130826/frm-92129-error-chrome  

The Source code please visit
https://github.com/zorrofox/ebs-chrome-enablement
PLEASE NOTE THIS PLUGIN MAY NOT WORK ON EBS 12.0.X VERSION, BUT 12.1.X IS OK. AND I WILL WORK ON IT.

 

สำหรับ EBS 11i นั้นใช้งานได้ดี  แต่พอเป็น EBS Version ใหม่ ตัว Extension นี้ก็ใช้งานไม่ได้ 

   วันนี้ผมบังเอิญได้ทดลองตัว extension ใหม่ ที่ชื่อว่า "ThiForms" ซึ่งเมื่อติดตั้งแล้วสามารถใช้งาน Oracle EBS ด้วย Chrome ได้   (Version ที่ทดสอบ  Oracle Applications : 12.2.5)

 

เข้าไปใน Chrome Web Store : ค้นคำว่า Oracle หรือ ThinForm 

 

 

ตัวนี้ทำมาเพื่อใช้รัน Form บน Chrome โดยเฉพาะ

 

เมื่อ Add extionsion แล้วให้เข้าหน้า Oracle EBS ปกติ login แล้วเข้าไปในหน้า Form ใดๆ 
ตัว ThinForms Plugin จะทำงานทันที   โดยครั้งแรกที่เข้าเราจะต้อง download ตัว install ก่อนใช้งาน

 

ให้แตกไฟล์ zip "ThinForms_JavaHost_installer"  แล้ว double click เพื่อ install ตามรูป
ใส่ License Key และ Company Name ไม่ต้องใส่

 

หลังจากนั้นให้เข้า Oracle EBS ใหม่อีกครั้งจะปรากฎ ThinForms Extestion ขึ้นมาเหมือนในรูป

 

หน้า Form Application R12 สามารถเปิดได้แล้วด้วย Chrome

ทั้งนี้ทั้งนั้น มันเป็น Trial Version นะครับ  ทดลองใช้ฟรีแค่ 60 วัน

 

NOTE: This is a TRIAL version. You can run this free trial version for 60 days. Please contact sales@talkingbyte.com if you require an extension to your trial period.

http://www.talkingbyte.com

 

 

    ปกติในการทำรายงานเพื่อดึงข้อมูลจาก 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 สามารถทำได้โดยการไปที่เมนู Folder -> Save As  ในรูปลองเอา Open As Default ออกและ Save

 

เมื่อเข้ามาใน Form อีกครั้งจะพบว่า Folder ดังกล่าวไม่ได้ถูกโหลดขึ้นมา  โดยหากต้องการใช้ต้องเลือกจากเมนู Folder ดังในรูป


จากตัวอย่าง เป็นการประยุกต์ใช้งาน Folder เพื่อรองรับการแสดงผลที่หลากหลายขึ้นตามกลุ่มผู้ใช้ เช่น สำหรับกลุ่มผู้ใช้นี้ต้องการให้เห็นข้อมูลบางประเภท , กลุ่มผู้ใช้นี้เห็นข้อมูลบาง Field หรือเห็นเท่าที่ใช้  ลองนำไปประยุกต์ใช้ดู นะครับ

 

 

edit @ 29 Oct 2015 10:47:24 by Lookpranoi

begin
      dbms_application_info.set_client_info(org_id);
end;
 
หรือ
 
begin
      fnd_global.apps_initialize ( user_id      => i_user_id,                                   
                                               resp_id      => g_respon_id,
                                               resp_appl_id => g_appl_id);
end;
 
 

Building an Oracle Report with a Barcode

posted on 19 Nov 2014 08:56 by lookpranoi in Oracle
Before building a report which contains barcode, follow all the required setup steps. These are detailed in the post: 
 
 

ปกติ code_combination_id จะถูกฝังไว้ในแต่ละ transaction อยู่แล้วเมื่อเกิดการเดินรายการทางบัญชี
หากจะดูในรายงานก็ต้องหาให้ได้ว่า code เหล่านั้น ตรงกับชื่อบัญชีอะไร

CODE_COMBINATION_ID |  ACCOUNT NAME   | ACCOUNT DESC
                             1001 | 01.10.1234.000.00 | บริษัทA.แผนกไอที.โบนัสพนง.NA.NA


ใช้ script ดังนี้ในการหา หรือทำเป็น view ไว้เลย เพื่อความสะดวกในการใช้งาน

* ส่วนของ segment เพิ่มเติมเข้าไป เช่น ในระบบใช้ตั้งแต่ segment1 ถึง segment5 ให้เพิ่มเข้าไปใน script 
Credit by http://jayantaapps.blogspot.com/2013/06/gl-code-combination-id-description.html


GL Code Combination Id & Description
 
1) 
select
gcc.segment1||'.'||gcc.segment2||'.'||gcc.segment3
 ACCOUNT,
A1.DESCRIPTION||'-'||A2.DESCRIPTION ||'-'|| A3.DESCRIPTION  DECS
from
fnd_flex_values_vl A1,
fnd_flex_values_vl A2,
fnd_flex_values_vl A3,
gl_code_combinations gcc
WHERE
a1.flex_value=gcc.segment1 
And a1.FLEX_VALUE_SET_ID in ( select FLEX_VALUE_SET_ID
                            from fnd_id_flex_segments
                           WHERE application_id = 101 AND id_flex_code = 'GL#' and enabled_flag = 'Y' 
                           and application_column_name='SEGMENT1' )
and a2.flex_value=gcc.segment2
And a2.FLEX_VALUE_SET_ID in ( select FLEX_VALUE_SET_ID
                            from fnd_id_flex_segments
                           WHERE application_id = 101 AND id_flex_code = 'GL#' and enabled_flag = 'Y' 
                           and application_column_name='SEGMENT2' )
and a3.flex_value=gcc.segment3
And a3.FLEX_VALUE_SET_ID in ( select FLEX_VALUE_SET_ID
                            from fnd_id_flex_segments
                           WHERE application_id = 101 AND id_flex_code = 'GL#' and enabled_flag = 'Y' 
                           and application_column_name='SEGMENT3' )


2)  ---Only in R12----
select gcc.CONCATENATED_SEGMENTS,
GL_FLEXFIELDS_PKG.get_concat_description( gcc.chart_of_accounts_id, gcc.code_combination_id) acc_description
FROM gl_code_combinations_kfv gcc
 

edit @ 25 Sep 2014 16:06:53 by Lookpranoi