วันศุกร์ที่ 9 พฤศจิกายน พ.ศ. 2555

DB กับ RPG


DB กับ RPG

ในความเป็นจริง  บริษัทต่างๆ  ที่เปิดตัวมานานเกิน 10 ปี ต้องมีการวางโครงสร้าง DB ไว้แล้ว  

หน้าที่ของเราคือ  เข้าใจ + ใช้ "สิ่งที่มีอยู่"  ให้ดี  (มาเดาใจ  คนออกแบบเดิม กันดีกว่า)    
ความสะดวกสบายจาก สิ่งที่เรียนจบมาใหม่ๆ ทยอยเก็บใส่ลิ้นชักไปได้เลย  
กรณีที่ RPG รุ่นใหม่  สามารถ "ข้าม" ข้อจำกัดได้หลายเรื่อง
แต่ถ้าคุณต้องทำงานกับทีมงานที่คุ้นเคย  RPG รุ่นก่อน  จะเขียนด้วยเทคนิคใหม่ทั้งหมด  คงไม่เหมาะ
สุดท้าย ก็คงต้องหลิ่วตาตามน๊ะครับ : )

ทบทวน การออกแบบ DB (แบบย่อ)

0. เตรียม ข้อมูลที่ต้องการออกแบบ (ส่วนใหญ่ ที่ชัดเจนมักจะเป็น เอกสาร)
   
เช่น เอกสารซื้อ,ขาย (งานขาย,บัญชี), คลังสินค้า  เป็นต้น
   Tip
จัดตามแผนกฯ,หน้าที่ หรือ จัดตาม S/W ทั่วไป
   เช่น เอกสารซื้อ,ขาย (งานขาย,บัญชี), คลังสินค้า  เป็นต้น   Tip จัดตามแผนกฯ,หน้าที่ หรือ จัดตาม S/W ทั่วไป1. เปลี่ยนเป็น "แนวคิด" (Logical) จะได้ รูปภาพ (ER) แสดง "กฏ" = คุณลักษณะ และ Relation    เช่น 1 อินวอยซ์ มีได้หลายรายการสินค้า หรือ Fix มีแค่ รายการเท่านั้น (1:m หรือ 1:1)    Tip ถ้าผู้ออกแบบ  คุ้นเคย หรือ ใช้งานเอกสารนั้น  ก็จะรู้ "กฏ" ทางธุรกิจนั้นๆ2. นำ "แนวคิด" ไป  สร้าง DB จริง (Physical) ตาม DB ที่เราเลือกใช้
    เช่น
    เช่น ใน DB2/400 สร้าง Physical File(Table) ใน QDDSSRC แล้วสั่ง Create เป็นต้น



ตย. การบันทึก ในแบบ Form ของIBM  (ง่ายดี) - ปัจจุบัน มีบางคนยังใช้งานอยู่

ตย. การบันทึก ใน Editor (STRSEQ) ของ IBM 


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

ตย.เช่น  เขียนในรุ่นก่อน RPG/400 
- ชื่อ Field ที่ต้องมีขนาดไม่เกิน 6 อักษร 
- ชื่อ File ต้องยาวไม่เกิน 8 อักษร (นับอักษรในช่องที่แสดง)

Table (File) : CUSTOMER_REGISTER,ชื่อ Field=CUSTOMER_ID  … ชื่อยาวเกิน 6 อักษร  
Table (File) : INVOCE_HEAD, INVOICE_DETAIL, INVOICE_CONFIRM  … ชื่อยาวเกิน 8 อักษร และเป็นกลุ่ม  
เมื่อเขียนด้วย SQL – DB Engine จะไปเลือก Index File ที่เหมาะสมให้ (อาจจะเลือกผิดก็ได้) แต่ใน RPG เราจะเลือกไปเลย (ไม่ผิดแน่)  
                >> ต้องตั้งชื่อ  แบบนี้ INV010p, INV020p,INV030p หรือ INV010L2,INV020L5
(p) ในที่นี้เป็นการเรียกใช้ Physical Table (ไม่มี Index)
(L2,L5) คือ Index File ที่เราตั้งใจเลือก
Table (File) : CUSTOMER และ VENDOR  มี Field=NAME เหมือนกัน  
การอ้างอิงใน SQL จะเขียนแบบนี้  CUSTOMER.NAME หรือ VENDOR.NAME ชื่อยาวเกิน 8 อักษร   
>> ต้องพยายามตั้งชื่อให้ ใช้ต่างกัน เช่น CUSTOMER ใช้รหัส C1NAME,  VENDOR ใช้ V5NAME 

