Параметры / аргументы процедуры SQR - PullRequest
2 голосов
/ 04 апреля 2019

Я пытаюсь понять, как аргументы / параметры используются при вызове и выполнении процедур. Я понимаю, что процедуры, которые содержат параметр с начальным двоеточием (:), возвращают значения вызывающей команде 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, который, как мне кажется, передается обратно вызывающему DO в процедуре Run-Recursion, но я не могу понять, как / где он использует значение вернулся к этому ...

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

1 Ответ

2 голосов
/ 04 апреля 2019

ПЕРВЫЙ вызов Get-Recursive-Reports-To из основной процедуры использует переменную $ Recursive_Line. На него не нужно ссылаться снова, потому что это внутренняя часть процедуры.

После процедуры IN Get-Recursive-Reports-To имя этой переменной становится $ val_Data_Line и используется для обратного вызова к той же процедуре Get-Recursive-Reports-To, которая может ее изменить. Полагаю, поэтому его имя Get-Recursive-Reports-To.

Рекурсия - это боль в шее, но похоже, что она используется для организации организационной цепочки, поиска отчетов по идентификатору сотрудника, а затем получения имени этого человека.

Переменная $ var_Next_EMPLID передается из Get-the-ReportsTo-for-the-Current-Position обратно вызывающей стороне как переменная $ Next_Emplid, которая затем снова используется для вызова Get-Recursive-Reports-To.

Я не могу сказать, когда или почему Рекурсия останавливается, поскольку вы не включили процедуру «Check-For-Stop». Похоже, что есть некоторая проверка - возможно, если $ Val_Current_Position_Nbr или $ Next_Position_Nbr пуст или равен или что-то еще.

...