วันอังคารที่ 26 กรกฎาคม พ.ศ. 2565

Simple RPG

 เราจะสร้างโปรแกรมที่ 
-ไม่ต้องสร้างหน้าจอ (Display File) ... แต่จะแสดงผลผ่าน Msg แทน

Msg ของ iSeries หรือ AS/400 

Msg (Message) เป็นข้อความที่ใช้ส่งหากัน  (คล้าย Mail แต่เป็นยุคเริ่มต้น)

Msg จะถูกส่งให้ไปยัง  Msg Queue  ซึ่งใช้บ่อย 2 ตัว คือ ชื่อ User Profile กับ  ชื่อจอที่ทำงาน(hob)
            เราจะเขียนโปรแกรม ส่งไปยัง  User Profile ของเรา "SARAYUT"
การส่ง Msg ทำผ่านคำสั่ง









เราจะดู Msg ได้โดยผ่านคำสั่ง DspMsg

ที่ line command  ป้อนคำสั่ง  DspMsg  กด Enter
จะได้ผล คล้ายแบบนี้ (ไม่มี Msg ค้างในนี้)

มุมซ้าย-บน แสดงชื่อ User Profile ของผม

สร้าง source code 

cmd line : STRPDM  + Enter > ป้อน   3 + Enter   (เลือก opt=3  Work with Member)

ป้อน File = QRPGSRC   , Lib = QGPL (หรือที่เก็บ) , Member : Name = *ALL



กด F6=Create (สร้าง member)  + ตั้งชื่อ code (member)  HELLO1  ชนิด RPG

(หลังจาก ตั้งชื่อ) จะเห็น หน้าจอ  พร้อมป้อน code  (แสดงบรรทัดว่างให้ป้อน)
ให้กด Enter เพื่อ "ยกเลิก"

แล้วสั่ง  "เพิ่ม"(Insert) บรรทัดว่างเพื่อป้อน  โดยแสดง Format ช่วยป้อนชนิด C-Spec  เพิ่ม 5 บรรทัด
ป้อนคำสั่ง   IFC3   ที่ด้านซ้าย + กด Enter
จากนั้น ป้อน code ตามภาพ (ตำแหน่ง ต้องตรง)

ให้ส่ง  "HI!"  ไปที่ Msg Queue ชื่อ SARAYUT
แล้ว  สิ้นสุดการทำงาน ของ RPG (LR= Last Record) 

Compile (code) เป็น Object

จะเกิด Member = Hello1   

(ทำครั้งแรกเท่านั้น)
ตั้งค่าการ Compile และ Run  
-Object ที่ compile จะเก็บใน Lib= QGPL
-Compile ไม่ใช่ Compile in Batch (=เห็นผลลัพธ์ของการ compile โดยตรง)
-ไม่ run ใน Batch (=เห็นผลการ Run ทันที)

ที่ Work with  Member using PDM
กด [F18]=Change Default  (ถ้าไม่เห็น ปุ่มนี้ กด [F24]  2 ครั้ง)

Compile โดย    ช่อง Opt ด้านหน้า Hello1  ป้อน 14 
+  กด F4 = Prompt  (ดูว่าสร้างแล้วไปเก็บที่ Lib. อะไร  ปรกติจะตรงกับที่ตั้งค่าไว้)


ถ้า compile ผ่านจะแสดง msg ที่บรรทัดด้านล่าง
สั่ง run program นี้ได้เลย   call  hello1
หลัง run ใช้คำสั่ง dspmsg
จะเห็นข้อความที่ RPG ส่งไป


สรุป
-Simple RPG ใช้ Msg ในการติดต่อ
-(ผมเลือก)ใช้ StrPDM ในการจัดการ code  (สร้าง, compile)  อยู่ในรูป member ใน Source (File)
-    ตั้งค่าเพื่อให้จัดการ ง่าย
-เข้าไปเขียน code ด้วย StrSEU 
-    RPG ต้องเขียนใน  "แนว" ตำแหน่ง
-compile code เป็น object
-สั่ง run (call)  +   ตรวจผลการทำงาน ด้วยคำสั่ง DspMsg









วันจันทร์ที่ 21 ตุลาคม พ.ศ. 2562

วิธีใช้หนังสือ RPG

วิธีใช้หนังสือ RPG

หนังสือของ IBM จัดเป็นหนังสือที่ดีครับ!
หนังสือที่ใช้บ่อย จะจัดเป็น 2 กลุ่ม - ใช้ให้เหมาะ!

A. เรียน Step by Step ชื่อหนังสือ จะลงท้ายด้วย  User 's Guide
ทริค  บางเรื่องจะสอน "ลึกไป" (เราไม่ได้ใช้ ) ไม่ต้องอ่านทุกเรื่อง

