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

Basic Tables and Programs involved in Conversions

posted on 02 Oct 2013 09:54 by lookpranoi  in Oracle
 


Order Import Interface (Sales Order Conversion)

Interface Tables

OE_HEADERS_IFACE_ALL
OE_LINES_IFACE_ALL
OE_ACTIONS_IFACE_ALL
OE_ORDERS_CUST_IFACE_ALL
OE_PRICE_ADJS_IFACE_ALL
OE_PRICE_ATTS_IFACE_ALL

Base Tables

OE_ORDER_HEADERS_ALL
OE_ORDER_LINES_ALL
QP_PRICING_ATTRIBUTES

Concurrent Program:

Order Import

API

OE_ORDER_PUB.GET_ORDER and OE_ORDER_PUB.PROCESS_ORDER

Item Import

Interface Tables

MTL_SYSTEM_ITEMS_INTERFACE
MTL_ITEM_REVISIONS_INTERFACE
MTL_ITEM_CATEGORIES_INTERFACE
MTL_INTERFACE_ERRORS

Concurrent program:

Item Import

Base Tables:

MTL_SYSTEM_ITEMS_B
MTL_ITEM_REVISIONS_B
MTL_CATEGORIES_B
MTL_CATEGORY_SETS_B
MTL_ITEM_STATUS
MTL_ITEM_TEMPLATES

Inventory Onhand Quantity

Interface Tables

MTL_TRANSACTION_INTERFACE
MTL_TRANSACTION_LOTS_INTERFACE
MTL_SERIAL_NUMBERS_INTERFACE

Concurrent Program:

Can be submitted in Transaction Manager through Interface Manager

API

INV_TXN_MANAGER_PUB.PROCESS_TRANSACTIONS

Base Tables:

MTL_ONHAND_QUANTITIES
MTL_LOT_NUMBERS
MTL_SERIAL_NUMBERS

Customer Conversions

Interface Tables

RA_CUSTOMERS_INTERFACE_ALL
RA_CUSTOMER_PROFILE_INT_ALL
RA_CONTACT_PHONES_INT_ALL
RA_CUSTOMER_BANK_INT_ALL
RA_CUST_PAY_METHOD_INT_ALL

Base Tables

RA_CUSTOMERS
RA_ADDRESSES_ALL
RA_CUSTOMER_RELATIONSHIPS_ALL
RA_SITE_USES_ALL

Concurrent Program

Customer Interface

API

Trading Community Architecture uses the APIs to create the customers too
APIs are

Set the organization id

Exec dbms_application_info.set_client_info();

Create a party and an account

HZ_CUST_ACCOUNT_V2PUB.CREATE_CUST_ACCOUNT
HZ_CUST_ACCOUNT_V2PUB.CUST_ACCOUNT_REC_TYPE
HZ_PARTY_V2PUB.ORGANIZATION_REC_TYPE
HZ_CUSTOMER_PROFILE_V2PUB.CUSTOMER_PROFILE_REC_TYPE

Create a physical location

HZ_LOCATION_V2PUB.CREATE_LOCATION()
HZ_LOCATION_V2PUB.LOCATION_REC_TYPE

Create a party site

HZ_PARTY_SITE_V2PUB.CREATE_PARTY_SITE()
HZ_PARTY_SITE_V2PUB.PARTY_SITE_REC_TYPE

Create an account site

HZ_CUST_ACCOUNT_SITE_V2PUB.CREATE_CUST_ACCT_SITE()
HZ_CUST_ACCOUNT_SITE_V2PUB.CUST_ACCT_SITE_REC_TYPE

Create an account site use

HZ_CUST_ACCOUNT_SITE_V2PUB.CREATE_CUST_SITE_USE()
HZ_CUST_ACCOUNT_SITE_V2PUB.CUST_SITE_USE_REC_TYPE
HZ_CUSTOMER_PROFILE_V2PUB.CUSTOMER_PROFILE_REC_TYPE

Base Tables

HZ_PARTIES
HZ_PARTY_SITES
HZ_LOCATIONS
HZ_CUST_ACCOUNTS
HZ_CUST_SITE_USES_ALL
HZ_CUST_ACCT_SITES_ALL
HZ_PARTY_SITE_USES

Auto Invoice Interface

Interface Tables

