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

How to use QDFRTVFD API in RPGLE program to fetch heading in a display file

如何在 RPGLE 程序中使用 QDFRTVFD API 来获取显示文件中的标题。有人可以向我提供使用此 API 从显示文件中获取标题的 RPGLE 示例吗?

可在 here 中找到此 API 的完整文档。不幸的是,它是一个非常复杂的 API,要完全描述它甚至达到您所要求的水平将需要大量代码,因此我将向您介绍如何使用 API,用一些例子来检索基本信息,剩下的留给你作为练习。我将使用 **free 格式,并且只给出不连贯的示例,因此 none 已经过测试。

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

这是基本文件格式,它是 returned 数据缓冲区中的第一个信息块。 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,但您只能用这一个指针来做到这一点。其余部分计算为距此指针的偏移 and/or 长度。

要设置屏幕尺寸的位置 Table 使用:

pQDFFSCRA = pQDFFBASE + %len(QDFFBASE);

这是基指针加上 QDFFBASE 结构的长度,因为 QDFFSRCA 紧跟在该结构之后。

要设置排序顺序的位置 Table 使用:

pQDFFSSEQ = pQDFFBASE + qdffbase.wdffsrsq

也就是基指针加上排序序列的偏移量(位移)table。

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

始终使用 return 数据中提供的长度和偏移量以及指针来查找缓冲区中的数据。看到 QDFFBASE 中文件头部分的偏移量了吗?用那个。

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

某些结构(例如屏幕尺寸 table)在缓冲区中有多个条目。要循环遍历它们,您可以使用这样的 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);

这已经够长了。我将留给您来决定如何定义限定文件名和错误代码参数。

您还必须付出一些努力来定义您将使用的结构,并设计循环以获取它们。