Sie sind auf Seite 1von 54

System i

Tips y Técnicas

2009 Grupo ASSSI

Temario

Unidades.

  • 1. Operación y Administración.

  • 2. Programación y Desarrollo de Aplicaciones.

  • 3. Base de Datos.

  • 4. Comunicaciones.

  • 5. Seguridad.

  • 6. Trivia.

1. Operación y Administración

1. Operación y Administración

1. Operación y Administración

Respaldar Archivos de Spool en V5R4

1. Operación y Administración

Ahora que ya están en V5R4, o que pronto lo van a estar, no hay que olvidar algo de lo bueno.

¡ Ahora no se pierde ningún atributo al restaurarlos !

Nuevo parámetro adicionado a los comandos: SAVLIB, SAVOBJ, RSTLIB, RSTOBJ

SAVLIB LIB(PRUEBASLIB) DEV(TAP01) SPLFDTA(*ALL)

Este comando salva todos los archivos de spool de las output queues en la librería.

RSTLIB SAVLIB(PRUEBASLIB) DEV(TAP01) SPLFDTA(*NEW)

Este comando restaura todos los archivos de spool que no existan en las output queues.

1. Operación y Administración

SAVOBJ OBJ(MIOUTQ) LIB(PRUEBSALIB) DEV(TAP01) OBJTYPE(*OUTQ) SPLFDTA(*ALL)

Este comando salva la output queue MIOUTQ en la librería PRUEBALIB con todos los archivos de spool que contenga.

RSTOBJ OBJ(MIOUTQ) SAVLIB(PRUEBASLIB) DEV(TAP01) OBJTYPE(*OUTQ) SPLFDTA(*NEW)

Este comando restaura los archivos de spool de la output queue MIOUTQ en la librería PRUEBALIB, que no existan en el sistema.

1. Operación y Administración

Como Monitorear Problemas de i5/OS

1. Operación y Administración

Mejores lugares para encontrar problemas:

Cola de mensajes QSYSMSGQ.

Cola de mensajes del Operador del Sistema QSYSOPR.

Estadísticas de las Unidades de Disco.

Entradas de los Trabajaos Activos.

Colas de Trabajo y Colas de Salida.

Considerar alguna herramienta de monitoreo automático.

1. Operación y Administración

Cola de Mensajes QSYSMSGQ

Se debe crear en la librería QSYS.

CRTMSGQ MSGQ(QSYS/QSYSMSG) TEXT(‘Cola de mensajes opcional para recibir mensajes del sistema’)

El sistema operativo envía de manera automática los problemas críticos del sistema.

Existen diferentes formas de trabajar con esta cola de mensajes:

  • 1. Utilizar una herramienta de monitoreo.

  • 2. Crear un programa que lea los mensajes en QSYSMSGQ y realice cierta acción cada vez que se reciba un mensaje.

  • 3. Monitorear QSYSMSGQ en modo ‘break’ CHGMSGQ MSGQ(QSYSMSGQ) DLVRY(*BREAK)

1. Operación y Administración

Cola de Mensajes QSYSOPR

Más compleja de monitorear ya que incluye tanto mensajes de rutina como mensajes críticos.

Utilizar una herramienta de monitoreo o escribir un programa.

Recomendaciones para monitorear de manera automática:

  • 1. Mensajes que requieren una respuesta tal como C, D, I o R. Cuando un trabajo requiere de una contestación, no informa de esto para continuar.

  • 2. Filtrar mensajes de consulta asociados con el usuario QSPLJOB.

Mensajes para tareas como cargar diferentes tipos en la impresora o alinear formatos.

1. Operación y Administración

Cola de Mensajes QSYSOPR

  • 3. Monitorear mensajes con un código de severidad de 80 o mayor.

Exceptuando los del usuario QSPLJOB.

Normalmente son mensajes que deben ser atendidos de inmediato.

  • 4. Monitorear trabajos que no se completaron normalmente.

CPF1240 - Job &3/&2/&1 ended abnormally CPC1234 - Job &3/&2/&1 ended from job queue by user &4 CPC1125 - Job &3/&2/&1 was ended by user &4 CPC1126 - Job &3/&2/&1 was ended by user &4

1. Operación y Administración