- เมื่อ Compile RPG จะจัดเก็บโครงสร้าง Table (File) ไว้ใน Object ของ RPG (เห็น DB  Info ในตัว RPG) ถ้าใครเปลี่ยนโครงสร้าง DB RPG จะตรวจพบว่า ไม่เหมือนกันแล้วมันจะ “หยุด” ทำงาน -> ต้อง re-compile ใหม่ (เสียเวลา ชัดเจนถ้ามีโปรแกรมมากกว่า 100 ตัวที่เรียกใช้)
                >> หลีกเลี่ยงการเปลี่ยน Design File/Field บ่อยๆ  (เทคนิค ทำไป/ออกแบบไป)

การออกแบบ DB

-ต้องทำ Data Dictionary ก่อน!  ในวิชา DB มีพูดถึง  มักใช้ออกแบบกับระบบขนาดใหญ่  ใช้ป้องกัน  การตั้งชื่อ (Field,Table) ที่อาจจะ “สับสน” เช่น Date -> InvoiceDate -> EntryDate, ModifyDate ตอนเรียนจะทำระบบขนาดเล็ก  ทำให้ไม่เกิดปัญหา และไม่ต้องทำส่วนนี้
    
ตย. 1  Data Dictionary การตั้งชื่อ Table  (File) Physical และ Field
ข้อจำกัดใน RPG ก่อน RPG/400 ชื่อ File ต้องยาวไม่เกิน 6 อักษร)
กลุ่ม
Name
File ID  
Field Begin Code
Customer
Customer
CST010p
C1

..


Invoice
Invoice_Head
INV010p
I1

Invoice_Detail
INVO20p
I2

Invoice_Confirm
INV030p
I3
Stock






Stock-Inventory
Inventory_Tag
STK0A0p
SA

Inventory_Void
STK0B0p
SB

  
Tip : บางที่จัดเก็บ Field Begin Code เป็น 1 Field  เป็น Field แรกไว้ใน Table(File) เลย
ข้อดี ดูที่ Raw Data ก็จะเห็น Field Begin Code (ไม่ต้องมาเขียนในสมุด)
ข้อเสีย เพิ่ม “กฏ”  Field ดังกล่าวต้องมีค่าดังกล่าว (ประกาศ ตอนสร้าง DB หรือ ระบุในโปรแกรมบันทึก)
ตอนผมไปดูงานที่บริษัทแม่ (ญี่ปุ่น) เขาเปิดสมุดบันทีกในแบบข้างบน ให้ดู
(ตกใจกันหน่อยครับ  "สมุดบันทึก"  นี้อายุเกิน 15 ปีแล้ว)

ตย. 2  Data Dictionary  ระดับ File/Field
ข้อจำกัดใน RPG ก่อน RPG/400 ชื่อ Field ต้องยาวไม่เกิน 6 อักษร)
กลุ่ม
Invoice

File ID  
INV010P
Invoice_Head

Field ID               



Field Description
I1IVNO
PK
String
10
Invoice No
I1IVYY

Int
4
Invoice Year
I1IVMM

Int
2
Invoice Month
I1CSCD

String
10
Customer Code

FK


C1CSCD (CST010p)
I1AMT

Long
11,0
Amount
สังเกต  ต้องทำ ตย.1 มาก่อน จะทำให้ทำงานง่าย

ตย. 3  Data Dictionary การตั้งชื่อ Table (File) Index (Logical)
กลุ่ม
Name
File ID  
Index Field
Customer
..



..


Invoice
Invoice_Head
INV010L1
I1IVNO(Invoice No)


INV010L2
I1IVYY (Invoice Year),I1IVMM,1IVNO





Invoice_Detail
INVO20L1
I2IVNO,I2SEQ


INV020L2
I2IVNO,I2ITNO(item No)




Tip : บริษัท ควรจะสร้างเครื่องมือ ที่แสดงผลลัพธ์ คล้ายแบบข้างต้นไว้  (ไม่ต้องมาเขียนในสมุด)
       แต่ต้องรู้ CL Cmd ด้วย  ที่บริษัทฯ ผมมีคนสร้างไว้ให้ใช้ : )


