【问题标题】:Are dynamic variables possible in SQR (not dynamic SQL)SQR 中是否可以使用动态变量(不是动态 SQL)
【发布时间】:2016-10-10 14:15:27
【问题描述】:

我正在编写一个 SQR 程序来向供应商发送一个包含员工信息的文件。该文件包含许多我已为其分配变量的字段 $代码_1 $代码_2 $代码_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

这不起作用,但我想知道是否有类似(或更好)的方法来完成此操作。我想我可以对计数器进行评估:when #i = 1, $Code_1 = ... when #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 等等...

【问题讨论】:

  • 代码的位置有什么意义吗?例如,如果 EMPLID 0001 没有 DEF 的 JOBCODE,那么该文件是否仍应保留该空间,还是仅使用 GHI 填充它?根据您的回答,我认为您可以通过以下两种方式之一使用 SQL 来做到这一点。

标签: peoplesoft sqr


【解决方案1】:

您可以在 SQR 中使用数组。

设置数组:

Create-Array Name=WorkArray Size = 100
Field=Code
Field=Rate

Let #NumCodesForEmp = 0

在您的选择块中添加数据 - 在程序之前和之后也使用 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

编写之前的过程进行初始化:

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

但是,我认为您可以在没有数组的情况下完成所有操作 - 像这样使用 before 和 after 过程:

Begin-Procedure Init-Emp
   Let $OutputLine = &EC.Emplid
End-Procedure

Begin-Procedure Process-Emp
   Write #10 from $OutputLine
End-Procedure

然后选择块将如下所示:

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 排序。如果您只是需要从表中的数据写入文件,这会简单得多。

【讨论】:

  • 谢谢 - 我开始研究数组的路径,但我想知道如何将每个元素放入各自的变量中 - $Code_1、$Code_2 等...
  • @chip 这有帮助吗?或者您还有其他问题吗?
  • 好吧,目前还不清楚如何将数组中的值放入每个变量中。您的示例循环遍历整个数组,每次将值加载到同一个变量中 - 我需要填充 10 个变量 - 是否可以更改每次通过循环时更新哪个变量?
  • @chip 抱歉,不确定您的问题是什么。你能展示一些你需要什么过程的伪代码吗?我无法从你的例子中得到它。
  • 我在问题中添加了一些细节 - 这是否说明问题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-18
  • 1970-01-01
  • 2010-11-14
  • 2019-07-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多