前情提要
當時我是一名資工系的學生,大四這一年來到金融業實習。
先說!我並不排斥學習任何語言,但是這個RPG是蝦咪挖糕XD?
當時報名這個實習的時候簡章上是寫招熟悉JAVA/ASP.NET/OOP等,訓練計畫是寫使用COBOL語言,最後分發單位後,和主管詢問才知道我們組是使用RPG/400。好吧,是一個沒接觸過的語言,其實第一反應是蠻有趣的,因為連聽都沒聽過,代表在我的知識盲區,立馬用手機上網一搜,完蛋,能查到的資料少之又少,能找到10年內的資料就已經算謝天謝地了,最重要的是連IBM公司自己都已經沒在更新介紹RPG的頁面了,很多連結基本上都死了,於是就拿著書,搭配著工作上的內容,以及自己上班空閒時做的練習,留下一些紀錄,方便自己日後找語法,也方便後來者(應該很少)學習。
屬於RPG的Hello World
學習每個程式,看每個教學大家幾乎都會使用這個老套的開場對吧?但我手上的這本民國80年出版的RPG程式入門,沒有。
所以我就自己把這個遺憾填補上啦,學每個程式都一樣,先別管你用到的每一行每個字是什麼意思,先把Hello World印出來再說。
H 1
C 'Hello' DSPLY 'World'
C SETON LR在AS/400中RPG這個程式語言有嚴格的格式設定以及變數、運算符、指示器要放的位置,直到後來IBM公司出了RPGLE才有比較寬鬆的格式設定,但我們組是使用RPG,未來若有機會使用到RPGLE或COBOL再來分享給大家。
畢竟現在線上好像沒有AS/400的模擬器可以使用,似乎也沒有編輯器可以嘗試,真的是很難學習這個程式語言… 就算在家練習也沒有東西可以讓程式跑跑看,所以說… 如果有使用到這個語言的人,加油啦!
其實後來有找到可以玩的AS/400遠端伺服器,只是真的好麻煩吶!

