thanks to Mr. Colin.W for the answer, it’s works :D

Mr. Colin. W said :

“I usually get that message when I have not set a parameter in a calling
program, and im trying to use it in the called program,
or I am passing a field that is longer or shorter than the parameter field
that I have declared and so am messing up the parameters somehow”

and that’s true. I’ve got this error to (Pointer not set for location referenced), in my case it cause by the shorter parameter that i’m passing to another program. from CL program to another CL program and from CL program to RPGLE program.

CL command at RPGLE

24 November 2008

reminder again…. :D

..::: cuplikan code supaya bisa pake CL command di RPGLE :::..

D*  ini bagian deklarasi dan inisialisasi
D CMDX            S            500    INZ(*blank) VARYING
D CMDLINE         PR                  Extpgm(‘QCMDEXC’)
D STRING                      1000    Const
D                                     Options(*Varsize)
D LEN                           15P 5 Const

C* ini bagian CL command yang dipanggilnya. exp : “RMVLNK”
/FREE
CMDX = ‘RMVLNK SFILNM’;
CALLP CMDLINE(CMDX:%LEN(CMDX));
/END-FREE
C*

*sory ga dirapihin… :p

*reminder – indikator

8 Oktober 2008

dimanakah indikator dalam RPG diletakan ?

reade -> EQ        found -> ‘0′
read  -> EQ
readp -> EQ
chain -> HI        found -> ‘0′
update -> LO
write -> LO
delete -> LO
lookup -> EQ    found -> ‘1′

*inti masalah ada di bagian yang dicetak tebal

skenario :

  1. Java Login ke AS400 menggunakan User : EDEN
  2. Java Call Program A (program CL)
  3. Program A memanggil program B. program B adalah program RPG yang akan membuat SpoolFile (output yang dihasilkan dari PRTF)
  4. Program A akan membuat satu file PF kosong yang terdiri dari 1 Field Char dengan panjang 255
  5. Program A kemudian mengcopykan spoolFile (poin 3) ke PF (poin 4) [cpysplf].
  6. PF yang telah terisi tersebut kemudian diambil oleh Java menggunakan FTP.

// ketika java call rpg program, dia akan menggunakan user : QUSER Di SubSystem QUSRWRK

Work with Job
System: ASDEV02
Job: QZRCSRVS User: QUSER Number: 594087

// Namun di Job Status Atribut, Current User Profile nya menggunakan user ketika java login ke AS400 nya

Display Job Status Attributes
System: ASDEV02
Job: QZRCSRVS User: QUSER Number: 594087
Status of job . . . . . . . . . . . . . . . : ACTIVE
Current user profile . . . . . . . . . . . : EDEN
Job user identity . . . . . . . . . . . . . : EDEN
Set by . . . . . . . . . . . . . . . . . : *DEFAULT
Subsystem . . . . . . . . . . . . . . . . . : QUSRWRK
Subsystem pool ID . . . . . . . . . . . . : 1
Type of job . . . . . . . . . . . . . . . . : PJ
Special environment . . . . . . . . . . . . : *NONE
Program return code . . . . . . . . . . . . : 1

// Dan ketika rpg program yang di call java itu membuat spoolfile…. job name, user, dan job number nya beda lagi.

Work with All Spooled Files
File
Opt File     Nbr Job     User Number
TESSPLFT 732 QPRTJOB EDEN 706513

// Nah untuk Copy Spool File To PF (CPYSPLF) diperlukan Job Deskripsi (Job, User dan Number) yang ada di SpoolFile, SpoolFile Number, dan SpoolFile Name.

Copy Spooled File (CPYSPLF)
Spooled file . . . . . . . . . . Name
To data base file . . . . . . . Name
Library . . . . . . . . . . . *LIBL Name, *LIBL, *CURLIB
Job name . . . . . . . . . . . . * Name, *
User . . . . . . . . . . . . . Name
Number . . . . . . . . . . . . 000000-999999
Spooled file number . . . . . . *ONLY 1-999999, *ONLY, *LAST, *ANY
Job system name . . . . . . . . *ONLY Name, *ONLY, *CURRENT, *ANY
Spooled file created:
Creation date . . . . . . . . *ONLY Date, *ONLY, *LAST
Creation time . . . . . . . . Time, *ONLY, *LAST
To member . . . . . . . . . . . *FIRST Name, *FIRST
Replace or add records . . . . . *REPLACE *REPLACE, *ADD

