29
RPG Free eSQL Presentata da Marco Balgera Un miglior codice per attrarre nuove generazioni di sviluppatori IBMi Next Step Strumenti moderni per lo sviluppatore IBMi/AS400

IBMiNextStep Strumenti moderni per lo sviluppatore IBMi/AS400 · Breve storia del RPG Free • RPG Free nasce nel 2001 con la versione 5.1 del sistema operativo di AS400 e viene utilizzato

Embed Size (px)

Citation preview

RPG Free e SQL

Presentata da Marco Balgera

Un miglior codice per attrarre nuove generazioni di sviluppatori

IBMi Next StepStrumenti moderni per lo sviluppatore IBMi/AS400

Introduzione

• Breve storia dello sviluppo del RPG free dalle sue origini ad oggi.

• Analisi delle differenze tra RPG Fixed ed RPG free e dei vantaggi.

• Valutazione degli strumenti per passare in modo relativamente indolore dal vecchio RPG Fixed al nuovo RPG free.

Breve storia del RPG Free

• RPG Free nasce nel 2001 con la versione 5.1 del sistema operativo di AS400 e viene utilizzato solo nelle specifiche di calcolo e doveva essere scritto tra due istanze

/free...

• ogni specifica «free» comincia a colonna 8 e termina con un «;» al massimo a colonna 80 del membro sorgente.

Ultimi sviluppi

• Dopo un primo avanzamento che prevedeva l’eliminazione dell’istanza /free … /end-free cha ha reso la scrittura del codice in free più semplice, anche quando usato in miscellanea con il vecchio Fixed, il 15/11/2013, con il rilascio del Technical Refresh 7 (TR7) per la versione 7.1 del sistema operativo sono state rilasciate le PTF

RPG FULL FREE

Come usare RPG Free

• Vediamo come vengono sostituite le specifiche H-F-D-P in RPG Free

• CTL-OPT sostituisce le specifiche H

Specifica CTL-OPT (Ex H)

Specifiche DCL-F (Ex F)

DCL-S e DCL-C (Ex D)

DCL-DS (Ex D per DataStruct)

12/12/2016 In collaborazione con FAQ400 e IBM Italia

12/12/2016 In collaborazione con FAQ400 e IBM Italia

12/12/2016

DCL-PR (Ex D per Procedure e Programmi esterni)

DCL-PR (Ex D per Procedure e Service Programs)

Qui di seguito vi mostro l’ingresso della procedure chiamata con la specifica precedente per meglio capirne l’utilizzo

La fine della procedura genera il ritorno del valore previsto

**free

/copy qcpysrc,cpyspechb

//------------------------------------------------------------------------*

// Definizione campi di comodo *

//------------------------------------------------------------------------*

dcl-s c1 int(10);

dcl-s ctr int(10);

dcl-s data_ymd date(*ymd);

dcl-s data_cambio packed(6);

dcl-s totale_cambi packed(15:5);

dcl-s cambio_medio packed(8:5);

dcl-s parametro char(30000);

//------------------------------------------------------------------------*

// Definizione DS per lettura dati cambio *

//------------------------------------------------------------------------*

dcl-ds val qualified dim(7);

valuta char(3);

cambio packed(9:5);

data char(10);

end-ds;

//------------------------------------------------------------------------*

// Definizione DS esterne *

//------------------------------------------------------------------------*

dcl-ds valute extname('TABEL00F') end-ds;

dcl-ds tabella_valute extname('T03VAL0F') end-ds;

//------------------------------------------------------------------------*

// Definizione /copy utilizzate *

//------------------------------------------------------------------------*

/copy qcpysrc,cpycmdexe

/copy qilegen,£tabxvads

/copy qsrvsrc,putit03val

/copy qsrvsrc,puticambds

//------------------------------------------------------------------------*

// Main program *

//------------------------------------------------------------------------*

// Imposta CCSID

comando = 'CHGJOB CCSID(37)';

qcmdexc(Comando:%len(Comando));

// Imposta sql per lettura valute gestite

exec sql declare Cval1 cursor for

select * from tabel00f

where ttsett = 'XVA'

order by ttelem;

exec sql open Cval1;

// Ciclo lettura valute presenti

dow 1 = 1;

exec sql fetch Cval1 into :valute;

if sqlcod <> 0;

leave;

endif;

// Imposta dati per calcolo cambio in percentuale

xva$ds = ttlibe;

t03val = ttelem;

// Imposta SQL

exec sql declare Cval2 cursor for

select * from (

SELECT * FROM XMLTABLE ( XMLNAMESPACES

( DEFAULT 'http://www.ecb.int/vocabulary/2002-08-01/eurofxref' ,

'http://www.gesmes.org/xml/2002-08-01' AS "gesmes" ) ,

'gesmes:Envelope/Cube/Cube/Cube' PASSING XMLPARSE

( DOCUMENT SYSTOOLS.HTTPGETBLOB

('http://www.ecb.europa.eu/stats/eurofxref/eurofxref-hist-90d.xml', ''))

COLUMNS currency CHAR(3) PATH '@currency',

rate REAL PATH '@rate',

time DATE PATH '../@time' ) AS cambi) x

where CURRENCY = :t03val

order by TIME DESC;

exec sql open Cval2;

clear val;

exec sql fetch Cval2 for 7 rows into :val;

if sqlcod = 0;

exsr calcola_media;

endif;

exec sql close Cval2;

enddo;

exec sql close Cval1;

// Reimposta CCSID di sistema

Comando = 'CHGJOB CCSID(*USRPRF)';

qCmdExc(Comando:%len(Comando));

// Fine programma

exsr esci;

//------------------------------------------------------------------------*

// Routine calcolo cambio medio *

//------------------------------------------------------------------------*

begsr calcola_media;

clear ctr;

clear totale_cambi;

for c1 = 1 to 7;

if val(c1).cambio <> 0;

ctr += 1;

totale_cambi += val(c1).cambio;

endif;

endfor;

if ctr > 0;

cambio_medio = %dech(totale_cambi/ctr:8:5);

exsr scrivi_cambio;

endif;

endsr;

//------------------------------------------------------------------------*

// Routine scrittura cambio *

//------------------------------------------------------------------------*

begsr scrivi_cambio;

// Aggiorna tabella T03VAL0F

data_ymd = %date(val(1).data:*eur);

data_cambio = %dec(data_ymd);

clear tabella_valute;

t03dat = data_cambio;

t03val = val(1).valuta;

t03des = ttdesc;

if t$xvac <> 0;

t03ca1 = t$xvac;

else;

t03ca1 = %dech(cambio_medio-((cambio_medio/100)*t$xvaa):8:5);

endif;

t03ca2 = cambio_medio;

t03ca3 = val(1).cambio;

t03ca4 = %dech(cambio_medio+((cambio_medio/100)*t$xvab):8:5);

parametro = tabella_valute;

wrtt03val(t03val:t03dat:parametro);

// Aggiorna tabella SMEUP (BRCAMBI0F)

pgmcambi(t03val:t03dat:' ');

endsr;

//------------------------------------------------------------------------*

/copy qcpysrc,cpyesci

https://www.ibm.com/developerworks/ibmi/library/i-ibmi-rpg-support/

http://www.faq400.com/

http://www.ibm.com/us-en/

Grazie a tutti per l’attenzione

e arrivederci