วันพุธที่ 26 มิถุนายน พ.ศ. 2556

Subfile Advance 1

Sub-File Advance -1

อ่านข้อมูลจาก Sub-File

จาก ตย. ก่อนนี้ เราสร้าง Subfile Refer ได้แล้ว
บทความนี้เราจะปรับให้  Subfile Refer รับค่าได้

(ทบทวน) หลักการ

A. จะแสดงอะไร  (เช่น 3 Field, แสดงครั้งละ 10 row, เริ่มต้นที่ row ที่ 8)
B. นำข้อมูลไป ใส่ใน ข้อ A
C. จัดการแสดงผล

เมื่อเทียบกับ หลักการ เราจะปรับแต่ละหัวข้อ  ดังนี้
A.  กำหนดให้มี field    ที่ "รับค่า" (เลือก,ไม่เลือก)
B.  ค่าดังกล่าวใส่ไว้ใน  Subfile
C. (หลังจากแสดงผลแล้ว)  ทำการอ่านข้อมูลจาก Subfile (ตรวจว่ามีการ  เลือก หรือ ไม่)

เมื่อมีการเลือก (โดย  ป้อนค่า)  ใน sub-file  ให้นำค่าที่เลือก  ไปใช้งาน
(เช่น เปิดหน้าจอ  แสดงรายละเอียดเพิ่มเติม)
สิ่งที่ต้องทำ  เพิ่มเติม   มีดังนี้

A. กำหนดให้มี field    ที่ "รับค่า" (เลือก,ไม่เลือก)
     ส่วนการ deign
     ส่วน Code ที่เพิ่ม
B. ใส่ค่าดังกล่าวใส่ไว้ใน  Subfile
     เพิ่ม Code

C. (หลังจากแสดงผลแล้ว)  ทำการอ่านข้อมูลจาก Subfile (ตรวจว่ามีการ  เลือก หรือ ไม่)
เนื่องจาก Sub-file มีผลต่อหลาย rows
ทำให้  เราต้อง "ค้นหา" ว่า  มีการกระทำกับ row ไหน ?
หลังจาก Exfmt  ต้องเพิ่มขั้นตอน ดังกล่าว   กรณีนี้เราใช้ ReadC  (Read Next Change)

แต่เนื่องจากว่า  การป้อน แก้ไขใน Sub-file   รวมถึงการป้อน blank เข้าไปด้วย
ซึ่ง  เราจะเข้าใจตรงกันว่า  ป้อน blank คือ ไม่ได้เลือกอะไร
เพื่อจะแยกกรณีดังกล่าวจึงต้อง"ยกเว้น"  การเปลี่ยนแปลงที่  ป้อน Blank

สรุป

เมื่อเข้าใจหลักการ  การพัฒนาในขั้นต่อไป  ก็ปรับในจุดที่ต้องการ 



วันจันทร์ที่ 24 มิถุนายน พ.ศ. 2556

SubFile แบบง่าย

SubFile แบบง่าย

Subfile-Refer

SubFile เป็นการแสดงผลหลาย record ในหนึ่งหน้าจอ

เทียบกับ DotNet ก็คือแสดงผลแบบ GridView ครับ (แต่ GridView ง่ายกว่ามาก)

20 ปีที่แล้ว เป็นเทคนิคที่สุดยอดมาก  แต่  ณ.ปัจจุบัน เป็นงานพื้นฐาน (ต้องเขียนได้เร็ว)
แต่เนื่องจาก ยังต้องใช้เครื่องมือ (Tool) พื้นฐาน รุ่นเก่า  การสร้างจึ่งต้องมีขั้นตอน

ผู้เขียนโชคดีที่ได้อ่านเอกสารการเขียนโปรแกรมชุดหนึ่ง  (เอกสารจากญี่ปุ่น)
ได้อธิบายแนวทางที่ชัดเจน  สามารถนำไปประยุกต์ต่อได้  มาลองดูกันครับ

หลักการ Subfile (อีกแล้ว)

A. จะแสดงอะไร  (เช่น 3 Field, แสดงครั้งละ 10 row, เริ่มต้นที่ row ที่ 8)
B. นำข้อมูลไป ใส่ใน ข้อ A
C. จัดการแสดงผล

เตรียม data ที่จะใช้งานดังนี้

A. จะแสดงอะไรใน subfile (เช่น 3 Field, แสดงครั้งละ 10 row, เริ่มต้นที่ row ที่ 8)


a.1 รายละเอียดข้างต้น เป็นการกำหนดที่ Display-File
     อยากออกแบบแล้วแสดงผลแบบนี้  (แสดง 2 field, page ละ 4 rows)
     ออกแบบหน้าจอ  จะได้หน้าตาแบบนี้ (ใน STRSDA)
     การ Code ส่วน Sub-File จะระบุดังนี้
     เทคนิค - ใช้ Indicator ตัวเดียว คือ *IN55
     ในส่วน  "รับค่า" และข้อความ  ด้านบน  จะระบุ ถัดไปตามนี้
      การออกแบบ  แยกเป็น 2 record format