RA_INTERFACE_LINES_ALL
RA_INTERFACE_SALESCREDITS
RA_INTERFACE_DISTRIBUTIONS
RA_INTERFACE_ERRORS

Base Tables

RA_BATCHES
RA_CUSTOMER_TRX_ALL
RA_CUSTOMER_TRX_LINES_ALL
AR_PAYMENT_SCHEDULES_ALL
RA_CUSTOMER_TRX_LINE_SALESREPS
RA_CUST_TRX_GL_DIST_ALL
RA_CUSTOMER_TRX_TYPES_ALL

Concurrent Program

Auto invoice master program

Requisition Import

Interface Tables

PO_REQUISITIONS_INTERFACE_ALL
PO_REQ_DIST_INTERFACE_ALL

Base Tables:

PO_REQUISITIONS_HEADERS_ALL
PO_REQUISITION_LINES_ALL
PO_REQ_DISTRIBUTIONS_ALL

Concurrent Program:

Requisition Import

Purchase Order Conversions

Interface Tables:

PO_HEADERS_INTERFACE
PO_LINES_INTERFACE
PO_DISTRIBUTIONS_INTERACE
PO_INTERCAE_ERRORS

Concurrent Interface Program:

Import Standard Purchase Orders

Base Tables:

PO_HEADERS_ALL
PO_LINES_ALL
PO_DISTRIBUTIONS_ALL
PO_LINE_LOCATIONS_ALL

edit @ 2 Oct 2013 09:55:38 by รักกันมิสู้รู้ใจกัน

 
แก้ปัญหาในการใช้ Chrome ในการ log in เข้า e-business suite แล้วฟ้อง FRM-92129 error
ใน Chrome web store มี extension ในการแก้ไขปัญหานี้ให้โหลดด้วย
https://chrome.google.com/webstore/detail/oracle-ebs-r1211i-enablem/ekkagabmggbmpmncofhgkfigmeldifnc


สะดวก เสียจริง ๆ :-)


edit @ 26 Aug 2013 21:41:12 by รักกันมิสู้รู้ใจกัน

 
การเรียกใช้ API เพื่อสร้างการแปลงหน่วย conversion ต่างๆ  โดยไม่ต้อง input เองผ่านหน้า app
 
 
 
INSTANCE: This API is available from the release R12.1.3 Oracle Applications
PACKAGE:          INV_CONVERT 
PROCEDURE  :   CREATE_UOM_CONVERSION
NOTES:  Creates the Item Specific conversion between two uom's using uom_rate 
TO_UOM_CODE = UOM_RATE * FROM_UOM_CODE
Return_status values
                      S : Successful conversion creation
                      W : Conversion exists prior
                      E : Error in creation conversion
                      U : Unexpected error occurred
SCRIPT:
SET SERVEROUTPUT ON;
 
DECLARE
p_from_uom_code    VARCHAR2(200);
p_to_uom_code      VARCHAR2(200);
p_item_id          NUMBER;
p_uom_rate         NUMBER;
x_return_status    VARCHAR2(200);
l_msg_data         VARCHAR2(2000); 
v_context          VARCHAR2(100);
 
 
FUNCTION set_context( i_user_name    IN  VARCHAR2
                     ,i_resp_name    IN  VARCHAR2
                     ,i_org_id       IN  NUMBER)
RETURN VARCHAR2
IS
BEGIN
NULL;
-- Inorder to reduce the content of the post I moved the implementation part of this      function to another post and it is available her e  
END set_context;
BEGIN
--1. Set applications context if not already set.
  BEGIN
    v_context := set_context('OPERATIONS','Inventory, Vision Operations (USA)',204);
    IF v_context = 'F'
    THEN
       DBMS_OUTPUT.PUT_LINE('Error while setting the context'||SQLERRM(SQLCODE));       
    END IF;
  END;
  p_from_uom_code := 'USD';  -- Should be a Base unit for Intra-class conversion
  p_to_uom_code := 'EUR';
  p_item_id := '59412';
  p_uom_rate := '1.5';
 
  INV_CONVERT.CREATE_UOM_CONVERSION
                  (
                    P_FROM_UOM_CODE => p_from_uom_code,
                    P_TO_UOM_CODE   => p_to_uom_code,
                    P_ITEM_ID       => p_item_id,
                    P_UOM_RATE      => p_uom_rate,
                    X_RETURN_STATUS => x_return_status
                  );
 
  IF x_return_status = 'S' Then
     dbms_output.put_line(' Conversion Got Created Sucessfully ');
  ELSIF x_return_status = 'W' Then
     dbms_output.put_line(' Conversion Already Exists ');
  ELSIF x_return_status = 'U' Then
     dbms_output.put_line(' Unexpected Error Occured ');
  ELSIF x_return_status = 'E' Then     
     LOOP
       l_msg_data := FND_MSG_PUB.Get(FND_MSG_PUB.G_NEXT,FND_API.G_FALSE);
       IF l_msg_data is NULL Then
       EXIT;
       END IF;
       DBMS_OUTPUT.PUT_LINE('Message' || l_msg_data);
     END LOOP;  
  END IF; 
