คลังเก็บหมวดหมู่: SAP

โม้เกี่ยวกับ SAP และ ABAP

Unicode ใน SAP

หลายวันก่อนมีบริษัทผู้ให้บริการซอฟต์แวร์ SAP เข้ามาที่ทำงานผม เนื้อหาที่เขาเข้ามาพูดก็คือการปรับรุ่นของซอฟต์แวร์ SAP ที่ ๆ ทำงานผมใช้อยู่ จากรุ่น 4.7 ไปเป็น ECC6 ซึ่งเรื่องปรับรุ่นไม่มีประเด็น เพราะถ้าไม่ปรับก็คงจะไม่มีใครมาช่วยเหลืออีก เนื่องจาก SAP เขาจะหยุดสนับสนุน SAP รุ่น 4.7 ในอีกประมาณครึ่งปีข้างหน้านี้

แต่ที่มีประเด็นกลับเป็นเรื่องของ Unicode เพราะรุ่น 4.7 ไม่ได้ใช้ Unicode ในขณะที่รุ่น ECC6 ใช้ Unicode!!!

จริง ๆ แล้ว Unicode ถูกออกแบบขึ้นมา เพราะโลกเรามันมีภาษาเขียนหลายสิบหลายร้อยภาษา ดังนั้น การเอาตัวเลขเพียงแค่ 8 บิต (รหัส ASCII) มาแทนอักขระของทุกภาษามันจึงเป็นไปไม่ได้ ดังนั้น เขาก็เลยเอาตัวเลขแบบ 16 บิต (Unicode) มาใช้แทนอักขระของทุกภาษาในโลก และเป็นที่มาของสิ่งที่เรียกว่า Unicode

ปัจจุบันมีการเอาตัวเลขแบบ 32 บิต (Unicode) มาใช้แทนอักขระของทุกภาษาในโลกแล้วด้วยซ้ำไป!!!

ทีนี้วกกลับมาเรื่องปรับรุ่น SAP ก่อน คือ บางครั้งบริษัทผู้ให้บริการซอฟต์แวร์ SAP เขาก็นำเสนอไม่ค่อยเป็น เพราะเมื่อถูกถามว่าทำไมต้องเปลี่ยนไปเป็น Unicode แทนที่เขาจะอธิบายว่าการเก็บข้อมูลมันจะเปลี่ยน เช่น จากเดิมอักขระ “ก” จะถูกเก็บ 8 บิตเป็นค่า A1 พอเปลี่ยนมาเป็น 16 บิตแบบ Unicode ก็จะกลายเป็นค่า 0E01 อะไรแบบนี้ คือเขาควรอธิบายแบบนี้ แต่กลายเป็นว่าเขาพาออกทะเล ดันไปบอกว่าถ้าเราใช้ Unicode แล้วมันจะสนับสนุนหลายภาษาได้ พาเข้ารกเข้าพงไปกันใหญ่ เพราะพอถามกลับไปว่าปรกติก็ใช้แต่ภาษาอังกฤษกับภาษาไทย แล้วจะใช้ Unicode ไปทำไมล่ะ ในเมื่อไม่ได้ใช้หลายภาษา ใช้แค่สองภาษาเอง?

นอกจากนี้ก็ยังมีเรื่องของเนื้อที่จัดเก็บ เพราะเดี๋ยวนี้ SAP เขาเก็บเป็น Unicode 32 บิต นั่นแสดงว่าเราต้องเสียเนื้อที่เพื่อจัดเก็บแต่ล่ะอักขระเพิ่มขึ้นเป็น 4 เท่า คือ จากเดิมอักขระเดียว 8 บิต ก็กลายเป็นอักขระนึง 32 บิต ซึ่งแสดงว่าเราต้องเพิ่มเนื้อที่ฮาร์ดดิสก์อีกอย่างเยอะ เพื่อให้รองรับต่อการขยายตัวนี้ ซึ่งข้อนี้บริษัทเขาสามารถโต้แย้งได้ คือเขาบอกว่า SAP ECC6 มันสามารถบีบอัดข้อมูลได้ 30% ดังนั้น ไม่น่าจะมีประเด็นเรื่องของเนื้อที่