B. ใช้ค้นหา  จาก "คำ" (ต้องรู้ศัพท์) ชื่อหนังสือ จะลงท้ายด้วย Reference Guide
        (สารบัญ  เรียงตาม ชื่อคำ, หมวด-> ชื่อคำ)
ทริค  ปัจจุบัน  ค้นใน internet เร็วกว่า 

RPG Step by Step

- ต้องรู้  Environment ก่อน
       OS/400 - ต้องไปดู  Basic Operator User 's Guide
            Tip  เรียนรู้เฉพาะที่เกี่ยวกับ การเขียน Code ได้
                    คำสั่ง  เรียกใช้ Editor , Compile , ตรวจผล Compile
        Database - ถ้าบริษัทฯ ไม่ แยก DB-Admin  ออกมา ต้องไปดู Database User 's Guide
            Tip  บริษัทที่เปิดใช้มานาน การสร้าง Table ใหม่จะมีน้อย
- ลำดับการเรียน ทั่วไป
         Hello World :  เรียกใช้แบบ  ไม่มีหน้าจอ (ส่ง msg), ส่งค่าผ่าน line command
         รายงานแบบง่าย   เรียกใช้ Database  (ไม่ใช้ Key)
              - ไม่มีหน้าจอ (ส่ง msg), ส่งค่าผ่าน line command         
         เพิ่ม เรียนรู้คำสั่ง  เช่น If , Loop แบบง่าย
         สร้างหน้าจอ และ เรียกใช้  (เพิ่มคำสั่ง ที่เกี่ยวข้อง)
         เรียกใช้  File แบบมี Key (เพิ่มคำสั่ง)
         โปรแกรม CRUD - Create Read, Update,Delete
         SubFile
         Array
- ภาษา CL
- ภาษา RPGILE
- ภาษา SQL Source  (อันนี้ผมไม่ได้ใช้)

RPG Reference

ใช้ค้นหา "คำศัพท์"  เช่น  คำสั่ง CHAIN ใช้อย่างไร ?
หนังสือ จะเรียงลำดับตาม "อักษร"

การค้นใน Internet   จะสะดวกกว่า
Tip   "ต้องเพิ่ม" Keyword ที่สำคัญด้วย  เช่น  IBM RPG  CHAIN

                CHAIN  = คำสั่งใน RPG  หรือ  แปลว่า  "โซ่"   ... ศัพท์กว้างไป
                RPG = เป็นได้ทั้ง ภาษา RPG หรือ เกมส์ RPG

ตย. เปิดดูผลลัพธ์
จาก  .pdf


รุ่น RPG-III, RPG/400  *indicator NR (no rows)   On = ไม่มี data


ตย. Code ที่ใช้บ่อย 
       นำรหัสพนักงาน  ไปค้นใน table   ถ้าพบ (Not *in80) ให้นำค่า Name มาแสดง
                     w1Emp    CHAINtable                                  80
    N80                           MOVELempNm        w2EmNm


ดูโดยตรงจาก internet

คำสั่ง Chain = ข้อมูลค้นหา -> File -> ผลลัพธ์ (พบ/ไม่พบ)

R่PG ILE  ส่วนของ Indicator  *indicator NR (no rows)   OFF = ไม่มี data
(ไม่เหมือนกับ  RPG-III หรือ RPG/400)
เป็นผลจาก  RPG_ILE  ใช้คำว่า %FOUND  ซึ่ง On  = พบ



"แนวทาง ที่ควรทำ ?" 

30 ปีที่แล้ว  หลังซื้อเครื่องมา จะได้หนังสือมา "ชุดใหญ่"
(ตอนนั้นจำได้ว่า  มากกว่า 40 เล่มหนาๆ)

คนสอน-1 : อ่านเท่าที่สอน
คนอ่าน : ครับ   หนังสือภาษาอังกฤษ  2 เล่ม ใหญ่ๆ

คนสอน-2 (พี่หมู,พี่เดิ้ล,พี่สไปรท์) : อ่านทั้งหมด นั้นแหล่ะ จะเห็นภาพครบ
คนอ่าน : ทั้งหมด!

ขอบคุณ คนสอน-2 ครับ   สิ่งที่อ่านทำให้ ได้เครื่องมือดีๆ มาช่วยงาน
(ต้องรู้ว่า "มี" และ เลือกใช้ให้เหมาะ)
เช่น  หนังสือ  STRRLU มาช่วยออกแบบ Printer File  - ทำได้เร็วกว่า

        บริษัทเมโทร  ได้ผลิตหนังสือภาษา RPG ฉบับภาษาไทย  (ว้าว)
        แต่ยุคนั้น ที่บริษัท เริ่มใช้ RPG-III  (หนังสือจะเน้น  RPG-II) จึงใช้อธิบายได้บางส่วน

