文档章节

从'计算两个日期天数之差'程序介绍RPG语言

kext
 kext
发布于 2012/01/15 23:44
字数 937
阅读 744
收藏 0
RPG,这个不是 Role Playing Game 的缩写,而是一种编程语言,Report Program Generator的缩写,是一种起源于用在DEC及IBM的小型机操作系统中编制报表程序的编程语言,一种运行在IBM的AS400小型机上的高级语言,一种完全过程化的程序语言。下面的这段代码是用来计算两个日期之差的天数:
H*
     H* Author : KXT
     H*
     D*
     D  TOTAL_DAYS     S              8S 0
     D  BEGIN_REMAIN   S              3S 0
     D  END_PASS       S              3S 0
     D  MONTH_DAYS     S              2S 0 DIM(12) CTDATA PERRCD(12)
     D*
     D  BEGIN_DATE     S              8S 0
     D  BEGIN_YEAR     S              4S 0
     D  BEGIN_MONTH    S              2S 0
     D  BEGIN_DAY      S              2S 0
     D  END_DATE       S              8S 0
     D  END_YEAR       S              4S 0
     D  END_MONTH      S              2S 0
     D  END_DAY        S              2S 0
     D  TEMP_DATE      S              8S 0
     D  TEMP_YEAR      S              4S 0
     D*
     D  REM_DATA1      S              4S 0
     D  REM_DATA2      S              4S 0
     D  TEMP_DATA      S              4S 0
     D  I              S              4S 0
     D*
     D  IS_LEAP        S                   LIKE(*IN99)
     D  NEED_TRANSFER  S                   LIKE(*IN99)
     D*
     C*
     C* Main Logic
     C                   EXSR      SR999
     C                   EXSR      SR001
     C                   EXSR      SR998
     C*
     C* Processor
     C     SR001         BEGSR
     C     BEGIN_DATE    IFGT      END_DATE
     C                   MOVE      *ON           NEED_TRANSFER
     C                   MOVE      BEGIN_DATE    TEMP_DATE
     C                   MOVE      END_DATE      BEGIN_DATE
     C                   MOVE      TEMP_DATE     END_DATE
     C                   ENDIF
     C* Get begin year, month, day
     C                   EVAL      BEGIN_YEAR = %DIV(BEGIN_DATE:10000)
     C                   EVAL      TEMP_DATA = %REM(BEGIN_DATE:10000)
     C                   EVAL      BEGIN_MONTH = %DIV(TEMP_DATA:100)
     C                   EVAL      BEGIN_DAY = %REM(TEMP_DATA:100)
     C* Get end year, month, day
     C                   EVAL      END_YEAR = %DIV(END_DATE:10000)
     C                   EVAL      TEMP_DATA = %REM(END_DATE:10000)
     C                   EVAL      END_MONTH = %DIV(TEMP_DATA:100)
     C                   EVAL      END_DAY = %REM(TEMP_DATA:100)
     C* If begin and end is same year
     C     BEGIN_YEAR    IFEQ      END_YEAR
     C                   EVAL      I = BEGIN_MONTH
     C                   MOVE      *ZERO         TEMP_DATA
     C                   EVAL      TEMP_DATA = END_MONTH
     C                   DOW       I < TEMP_DATA
     C                   ADD       MONTH_DAYS(I) TOTAL_DAYS
     C                   MOVE      BEGIN_YEAR    TEMP_YEAR
     C                   EXSR      SR002
     C     IS_LEAP       IFEQ      *ON
     C     I             ANDEQ     2
     C                   EVAL      TOTAL_DAYS = TOTAL_DAYS + 1
     C                   ENDIF
     C                   EVAL      I = I + 1
     C                   ENDDO
     C                   EVAL      TOTAL_DAYS = TOTAL_DAYS + END_DAY - BEGIN_DAY
     C* If both year not equal
     C                   ELSE
     C* Calculate begin date remaining days
     C                   EVAL      I = BEGIN_MONTH
     C                   DOW       I <= 12
     C                   ADD       MONTH_DAYS(I) BEGIN_REMAIN
     C                   MOVE      BEGIN_YEAR    TEMP_YEAR
     C                   EXSR      SR002
     C     IS_LEAP       IFEQ      *ON
     C     I             ANDEQ     2
     C                   EVAL      BEGIN_REMAIN = BEGIN_REMAIN + 1
     C                   ENDIF
     C                   EVAL      I = I + 1
     C                   ENDDO
     C                   EVAL      BEGIN_REMAIN = BEGIN_REMAIN - BEGIN_DAY
     C* Calculate end date passing days
     C                   EVAL      I = 1
     C                   DOW       I < END_MONTH
     C                   ADD       MONTH_DAYS(I) END_PASS
     C                   MOVE      END_YEAR      TEMP_YEAR
     C                   EXSR      SR002
     C     IS_LEAP       IFEQ      *ON
     C     I             ANDEQ     2
     C                   EVAL      END_PASS = END_PASS + 1
     C                   ENDIF
     C                   EVAL      I = I + 1
     C                   ENDDO
     C                   EVAL      END_PASS = END_PASS + END_DAY
     C* Calculate other year total days
     C                   EVAL      I = BEGIN_YEAR + 1
     C                   DOW       I < END_YEAR
     C                   ADD       365           TOTAL_DAYS
     C                   MOVE      I             TEMP_YEAR
     C                   EXSR      SR002
     C     IS_LEAP       IFEQ      *ON
     C                   EVAL      TOTAL_DAYS = TOTAL_DAYS + 1
     C                   ENDIF
     C                   EVAL      I = I + 1
     C                   ENDDO
     C* Calculate total diff days
     C                   EVAL      TOTAL_DAYS = TOTAL_DAYS + BEGIN_REMAIN
     C                   EVAL      TOTAL_DAYS = TOTAL_DAYS + END_PASS
     C                   ENDIF
     C     NEED_TRANSFER IFEQ      *ON
     C                   EVAL      TOTAL_DAYS = TOTAL_DAYS * -1
     C                   ENDIF
     C     TOTAL_DAYS    DSPLY
     C                   ENDSR
     C*
     C* Check if leap year
     C     SR002         BEGSR
     C                   EVAL      REM_DATA1 = %REM(TEMP_YEAR:400)
     C     REM_DATA1     IFEQ      *ZERO
     C                   MOVE      *ON           IS_LEAP
     C                   ELSE
     C                   EVAL      REM_DATA1 = %REM(TEMP_YEAR:4)
     C                   EVAL      REM_DATA2 = %REM(TEMP_YEAR:100)
     C     REM_DATA1     IFEQ      *ZERO
     C     REM_DATA2     ANDNE     *ZERO
     C                   MOVE      *ON           IS_LEAP
     C                   ELSE
     C                   MOVE      *OFF          IS_LEAP
     C                   ENDIF
     C                   ENDIF
     C                   ENDSR
     C*
     C* Finalization
     C     SR998         BEGSR
     C                   MOVE      *ON           *INLR
     C                   RETURN
     C                   ENDSR
     C*
     C* Initialization
     C     SR999         BEGSR
     C     *ENTRY        PLIST
     C                   PARM                    BEGIN_DATE
     C                   PARM                    END_DATE
     C*
     C                   MOVE      *OFF          IS_LEAP
     C                   MOVE      *OFF          NEED_TRANSFER
     C                   MOVE      *ZERO         TOTAL_DAYS
     C                   MOVE      *ZERO         BEGIN_REMAIN
     C                   MOVE      *ZERO         END_PASS
     C*
     C                   ENDSR
     C*