Cola de Mensajes QSYSOPR

  • 5. Monitorear condiciones serias de almacenamiento. CPF0907 - Serious storage condition may exist. Press HELP.

Cubrimos la mayoría de los problemas típicos.

Iniciarse en el monitoreo automático.

En la 2ª parte revisaremos otros mensajes a monitorear.

1. Operación y Administración

Para la 2ª Parte

Analizaremos otras áreas críticas a monitorear, incluyendo:

Cambios súbitos en la capacidad de disco utilizada.

Objetos dañados.

Problemas con trabajos activos en ejecución.

Problemas con trabajos batch, incluyendo los de ejecución prolongada.

Asegurarse que los subsistemas críticos están en ejecución.

Asegurarse que los trabajos críticos de servidores están en ejecución.

Problemas con impresiones de archivos de spool.

2. Programación y Desarrollo de Aplicaciones

2. Programación y Desarrollo de Aplicaciones

2. Programación y Desarrollo de Aplicaciones

Eludir Registros Bloqueados

2. Programación y Desarrollo de Aplicaciones

Poner especial atención en la operación READ en el segundo cálculo:

FSomeFile UF

E

D Forever

D Open

D Closed

S

C

C

K Disk

Prefix(SR_)

N

inz(*On)

Const(' ')

Const('Z')

/Free DoW Forever; Read(E) SomeRec; If %Eof(SomeFile); Leave; EndIf; If %Error(); Read(N) SomeRec; Iter; EndIf; If SR_Status = Open and SR_Balance = *Zero; Eval SR_Status = Closed; Update SomeRec %Fields(SR_Status); EndIf; EndDo; Eval *InLR = *On; Return; /End-Free

2. Programación y Desarrollo de Aplicaciones

La operación READ incluye en extender E, indicándole al compilador RPG no

detenerse si la operación termina en error. Después del READ y el chequeo usual por fin de archivo, utilizar la función

%ERROR para atrapar los registros bloqueados. Si falla el READ, volver a leer, esta vez sin el lock.

Esta segunda lectura permite mover el apuntador del archivo al siguiente

registro. En este ejemplo no se revisó si el error se debió a un ‘ lock’.

Si se requiere, utilizar la función %STATUS, valor 1218.

2. Programación y Desarrollo de Aplicaciones

La Eficiencia de Variables de Longitud Variable

2. Programación y Desarrollo de Aplicaciones

¿Recuerdan los viejos tiempos en que los dinosaurios rondaban la tierra y la única forma de construir strings de datos en RPG involucraba jugar juegos ridículos con arreglos?

O peor aún, utilizar combinaciones obscuras con operaciones MOVE.

RPG IV introdujo funciones poderosas para manejar strings como %TRIM.

Sin embargo, existen capacidades del lenguaje que pocos programadores utilizan.

Una de las mejores es la de variables de caracter, de longitud variable.

Existen varias ventajas de su utilización, pero en este ejemplo, únicamente nos enfocaremos a la de rendimiento.

2. Programación y Desarrollo de Aplicaciones

D Spec – Mostrar como se definen y mostrar cada parte

D varStruct

DS

  • (A) D Campovar

256a

Varying Inz

// Los siguiente campos se definen solamente para mostrar el layout de un campo variable

  • (B) Overlay(CampoVar)

D

long

5i 0

  • (C) Overlay(CampoVar: *Next)

D

datos

256a

Tienen 2 componentes: La longitud actual representada por un entero de 2- bytes en las primeras 2 posiciones, seguido de los datos.

Se diferencian por la Palabra Clave Varying (A).

Codificar siempre la Palabra Clave Inz para asegurar que la longitud se asigne correctamente. Esto es crítico cuando se incorporan campos de longitud variable en estructuras de datos.

¿Por que?

2. Programación y Desarrollo de Aplicaciones

D Spec – Mostrar como se definen y mostrar cada parte

D varStruct

DS

  • (A) D Campovar

256a

Varying Inz

// Los siguiente campos se definen solamente para mostrar el layout de un campo variable

  • (B) Overlay(CampoVar)

D

long

5i 0

  • (C) Overlay(CampoVar: *Next)

D

datos

256a

Porque por omisión, las estructuras de datos se inicializan con espacios (hex 40), creando confusión al interpretarlo como la longitud del campo.