END; 

ส่วนของกระบวนการทำรับใน E-Business Suite นั้น  ในเมนู Receipts  เท่าที่พบปัญหาบ่อยๆ
คือในขั้นตอนการทำรับ  ตอนระบุคลังจัดเก็บ Subinventory  มักจะพบความผิดพลาดระบุผิดคลัง
ทำให้สินค้าเข้าระบบผิดที่ผิดทาง  ส่งผลให้ส่วนงานที่ใช้งานต่ออาจไม่พบสินค้าในระบบได้
 
โดยปกติ ผู้ใช้งาน จะต้องเลือก Subinventory ที่ต้องจากจัดเก็บจาก List of value เหมือนในรูป
 
โดย Feature ที่สามารถนำมาช่วยลดปัญหาในการทำรับผิดคลังนี้ คือ Item Transactions Defaults
อยู่ใน Inventory Responsibility -> Setup -> Transactions -> Item Transactions Defaults

 

สิ่งที่ต้องทำคือการกำหนด item ที่ต้องการลงไป  และเลือก Default For และเลือก Subinventory
จากในรูป ความหมาย คือ  สินค้าดังกล่าว หากมีการทำรับสินค้า ให้ใช้ subinventory FGI เป็นค่าเริ่มต้น


 
 
ลองกลับมาทดสอบผลลัพธ์กัน  ลองทำรับสินค้าตัวเดิม  ผลคือช่อง Subinventory จะ default ค่าเป็น FGI ให้อัติโนมัติ
แต่หาก ไม่ต้องการใช้ค่า default  ก็สามารถเลือกเปลี่ยนได้เช่นกัน
 
 
 
โดยสรุปแล้ว  การกำหนด Item ที่จะทำรับต่อ Subinventory เช่นนี้  สามารถลดปัญหาความผิดพลาดในการทำงานได้ดีพอสมควร  อยู่ในเงื่อนไขที่ว่า Item ที่จะทำรับนั้นสามารถระบุที่จัดเก็บ (Subinventory) ได้ล่วงหน้าหรือไม่ ?

หากเป็นกรณีไม่สามารถกำหนดหรือระบุได้ล่วงหน้า  หากทำ Item Transactions Defaults ไว้  แต่ก็ต้องทำการเลือกค่าอยู่ดี  หากว่าไม่ตรงกับความต้องการจริง 
 
หรือในอีกกรณีอื่นๆ เช่น 
มีการทำรับสินค้า  ปกติสินค้านี้เก็บไว้ในคลัง A  แต่เผอิญไม่มีพื้นที่จัดเก็บแล้ว 
ต้องไปเก็บที่คลัง B แทน  เมื่อทำรับในระบบก็จะ default มาเป็นคลัง A 
แต่ทางผู้ใช้ก็ต้องทำการเปลี่ยนจาก A เป็น B แทน  เท่านั้น ครับ


....





edit @ 2 Nov 2012 09:36:45 by รักกันมิสู้รู้ใจกัน

Option ที่ 8 ของคำสั่ง ADPATCH

posted on 22 Oct 2012 08:41 by lookpranoi  in Oracle

from Oracleskill.com credit by นี่เราเป็น DBA หรือเปล่านะ

สำหรับคนที่รู้แล้วก็อย่าว่ากันนะครับ

เผอิญ ผมมีปัญหากับ adpatch ซึ่งมันรัน sql บางตัวไม่ผ่าน  error ดังด้านล่าง
ATTENTION: Please fix the above failed worker(s) so the manager can continue.