20 ปีที่แล้ว  มีเนื้อหา  หนังสือ เกิดขึ้น "มากกว่าเดิม" (เทคโนโลยีเริ่มเปลี่ยน)
- Web เริ่มแพร่หลาย (แบบเขียนได้ง่ายขึ้น)
- API ติดต่อกับ VB, ASP
IBM ได้ออกหนังสือ กลุ่มใหม่ เรียกกัน "Red Book" (ปก "สีแดง"   น่าอ่านมาก)
   และเนื้อหาค่อนข้างกระชับ

ช่วงนี้   IBM ได้เปลี่ยนหนังสือเป็น pdf  (ให้เป็น CD แล้วต่อมา Download ได้ผ่าน Internet)
ผมเข้าถึง หนังสือ ได้สะดวก  ทำให้นำมาช่วยแก้ปัญหาได้
เช่น  ผมมีโจทย์ว่า  ทำไม การ Backup วิธีทำกันอยู่  จึง "ยุ่งยาก"  (ช้า)
         - หนังสือที่อ่าน  บอกให้รู้ว่า  มีวิธีอื่น  โดยเราต้องจัดสภาพแวดล้อม "ให้เหมาะ"

ขอบคุณ

- ผมไปขออ่าน  "เอกสารสอนวิชา Database ของ IBM"  (คนอื่นไปเรียน)
          IBM เป็นผู้สร้าง หลักการ RDBM ที่เราใช้กันน๊ะครับ
          ผมไม่ได้จบ  คอมพ์ - เอกสารนี้ ทำให้ผมเข้าใจเรื่อง Database มาก

- ผมได้มีโอกาสฟังสัมนา โดย คุณสันติ จาก IBM Thailand
         (เป็นคนไทยที่ร่วมพัฒนา DB2 กับ IBM)
         คุณสันติ ได้อธิบาย การทำงาน Database เชิงลึก  ทำให้  ผมเข้าใจ
         และปรับให้เหมาะกับการทำงานจริงได้มาก

- โชคดี  พี่บูลย์ แนะนำคู่มือ สอนเขียน SubFile (เป็นหนังสือสอนเขียนโปรแกรมจาก ญี่ปุ่น)
          (เป็นหนังสือ ที่อยู่ในชั้น สวยงาม - ไม่มีใครอ่าน)
          หนังสืออธิบายตรงกับ หนังสือของ IBM แต่  "ย่อ" จนอ่านง่ายกว่า (ใช้เท่าที่จำเป็น)
   

วันอังคารที่ 10 เมษายน พ.ศ. 2561

CL - ตั้งเวลาทำงาน ด้วย DLYJOB

CL - ตั้งเวลาทำงาน ด้วย DLYJOB

เขียนโปรแกรม CL:Control Language - ตั้งเวลาทำงาน 

ตย. ผมจะต้องเรียกใช้ RGZPFM  (ลดขนาดข้อมูล) กับ File หลายตัว

ผมแยก File (ที่จะทำ RGZPFM) ออกเป็น 2 กลุ่ม
1.  กลุ่ม File ที่ใช้เวลาสั้น
2.  กลุ่ม File ที่ใช้เวลานาน  (File ที่มี number of records มาก)

(เจาะลึก)
Q:  รวมกันได้มั๊ย ?  ถ้าได้ ทำไมต้องแยก

A:  ได้ครับ   ที่จัดกลุ่มเพราะ  เคยพบว่า บาง File ขนาดใหญ่ มากใช้เวลา "นานมาก"
      มี File ขนาดเล็ก  รอทำงานอยู่มาก

(เจาะลึกได้อีก)
Note  การจัดกลุ่ม ในแบบ ต่างๆ
- แยกเป็น ตามกลุ่ม User  (ถ้าเสร็จ User กลุ่มนั้นก็จะใช้งานได้)
- แยกเป็น 5-10 กลุ่ม  เมื่อ เครื่องทำงานได้เร็วพอ
แต่ละ วิธีจะมีข้อดี และ ข้อเสีย  เลือกตามความเหมาะสมน๊ะครับ

กลับมาทำต่อ
ผมเขียน CL ตามกลุ่ม  ข้างต้น  (ด้านในมีคำสั่ง  RGZPFM)
จากนั้น  ก็ตั้งเวลาทำงาน "ล่วงหน้า" เช่น 
   (วันนี้ 12 เมษา เวลา 15:00)  ให้ทำ 13 เมษา 2561 เวลา 8:00
   (วันนี้ 10 เมษา)  ให้ทำ 13 เมษา 2561 เวลา 8:00

