Documentos y utilidades para AS/400 que he ido creando y recopilando a lo largo de los años trabajando con este gratificante sistema operativo. www.as400howto.com
lunes, 21 de diciembre de 2009
sábado, 19 de diciembre de 2009
eyeOS y IBM
Biblioteca de trabajo TEMP
- CRTLIB LIB(TEMP) TYPE(*TEST) TEXT('Temporary library (cleared weekly automatically)')
- CHGOBJOWN OBJ(TEMP) OBJTYPE(*LIB) NEWOWN(QPGMR)
- CRTDIR DIR('/home/temp') DTAAUT(*RWX) OBJAUT(*ALL)
- CHGOWN OBJ('/home/temp') NEWOWN(QPGMR)
Código del programa CLRTEMP
jueves, 12 de noviembre de 2009
Planificador de trabajos
Para que funcione el planificador de trabajos debe estar activo el trabajo QSYSSCD en el subsistema QCTL (o QBASE) y se arranca automáticamente después del IPL.
miércoles, 4 de noviembre de 2009
IBM i Manifest
- Manifiesto por el IBM i, un ejemplo a seguir
- La iniciativa "IBM i Manifest" sigue ganando adeptos
- i + POWER: The Spanish iManifest
miércoles, 28 de octubre de 2009
Cancelar un rollback
- Supongamos que lanzamos un programa que crea una tabla temporal, abre un ciclo de commit y empieza a insertar registros en esta tabla, el programa se mete en un bucle y continua insertando registros, cuando lleva unos cuantos millones de insert nos damos cuenta y cancelamos el trabajo. Entonces empieza a realizar el rollback eliminando millones de registros insertados. En este caso si pudiéramos cancelar el rollback y eliminar la tabla temporal seguro que terminaría más rápido que esperar el final del rollback.
- Un programa se mete en un bucle actualizando miles de veces el mismo registro, es importante verificarlo con las entradas del diario. Al cancelarlo el rollback empezara a realizar miles de update en sentido inverso hasta dejarlo en el valor original. También en este caso si supiéramos el valor del registro al inicio del bucle, podríamos cancelar el rollback y después realizar un update manual del registro a su valor inicial; con esto ahorraríamos seguramente mucho tiempo.
- Un trabajo realiza cambios en una o mas tablas, utilizando un solo ciclo de commit, cuando lleva unos millones de cambios cancelamos el trabajo. Si tenemos la absoluta seguridad que tenemos una copia de las tablas antes de empezar el proceso y que ningún otro trabajo ha realizado cambios en las mismas, podríamos valorar la posibilidad de cancelar el rollback y restaurar las tablas.
- Definir la estrategia para reparar la base de datos: Asegurarse de que tenemos los datos necesarios, verificar que tenemos las copias de seguridad, son accesibles y contienen las tablas implicadas (recordar los ejemplos).
- Conectarse con usuario con permisos *SECOFR.
- Lanzar el ENDJOB, con OPTION(*IMMED), del trabajo que empezara a realizar el rollback.
- Averiguar el ciclo de compromiso del rollback que vamos a cancelar:
- WRKCMTDFN JOB(012345/MYUSER/MYJOB)
- Pulsar F23 para ver más opciones y aparecerá la opción 20=End rollback.
- Introducir la opción 20 en el ciclo de compromiso a cancelar y pulsar Intro.
- Nos aparecerá una pantalla (ver imagen) que nos advierte del peligro de cancelar el rollback, ya que dejaremos inconsistente la base de datos y eso podría afectar a otros trabajos.
- Si estamos seguros pulsaremos Intro. Sino podemos pulsar F12 para volver atras.
- A partir de ese momento el trabajo empezará a liberar los registros bloqueados por el commit, cancelando el rollback. Esto puede tardar algún tiempo dependiendo de la cantidad de registros.
- Una vez a finalizado el rollback y el trabajo, podremos reparar la base de datos, según la estrategia decidida en el primer paso. En los ejemplos: Eliminar la tabla temporal, Actualizar manualmente el registro implicado, Restaurar la/s tabla/s implicadas.
lunes, 19 de octubre de 2009
Cambio hora verano/invierno
Con esto conseguimos que cada ultimo domingo de mes se lance el trabajo y solo cambiara la hora cuando sea:
- El ultimo domingo del mes de Marzo a las 02:00:00 sumara una hora o
- El ultimo domingo del mes de Octubre esperara a las 03:01:00 y restara una hora,
- En ambos casos envía un mensaje al operador.
- El resto de meses no hará nada.
jueves, 15 de octubre de 2009
Cambios en variable de sistema QLMTDEVSSN (V6R1)
DSPSYSVAL SYSVAL(QLMTDEVSSN)
lunes, 21 de septiembre de 2009
Auditar uso de comandos
Al crear un usuario y definir que clase de usuario es (USRCLS), de alguna forma ya estamos limitando que mandatos podrá usar y cuales no. Con las autorizaciones especiales (SPCAUT) del perfil de usuario, podemos limitar aun más el acceso a los mandados críticos.
Pero ademas podemos auditar la utilización de un mandato, sin limitar su uso, por ejemplo el mandato CLRPFM.
¿Como podemos hacerlo? Simplemente cambiando el valor de auditoria del objeto QSYS/CLRPFM de tipo *CMD.
Para ver el valor actual de auditoria de un objeto, hemos de utilizar el mandato:
DSPOBJD OBJ(QSYS/CLRPFM) OBJTYPE(*CMD) DETAIL(*FULL)
Pulsando una vez la AvPág, podremos observar que tiene el valor "Object auditing value" igual a *NONE. Para cambiarlo y empezar a auditar su uso, ejecutaremos el mandato:
CHGOBJAUD OBJ(QSYS/CLRPFM) OBJTYPE(*CMD) OBJAUD(*ALL)
Esto hará que cada vez que se utilice el mandato CLRPFM, se grabara una entrada en el diario de auditoria del sistema (QSYS/QAUDJRN).
Posteriormente podemos obtener un listado del uso del mandato ejecutando:
CPYAUDJRNE ENTTYP(CD) OUTFILE(MYLIB/CMD_USE)
Esto volcara las entradas de uso de cualquier objeto, que se este auditando, a un fichero. Después con SQL podremos seleccionarlas:
SELECT CDTSTP, CDJOB, CDUSER, CDNBR, CDPGMLIB, CDPGM, CDCMDS FROM
MYLIB/CMD_USECD WHERE CDCMDS LIKE '%CLRPFM%'
Nota: El mandato CPYAUDJRNE añade los caracteres CD al nombre del fichero de salida.
Ahora ya podemos ver cuando, quien y desde que programa se ha utilizado el mandato CLRPFM. Si el programa es el QCMD, nos indicara que se ha ejecutado desde la linea de mandatos.
CHGOBJAUD OBJ(MYLIB/MYOBJECT) OBJTYPE(*CMD) OBJAUD(*ALL)
También el rendimiento del sistema puede verse afectado, ligeramente, si auditamos muchos objetos muy usados.
CHGOBJAUD OBJ(MYLIB/MYOBJECT) OBJTYPE(*CMD) OBJAUD(*CHANGE)
Mas información:
sábado, 5 de septiembre de 2009
Conexion automatica al AS400
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
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.
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:
sábado, 1 de agosto de 2009
Recuperar configuracion dispositivos
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:
- RTVCFGSRC CFGD(PRT*) CFGTYPE(*DEVD) SRCFILE(QGPL/QCLSRC) SRCMBR(PRINTERS)
- Esto crea el miembro fuente QGPL/QCLSRC.PRINTERS.
- 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.
- Después editar el fuente:
- STRSEU SRCFILE(QGPL/QCLSRC) SRCMBR(PRINTERS)
- Utilizar la opción de búsqueda de string del SEU, para encontrar la dirección IP
- Utilizar la tecla F14 (o el comando F) + Direccion_IP y pulsar F16 para buscarla.
- Si aparece mas de una vez es que esta duplicada.
miércoles, 15 de julio de 2009
Como cargar lista de bibliotecas
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
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
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)
- CRTJRNRCV JRNRCV(MYLIB/JRNRCV0001) THRESHOLD(10000)
- CRTJRN JRN(MYLIB/MYJRN) JRNRCV(MYLIB/JRNRCV0001) MNGRCV(*SYSTEM) DLTRCV(*YES)
sábado, 20 de junio de 2009
¿El AS400 ha muerto?
Repasemos:
- AS/400: AS quiere decir Application Server (¡¡que no estaba tan mal!!)
- AS/400: AS de Advanced Series.
- AS/400e
- eServer
- iSeries
- System i
- Power Systems
Pros:
(espacio intencionadamente en blanco)
Contras:
(espacio intencionadamente en blanco)
sábado, 13 de junio de 2009
Entradas de direccionamiento
En anteriores artículos he hecho referencia a las entradas de direccionamiento de un subsistema (Memoria para subsistema, Asignar prioridad automáticamente y Memoria para trabajos batch), en este artículo intentaré explicar como funcionan y para que las podemos utilizar.
- QIGC: Para trabajos que utilicen el sistema DBCS (Double-byte character set), si esta instalado.
- QS36EVOKE: Para trabajos que utilizan el entorno compatible con IBM S/36.
- QCMD38: Para trabajos que utilizan el entorno compatible con IBM S/38.
- *ANY: Para el resto de trabajos del subsistema.
Enrevesado, no?, veamos ahora como se asigna la clase:
- El trabajo de control del subsistema QBATCH (WRKJOB JOB(QSYS/QBATCH) lee, de la cola/s de trabajos que tiene asignada, los trabajos que están pendientes por ejecutar.
- Recupera el valor del parámetro RTGDTA del trabajo, por omisión QCMDB.
- Ira comparando el valor RTGDTA del trabajo con el valor de CMPVAL de las entradas de direccionamiento, en el orden de la secuencia indicada en "Seq Nbr".
- Cuando encuentre una entrada de direccionamiento que sea igual, ejecutará el programa que se indica en la entrada de direccionamiento. Como el valor por omisión de RTGDTA es QCMDB, la entrada de direccionamiento a asignar es la 9999, que tiene el valor especial *ANY y por tanto llamará al programa QSYS/QCMD, pasando como parámetro el mandato indicado en el parámetro CMD del SBMJOB.
- En la entrada de direccionamiento puede definirse en que posición del parámetro RGTDTA, debe empezar a comparar (CMPVAL), con lo que se amplían las posibilidades de asignación.
- Entonces asignará, al trabajo, los valores de los atributos de ejecución indicados en la clase asignada a dicha entrada. Por omisión, en nuestro ejemplo, asignará los valores de la clase QSYS/QBATCH, o sea RUNPTY(50) y TIMESLICE(5000), para ver los valores de la clase podemos utilizar el mandato DSPCLS CLS(QSYS/QBATCH).
- También asignará el trabajo al pool de memoria donde se ejecutara, esto se indica en el parámetro POOLID de la entrada de direccionamiento, ver también Memoria para subsistema.
Nota: Después de lo visto habréis podido deducir que el interprete de mandatos del OS400 es el programa QSYS/QCMD, tiene similitud con el interprete de comandos de windows que es c:\windows\system32\cmd.exe; y del entorno S/38 es el QSYS/QCL.
Analicemos, ahora, las entradas de direccionamiento del subsistema QINTER:
- QCMDI es para llamar al interprete de mandatos del OS400, pero con la clase QINTER, que asigna por omisión los atributos de ejecución QGPL/QINTER, o sea RUNPTY(20) y TIMESLICE(2000) para trabajos interactivos. Notar la diferencia entre los valores QCMDInteractivo y QCMDBatch. Es por esta entrada de direccionamiento por donde se arrancarán nuestras sesiones 5250.
- 525XTEST esta es una entrada muy especial para ejecutar un programa de test de las pantallas 5250. Esto se conseguía pulsando una combinación de teclas al encender el terminal y aparecía una pantalla de test (programa QARDRIVE).
- El resto de trabajos entrarán con *ANY, que por omisión utiliza la misma clase QINTER.
viernes, 5 de junio de 2009
Colas de trabajos
Este articulo es para entender mejor como un subsistema trabaja con las colas de trabajo que tiene asignadas y como podemos crear colas de trabajo especificas para ciertas tareas. Para ello explicare algunos conceptos relacionados con las colas de trabajo, en los ejemplos nos basaremos en el sistema QBATCH (DSPSBSD SBSD(QBATCH) y opción 6).
- El subsistema tiene un numero de trabajos máximo que puede ejecutar, se cambia con el mandato CHGSBSD SBSD(QBATCH) MAXJOBS(*NOMAX), en este ejemplo estamos diciendo al sistema, que puede ejecutar un numero ilimitado de trabajos en el subsistema, bueno el limite es el rendimiento del sistema, ya podríamos llegar a colapsarlo.
- El subsistema tiene colas de trabajo asignadas y estas tienen un numero de secuencia, o sea el sistema primero mira si hay trabajos en la cola de trabajos de la secuencia 10, después de la 20, ..., hasta la 9999.
- Cada cola de trabajos, asignada a un subsistema, tiene también un numero máximo de trabajos que puede ejecutar. El numero máximo de trabajos de una cola de trabajos se puede cambiar con el mandato CHGJOBQE.
- Para complicarlo un poco más, también pueden definirse en cada cola de trabajo el numero de trabajos máximo por prioridad del trabajo, aunque por lo que he podido ver se usa poco.
- Si el sistema encuentra un trabajo en la cola de trabajos, y no hay ejecutándose el numero máximo de trabajos activos de esa cola y el subsistema tiene menos trabajos que el máximo que tiene definido para el subsistema, entonces entraran tantos trabajos de esa cola hasta que no queden trabajos en la cola o hasta que el subsistema tenga el numero máximo de trabajos.
- Una cola de trabajos puede estar definida en dos subsistemas diferentes, pero solo se asigna al primer subsistema que arranca.
- Una cola puede no estar asignada a algún subsistema (o el subsistema no esta activo), en ese caso nunca entran trabajos de esa cola.
- En este ejemplo supongamos que el subsistema QBATCH puede ejecutar un numero ilimitado de trabajos (*NOMAX).
- En este caso podríamos tener el numero máximo de trabajos ejecutándose de todas las colas porque 10+1+4 = 15.
- Si en la cola QBATCH hay 17 trabajos solo se ejecutaran como máximo 10, aunque el subsistema no este ejecutando ningún trabajo del resto de colas.
- Supongamos que se están ejecutando 3 trabajos de la cola QBATCH y llegan de golpe 160 trabajos a la cola QSRCTXT, de estos entraran 47 trabajos, ya que 3+47=50 es el numero máximo de trabajos activos en el subsistema, quedando el resto en cola.
- Si en ese momento llega un trabajo por la cola QBATCH1X1, esté no podrá entrar hasta que finalice algún trabajo.
- Si finaliza un trabajo que ha entrado por la cola QSRCTXT, entonces entraría el trabajo de la QBATCH1X1, porque tiene una secuencia mas baja que la cola QSRCTXT, cuando termine otro, si no hay ninguno en las colas de las secuencias inferiores a la QSRCTXT, irán entrando más trabajos a medida que finalicen.
- Si mientras llega algún trabajo a la cola QBATCH pasaría antes que los de la QBATCH1X1, ya que su numero de secuencia es menor.
- Si queremos asignar a una cola un numero de trabajos *NOMAX, mi recomendación es ponerla al final, y deberíamos solo enviar a esa cola trabajos de ejecución muy rápida, para no colapsar la cola ni el sistema.
- Prefiero asignar al subsistema un numero máximo de trabajos ilimitado (*NOMAX), pero debemos vigilar que las colas *NOMAX no nos puedan colapsar el sistema, en ese caso no nos quedara más remedio que asignar un numero máximo de trabajos al subsistema que nos pueda soportar el sistema (CHGSBSD), habitualmente empezaríamos por asignar la suma del numero máximo de trabajos de cada cola más un numero n de trabajos, si vemos que es demasiado para el sistema, ir reduciendo el numero máximo de trabajos activos.
viernes, 15 de mayo de 2009
Cola de trabajos independiente
- Crear una nueva cola de trabajos donde someteremos los trabajos que queramos ejecutar secuencialmente:
- CRTJOBQ JOBQ(QGPL/QBATCH1X1) TEXT('Job queue for run one by one')
- Asignar esa nueva cola de trabajos al subsistema QBATCH:
- ADDJOBQE SBSD(QBATCH) JOBQ(QGPL/QBATCH1X1) MAXACT(1) SEQNBR(15)
- El numero de secuencia (SEQNBR) sera el orden de cola que el subsistema utilizará para ejecutar los trabajos.
- Puede ser necesario ampliar el numero máximo de trabajos que se ejecutan en el subsistema QBATCH, y que por omisión es *NOMAX. Para comprobarlo DSPSBSD QBATCH opción 1 y ver el numero máximo de trabajos en el subsistema. Para cambiarlo usar CHGSBSD SBSD(QSYS/QBATCH) MAXJOBS(jobs que existan + 1)
- También podemos modificar las descripciones de trabajo, que creamos conveniente, para que se sometan siempre por esa cola de trabajos:
- CHGJOBD JOBD(mylib/myjobd) JOBQ(QGPL/QBATCH1X1)
lunes, 4 de mayo de 2009
Cola de mensajes QSYSMSG
Podéis encontrar información sobre esta funcionalidad en el IBM Information Center
domingo, 3 de mayo de 2009
Controlar trabajos batch
- Si un trabajo tiene código de terminación 10, puede que haya terminado correctamente.
- Si pulsamos Av.Pag. podremos ver la razón de todos los códigos de terminación.
- Si pulsamos la tecla F6 imprimiremos este mensaje en nuestro el spool.
- Si volvemos a ejecutar el mismo mandato DSPLOG, pero sin el parámetro MSGID, veremos todos los mensajes que el trabajo ha enviado al histórico del sistema.
- Tener en cuenta que el histórico del sistema se limpia automáticamente con las opciones de limpieza del sistema (GO CLEANUP), por omisión solo conserva los últimos 15 días.
miércoles, 29 de abril de 2009
Caja de busqueda en el blog
martes, 28 de abril de 2009
Someter trabajos batch
- Es conveniente indicar un nombre de trabajo (JOB) que nos ayude a controlarlo, ya que por omisión utilizara el valor *JOBD, o sea utilizara el nombre de la descripción de trabajo para todos los trabajos que sometamos sin nombre.
- El trabajo ira a la cola de trabajo (JOBQ) que este especificada en el SBMJOB, por omisión tiene *JOBD que nos indica que cogerá el valor de la cola de trabajo especificada en la descripción de trabajo, indicada en el parámetro JOBD.
- El parámetro JOBD nos indica la descripción de trabajo que utilizará, por omisión tiene el valor *USRPRF, este nos indica que cogerá el valor de la descripción de trabajo del usuario que esta sometiendo el trabajo. Esto se define en el perfil del usuario (DSPUSRPRF parámetro JOBD).
- El valor del parámetro JOBD(*USRPRF) puede forzarse para tener otro valor, al usar el parámetro USER del SBMJOB (por omisión *CURRENT), que indica que usara otro usuario para ejecutar el trabajo, evidentemente hemos de estar autorizados al perfil de usuario a utilizar ya que puede suponer un agujero de seguridad.
- Podemos definir la prioridad que tendrá nuestro trabajo en la cola de trabajos (JOBPTY) y/o en la cola de salida (OUTPTY). Por omisión utiliza el valor *JOBD recuperando este valor de la descripción de trabajo que habitualmente es 5. Podemos indicarle otro valor que puede ir de 1 (alta prioridad) a 9 (baja prioridad), de todas formas tenemos un limite que esta indicado en el parámetro PTYLMT de nuestro perfil de usuario y que por omisión es 3.
- Con el parámetro OUTQ definimos a que cola de salida irán los listados que genere nuestro trabajo, por omisión es *CURRENT con lo que utiliza la cola de salida que tienen asignada el trabajo desde donde se ejecuta el SBMJOB.
- Otro parámetro muy importante es INLLIBL (Initial library list) donde indicaremos en que bibliotecas y en que orden el sistema operativo debe buscar los objetos (programas, archivos, áreas de datos, etc..) que se utilicen en el trabajo. Por omisión tiene el valor *CURRENT y por tanto la lista de bibliotecas sera la misma que la del trabajo desde donde se ejecuta el SBMJOB. Otro valor que puede tener el parámetro INLLIBL, y muy recomendable utilizar, es *JOBD que utilizara la lista de bibliotecas definida en la descripción de trabajo que utilicemos para someter el trabajo.
- El parámetro RTGDTA (Routing data) es importante para asignar los atributos de ejecución del trabajo, esta relacionado con las entradas de direccionamiento que explicaré en un próximo articulo.
- Después vendrían los parámetros relacionados con el log del trabajo: LOG, LOGCLPGM, LOGOUTPUT, JOBMSGQMX. Todos ellos tienen por omisión *JOBD. Habitualmente para que un trabajo deje rastro para que podamos ver los que se ha ejecutado es utilizando los valores LOG(4 00 *SECLVL) LOGCLPGM(*YES).
Para mucha más información:
Gestión de Trabajos en el IBM iSeries InformationCenter
Manual de IBM iSeries Systems management and Work management
viernes, 20 de marzo de 2009
Intercambio archivos entre AS y PC
Archivos formato texto ("planos" de 1 solo campo):
De AS400 a PC, en un directorio ubicado en un servidor de archivos (por ejemplo):
CPYTOIMPF FROMFILE(mylib/myfile) TOSTMF('/QNTC/myserver/mysharedfolder/mytextfile.TXT') MBROPT(*REPLACE) STMFCODPAG(*PCASCII) RCDDLM(*CRLF) DTAFMT(*DLM) STRDLM(*NONE)
Para generar ficheros sin caracter CR (retorno carro) y solo LF (final de linea):
CPYTOIMPF FROMFILE(mylib/myfile) TOSTMF('/home/temp/myascii.txt') MBROPT(*REPLACE) FROMCCSID(37) STMFCODPAG(*PCASCII) RCDDLM(*LF) DTAFMT(*DLM) STRDLM(*NONE) STRESCCHR(*NONE) RMVBLANK(*TRAILING)
FLDDLM('')
Ejemplo para subir un archivo plano de PC (desde un servidor) al AS400:
- Primero averiguar la longitud del archivo TEXTO.TXT, por ejemplo en este caso 132.
- Crear un archivo de destino en el AS400:
- CRTPF FILE(MYLIB/TEXTO) RCDLEN(132)
- Copiar el archivo:
- CPYFRMIMPF FROMSTMF('/QNTC/myserver/mysharedfolder/mytextfile.TXT') TOFILE(MYLIB/TEXTO) MBROPT(*REPLACE) RCDDLM(*CRLF) DTAFMT(*DLM) STRDLM(*NONE) RMVBLANK(*NONE) FLDDLM(*TAB)
CPYTOIMPF FROMFILE(mylib/myfile) TOSTMF ('/QNTC/myserver/mysharedfolder/mycsvfile.CSV') MBROPT(*REPLACE) STMFCODPAG(*PCASCII) RCDDLM(*CRLF) DTAFMT(*DLM) STRDLM('"') FLDDLM(';')
Tener en cuenta que la ruta "/QNTC/myserver/mysharedfolder/" solo funciona si:
- La carpeta compartida del servidor //myserver/mysharedfolder es accesible desde la red.
- El servicio Netserver del AS400, esta correctamente configurado.
- El usuario y la contraseña que lanza el mandato CPY???IMPF es igual en el AS400 y en el servidor de archivos.
viernes, 6 de marzo de 2009
Comprimir archivos en IFS
Como hacerlo, pues ahí va un ejemplo:
- Desde la línea de mandatos tecleamos STRQSH, o simplemente QSH.
- En la pantalla de "QSH Command Entry" teclear:
- jar -cfM /home/compress_folder/myfile.zip /home/myfolder/myfile1.txt
- jar -cfM /home/compress_folder/mydirectory.zip /home/folder_to_compress
- PGM
- ...
- QSH('jar -cfM /home/compress_folder/myfile.zip /home/myfolder/myfile1.txt /home/myfiles/myfile2.csv')
- ...
- ENDPGM
miércoles, 25 de febrero de 2009
Take Control of DB2 for i Performance with V6R1 System i Navigator
Take Control of DB2 for i Performance with V6R1 System i Navigator
y otro articulo relacionado:
Making the Best Use of V6 SQL OLAP Functions
lunes, 9 de febrero de 2009
Monitorizar F3 en mandato
Para ello solo hemos de monitorizar el mensaje CPF6801 en el programa, por ejemplo:
PGM
....
?DSPLOG
MONMSG MSGID(CPF6801) EXEC(GOTO END)
...
END:
RETURN
ENDPGM
martes, 3 de febrero de 2009
Calcular tamaño objeto
lunes, 26 de enero de 2009
Ejecutar comandos DOS desde AS400
Podemos por ejemplo ejecutar un .BAT o un .CMD pasándole parámetros (solo de ida)
Un ejemplo para abrir la web de Google con el navegador Interner Explorer:
STRPCO
MONMSG MSGID(IWS4010)
STRPCCMD PCCMD('"C:\Archivos de programa\Internet Explorer\IEXPLORE.EXE" www.google.com')
Otro ejemplo para ejecutar el programa c:\Myscripts\program1.BAT pasándole un parámetro:
DCL VAR(&PCCMD) TYPE(*CHAR) LEN(512)
DCL VAR(&VAR1) TYPE(*CHAR) LEN(256)
CHGVAR VAR(&VAR1) VALUE('VALOR1')
CHGVAR VAR(&PCCMD) VALUE('C:\Myscripts\program1.BAT' *BCAT &VAR1)
STRPCO
MONMSG MSGID(IWS4010)
STRPCCMD PCCMD(&PCCMD)
Despues deberiamos controlar la ejecucion del programa
viernes, 16 de enero de 2009
Bibliotecas productos instalados
Para ello podemos utilizar el mandato DSPSFWRSC con salida a pantalla, impresora o fichero, si ejecutamos DSPSFWRSC OUTPUT(*) nos aparecerá la siguiente pantalla:
También hemos de tener en cuenta que los productos, cada vez más, utilizan directorios del IFS.
viernes, 9 de enero de 2009
QPFRADJ=0 ???
QPFRADJ=0 ???
¡¡ Cuidado no entréis en un bucle de blogs !!
jueves, 8 de enero de 2009
jueves, 1 de enero de 2009
Hitos históricos AS/400
1988: Junio 21: IBM anuncia el AS/400, la abreviatura de Application Server/400, que junto con más de 1000 paquetes de software es el anuncio con más aplicaciones simultáneas de la historia de los ordenadores. (En el momento en que el primer AS/400 se envió, más de 2500 aplicaciones estaban disponibles)
1989: Se anuncia el B70, el nuevo modelo de la gama alta junto con impresoras matriciales de alta velocidad para ser usadas con la familia AS/400
1990: La línea de AS/400 se amplía con 2 procesadores de bajo coste diseñados para pequeños negocios o departamentos para grandes empresas
1991: Se anuncia un nuevo modelo de punto de entrada AS/400 junto con la V2R1 de OS/400 por 12.000 $
1992: IBM envía su AS/400 número 200.000, un 9406 modelo E35 y se instala en una de las principales empresas de distribución de los Países Bajos: Heineken
1993: Un nuevo modelo F que proporciona hasta un 60% de potencia y ofrece una mejora en precio/rendimiento de un 26%
1994: IBM envía su AS/400 número 250.000 modelo F80 a la compañía Coca Cola Company en Bélgica
1994: IBM presenta la nueva generación de AS/400 llamada AS/400 Advanced Series
1995: Se anuncia el AS/400 Advanced Portable, una versión compacta y de bajo coste del AS/400
1995: IBM convierte el procesador del AS/400 de CISC a RISC
1996: La compañía lanza el AS/400 Advanced Entry system, el primero de ellos (y el número 400.000 de los AS/400 vendidos) es presentado en Rochester a Grez LeMond, el ganador por 3 veces del tour de Francia y además un pequeño empresario.
1996: El OS/400 (V3R2 y V3R7) se convierte en el primer sistema operativo que es certificado como Year 2000 ready por la ITAA (Information Technology Association of America)
1997: IBM anuncia la nueva familia de AS/400e servers para ayudar a las pequeñas empresas a aprovechar las ventajas de las oportunidades de negocio en Internet
1998: Se introduce la tecnología SOI (Silicon-on-insulator), marcando un avance fundamental en la manera de construir los chips.
1998: IBM entrega un AS/400 a un cliente cada 12 minutos de cada día laborable durante el año 1998.
1999: El AS/400 es el ordenador de carácter comercial multi usuario más popular con más de 700.000 sistemas instalados en 150 países.
1999: Se anuncia la V4R4 de OS/400 con más de 3,2 millones de nuevas líneas de código escritas principalmente para e-business
2000: El AS/400 cambia de nombre y se convierte en IBM eServer iSeries e IBM anuncia el primer servidor de aplicaciones Web en la familia eServer.
2000: IBM comienza el lanzamiento de la nueva línea de AS/400e con la primera producción mundial de microchips hechos de transistores SOI y cableado de cobre.
2001: World Access, un proveedor de servicios de telecomunicaciones, compra el sistema eServer iSeries más grande (un i840) para procesar facturas para más de 100 millones de llamadas telefónicas al día.
2002: IBM anuncia el microprocesador POWER4. El sistema i890 de 32 vías ejecutándose en V5R2 dobla la capacidad de proceso de la anterior línea de producto iSeries.
2003:Como parte de una amplísima transformación de la familia iSeries en más de una década, IBM anuncia el 825 y el 870 junto al 890 en la gama alta. Usados por más de 200.000 clientes alrededor del mundo, el IBM eServer iSeries es uno de los servidores más populares de la industria.
2004: IBM anuncia el eServer i5, los primeros sistemas en ser gestionados por los microprocesadores POWER5. También cambia el nombre de OS/400 a i5/OS y libera la V5R3.
2005: IBM anuncia la estrategia OnDemand y comienza a lanzar al mercado las herramientas de virtualización e integración.
2006: En Enero, la compañía saca al mercado la línea IBM System i5 con procesadores POWER5+ y la V5R4 de i5/OS pero después elimina el 5 del i5 comenzando la era System i.
2007: IBM anuncia los microprocesadores POWER6 y ofrece unos nuevos modelos System i 515 y 525 Express con el precio basado en número de usuarios.
2008: i5/OS se convierte en un sistema operativo soportado por las soluciones IBM BladeCenter
2008: El System i se unifica con el System p para convertirse en Power Systems. El nombre del sistema operativo cambia a IBM i