2016-10-10 6 views
1

Я пишу программу SQR, чтобы отправить поставщику файл, содержащий информацию о сотруднике. Файл содержит ряд полей, для которых я присвоенных переменные $ Code_1 $ Code_2 $ Code_3 ....Возможны динамические переменные в SQR (не динамический SQL)

Каждый код имеет связанный с ним скорость, и я присвоенные аналогичные переменные ($ 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 

Это не работает, но я интересно, если есть такой же (или лучше) способ достижения этой цели. Я полагаю, что мог бы выполнить оценку счетчика: когда #i = 1, $ Code_1 = ... когда # i = 2, $ Code_2 = ... Но я надеюсь, что есть лучший способ.

Благодаря

Edit - Просто для дополнительного разъяснения для каждого сотрудника, одна строка будет записана в файл с полями для каждого из этих значений (заполняется или нет) - поэтому линия будет иметь: $ 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 

Когда я поп ull переменные, перейдя через таблицу, я бы хотел, чтобы $ Code_1 = 'ABC', $ Rate_1 = 10.50, $ Code_2 = 'DEF', Rate_2 = 9.75 и т. д.

+0

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

ответ

1

Вы можете использовать массивы в SQR.

Чтобы настроить массив:

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

Let #NumCodesForEmp = 0 

Для добавления данных в Select Block - также использовать на разрыв до и после процедуры:

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 

Однако, я думаю, что вы могли бы сделать все без массива - прежде чем использовать и после процедур, как так:

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

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

Затем Select Block будет выглядеть следующим образом:

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. Это намного проще, если вам нужно просто написать файл из данных из таблицы.

+0

Спасибо - я начал спускаться по пути массивов, но мне интересно, как получить каждый элемент в свои соответствующие переменные - $ Code_1, $ Code_2 и т. Д. – Chip

+0

@chip Помогла ли эта помощь? Или у вас есть другие вопросы? – cardmagik

+0

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