- ชนิด Subfile-Data     ใช้บอกโครงสร้าง File (คล้าย File/Field Description) =  SQ0110S1
- ชนิด Subfile-Control    ใช้กำหนด การแสดงผล (คล้าย File Description) = SQ0110C1
     Subfile อ้างอิงไปยัง Subfile Data อะไร
     Subfile Page จำนวนที่แสดงที่หน้าจอ เช่น 4
     Subfile Size  เลือกให้ค่าเท่ากับ Subfile Page หรือ Subfile Page +  1 ก็ได้ครับ
     Subfile End  เหมาะกับ ตย.นี้มาก (อ่านข้อมูลจนหมด)  
        ถ้ายังมีข้อมูลต่อ (next page) ให้แสดงเครื่องหมาย "+" ที่มุมขวาล่างของจอ
     Subfile Record Number ต้องระบุ "ตัวแปร" เพื่อติดต่อ
     กรณีนี้  เมื่อระบุ  ค่า row ใน page จะแสดงที่หน้าจอ page นั้น (เช่น SubFile Page = 4 เมื้อป้อน RRN = 6  Subfile จะแสดงใน page ที่ 2 เป็นต้น)


a.2 กำหนดใน F-spec ต้องประกาศ เพื่อเรียกใช้ Sub-file และระบุ RRN ให้กับมัน
      (ในระบบ DB2 ทุก file ต้องมี RRN กำกับ)


     สำหรับคนที่อยากเข้าใจ Code
     K = Continue Line
            SFILE = ประกาศจะใช้ Sub-File กับ Record Format (DSPF) = SQ0110S1
                     กำหนด RRN ให้กับตัวแปร RRN01 (ยังไม่ได้กำหนดขนาด)

B. นำข้อมูลไป ใส่ใน Subfile (ข้อ A)

b.1 reset ก่อนใช้งาน
      ใน DSP-F เราใช้ *IN55 ควบคุม  การแสดงผล กับ reset (delete)
      RRN01 (อ้างอิงจาก F-Spec) ขนาด 4,0  เริ่มต้นมีค่าเป็น 0 (ไม่มีข้อมูล)


b.2 Loop  อ่านข้อมูลใส่ใน A
      จุดสำคัญ   ต้อง  เพิ่ม RRN ให้ทุกครั้งที่ write Subfile-Data

C. คำสั่งแสดงผล Subfile

แต่เนื่องจาก Subfile มีข้อมูลหลาย rows
การดูผล ก็ใช้ page up/down ได้ หรือ  เลือกการแสดงผลไปที่ page ใดก็ได้ โดยระบุ บรรทัดที่ (RRN)
เช่น  ต้องการให้แสดงที่ page ที่ 2 (RRN= 5 ถึง 8)


หลายคนอาจจะมองว่า จัดแบบนี้ดูแปลกๆ
ในบทต่อๆไป  การจัดแบบนี้จะช่วยให้เรา "ปรับ" แต่งได้ง่ายครับ

สรุป

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



วันพุธที่ 12 มิถุนายน พ.ศ. 2556

Tips:ใช้ PSDS และ INFDS

PSDS และ INFDS  เป็นวิธีการดึงค่าจาก memory ขณะ run มาใช้งาน
แยกเป็น ข้อมูลของ Program กับ ข้อมูลของ File (แต่ละตัว  ต้องระบุ)

PSDS = Program status data structure

ประกาศ SDS ใน I-Spec



ตย. สไตล์การเขียน Report ใน RPG มักจะแสดงชื่อโปรแกรม  ที่มุมบนซ้าย หรือ ขวา
      (เพื่อให้รู้ว่า report นี้มาจากโปรแกรมตัวไหน)  วิธีพื้นฐาน  ก็คือ Fix ค่าใน O-spec เช่น

      code ทั่วไปจะเป็นลักษณะนี้
OQSYSPRT E  2 3           HED010                     
O                                    7 'PG0160R'   

      เคยพบมั๊ยครับ  copy/เปลี่ยนโปรแกรม เป็น PG0161R แล้วลืมเปลี่ยนชื่อตาม
      ???  เวลาตรวจสอบโปรแกรม "ผิดตัว" ทำให้ "เสียเวลามาก" ... แป่ว

ทางแก้ไข   ทำให้เป็น  ตัวแปรซะ  (แล้วทุกครั้งที่เขียนโปรแกรมใหม่  ให้  copy ไปใช้)  ประกาศดังนี้
I           SDS                                      
I                                     *PROGRAM PGMID
I                                      244 253 JOBNAM
I                                      254 263 USR
I                                      264 269 JOBNBR
...
OQSYSPRT E  2 3           HED010                     
O                         PGMID     10 