ทำไงดี มันมีแต่ให้ fix กับ restart ทำไงก็ไม่ผ่าน

ปรากฏว่า ไป search เจอใน google คือ option ที่ 8 ใน adpatch ซึ่งปกติจะมีแค่ 7 แต่ option ที่ 8 มันคือ การ skip อันที่ error

--------------------------------- start adctrl output -----------------------------

                    AD Controller Menu
     ---------------------------------------------------

     1.    Show worker status

     2.    Tell worker to restart a failed job

     3.    Tell worker to quit

     4.    Tell manager that a worker failed its job

     5.    Tell manager that a worker acknowledges quit

     6.    Restart a worker on the current machine

     7.    Exit


Enter your choice [1] : 8

Enter the worker number(s)/range(s) or 'all' for all workers,
or press [Return] to go back to the menu : 2

ตามนี้เลย ใครเคย adpatch ก็น่าจะรู้ว่ามันมีแค่ 7
โห มัน undocument จริง ๆ นะเนี่ย
ดีใจครับเลยมาแบ่งปัน

SQL Optimization

โดยปกติในการเขียนคำสั่งหรือภาษา SQL นั้น  เขียนขึ้นมาเพื่อใช้เข้าถึงข้อมูลจากในฐานข้อมูลเป็นหลัก  ซึ่งการเขียนที่แตกต่างกันเล็กน้อยก็ส่งผลกับความเร็วหรือประสิทธิภาพในการเข้าถึงข้อมูลด้วย  เลยอยากจะรวมตัวอย่างคร่าวๆ ที่มักพบกันบ่อย หรืออะไรเล็กๆ น้อยๆ แต่ส่งผลต่อความเร็วในการเข้าถึงข้อมูลอย่างมากเลย  Query ที่ให้ผลลัพธ์เหมือนกันทุกประการ  แตกต่างกันที่วิธีการเขียน SQL และเวลาที่ใช้ในการ Execute  ต่างกันระดับ millisecond  แต่หากเรากำลังจะเข้าถึงข้อมูลอันมีขนาดมหาศาลมันจะส่งผลอย่างมากเช่นกัน

 

Actual column names instead of *

คำสั่ง SQL จะทำงานได้เร็วขึ้น  ถ้าเราอ้างถึงชื่อฟิลด์ (Field) หรือ คอลัมส์ (Column) ใน  SELECT statement  แทนที่จะแทนทั้งหมดด้วยเครื่องหมาย  *     การ select เฉพาะฟิลด์ที่ต้องการใช้จริงๆ  ย่อมส่งผลให้ใช้เวลาน้อยลงนั่นเอง

 

 จากในรูปเห็นความแตกต่างเพียงเล็กน้อย Query แรกหลีกเลี่ยงการใช้ * ผลที่ได้ Execution Time น้อยกว่า Query ถัดมา

 

 

Having clause is like a filter

HAVING clause นั้นเปรียบเสมือนการกรองข้อมูล (Filter)  โดยมันจะทำการกรองข้อมูลหลังจาก select ข้อมูลมาครบทุกรายการแล้ว  ซึ่งควรหลีกเลี่ยง  และที่ควรทำคือการกรองข้อมูล (Filter) ในขณะที่ select ข้อมูลโดยใช้  WHERE  จะให้ประสิทธิภาพที่ดีกว่า

จากตัวอย่างในรูปก็จะเห็นชัดเจนในเรื่องการใช้  HAVING  ที่จะใช้เวลาในการ Query นานกว่าจริง

 

The number of subquery block in query

จำนวนของ subquery ที่อยู่ภายใต้ main query นั้นมีผลอย่างมากต่อความเร็วในการประมวลผลและเข้าถึงข้อมูล  ควรจะให้มีจำนวน subquery ให้น้อยเท่าที่สุดเท่าที่จะทำได้

 

 

Using EXISTS instead of DISTINCT

