sábado, 5 de septiembre de 2009

Conexion automatica al AS400

¿Como realizar una conexión automática desde un servidor Windows, o un cliente de red, al AS400?

A veces necesitamos para lanzar un cmd, o bat, en un pc en que la conexión al AS400 ya este establecida; para hacerlo automáticamente debemos tener instalado el producto iSeries Access y entonces podremos utilizar el comando c:\Program Files\ibm\Client Access\cwblogon.exe.

Básicamente se trata de cargar en un buffer de windows el usuario y la contraseña que utilizamos para conectar a el AS400 y así cuando los requiera la conexión windows la suministrara sin ninguna intervención.
Sintaxis
Para iniciar la sesión en un servidor:
CWBLOGON sistema /u ID_usuario /p contraseña

Para borrar un ID de usuario específico:
CWBLOGON sistema /u ID_usuario /c

Para borrar todos los ID de usuario de un servidor:
CWBLOGON sistema /c

Para borrar todos los ID de usuario de la antememoria:
CWBLOGON /c

Parámetros
sistema designa el nombre del servidor para el que debe almacenarse la información de ID de usuario y contraseña
/u ID_usuario designa el ID de usuario del servidor que debe almacenarse en la antememoria de iSeries Access para Windows
/p contraseña designa la contraseña del servidor asociada al ID de usuario proporcionado
/c borra la información de ID de usuario y contraseña de la antememoria de iSeries Access para Windows

Para más información:
http://www.redbooks.ibm.com/pubs/html/as400/v4r5/ic2924/info/rzaiimst.pdf

sábado, 15 de agosto de 2009

Como saber si el AS400 necesita mas RAM

¿Como podemos saber cuando un sistema AS400 necesita mas memoria RAM?

Nota: En AS400 no se denomina Memoria RAM sino Memoria Principal (Main storage), y el disco Memoria Auxiliar (Auxiliary storage) que puede estar dividido en ASP (Auxiliary storage pool) a modo similar del concepto de volúmenes.

El concepto de uso de la memoria, y la CPU, en el AS400 es muy diferente a la de los sistemas Windows y esa es la base de muchos errores de concepto, cuando provienen de personas que no tienen mucha idea de como funciona un AS400 y, además llegando a conclusiones totalmente equivocadas.

Con el mandato DSPSYSSTS puedes ver la cantidad de memoria (pool size) que esta "usando" el sistema, en los diferentes pool de memoria definidos en el sistema (ver Memoria para subsistema), pulsa F21=Select assistance level y selecciona 3=Advanced para acceder a toda la información en la misma pantalla.
El i5/OS, el nuevo nombre del sistema operativo del AS400, siempre consume siempre TODA la memoria disponible.

Normalmente yo me fijo, básicamente, en cuantas paginas en estado Inelegible (Wait-Inel, Act-Inel) aparecen en el DSPSYSSTS.

¿Que nos indica este parámetro Inel? pues básicamente que cuando el s.o. ha necesitado cargar una pagina de memoria de disco a memoria RAM (ya que estaba paginada), no ha podido, porque toda la memoria RAM estaba ocupada por trabajos que están activos y usando la CPU, esto explicado de manera simple y para que se entienda, ya que intervienen otros factores, como por ejemplo el TIMESLICE y el PURGE.

Además habría que analizar las causas de la paginación, ya que podría tener una "fácil" solución que no implique comprar mas RAM, sino solamente algo de "tunning" del tamaño de los pool de memoria y/o en el numero de hebras (threads) activos en cada momento.

Puedes leerte las siguientes entradas de mi blog www.as400howto.com, para ver si te aclaro un poco más el tema:

También tienes un link a un documento de IBM que puede servirte de ayuda:

sábado, 1 de agosto de 2009

Recuperar configuracion dispositivos

¿Como recuperar la configuración de dispositivos, controladores y lineas configuradas en nuestro AS400?. Para ello ejecutar el siguiente mandato:

RTVCFGSRC CFGD(*ALL) CFGTYPE(*ALL) SRCFILE(QGPL/QCLSRC) SRCMBR(SYSTEM_CFG)

Podemos utilizar la información recuperada como backup histórico o para, incluso, duplicar la configuración en otros AS400.

Un ejemplo de como buscar dos impresoras con la misma dirección IP:
  1. RTVCFGSRC CFGD(PRT*) CFGTYPE(*DEVD) SRCFILE(QGPL/QCLSRC) SRCMBR(PRINTERS)
  2. Esto crea el miembro fuente QGPL/QCLSRC.PRINTERS.
  3. Doy por supuesto que todas las impresoras se denominan PRT*, sino habrás de hacerlo por cada una, o por grupos, en ese caso acuérdate de utilizar la opción MBROPT(*ADD) para que no sobrescriba el miembro.
  4. Después editar el fuente:
  5. STRSEU SRCFILE(QGPL/QCLSRC) SRCMBR(PRINTERS)
  6. Utilizar la opción de búsqueda de string del SEU, para encontrar la dirección IP
  7. Utilizar la tecla F14 (o el comando F) + Direccion_IP y pulsar F16 para buscarla.
  8. Si aparece mas de una vez es que esta duplicada.