En el ejemplo, (B) y (C), se definieron los 2 componentes como campos separados para mostrar el layout.

2. Programación y Desarrollo de Aplicaciones

Siempre que el contenido de un campo de longitud variable cambie, el compilador ajusta la longitud para reflejar el nuevo contenido.

Siempre se debe utilizar %TRIMX cuando se carguen datos desde un campo de longitud fija.

De lo contrario, los blancos restantes se contarán en la longitud del campo.

Para saber la longitud del campo, utilizar la función %LEN() y obtener el valor actual.

2. Programación y Desarrollo de Aplicaciones

Vamos a ver como pueden mejorar notablemente el rendimiento.

Observar los 2 siguientes códigos.

Ambos construyen un string de 100 valores separados por comas.

A primera vista, existe muy poca diferencia en la lógica, pero…

¿Creerían que el segundo puede ejecutar cientos, sino es que miles de veces más rápido?

For i = 1 to 10; For j = 1 to 10; fixedField = %Subst(baseString: i: j ); longFixed = %TrimR(longFixed) + ',' + fixedField; EndFor; EndFor;

For i = 1 to 10; For j = 1 to 10; fixedField = %Subst(baseString: i: j ); longVarying += ',' + %TrimR(fixedField); EndFor; EndFor;

2. Programación y Desarrollo de Aplicaciones

For i = 1 to 10; For j = 1 to 10; fixedField = %Subst(baseString: i: j ); longFixed = %TrimR(longFixed) + ',' + fixedField; EndFor; EndFor;

Pasos que se llevan a cabo:

Descubrir donde se encuentra el último caracter sin espacio.

Adicionar la coma en la siguiente posición.

Adicionar el contenido de fixedField en la siguiente y subsecuentes posiciones.

Si no se ha llenado longFixed, adicionar blancos hasta llenarlo.

Este proceso se repite para cada valor adicionado al string.

2. Programación y Desarrollo de Aplicaciones

For i = 1 to 10; For j = 1 to 10; fixedField = %Subst(baseString: i: j ); longVarying += ',' + %TrimR(fixedField); EndFor; EndFor;

Pasos que se llevan a cabo:

Incrementar la longitud del campo en 1, y posicionar la coma en esa posición.

Determinar la longitud del campo a adicionar (ej. Ignorar blancos).

Copiar los datos al inicio de la longitud del campo, incrementando la longitud del campo + 1 posición.

¡ Mucho más sencillo ! Y la diferencia en velocidad puede ser impresionante.

2. Programación y Desarrollo de Aplicaciones

For i = 1 to 10; For j = 1 to 10; fixedField = %Subst(baseString: i: j );

longFixed = %TrimR(longFixed) + ',' + fixedField;

EndFor;

EndFor;

Otro punto a considerar es que este código (Primer ejemplo), es más eficiente que el utilizado normalmente:

longFixed = %TrimR(longFixed) + ',' + %TrimR(fixedField);

Al campo que se va a adicionar se le quitan los blancos, los cuales se adicionan nuevamente si el campo destino no se llena completamente.

longFixed = %TrimR(longFixed) + ','; longFixed = %TrimR(longFixed) + fixedField;

La separación de las 2 funciones, significa que los cálculos para la longitud efectiva del campo destino y el llenado subsecuente de blancos ocurre 2 veces por cada ‘loop’.

2. Programación y Desarrollo de Aplicaciones

For i = 1 to 10; For j = 1 to 10;

fixedField = %Subst(baseString: i: j );

longFixed = %TrimR(longFixed) + ',' + fixedField;

EndFor;

EndFor;

Se utiliza simplemente para generar campos de diferentes longitudes (1 a 10 caracteres) para actuar como datos de prueba a ser adicionados al string destino.

2. Programación y Desarrollo de Aplicaciones

Enviar un Mensaje a Un Usuario Desde Un Programa.

2. Programación y Desarrollo de Aplicaciones Utilizar: Call QEZSNDMSG

Especificar toda la información vía parámetros, para enviar un mensaje de interrupción desde un programa BATCH.

