RPG,这个不是 Role Playing Game 的缩写,而是一种编程语言,Report Program Generator的缩写,是一种起源于用在DEC及IBM的小型机操作系统中编制报表程序的编程语言,一种运行在IBM的AS400小型机上的高级语言,一种完全过程化的程序语言。下面的这段代码是用来计算两个日期之差的天数:
1 H*
2 H* Author : KXT
3 H*
4 D*
5 D TOTAL_DAYS S 8S 0
6 D BEGIN_REMAIN S 3S 0
7 D END_PASS S 3S 0
8 D MONTH_DAYS S 2S 0 DIM(12) CTDATA PERRCD(12)
9 D*
10 D BEGIN_DATE S 8S 0
11 D BEGIN_YEAR S 4S 0
12 D BEGIN_MONTH S 2S 0
13 D BEGIN_DAY S 2S 0
14 D END_DATE S 8S 0
15 D END_YEAR S 4S 0
16 D END_MONTH S 2S 0
17 D END_DAY S 2S 0
18 D TEMP_DATE S 8S 0
19 D TEMP_YEAR S 4S 0
20 D*
21 D REM_DATA1 S 4S 0
22 D REM_DATA2 S 4S 0
23 D TEMP_DATA S 4S 0
24 D I S 4S 0
25 D*
26 D IS_LEAP S LIKE(*IN99)
27 D NEED_TRANSFER S LIKE(*IN99)
28 D*
29 C*
30 C* Main Logic
31 C EXSR SR999
32 C EXSR SR001
33 C EXSR SR998
34 C*
35 C* Processor
36 C SR001 BEGSR
37 C BEGIN_DATE IFGT END_DATE
38 C MOVE *ON NEED_TRANSFER
39 C MOVE BEGIN_DATE TEMP_DATE
40 C MOVE END_DATE BEGIN_DATE
41 C MOVE TEMP_DATE END_DATE
42 C ENDIF
43 C* Get begin year, month, day
44 C EVAL BEGIN_YEAR = %DIV(BEGIN_DATE:10000)
45 C EVAL TEMP_DATA = %REM(BEGIN_DATE:10000)
46 C EVAL BEGIN_MONTH = %DIV(TEMP_DATA:100)
47 C EVAL BEGIN_DAY = %REM(TEMP_DATA:100)
48 C* Get end year, month, day
49 C EVAL END_YEAR = %DIV(END_DATE:10000)
50 C EVAL TEMP_DATA = %REM(END_DATE:10000)
51 C EVAL END_MONTH = %DIV(TEMP_DATA:100)
52 C EVAL END_DAY = %REM(TEMP_DATA:100)
53 C* If begin and end is same year
54 C BEGIN_YEAR IFEQ END_YEAR
55 C EVAL I = BEGIN_MONTH
56 C MOVE *ZERO TEMP_DATA
57 C EVAL TEMP_DATA = END_MONTH
58 C DOW I < TEMP_DATA
59 C ADD MONTH_DAYS(I) TOTAL_DAYS
60 C MOVE BEGIN_YEAR TEMP_YEAR
61 C EXSR SR002
62 C IS_LEAP IFEQ *ON
63 C I ANDEQ 2
64 C EVAL TOTAL_DAYS = TOTAL_DAYS + 1
65 C ENDIF
66 C EVAL I = I + 1
67 C ENDDO
68 C EVAL TOTAL_DAYS = TOTAL_DAYS + END_DAY - BEGIN_DAY
69 C* If both year not equal
70 C ELSE
71 C* Calculate begin date remaining days
72 C EVAL I = BEGIN_MONTH
73 C DOW I <= 12
74 C ADD MONTH_DAYS(I) BEGIN_REMAIN
75 C MOVE BEGIN_YEAR TEMP_YEAR
76 C EXSR SR002
77 C IS_LEAP IFEQ *ON
78 C I ANDEQ 2
79 C EVAL BEGIN_REMAIN = BEGIN_REMAIN + 1
80 C ENDIF
81 C EVAL I = I + 1
82 C ENDDO
83 C EVAL BEGIN_REMAIN = BEGIN_REMAIN - BEGIN_DAY
84 C* Calculate end date passing days
85 C EVAL I = 1
86 C DOW I < END_MONTH
87 C ADD MONTH_DAYS(I) END_PASS
88 C MOVE END_YEAR TEMP_YEAR
89 C EXSR SR002
90 C IS_LEAP IFEQ *ON
91 C I ANDEQ 2
92 C EVAL END_PASS = END_PASS + 1
93 C ENDIF
94 C EVAL I = I + 1
95 C ENDDO
96 C EVAL END_PASS = END_PASS + END_DAY
97 C* Calculate other year total days
98 C EVAL I = BEGIN_YEAR + 1
99 C DOW I < END_YEAR
100 C ADD 365 TOTAL_DAYS
101 C MOVE I TEMP_YEAR
102 C EXSR SR002
103 C IS_LEAP IFEQ *ON
104 C EVAL TOTAL_DAYS = TOTAL_DAYS + 1
105 C ENDIF
106 C EVAL I = I + 1
107 C ENDDO
108 C* Calculate total diff days
109 C EVAL TOTAL_DAYS = TOTAL_DAYS + BEGIN_REMAIN
110 C EVAL TOTAL_DAYS = TOTAL_DAYS + END_PASS
111 C ENDIF
112 C NEED_TRANSFER IFEQ *ON
113 C EVAL TOTAL_DAYS = TOTAL_DAYS * -1
114 C ENDIF
115 C TOTAL_DAYS DSPLY
116 C ENDSR
117 C*
118 C* Check if leap year
119 C SR002 BEGSR
120 C EVAL REM_DATA1 = %REM(TEMP_YEAR:400)
121 C REM_DATA1 IFEQ *ZERO
122 C MOVE *ON IS_LEAP
123 C ELSE
124 C EVAL REM_DATA1 = %REM(TEMP_YEAR:4)
125 C EVAL REM_DATA2 = %REM(TEMP_YEAR:100)
126 C REM_DATA1 IFEQ *ZERO
127 C REM_DATA2 ANDNE *ZERO
128 C MOVE *ON IS_LEAP
129 C ELSE
130 C MOVE *OFF IS_LEAP
131 C ENDIF
132 C ENDIF
133 C ENDSR
134 C*
135 C* Finalization
136 C SR998 BEGSR
137 C MOVE *ON *INLR
138 C RETURN
139 C ENDSR
140 C*
141 C* Initialization
142 C SR999 BEGSR
143 C *ENTRY PLIST
144 C PARM BEGIN_DATE
145 C PARM END_DATE
146 C*
147 C MOVE *OFF IS_LEAP
148 C MOVE *OFF NEED_TRANSFER
149 C MOVE *ZERO TOTAL_DAYS
150 C MOVE *ZERO BEGIN_REMAIN
151 C MOVE *ZERO END_PASS
152 C*
153 C ENDSR
154 C*
155 **CTDATA MONTH_DAYS
156 312831303130313130313031
每一行最前面的字母都有特别的意思。。
H(Header的缩写,这个是我自己认为的,以下皆同) - 可以在这里写些代码的描述;
F(File) - 数据库文件的定义
D(Definition) - 变量的定义
C(Code) - 主程序
每一行加*的都代表那一行是注释。
浙公网安备 33010602011771号