免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234
最近访问板块 发新帖
楼主: Stealer
打印 上一主题 下一主题

关于 程序记述文件 急! [复制链接]

论坛徽章:
0
31 [报告]
发表于 2008-06-16 21:48 |只看该作者
原帖由 Stealer 于 2008-6-16 15:17 发表
FREKTRN    UF A F   65     3AIDISK    KEYLOC(1)     
F                                     COMMIT        

D*>         
D                UDS                     
D  WEIG                    ...



Do you use SETLL before READE ?

论坛徽章:
0
32 [报告]
发表于 2008-06-18 10:30 |只看该作者
问题解决了,哈
就是不能用klist,把键字的位置用字段名或变量名就可以了。

论坛徽章:
0
33 [报告]
发表于 2008-06-18 10:36 |只看该作者
原帖由 passthru 于 2008-6-16 19:35 发表

你上面写的:
FREKTRN    UF A F   65     3AIDISK    KEYLOC(1)     
F                                     COMMIT        

D*>         
D                UDS                     
D  WEIG    ...



rektrnr是记录格式名,在ds里也有定义过。
reade前面不用klist,用一个字段或变量名就可以了。
太感谢你了一直帮忙到现在,呵呵。

对了,你说的自由格式是什么?rpg也可以有自由格式吗?
怎么设置啊?

论坛徽章:
0
34 [报告]
发表于 2008-06-18 10:40 |只看该作者
不过还是希望能有关于 程序描述文件 的详细资料看一下,虽然这个现在不常用。

论坛徽章:
0
35 [报告]
发表于 2008-06-18 11:50 |只看该作者
原帖由 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(BD0032RESPTRT_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_CmdLinp_CmdLoc:
                  2) ;
            EndIf ;
            xp_CmdLen = %Len(%Trim(xc_CmdLin)) ;
            xPgm_CmdExc(xc_CmdLinp_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 编辑 ]

论坛徽章:
0
36 [报告]
发表于 2008-06-18 16:42 |只看该作者
受教了,呵呵,谢谢!
把代码考回去看看。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP