รู้จักภาษา ABAP เปิดเบื้องหลังของ SAP R/3 ตอน 3 คำสั่ง While


1,188 ผู้ชม


คำสั่ง While

คำสั่ง While เป็นคำสั่งที่ใช้ในการวนลูป ซึ่งคล้ายกับคำสั่ง DO แต่จะต่างกันตรงที่คำสั่ง While นั้น จะมีการเช็กเงื่อนไขก่อนเข้าไปใช้งานในบล็อคของคำสั่ง While ซึ่งถ้าเงื่อนไขให้ค่าจริง ระบบก็จะทำคำสั่งในบล็อคของ While แต่ถ้าเงื่อนไขให้ค่าเท็จ ระบบก็จะออกจากการทำงานของลูปของคำสั่ง While เช่น
Data count type I value 1.
While count <> 4.
Write: / sy-index.
count = count + 1.
Endwhile.
ตัวแปรระบบ sy-index จะใช้ได้เฉพาะในคำสั่ง DO กับ While เท่านั้น และเมื่อเอ็กซิคิวต์โปรแกรมข้างต้น เราจะได้หน้าจอดังนี้
1
2
3
เนื้อหาของภาษา ABAP ในฉบับนี้ ก็คงไม่ยากจนเกินไปนะครับ ผมหวังว่าหลายๆ ท่านคงจะไม่ท้อจนทิ้ง ABAP ไปเสียก่อน แล้วติดตามตอนต่อไปในฉบับหน้าครับ

Tip & Technique

ในการคำนวณจากสเตจเมนต์ของภาษา ABAP นั้น ถ้าชนิดของข้อมูลเป็นชนิด I กับ P ระบบจะปัดเศษให้โดยอัตโนมัติเมื่อมีการคำนวณ เช่น
DATA temp TYPE I.
tmp = 1 / 2. "temp = 1
tmp = '1.8'. "temp = 2
ส่วนข้อมูลชนิด F นั้น จะไม่มีการปัดเศษให้แต่อย่างใด (ชนิดของข้อมูลชนิด F เป็นชนิดที่ใช้ในการคำนวณทางคณิตศาสตร์) ลองมาดูตัวอย่างต่อไปนี้
DATA: x TYPE I,
y TYPE I,
z TYPE I.
x = 1.
y = 2.
z = ( x / y ) * 100.
ค่า z จะได้ค่าเท่ากับเท่าไร ? คำตอบก็คือ 100 ซึ่งมาจาก x / y หรือ 1 / 2 ได้เท่ากับ 0.5 ซึ่งทั้งตัวแปร x และ y นั้น มีชนิดของข้อมูลเป็นชนิด I ดังนั้นผลการคำนวณที่ได้ จะมีการปัดเศษจาก 0.5 ให้เป็น 1 จากนั้นจึงนำไปคูณด้วย 100 จึงได้ค่า 100 นั่นเอง แต่ถ้าเราลองเปลี่ยนชนิดของข้อมูลของตัวแปร z เป็นชนิด P ดังตัวอย่างต่อไปนี้
DATA: x TYPE I,
y TYPE I,
z TYPE P.
x = 1.
y = 2.
z = ( x / y ) * 100.
ค่าตัวแปร z จะได้เท่ากับเท่าไร คำตอบคือ 50 ทำไมจึงเป็นเช่นนี้ ลองมาดูหลักการการคำนวณของภาษา ABAP ดังนี้ จากสเตจเมนต์ของการคำนวณ z = ( x / y ) * 100. นั้น ระบบจะวิเคราะห์คำสั่งคำนวณนี้ เพื่อกำหนดชนิดข้อมูลที่จะใช้ในการคำนวณ โดยมีหลักการคือ
* ถ้าในสมการ ตัวแปรที่เกี่ยวข้องทั้งหมดมีชนิดของข้อมูลเป็นชนิด I ระบบจะคำนวณในฝั่งขวาของสมการเป็นแบบชนิด I
* แต่ถ้าในสมการ มีตัวแปรตัวใดตัวหนึ่งไม่ว่าจะอยู่ฝั่งซ้ายหรือฝั่งขวาของสมการ มีชนิดของข้อมูลเป็นชนิด P ระบบจะคำนวณที่ฝั่งขวาของสมการในแบบชนิด P ดังนั้นจากตัวอย่างของโปรแกรมที่สองนั้น ตัวแปร z จะมีชนิดของข้อมูลเป็นชนิด P ดังนั้นเมื่อมีการคำนวณสมการในฝั่งขวาซึ่งก็คือ ( x / y ) * 100 ระบบจะแปลงชนิดของข้อมูลของตัวแปร x กับ y ให้มีชนิดเป็นชนิด P หลังจากนั้นจึงเริ่มการคำนวณ ซึ่งจะได้ 0.5 ซึ่งตามปกติแล้ว ถ้าข้อมูลเป็นชนิด I หรือ P เมื่อคำนวณตัวเลขได้ ระบบจะปัดเศษให้โดยอัตโนมัติ ดังนั้นจากตัวอย่างข้างต้น จึงควรที่จะได้ 1 ใช่ไหม ? คำตอบคือใช่แต่ไม่ทั้งหมด มันมีสูตรหรือหลักการวิเคราะห์ต่อไปอีกคือ ถ้าในสมการฝั่งขวามีการคำนวณในลักษณะของ Intermediate Result ในที่นี้ก็คือ ( x / y ) ถ้าเป็นการคำนวณในแบบชนิด P ระบบจะทำการแปลงชนิดของข้อมูลให้เป็นชนิด F ดังนั้นการคำนวณชนิด F ผลที่ได้จะไม่มีการปัดเศษแต่อย่างใด ผลที่ได้จากการคำนวณใน Intermediate Result ก็คือ 0.5 เมื่อนำไปคูณด้วย 100 จึงได้ 50 นั่นเอง
เห็นไหมครับ แค่เราเปลี่ยนชนิดของข้อมูลของตัวแปรเพียงนิดเดียว ค่าของข้อมูลหายไปตั้งครึ่ง ดังนั้นก่อนที่จะเขียนโปรแกรมในลักษณะที่มี Intermediate Result อยู่ในสมการแล้ว ก็ควรจะพิจารณาชนิดของข้อมูลที่เกี่ยวข้องให้ดีนะครับ

