Upload
truongdieu
View
229
Download
0
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
Come usare RPG Free
• Vediamo come vengono sostituite le specifiche H-F-D-P in RPG Free
• CTL-OPT sostituisce le specifiche H
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