问题之前的一些背景。
想象一下文件FileA有大约50个不同类型的字段。我尝试使用服务程序,而不是使用该文件的所有程序,因此该文件只能由该服务程序访问。然后,调用该服务的程序将基于文件结构接收DataStructure,作为ExtName。我使用SQL来恢复信息,所以,基本上,程序将是这样的:
服务程序共享的数据结构:
D FileADS E DS ExtName(FileA) Qualified
程序调用的程序:
P getFileADS B Export
D PI N
D PI_IDKey 9B 0 Const
D PO_DS LikeDS(FileADS)
D LocalDS E DS ExtName(FileA) Qualified
D NullInd S 5i 0 Array(50) <-- Since 50 fields in fileA
//Code
Clear LocalDS;
Clear PO_DS;
exec sql
SELECT *
INTO :LocalDS :nullind
FROM FileA
WHERE FileA.ID = :PI_IDKey;
If SqlCod <> 0;
Return *Off;
EndIf;
PO_DS = LocalDS;
Return *On;
P getFileADS E
因此,如果找到它,该过程将返回一个填充了FileA记录的数据结构。
现在我的问题:有没有办法在不指定文件的每个50个字段的情况下分配%nullind(field)= * On?
像循环
i = 1;
DoW (i <= 50);
if nullind(i) = -1;
%nullind(datastructure.field) = *On;
endif;
i++;
EndDo;
因为让我们面对它,每次查看每个文件的每个字段都会很痛苦。
我知道一个简单的链(n)可以做到这一点
chain(n) PI_IDKey FileA FileADS;
但我真的希望用SQL来做。
感谢您的建议!
操作系统版本:7.1
答案 0 :(得分:0)
首先,通过消除SELECT *
并提供50个字段名称的SELECT列表,从长远来看,你会更好。
接下来,请考虑这两个网页 - Meaningful Names for Null Indicators和Embedded SQL and null indicators。第一个显示了为每个空指示符分配名称以匹配关联字段名称的示例。根据空指标数组的地址,只需基于名称声明基于DS的DS即可。第二个指出了空指标数组如何大于所需数量,因此未来的数据库更改不会影响结果。 (请记住,页面显示的是1000个元素的空数组,即使在那个大小的情况下,内存实际上也相对较小。如果您认为由于某种原因它是必要的,您可以声明它更小。)
您正在创建一个只会写一次的过程。不值得保存列出50个字段的努力。也许如果你有很多使用这个程序的程序,你每次使用SELECT *
时都需要创建一个列表,但即使这样,它也不是一个好主意。
可以在将保存proc原型的/ COPY成员中定义50个数据字段的匹配模板DS。模板DS将在任何带有proc原型的程序中可用。任何需要调用proc的程序都可以简单地指定LIKEDS引用模板以在内存中定义其版本。模板DS应该包含QUALIFIED关键字,然后程序将使用自己的DS名称作为限定前缀。可以类似地处理空指示符数组。
但是,您的实际问题并不完全清楚。你展示了一个示例循环并询问它是否有效,但你不会说你是否有问题。它是一个数组,所以循环可以像你展示的那样使用。但这取决于你用它实际上想要实现的目标。
答案 1 :(得分:0)
只是在用select语句填充的数据结构中包含空值。
select col1, ifnull(col1), col2, ifnull(col2), etc. into :dsfilewithnull where f.id = :id;
对于无法处理空值的旧学校RPG,请使用select语句删除它们。
select coalesce(col1,0), coalesce(col2,' '), coalesce(col3, :lowdate) into :dsfile where f.id = :id;
第二种方法在传统环境中更容易使用。
将值按值传递给过程,以便像内置函数一样使用它。
答案 2 :(得分:0)
您的问题的一个答案是将数组作为数据结构的一部分,并指定* all&#39; 0&#39;到数据结构。
dcl-ds nullIndDs;
nullInd Ind Dim(50);
end-ds;
nullIndDs = *all'0';
答案 3 :(得分:0)
jmarkmurphy的答案是将所有零分配给指标数组的示例。对于您在问题中显示的示例,您可以这样做:
D NullInd S 5i 0 dim(50)
/free
NullInd(*) = 1 ;
Nullind(*) = 0 ;
*inlr = *on ;
return ;
/end-free
这是一个可以编译和测试的完整程序。在调试中运行它并在第一个语句处停止。显示NullInd以查看其元素的初始值。逐步执行第一个语句并再次显示它以查看元素的更改方式。逐步完成下一个语句,看看情况如何再次发生变化。
对于“如何在SQL中执行”,该部分没有意义。当你FETCH一行时,SQL会自动设置值 。除此之外,主机语言(在本例中为RPG)使用该数组将值传递回SQL。当SQL语句运行时,它再次自动使用所设置的任何值。因此,它可以由SQL自动用于输入或输出,也可以由宿主语言语句设置。您可以使用该数组“在SQL中”执行任何有用的操作。