posted on 02 Nov 2012 09:09 by lookpranoi in Oracle
ส่วนของกระบวนการทำรับใน 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 รักกันมิสู้รู้ใจกัน
posted on 21 Aug 2012 11:43 by lookpranoi in General
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 รักกันมิสู้รู้ใจกัน
posted on 11 Jun 2012 14:03 by lookpranoi in Oracle
อาจมีบ้างที่เรามีความจำเป็นต้องหยุด ยกเลิก การใช้งานสินค้า (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 รักกันมิสู้รู้ใจกัน