PGM PARM(&MSG &USERID)

  • DCL VAR(&MSGTYPE) TYPE(*CHAR) LEN(10)

  • DCL VAR(&DELIVERY) TYPE(*CHAR) LEN(10)

  • DCL VAR(&MSG) TYPE(*CHAR) LEN(32)

  • DCL VAR(&MSGLEN) TYPE(*CHAR) LEN(4)

  • DCL VAR(&USERID) TYPE(*CHAR) LEN(10)

  • DCL VAR(&NUMUSERS) TYPE(*CHAR) LEN(4)

  • DCL VAR(&MSGSNT) TYPE(*CHAR) LEN(4)

  • DCL VAR(&FUNCREQ) TYPE(*CHAR) LEN(4)

  • DCL VAR(&ERRORCODE) TYPE(*CHAR) LEN(8)

  • DCL VAR(&DISPLAY) TYPE(*CHAR) LEN(1)

  • DCL VAR(&MSGQ) TYPE(*CHAR) LEN(20)

  • DCL VAR(&DSTTYPE) TYPE(*CHAR) LEN(4)

  • DCL VAR(&CCSID) TYPE(*CHAR) LEN(4)

CHGVAR VAR(&MSGTYPE) VALUE('*INFO') CHGVAR VAR(&DELIVERY) VALUE('*BREAK') CHGVAR VAR(&DISPLAY) VALUE('N') CHGVAR VAR(&DSTTYPE) VALUE('*USR')

CHGVAR VAR(%BIN(&MSGLEN)) VALUE(32) CHGVAR VAR(%BIN(&NUMUSERS)) VALUE(1) CHGVAR VAR(%BIN(&MSGSNT)) VALUE(0) CHGVAR VAR(%BIN(&FUNCREQ)) VALUE(0) CHGVAR VAR(%BIN(&ERRORCODE 1 4)) VALUE(0) CHGVAR VAR(%BIN(&CCSID)) VALUE(0)

CALL PGM(QEZSNDMG) PARM(&MSGTYPE + &DELIVERY + &MSG + &MSGLEN + &USERID + &NUMUSERS + &MSGSNT + &FUNCREQ + &ERRORCODE + &DISPLAY + &MSGQ + &DSTTYPE + &CCSID )

ENDPGM

3. Base de Datos

3. Base de Datos

3. Base de Datos

Utilizar DRDA para ejecutar SQL en otro System i

3. Base de Datos

DRDA – Distribuited Relational Database Architecture.

Para utilizar SQL en múltiples equipos o particiones.

Puede ayudar en tareas administrativas.

Muy útil para consultar datos en los tablas/archivos.

Permite a un System i local, ejecutar sentencias SQL en un servidor remoto (incluye otras plataformas).

3. Base de Datos

Configuración del Servidor Remoto

DRDA utiliza el Servidor DDM (Distribuited Data Management) para recibir y procesar SQL.

  • 1. Revisar si está en ejecución el Trabajo QRWTSRVR en el subsistema QSYSWRK.

  • 2. Arrancar el Servidor;

STRTCPSVR SERVER(*DDM)

3. Base de Datos

Configuración del Servidor Local

Adicionar una entrada del Servidor Remoto en el directorio de bases de datos relacionales.

  • 1. Utilizar el comando WRKRDBDIRE, y la opción 1 para adicionar una entrada al directorio. Base de datos relacional = Nombre que hace referencia al System i Remoto. Localidad remota = Nombre de Host o Dirección IP. Tipo de conexión = *IP

  • 2. Utilizar el comando ADDRDBDIRE:

ADDRDBDIRE RDB(Remoto) RMTLOCNAME(xx.xx.xx.xx *IP)

3. Base de Datos

Utilizando DRDA

  • 1. Arrancar SQL – STRSQL

  • 2. Utilizar la sentencia CONNECT – Requiere el nombre especificado en el parámetro RDB, nombre de usuario y contraseña: CONNECT TO Remoto USER xxxxxx USING ‘contraseña’

  • 3. Una vez conectado satisfactoriamente, todas las sentencias SQL se ejecutarán con la base de datos remota, hasta finalizar la conexión.

  • 4. Para conectarse entre servidores utilizar SET CONNECTION: SET CONNECTION Remoto SET CONNECTION Local

  • 5. Para saber a cual están conectados, utilizar la sentencia CONNECT.

4. Comunicaciones

4. Comunicaciones

4. Comunicaciones

NetServer

4. Comunicaciones

¿ Qué es NetServer ?