Tip & Technique

ข้อมูลที่เป็น Literal ในภาษา ABAP นั้น มีด้วยกัน 2 ชนิดด้วยกันคือ
1. Text Literal โดยจะมีข้อมูลเป็นชนิด Character เช่น
Write 'Hello ABAP'. "ค่าของข้อมูล Hello ABAP เป็น Text Literal
2. Numeric Literal โดยถ้าค่าข้อมูลมีค่าไม่เกิน 231 - 1 ระบบจะมองข้อมูล Numeric Literal นี้ เป็นชนิด I เช่น
temp = 12345. "ค่า 12345 เป็น Numeric Literal ที่มีชนิดข้อมูลเป็น I
แต่ถ้าข้อมูล Numeric Literal มีค่าเกินกว่า 231 - 1 ระบบจะมองข้อมูลของ Numeric Literal เป็นชนิด P แทน เช่น
temp = 12345678900. " ค่า 12345678900 เป็น Numeric Literal ที่มี " ชนิดของข้อมูลเป็นชนิด P
ดังนั้นถ้ามีสมการของการคำนวณเป็นดังตัวอย่างต่อไปนี้
Data temp type I.
temp = 111111111 / 333333333 * 2.
ค่าของตัวแปร temp จะได้เท่ากับ 0 เพราะ 111111111 (ตัวเลขจำนวน 9 หลัก) หารด้วย 333333333 (ตัวเลขจำนวน 9 หลัก) จะได้เท่ากับ 0.333333... ซึ่งเป็นการคำนวณชนิด I (เพราะค่า 111111111 และ 333333333 มีค่าไม่เกิน 231 - 1) ดังนั้นผลที่ได้จากการคำนวณจึงมีการปัดเศษทำให้ได้ค่า 0 และเมื่อนำไปคูณกับค่า 2 จึงทำให้ได้ค่า 0 แต่ถ้าเราเปลี่ยนค่าตัวเลขเป็นแบบตัวอย่างต่อไปนี้
Data temp type I.
temp = 1111111111 / 3333333333 * 2.
ค่าของตัวแปร temp จะได้เท่ากับ 1 เพราะว่าค่า 3333333333 (ตัวเลขจำนวน 10 หลัก) มีค่าเกินกว่า 231 - 1 ดังนั้นระบบจึงมองข้อมูล Numeric Literal นี้เป็นชนิด P ดังนั้นการคำนวณในสมการฝั่งขวาจึงมีการคำนวณเป็นชนิด P ทำให้การคำนวณค่า 1111111111 / 3333333333 (เป็นตัวเลข 10 หลักทั้งคู่) จึงเป็นการคำนวณแบบชนิด P และการคำนวณข้อมูลชุดนี้เป็น Intermediate result ดังนั้นระบบจึงแปลงชนิดของข้อมูลให้เป็นชนิด F เพื่อคำนวณต่อไป ผลที่ได้คือ 0.333333... ซึ่งจะไม่มีการปัดเศษเพราะเป็นข้อมูลชนิด F เมื่อนำไปคูณกับค่า 2 จึงได้ 0.666666... และเมื่อนำไปให้ค่ากับตัวแปร temp ซึ่งเป็นชนิด I จึงมีการปัดเศษเป็น 1 นั่นเอง และสำหรับ Numeric Literal นี้ สามารถเก็บค่าข้อมูลได้ไม่เกิน 31 หลัก


PC Magazine

ฉบับที่ 45 ตุลาคม 2545
อ่านบทความอื่นๆ >>

อัพเดทล่าสุด