ผมเลือกให้ทำงานแบบ Batch - ไม่ต้องเปิด 1 จอ รอให้ทำงาน
       + ต้อง ตรวจสิ่งที่เรา  โยนไปได้
       + เมื่อทำงานเสร็จ  ต้องส่ง Msg ไปที่ ... (UsrPrf ของผม)

การตั้งเวลา  ในที่นี้จะพูดถึง 2 วิธี
1. CL ที่มีคำสั่ง DLYJOB   เรียกใช้งานแบบ Batch
2. ใช้ cmd WrkJobScdE  อันนี้สะดวกกว่า (Job ทำงานแบบ Batch)

เช็ค/ทบทวน ก่อน
- เมื่อ Batch ทำงานเสร็จ จะส่ง Msg ไปที่  UsrPrf  ที่สร้าง Job
  CHGMSGQ   myUSrPrf     DLVRY(*BREAK) 
- คำสั่ง SBMJOB ทั่วไป  เมื่อทำงานเสร็จ  จะไม่มี Spool JobLog ไว้
  เพิ่ม  ตั้งค่า  เพื่อให้สร้าง Spool File
 SBMJOB CMD(DSPFD FILE(*LIBL/QPRINT) OUTPUT(*PRINT))                                         
        JOB(TEST2)                                           
        LOG(4 0 *MSG)   LOGCLPGM(*YES)   LOGOUTPUT(*JOBEND)     

ทดลองเรียก  ดู  จะเกิด Break Msg ที่  UsrPrf ของเรา 
และ เกิด Spool File  การทำงานของ Job  ใน outq(QEZJOBLOG)

มาดู Code กัน
1. CL ที่มีคำสั่ง DLYJOB   เรียกใช้งานแบบ Batch

   (วันนี้ 12 เมษา เวลา 15:00)  ให้ทำ 13 เมษา 2561 เวลา 8:00
   สร้าง Code QGPL/QCLSRC     TEST1

PGM                            
DLYJOB     RSMTIME('08:00:00') 
RGZPFM     FILE(MYLIB1/MYFILE2)
ENDPGM                       
                 
     DLYJOB สามารถ ป้อนเป็น วินาทีได้  (สูงสุดได้ 27 วัน)
     เช่น  ให้รอไป  18ชม = 18*60*60 = 64800 วินาที      เปลี่ยน Code เป็น         
              DLYJOB   DLY(64800)

     สังเกต   เหมาะกับ  ตั้งเวลา  สั่งงาน ในวันนั้น หรือ  รอ 1 วัน

2. คำสั่ง WrkJobScdE   
    ใช้งานได้ ยืดหยุ่นกว่า 
         ทำ    ครั้งเดียว หรือ ทุกอาทิตย์ หรือ ทุกเดือน 
         ครั้งเดียว  = ระบุวันที่ได้
         ทุกอาทิตย์,ทุกเดือน = ทำวันไหน (1 วัน หรือ หลายวัน,ทุกวัน) จันทร์,อังคาร,...
         ทำงาน  ณ. เวลา ...
         ยกเว้น วันไหน  (เช่น วันที่ปิดเครื่อง)

   สร้าง Code QGPL/QCLSRC     TEST2

PGM                            
RGZPFM     FILE(MYLIB1/MYFILE2)
ENDPGM 

     WrkJobScdE    ป้อนรายการใหม่ F6=Add   ป้อนตามนี้

ADDJOBSCDE JOB(TEST2)                
           CMD(CALL PGM(QGPL/TEST1)) 
           FRQ(*WEEKLY)              
           SCDDAY(*TUE *THU *SAT)    
           SCDTIME('08:00:00')     

    ข้อสังเกต  อ่านแล้วได้ความหมายดี  ยืดหยุ่นกว่าด้วย  ครับ

Q: มันทำงานแบบ Batch - ถ้าทำงานขณะที่มี User ใช้งาน "มาก"
     Job นี้จะไม่ทำงานเลย  (CPU ไม่ว่างพอ)  มีทางแก้ไขหรือไม่ ?
A: เปลี่ยน  ให้มันทำงาน แบบ Interactive ซะ   ซึ่งมีหลายรายละเอียด
         เช่น  JobQ(QINTER) - ไปใช้ Pool ของ QINTER
                     แต่คุณสมบัติยังเป็น Batch อยุ่  (RunPty  ต่ำกว่า, TimeSlice  นานกว่า)
                 การแก้ไขคุณสมบัติ ให้เป็นงาน Interactive
                  - ต้องสร้าง/เรียกใช้  JobD  โดยระบุรายละเอียด 
                  ... ขอไม่อธิบายครับ เริ่มมีรายละเอียดมากไป ครับ

