Ibm midrange 如何在RPGLE程序中使用QDFRTVFD API获取显示文件中的标题

Ibm midrange 如何在RPGLE程序中使用QDFRTVFD API获取显示文件中的标题,ibm-midrange,rpgle,Ibm Midrange,Rpgle,如何在RPGLE程序中使用QDFRTVFD API获取显示文件中的标题。有没有人能给我提供一些RPGLE示例,它们使用这个API从显示文件中获取标题 可以找到此API的完整文档。不幸的是,它是一个非常复杂的API,要完全描述它甚至达到您所要求的级别都需要大量的代码,因此我将向您介绍如何使用API,并提供一些示例来检索基本信息,其余部分留给您作为练习。我将使用**自由格式,只给出不连贯的示例,因此这些都没有经过测试 首先要做的是定义所有需要的数据结构,作为描述数据的基础数据结构,以及保存数据的缓冲

如何在RPGLE程序中使用QDFRTVFD API获取显示文件中的标题。有没有人能给我提供一些RPGLE示例,它们使用这个API从显示文件中获取标题

可以找到此API的完整文档。不幸的是,它是一个非常复杂的API,要完全描述它甚至达到您所要求的级别都需要大量的代码,因此我将向您介绍如何使用API,并提供一些示例来检索基本信息,其余部分留给您作为练习。我将使用**自由格式,只给出不连贯的示例,因此这些都没有经过测试

首先要做的是定义所有需要的数据结构,作为描述数据的基础数据结构,以及保存数据的缓冲区。基于此的数据结构可以在缓冲区中移动,以将其覆盖在您想要处理的数据上

这是基本文件格式,它是返回数据缓冲区中的第一个信息块。QDFFBASE只使用一次,因此您可以想象它是一个常规数据结构,并将数据检索到其中,但出于示例目的,我定义它的方式与定义其他所有数据结构的方式相同。这样做的好处是,在变量中始终有一个指向结构的基指针

**free
...
// Buffer
dcl-s buf           Char(32760);

// Base File Section
dcl-ds QDFFBASE     Qualified Based(pQDFFBASE);
  WDFFRETN          Int(10);
  WDFFSIZE          Int(10);
  WDFFINOF          Int(5);
  WDFFRCS           Int(5);
  WDFFDPAT          Char(1);
  WDFFFSCR          Int(5);
  WDFFSRSQ          Int(5);
  WDFFACCSID        Uns(5);
end-ds;
dcl-s pQDFFBASE     Pointer;

// Screen Size Table
dcl-ds QDFFSCRA     Qualified Based(pQDFFSCRA);
  WDFFSCIA          Int(5);
  *n                Char(4);
end-ds;
dcl-s pQDFFSCRA     Pointer;

// Sort Sequence Table
dcl-ds QDFFSSEQ     Qualified Based(pQDFFSSEQ);
  WDFFSST           Char(256);
  WDFFSSC           Uns(5);
  WDFFSSN           Char(10);
  WDFFSSL           Char(10);
  WDFFSSFL          Char(2);
  *n                Char(26);
end-ds;
dcl-s pQDFFSSEQ     Pointer;
要设置pQDFFBASE,请使用以下代码段:

pQDFFBASE = %addr(buf);
可以选择使用buf地址初始化基本指针pQDFFBASE,但只能使用这一个指针。其余部分计算为此指针的偏移量和/或长度

要设置屏幕大小表的位置,请使用:

pQDFFSCRA = pQDFFBASE + %len(QDFFBASE);
pQDFFSSEQ = pQDFFBASE + qdffbase.wdffsrsq
这是基指针加上QDFFFBASE结构的长度,因为QDFFSRCA紧跟在该结构之后

要设置排序顺序表的位置,请使用:

pQDFFSCRA = pQDFFBASE + %len(QDFFBASE);
pQDFFSSEQ = pQDFFBASE + qdffbase.wdffsrsq
即基本指针加上排序序列表的偏移量

在你的头脑中计算这些长度和位移,并将它们硬编码到程序中,这可能很有诱惑力。不要那样做!如果IBM改变了结构,您的程序可能会突然停止正常工作。这有几种形式:首先,它可能会崩溃,现在您必须确定为什么在一个工作正常的程序中突然出现数据不兼容错误或指针错误。其次,更隐晦的是,它可能会继续工作,因为API更改没有在您使用的字段中导致任何数据不兼容错误,但它不是做了错误的事情,就是提供了错误的输出

始终使用返回数据中提供的长度和偏移量以及指针来查找缓冲区中的数据。请参阅QDFBASE中文件头的偏移量部分?用那个

要使用缓冲区中的数据,只需在为结构设置基础指针后使用qdfbase.wdffsize即可。一旦设置了基准指针,结构的所有元素都可用。在设置指针之前,任何使用该结构的尝试都将导致指针错误

有些结构(如屏幕大小表)在缓冲区中有多个条目。要在它们之间循环,可以使用如下的for循环:

pQDFFSCRA = pQDFFBASE + %len(qdffbase);
for ix = 1 to qdffbase.wdffscr;
  // Do something with qdffscra.wdffscia
  pQDFFSCRA += %len(qdffscra);
endfor;
请注意,我使用的结构长度在这里不是最优的,但是IBM没有在数据中提供此结构的长度值。如果他们有,我会用这个。它仍然比使用硬编码常量要好,因为您只需更新数据结构即可利用IBM所做的更改

要调用该程序,您只需要一个原型:

dcl-pr QDFRTVFD  ExtPgm('QDFRTVFD');
  buffer         Char(327600) options(*varsize);
  bufferlen      Int(10) const;
  format         Char(8) const;
  qualname       Char(20) const;
  ec             Like(ec_t) options(*varsize);
这是通过使用以下命令调用的:

QDFRTVFD(buf: %len(buf): 'DSPF0100': file: ec);
这足够长了。我将留给您决定如何定义限定文件名和错误代码参数


您还必须努力定义将要使用的结构,并设计循环以获得它们。

感谢您的详细解释。