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

ฉบับที่แล้ว ผมได้กล่าวถึงเรื่อง Data Object ตัวแรกที่อยู่ใน Memory Space ซึ่งก็คือตัวแปร (หรือ Variable) ในฉบับนี้เรามาเรียนรู้ Data Object ตัวที่สองใน Memory Space ซึ่งก็คือ Structure นั่นเอง โดยที่ Structure นี้ เรียกอีกอย่างหนึ่งว่าตัวแปรเรคอร์ดก็ได้


การสร้าง Structure

คำสั่งที่ใช้ในการสร้าง Structure ก็คือ คำสั่ง Data เหมือนกับการสร้างตัวแปรปกตินั่นเอง เพียงแต่เราเพิ่มออปชัน begin of เข้าไปในคำสั่ง Data ก็จะเป็นการสร้าง Structure เช่น

Data begin of material.
Data matno(12) type N.
Data matdesc(20) type C.
Data end of material.

หรือเขียนในแบบ Colon Notation จะได้ดังนี้

Data: begin of material,
matno(12) type N,
matdesc(20) type C,
end of material.
รูปที่ 1



..... รูปที่ 1 สิ่งที่เราได้จากการใช้คำสั่ง Data ที่ Memory Space ก็คือตัวแปร Structure ชื่อ Material .....


ตัวแปร Structure ที่ชื่อ material จะมีฟิลด์ในตัวแปรอยู่สองฟิลด์ด้วยกันคือ matno และ matdesc และในการเรียกใช้งานตัวแปร Structure นั้น เราต้องเรียกใช้ตามรูปแบบดังนี้คือ <ชื่อ Structure&gt-&ltlฟิลด์> เช่น

material-matno = 1.
material-matdesc = 'Material No.1'.
รูปที่ 2



..... รูปที่ 2 เมื่อระบุค่าลงไปในแต่ละฟิลด์ จะได้ข้อมูลที่ Memory Space ดังรูป.....

และเช่นเดียวกัน ถ้าเราต้องการแสดงข้อมูลฟิลด์ matno ของ Structure ที่ชื่อ material เราก็จะต้องอ้างอิงฟิลด์ใน Structure ดังนี้

Write material-matno.

เราก็จะได้ข้อมูล 000000000001 ที่หน้าจอต่อไป จากรูปแบบของการเรียกใช้งานตัวแปร Structure ที่มีเครื่องหมาย - รวมอยู่ด้วยนี้ ผมจึงไม่แนะนำให้สร้างตัวแปรธรรมดาที่มีเครื่องหมาย - รวมอยู่ในชื่อตัวแปร เพราะเวลาเราเรียกใช้งานตัวแปรนั้น อาจทำให้เราเข้าใจผิดคิดว่าเป็นฟิลด์ใน Structure ก็ได้ เพื่อป้องกันความสับสนที่อาจจะเกิดขึ้น โปรดหลีกเลี่ยงการใช้เครื่องหมาย - ในชื่อตัวแปรธรรมดานะครับ

สำหรับการสร้างตัวแปรธรรมดานั้น เราสามารถใช้ออปชัน LIKE ในการดึงโครงสร้างของฟิลด์ในตารางของฐานข้อมูลใน Data Dictionary ของระบบ SAP ได้ เช่นสมมติว่าเราต้องการสร้างตัวแปรที่ชื่อ custid ที่ใช้เก็บข้อมูลของรหัสลูกค้า เราสามารถใช้คำสั่ง

Data custid like customers-id.

ระบบจะสร้างตัวแปรที่ชื่อ custid โดยมีชนิดของข้อมูลและ Length เหมือนกับฟิลด์ id ของตาราง customers ที่อยู่ใน Data Dictionary ของระบบ SAP R/3 (Transaction Code SE11)

จะเห็นได้ว่าออปชัน Like นั้น จะช่วยให้เราสร้างตัวแปรที่มีชนิดของข้อมูลและ Length ที่เหมือนกันกับฟิลด์ในตารางของฐานข้อมูลได้อย่างง่ายดาย โดยที่เราไม่จำเป็นที่จะต้องรู้ชนิดของข้อมูลและ Length แต่อย่างใด แต่ถ้าเราใช้ออปชัน Like แล้วตามด้วยชื่อตารางหรือ Structure ใน Data Dictionary ของระบบ SAP เราก็จะได้ตัวแปร Structure แทนตัวแปรธรรมดา เช่น

