การส่ง DATA ผ่าน Subroutine และความหมายของ Using & Changing.

มีการส่ง 2 แบบคือ
- USING คือ การส่งค่าไปยัง Subroutine ถึงแม้ตัวรับใน Subroutine มีการเปลี่ยนแปลงค่า ตัวแปรหลักที่ส่งไปจะไม่เปลี่ยนค่า  (พูดง่ายๆ มันคือ Pass by Value )

- CHANGING คือ  การส่งค่าไปยัง Subroutine แล้วตัวรับใน Subroutine มีการเปลี่ยนแปลงค่า ตัวแปรหลักที่ส่งไปจะเปลี่ยนค่าตามไปด้วย  (พูดง่ายๆ มันคือ Pass by Reference )


สำหรับคนที่เข้าใจแล้ว พูดคำว่า "อ๋อ" ในใจและกดปิดไปได้เลย ส่วนค่าที่ยังไม่เข้าใจ อ่านต่อครับ

อธิบาย เพิ่มเติม ตามหลักการ
Pass by Value คือ Address ใน Memory มันอยู่คนละที่กัน มันเป็นเพียงแค่การ Copy ตัวแปรไปยังอีก ที่นึง ( Subroutine หรือ Function หรือ Method ก็แล้วแต่ภาษาที่เรียก ) ไม่ว่าค่าที่ปลายทางเปลี่ยนไปยังไงก็ตาม ค่าเดิมก็จะไม่มีการเปลี่ยนแปลง เพราะ  Address ใน Memory มันอยู่คนละที่กัน
Pass by Reference  คือ Address ใน Memory มันอยู่ที่เดียวกันเลย มันคือการส่งทั้งค่า และ Address ใน Memory ไปเลย เมื่อปลายทางเปลี่ยนไปเป็นอะไรก็ตาม ต้นทางก็จะเปลี่ยนตามไปด้วย เพราะมันคือ "ที่เดียวกัน ณ หน่อยความจำ"

หากใครยัง งง อยู่ แสดงว่าไม่ได้เรียน OS มา 

งั้นก็มาดูกันต่อที่ละ Step

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

Code นี้
ผมจะทำการ Break point แล้วรันให้ดูทีละขั้นตอนนะครับ

เมื่อกดรันโปรแกรม จะเห็นว่าค่าตัวแปรเป็นไปตาม Default ที่เราตั้งไว้
Remark : เมื่อลูกศรสีเหลืองชี้ที่บันทัดไหน แปลว่าโปรแกรมกำลังอ่าน Code บันทัดนั้นอยู่

อ่านบันทัดถัดไป โปรแกรมจะกระโดดไปยัง Subroutine "fill_table_field" พร้อมส่งค่าไปให้ตัวแปรต่างๆ ในนั้นด้วย

โปรแกรมอ่านมาถึงบันทัดที่ 15
 จะเห็นว่า ตัวแปร AA และ BB เปลี่ยน แต่ตัวแปร A และ B ยังเหมือนเดิม
อ่านมาถึงบันทัดที่ 24 คือ กำลังจะออกจาก Subroutine นี้แล้ว
จะเห็นว่าตัวแปร A, B, C, D ยังเหมือนเดิม
และตัวแปร AA, BB, CC, DD นั้นเป็น 10, 20, 30, 40 ตามลำดับ 
ไฮไลท์มันอยู่ตรงนี้แหละ
ผมจะกดอ่านบันทัดถัดไปอีกที......

โปรแกรมออกจาก Subroutine แล้วกลับมาอ่านที่บันทัดที่ 10
 จะเห็นว่า
ตัวแปร A และ B  ที่เราส่งไปแบบ USING นั้น ยังเป็นค่าเดิมตอนออกมาจาก Subroutine
แต่
ตัวแปร C และ D ที่เราส่งไปแบบ CHANGING นั้น เปลี่ยนไปตาม CC และ DD ตอนออกมาจาก Subroutine

นอกจากส่งเป็นตัวแปรแบบนี้แล้ว ใน SAP ยังสามารถส่งเป็น Internal Table ,Work Area ได้ด้วย ก็คือยัดใส่แบบนี้แหละ แต่พอดีขี้เกียจทำเยอะ เอาไปประยุกต์ดูนะครับ ติดตรงไหนคอมเม้นท์บอกกันได้นาจา

ผลลัพธ์

Code
DATATYPE VALUE 1,

      b TYPE VALUE 2,
      TYPE VALUE 3,
      d TYPE VALUE 4. 

PERFORM fill_table_fields USING a b CHANGING d.

WRITE 'A  : 'a,b,c,d.

FORM fill_table_fields USING value(aa)

                             value(bb)
                       CHANGING value(cc)
                                value(dd).
  aa 10.
  bb 20.
  cc 30.
  dd 40.
  WRITE'AA : 'aa,bb,cc,dd.

ENDFORM.







Comments

  1. USING เปลี่ยนค่าได้เหมือนกันนะครับ

    ReplyDelete

Post a Comment

Popular posts from this blog

Create Background Jobs with ABAP | Submit Program to SAP-Spool ( Current Date in Daily )

Create Background Jobs With ABAP

[How to] การ เพิ่ม ลบ แก้ไข ข้อมูลในตาราง แบบไม่สนHee สนTad ใดๆ ทั้งสิ้น