สรุป  จากข้อจำกัด ทำให้ต้องมีการสร้าง "กฏ" ขึ้นเองในลักษณะนี้
Table (File)  -   XYZnnnP,  XYZnnnLN  หริอ  ABnnnP, ABnnnLN หรือ ABXYZnP, ABXYZnN
    AB, XYZ, ABXYZ  เป็นรหัสกลุ่ม  เช่น SL (Sale), INV (Invoice), SLINV
    nnn,n เป็นเลขที่ 001,002, 010,020, 1-9,A-Z 
    P บอกให้รู้ว่าเป็น Physical
    LN,N บอกให้รู้ว่าเป็น Index (Logical)

บริษัทที่ทำงานงานอยู่  เลือกใช้แบบไหน ?
ตอนนี้หลายท่านคงทราบแล้วว่า  ทำไมตั้งชื่อตลก,แปลก

Share : ผู้เขียนได้ไปดูการชื่อ Table ใน SAP พบว่ามาในแนวเดียวกัน ถ้าใครเห็นแนวทาง ก็ต้องไปหา Data Dictionary มาดูประกอบด้วย

สำหรับน้องใหม่  ลองสร้างหลายแบบดู จะเห็นข้อดี/ด้อย ของแต่ละแบบ
(ฝึกไว้ เวลาไปออกแบบ CMS ก็จะพบปัญหาคล้ายกัน)

ขออภัย  สำหรับบางท่านที่อยากจะให้สรุป หรือ อธิบายเป็นกฏ ตามหนังสือ
ผู้เขียนแนะนำให้  ไปอ่านหนังสือโดยตรงดีกว่าครับ  ลองค้น IBM Red Book  
ถ้าเขียนตามหนังสือ  กว่าจะเริ่มสร้างได้จริง  ต้องอ่าน 2-3 เล่ม (มีรายละเอียด + แตกย่อยไปมาก) 
เนื้อหา จะมีมาก (จนคนรุ่นใหม่  จะรู้สึกท้อ  เมื่อต้องมาเรียนรู้สิ่งที่มากและยาก)

วันเสาร์ที่ 13 ตุลาคม พ.ศ. 2555

รายละเอียดใน RPG

มาดุรายละเอียดกันครับ
เขียนในสไตล์  เล่าเรื่องไปเรื่อยๆ  ถ้าจะให้ครบคงต้องไปอ่านใน หนังสือน๊ะครับ

ทบทวน Version

RPG II -> RPG III -> RPG/400 (with SQL) -> RPG ILE

RPG II    เขียน Code ให้สั้นที่สุด (เหมือน  การเจาะรูใน Punch Card จะเร็ว)
               แต่ละตำแหน่งที่เจาะรูในกระดาษ มีความหมาย  (มีมาก/เข้าใจยาก)
RPG III   เริ่มเป็น  Code ที่อ่านรู้เรื่องมากขึ้น (แต่จำกัดที่  ขนาดของ PunchCard)
RPG/400 (with SQL)  เพิ่มความสามารถต่างๆให้สะดวกขึ้น รวมทั้งเขียนติดต่อกับ SQL ได้
RPG ILE  ปรับที่ระดับ  โครงสร้างพื้นฐาน  ลดข้อจำกัดต่างๆ
...             มีข่าว ภาษาใหม่ ออกมา ทำงานแบบลูกครึ่ง  (จำชื่อไม่ได้แล้ว  เงียบไปแล้ว)


Hist

ผู้เขียนโชคดีที่  เมื่อเข้าทำงานบริษัทได้กำหนด  ให้หยุด/ลด การใช้ RPG II มาใช้ RPG III
(ช่วงนั้น การแปลง code เป็นงานใหญ่มาก)

ขอบคุณรุ่นพี่ทุกคนที่  กล้าหาญและเสียสละ  วางเส้นทางที่สะดวกในอนาคตไว้ ครับ
ช่วงเวลานั้นจะมีรุ่นพี่ 1 คน  ประกาศชัดเจน และมี 3-4 คน ที่เชี่ยวชาญสนับสนุน "เต็มตัว"
(ไม่ใช่เห็นด้วยแต่ไม่ทำอ่ะ) ทีมงานครอบคลุมทั้งหน่วยงาน


