SQR 中是否可以使用动态变量(不是动态的 SQL)
Are dynamic variables possible in SQR (not dynamic SQL)
我正在编写一个 SQR 程序来向供应商发送包含员工信息的文件。该文件包含许多字段,我已为其分配了变量
$Code_1
$Code_2
$Code_3
....
每个代码都有一个相关联的比率,我分配了类似的变量($Rate_1、$Rate_2,等等...)
我有一个查找 table,其中包含列 EMPLID、JOBCODE、HOURLY_RT。我需要遍历每个员工以获取所有 codes/rates。有些员工可能比其他员工拥有 more/fewer。是否可以有 "dynamic" 变量,就像我们对动态 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
为了进一步说明,查找 table 将针对每个员工有多行,因此 table 可能如下所示:
EMPLID JOBCODE HOURLY_RT
0001 ABC 10.50
0001 DEF 9.75
0001 GHI 9.50
当我填充变量时,循环遍历 table,我希望 $Code_1 = 'ABC'、$Rate_1 = 10.50、$Code_2 = 'DEF', Rate_2 = 9.75 等...
您可以在 SQR 中使用数组。
设置数组:
Create-Array Name=WorkArray Size = 100
Field=Code
Field=Rate
Let #NumCodesForEmp = 0
要在您的 Select 块中添加数据 - 在过程之前和之后也使用中断:
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
编写初始化前程序:
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 块将如下所示:
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 排序。如果您的需要只是从 table.
中的数据写入文件,这就简单多了
我正在编写一个 SQR 程序来向供应商发送包含员工信息的文件。该文件包含许多字段,我已为其分配了变量 $Code_1 $Code_2 $Code_3 ....
每个代码都有一个相关联的比率,我分配了类似的变量($Rate_1、$Rate_2,等等...)
我有一个查找 table,其中包含列 EMPLID、JOBCODE、HOURLY_RT。我需要遍历每个员工以获取所有 codes/rates。有些员工可能比其他员工拥有 more/fewer。是否可以有 "dynamic" 变量,就像我们对动态 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
为了进一步说明,查找 table 将针对每个员工有多行,因此 table 可能如下所示:
EMPLID JOBCODE HOURLY_RT
0001 ABC 10.50
0001 DEF 9.75
0001 GHI 9.50
当我填充变量时,循环遍历 table,我希望 $Code_1 = 'ABC'、$Rate_1 = 10.50、$Code_2 = 'DEF', Rate_2 = 9.75 等...
您可以在 SQR 中使用数组。
设置数组:
Create-Array Name=WorkArray Size = 100
Field=Code
Field=Rate
Let #NumCodesForEmp = 0
要在您的 Select 块中添加数据 - 在过程之前和之后也使用中断:
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
编写初始化前程序:
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 块将如下所示:
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 排序。如果您的需要只是从 table.
中的数据写入文件,这就简单多了