Servidor para compartir directorios e impresoras con clientes Windows.

Permite el acceso remoto a los recursos de System i.

System i Access no es necesario.

Se recomienda utilizar el Navegador para configurar NetServer.

4. Comunicaciones

Configuración de NetServer

  • 1. Verificar que TCP/IP está activo y funcional.

  • 2. Verificar el nombre correcto del Servidor NetServer. Buscar en los mensajes del operador el mensaje CPIB680, el cual contiene el nombre.

  • 3. Si no es el nombre correcto, cambiar de la siguiente manera: CALL QZLSCHSN PARM (nombre-servidor nombre-dominio ‘texto’

X’00000000’)

  • 4. Finalizar y arrancar el Servidor NetServer: ENDTCPSVR *NETSERVER STRTCPSVR *NETSERVER

4. Comunicaciones

Configuración de NetServer

  • 5. Revisar que se esté ejecutando el Trabajo QZLSSERVER en el subsistema QSERVER.

  • 6. Utilizar el comando NETSTAT *CNN para verificar que existen las siguientes entradas: ** netbios>001:27:44 Listen ** netbios>000:00:01 *UDP ** netbios>000:00:00 *UDP ** netbios>000:30:57 Listen ** cifs>427:49:42 Listen

  • 7. Revisar que se está ejecutando el trabajo QNPSERVD en el subsistema QSYSWRK: STRHOSTSVR *NETPRT

4. Comunicaciones

Compartir Archivos

Abrir el Navegador:

  • 1. Seleccionar Red – Servidores.

  • 2. Clic en TCP/IP para ver todos los servidores.

  • 3. Clic derecho en NetServer y seleccionar Abrir.

  • 4. Clic derecho en Objetos Compartidos y seleccionar Nuevo – Archivo.

  • 5. Utilizar Propiedades Generales para configurar el nombre, descripción, accesos, número máximo de usuarios, etc.

4. Comunicaciones

Configuración de la PC - Archivos

  • 1. Verificar que se tiene conexión con el System i – Ping.

  • 2. Seleccionar Inicio – Buscar – Equipos o Personas – Un equipo en la red – nombre del servidor netserver (\\as400\)

  • 3. Doble clic para seleccionar los recursos compartidos.

  • 4. Clic derecho en el directorio a compartir y seleccionar compartir y seguridad.

  • 5. Seleccionar la letra del drive.

  • 6. Seleccionar si se desea conectar al arrancar el equipo.

  • 7. Especificar usuario y contraseña.

4. Comunicaciones

Compartir Impresoras

Abrir el Navegador:

  • 1. Seleccionar Red – Servidores.

  • 2. Clic en TCP/IP para ver todos los servidores.

  • 3. Clic derecho en NetServer y seleccionar Abrir.

  • 4. Clic derecho en Objetos Compartidos y seleccionar Nuevo – Impresora.

  • 5. Utilizar Propiedades Generales para configurar el nombre, descripción, cola de salida, driver de la impresora, etc.

4. Comunicaciones

Configuración de la PC - Impresoras

  • 1. Verificar que se tiene conexión con el System i – Ping.

  • 2. Seleccionar Inicio – Buscar – Equipos o Personas – Un equipo en la red – nombre del servidor netserver.

  • 3. Doble click para seleccionar los recursos compartidos.

  • 4. Click derecho en la impresora a compartir.

  • 5. Instalar el driver de la impresora – AFP y SCS.

www.printers.ibm.com

Qca400\Win32\Install\Printer

5. Seguridad

5. Seguridad

5. Seguridad

Dando a Los Auditores Lo Que Solicitan

5. Seguridad

Mostrar información que comúnmente solicitan los molestos auditores.

1.

Contraseñas por Omisión.

Lista de todos los usuarios que utilizan la contraseña por omisión.

Ocurren cuando son iguales al ID de Usuario.

Son muy comunes ya que el sistema operativo la asigna al crear el ID de Usuario.

Ejecutar el comando:

ANZDFTPWD ACTION(*NONE)

Crea un archivo de spool QPSECPWD con la lista de todos los usuarios con la contraseña por omisión.

Puede deshabilitar los usuarios.

Lo mejor es que también genera un archivo físico QASECPWD en QUSRSYS.