// SpoolFile Name merupakan nama PRTF yang menjadi output.
// SpoolFile Number bisa diperoleh menggunakan INFDS dari 123 sampai 124 (integer Field/I)
// dari Job Deskripsi SpoolFile, saya baru bisa memperoleh User. Yaitu dengan menggunakan Retrieve Job Atribut dengan parameter Current user.
// klo Job Deskripsi (Job name, User dan Job Number) dicari menggunakan Retrieve Job Atribut, mka yang diperoleh adalah Job Deskrispi yang dari WRKACTJOB (QZRCSRVS/QUSER/#number). sedangkan yang diperlukan adalah job deskripsi di spoolFile.
// Untuk mendapatkan Job Name dan Job Number dari Job Deskripsi SpoolFile ada yang bisa bantu? ada yang tau command CL atau RPG nya?

// Sebelumnya saya pernah mencoba menggunakan Submit Job atau Change Job. namun ini berakibat SpoolFile Number kembali dari 1 lagi. sehingga ketika CPYSPLF ditemukan 2 spoolFile. sehingga muncul pesan kesalahan
// Solusi menggunakan option *LAST pernah saya coba juga. Namun ini tidak bisa dilakukan karena kehebatan proses paralelisme.
// Googling pun belum menorehkan hasil :(
// Ada Solusi menggunakan API, namun belum berhasil juga sampe sekarang :(
// Ada Solusi lain, namun mengubah skenario. yaitu program B jadinya tidak membuat SpoolFile, namun dia langsung menulis ke PF. ini membutuhkan trik DS sepertinya ;D Baca entri selengkapnya »

MOVE, MOVEL dan EVAL

14 Mei 2008

Udah lama sih gw nemuin kasus kaya gini, tapi ga ada salahnya gw tuangin disini. Maaf, ga maksud menggurui, hanya ingin share temuan. Atau malahan udah pada tau…. *asa ngabejaan bulu tuur*

Apa bedanya opcode MOVE, MOVEL dan EVAL di RPGLE ?
berikut contoh codenya, smoga memberikan pencerahan :D

DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++++Comments++++++++++++
d VAR1            s              4S 0
d VAR2            s              3S 0
d VAR3            s              4S 0
CL0N01Factor1+++++++Opcode&ExtFactor2+++++++Result++++++++Len++D+HiLoEq....Comments++++++++++++
*
C                   Z-ADD     1234          VAR1
C     VAR1          DSPLY                                                  1234
c                   MOVE      VAR1          VAR2
C     VAR2          DSPLY                                                  234
c                   MOVEL     VAR1          VAR2
C     VAR2          DSPLY                                                  123
C*                  EVAL      VAR2 = VAR1                                  MENTAL
C                   Z-ADD     1000          VAR1
C                   Z-ADD     100           VAR2
C     var1          sub       var2          var3
C     VAR3          DSPLY                                                  900
c                   SETON                                        LR

DSPF

3 Mei 2008

stelah staun lebih, hari ini gw berhasil bikin dspf. trahir gw bikin dspf ya pas training rpg. di project gw ga kbagian bikin dspf, slain karena front end nya java juga karena jatah bikin main menu dan config menu itu buat team leader gw.

apa sih dspf?
singkatnya, dspf itu object untuk tampilan (ui, user interface) di dunia rpg atau as/400. dspf kependekan dari display file.

dspf yang gw buat tujuannya untuk mempermudah pemanggilan tools yang gw buat. meski baru sbagian yg dah jadi, tapi ntarnya ada menu untuk update list pf/lf (add edit delete), start jurnaling pf, compile all rpg, compile all cl, compile all pf/lf/join/data structure, dll. tools ini tadinya terpisah-pisah. karena kmaren2 buatnya juga insidensial. pas butuh ya buat.

tuk buat member dspf ada 2 cara. cara ke-1 pake command crtdspf. cara ke-2 (cara ksukaan gw) copy paste dari member dspf yang ada trus edit.
selanjutnya berkreasi lah membuat tampilan se keren mungkin. sdikit saran untuk pemula kaya gw, jangan sering2 liat jam. karena mungkin akan sering bergumam: “Anjrit baru sgini dah … jam gw ngerjainnya”. trus hati2 dengan tombol del dan end. trus kuasai tombol -, =, f4, ? akan banyak2 membantu. trus design pake seu juga jangan diremehkan. sesekali seu lebih enak ktimbang design view.

dspf slesai, balik lagi ke rpg nya. tetep, mau ga mau harus ada code rpg nya. disini, code rpg berfungsi untuk ngatur alur ui kita. pinter2 aja pake indikator2 umum yang biasa dipake as400. kaya F3 exit dan F12 back/cancel. hati2 dengan loop. sysreq 3 (end job) mungkin akan sangat membantu.