ตั้งแต่เริ่มใช้ RPG III เป็นต้นมาแนวทางการเขียนโปรแกรม "เข้าใจง่าย" ขึ้นมาก
นับเป็นจุดเปลี่ยนที่สำคัญ
(รุ่นพี่ได้แนะนำให้ ผู้เขียนอ่าน RPG II ด้วยเพราะมีบางโปรแกรม ที่ตกค้างยังและบางเทคนิคยังจำเป็น)

ในยุคถัดมา  บางกลุ่มได้พยายามปรับแนวทาง  ตาม ver  แต่ไม่สำเร็จ (ได้แค่ระดับบุคคล,หน่วยย่อย)
กลับเพิ่มปัญหาใหม่ คือ คนกลุ่มหนึ่งจะไม่ยอมเปลี่ยน  และอาจจะเกเรไม่ดู code ที่ตนเองอ่านไม่เข้าใจ

ตย.การเปลี่ยนไปใช้  RPG/400 with SQL  
ข้อดี คือ SQL เป็น Tool ที่ดีในการเข้าถึง Database (IBM แนะนำว่า SQL ทำงานเร็วกว่าแบบปัจจุบัน)
ข้อเสีย คือ ภาพรวม   (กับโครงสร้าง) ทำให้เขียนโปรแกรม "ยาวขึ้น" ,การตรวจสอบ "ยุ่งยาก"
(เหมาะกับ คนที่จะเริ่มปรับ มาใช้  ภาษารุ่นใหม่)
ต้องสร้างพื้นฐานให้ทุกคนใช้ SQL ให้คล่องก่อน (เพิ่ม ขั้นตอน)

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

(จาก Hist + ทดลอง พบว่า การบังคับ ใช้เวลาสั้นและสำเร็จ แต่ถ้า  อาสาสมัคร  ใช้เวลานาน,ล้มเหลว)