เราสามารถเพิ่ม  รายละเอียดที่จำเป็น (ในด้าน Securityได้)
เช่น ข้อมูลที่บ่งบอกว่า job อะไรที่เรียกใช้ report

    JOBNAM = ชื่อ Job ที่ทำงานใน iSeries เช่น ชื่อจอ เป็นต้น
    USR = ชื่อ User ที่ Log On เข้าใช้ใน iSeries เช่น  SOMCHAI เป็นต้น
    JOBNBR = run no (มักใช้แยก  กรณีที่ User 1 คนเข้าใช้งาน  )

วิธีประกาศใน RPG-ILE (แตกต่างเล็กน้อย)
D          SDS
D  PROC_NAM    *PROC
D  JOB_NAME    244   253
D  USER        254   263

Keyword อื่นๆที่น่าสนใจ  - (บทความใน internet จะพูดถึงตัวนี้กันมาก)
*STATUS  ใช้ดักจับ Error (คล้าย Try ...Catch ... ใน Dot Net)
ใช้เพื่อดักจับปัญหา  โปรแกรมที่จะเกิด Dump
เช่น อ่านข้อมูล  ชนิด "ตัวเลข"  แต่บางครั้ง  อาจจะพบ อักษรติดเข้ามา (มักพบใน data transfer)
หรือ การอ่านข้อมูลเพื่อ update แต่โปรแกรมอื่น lock record ไว้
Refer
http://publib.boulder.ibm.com/iseries/v5r1/ic2924/books/c092508381.htm
http://wiki.midrange.com/index.php/Program_Status_Data_Structure


INFDS = File Information data structure

ประกาศ  INFDS ใน F-Spec และ I-Spec (เรียก Feedback areas)
INFDS เองจัดกลุ่มข้อมูลไว้ 5 แบบ (ทำให้เลือกใช้ง่ายขึ้น) ได้แก่ File,Open,Input/Output,Device,Get Attribute  ในที่นี้จะเลือก,แนะนำบางตัวที่ควรใช้บ่อยครับ


ตย. สร้าง sub-file Select ไว้มีข้อมูล    5 page
เมื่อ User เลือกตัวเลือก ใน page ที่ 3  แล้วให้โปรแกรม  ไปแสดงผล DSPFW2
เมื่อ DSPFW2 ทำงานเสร็จ  ต้องการให้   ให้กลับไปที่ Page ที่ 3
        ... ถ้าไม่ควบคุม  ตำแหน่งที่แสดงผล จะไปอยู่ที่ page แรกหรือสุดท้าย
        >> code ด้านล่าง  เป็นการเก็บค่า sub-file RRN ไว้  แล้วนำมาบังคับแสดงผล


ตย. Display File : MYDSPF
A          R MYDSPFC1                  SFLCTL(MYDSPFS1) 
...
A            S1RRN1         4S 0H      SFLRCDNBR

ตย  RPG เรียกใช้ INFDS กับ Display File
FMYDSPF CF  E                    WORKSTN      KINFDS WSID 
...

   กำหนด Data Structure เพื่อดึงค่า
IWSID       DS
I                                    B 370 3710CURLOC
I                                    B 376 3770CURRRN
...
C           STP010    TAG
C*          -------------            
C                     EXFMTMYDSPFC1
...                       Select -> show DSPFW2
C                     Z-ADDCURRRN    S1RRN1
C           CURLOC    DIV  256       CURROW
C                     MOD            CURCOL
C*                    ---F4 => *IN04 = '1'
C     04    CURROW    IFEQ 12
C           CURCOL    IFGE 15
C           CURCOL    ANDLE25
C                     EXSR ITEMREF
C                     END

C           CURCOL    IFGE 30
C           CURCOL    ANDLE40
C                     EXSR TERIREF
C                     END
C                     END

C                     GOTO STP010
...


ตย. การสร้าง Help, Prompt จากตำแหน่ง Cursor
ถ้าวางอยู่ตำแหน่ง  Row=12, Col. ระหว่าง   15-25  เมื่อกด F4 = Item No Refer
ถ้าวางอยู่ตำแหน่ง  Row=12, Col. ระหว่าง   30-40  เมื่อกด F4 = Teritory Refer


... หลังแสดงหน้าจอ
ตัวแปร CURRRN จะเก็บตำแหน่ง  RRN ที่เลือกไว้ทำให้เรารู้ว่า User เปิด SubFile Page ไหนล่าสุดไว้ได้
ตัวแปร CURROW,CURCOL จะเก็บตำแหน่ง Cursor สุดท้าย  (ROW,COL) ไว้
(ถ้าเป็น RPGILE ไม่ต้องมา  หาร 256  ดึงค่าได้โดยตรงครับ)

Refer
http://www.ilerpgprogramming.com/2010/11/exploring-program-status-and-file.html