**CTDATA MONTH_DAYS
312831303130313130313031

每一行最前面的字母都有特别的意思。。

H(Header的缩写,这个是我自己认为的,以下皆同) - 可以在这里写些代码的描述;

F(File) - 数据库文件的定义

D(Definition) - 变量的定义

C(Calculation) - 主程序

I(Input) - 输入

O(Output) - 输出

每一行加*的都代表那一行是注释。

我们是在IBM的AS400机器上写RPG的,界面是黑底绿字,字体颜色可以修改的,RPG程序代码的位置都是写死的,跟汇编语言是一样的,语法其实也是很像汇编的。

据我了解,貌似国内就只有银行,保险和证券是用RPG语言的,其他好像很少有公司用到这门语言,其实RPG历史还是蛮悠久的,用着用着还是蛮好玩的。

维基百科 : http://en.wikipedia.org/wiki/IBM_RPG

© 著作权归作者所有

共有 人打赏支持
kext

kext

粉丝 74
博文 31
码字总数 11149
作品 2
广州
程序员
excel操作点滴记录(长期更新)

1.如何快速给某一列中N行赋相同的值。 shift选择第N列,输入文字,ctrl+回车。 2.计算相隔日期 很简单,比如两个单元格A1,B1都是日期格式,需要计算相隔日期那个单元格设置成常规格式,然后使用公...