ตอนจบของการพูดคุยเราเลยบอกเขาไปว่า เรายังคงอยากเก็บหนึ่งอักขระด้วยตัวเลข 8 บิตอยู่ ดังนั้น ช่วยไปหาตัวแปลงทั้งขาเข้าและขาออกจาก SAP ECC6 ให้มันคุยกับข้างนอกเป็น Unicode 32 บิต แล้วคุยข้างในเป็น ASCII 8 บิตให้ที

ให้ PHP ใช้ SAPRFC เพื่อดึงข้อมูลจาก SAP R/3

ผมกำลังจะทำชิ้นงานหนึ่งชิ้น เพื่อดึงเอาข้อมูลออกจาก SAP R/3 ออกมาใช้ครับ โดยชิ้นงานที่ว่าจะออกเป็นแนว Web Application ซึ่งผมก็คิดว่าผมจะสร้างมันด้วย PHP โดยจะใช้ SAPRFC ซึ่งเป็น PHP Extension สำหรับแทงทะลุเข้าไปใน SAP R/3 ครับ

จริง ๆ แล้วผมจะเขียนภาษา ABAP เพื่อให้มันทำงานบน SAP R/3 ก็ได้นะ มันได้ผลเหมือนกัน เพียงแต่ผมอยากจะแสดงผลออกมาเป็น Web Application ที่มีลูกเล่นสวย ๆ โดยใช้ XHTML + CSS + jQuery + AJAX มากกว่า และอีกอย่างผมก็ไม่อยากจะให้ผู้ใช้งาน ต้องมาติดตั้ง SAP GUI ให้วุ่นวายด้วย ก็เลยเลือกทำเป็น Web Application แทน

หลัก ๆ แล้วการเชื่อมต่อจาก PHP ไปที่ SAP R/3 สามารถทำได้สองวิธีครับ คือใช้ RFC กับใช้ SOAP แต่ผมเลือกใช้ RFC เพราะมีคนเก่ง ๆ ทำ PHP Extension ที่เรียกว่า SAPRFC ให้เราแล้ว ทำเป็น API สวยงาม พร้อมให้เราเรียกใช้ได้เลย

ตอนแรกผมนึกว่าผมจะใช้ ASP.NET เพื่อทำเป็น Web Application แล้วต่อเชื่อมไป SAP R/3 ด้วย SAP Netweaver ที่มี API ของ .NET Framework เตรียมมาให้ แต่แย่หน่อย ผมไม่ได้เป็นสาวกของ Microsoft ผมชอบ PHP มากกว่า ก็เลยเลือกใช้ PHP แทน (ชุมชนมันใหญ่ดี)

วกกลับมาเรื่อง RFC ต่อ คือว่า แนวคิดของ SAP R/3 เ่นี่ย เขาจะอนุญาตให้โปรแกรมคอมพิวเตอร์ภายนอกเรียกเข้ามาที่ SAP R/3 ได้ แต่ไม่ให้เรียกเข้ามาตรง ๆ มาคุ้ยมาเขี่ยตามใจชอบอะไรแบบนั้น คือจะต้องเรียก Function ที่เตรียมเอาไว้ใน SAP R/3 ซึ่ง Function ดังกล่าวก็จะมี Parameter สำหรับรับเข้าและส่งออก และที่สำคัญ Function ดังกล่าวต้องสร้างเอาไว้โดยมีคุณสมบัติเป็น Remote-enabled Module

มีคนแต่งหนังสือสอนเรื่องนี้ไว้หลายคน เช่น อันนี้ เป็นต้น

การเขียนโปรแกรมคอมพิวเตอร์เพื่อเชื่อมต่อกับ SAP R/3 ถือว่าเป็นเรื่องท้าทาย เพราะโดยปรกติแล้ว ก็มีแต่ผลิตภัณฑ์ของ SAP กันเองนั่นแหล่ะ ที่ใช้่ RFC เพื่อเชื่อมต่อรับส่งข้อมูลหากัน คนนอกไม่ค่อยอยากไปยุ่งด้วยเท่าไหร่หรอก มันเป็นระบบกึ่งปิดกึ่งเปิด

Cross Function Workflow

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