ใช้คำสั่ง EXISTS แทน DISTINCT  เมื่อมีการ join ข้อมูลกันใน table/view  ที่มีความสัมพันธ์แบบ one-to-many  โดยปกติจะได้ผลลัพธ์ที่ซ้ำๆ กันจากความสัมพันธ์ดังกล่าว   หากต้องการชุดข้อมูลที่ซ้ำแสดงเพียงรายการเดียว  โดยส่วนใหญ่ใช้คำสั่ง DISTINCT  ลองเปลี่ยนเป็น EXISTS แทนจะได้ผลลัพธ์เช่นเดียวกับคำสั่ง DISTINCT

 

 

UNION ALL in place of UNION

ใช้ UNION ALL แทนการใช้  UNION

 

 พอจะเป็นตัวอย่าง คร่าวๆ  สังเกตว่าเวลาที่ห่างกันเพียงเล็กน้อยเอง ระดับ millisecond  แต่ถ้าลองมองแล้ว  ถ้าจำนวนข้อมูลเยอะๆ  หรือ query ที่ซับซ้อนมากกว่านี้  จะส่งผลต่อเวลาอย่างมหาศาลเลย  ฉะนั้นเรื่องพื้นๆ ก็อย่ามองข้าม นะครับ

 

.

.

 

edit @ 21 Aug 2012 13:23:34 by รักกันมิสู้รู้ใจกัน


   อาจมีบ้างที่เรามีความจำเป็นต้องหยุด ยกเลิก การใช้งานสินค้า (item) บางตัวในระบบ เช่น สินค้าเลิกผลิตไปแล้วและเพื่อมีผลกับระบบ  โดยไม่ให้มีการกระทำใดๆ กับสินค้าดังกล่าวในระบบอีก  จึงต้องเข้าไปทำการ Inactive สินค้า

การ Inactive เข้าไปในส่วนของเมนู Item  จากในรูป Inactive แล้วเกิด error ในลักษณะนี้
เกิดจากมี sales order ที่ยังคงค้างและอ้างอิงกับ item code ตัวนี้อยู่, กระบวนการ order life cycle ยังไม่ครบ loop  หรือโดนจองสินค้าไว้อยู่  ด้วยเหตุผลทั้งหลายเหล่านี้  ย่อมส่งผลให้ไม่สามารถ inactive item ดังกล่าวได้




สามารถใช้ query เพื่อตรวจสอบได้   สังเกตช่อง SOURCE_LINE_ID

select * from wsh_delivery_details
where inventory_item_id =&item_id
and pickable_flag = 'Y'
and inv_interfaced_flag in ('N','P')
and released_status <> 'D'
and organization_id =&org_id;



 
 
 
 
 
 


สำหรับวิธีการแก้ไขให้จำเป็นต้องรัน script  เพื่อยกเลิกรายการคงค้างในแต่ละรายการใน sales order ที่ปรากฎ

<download script>

เปลี่ยนนามสกุลจาก .jpg เป็น .sql  และ ftp upload  ไปยัง server




telnet ไปยัง server  ด้วย user ที่มี database permission  (ORAXXXXX)
change directory ไปยังตำแหน่งของ script  และใช้ sqlplus เพื่อรัน script ดังกล่าว




โดย Parameter ที่ต้องการก็คือ ค่า SOURCE_LINE_ID จากใน query แรกนั่นเอง
สุดท้ายอย่าลืม commit;




หากว่ามีรายการ LINE_ID ที่คงค้างเยอะ  การสั่งรันซ้ำๆ ก็คงจะลำบากไม่น้อย  อาจประยุกต์ใช้โปรแกรม Dataload
ในการทำวนซ้ำในการรัน script ก็ได้


 
ซึ่งท้ายสุดเมื่อจัดการรายการทั้งหมดที่ค้างได้แล้ว   กลับมาทำการ Inactive item อีกครั้ง
ก็จะพบว่าสามารถทำได้แล้ว ครับ
 
 

@ขอขอบคุณ Oracle Support  ที่มาของ Script
...
...

edit @ 11 Jun 2012 14:30:30 by รักกันมิสู้รู้ใจกัน

edit @ 11 Jun 2012 14:31:15 by รักกันมิสู้รู้ใจกัน

edit @ 11 Jun 2012 14:33:09 by รักกันมิสู้รู้ใจกัน

edit @ 11 Jun 2012 14:37:16 by รักกันมิสู้รู้ใจกัน

Oracle E-Business Suite R12 Table/View change

posted on 14 May 2012 07:59 by lookpranoi  in Oracle
"