Chinaunix首页 | 论坛 | 博客
  • 博客访问: 94421
  • 博文数量: 24
  • 博客积分: 1410
  • 博客等级: 上尉
  • 技术积分: 460
  • 用 户 组: 普通用户
  • 注册时间: 2005-10-20 16:32
文章分类

全部博文(24)

文章存档

2018年(1)

2006年(19)

2005年(4)

我的朋友

分类:

2006-03-27 13:16:01

胖有型前辈400 精华贴,..... 看了之后发现自己要去从新学C 很有基础,
在想跨平台的编程问题..
--------------------------
适用范围:写RPG时,WRITE一个有很多字段的PF。

使用方法:编译CLP、C、RPGLE,然后CALL 那个CLP,带一个参数,参数就是PF名。

生成结果:YOURLIB/YOURFILE里面,按F5会出来一个YOURPGTXT的MEMBER,请自行在TYPE栏上敲入“RPGLE”(因为我不会)

目的说明:程序使用DSPFFD命令取出PF的所有字段名,然后生成如下面格式的一组代码。
C*字段说明
C           MOVEL     *BLANKS       字段名

================================================================
注:下面程序代码中,YOURLIB,是指你自己的库,当然,如果愿意的话,建一个YOURLIB也可以;同理,YOURFILE,就是指你自己库里面的SRCFILE,如果高兴的话,也可以在YOURLIB里面建一个YOURFILE
================================================================
1、CLP程序    WRITERPGCL

       /* 自动赋值程序,输入文件名,自动生成赋值语句(空) */
           /* 生成结果为YOURLIB/YOURFILE.YOURPGTXT */
             PGM        PARM(&FILENAME)
             DCL        VAR(&FILENAME) TYPE(*CHAR) LEN(10)
             DLTF       FILE(YOURLIB/FILEFLD)
             MONMSG     MSGID(CPF2105)
             RMVM       FILE(YOURLIB/YOURFILE) MBR(WRTRPGTXT)
             MONMSG     MSGID(CPF2105 CPF7310)
             DSPFFD     FILE(&FILENAME) OUTPUT(*OUTFILE) +
                          OUTFILE(YOURLIB/FILEFLD)
             ADDLIBLE   LIB(YOURLIB)
             MONMSG     MSGID(CPF2103)
             CALL       PGM(WRITERPGLE)
             DLTF       FILE(YOURLIB/FILEFLD)
             ENDPGM


2、RPGLE程序   WRITERPGLE
     FFILEFLD   IF   E             DISK
     D DIMCHAR1        S              1    DIM(20)
     D DIMCHAR2        S              1    DIM(20)
     C
     C                   MOVEL     'YOURPGTXT'   PGMNAME           9
     C                   MOVEL     *BLANKS       FLDNAME          10
     C                   MOVEL     *BLANKS       FLDTYPE           1
     C                   MOVEL     *BLANKS       FLDTEXT          20
     C*
     C                   DOW       1 = 1
     C                   READ      QWHDRFFD                               54
     C                   IF        *IN54='1'
     C                   LEAVE
     C                   ENDIF
     C                   MOVEL     WHFLDE        FLDNAME
     C                   MOVEL     WHFLDT        FLDTYPE
     C*
     C                   Z-ADD     1             K                 2 0
     C                   Z-ADD     1             N                 2 0
     C                   MOVEA     WHCHD1        DIMCHAR1
     C                   MOVEA     WHCHD2        DIMCHAR2
     C                   EVAL      K = 1
     C     X'0F'         LOOKUP    DIMCHAR1(K)                            18
     C     X'0E'         LOOKUP    DIMCHAR2(N)                            19
     C                   IF        *IN18='1' AND *IN19='1'
     C                   EVAL      FLDTEXT=%SUBST(WHCHD1:1:(K-1))+
     C                                     %SUBST(WHCHD2:(N+1):(20-N))
     C                   ELSE
     C                   EVAL      FLDTEXT=%TRIM(WHCHD1)+%TRIM(WHCHD2)
     C                   ENDIF
     C*
     C                   CALL      'WRITERPGC'
     C                   PARM                    PGMNAME
     C                   PARM                    FLDNAME
     C                   PARM                    FLDTYPE
     C                   PARM                    FLDTEXT
     C                   ENDDO
     C                   EVAL      *INLR='1'
     C                   RETURN

3、C程序   WRITERPGC
/*输入参数:
  1、生成的程序名   pgmname  实际长度为9位;
  2、物理文件中的字段名 fldname  实际长度为10位;
  3、字段类型 fldtype  实际长度为1位;
  4、字段的中文注释 fldtext  实际长度为20位;  */
#include 
#include 
#include 

main(int argc,char **argv)
{
  char fname??(255??);
  char pgmname??(10??);
  char fldname??(11??);
  char fldtype??(1??);
  char fldtext??(20??);

  FILE *fp;

  memset(pgmname,0,sizeof(pgmname));
  strncpy(pgmname,argv??(1??),9);
  memset(fldname,0,sizeof(fldname));
  strncpy(fldname,argv??(2??),10);
  memset(fldtype,0,sizeof(fldtype));
  strncpy(fldtype,argv??(3??),1);
  memset(fldtext,0,sizeof(fldtext));
  strncpy(fldtext,argv??(4??),20);

  /*字符串赋值*/
  memset(fname,0,sizeof(fname));
  sprintf(fname,"YOURLIB/YOURFILE(%s)",pgmname);

  if ( ( fp=fopen(fname,"a") ) == NULL )  {
       printf("could not create rpgle ");
       exit(127);
       }

  fprintf(fp,"     C*%s ??/n",fldtext);
  fprintf(fp,"     C             ");
  if (fldtype??(0??)=='P')
    {fprintf(fp,"      Z-ADD     *ZERO         %s  ??/n",fldname);}
  else
    {fprintf(fp,"      MOVEL     *BLANKS       %s  ??/n",fldname);}
  fclose(fp);

  }



  回复于:2006-01-21 08:57:43

楼主很强哦,还会C语言,向您学习


  回复于:2006-01-21 10:45:39

好东西,有空试试。。


  回复于:2006-01-21 17:58:03

是好东西,可俺还不知道怎么用呢


  回复于:2006-01-21 18:25:58

喔?
这里贴出来的是三个程序的源代码,把它们敲到机器上,再编译,然后CALL 那个CLP就可以了。
请问楼上的有什么问题?


  回复于:2006-01-22 11:30:59

是个好东西。不过我经常COPY的功能。且如果是有规律的字段,可以在字段的前面加一个字符变成另外一个变量当作是一个中间变量这样多名称可以很直接地看出是相同属性的变量。
阅读(1942) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~