文档章节

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

kext
 kext
发布于 2012/01/15 23:44
字数 937
阅读 742
收藏 0
点赞 0
评论 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

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

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

jeffsui ⋅ 2013/11/18 ⋅ 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 ⋅ 0

自学书籍.MySQL必知必会 - 使用数据处理函数

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

满满李 ⋅ 2016/04/16 ⋅ 0

java时间的处理(转)

计算Java日期 学习怎样创建和使用日期 概要 不管你是处理财务交易还是计划着下一步的行动,你都要知道怎样在Java中建立,使用和显示日期。这需要你简单的查阅一下相应类的API参考:一个日期可...

hulubo ⋅ 2012/02/16 ⋅ 0

计算两个日期相差

package com.xcfh.util; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; ......

spml ⋅ 2014/12/20 ⋅ 0

Excel 函数详解 | DATEDIF 函数:低调的日期处理专家

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

懒人Excel ⋅ 03/26 ⋅ 0

js 时间函数

$(document).ready(function () { //获取单元格值改变事件不需要获取焦点 //备注:可以换成 $(".CheckCountLen").bind("blur", function () { $("#butOK").bind("click", function () { //判......

一念三千 ⋅ 2015/06/29 ⋅ 0

Java Calendar Date使用总结

Java中Calendar的使用方法 package cn.outofmemory.codes.Date;import java.util.Calendar;import java.util.Date;public class CalendarDemo { public static void main(String[] args) { C......

青春微微博 ⋅ 2015/09/18 ⋅ 0

45 个非常有用的 Oracle 查询语句

这里我们介绍的是 40+ 个非常有用的 Oracle 查询语句,主要涵盖了日期操作,获取服务器信息,获取执行状态,计算数据库大小等等方面的查询。这些是所有 Oracle 开发者都必备的技能,所以快快...

小小编辑 ⋅ 2014/01/22 ⋅ 93

SQL Server 给一个起始日期和一个截止日期,算出这两个日期之间的月份及对应天数

1、SQL Server 给一个起始日期和一个截止日期,算出这两个日期之间的月份及对应天数; 2、业务场景:比如收了一笔款5000元,从2014-05-30到2017-04-12;现在要计算出这两个日期之间每个月收了...

alex2java ⋅ 2014/06/04 ⋅ 1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

发送短信如何限制1小时内最多发送11条短信

发送短信如何限制1小时内最多发送11条短信 场景: 发送短信属于付费业务,有时为了防止短信攻击,需要限制发送短信的频率,例如在1个小时之内最多发送11条短信. 如何实现呢? 思路有两个 截至到当...

黄威 ⋅ 昨天 ⋅ 0

mysql5.7系列修改root默认密码

操作系统为centos7 64 1、修改 /etc/my.cnf,在 [mysqld] 小节下添加一行:skip-grant-tables=1 这一行配置让 mysqld 启动时不对密码进行验证 2、重启 mysqld 服务:systemctl restart mysql...

sskill ⋅ 昨天 ⋅ 0

Intellij IDEA神器常用技巧六-Debug详解

在调试代码的时候,你的项目得debug模式启动,也就是点那个绿色的甲虫启动服务器,然后,就可以在代码里面断点调试啦。下面不要在意,这个快捷键具体是啥,因为,这个keymap是可以自己配置的...

Mkeeper ⋅ 昨天 ⋅ 0

zip压缩工具、tar打包、打包并压缩

zip 支持压缩目录 1.在/tmp/目录下创建目录(study_zip)及文件 root@yolks1 study_zip]# !treetree 11└── 2 └── 3 └── test_zip.txt2 directories, 1 file 2.yum...

蛋黄Yolks ⋅ 昨天 ⋅ 0

聊聊HystrixThreadPool

序 本文主要研究一下HystrixThreadPool HystrixThreadPool hystrix-core-1.5.12-sources.jar!/com/netflix/hystrix/HystrixThreadPool.java /** * ThreadPool used to executed {@link Hys......

go4it ⋅ 昨天 ⋅ 0

容器之上传镜像到Docker hub

Docker hub在国内可以访问,首先要创建一个账号,这个后面会用到,我是用126邮箱注册的。 1. docker login List-1 Username不能使用你注册的邮箱,要用使用注册时用的username;要输入密码 ...

汉斯-冯-拉特 ⋅ 昨天 ⋅ 0

SpringBoot简单使用ehcache

1,SpringBoot版本 2.0.3.RELEASE ①,pom.xml <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.3.RELE......

暗中观察 ⋅ 昨天 ⋅ 0

Spring源码解析(八)——实例创建(下)

前言 来到实例创建的最后一节,前面已经将一个实例通过不同方式(工厂方法、构造器注入、默认构造器)给创建出来了,下面我们要对创建出来的实例进行一些“加工”处理。 源码解读 回顾下之前...

MarvelCode ⋅ 昨天 ⋅ 0

nodejs __proto__跟prototype

前言 nodejs中完全没有class的这个概念,这点跟PHP,JAVA等面向对象的语言很不一样,没有class跟object的区分,那么nodejs是怎么样实现继承的呢? 对象 对象是由属性跟方法组成的一个东西,就...

Ai5tbb ⋅ 昨天 ⋅ 0

Ubuntu16.04 PHP7.0 不能用MYSQLi方式连接MySQL5.7数据库

Q: Ubuntu16.04 PHP7.0 不能用MYSQLi方式连接MySQL5.7数据库 A: 执行以下2条命令解决: apt-get install php-mysql service apache2 restart php -m 执行后会多以下4个模块: mysqli mysqlnd...

SamXIAO ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部