#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. Я добавил некоторые детали к вопросу — проясняет ли это ситуацию?