Data tempcust like customers.
รูปที่ 3



..... รูปที่ 3 สมมติว่าตาราง customers มีทั้งหมด 3 ฟิลด์คือ id, name และ city เราจะได้ตัวแปร Structure ที่ชื่อ tempcust ใน Memory Space ดังรูป .....

ก็คือระบบจะ Copy โครงสร้างของตาราง customers มาให้กับตัวแปร Structure ที่ชื่อ tempcust นั่นเอง นอกจากนี้เรายังสามารถสร้าง Structure ในอีกรูปแบบหนึ่งดังนี้

Data begin of tempcust.
Include structure customers.
Data tel(10) type C.
Data end of tempcust.
รูปที่ 4



..... รูปที่ 4 เมื่อใช้คำสั่ง Include Structure เพื่อดึงโครงสร้างของตาราง customers มาสร้าง Structure ที่ชื่อ tempcust จะได้ผลดังรูป .....


คำสั่ง Include Structure เป็นคำสั่งที่ใช้ในการดึงโครงสร้างของตาราง customers มา สร้างให้กับ Structure ที่ชื่อ tempcust และถ้าเรายังไม่ใช้คำสั่ง Data end of tempcust เราก็ยังสามารถเพิ่มฟิลด์เข้าไปใน Structure ที่ชื่อ tempcust ได้อีก ซึ่งในที่นี้ก็คือฟิลด์ tel นั่นเอง ซึ่งจากคำสั่งข้างต้น เราจะได้ Memory Space ดังรูปที่ 4

อย่าลืมนะครับว่า ทุกครั้งที่ระบบทำการสร้าง Data Object อะไรก็ตามที่ Memory Space ระบบจะให้ค่าเริ่มต้นกับสิ่งที่มันสร้างขึ้นมาด้วยเสมอตามชนิดของข้อมูล นั้นๆ และเมื่อจบการทำงานของโปรแกรม ระบบจะเคลียร์พื้นที่ Memory Space ทิ้งไปด้วยเช่นกัน

List Buffer

รูปที่ 5



..... รูปที่ 5 List Buffer เป็นอีกส่วนหนึ่งที่อยู่ใน Local Memory .....
คำสั่ง ABAP ที่ใช้ในการแสดงผลข้อมูลที่หน้าจอ จะมีด้วยกัน 3 คำสั่ง คือคำสั่ง Write คำสั่ง Skip และคำสั่ง Uline ซึ่งคำสั่งเหล่านี้จะเป็นการสร้างผลของข้อมูลที่ List Buffer (หน้าจอรายงานของระบบ SAP จะเรียกว่า List) ซึ่งเป็นพื้นที่อีกส่วนหนึ่งที่อยู่ใน Local Memory ของ Work Process ดังรูปที่ 5

เมื่อมีการทำงานตามคำสั่ง ABAP ของโปรแกรมทั้งหมดแล้ว Work Process ก็จะส่งข้อมูลที่ List Buffer ไปให้กับ Dispatcher เพื่อนำข้อมูลส่งกลับไปที่ Presentation Server ซึ่งก็คือโปรแกรม SAPGUI ที่เครื่องไคลเอ็นต์อีกที เพื่อแสดงผลข้อมูลที่หน้าจอต่อไป เช่นเดียวกันกับ Memory Space เมื่อโปรแกรม ABAP ทำงานเสร็จสิ้นโดยสมบูรณ์ ระบบจะเคลียร์พื้นที่ List Buffer ทิ้งไปเช่นเดียวกัน

คำสั่ง Write

คำสั่ง Write จะเป็นคำสั่งที่ใช้ในการแสดงข้อมูลของ Data Object ใน Memory Space หรือค่าคงที่ (Literal) เช่น

Data temp type I.
Data tempcust like customers.
Write temp.
Write tempcust-id. "ฟิลด์ id ของ Structure ที่ชื่อ tempcust
Write 'Hello ABAP'.

หรือเขียนในรูปแบบ Colon Notation ได้ดังนี้

Data: temp type I,
tempcust like customers.
Write: temp, tempcust-id, 'Hello ABAP'.

เราจะได้ข้อมูลดังนี้ที่หน้าจอ

0 00000000 Hello ABAP

โดยที่ระบบจะแสดงผลข้อมูลระหว่างค่าต่างๆ คั่นด้วย Space ถ้าเราต้องการระบุตำแหน่งคอลัมน์ที่ต้องการให้แสดงข้อมูล เราสามารถระบุตำแหน่งของคอลัมน์ได้ดังนี้

