- 论坛徽章:
- 0
|
原帖由 Stealer 于 2008-6-18 10:36 发表 ![]()
rektrnr是记录格式名,在ds里也有定义过。
reade前面不用klist,用一个字段或变量名就可以了。/End-Free
太感谢你了一直帮忙到现在,呵呵。
对了,你说的自由格式是什么?rpg也可以有自由格式吗?
怎么设置啊?
解决就好!
我应该想到,在程序描述文件中,不能使用Klist,因为在F表中定义的键值是一段可以多字段属性组合的一个键值。呵呵,有时几种编程方式都混交在一起,看起来很正常,实际上是不对的。
另外,“rektrnr是记录格式名,在ds里也有定义过。”,记录格式名必须在D表,或I表中定义,与外部的DDS描述没有任何关系。
OS V4.5之后就有rpg自由格式。主要在C表中,在使用自由格式的处理段第7列,头尾设置:
/Free
/End-Fee
好像没有自由格式RPG编程的资料。
下面,我贴一个程序,仅供参考:
//处理文件定义(注意事务控制)
F* 存款日终入账请求文件
FBDFTHQCG00UF E K Disk ReName(BDRFHQCG:BDRFHQCG00)
F PreFix(CG)
F Usropn
F ExtFile(c_FileName)
F Commit
D* 平台原型接口定义
*
D/COPY QDFNSRC,BXPYPRS
D* Logging 原型接口定义
D/COPY QDFNSRC,BXPYLGPRS
D
D* 运行控制平台接口定义
D
D*RQ-运行控制系统命令定义
D/Copy QDfnSrc,RQCmdDfnH
D*RQ-运行控制常量定义
D/Copy QDfnSrc,RQCstDfnH
D*RQ-运行控制变量定义
D/Copy QDfnSrc,RQDtaDfnH
D/Copy QdfnSrc,RQPGMSTSH
D*RQ-运行控制公用函数接口定义
D/Copy QDfnSrc,RQFunSrv1H
D*日期处理函数接口定义
D/Copy QDfnSrc,XXDATSRVH
*
//定义字段
D
D* BTX 交易公用数据空间
D/COPY QDFNSRC,BXLYBCOM
D* 常用常量定义
D/COPY QDFNSRC,BXLYCONST1
D* 分录常量定义
D/COPY QDFNSRC,BXLGCONST
D
//各应用模块定义部分
D
D* 活期存款常用常量
D/COPY QDFNSRC,BDLCONST
D* 存款日终批处理使用常用常量定义
D/COPY QDFNSRC,BDBTCONST
D* 存款日终批处理异常信息常量定义
D/COPY QDFNSRC,BDBTERMSG
D* 产品参数码定义文件
D/COPY QDFNSRC,BDLCPCSM
* 活期存款模块用接口数据结构
D/COPY QDFNSRC,BDLIRES
* 活期存款组内部服务程序原型接口定义
D/COPY QDFNSRC,BDPSRVPRS
//Pgm_BDXT0032参数结构
DBD0032RESDS DS LIKEDS(BDLT0032)
DBD0032RESPTR S *
//主程序原型和入口参数定义
DPgm_BDBTA006 Pr ExtPgm('BDBTA006')
D Pr_DataR Like(xc_Data)
D Pr_YxxxDsR LikeDs(x_Yxxx_Ds)
DPgm_BDBTA006 PI
D c_DataR Like(xc_Data)
D Yxxx_DsR LikeDs(x_Yxxx_Ds)
D
DPgm_BDXT1032 Pr ExtPgm('BDXT1032')
D Pr_ResPtr *
D Pr_DT 1
D Pr_FL 1
D Pr_Rc 1
D Pr_MG 7
D
D*参数
DRC S 1
DRC1 S 1
DRTNCOD S 7A
DFL_FG S 1
DDT_FG S 1
DMG_ID S 7
Dc_FileName S 21 Inz
Dc_FNAME S 21 Dim(20) Inz
Dp_I S 3P 0 Inz
D
D c_Cxmc S 10
D c_Xxlx S 10
D c_Xxdm S 7
D c_Xxnr S 80
D
//内部使用变量参数定义
Dc_CHKFLG S 1A Inz('0')
Dc_RZJZFLG S 1A Inz('0')
Dc_ENDFLG S 1A Inz('0')
Dp_COUNT S 10P 0 Inz(0)
Dp_DATE S Like(CGCG01DATE)
Dp_DLYCNT S 3P 0 Inz(0)
D
//***************************************************************
// MainLine
//***************************************************************
/Free
//初始化
ExSr Init ;
p_I = 1 ;
Dow c_FNAME(p_I) <> *Blank ;
c_FileName = c_FNAME(p_I) ;
//打开存款日终入账请求文件
ExSr OpenHqcg ;
//存款日终入账请求文件记帐处理
ExSr HqcgJzcl ;
//关闭存款日终入账请求文件
ExSr CloseHqcg ;
p_I = p_I + 1 ;
EndDo ;
//正常退出
ExSr Exit ;
//**************************************************************
// 子例程 :Init
// 功能 :初始化
//**************************************************************
BegSr Init ;
//程序变量初始化
xc_Data = c_DataR ;
x_Yxxx_Ds = Yxxx_DsR ;
//获取请求文件名称
//c_FileName = %Subst(xc_Data:1: ;
c_FNAME(1) = 'BLTAHQCGA' ;
c_FNAME(2) = 'BLTAHQCGB' ;
//获取当前交易日期
p_DATE = 0 ;
RTNCOD = f_xxdatget(p_DATE) ;
If RTNCOD <> 'XXM0000' ;
//发送错误信息-获取当前工作日错误
c_XXDM = BD_ERR8001 ; //信息代码
c_XXNR = BD_DES8001 ; //信息内容
Exsr SndErrMsg ;
EndIf ;
EndSr ;
//**************************************************************
// 子例程 :HqcgJzcl
// 功能 :存款日终入账请求文件记帐处理
//**************************************************************
BegSr HqcgJzcl ;
//循环读取存款日终入账请求文件
p_DLYCNT = 0 ;
Setll *Loval BDFTHQCG00 ;
Read(E) BDFTHQCG00 ;
Dow %Error And p_DLYCNT < BT_DLY_CNT ;
Exsr JobWait ; //作业延时
p_DLYCNT = p_DLYCNT + 1 ;
Read(E) BDFTHQCG00 ;
EndDo ;
If %Error ;
Read BDFTHQCG00 ;
EndIf ;
Dow Not %Eof ;
//处理扣账标志为未处理的记录
If CGCG18ENTP <> '1' ;
p_DLYCNT = 0 ;
Read(E) BDFTHQCG00 ;
Dow %Error And p_DLYCNT < BT_DLY_CNT ;
Exsr JobWait ; //作业延时
p_DLYCNT = p_DLYCNT + 1 ;
Read(E) BDFTHQCG00 ;
EndDo ;
If %Error ;
Read BDFTHQCG00 ;
EndIf ;
Iter ;
EndIf ;
//存款日终入账请求文件数据检查
Exsr ChkHqcg ;
//调用活期存款日终记账API记账
If c_CHKFLG = '0' ;
Exsr HqckRzjz ;
EndIf ;
//更新存款日终扣账请求文件
If c_CHKFLG = '1' Or c_RZJZFLG = '1' ;
CGCG18ENTP = '3' ; //扣账标志-扣账失败
CGCG26STAM = %TimeStamp ; //结果时间戳
If c_RZJZFLG = '1' ;
CGCG24FLNM = BD0032RESDS.OUTMSG ;
EndIf ;
Update(E) BDRFHQCG00 ;
If %Error ;
//发送错误信息-更新文件错误
c_XXDM = BD_ERR8010 ; //信息代码
c_XXNR = BD_DES8010 + 'BDFTHQCG' ; //信息内容
Exsr SndErrMsg ;
EndIf ;
Else ;
CGCG18ENTP = '2' ; //扣账标志-扣账成功
CGCG19AC15 = BD0032RESDS.OUTBKACNO; //记账帐号
CGCG20ACID = BD0032RESDS.OUTACID ; //帐号科目号
CGCG21BRNO = BD0032RESDS.OUTABRNO ; //帐号开户机构
CGCG22BRNO = BD0032RESDS.OUTBBRNO ; //帐号归属总账机构号
CGCG23FLNM = BD0032RESDS.OUTFLNM ; //户名
CGCG24FLNM = *Blank ; //返回信息
CGCG26STAM = %TimeStamp ; //结果时间戳
Update(E) BDRFHQCG00 ;
If %Error ;
//发送错误信息-更新文件错误
c_XXDM = BD_ERR8010 ; //信息代码
c_XXNR = BD_DES8010 + 'BDFTHQCG' ; //信息内容
Exsr SndErrMsg ;
EndIf ;
EndIf ;
//事务提交
p_COUNT = p_COUNT + 1 ;
IF p_COUNT = BDA006_CMT ;
Commit ;
p_COUNT = 0 ;
EndIf ;
//读取下一条记录
p_DLYCNT = 0 ;
Read(E) BDFTHQCG00 ;
Dow %Error And p_DLYCNT < BT_DLY_CNT ;
Exsr JobWait ; //作业延时
p_DLYCNT = p_DLYCNT + 1 ;
Read(E) BDFTHQCG00 ;
EndDo ;
If %Error ;
Read BDFTHQCG00 ;
EndIf ;
EndDo ;
//调用活期存款日终记账API记账
c_ENDFLG = '1' ; //不做记账处理只释放相关资源
Exsr HqckRzjz ;
EndSr ;
//**************************************************************
// 子例程 :ChkHqcg
// 功能 :存款日终入账请求文件数据检查
//**************************************************************
BegSr ChkHqcg ;
c_CHKFLG = '0' ;
//交易日期检查
If CGCG01DATE <> p_DATE ;
c_CHKFLG = '1' ;
CGCG24FLNM = '交易日期非当前工作日' ;
LeaveSr ;
EndIf ;
//原交易流水号检查
If CGCG02TXSN = 0 ;
c_CHKFLG = '1' ;
CGCG24FLNM = '原交易流水号为0' ;
LeaveSr ;
EndIf ;
//交易类型检查
If CGCG08INVT <> '1' And CGCG08INVT <> '2' And CGCG08INVT <> '3'
And CGCG08INVT <> '4' And CGCG08INVT <> '5'
And CGCG08INVT <> ' ' ;
c_CHKFLG = '1' ;
CGCG24FLNM = '交易类型不正确' ;
LeaveSr ;
EndIf ;
//钞汇属性检查
If CGCG11CHSX <> '1' And CGCG11CHSX <> '2' ;
c_CHKFLG = '1' ;
CGCG24FLNM = '钞汇属性不正确' ;
LeaveSr ;
EndIf ;
//申请金额检查
If CGCG12PAMT <= 0 ;
c_CHKFLG = '1' ;
CGCG24FLNM = '申请金额小于等于0' ;
LeaveSr ;
EndIf ;
EndSr ;
//**************************************************************
// 子例程 :HqckRzjz
// 功能 :活期存款日终记账
//**************************************************************
BegSr HqckRzjz ;
c_RZJZFLG = '0' ;
//调用活期存款日终记账API
Clear BD0032ResDs ;
BD0032RESDS.InADate = CGCG01DATE ; //交易日期
BD0032RESDS.InATxsn = CGCG02TXSN ; //原交易流水号
BD0032RESDS.InATssn = CGCG03TSSN ; //子交易流水号
BD0032RESDS.InATxcd = CGCG04TXCD ; //原交易码
BD0032RESDS.InBTxcd = CGCG05TXCD ; //子交易码
BD0032RESDS.InAS001 = CGCG06S001 ; //应用系统代码
BD0032RESDS.InAS002 = CGCG07S002 ; //应用模块代码
BD0032RESDS.InAFlag = CGCG08INVT ; //交易类型
BD0032RESDS.INACNO = CGCG09AC22 ; //账号
BD0032RESDS.INCCYC = CGCG10CCYC ; //币种
BD0032RESDS.INCHSX = CGCG11CHSX ; //钞汇
BD0032RESDS.INJYFX = '2' ; //交易方向
BD0032RESDS.INAPAMT = CGCG12PAMT ; //申请金额
BD0032RESDS.INNTCD = CGCG13NTCD ; //摘要代码
BD0032RESDS.INOPACNO= CGCG14AC22 ; //对方账号
BD0032RESDS.INOPACID= CGCG15ACID ; //对方科目号
BD0032RESDS.INOPOBRNO=CGCG16BRNO ; //对方开户机构号
BD0032RESDS.INOPABRNO=CGCG17BRNO ; //对方归属总账机构
If c_ENDFLG = '0' ;
FL_FG='1' ; //文件标志
Else ;
FL_FG='0' ; //文件标志
EndIf ;
DT_FG = '1' ;
BD0032RESPTR = %Addr(BD0032RESDS) ;
Callp Pgm_BDXT0032(BD0032RESPTR T_FG:FL_FG:RC:MG_ID) ;
If RC <> ZZ_RC_OK ;
//返回调用API出错
c_RZJZFLG = '1' ;
LeaveSr ;
EndIf ;
EndSr ;
//**************************************************************
// 子例程 :OpenHqcg
// 功能 :打开存款日终入账请求文件
//**************************************************************
BegSr OpenHqcg ;
//打开文件
Open(e) BDFTHQCG00 ;
If %Error ;
//发送错误信息-打开文件错误
c_XXDM = BD_ERR8015 ; //信息代码
c_XXNR = BD_DES8015 + 'BDFTHQCG' ; //信息内容
Exsr SndErrMsg ;
EndIf ;
EndSr ;
//**************************************************************
// 子例程 :CloseHqcg
// 功能 :关闭存款日终入账请求文件
//**************************************************************
BegSr CloseHqcg ;
//关闭文件
Close BDFTHQCG00 ;
EndSr ;
//**************************************************************
// 子例程 :JobWait
// 功能 :作业延时处理
//**************************************************************
BegSr JobWait ;
//调用系统命令作业延时等待(等待解锁)
xc_CmdLin = Cmd_DlyJob ;
xp_CmdLoc = %Scan('&S' c_CmdLin) ;
If xp_CmdLoc > 0 ;
xc_CmdLin = %Replace(%Char(BT_DLY_TIM) c_CmdLin p_CmdLoc:
2) ;
EndIf ;
xp_CmdLen = %Len(%Trim(xc_CmdLin)) ;
xPgm_CmdExc(xc_CmdLin p_CmdLen) ;
EndSr ;
//**************************************************************
// 子例程 :SndErrMsg
// 功能 :发送异常信息
//**************************************************************
BegSr SndErrMsg ;
//调用平台发送错误信息API发送错误信息
c_Cxmc = xc_PgmName ;
c_Xxlx = BD_RQ_INFO ;
f_RQSndErr(c_Cxmc:c_Xxlx:c_Xxdm:c_Xxnr) ;
//异常退出
Exsr ErrExit ;
EndSr ;
//**************************************************************
// 子例程 :Exit
// 功能 :正常退出
//**************************************************************
BegSr Exit ;
//提交事务
Commit ;
//返回信息初始化
x_Yxxx_Ds.JyxJgdm = Z_RQ_MSGIDOK ;
x_Yxxx_Ds.JyxJgxx = '交易成功' ;
Yxxx_DsR = x_Yxxx_Ds ;
*InLr = *On ;
Return ;
EndSr ;
//**************************************************************
// 子例程 :ErrExit
// 功能 :异常退出
//**************************************************************
BegSr ErrExit ;
//事务回滚
RolBk ;
//调用活期存款日终记账API记账
c_ENDFLG = '2' ; //不做记账处理只释放相关资源
Exsr HqckRzjz ;
//关闭存款日终入账请求文件
Close BDFTHQCG00 ;
//异常信息返回
x_Yxxx_Ds.JyxJgdm = c_XXDM ; //信息代码
x_Yxxx_Ds.JyxJgxx = c_XXNR ; //信息内容
Yxxx_DsR = x_Yxxx_Ds ;
*InLr = *On ;
Return ;
EndSr ;
/End-Free
[ 本帖最后由 passthru 于 2008-6-18 12:00 编辑 ] |
|