jeffsui
2013/11/18
0
0
php 日期时间增加一个月一天,把日期转为时间戳

//echo "今天:",date('Y-m-d H:i:s')," ";//echo "明天:",date('20160506 H:i:s',time()); strtotime('+1 day'); //再原有的日期上 增加一天 一个月都可以$sjc=strtotime("20120130 00:00:00......

旺仔的小馒头
2016/07/14
156
0
自学书籍.MySQL必知必会 - 使用数据处理函数

文本处理类函数: mysql> SELECT UPPER('Hej'); -> 'HEJ' 说明:转换为大写 mysql> SELECT LEFT('foobarbar', 5); -> 'fooba' 说明:从左取字串 mysql> SELECT LENGTH('text'); -> 4 说明:返回串......

满满李
2016/04/16
53
0
简陋至极:微信小程序日历组件(思路)

最近在做微信小程序项目,其中涉及到日历。一直以来,遇到日历,就是网上随便找个插件,这次心血来潮,想着自己去实现一下。这次不是封装功能强大,健硕完美的组件,只是记录一下,主体思路。...

冰扬
09/03
0
0
Excel 函数详解 | DATEDIF 函数:低调的日期处理专家

DATEDIF 函数的名称由 Date(日期)和 Difference(差异)两个单词组成。正如其名称表示,DATEDIF 函数用于计算日期之间的差异,包括年、月、天等。 那么,为什么说 DATEDIF 函数低调呢?因为...

懒人Excel
03/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Web系统大规模并发:电商秒杀与抢购

一、大规模并发带来的挑战 在过去的工作中,我曾经面对过5w每秒的高并发秒杀功能,在这个过程中,整个Web系统遇到了很多的问题和挑战。如果Web系统不做针对性的优化,会轻而易举地陷入到异常...

xtof
今天
2
0
代码质量管理平台-sonarqube

在工作中,往往开发的时候会不怎么注重代码质量的人很多,存在着很多的漏洞和隐患等问题,sonarqube可以进行代码质量的审核,而且十分的残酷。。。。。接下来我们说下怎么安装 进入官网下载:...

落叶清风
今天
7
0
在Ubuntu安装和配置Sphinx

Ubuntu系统默认是配置有sphinx的,先检查一下,别多此一举。。。。。 在开始本指南之前,您需要: 一个Ubuntu 16.04服务器。 sudo的一个非root用户,您可以通过以下设置本教程 。 安装在服务...

阿锋zxf
今天
3
0
Qt编写输入法V2018超级终结版

对于qt嵌入式linux开发人员来说,输入法一直是个鸡肋问题,要么不支持实体键盘同步,要么不能汉字输入,要么不支持网页输入等,这几年通过陆续接触大量的各种输入法应用场景客户,得到真实需...

飞扬青云
今天
2
0
TypeScript基础入门之高级类型的多态的 this类型

转发 TypeScript基础入门之高级类型的多态的 this类型 高级类型 多态的this类型 多态的this类型表示的是某个包含类或接口的子类型。 这被称做F-bounded多态性。 它能很容易的表现连贯接口间的...

durban
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部