สำหรับงาน สำคัญ ขอให้  ทดสอบ  ก่อนใช้จริง น๊ะครับ
อื่นๆ    มีบางท่านแนะนำให้  เพิ่มคำสั่ง  sndmsg  แทรกใน CL ของเรา 
           เพื่อให้มันแจ้งว่า มันผ่าน คำสั่งอะไรไปแล้วบ้าง
           - ดู Msg  น่าจะง่ายกว่า  ไปเปิด Spool

วันอาทิตย์ที่ 5 มีนาคม พ.ศ. 2560

Print อักษรใหญ่,Barcode ด้วย ESC-Code

Print  อักษรใหญ่,Barcode ด้วย ESC-Code

เครดิต : หัวข้อนี้เป็นความสำเร็จของ รุ่นพี่ที่ทำงานคนหนึ่งครับ (พี่บูลย์)
        เกิดจาก IBM Printer มีราคาแพงมากกว่า Printer ทั่วไป 2-3 เท่า
        ในขณะที่ บางงาน ดูไม่คุ้มที่ต้องทำตามขั้นตอนของ IBM

        IBM ได้เตรียม Printer File ไว้สำหรับการทำ อักษร(Font)ใหญ่ หรือ Barcode
แต่เท่าที่ทราบ   จนถึงปัจจุบัน (ปี 2016) ต้องใช้ Printer เฉพาะรุ่นที่  รองรับ *IPDS ได้
(ปี 2015 ได้ทราบว่า  Laser Printer หลายรุ่นทำได้แล้ว - แค่ลง PTF เพิ่ม)

        ทางเลือกอื่น  ในการพิมพ์  อักษร(Font)ใหญ่ หรือ Barcode
บน Dot Metric Printer ที่ไม่รองรับ *IPDS
คือ  การพิมพ์โดยผ่าน Mode = ESC-Code  ของ Printer

Q: ทำไมต้องใช้ Dot Metric Printer 
A: ใช้กับ  งานที่ต้องมี Copy หรือ   ความเร็วสูง, ปริมาณมาก, ทนทาน (ราคาถูกกว่า)
     ก่อนเลือกใช้ ขอให้คำนวนต้นทุนก่อนน๊ะครับ! (ปี 2017 Laser Printer ราคาถูกลงมามาก)

Q: ข้อเสียของ Dot Metric Printer มีอะไร ?
A: อักษร/Barcode "ไม่ชัด"  -  ไม่เหมาะกับส่งให้ลูกค้า 
     ถ้าใช้กันเอง (ต้องมี Barcode ที่ผ่านการทดสอบ ว่าอ่านได้)

ตย. ใช้ Printer รุ่น   Fujitsu DL-6400   เมื่อต่อกับ Window
(ยุ่ง-1) Config Window/Printer
           1.1 ต้องติดตั้ง Driver = EPSON LQ 2xxx
                ผมเคยทดลองใช้ Driver ของ Fujistu ตรงๆ   สั่งพิมพ์ ESC ไม่ได้!
           1.2 Config ให้ Printer ให้ทำงาน กับ ESC ได้  (ผมเข้าใจว่ามันตั้งค่าไว้แล้ว)
                  EUMULATE =ESC/P2
(ยุ่ง-2) เขียนโปรแกรม
           2.1 ก่อนที่ RPG จะเริ่ม  เปิด/สร้าง Spool File
                    OVRPRTF  QPRINT   RPLUNPRT(*NO)   
                    หมายถึง   ไม่ต้อง auto clear ค่าถ้าพบ  อักษรพิเศษ (กลุ่ม "คำสั่ง" ESC)
                    ทำที่ CL หรือ ทำใน RPG (เรียกใช้ ก่อน OPEN)
           2.2 แทรก  ESC-Command
                   - เปิดใช้
                   - (ต่อไปนี้) ให้พิมพ์  อักษรใหญ่/Barcode
                   - ข้อความที่จะพิมพ์
                   - ยกเลิก การพิมพ์ อักษรใหญ่/Barcode

ESC-Command

      ใครสนใจไปลองอ่านดูน๊ะครับ มีรายละเอียด น่าสนใจมาก
      แบบย่อๆ คือ EPSON ได้ฝังชุดคำสั่ง  ให้เราสามารถสั่งพิมพ์ได้โดยตรง เป็นชุดคำสั่งไม่มาก