แต่พอผ่านไปผมก็พบว่า ยิ่งคุยยิ่งยาก ดังนั้น การเขียน flowchart มันไม่พอ มันต้องมีการแบ่งแยกด้วยว่า กระบวนการและข้อมูลในช่วงนั้น ๆ ถูกกระทำโดย Unit ใด ก็เลยกลายเป็นว่าต้องเขียนเป็น workflow แทน

เดี๋ยวนี้อาการหนัก เพราะตั้งแต่ทำ SAP R/3 เลยทำให้รู้ว่า การเขียน workflow แบบพื้น ๆ เพียงอย่างเดียวมันไม่พอ ต้องมีการใส่มิติให้กับมันด้วย เพราะ SAP R/3 มันมีหลาย Module ซะเหลือเกิน แถม Unit แต่ล่ะส่วน ก็ใช้ Module สลับไปสลับมาอีกต่างหาก T-T

ต่อไป ไม่แน่ อาจจะต้องเขียนกันเป็น workflow 3 มิติกันเลยทีเดียวเชียว

งาน SAP

ถ้าเราไม่นำเอามาตรฐาน ITIL มาใช้เพื่อแบ่งงานซ่อมบำรุง SAP เราก็จะสามารถแบ่งงาน SAP ออกได้เป็น 4 ประเภทใหญ่ ๆ คือ MODULE, BASIS, AUTHORIZE และ ABAP

งาน SAP
งาน SAP

งาน MODULE จะครอบคลุมการ Configure เพื่อให้ MODULE ต่าง ๆ เช่น FI, CO, MM, SD หรือ HR สามารถทำงานได้ตามความต้องการของผู้ใช้งาน

งาน BASIS จะเกี่ยวกับการจัดการขั้นพื้นฐานของ SAP เพื่อให้สามารถเชื่อมประสานระหว่าง Server, Database, Network และ SAP ได้อย่างลงตัว

งาน AUTHORIZE เป็นการกำหนดศักดิ์และสิทธิ์ให้กับผู้ใช้งาน ว่าจะสามารถใช้งานกลไกใด ๆ ใน SAP ได้บ้าง

งาน ABAP คือการเขียนโปรแกรมด้วยภาษา ABAP เพื่อสั่งให้ SAP ทำหรือไม่ทำสิ่งที่ต้องการ เพื่อตอบสนองความพึงพอใจสูงสุดของผู้ใช้งาน

มีคนเคยบอกผมว่าคนที่เชี่ยวชาญ SAP จะสามารถสร้างรายได้ให้กับตัวเองได้อย่างมากมาย แต่บางทีก็ต้องเจาะลึกลงไปเหมือนกัน ว่างานย่อยในส่วนใดของ SAP ที่ให้รายได้สูงที่สุด??

อือม ตรงนี้ผมก็ไม่รู้เหมือนกัน!!!

ทำไมภาษา ABAP จึงได้ยากจัง?

ภาษา ABAP เป็นภาษาที่ใช้ควบคุมกิจกรรมในระบบ SAP ซึ่งเป็นระบบ ERP ที่ยังพอต่อกรได้กับ Oracle Financial!!!

โปรแกรมทุกโปรแกรมในระบบ SAP ล้วนถูกเขียนขึ้นด้วยภาษา ABAP ดังนั้นถ้าใครก็ตามที่คิดจะควบคุม SAP ก็เลยจำเป็นจะต้องรู้จักภาษา ABAP ไปโดยปริยาย

งั้นมาสาธยายให้เห็นเป็นข้อ ๆ ดีกว่า ว่าทำไมภาษา ABAP จึงได้ยากจัง?

1. เพราะ Data Dictionary

ปัญหา

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

วิธีแก้ปัญหา

ในระบบ SAP มีเครื่องมือที่เรียกว่า Data Dictionary ซึ่งช่วยให้เราสามารถสืบค้นโครงสร้างของ table ต่าง ๆ ขึ้นมาดูได้ ดังนั้นเราจึงต้องใช้ต้นทุนเวลาที่เรามีไปกับการ ค้น ๆ ๆ และ ค้น เอา table แต่ล่ะตัวขึ้นมาดู ว่ามัน(น่าจะ)ใช้ทำอะไร, มีฟิลด์อะไรบ้าง และแต่ล่ะฟิลด์(น่าจะ)เอาไว้เก็บอะไร?

อ่านเพิ่มเติม ทำไมภาษา ABAP จึงได้ยากจัง?