ingat, sekeren-kerennya bikin ui di as/400 jangan terlalu berharap bisa seperti ui yang kbanyakan ditemui di non as/400. jauuuuuh bedaaaa.

sdikit gambaran, waktu prtama kali blajar bahasa c pernah disuruh bikin menu yang pake gotoxy salah satunya. nah persis mirip seperti itu. uinya juga ga jauh beda hasilnya.

bravo AS/400 !!!

read vs lock

16 Januari 2008

kasus ini gw temuin kemaren.

pada awalnya gw bingung knapa tabel ini ke lock. padahal di mesin yang satunya ga ada masalah untuk proses yang sama, data yang sama, dan program dari source yang sama.

solusi pertama yang gw dapet adalah dengan men-delay job utama sbelum mengupdate nilai, ketika sluruh job yang dia buat telah slesai melakukan tugasnya. ini dilakukan tuk ngeyakinin bahwa job telah me-release table sehingga bisa di update sama job utama. ternyata ini bukan solusi. tabel masih di lock. hmmm…

solusi kedua. suspect ternyata bukan job yang dibuat, tapi si job utama yang nge-lock. code gw review lagi. then, ok di CL programnya gw kasih command OVRDBF FILE(namaFileDb) SHARE(*YES) sbelum manggil RPGLE-nya dan DLTOVR FILE(namaFileDb) setelahnya. command ini berfungsi untuk mengoveride file dan membuat file tsb share for update untuk program lain -yang juga akan menggunakan file tsb- ktika dibuka oleh programnya. then, compile, run….. LCKW (lock wait)…. MSGW(mesej wait-pertanda program mental/error)… anjrit, masih nge-lock. dah stengah hari lebih nih. hmmm…

solusi ketiga. review lagi code job utama… review lagi code program yg di panggil oleh job yang dibuat job utama… telaah lagi CPF (error information) dari MSGW yang muncul… nah dapet juga jawabannya. job yang dibuat job utama ga bisa dapetin record yang akan di update karena di-lock oleh job utama tabel PF nya. padahal yang dipake job yang dibuat adalah LF nya. yo wes, gw OVRDBF aja nih LF. ini juga saran dari temen gw -juga trainer RPG gw, Pak Ardijan-. then, compile…. shalat magrib dulu…. run…. LCKW…. MSGW….(again? arghhh..)

solusi keempat. review lagi…liat MSGW nya lagi… dan… gw baru nyadar ada tulisan “can not alocate object at line xxx (gw lupa), because it’s being used by another program” kurang lebih seperti itu lah. gw liat compile-an code nya. ternyata line tersebut adalah opcode CHAIN ke LF. karena job brjalan paralel gw cek kmungkinan job utama lagi ngapain pas job yg dibuatnya nge-CHAIN. owch…lagi loop tuk opcode READ tabel PF yang LF nya di-CHAIN job yg dibuat. ini lock nya level record brarti, solusi dua dan tiga tuh untuk lock level tabel. kok READ nge-lock ya??? setau gw slama ini, meskipun file spec nya UF (bisa read, update) atau UF A (bisa read, update, insert) untuk READ baik diawali opcode KEY SETLL atau ga, ga akan nge-lock. gw simulasiin, gw bikin 2 program kecil. dan hasilnya bener ngelock. akhirnya gw kasih (N). opcode jadinya READ (N) -pada kolom (E)- klo di RPG. klo di RPGILE bisa langsung READ(N). penambahan (N) ini mengakibatkan record tidak di-lock tapi hanya di read saja. (N) ini bisa dipake juga untuk opcode READP, READE, CHAIN. Soalnya untuk file spec UF atau UF A baik READ, READE, READP ataupun CHAIN, dia akan nge-lock record. gw simulasiin….dan….sukses. gam nge-lock lg. solusi ini hasil diskusi dengan dicky. tinggal compile nih… hmmm… mba erna nya dah pulang (jam brapa ini bung???, stengah smbilan!!!), besok aja deh jadinya. -besok paginya- compile… run… pass… ok sip. dah bener akhirnya. delay dicabut lg, tp OVRDBF tetep dipake.

INGAT, klo pake file spec UF atau UF A harus pake (N) untuk tujuan read doang. tapi klo buat update, ya ga usah. karena emang harus di-lock.
hanya file spec IF yang ga nge-lock ktika pake opcode CHAIN, READ, READP, READE.