我正在编写一个SQR程序,向供应商发送包含员工信息的文件。该文件包含许多我已为其分配变量的字段 $ Code_1 $ CODE_2 $ CODE_3 ....
每个代码都有相关的费率,我已经分配了类似的变量($ Rate_1,$ Rate_2等等)
我有一个包含EMPLID,JOBCODE,HOURLY_RT列的查找表。我需要为每个员工循环以获得所有代码/费率。有些员工可能比其他员工更多/更少。是否有可能拥有“动态”变量,就像我们为动态sql所做的那样?例如,像$ Code _ [$ i]?我的想法是做这样的事情:
let #i = 1
begin-select
EC.JOBCODE
EC.HOURLY_RT
let $Code_[$i] = &EC.JOBCODE
let $Rate_[$i] = &EC.HOURLY_RT
let #i = #i + 1
FROM PS_ACME_LOOKUP EC
WHERE EC.EMPLID = &J.EMPLID
end-select
这不起作用,但我想知道是否有类似(或更好)的方法来实现这一目标。我想我可以对计数器进行评估:当#i = 1时,$ Code_1 = ...当#i = 2时,$ Code_2 = ...但我希望有更好的方法。
由于
编辑 - 只是为了补充说明,对于每个员工,一行将被写入文件,其中包含每个值的字段(已填充或未填充) - 因此该行将具有: $ EMPLID $ Code_1 $ Code_2 $ Code_3 ..... $ Rate_1 $ Rate_2 $ Rate_3
为了进一步说明,查找表将为每个员工分配多行,因此表格可能如下所示:
EMPLID JOBCODE HOURLY_RT
0001 ABC 10.50
0001 DEF 9.75
0001 GHI 9.50
当我填充变量时,循环遍历表格,我想要$ Code_1 ='ABC',$ Rate_1 = 10.50,$ Code_2 ='DEF',Rate_2 = 9.75等......
答案 0 :(得分:1)
您可以在SQR中使用数组。
设置数组:
Create-Array Name=WorkArray Size = 100
Field=Code
Field=Rate
Let #NumCodesForEmp = 0
要在Select Block中添加数据 - 也请在程序之前和之后使用on-break:
Begin-Select
EC.Emplid () on-break print=never before=Init-Emp After=Process-Emp
Let $Emplid = &EC.Emplid
add 1 to #NumCodesForEmp
Put &EC.JobCode &EC.Rate into WorkArray(#NumCodesForEmp) Code Rate
编写before procedure以初始化:
Begin-Procedure Init-Emp
Let #NumCodesForEmp = 0
End-Procedure
与员工一起完成时:
Begin-Procedure Process-Emp
Let #I = 1
Let $OutputLine = $Emplid
While #I <= #NumCodesForEmp
Get $Code $Rate From WorkArray(#I) Code Rate
Let $OutputLine = $Outputline || ',' || $Code || ',' || $Rate
add 1 to #I
End-While
! This assumes that file number 10 is open
Write #10 from $OutputLine
End-Procedure
但是,我认为你可以在没有数组的情况下做任何事情 - 使用之前和之后的程序:
Begin-Procedure Init-Emp
Let $OutputLine = &EC.Emplid
End-Procedure
Begin-Procedure Process-Emp
Write #10 from $OutputLine
End-Procedure
然后Select Block看起来像这样:
Begin-Select
EC.Emplid () on-break print=never before=Init-Emp After=Process-Emp
EC.JobCode
EC.Rate
Let $OutputLine = $OutputLine || ',' || &EC.Jobcode || ',' || &EC.Rate
使用on-break时,请确保按emplid排序。如果您只需要从表中的数据中写入文件,这就简单得多了。