RPG的程式架構
在寫RPG之前有很多東西是需要先了解的,例如AS/400的架構。
AS/400主機內的程式是由非常多的member組成的,Member會組成Object,Object再組成Libary。
Libary就像根目錄,通常一個專案會有一個Libary,其下會有一些Object可能會分類檔案的類型,如RPG檔、PF檔、LF檔、DSPF檔、PRTF檔、CL檔。在我們公司的做法是RPG放一起,PF, LF, DSPF, PRTF放一起,CL放一起。
這些檔案就是Member了,最基本的成員。
接下來一一介紹各個檔案的類別。
RPG檔
RPG檔就是這系列文章要著重為各位介紹的程式語言,資料的邏輯處理,增刪改查,分配指令都會使用這個檔案去處理。
CL檔
CL檔全名是Command line processor language,指令處理語言。通常會寫一些需自動化的程式碼去做程式間的中介,去幫我們呼叫其他程式可能幫忙讀資料、傳遞資料,也可能是前端傳送指令過來要幫我們呼叫下一個畫面檔。也會用這個來做自動化測試,會在CLP中寫一些參數然後去呼叫程式來幫我們自動化測試程式是否會依我們想像的方式查詢、計算、輸出資料,就不需要我們手動去開啟程式然後一個一個去輸入假資料。講地這麼複雜,其實你就當作是python寫腳本就好了XD。
PF檔
資料庫實體檔,會在這邊宣告資料庫的各個欄位,其大小、資料型態、欄位名稱、主鍵(Key)及一些備註。
LF檔
邏輯檔,其實我不是很懂,不過我的理解是寫一些慣用的資料庫處理邏輯,例如資料的排序,資料的篩選等,可以先用邏輯檔將慣用的邏輯寫好之後每次需要使用時呼叫他,避免每次都需要寫一樣的程式碼。
DSPF檔
畫面檔,可以設定簡單的文字畫面,設定一些指令,接收使用者的資料或指令來呼叫RPG檔案或呼叫CL檔案去進行程式的運行。但我們公司不太使用這個方式了,通常都到前端去了,不管是應用程式或是網頁版,畫面會比較漂亮,而且也能印出比較漂亮的報表。但某些部門仍然會使用純AS/400開發的程式,就會需要這個報表檔來顯示畫面,缺點就是要使用這個程式就需要開啟AS/400的軟體連線主機,操作上會比較不直觀且不好看,印出來的報表就是用連續報表紙印的那種了XD。
PRTF檔
這就是前面提到的使用連續報表紙印的報表,報表檔。顧名思義就是設定報表如何印的格式的檔案,我們會使用一些指令通過定位的方式挖洞,將一些固定的表頭、欄位、頁尾、分隔線先在報表檔中定義完,需要印報表的時候只要呼叫CL程式去處理資料再傳遞到PRTF檔就能產生報表在AS/400軟體中,再去選擇列印。
講完了基本的幾個檔案分類,接下來就是講RPG這個程式的基本格式了,在RPG程式中每一行的第六欄(格)都必須填入一種格式,格式是有順序的,若在一個RPG程式中同時出現多種格式,就只能依照H、F、E、L、I、C、O的順序排列各個格式。
H格式 控制格式
通常我只用來寫程式描述跟開啟debug模式,其他我真的不知道有什麼用,可能了解的人可以來和我說一下。
F格式 檔案格式
讀取、更改、輸出資料庫時會使用的檔案格式。
E格式 擴充格式
用來宣告陣列的檔案格式。
L格式 列印格式
沒有使用過。
I格式 輸入格式
有一些很神奇的切字串的方法像是使用F格式讀取一個資料庫,使用資料庫的欄位作變數,用DS資料結構的語法糖可以切此欄位資料的1n長度的資料,再切成你要的1n來放入新的變數中,有點像其他程式語言的substring。
C格式 計算格式
最常使用的格式,所有的邏輯、迴圈、運算都會在這個格式中撰寫。
O格式 輸出格式
沒用過。
今天就先介紹到這邊,目前我就是邊學RPG邊做一些組長派來簡單的工作,像是查查資料庫的某個資料做簡單的邏輯處理之後傳到前端,慢慢學習慢慢了解這個語言,對於一個過度依賴Google的人來說,查不到資料真的非常痛苦,但還是沒有放棄,每天都會換個方式查查看,看能不能查出什麼不一樣的內容XD。因為公司電腦不能使用ChatGPT的關係,我也常在下班回家之後瘋狂問ChatGPT一些我有疑問的內容,雖然可能資料真的太少,常常給一些RPGLE的答案,但還是能獲得一些更深入理解這個語言的內容,不過這個語言學的差不多之後我可能就會回去學Python和Java或是Go這兩個語言了,持續增進自己的技術深度,畢竟RPG還是一個比較老的語言,如果要在這個公司久待的話,我會希望自己能夠參與到系統架構轉換的工作內容,並且學習到系統分析系統設計的部分。持續學習,持續努力是每個程式人的共通目標,共勉之。
這篇文是2024.7.19寫的,好令人懷念吶~~
其實後來有研究出來,LF其實就是建index的概念,PF裡面的KEY相當於索引鍵, 甚至你還可以把join寫在LF中,RPG在chain的時候就可以直接命中你要找的資料, 只是RPG中做大量資料的處理還是會有一些問題,因爲他只能寫迴圈一筆一筆處理(或是有整批的方式我是不知道)。 所以後來我是SQLRPG和RPG混著寫,前輩表示無奈,他說這樣其他維護的人看不懂(所以後來其實也沒寫幾隻XD
但說來也奇怪,以前在這邊是不給讓寫SQL,新公司是全部都寫SQL!!! 果然應驗那句話,說出口的話就是在向宇宙發出訂單XD