เช่น อักษรใหญ่ขึ้น 1,2 เท่า  อักษรกว้างขึ้น 1,2 เท่า  เป็นต้น
      ต้องไปอ่านคู่มือ  ว่า  ESC-Code ทำอะไรได้บ้าง  ตรงกับที่เราต้องการหรือไม่ ?

      สังเกต - ตัวเลือกจะน้อย  เมื่อเทียบกับ สิ่งที่เราคุ้นเคย เช่น ตั้งค่า  Font=Arial ,Size=8,12,72

Q: ทำงานยาก และ มีข้อจำกัดเพียบ  แล้วทำไมยังใช้อยู่ ?
A: เพราะ  ตัวเลือกอื่นๆ  เสียเงินมากครับ
                 Printer กลุ่ม POS หลายรุ่น ยังรองรับ  งานในลักษณะนี้อยู่
     (แปลกเหมือนกัน ผ่านมา 20 ปีแล้ว ผมยังต้องใช้เทคนิคนี้อยู่)

Q: แล้วมีตัวเลือก อื่นๆมั๊ย ?
A: ผมเสนอให้     ย้ายไปเขียน Report บน Web แล้วครับ! 
     ใครที่ ถูกกดดันให้ทำในแบบที่คุ้นเคย     บทความนี้คงช่วยได้บ้าง (ผมว่ามันยากกว่า)

วิธีใช้

      โดยการส่งรหัส  แทรกลงไปในตัวรายงาน ด้วย Format ตามนี้
      "เปิดใช้ ESC" + "จำนวนคำสั่งที่เรียกใช้" + คำสั่ง  +  ข้อความที่จะพิมพ์
   
ตย. ต้องการพิมพ์  ความกว้าง 2 เท่า, ความสูง 2 เท่า  ใน O-spec เดิม
                เดิม
O        E 10             DTL010        
O                         O#TXT    40

1. เลือก ESC Command ให้ตรง + จัดให้มี Format
        "คำสั่งเปิดใช้ ESC" + จำนวนคำสั่ง + คำสั่ง ESC + "คำสั่งปิด ESC"

  1.1 คำสั่ง "เปิด" ใช้ ESC = 03    คำสั่ง "ปิด" ด้วย 40
       จำนวนคำสั่ง = (นับจากด้านล่าง)

           เครื่องที่ผมใช้เป็น  DBCS (double byte) จะนับแบบนี้
           ตาราง ESC-Command   (รหัสเลขฐาน 16)
           ESC (1B)  v (76)        Double Width  เปิด = 01     รหัสรวม 1B7601 (3 Byte)
           ESC (1B)  w(77)        Double Height เปิด = 01     รหัสรวม 1B7701 (3 Byte)
            ... จำนวนคำสั่ง ที่จะใช้= 6 คำสั่ง

       สรุป เขียนต่อเนื่องคือ    03061B76011B770140

   1.2 คล้ายกัน  เพื่อพิมพ์ ข้อความเสร็จ   ให้  "ยกเลิก" ESC ข้างต้น
       เปลี่ยนจาก   เปิด (01)  เป็น  ปิด (00)
           ตาราง ESC-Command   (รหัสเลขฐาน 16)
           ESC (1B)  v (76)        Double Width  ปิด = 00     รหัสรวม 1B7600 (3 Byte)
           ESC (1B)  w(77)        Double Height ปิด = 00     รหัสรวม 1B7700 (3 Byte)

ใน RPG เขียนแบบนี้
I             X'03061B7601-        C          HEXON

I             '1B770140'                                    
            I             X'03061B7600-        C          HEXOF
I             '1B770040'                                    

แทรกคำสั่งใน  O-Spec
                เดิม
O        E 10             DTL010        
O                         O#TXT    40
            ใหม่ (แทรก)
O        E 10             DTL010        
O                         HEXON     1
O                         O#TXT    40

O                         HEXOF    60

วันจันทร์ที่ 21 มีนาคม พ.ศ. 2559

Download AS/400 File to Excel-2

Download AS/400 File to Excel-2

มาดูวิธีทำทั่วไปครับ  ทำผ่านเครื่องมือที่ ibm จัดไว้ให้
1. เรียกใช้ โปรแกรม
    Start > IBM i Access for Windows
    หรือ   กดปุ่ม Received files from host (ด้านบน หน้าจอ 5250 Emulator)