Write: 5 'Hello ABAP', 25 'Hello World'.

ระบบจะแสดงข้อมูล Hello ABAP ในตำแหน่งคอลัมน์ที่ 5 ของบรรทัดปัจจุบัน และค่า Hello World ที่ตำแหน่งคอลัมน์ที่ 25 ในบรรทัดเดียวกัน และถ้าเราต้องการให้มีการขึ้นบรรทัดใหม่ เราจะใช้เครื่องหมาย / ในการกำหนดการขึ้นบรรทัดใหม่ เช่น

Write: 5 'Hello ABAP',
/5 'Hello World'.

เราจะได้ข้อมูลดังนี้ที่หน้าจอ ดังรูปที่ 6
รูปที่ 6
รูปที่ 7

ถ้าเราต้องการกำหนด Length ในการแสดงข้อมูล ก็ให้เขียนคำสั่ง Write: /5(20) 'Hello ABAP', 'Hello World'. เราจะได้ข้อมูลดังนี้ที่หน้าจอ ดังรูปที่ 7

ถ้าเราต้องการกำหนดสีของแบ็กกราวนด์ในการแสดงข้อมูล ก็ให้ใช้ออปชัน Color ในคำสั่ง Write เช่น

Write: 'Hello ABAP' color 6, " ค่า 6 คือสีแดง
'Hello World' color 3. " ค่า 3 คือสีเหลือง

นอกจากนี้ เราสามารถใช้คำสั่ง Format เพื่อกำหนดสีของ Background ของคำสั่ง Write ทั้งหมดก็ได้ เช่น

Format color 3.
Write: 'Hello ABAP', 'Hello World'.
Format color off. "กำหนดค่าสีให้เป็นสีปกติ

หรือถ้าไม่ต้องการให้แสดงค่าศูนย์ที่ไม่มีค่าออกมา ก็ให้ใช้ออปชัน NO-ZERO เช่น

Data temp(5) type N value 23.
Write: temp, temp NO-ZERO.

เราจะได้ข้อมูลดังนี้ที่หน้าจอ

00023 23

ถ้าเราไม่ต้องการให้แสดงค่าเครื่องหมาย - สำหรับตัวเลขค่าลบออกมา ก็ให้ใช้ออปชัน NO-SIGN เช่น

Data temp type I value 9.
Write: temp, temp NO-SIGN.

เราจะได้ข้อมูลดังนี้ที่หน้าจอ

9- 9

ถ้าเราต้องการจัดตำแหน่งแสดงข้อมูลให้อยู่ชิดซ้าย ชิดขวา หรือตรงกลาง เราสามารถใช้ออปชัน LEFT-JUSTIFIED, RIGHT-JUSTIFIED หรือ CENTERED เช่น
รูปที่ 8


Data temp type I value 9.
Write: / temp,
/ temp LEFT-JUSTIFIED,
/ temp CENTERED.

เราจะได้หน้าจอดังรูปที่ 8

ซึ่งปกติแล้วข้อมูลชนิดตัวเลขจะอยู่ตำแหน่งชิดขวา ส่วนข้อมูลประเภท Character จะอยู่ตำแหน่งชิดซ้าย แต่อย่าลืมนะครับว่า คำสั่ง Write ไม่มีผลใดๆ ต่อข้อมูลที่จัดเก็บอยู่ใน Memory Space เพราะคำสั่ง Write เป็นแค่เพียงคำสั่งที่ใช้ในการแสดงข้อมูลที่หน้าจอเท่านั้น

คำสั่ง Skip

คำสั่ง Skip เป็นคำสั่งที่ใช้ในการสร้างบรรทัดเปล่าๆ หรือ Blank Line เช่น

Write 'Hello ABAP'.
Skip. " ได้บรรทัดเปล่า 1 บรรทัด
Write 'Hello World'.
Skip 2. " ได้บรรทัดเปล่า 2 บรรทัด
Write 'Line 6'.
Skip to line 8. " ข้ามไปบรรทัดที่ 8
Write 'Line 8'.

เราจะได้หน้าจอดังรูป

Hello ABAP

Hello World

Line 6

Line 8


คำสั่ง Uline

คำสั่ง Uline เป็นคำสั่งที่ใช้ในการตีเส้นแนวนอน เช่น

