Download - actualizacion rpg

Transcript
Page 1: actualizacion rpg

RPG ILE

ACTUALIZACION

Page 2: actualizacion rpg

Objetivos

• Acelerar el proceso de desarrollo

• Facilitar el mantenimiento

• Reducir errores

• Eliminar el código duplicado

Page 3: actualizacion rpg

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

Page 4: actualizacion rpg

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

Page 5: actualizacion rpg

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

Page 6: actualizacion rpg

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

Page 7: actualizacion rpg

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

Page 8: actualizacion rpg

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

Page 9: actualizacion rpg

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

Page 10: actualizacion rpg

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

Page 11: actualizacion rpg

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

Page 12: actualizacion rpg

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

Page 13: actualizacion rpg

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.

Page 14: actualizacion rpg

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 ***********************************************

Page 15: actualizacion rpg

*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

Page 16: actualizacion rpg

*ENTRY PROTOTIPOS

Nombre del Programa

Nombre del Prototipo

Interfaz del Procedimiento

Page 17: actualizacion rpg

Funciones mas claras

Page 18: actualizacion rpg

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

Page 19: actualizacion rpg

EstructurasDNombre+++++++++ETDsDesde++A+/L+++IDc.Palabras claveDVentas ds D Marca 10 D Valor 11 2

Page 20: actualizacion rpg

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

Page 21: actualizacion rpg

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)

Page 22: actualizacion rpg

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)

Page 23: actualizacion rpg

%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

Page 24: actualizacion rpg

%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

Page 25: actualizacion rpg

%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

Page 26: actualizacion rpg

%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

Page 27: actualizacion rpg

%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

Page 28: actualizacion rpg

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()

Page 29: actualizacion rpg

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

Page 30: actualizacion rpg

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


Top Related