วันพุธที่ 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


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

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