Write 'Hello ABAP'.
Uline.
Write: /5 'Hello World'.
Uline /5(11). " / คือขึ้นบรรทัดใหม่

เราจะได้หน้าจอดังนี้

Hello ABAP
--------------------------------------------------------------------
Hello World
---------------

นอกจากนี้เรายังสามารถที่จะใช้ตัวแปรระบบของ Structure ที่ชื่อ sy ในการทำเส้นก็ได้ โดยที่ตัวแปรระบบ sy-vline จะเป็นการตีเส้นแนวตั้ง (|) และ sy-uline จะเป็นำการตีเส้นแนวนอน (-) เช่น
รูปที่ 9


Write: /(10) sy-uline,
/ sy-vline, 'Hello', 10 sy-vline,
/(10) sy-uline.

เราจะได้หน้าจอดังรูปที่ 9

หรือถ้าเราต้องการสร้างรายงานแบบมีกรอบ เราสามารถเขียนได้ดังนี้
รูปที่ 10


Uline /(45).
Write: / sy-vline, 'Column #1',
15 sy-vline, 'Column #2',
30 sy-vline, 'Column #3',
45 sy-vline.
Uline /(45).

เราจะได้หน้าจอดังรูปที่ 10

โฟลว์คอนโทรลในภาษา ABAP

ภาษาโปรแกรม ABAP ก็มีคำสั่งในการทำ Branching อย่างเช่น คำสั่ง IF, คำสั่ง Case และคำสั่งประเภทลูป (Loop) เช่นคำสั่ง DO และ While เหมือนกับภาษาโปรแกรมทั่วไป

คำสั่ง IF

คำสั่ง IF จะมีรูปแบบของคำสั่งดังนี้

IF .
.
...
ELSEIF .
.
...
ELSE.
.
...
ENDIF.

ยกตัวอย่างเช่น

IF sy-mandt = '100'.
Write 'This is Development Client'.
ELSEIF sy-mandt = '999'.
Write 'This is Backup clinet'.
ELSE. "ถ้าไม่ตรงเงื่อนไขใดๆ
Write 'This is Test Client'.
ENDIF.

จากตัวอย่างโปรแกรมข้างต้น ตัวแปรระบบ sy-mandt จะให้ค่าไคลเอ็นต์ปัจจุบัน ที่ผู้ใช้ระบบล็อกออนเข้าไปใช้งานระบบ SAP R/3

คำสั่ง Case

คำสั่ง Case มีการทำงานคล้ายกับคำสั่ง IF โดยมีรูปแบบของคำสั่งดังนี้

Case .
When .
.
...
When .
.
...
When Others.
.
...
Endcase.

ดังตัวอย่างเช่น

Case sy-mandt.
When '100'.
Write 'This is Development Client'.
When '999'.
Write 'This is Backup Client'.
When Others. "ถ้าไม่ตรงเงื่อนไขใดๆ
Write 'This is Test Client'.
Endcase.

คำสั่ง DO

คำสั่ง DO เป็นคำสั่งที่ใช้ในการวนลูป โดยที่ถ้าไม่มีการระบุรอบในการวนลูป ก็จะเป็นการวนลูปไม่มีที่สิ้นสุด ดังนั้นจะต้องมีคำสั่ง Exit อยู่ในลูปของคำสั่ง DO ด้วยเสมอ เช่น

DO.
Write: / sy-index.
IF sy-index = 3.
Exit.
ENDIF.
ENDDO.

ตัวแปรระบบ sy-index จะให้ค่ารอบปัจจุบันที่มีการวนลูป โดยเริ่มจาก 1 เสมอ จากตัวอย่างโปรแกรมข้างต้น เราจะได้หน้าจอดังนี้

1
2
3

เมื่อระบบพบคำสั่ง Exit โปรแกรมก็จะข้ามไปทำงานที่ตำแหน่งถัดจากคำสั่ง ENDDO ทันที สำหรับการกำหนดรอบในการวนลูปของคำสั่ง DO จะเป็นดังนี้

DO 3 TIMES.
Write: / sy-index.
ENDDO.

จากโปรแกรมข้างต้น จะเป็นการวนลูปทั้งหมด 3 รอบ เพื่อทำคำสั่งในบล็อคของ DO ต่อไปนั่นเอง

คำสั่ง 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 หลัก


ที่มา : http://www.arip.co.th/articles.php?id=405770

ไม่มีความคิดเห็น:

แสดงความคิดเห็น