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

问题描述 投票:2回答:1

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

ibm-midrange rpgle
1个回答
3
投票

此API的完整文档可在here中找到。不幸的是,它是一个非常复杂的API,要完全描述它甚至达到您要求的水平,都会花费大量的代码,因此,我将为您提供有关如何使用API​​的描述,并提供一些示例以供检索。基本信息,其余的作为练习。我将使用**free格式,并且仅给出不连贯的示例,因此没有一个经过测试。

要做的第一件事是将您需要的所有数据结构定义为用于描述数据的基础数据结构和用于保存数据的缓冲区。可以在缓冲区中四处移动此基于数据的结构,以将其覆盖在要使用的数据上。

这是基本文件格式,它是返回数据缓冲区中的第一信息块。 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);

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

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

pQDFFSSEQ = pQDFFBASE + qdffbase.wdffsrsq

这是基本指针加上排序序列表的偏移量(位移)。

仅计算这些长度和位移在您的头上并将它们硬编码到程序中可能会很诱人。不要那样做!如果IBM更改结构,您的程序可能突然停止正常运行。这有几种形式:首先它可能会崩溃,现在您必须确定为什么突然在正常运行的程序中出现数据不兼容错误或指针错误。其次,更阴险的是,由于API的更改并未在您使用的字段中引起任何数据不兼容错误,因此它可能一直起作用,而是执行错误的操作或提供了错误的输出。

总是将返回数据中提供的长度和偏移量与指针一起使用,以在缓冲区中查找数据。请参阅QDFFBASE中文件头的偏移量部分?使用它。

要使用缓冲区中的数据,例如,在为结构设置基础指针之后,只需使用qdffbase.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);

这已经足够长了。我将由您决定如何定义合格的文件名和错误代码参数。

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

© www.soinside.com 2019 - 2024. All rights reserved.