文档章节

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

kext
 kext
发布于 2012/01/15 23:44
字数 937
阅读 745
收藏 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
如何用Java制作一个简易日历

简易日历制作 记录一下Java实现的一个日历小程序,效果图如下: 实现以上的效果,我们需要用到两个类:SimpleDateFormat和Calendar。 首先看看这两个类的用法: 类 SimpleDateFormat 是一个以...

Zero_Yi
07/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Hashtable 为什么不叫 HashTable?

前几天在写《HashMap 和 Hashtable 的 6 个区别》这篇文章的时候,差点把 Hashtable 写成了 HashTable,后来看源码证实了是:Hashtable,小写的 "t"able,不符合驼峰命名规则。 什么是驼峰命...

Java技术栈
15分钟前
2
0
Position属性四个值:static、fixed、absolute和relative的区别和用法

静下心来慢慢读,读完一定会有所收获的 static(静态定位):默认值。没有定位,元素出现在正常的流中(忽略 top, bottom, left, right 或者 z-index 声明)。 relative(相对定位):生成相...

简心
16分钟前
1
0
Confluence 6 为一个空间应用一个主题

主题允许你对 Confluence 的外表和显示进行自定义。你的 Confluence 空间管理员可以到 The Atlassian Marketplace 上下载主题。 一旦一个主题被安装到 Confluence 后,这个主题可以应用到全站...

honeymose
17分钟前
0
0
python利用os.system执行多条系统命令

先看代码(正确代码): def UpdateCNSubAllInd(): os.system("cd spiders && scrapy runspider CN_UpdateSubIndex.py")def UpdateSSESubAllInd(): os.system("cd spiders && sc......

fang_faye
27分钟前
0
0
容器技术系列汇总

docker docker - 在centos7和windows10安装 docker - 镜像加速器 docker - 构建一个简单的docker镜像 docker - 调试Dockerfile docker - 常用命令 docker - Dockerfile常用指令 docker - doc......

细肉云吞
33分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部