2

我试图更多地了解在调用和执行过程时如何使用参数/参数。我知道包含带有前导冒号 (:) 的参数的过程将值传回给调用DO命令,但是我认为有点令人困惑的是,变量名称似乎来自调用DO命令发出的内容,以及过程(由 ) 返回的调用DO不一定必须是相同的名称。如果有人可以帮助阐明以下示例并解释正在传递给/从哪些值或它们如何被发出DO命令引用,这将是有帮助的。

看起来运行Get-Recursive-Reports-To(的调用do Get-Recursive-Reports-To($Recursive_Line, $_POSITION_NBR, #_Global_Counter)正在将这 3 个变量作为参数发出给过程Get-Recursive-Reports-To,但是当我查看Get-Recursive-Reports-To过程时,我没有看到$Recursive_Line该过程中对变量的任何引用,所以过程实际使用它还是什么包含它的目的是什么?与 类似的问题$_val_Position_NBR,这个变量从哪里得到它的赋值?

然后在Get-Recursive-Reports-To过程中我看到一个参数 -:$var_Next_EMPLID我相信它在 Run-Recursion 过程中被传回调用 DO,但我无法弄清楚它如何/在哪里使用传回给它的值......

begin-procedure Run-Recursion

let #_Global_Counter = 0

let $Recursive_Line = ''

let $Data_Line_EMPL = ''

let $Data_Line_EMPL = $_BUSINESS_UNIT || '|' || $_BUSINESS_UNIT_DESCR || '|' || '2019' || '|' || 

$_EMPLID || '|' || $_NAME || '|' || $_DEPTID || '|' || $_DEPT_DECSR || '|' || $_JOBCODE || '|'

do Get-Recursive-Reports-To($Recursive_Line, $_POSITION_NBR, #_Global_Counter)

let $Data_Line_EMPL = $Data_Line_EMPL || $Recursive_Line

do Write-Data-Line($Data_Line_EMPL)

end-procedure

begin-procedure Get-Recursive-Reports-To(:$val_Data_Line, $val_Current_Position_Nbr, #Recursion_Counter)

let #Recursion_Counter = #Recursion_Counter + 1

do Get-the-ReportsTo-for-the-Current-Position($val_Current_Position_Nbr, $Next_Position_Nbr, $Next_EMPLID)

do Check-For-Stop($Stop_Recursion, $val_Current_Position_Nbr, $Next_Position_Nbr, #Recursion_Counter)

if $Stop_Recursion = 'N'

let $val_Data_Line = $val_Data_Line || $Next_EMPLID || '|'

do Get-Recursive-Reports-To($val_Data_Line, $Next_Position_Nbr, #Recursion_Counter)
end-if
end-procedure

begin-procedure Get-the-ReportsTo-for-the-Current-Position($_val_Position_NBR, :$var_ReportsTo, :$var_Next_EMPLID)
  let #local_counter = 0

begin-select
G.REPORTS_TO &G.Reports_to
 let $var_ReportsTo= &G.Reports_To

from PS_POSITION_DATA G
WHERE G.POSITION_NBR = $_val_Position_NBR
and G.EFF_STATUS = 'A'
AND (G.EFFDT = 
(SELECT MAX(G_ED.EFFDT) FROM PS_POSITION_DATA G_ED 
WHERE G.POSITION_NBR = G_ED.POSITION_NBR 
AND G_ED.EFFDT <= $_As_OF_Date))
end-select

begin-select
H.EMPLID &H.EMPLID
Z.NAME         &Z.NAME
 let $var_Next_EMPLID= &H.EMPLID
 let #local_counter = #local_counter + 1
from PS_JOB H !, PS_EMPLOYEES Z
WHERE H.POSITION_NBR = $var_ReportsTo
and H.EMPL_STATUS not in ('D', 'R', 'T')
and (H.EFFDT = 
        (SELECT MAX(H_ED.EFFDT) FROM PS_JOB H_ED 
          WHERE H.EMPLID = H_ED.EMPLID 
          AND H.EMPL_RCD = H_ED.EMPL_RCD 
          AND H_ED.EFFDT <= $_As_Of_Date))

end-select
  if #local_counter > 1
  let $var_Next_EMPLID = $local_counter  || ' ' || 'Employees in this Position'
  end-if

  if #local_counter = 0
  let $var_Next_EMPLID = 'Position Vacant'
  end-if

end-procedure
4

1 回答 1

2

从主过程对 Get-Recursive-Reports-To 的第一次调用使用 $Recursive_Line 变量。它不必再次被引用,因为它在过程的内部。

一旦 IN 过程 Get-Recursive-Reports-To,此变量的名称变为 $val_Data_Line 并用于回调相同的过程 Get-Recursive-Reports-To 可以更改它。我猜这个名字,Get-Recursive-Reports-To。

递归是一件令人头疼的事情,但看起来它被用来沿着组织链向上走,找到员工 id 的报告,然后得到那个人的名字。

变量 $var_Next_EMPLID 作为变量 $Next_Emplid 从 Get-the-ReportsTo-for-the-Current-Position 传递回调用者,然后再次使用该变量调用 Get-Recursive-Reports-To。

由于您没有包含“Check-For-Stop”过程,我无法判断递归何时停止或为何停止。看起来有一些检查 - 也许 $Val_Current_Position_Nbr 或 $Next_Position_Nbr 是空白或相等或什么的。

于 2019-04-04T15:42:07.877 回答