ตย แนวทางที่ผู้เขียน กำหนดเปลี่ยน
- เตรียมพร้อม ที่จะเปลี่ยน เทคโนโลยี (อนาคต) ใน 3 ปี
        ต้องทำได้ "เร็วกว่า" และพร้อมจะเปลี่ยน ภาษา(ASP -> C#, PHP, ...) ,DB (DB2 -> Oracle,...) 
- หยุด/ลด การเขียน Report บน RPG   โดยใช้ภาษาใหม่  ที่ง่าย/เร็วกว่า
     - ก่อนสร้าง Report   ใช้ SQL ทดสอบ Data บน Excel  
             เลือก iSeries Navigator
     - นำ SQL ไป Bind กับ ตัวแสดงผล ...  
             เลือก VS2005 Express + มีรูปแบบการสร้างที่แน่นอน (ลอกไปได้)
             + เน้น  ลดการปรับที่จุกจิก (ใช้เฉพาะบุคคล)  

     - เลือกใช้ OWC ช่วยในการ  เปลี่ยนการแสดงผล (1 report แสดงได้หลายแบบ)


RPG-Syntax

RPG เริ่มจากการเขียนบน  บัตรตอก (Punch Card)  ส่งให้เครื่องอ่าน อ่านและแปล (Compile)
(ประวัติศาสตร์นี้แหล่ะที่ทำให้ รูปแบบปัจจุบัน ยังคงต้องทำอยู่)

    ภาพแสดง การ์ดอธิบายช่องต่างๆ  ที่โปรแกรมเมอร์ในอดีต ต้องมีใช้ติดตัว


ในยุคนั้น  พบอุปสรรคเรื่องข้อจำกัดต่างๆ  (1 แถวใน  บัตรตอกป้อน code ได้ 60-100 อักษรเท่านั้น)
จึงได้หาทางแก้ไข เหมาะที่สุดในเวลานั้น  ได้แก่

# แต่ละช่อง มีความหมาย 


     จากรูป จะเห็นความหมายแต่ละช่อง


    เพื่อให้  ง่าย(ขึ้นนิ๊ด) บัตรตอก แยกหมวด (Specification) แต่ละหมวด มี Format เป็นของตนเอง

  •  F-Spec = บอกว่า ติดต่อ file อะไรบ้าง  File Description Specifications
  • [ E-Spec = ใช้บอก เขียนส่วนขยาย เช่น Array   Extenstion-Specifications ]
  • [ I-Spec =รูปแบบ input (Field/Record) เป็นอย่างไร   Input-Specifications ] 
  •  C-Spec = ส่วนของ Coding หรือ การคำนวน  Calculation-Specifications 
  •  O-Spec = รูปแบบ output (Field/Layout) เป็นอย่างไร  Output-Specifications


     ภาพใน F-Spec ยังมีแบ่งย่อยการใช้งานอีก

     ใน ver RPG II ต้องใช้หมวดต่างๆเกือบจะครบ (ยังมีอีก 2 ตัวคือ  L,C) ... วันนี้ถ้าใครยังต้องใช้อยู่ ขอแสดงความเสียใจด้วยครับ
     แต่ ver RPG III ขึ้นไปใช้น้อยลง  RPG ILE เพิ่ม D-Spec ใช้กำหนดตัวแปร (มีความหมายชัดเจนกว่า I-Spec)



# ขนาดที่จำกัดขนาด

     ทำให้  ชื่อ File (8 อักษร), คำสั่ง (5 อักษร),ตัวแปร  (8 อักษร)
     หัดตั้งชื่อ Var, Field แบบย่อให้ได้  เช่น  strCustomerCode   -> CUST, CSTC, CSCD
     เริ่มใช้ ตัวแปรร่วม, ใช้ชั่วคราว  เช่น intK  -> N#52   strText  -> X#10
ภาพแสดง การเขียนคำสั่งติดต่อ File ลงในช่องที่จำกัด



       ตย. การอ่าน code ทำงาน
       F-Spec : โปรแกรมนี้ ติดต่อ File 2 ตัว
                TestX  เรียกใช้แบบ อ่านอย่างเดียว (I = Input)  ชื่อ Field ดูได้ใน I-Spec  (F)
                           จำกัดการติดต่อที่ 5 อักษร
                TestA  เรียกใข้แบบ  Update/Delete (U = Update)  ชื่อ Field ดูได้ใน I-Spec  (F)
                           จำกัดการติดต่อที่ 10 อักษร
                (มักจะใช้   E เพื่อบอกว่า  นำ Field ที่กำหนดใน File มาใช้  ไม่ต้องไปประกาศใน I-Spec)
      I-Spec กำหนดตาม ที่ F-Spec ระบุ  File ชื่อ ... ตั้งชื่อ Field อะไร  ตำแหน่งที่เท่าไหร่ ?
      C-Spec กำหนดให้ อ่านแบบเขียน ควบคุมเอง  (มี Goto)
                   อ่าน File  TestX
                   If    End Of File (*In66 = 1)  Then จบการทำงาน
                   Else
                           อ่าน File  TestA
                           If   Found  (*In67 = 0)   Then
                                    Fld1 = Part
                                    Output (Update) ตามรูปแบบ MAST (ดู O-Spec)
                           กลับไปอ่าน TextX ใหม่

       สำหรับคนรุ่นใหม่  เป็นอย่างไรครับ  (ถ้าเปิดใจบ้าง  วิธีนี้ก็เขียนโปรแกรมสั้นดีครับ)


   - ข่าวดี
          ตั้งแต่ ver RPG/400 เริ่มให้ พื้นที่การเขียนที่กว้างมากขึ้น  เขียนร่วมกับ SQL ได้
   - ข่าวร้าย ถ้าคุณต้องมาดูแล Code ที่เขียนไว้นานกว่า 5 ปี คุณต้องรู้โครงสร้างแบบเก่า 555


# ผลกระทบ 

           แบบอ่านเข้าใจง่าย       If  x <  20   Then
           เขียนในรูป RPG          X    IFLT 20                         Less Than

     ภาพแสดง การเขียนคำสั่ง  ลงในช่องที่จำกัด


           แบบอ่านเข้าใจง่าย       If  (x <  20) and (y >= 10)  
           เขียนในรูป RPG          X    IFLT 20
                                             Y   ANDGE                          Greather and Equal

           ปัญหาเก่าๆ ที่ไม่พบใน ภาษายุคใหม่แล้ว  จะกลับมาพบเห็นหมด
           เช่น                            X    IFLT 20
                                             Y   ANDGE10                      
                                             Z   ORLT 5                        

           code ข้างต้น  คนเขียน คิดแบบไหน ? RPG จะมองแบบไหน ?
           (a)  If    (x < 20) and (y >= 10)  or (z < 5)
           (b)  If   [(x < 20) and (y >= 10)]  or (z < 5)
           (c)  If    (x < 20) and [(y >= 10  or z < 5)]      
           (d)  ...

Tip :  ถ้าไม่ยึดติดมาก  Code ที่ดูยุ่งยาก  ก็ยังอ่านรู้เรื่อง
         ดังนั้นควรเน้น  "ความเข้าใจ" จะยืดหยุ่นดีกว่าท่องจำ

ใน RPG : ผมจะมี Source Code อยู่ 1 member ที่รวมเทคนิค ที่ใช้ "บ่อยๆ" = ผมจะมาค้นที่นี่ที่เดียว
ส่วน ภาษาอื่น  ที่ไม่ค่อยได้ใช้ (เช่น กลับไปเขียน code C#,ASP)
     ผมก็เรียกใช้เครื่องมือพื้นฐาน โดยใช้เวลาค้น 3-5 วินาที (เร็วมาก)
     แต่ผมต้อง "เข้าใจ"  -> รู้  "คำ" ที่จะค้นก่อน ...  แล้วไปค้นในจุดที่เปิดได้เร็วที่สุด (Help > Index, Google > ASP xxx example)

Tip : ควรอ่าน  แบบเร็ว  เพื้อให้คุ้นว่า  อะไรทำได้,ไม่ได้
- อ่าน Syntax "ทั้งหมด" หมายถึงอะไร (ไม่ต้องสนใจ การใช้งาน) ใช้เวลาประมาณ 10-30 นาที
  เช่น  ไม่มี For ... Next แต่ใช้  Do ... End แทน
  # อ่านจาก RPG "User" Guide 

- อ่านคำสั่ง "ทั้งหมด" หมายถึงอะไร (ไม่ต้องสนใจ การใช้งาน) ใช้เวลาประมาณ  1-2 ชม.
  เช่น SORTA ใช้เรียงค่าใน Array
  ดู code เล็กน้อย (บางทีเข้าใจง่ายกว่า)
  จะมี  ติดบางคำ (ถ้าไม่รุ่นพี่ ก็ถามซะ) ถ้าไม่รู้จะถามใคร ก็ผ่านๆไปก่อน (บางตัวไม่ใช้งานเลย)
  # อ่านจาก RPG "Reference" Guide จะเรียงตามอักษร


# ตัวแปรที่ไม่แปลก  แต่ไม่คุ้นเคย

ตัวแปร Boolean (True/False = 1/0 = On/Off) จะใช้ตัวแปรชนิด Indicator (*IN) แทน
พื้นฐานมีให้ใช้ 99 ตัว (01-99) ... คนรุ่นเก่านึกถึง การใช้ Register ใน Assembly

RPG จะใช้ Indicator แทน IF ...  And   เพราะพื้นที่จำกัด มาเขียน IF หลายๆตัวคงไม่ได้
      โดยกันพื้นที่  ให้ใช้ 3 ตัวด้านซ้าย

Tip : เมื่อรู้ที่มา ก็เลือกใช้ให้เหมาะน๊ะครับ  เช่น
        ควรใช้ IF คลุมหลายบรรทัด จะทำงานเร็วว่า  ใส่ Indicator  ตัวเดียวกันทุกบรรทัด

ในขณะเดียวกัน เมื่อสั่งOperation เช่น อ่าน File, ค้นหาใน Array, เปรียบเทียบ Field ก็จะส่งคืนค่าผ่าน Indicator
       โดยจะกันพื้นที่ด้านขวา  ให้แสดงผลได้ 3 ตัว

# RPG Cycle

เป็นส่วนของ RPG II หลงเหลือให้เห็นอยู่    Cycle = ทำงานวนไปเรื่อยๆ (Loop)

ภาคบังคับ  เพื่อจบ Cycle ต้องกำหนด Indicator = LR  (Last Record)ให้ = On(1)
                              SETON             LR
          LR                RETRN

สั่ง *IN LR = 1 หรือ On   บอกให้ RPG Compiler รู้ว่า   อ่านรอบนี้เป็นรอบสุดท้าย
(วิ่งไปจนถึงบรรทัดสุดท้ายของ C-Spec)
กำหนด If  *In LR = '1'   Then   ทำคำสั่ง  RETRN = Return   เป็นการสั่งให้  สิ้นสุดทำงาน "ทันที"
(ไม่ต้องรอให้ไปถึง บรรทัดสุดท้ายของ C-Spec)

(ตอนต่อไป น่าจะเข้าเรื่อง DB ได้สักที)