Возможны ли динамические переменные в SQR (не динамический SQL)

#peoplesoft #sqr

#peoplesoft #sqr

Вопрос:

Я пишу программу 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] = amp;EC.JOBCODE
   let $Rate_[$i] = amp;EC.HOURLY_RT

   let #i = #i   1
FROM PS_ACME_LOOKUP EC
WHERE EC.EMPLID = amp;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 и т.д…

Комментарии:

1. Означают ли позиции кодов что-нибудь? Например, если в EMPLID 0001 нет КОДА задания DEF, должен ли файл по-прежнему резервировать это пространство или вы просто заполните его GHI? В зависимости от вашего ответа, я думаю, вы можете сделать это с помощью SQL одним из двух способов.

Ответ №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 = amp;EC.Emplid
       add 1 to #NumCodesForEmp
       Put amp;EC.JobCode amp;EC.Rate into WorkArray(#NumCodesForEmp) Code Rate
  

Напишите процедуру before для инициализации:

 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 = amp;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 || ',' || amp;EC.Jobcode || ',' || amp;EC.Rate
  

При использовании on-break убедитесь, что вы сортируете по emplid. Это намного проще, если вам нужно просто записать файл из данных из таблицы.

Комментарии:

1. Спасибо — я начал продвигаться по пути массивов, но мне интересно, как поместить каждый элемент в соответствующие переменные — $ Code_1, $ Code_2 и т.д…

2. @chip Помогло ли это тогда? Или у вас есть какие-либо другие вопросы?

3. ну, до сих пор неясно, как получить значения из массива в каждую из переменных. Ваш пример перебирает весь массив, каждый раз загружая значения в одну и ту же переменную — у меня есть 10 переменных, которые мне нужно заполнить — можно ли изменить, какая переменная обновляется при каждом проходе через цикл?

4. @chip Извините, не уверен, в чем ваш вопрос. Можете ли вы показать какой-нибудь псевдокод того, какой процесс вам нужен? Я не могу понять это из вашего примера.

5. Я добавил некоторые детали к вопросу — проясняет ли это ситуацию?