2. ระบุ  file ที่จะ Download
    IBM :   Server อะไร,  ชื่อ File (Lib / File)
    ปุ่ม [Data Option] ใช้ใส่รายละเอียด เหมือน SQL(เลือก บาง Field, กรองข้อมูลด้วย Where)
          ถ้าทำตามคำแนะนำ  ส่วนนี้จะไม่ต้องทำ        
    ข้อแนะนำ  -  สำหรับ User เรียกใช้  ให้แยก Lib / File  ออกมา
                         ทุกครั้งที่  ส่ง File ให้ Replace (ทับ/แทนที่ ลงไป)

    ระบุ  การจัดเก็บ PC File
    PC :      Output Device  เปลี่ยนเป็น  "File"
                 ระบุ Path/File  ที่จะจัดเก็บ

                 กดปุ่ม [Detail]    เพื่อเลือกชนิด File เช่น   CSV  หรือ BIFF(Excel File)
    File Details :
         PC File Description file (.FDF)
         กรณีที่  จะทำซ้ำ หรือ upload   เราจะ Save ไว้  (จำ Path ที่เก็บไว้ด้วย)
         กด  [Ok]  เพื่อปิดหน้าต่างนี้
   กด File > Save เพื่อจัดเก็บ Profile ให้เรียกใช้ซ้ำ (ผ่าน RTOPCb.exe)

ขั้นตอน Upload จะคล้ายกัน
แต่มีเทคนิค  ให้สร้าง File บน AS/400, iSeries ก่อน  แล้วทำ Download ลงมา
        แล้วจัดเก็บ .FDF (โครงสร้าง File/Field)

เมื่อทำ Upload ให้  ป้อน   ดึง info จาก .FDF มาใช้งาน
สังเกต  การ Upload ไปสร้าง File บน AS/400 จะต้องผ่านอุปสรรคหลายจุด
             ข้อแนะนำข้างต้น จะช่วยลดปัญหาต่างๆ ได้มาก

วันพฤหัสบดีที่ 17 มีนาคม พ.ศ. 2559

Download AS/400 file to Excel

Download AS/400,iSeries file to Excel

ทำผ่าน IFS (Integration File System)

มีหลายวิธีที่ทำได้  ครับ ที่ผมใช้บ่อยคือ  ข้อ 1,3
1. ใช้ Excel : MS Query  ดึงข้อมูลโดยตรง  ... วิธีนี้เหมาะกับ Developer มาก
         Excel  > Data > From Other Sources > From Microsoft Query
         (สร้าง ชื่อที่ชี้ไป AS/400   Data Source ใน ODBC)
         Tip : ผมจะ  ยกเลิก  ไม่ใช้ Query Wizard (Cancel)   แต่ใช้ MS Query (ํYes)
         Tip : ผมจะ  เขียน SQL ใน iSeries Navigator ก่อน - ตรวจ Syntax ได้ดีกว่า

2. ทำผ่าน IFS (Integration File System)  ... วันนี้จะอธิบายตัวนี้

3. start > IBM i Access for Windows > Data Transfer from IBM i
         วิธีนี้ ทำเสร็จจะ save โครงสร้างไว้  ... เหมาะกับ  "ทำซ้ำ"  (โดย User)


ออกตัวก่อน   หัวข้อ 2  นี้  ผมทำไม่ผ่าน  (เกิดจาก ระบบ Security  ในบริษัทฯ)
ถ้า  บริษัทฯไหน  ที่ไม่  ติดปัญหา Security   น่าจะทำได้ และเป็นอีกตัวเลือก ที่เลือกใช้ได้ครับ

IFS คืออะไร

ในภาพของผม  มันคือ  การทำให้ AS/400,iSeries เป็น Drive ที่ PC มองเห็น
      = ใช้ Disk บน AS/400 ... ผมไม่ค่อยเห็นด้วย เพราะ Disk บน AS/400 ราคาแพงไป
แต่ถ้ามอง  เป็นเส้นทาง  ส่งต่อ File  ก็นับว่า  เป็นอีกตัวเลือกที่ดี
สำคัญมาก    file ในนี้ AS/400,iSeries   ไม่สามารถเรียกใช้ได้โดยตรง จาก PC
      (การจัดเก็บต่างกัน)  ต้องมี  "ขั้นตอน" โอนแปลงชนิด file

ขั้นตอน (แบบย่อ)

1. สร้าง Folder IFS  ใน AS/400,iSeries + กำหนดให้ Share
    หัวข้อนี้ ผมไม่เชี่ยวชาญ น๊ะครับ  แต่ในนี้อธิบายไว้ครบ

      คลิกขวา > เลือก New Folder
       
    สังเกต เปลี่ยนค่า *default เพื่อลดปัญหา Security

    อ้างอิง  http://www.rpgpgm.com/2014/09/how-to-map-ifs-folder-as-windows-share.html