miércoles, 15 de julio de 2009

Como cargar lista de bibliotecas

A veces nos puede interesar cargar en un trabajo la lista inicial de bibliotecas.

Esto nos puede servir, por ejemplo, en un menú, para nuestro operador, que realice llamadas a programas o someta otros y estos cambian la lista de bibliotecas. Es conveniente dejar la lista de bibliotecas como estaba después de cada ejecución para evitar errores del operador al tener cargada una lista de bibliotecas diferente a la que él cree tener.

El código que habríamos de insertar en nuestro programa seria el siguiente:
DCL VAR(&BLANKS) TYPE(*CHAR) LEN(2764)
/* Incluir estas sentencias inmediatamente después de declarar las variables */
CHGVAR VAR(&BLANKS) VALUE(' ')
DOWHILE COND(&COUNT <= &LEN) CHGVAR VAR(&BLANKS) VALUE(&BLANKS *CAT ' ') CHGVAR VAR(&COUNT) VALUE(&COUNT + 1) ENDDO /* Este mandato guarda en la variable &USRLIBL el valor de la lista de bibliotecas actual */
RTVJOBA USRLIBL(&USRLIBL)
....
Inserte su código aquí
....
/* Construir el mandato CHGLIBL con el valor de la lista de bibliotecas en blanco */
CHGVAR VAR(&CMD) VALUE('CHGLIBL LIBL(' *TCAT &BLANKS *TCAT ')')
/* Limpia la lista de bibliotecas del trabajo */
CALL PGM(QCMDEXC) PARM(&CMD &LEN)
/* Construir el mandato CHGLIBL con el valor de la lista de bibliotecas inicial */
CHGVAR VAR(&CMD) VALUE('CHGLIBL LIBL(' *TCAT &USRLIBL *TCAT ')')
/* Cargar la lista de bibliotecas inicial del trabajo */
CALL PGM(QCMDEXC) PARM(&CMD &LEN)
ENDPGM

Se utiliza el QCMDEXC para ejecutar el CHGLIBL, en lugar de CHGLIBL LIBL(&USRLIBL), ya que en este caso solo nos cargaría en la lista la primera biblioteca de la variable &USRLIBL; eso es porque el parámetro LIBL es un parámetro de listas y el interprete de mandatos del sistema operativo los trata de forma diferente.
Para utilizar CHGLIBL deberíamos hacer CHGLIBL LIBL(&LIB1 &LIB2 ..... &LIBn), o sea utilizar tantas variables como bibliotecas contenga la variable &USRLIBL y eso complicaría aun mucho más el código.

domingo, 5 de julio de 2009

Arrancar registro por diario automaticamente

Como arrancar automáticamente el registro por diario de los objetos creados en una biblioteca.

Para ello debemos crear la especial área de datos QDFTJRN en nuestra biblioteca, MYLIB por ejemplo. Los datos de este área de datos informan al sistema operativo que diario debe utilizar para arrancar el registro por diario de los nuevo objetos creados en la biblioteca MYLIB si los objetos son "journalizables" (de tipos de objeto * FILE, DTAARA * y * DTAQ) se añaden a la biblioteca.
Cuando se crea un objeto en la biblioteca el sistema operativo busca este área de datos, en la misma biblioteca, y utiliza los datos que contiene para decidir si el registro por diario debe ser arrancado para ese objeto. Esto solo funciona en sistemas con la versión V5R4 del OS400, en V6R1 tenemos otra manera de hacerlo (STRJRNLIB) .

Como ejemplo para arrancar el registro por diario de TODOS los archivos creados en la biblioteca MYLIB, deberíamos de ejecutar los siguientes mandatos:
  • CRTDTAARA DTAARA(MYLIB/QDFTJRN) TYPE(*CHAR) LEN(100)
  • CHGDTAARA DTAARA(MYLIB/QDFTJRN (1 10)) VALUE(MYLIB)
  • CHGDTAARA DTAARA(MYLIB/QDFTJRN (11 10)) VALUE(MYJRN)
  • CHGDTAARA DTAARA(MYLIB/QDFTJRN (21 10)) VALUE(*FILE)
  • CHGDTAARA DTAARA(MYLIB/QDFTJRN (31 10)) VALUE(*ALLOPR)
Para crear los receptores de diario y el diario de una biblioteca MYLIB, podemos utilizar mi utilidad CHGSTSJRN, o ejecutar los siguientes mandatos.
  • CRTJRNRCV JRNRCV(MYLIB/JRNRCV0001) THRESHOLD(10000)
  • CRTJRN JRN(MYLIB/MYJRN) JRNRCV(MYLIB/JRNRCV0001) MNGRCV(*SYSTEM) DLTRCV(*YES)
Más información en el documento de IBM Journaling at object creation on DB2 for iSeries