2017-01-11 2 views
0

(Позвольте мне предисловие к этому, сказав, что я чрезвычайно новичок в программировании AS400 и RPGLE и CL. Я знаю SQL довольно хорошо, но не когда используется с AS400)Как запустить SQL в программе CL (AS400)

Это похоже на то, что это должно быть очень просто.

В конце года мы должны обновить нашу таблицу склада до нового текущего года. Это был ручной процесс, чтобы перейти к STRSQL и запустить

update rco set ccfscy = '2017' where crsts = 'A' 

Это было сделано одним и тем же лицом в течение последних 40 лет, и теперь они на пенсию в этом году. Мой босс хочет, чтобы это стало программой CL, где все это делается без того, чтобы кто-то вручную выполнял команду STRSQL и мог быть интегрирован в процесс окончания года.

Все, что нужно сделать программе CL, - это указать, в каком году вы хотите также изменить файлы хранилища и после ввода даты на экран будет запускать программу SQL и обновлять записи в соответствии с командой SQL.

Может кто-нибудь указать мне направление, в котором я мог бы узнать больше об использовании программы CL для выполнения этого процесса?

спасибо.

Thomas J Cusick, системный программист

+0

Вопрос QM, скорее всего, ваш лучший выбор. RUNSQL также является хорошим выбором для такой простой задачи, но QM-запросы (и формы и procs) выходят далеко за рамки того, что может сделать RUNSQL. Знакомство с QM может окупиться. – user2338816

ответ

5

Предполагая, что вы находитесь на данный момент поддерживается версией IBM я ..

IBM добавили RUNSQL CL команду несколько версий назад ...

полная программа CL, таким образом выглядеть так:

pgm 
    runsql sql('update rco set ccfscy = ''2017'' where crsts = ''A''') 
endpgm 

Но было бы лучше, если бы вы прошли в этом году в качестве параметра ...

pgm parm(&year) 
    dcl &year *char 4 
    dcl &stmt *char 50 
    /* using &quote makes life easier than doubling quote literals */ 
    dcl &quote *char 1 value('''') 

    chgvar &stmt value('update rco set ccfscy =' *cat &quote *cat &year *cat + 
    &quote *cat 'where crsts = ' *cat &quote *cat 'A' *cat &quote) 

    runsql sql(&stmt) 

endpgm 
+0

Я попытался реализовать это, но я получаю сообщение об ошибке в строке «CHGVAR & STMT ...» ... Символ '' 'недействителен после строки' & QUOTE '. – TomCusick

+0

@TomCusick, у меня была пара опечаток, извините. пример был скорректирован. – Charles

0

Благодаря Чарльз, это помогло ... В среднем в то время как мой босс пришел ко мне с примером того, что он на самом деле искал и следующее, что я в конечном итоге делает.

Сначала я создал CLD File @ 91Q1 типа * QMQRY, этот файл хранится фактический SQL заявление ...

UPDATE &GWHRE.RCO SET CCFSCY = &SELYEAR WHERE CRSTS = 'A'

Во-вторых, я создал XCLP, который вызывает CLD @ 91Q1 Query

... 

/*********************************************************************/ 
/* CALL SQL TO UPDATE THE COMPANY RECORDS WITH THE CURRENT YEAR  */ 
/*********************************************************************/ 

     CHGVAR  VAR(&SELYEAR) VALUE(&GYEAR)      
     STRQMQRY QMQRY(*LIBL/[email protected]) NAMING(*SYS) +    
         SETVAR((SELYEAR &SELYEAR) (GWHRE &GWHRE))  
... 

И, наконец, я создал файл XDSPF, чтобы дать пользователю место для ввода необходимой информации.

Глядя на это, кажется, что это было любопытно, но это то, чего хотел Босс, так это то, что получил босс.

Я думаю, что это хорошее упражнение, и я вижу, как этот процесс используется в более сложных операциях SQL.

+0

Это подход, используемый многими до того, как IBM добавила команду CLR RUNSQL. – Charles

1

Очень простой пример использования RPGLE и ДДС вместо CL или QMQRY будет выглядеть следующим образом:

Дисплей файла:

A          INDARA 
A   R DSPLY      WINDOW(*DFT 7 35) 
A          WDWTITLE((*TEXT 'Year End Process')- 
A          *TOP *CENTER) 
A          CF03(03) 
A         2 2'Type values, press Enter.' 
A          COLOR(BLU) 
A         4 5'Current Year :' 
A          COLOR(WHT) 
A   CURYR   4Y 0B 4 22EDTCDE(4) 
A 30         ERRMSG('Invalid Year') 
A         6 2'F3=Exit' 

RPGLE

ctl-opt Option(*SrcStmt : *NoDebugIo: *NoUnref) 
      DftActGrp(*No) ActGrp(*New) 
      Main(main); 

    // display file and indicators 
    dcl-f prompt Workstn Indds(Indicators); 
    dcl-ds Indicators Len(99); 
    F3Pressed  Ind Pos(3); 
    InvalidYear Ind Pos(30); 
    Errors   Ind Pos(30) Dim(10); 
    end-ds; 

    dcl-proc main; 

    dcl-s ContinueTransaction Ind Inz(*On); 
    dcl-s CurrentYear   Int(5) Inz(0); 

    CurrentYear = %subdt(%date(): *YEARS); 
    curyr = CurrentYear; 
    dow ContinueTransaction; 
     exfmt dsply; 
     ContinueTransaction = *Off; 
     Errors = *Off; 
     select; 
     when F3Pressed; 
     when curyr >= CurrentYear - 1 and 
       curyr <= CurrentYear + 1; 
      exec sql 
      update rco 
       set ccfscdy = :curyr 
       where crsts = 'A'; 
     other; 
      InvalidYear = *On; 
      ContinueTransaction = *On; 
     endsl; 
    enddo; 

    close prompt; 
    return; 
    end-proc; 

Это значение по умолчанию текущий год в подсказку и предоставляет сообщение, когда введенный год отклоняется слишком далеко от текущего года. Не так быстро и грязно, как решение QMQRY, но на самом деле это не так сложно, и как только вы его получите, вы можете скопировать и изменить подсказку, проверку и SQL в свой контент.

+0

Привет, спасибо jmarkmurphy, что это довольно пятно прямо там .. я должен помнить, что ... – TomCusick

Смежные вопросы