2. cmd  CPYTOIMPF   ไปที่  Folder IFS ที่สร้างไว้
    อ้างอิง   http://www.itjungle.com/fhg/fhg010913-story01.html

    CPYTOIMPF FROMFILE(MYLIB/ITEMS)  
              TOSTMF('/Sarayut/Items.csv')
              RCDDLM(*CRLF)  ADDCOLNAM(*SYS)

    ตย.ผลลัพธ์ ใน Items.csv
        ITEM_NO,ITEM_00001,ITEM_PRICE  
        1          ,"Whirlpool Washing Machine",750.0000
        2          ,"Whirlpool Dryer (Gas)",775.0000
        3          ,"Maytag Dishwasher",600.0000

    ปรับรูปแบบได้  เช่น เปลี่ยน/เพิ่ม อักษร ลงท้าย เป็นต้น

3. Windows Explorer : Map Network Drive ไปที่ Folder IFS

     ระบุไปที่    //AS400 server name/Folder ที่สร้าง)
          
    จุดนี้  copy File ไปใช้ หรือ เปิดโดยตรง ก็ได้ครับ

ผมพบปัญหาคือ Access Deny  (ในการใช้ในส่วน AS/400 IFS)
น่าจะเกิดจาก สิทธิ ของการเข้าใช้ IFS

วันอังคารที่ 15 มีนาคม พ.ศ. 2559

Rename Field while Running RPG/400

การเปลี่ยนชื่อ Field ใน RPG ILE
    มีแนะนำใน Internet มาก- หาได้ง่าย ... ไม่ขออธิบายน๊ะครับ
แต่การเปลี่ยนชื่อ Field ใน RPG/400 หาได้ "ยากกว่า"

การใช้งาน + ปัญหาที่พบ

- มีการใช้หลาย File ที่มี Write,Delete,Update  ชื่อ Field  "ซ้ำกัน" 
  ตย.1  File = Order     มี   field ORDER
            File = Invoice   ก็มี field ORDER

  ตย.2  จะลบข้อมูลที่ซ้ำ (ด้วย RPG/400)  โดยเลือก เปิด L-File 2 ตัว
           L-File ตัวแรก  ชี้จุดเริ่มต้น   
           L-File อีกตัวใช้   ตรวจและ "ลบ"

- ปัญหาที่พบ คือ  หลัง compile ตัวแปรทั้ง 2 จะใช้  พื้นที่  "ร่วมกัน"  
          ตัวแปรจะ  จะเก็บค่า  "ล่าสุด"  ไว้เท่านั้น 
          ถ้าเผลอนำค่านี้  ไปชี้เพื่อ  Write, Update, Delete จะ "ผิด"
                จะพบปัญหา  เมื่อ  ใช้เทคนิคเขียน code แบบสั้น (จัดการ file แบบง่าย)
                             มาเขียนงานที่เริ่มซับซ้อน  (ใช้ย่อ แบบผิดประเภท)

ทางแก้ไข

- ย้ายค่า ตัวแปร ไปเก็บที่อื่น แล้ว ย้ายกลับมา
          ไม่เหมาะ ถ้ามีจำนวน Field มาก  (เริ่มยาว)
- สร้าง Logical File ใหม่   โดย rename ใน Logical File 
          ไม่เหมาะ ถ้า file ขนาดใหญ่ (Index นาน) แต่ใช้งานชั่วคราว
- เปลี่ยนชื่อ Field ใน File ขณะ Run

วิธีการประกาศ

+... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 .
 Ircd-fmt                                                 
 I              old-field                       new-field 

ตัวอย่าง

ข้อมูล Logical File (ข้อมูลเรียงตามนี้)

RPG เปิดใช้ ทั้ง 2 Logical File  โดยชี้ไป   ต่าง Row

FSQL010L1IF  E           K        DISK                    
FSQL010L2IF  E           K        DISK                    
 *------------------------------------------------------* 
ISQL010R1                                                 
I              L1EPNO                          AAEPNO     
I              L1EDUC                          AAEDUC     
 *------------------------------------------------------* 
C           KL114     KLIST                               
C                     KFLD           PLAC    2            
C                     KFLD           DIVI    2            
C                     KFLD           OPEC    2            
C                     KFLD           EPNO    6            
C           KL214     KLIST                               
C                     KFLD           PLAC                 
C                     KFLD           DIVI         
C                     KFLD           OPEC         
C                     KFLD           EDUC    1    
C                     MOVEL'T2'      PLAC         
C                     MOVEL'72'      DIVI         
C                     MOVEL'11'      OPEC         
C                     MOVEL'D'       EPNO         
C           KL114     CHAINSQL010L1             80
C                     MOVEL'1'       EDUC         
C           KL214     CHAINSQL010L2             80
C           *IN80     IFEQ '0'                    
C                     END                         

ดูค่าจากการ Debug (StrISDB)
     ตัวแปร  AAEPNO, AAEDUC แสดงค่า แตกต่างกันกับ  L1EPNO,L1EDUC