5. Seguridad

  • 2. Parámetros de Configuración de las Contraseñas.

Se puede obtener fácilmente con el Navegador, y crear un documento de Word:

  • a) Abrir un documento de Word.

  • b) Abrir el navegador y seguir la ruta Seguridad – Políticas – Contraseñas. Esta ventana contiene 3 pestaña: General, Validación y Políticas de Expiración.

  • c) Clic en General. Se muestra el nivel de seguridad de contraseñas utilizado en el sistema.

  • d) Presionar Alt-PrtSc para copiar la ventana completa al Clipboard de Windows.

  • e) En el documento de Word, seleccionar Paste.

  • f) Repetir los pasos d y e para las pestañas Validación y Políticas de Expiración.

5. Seguridad

  • 3. Información de los Perfiles de Usuario.

Información referente a autorizaciones especiales asignadas a los usuarios.

  • a) Crear un archivo de información de perfiles de usuario (AIPU)

  • b) Fácil de crear: DSPUSRPRF USRPRF(*ALL) TYPE(*BASIC) OUTPUT(*OUTFILE) OUTFILE(lib/nombre_archivo)

  • c) En mi experiencia lo que más les interesa son los perfiles de usuario con alguna de las siguientes clases o autorizaciones especiales:

Clases de usuario *SECOFR (Oficial de Seguridad) o *PGMR (Programador).

Autorizaciones especiales *ALLOBJ (All Objects) o *SECADM (Administrador

de Seguridad). Usuarios con acceso a línea de comandos.

5. Seguridad

  • d) Para utilizar esta información se puede desarrollar un programa, ligar el archivo a una base de datos de Access, o utilizar una de las 3 siguientes sentencias SQL:

Usuarios con Clases *SECOFR o *PGMR:

SELECT * FROM lib/nombre_archivo WHERE UPUSCL = '*SECOFR' OR UPUSCL = '*PGMR‘

Usuarios con autorizaciones especiales *ALLOBJ y/o *SECADM:

SELECT * FROM lib/nombre_archivo WHERE UPSPAU LIKE '%ALLOBJ%' OR UPSPAU LIKE '%SECADM%‘

Usuarios con autorización a línea de comandos:

SELECT * FROM LIB/FILENAME WHERE UPLTCP = '*NO‘

  • e) La parte más difícil es identificar cuales campos del archivo representan la parte del perfil de usuario. Utilizar: DSPFFD FILE(lib/nombre_archivo) OUTPUT(*PRINT)

5. Seguridad

  • 4. Autorización para ciertos comandos.

Usuarios con acceso a comandos críticos del sistema, para trabajar con ‘jobs’, o el scheduler, incluyendo:

SBMJOB – Submitir trabajos.

RLSJOB – Liberar trabajos.

CHGJOB – Cambiar trabajos.

ADDJOBSCDE – Adicionar trabajos al Scheduler.

Estos comandos indican quien puede ejecutar o manipular trabajos en el sistema. Se puede imprimir la lista de usuarios autorizados y su autorización específica:

DSPOBJAUT OBJ(nombre_comando) OBJTYPE(*CMD) OUTPUT(*PRINT)

5. Seguridad

Los auditores quieren todo… y más.

Una cosa es segura con los auditores, no importa lo que les entreguen, siempre quieren más. Pero si saben donde buscar la información, será sencillo actualizarla cuando los auditores la requieran.

6. Trivia

6. Trivia

6. Trivia

Base de Datos – Cierto o Falso

  • 1. Join dinámico significa que el criterio no se aplica hasta que la consulta es ejecutada.

  • 2. Los triggers de SQL requieren que el journaling esté activo.

  • 3. Existe una diferencia significativa entre DB2/400 y DB2 UDB para System i.

  • 4. Es posible cambiar la longitud de un campo de un archivo físico sin recompilarlo.

  • 5. Las vistas de SQL no pueden ser indexadas.

  • 6. Múltiples archivos planos pueden ser copiados en un archivo de DB2 utilizando el ‘Wildcard’ (*) en el comando CPYFRMSTMF.

  • 7. El número de renglón no es soportado en DB2, y no existe forma de darle vuelta.

  • 8. “Índice Interno” significa que si DB2 genera un índice para forzar una restricción referencial, el índice se oculta al usuario/administrador.