actualizacion rpg
DESCRIPTION
paso de rpg fix format a formato libreTRANSCRIPT
RPG ILE
ACTUALIZACION
Objetivos
• Acelerar el proceso de desarrollo
• Facilitar el mantenimiento
• Reducir errores
• Eliminar el código duplicado
Guía de InicioFree Format
... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8
*************** Principio de datos *****************************************
/Free
chain(e) codigoEmpleado Empleados;
IF %error();
errCalculo=*on;
ELSEIF %FOUND();
errCalculo=*off;
recupera_Faltas(codigoEpleado :DiasAusencia);
eval(h) sueldoDiario = sueldoMensual/DiasMes;
sueldoNomina=((sueldoDiario*diasTrabajados)
-(sueldoDiario*DiasAusencia));
ENDIF;
/End-Free
****************** Fin de datos ********************************************
Inicio del Formato Libre
Fin del Formato Libre
Escriba en la posición 7 la especificación /FREE para indicar el inicio del formato libre y para finalizar escriba /END-FREE
Guía de InicioFree Format
... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8
*************** Principio de datos *****************************************
/Free
chain(e) codigoEmpleado Empleados;
IF %error();
errCalculo=*on;
ELSEIF %FOUND();
errCalculo=*off;
recupera_Faltas(codigoEpleado :DiasAusencia);
eval(h) sueldoDiario = sueldoMensual/DiasMes;
sueldoNomina=((sueldoDiario*diasTrabajados)
-(sueldoDiario*DiasAusencia));
ENDIF;
/End-Free
****************** Fin de datos ********************************************
El área para codificar es de la posición 8 a la 80 las posiciones 6 y siete deben de quedar en blanco
Guía de InicioFree Format
... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8
*************** Principio de datos *****************************************
/Free
chain(e) codigoEmpleado Empleados;
IF %error();
errCalculo=*on;
ELSEIF %FOUND();
errCalculo=*off;
recupera_Faltas(codigoEpleado :DiasAusencia);
eval(h) sueldoDiario = sueldoMensual/DiasMes;
sueldoNomina=((sueldoDiario*diasTrabajados)
-(sueldoDiario*DiasAusencia));
ENDIF;
/End-Free
****************** Fin de datos ********************************************
Las sentencias inician con
OPCODE factor1 factor2
Guía de InicioFree Format
... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8
*************** Principio de datos *****************************************
/Free
chain(e) codigoEmpleado Empleados;
IF %error();
errCalculo=*on;
ELSEIF %FOUND();
errCalculo=*off;
recupera_Faltas(codigoEpleado :DiasAusencia);
eval(h) sueldoDiario = sueldoMensual/DiasMes;
sueldoNomina=((sueldoDiario*diasTrabajados)
-(sueldoDiario*DiasAusencia));
ENDIF;
/End-Free
****************** Fin de datos ********************************************
Las sentencias eval y callp son implícitas
Guía de InicioFree Format
... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8
*************** Principio de datos *****************************************
/Free
chain(e) codigoEmpleado Empleados;
IF %error();
errCalculo=*on;
ELSEIF %FOUND();
errCalculo=*off;
recupera_Faltas(codigoEpleado :DiasAusencia);
eval(h) sueldoDiario = sueldoMensual/DiasMes;
sueldoNomina=((sueldoDiario*diasTrabajados)
-(sueldoDiario*DiasAusencia));
ENDIF;
/End-Free
****************** Fin de datos ********************************************
Si se utilizan para incluir un operador extendido por ejemplo ”H” en una operación para aproximar o “E” en un CALLP para que no se detenga en caso de error
Guía de InicioFree Format
... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8
*************** Principio de datos *****************************************
/Free
chain(e) codigoEmpleado Empleados;
IF %error();
errCalculo=*on;
ELSEIF %FOUND();
errCalculo=*off;
recupera_Faltas(codigoEpleado :DiasAusencia);
eval(h) sueldoDiario = sueldoMensual/DiasMes;
sueldoNomina=((sueldoDiario*diasTrabajados)
-(sueldoDiario*DiasAusencia));
ENDIF;
/End-Free
****************** Fin de datos ********************************************
Cada Sentencia termina con punto y coma
Guía de InicioFree Format
... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8
*************** Principio de datos *****************************************
/Free
chain(e) codigoEmpleado Empleados;
IF %error();
errCalculo=*on;
ELSEIF %FOUND();
errCalculo=*off;
recupera_Faltas(codigoEpleado :DiasAusencia);
eval(h) sueldoDiario = sueldoMensual/DiasMes;
sueldoNomina=((sueldoDiario*diasTrabajados)
-(sueldoDiario*DiasAusencia));
ENDIF;
/End-Free
****************** Fin de datos ********************************************
Una sentencia completa puede escribirse en mas de una línea.
Pero no se pueden escribir mas de una sentencia en una línea
Guía de InicioFree Format
... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8
*************** Principio de datos *****************************************
/Free
chain(e) codigoEmpleado Empleados;
IF %error();
errCalculo=*on;
ELSEIF %FOUND();
errCalculo=*off;
recupera_Faltas(codigoEpleado :DiasAusencia);
eval(h) sueldoDiario = sueldoMensual/DiasMes;
sueldoNomina=((sueldoDiario*diasTrabajados)
-(sueldoDiario*DiasAusencia));
ENDIF;
/End-Free
****************** Fin de datos ********************************************
Indicadores no soportados se utilizan las funciones %error %found
Guía de InicioFree Format
... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8
*************** Principio de datos *****************************************
/Free
chain(e) codigoEmpleado Empleados;
IF %error();
errCalculo=*on;
ELSEIF %FOUND();
//Calculo de nomina
errCalculo=*off;
recupera_Faltas(codigoEpleado :DiasAusencia); //faltas
eval(h) sueldoDiario = sueldoMensual/DiasMes;
sueldoNomina=((sueldoDiario*diasTrabajados)
-(sueldoDiario*DiasAusencia));
ENDIF;
/End-Free
****************** Fin de datos ********************************************
Los Comentarios se utilizan con dos diagonales y se pueden utilizar en cualquier parte del área de codificación o después de una sentencia
Un estilo de Programación
• Pequeñas piezas de código funcionan mejor
• Es mejor hacerlo bien que hacerlo rapido
• No sacrificar la claridad en código por ahorro de líneas de código
• Pensar si 1 año aun voy a entender el código fácilmente
Un sustituto para el OVRDBF
• Para evitar hacer uso de una CL o un QCMDEXC se pueden utililizar las palabras claves EXTFILE y EXTMBR que permiten hacer referencia a un archivo por medio de una constante o una variable que contenga el nombre del archivo antes de abrirlo.
Un sustituto para el OVRDBFFNombarch++IPEASF.....L.....A.Dispos+.Palabras clave+++++++++++++++++++++++Come*************** Principio de datos ********************************************FFINV003 IF E DISK USROPN EXTFILE(MARCA) EXTMBR(MES) DMARCA S 10 DMES S 10 /FREE marca='TOYOTA'; MES='M'+%EDITC(UMONTH:'X'); OPEN FINV003; //Codigo del programa CLOSE FINV003; *INLR=*ON; /END-FREE ****************** Fin de datos ***********************************************
*ENTRY PROTOTIPOS
• El beneficio de usar prototipos es en la validación del tipo de datos que enviamos en el momento de la compilación.
• Uso de palabras claves – CONST– OPTIONS
• *VARSIZE• *OMIT• *NOPASS• *RIGHTADJ• *TRIM
*ENTRY PROTOTIPOS
Nombre del Programa
Nombre del Prototipo
Interfaz del Procedimiento
Funciones mas claras
Estructuras
• Las palabras claves que fortalecen las estructuras son – LIKEDS Definir una estructura igual a otra– EXTNAME Definir una estructura con una
definición externa– QUALIFIED hacer referencia calificada a los
campos de la estructura– DIM parecido al OCCUR pero como
definición de vector
EstructurasDNombre+++++++++ETDsDesde++A+/L+++IDc.Palabras claveDVentas ds D Marca 10 D Valor 11 2
EstructurasDNombre+++++++++ETDsDesde++A+/L+++IDc.Palabras clave+++++++++++DVentas ds QUALIFIED D Marca 10 D Valores LIKEDS(estVentas) D DIM(12) DestVentas ds QUALIFIED D unidades 5 0 D valor 11 2 /FREE ventas.marca='TOYOTA'; ventas.valores(1).unidades=10; ventas.valores(1).valor =1500; *inlr=*On; /END-FREE
Estructuras descritas externamente
DNombre+++++++++ETDsDesde++A+/L+++IDc.Palabras clave+++++++++++++++++++++++*************** Principio de datos ****************************************Dproductos E ds extname(FGEN250) PREFIX(P) DproductosKEY E ds extname(FGEN250:*KEY) PREFIX(K)
Conversión de datos
• En formato libre no están soportadas las operaciones MOVE y MOVEL
• La alternativa es usar las funciones incorporadas– %char( convertir a carácter)– %dec( convertir a decimal)– %editc( editar un valor usando edit code)– %int( convertir a entero)
%CHARDNombre+++++++++ETDsDesde++A+/L+++IDc.Palabras clave++++++*************** Principio de datos ***********************DCARACTER S 10 DDECIMAL S 7 2 INZ(100.25) DENTERO S 7 0 INZ(100) DFECHA S D INZ(D'2008-12-25') /FREE CARACTER = %CHAR(DECIMAL); // 100.25 DSPLY CARACTER; CARACTER = %CHAR(ENTERO); // 100 DSPLY CARACTER; CARACTER = %CHAR(FECHA:*JOBRUN); // 12/25/08 DSPLY CARACTER; *INLR=*ON; /END-FREE
%editcDNombre+++++++++ETDsDesde++A+/L+++IDc.Palabras clave*************** Principio de datos *****************DCARACTER S 10 /FREE CARACTER = %editc(1235.50:'J');// 1,235.50 DSPLY CARACTER; CARACTER = %editc(1235.50:'X');// 123550 DSPLY CARACTER; CARACTER = %editc(1235.50:'K':'Q');// Q1,235.50 DSPLY CARACTER; *INLR=*ON; /END-FREE
%editwDNombre+++++++++ETDsDesde++A+/L+++IDc.Palabras clave++++*************** Principio de datos *********************DTelefono S 15 /FREE telefono = %editw(24703125:' - ');//2470-3125 DSPLY telefono; *INLR=*ON; /END-FREE
%intDNombre+++++++++ETDsDesde++A+/L+++IDc.Palabras clave+++*************** Principio de datos ********************Dentero S 15p 2 Dcaracter S 15a /FREE caracter='1234.23'; entero = %int(caracter); //1234
DSPLY entero ; caracter='1 2 3 4.99'; entero = %int(caracter); //1234 DSPLY entero ; *INLR=*ON; /END-FREE
V5R2 O SUPERIOR
%decDNombre+++++++++ETDsDesde++A+/L+++IDc.Palabras clave+++*************** Principio de datos ********************Ddecimal S 15p 2 Dcaracter S 15a /FREE caracter='1234.23'; decimal= %dec(caracter:15:2); // 1234.23 DSPLY decimal; caracter='1 2 3 4.999'; decimal= %dec(caracter:15:2); // 1234.99 DSPLY decimal; *INLR=*ON; /END-FREE
Operaciones con Archivo
• Debido a la eliminación del área de indicadores es necesario implementar en las sentencia las siguientes instrucciones– %eof()– %found()– %equal()– %open()– %status()
Operaciones con ArchivoFNombarch++IPEASF.....L.....A.Dispos+.Palabras clave++++++++------------- 4 registros excluidos ------------------------DKDS_REP100 E DS EXTNAME(FREP100:*KEY) C K0001 KLIST ------------- 3 registros excluidos ------------------------ /Free if %open(FGEN250); gcicod='AC'; chain (GCICOD :RCOTAY :RORNUM) FGEN250; IF %FOUND(FGEN250); SETLL %KDS(KDS_REP100) FREP103; IF %EQUAL(FREP103); UPDATE REP100 %FIELDS(RORETA); READE K0001 FREP103; DOW NOT %EOF() ; //PROCES DE REGISTROS READE K0001 FREP103; ------------- 4 registros excluidos ------------------------ endif; /End-free
V5R2 O SUPERIOR
Manejo de ErroresDNombre+++++++++ETDsDesde++A+/L+++IDc.Palabras clave+++*************** Principio de datos ********************DGMONERR PR EXTPGM('GMONERR')D valor 3 0 DGMONERR PI D valor 3 0 DerrDiv0 s 3 0 /Free MONITOR; errDiv0=100/valor; ON-ERROR 102; DSPLY 'División por Cero'; ON-ERROR *all; DSPLY 'Error no conocido'; ENDMON; *inlr=*on; /end-free