16
SUMARIO Colaboraciones Introducción Lenguaje Procedimientos SQL 3 Estructuras Condicionales SQL PL 6 ¿Puede confiar en todos los Programas con Trigger? 9 Novedades Accesos a diferentes Plataformas desde el System i 10 Consulting Eliminar todos los programas en una Librería 12 Consultar un archivo con un punto (.) en el nombre 12 Caso práctico de UNION ALL 12 Cómo ver qué miembro fuente crea un archivo de pantalla, impresora, físico, lógico... 13 Cómo enviar por FTP un archivo de la QTEMP a un sistema remoto 13 COLABORACIONES Introducción Lenguaje Procedimientos SQL Cómo enviar por FTP un archivo de la QTEMP a un sistema remoto Estructuras Condicionales SQL PL Información sobre Power Systems, incluidos AS/400, iSeries y System i Año 30 - Noviembre-Diciembre 2016 Nº 312 Precio: 7 Euros El lenguaje de procedimientos de SQL y PL SQL, es un lenguaje procedi- mental propietario que IBM ha diseñado para trabajar con la familia de sistemas de gestión de base de datos DB2. Creo que es una buena idea para cualquier persona que trabaja con DB2 aprender SQL PL. Si sabe COBOL, RPG y CL, le resultará fácil de aprender. El SQL PL está disponible para todos bases de datos DB2s. El conocimiento de SQL PL que adquiera al trabajar con DB2 i se aplica en gran parte en las Mai- frames y versiones LUW (Linux-Unix- Windows). PREGUNTA USUARIO: Tengo un problema con un script de FTP. Deseo enviar un archivo en QTEMP a un sistema remoto, pero la secuencia de mandatos intenta enviar el archivo de QGPL en su lugar. El mandato PUT no dice qué biblioteca para enviar el archivo de porque nuestras normas prohíben el uso de hard-code nombres de librerias. Cualquier sugerencia será agradecida. RESPUESTA ATT: Felicito a us- ted y otras personas sabias en tu tienda para proscribir el hard-code nombres de librerias. La lista de bibliotecas es una característica maravillosa de IBM i, la cual está ausente en otros sistemas de base de datos. Sin embargo, QTEMP es un animal diferente. Recientemente di una breve intro- ducción al lenguaje de procedimientos de SQL o PL SQL, un lenguaje proce- dimental que trabaja con la familia de sistemas de gestión de base de datos de DB2. Hoy presento las estructuras de los condicionales IF y CASE. Si lo desea, podrá conocerlas en pocos mi- nutos. El PL SQL tiene dos estructuras de toma de decisiones, y se aprenden muy fácilmente. IF La estructura IF tiene tres formas: • IF -- THEN -- END IF • IF -- THEN -- ELSE -- END IF • IF -- THEN -- ELSEIF -- THEN ELSE -- END IF Sigue en página 3 Sigue en página 13 Sigue en página 6

Introducción Lenguaje Procedimientos SQL Estructuras ... · de procedimientos de SQL o PL SQL, un lenguaje proce-dimental que trabaja con la familia de sistemas de ges-tión de base

  • Upload
    others

  • View
    29

  • Download
    0

Embed Size (px)

Citation preview

SUMARIOColaboracionesIntroducción Lenguaje Procedimientos SQL 3 Estructuras Condicionales SQL PL 6 ¿Puede confiar en todos los Programas con Trigger? 9

NovedadesAccesos a diferentes Plataformas desde el System i 10

ConsultingEliminar todos los programas en una Librería 12 Consultar un archivo con un punto (.) en el nombre 12 Caso práctico de UNION ALL 12 Cómo ver qué miembro fuente crea un archivo de pantalla, impresora, físico, lógico... 13 Cómo enviar por FTP un archivo de laQTEMP a un sistema remoto 13

COLABORACIONES

Introducción Lenguaje Procedimientos SQL

Cómo enviar por FTP un archivo de la QTEMP a un sistema remoto

Estructuras Condicionales SQL PL

Información sobre Power Systems, incluidos AS/400, iSeries y System i

Año 30 - Noviembre-Diciembre 2016 Nº 312 Precio: 7 Euros

El lenguaje de procedimientos de SQL y PL SQL, es un lenguaje procedi-mental propietario que IBM ha diseñado para trabajar con la familia de sistemas de gestión de base de datos DB2. Creo

que es una buena idea para cualquier persona que trabaja con DB2 aprender SQL PL. Si sabe COBOL, RPG y CL, le resultará fácil de aprender.

El SQL PL está disponible para todos

bases de datos DB2s. El conocimiento de SQL PL que adquiera al trabajar con DB2 i se aplica en gran parte en las Mai-frames y versiones LUW (Linux-Unix-Windows).

Pregunta usuario: Tengo un problema con un script de FTP. Deseo enviar un archivo en QTEMP a un sistema remoto, pero la secuencia de mandatos intenta enviar el archivo de QGPL en su lugar. El mandato PUT no dice qué biblioteca para enviar el archivo de porque nuestras normas prohíben el uso de hard-code nombres de librerias. Cualquier sugerencia será agradecida.

Respuesta att: Felicito a us-ted y otras personas sabias en tu tienda para proscribir el hard-code nombres de librerias. La lista de bibliotecas es una característica maravillosa de IBM i, la cual está ausente en otros sistemas de base de datos.

Sin embargo, QTEMP es un animal diferente.

Recientemente di una breve intro-ducción al lenguaje de procedimientos de SQL o PL SQL, un lenguaje proce-dimental que trabaja con la familia de sistemas de gestión de base de datos de DB2. Hoy presento las estructuras de los condicionales IF y CASE. Si lo desea, podrá conocerlas en pocos mi-nutos.

El PL SQL tiene dos estructuras de

toma de decisiones, y se aprenden muy fácilmente.IF

La estructura IF tiene tres formas:• IF -- THEN -- END IF• IF -- THEN -- ELSE -- END IF• IF -- THEN -- ELSEIF -- THEN ELSE -- END IF

Sigue en página 3

Sigue en página 13

Sigue en página 6

Finalmente un producto que proporciona acceso SQL total y fácil a las bases de datos remotas desde cualquier nivel de lenguaje de System i.

¡Acceda fácilmente a todas sus bases de datos desde un programa RPG!

Hasta ahora, fusionar y utilizar datos de System i y datos remotos era una perdida de tiempo y nada sencillo. La tecnología utilizada por el DBU RDB está ahora disponible para que los programadores puedan integrarla en sus aplicaciones y vincular datos remotos a su sistema.

Acceso SQL total a BD remotas desde un programa RPG (y otros lenguajes).

RDB Connect

RDB Connect: Nueva función adicional del DBU

Características principales Comparta rápidamente datos entre distintas plataformas.

Utilice las APIs del RDB Connect para ejecutar consultas SQL para acceder a bases de datos remotas.

Permite ejecutar cualquier tipo de consulta SQL. Importar y exportar datos remotos desde y hacia el System i

Comunicarse con bases de datos remotas desde programas RPG, COBOL o CL.

Puede utilizarse en programas batch o interactivos.

Posibles usos: Sincronizar datos entre ordenadores Generar informes de datos de ordenadores remotos

Eliminar transferencias de datos o duplicación de entradas de registros

Leer, insertar, actualizar y borrar registros de manera programada.

La integración de datos con RDB Connect ayudará a mejorar la productividad. Ya no tiene que esperar a la actualización de los datos en bases de datos remotas. RDB Connect hace esto instantáneamente por usted, permitiéndole acceder a datos actuales y precisos de sus sistemas remotos. Le permite acceder y compartir información a través de múltiples plataformas. Ahora puede generar informes y utilizar la información como quiera y cuando quiera.

MySQL Microsoft SQL Server

Oracle Postgre

DB2

Deseamos realizar una Prueba Gratuita,, en nuestra propia máquina para conocer las propiedades de la aplicación DBU

Nombre ...........................................................................................Tel. ( ) .............................. Empresa ........................................................................................ Fax ( ) .............................. CP............. Ciudad.....................................................E-mail ........................................................

Soluciones para AS/400, iSeries, System i, IBM i y Power Systems

COLABORACIONES

3 Noviembre-Diciembre 2016ATTITUDES Nº 312

El lenguaje de procedimientos de SQL y PL SQL, es un lenguaje procedimental propietario que IBM ha dise-ñado para trabajar con la familia de sistemas de gestión de base de datos DB2. Creo que es una buena idea para cualquier persona que trabaja con DB2 aprender SQL PL. Si sabe COBOL, RPG y CL, le resultará fácil de aprender.

El SQL PL está disponible para todos bases de datos DB2s. El conocimiento de SQL PL que adquiera al tra-bajar con DB2 i se aplica en gran parte en las Maiframes y versiones LUW (Linux-Unix-Windows). Puede utilizar SQL PL para crear desencadenadores (triggers), funcio-nes y procedimientos almacenados. También puede utili-zarlo para construir declaraciones compuestas dinámicas, que pueden almacenar en los miembros del archivo físico fuente y el IFS y ejecutar el mandato Run SQL declaracio-nes (RUNSQLSTM)...

Entonces, ¿Cómo es el SQL PL? Es como el RPG de alguna manera. Por ejemplo:

· Tiene declaraciones de datos.· No distingue mayúsculas de minúsculas.· Cuenta con estructuras de decisión.· Cuenta con estructuras de bucle.· Tiene puntos y comas.

Y también no es como el RPG en algunos aspectos. Por ejemplo:

· No tiene subrutinas.· Tiene fuertes características de mensajería. (¡Sí!)· No se limita a la plataforma de una sola base de datos.

El bloque de edificio básico de SQL PL es la senten-cia compuesta. Le diré algunas cosas sobre declaraciones compuestas. A continuación le mostraré un ejemplo.

· Una sentencia compuesta comienza con la palabra BEGIN y termina con la palabra END. Entre estos dos puede incluir declaraciones y código de procedimiento.

· Si lo desea, puede indicar un nombre para una sen-tencia compuesta. La etiqueta finaliza con dos puntos y precede a BEGIN. También puede colocar la etiqueta, sin los dos puntos que, después del correspondiente FINAL. La etiqueta puede utilizarse para calificar dentro de un bloque.

· Puede anidar sentencias compuestas dentro de la sec-ción de procedimientos de una sentencia compuesta.

· Una sentencia compuesta puede ser ATÓMICA (tra-tado como una unidad completa) o NO ATÓMICA (series de sentencias independientes).

Ya tenemos suficientes hechos por ahora. Veamos un ejemplo.

Breve introducción al Lenguajede Procedimientos SQL

COLABORACIONES

4 Noviembre-Diciembre 2016ATTITUDES Nº 312

create trigger ValidateOrder no cascade before insert on SalesOrderHeaders referencing new row as n for each row mode db2sql

begin atomic

declare v_Status dec(1); declare v_Parent dec(5);

-- check the customer for credit hold select Status, parent into v_Status, v_Parent from Customers where AccountNumber = n.CustomerID; if v_Status <> 0 then signal sqlstate '85510' set Message_text = 'Customer is on

credit hold'; end if;

-- check the parent for credit hold select Status into v_Status from Customers where AccountNumber = v_Parent; if v_Status <> 0 then signal sqlstate '85511' set Message_text = 'Parent customer

is on credit hold'; end if;

end

COLABORACIONES

5 Noviembre-Diciembre 2016ATTITUDES Nº 312

El propósito de este trigger es evitar la venta a los clientes que están en espera de crédito. La sentencia com-puesta comienza con BEGÍN ATOMIC. Esto significa que la sentencia compuesta entera debe ser tratada como un todo. Si hay múltiples cambios de base de datos bajo con-trol de compromiso y uno de ellos falló, todos los cambios se deshacen. En este caso, una sentencia no atómica pro-bablemente funcionaría igual de bien.

Esta sentencia compuesta declara dos variables que contienen los campos STATUS y PARENT de la tabla maestro de clientes. Coloco el prefijo de los nombres de variables con V_ para distinguir entre columnas de la base de datos (campos). Una característica de SQL PL interesante que puedo mezclar variables y nombres de las columnas como sea necesario. No hay necesidad de prefi-jo con dos puntos en las variables, como requieren el RPG y COBOL que se haga.

El primer SELECT comprueba el estado del cliente. Un estado distinto de cero significa que un cliente dispone de crédito. Si el cliente no está en espera de crédito, el segundo SELECT comprueba que la empresa matriz (si existe) también tenga crédito disponible.

El trigger indica un estado de retención de crédito en-viando un error a la persona que llama. El SQL genera un código 85510 que significa que el cliente tiene el crédito retenido. El código SQL 85511 significa que la empresa matriz tiene el crédito retenido. A continuación muestra el error que tengo cuando he intentado crear un pedido de un cliente que usa SQL pantalla verde.

Diagnostic message SQL0723

SQL trigger VALIDATEORDER in MYLIB failed with SQLCODE -438 SQLSTATE 85510.

An error has occurred in a triggered SQL statement in trigger VALIDATEORDER

in schema MYLIB. The SQLCODE is -438, the SQLSTATE is 85510, and the message

is Customer is on credit hold.

Por cierto, si te asusta la palabra propietario, tener en cuenta que Transact-SQL, también llamado T-SQL (Mi-crosoft y Sybase) y PL/SQL (Oracle) también son pro-pietarios, y eso no impide mucha gente los utilice todos los días.

COLABORACIONES

6 Noviembre-Diciembre 2016ATTITUDES Nº 312

Recientemente di una breve introducción al lenguaje de procedimientos de SQL o PL SQL, un lenguaje proce-dimental que trabaja con la familia de sistemas de ges-tión de base de datos de DB2. Hoy presento las estructu-ras de los condicionales IF y CASE. Si lo desea, podrá conocerlas en pocos minutos.

El PL SQL tiene dos estructuras de toma de decisio-nes, y se aprenden muy fácilmente.

IFLa estructura IF tiene tres formas:• IF -- THEN -- END IF• IF -- THEN -- ELSE -- END IF• IF -- THEN -- ELSEIF -- THEN -- ELSE -- END IF

No explico la lógica, ya que funcionan idénticamente en cualquier RPG. Sin embargo, la colocación de puntos y comas es diferente, así que analicemos.· No coloque punto y coma después de THEN y ELSE.

· Coloque una instrucción después de THEN y ELSE. Esta afirmación puede ser una simple declaración o una declaración compuesta.

· Terminar cada declaración simple, incluyendo sim-ples sentencias compuestas, con un punto y coma.

· Terminar END IF con un punto y coma sólo cuando sigue algo más.

Echemos un vistazo a un par de ejemplos. Este tri-gger se dispara antes de que un item se agrega a la tabla maestra de artículo. Si la unidad de medida es kilogra-mos, el trigger asegura que el peso es positivo o nulo.

create trigger ItemInsert no cascade before insert on items referencing new row as n for each row mode db2rowif n.Stocking_UOM = 'KG' and n.

Estructuras Condicionales SQL PL

COLABORACIONES

7 Noviembre-Diciembre 2016ATTITUDES Nº 312

weight <= 0 then signal sqlstate '86100' set Message_text = 'Weight

must be positive or null';end if

Si intenta insertar un elemento con un peso de -4 ki-logramos, el sistema prohibe la inserción y devuelve SQL estado 86100. Observe que no hay ningún punto y coma después del IF y del END, pues nada sigue. Aquí está una versión más desarrollada del ejemplo anterior, mostrando la sentencia anillada del IF y del END.

create trigger iteminsert no cascade before insert on items referencing new row as n for each row mode db2rowif Stocking_UOM = 'KG' then if n.weight <= 0 then signal sqlstate '86100' set Message_text = 'Weight

must be positive or null'; end if;else signal sqlstate '86199' set Message_text = 'Invalid

unit of measure';end if

CaseLa estructura del CASE, como la expresión CASE

que probablemente use en instrucciones SELECT, tiene dos formas, una forma simple y un formulario de bús-queda:

• CASE value WHEN -- ELSE -- END CASE• CASE WHEN -- ELSE -- END CASE

Si no está familiarizado con el CASE simple y busca-do, le recomiendo que leas este artículo de Skip Marche-sani: http://www.itjungle.com/fhg/fhg031010-story01.html

Se trata de la expresión CASE, pero la explicación de CASE simple y CASE buscado se aplica también a la es-tructura del CASE. Tenga en cuenta que la estructura de SQL PL CASE y la expresión CASE difieren en al me-nos tres formas:

. La expresión CASE devuelve un valor, como si fue-se una función. El CASE de PL SQL es una estructura de control.

· PL SQL no requiere de ELSE, pero si no WHEN co-rresponde y no hay ningún ELSE, el CASE falla con SQLSTATE 20000. La expresión CASE devuelve un null

COLABORACIONES

8 Noviembre-Diciembre 2016ATTITUDES Nº 312

cuando no WHEN corresponde y no hay ningún ELSE.

· Debe usar END CASE, no END, para terminar el SQL PL CASE. Puede terminar la expresión CASE con END o END CASE, pero si agrega un nombre de corre-lación, como generalmente ocurre, tiene que terminar la expresión CASE con END.

Aquí está el mismo disparador, reforzado un poco más que antes.

create trigger ItemInsert no cascade before insert on items referencing new row as n for each row mode db2rowcase when Stocking_UOM = 'KG' then if n.weight <= 0 then signal sqlstate '86100' set Message_text =

'Weight must be positive or null'; end if; when Stocking_UOM in ('CM', 'M')

then if n.length <= 0 then signal sqlstate '86100' set Message_text =

'Length must be positive or null'; end if; else signal sqlstate '86199' set Message_text = 'Inva-

lid unit of measure';end case

IF y CASE no son difíciles de aprender. No puedo pensar de ninguna que manera los diseñadores de SQL PL podrían hacerlo más fácil.

Nº ejemplares: 8.500Precio ejemplar: 7,00 euros (Anual 60 )Difusión: Andorra, Portugal, Italia y EspañaPublicidad: Tel. 93 319 17 23

Edita: American Top Tools, S.L.Via Laietana, 2008003 Barcelona

Tel. 93 319 16 12 - Fax 93 319 17 55E-mail: [email protected]

Depósito Legal: B-18.455-1993 Imprime Graficas AltagrafPublicación: 10 ediciones

Alcance: 00/58

COLABORACIONES

9 Noviembre-Diciembre 2016ATTITUDES Nº 312

Si ha visto de nuevo "Troya", o si estaba prestando atención la historia cuando estaba en la escuela, ya sabe que los Griegos trajeron a la ciudad de Troya el regalo de un gran caballo de madera. Por supuesto, sin saberlo los troyanos, el caballo estaba lleno de soldados y tan pronto como el armatoste se introdujo en la ciudad de Troya, los soldados salieron del caballo y tomaron la ciudad.

Estos días de desenfrenados virus informáticos, gusa-nos y otros programas maliciosos moviéndose alrededor de la red Internet, el concepto del Caballo de Troya está vivito y coleando. Pero quizás piensa, yo estoy aquí senta-do trabajando en mi IBM totalmente seguro y garantizado y con el sistema operativo más seguro en el mundo! Estas cosas no me pueden afectar.

Piense de nuevo. Un programa malicioso puede estar todavía grabado e instalado en el sistema, oculto, esperan-do el momento adecuado salir y golpear. ¿Cómo? Con un programa de activación (trigger).

Cuando me enteré de esto, pensé lo mismo o muy si-milar a la mayoría de ustedes, que esto no iba conmigo. Pero entonces me leí el informe de auditoría que IBM in-cluye en el IBM i OS. Me sorprendió el número de progra-mas Trigger que se instalan en nuestro cerrado sistema de desarrollo. Pensé que saldría el informe vacío.

Pero recibí un informe de once páginas con informa-ción de más de 110 programas gatillo de los que no tenía ni idea.

Es cierto que la mayoría de ellos parecen ser parte

del IBM i OS, pero encontré algunos desencadenantes de aplicación (triggers) que no sabía que estaban allí. Afortu-nadamente, encontré que ninguno de estos era malévolo,

pero tuve mis dudas por un tiempo ya que uno de ellos fue escrito por un programador que no inspiraba confianza.

El IBM i OS (sistema operativo) incluye un mandato que permite hacer un seguimiento de los programas de trigger que están instalados en su sistema. El mandato per-mite ejecutar una lista maestra de todos los programas de activación y luego, periódicamente, sólo es necesario una lista de los programas de trigger que son nuevos o han cambiado.

Para empezar en la comprensión de los programas de activación en su sistema, ejecute el siguiente comando:

PRTTRGPGM LIB(*ALL) CHGRPTONLY(*NO) Este mandato producirá un informe de la base de to-

dos los programas de activación en su sistema. Revise el listado de cerca y compruebe lo que cada uno de estos programas hace. Si ve un programa que dudoso, rastrear el código fuente y asegúrese de saber de lo que se trata.

Si el programa es de un proveedor de software de ter-ceros, obtener una declaración del vendedor de software que describa lo que está haciendo el programa. Dado que los programas de trigger reaccionan a eventos, son bue-nos candidatos para acciones maliciosas a la espera de la acción correcta que ocurra en su sistema. También hay que prever que el comando puede tomar mucho tiempo para funcionar y usted podría querer considerar ejecutarlo en batch. Una vez que dispone de su informe básico, en-tonces puede ejecutar periódicamente el mismo mandato simplemente cambiando el parámetro CHGRPTONLY a *YES. Esta versión del informe lista los cambios cambios y los nuevos programas de activación en su sistema.

¿Puede confiar en todos losProgramas con Trigger?

NOVEDADES

10 Noviembre-Diciembre 2016ATTITUDES Nº 312

La necesidad de acceder a diferentes plataformas tec-nológicas, desde el System i, se está convirtiendo en parte integral de la estrategia para aumentar la productividad e implementar procesamiento en tiempo real en un entorno de base de datos distribuida. El software de RDB Connect de ProData proporciona la capacidad de aprovechamiento de las aplicaciones ya desarrolladas en la Empresa para lograrlo con un método que se basa en la tecnología exis-tente e incorpora las ideas de innovación.

RDB Connect es una colección de mandatos y fun-ciones que permite el acceso a nivel de registro a datos remotos utilizando RPG, COBOL ó CL. El RDB Connect se ejecuta en System i a partir de la versión del sistema operativo OS/400 V4R5M0. Requiere una conexión de IP al servidor remoto en el que se halla la base de datos a la que se quiere acceder. Una vez configurado RDB Connect permitirá el acceso SQL a bases de datos remotas desde un

programa RPG, o cualquier otro lenguaje, que permita:

· Intercambio de datos entre diferentes plataformas· Uso de RDB Connect APIs (Application Program In-

terfaces) para ejecutar consultas SQL accediendo a datos remotos

· Ejecutar cualquier consulta SQL· Importar y exportar los datos remotos a/desde un Sys-

tem i· Comunicarse con bases de datos remotas directamente

desde programas RPG, COBOL y CL · Tanto en el proceso interactivo o como en el proce-

so por lotes, la integración de datos del RDB Connect ayudará a aumentar la productividad. Ya no es necesario esperar a que los datos de bases de

datos remotas se actualicen. El RDB Connect lo hace al instante, dando acceso a una información precisa y actual

Accesos a diferentes plataformasdesde el System i

mediante el RDB CONNECT

NOVEDADES

11 Noviembre-Diciembre 2016ATTITUDES Nº 312

de los sistemas remotos. Permite acceder rápidamente y compartir datos en múltiples plataformas. Ahora usted puede generar informes y utilizar la información como y cuando lo desee.

Por fin, un producto que ofrece un fácil y completo ac-

ceso SQL a bases de datos remotas en todos los Lenguajes de Alto Nivel que permite el System i. Puede tener acceso fácilmente a todas sus bases de datos desde un programa RPG! La confianza de ProData en este software destaca por el uso del RDB Connect en la incorporación al soft-ware DBU RDB que se incluye en el editor de ficheros DBU.

La tecnología utilizada en el DBU RDB está ahora disponible para que sus programadores lo integren en sus aplicaciones y se relacionen con los datos remotos de otros sistemas. RDB Connect puede configurarse para ac-ceder remotamente y compartir datos de las plataformas:

· MySQL · MicroSoft SQL Server · Oracle · Postgre · DB2

· Cualquier base de datos remota que disponga de un dri-ver ODBC ó JDBC asignado al System i en que esté ins-talado el RDB Connect.

El RDB Connect es un producto independiente que

ofrece un procedimiento API para el uso de consultas SQL para acceder a datos remotos. Una implementación de RDB Connect contendrá una o más aplicaciones, una biblioteca de RDB Connect y uno o más “database dri-vers”.

La biblioteca básica, independiente de las aplicaciones y base de datos remota, actúa como "intérprete" entre las aplicaciones y los controladores de base de datos “data-base drivers”, mientras que los controladores de base de datos contienen los detalles específicos de la base de datos remota.

Por lo tanto, un programador puede escribir aplicacio-nes que usen tipos standard y características sin preocu-parse por los detalles específicos de cada base de datos remota que puedan encontrar en las aplicaciones. Asimis-

mo, los implementadores de controlador de base de datos sólo necesitan saber cómo adjuntarse a la biblioteca bá-sica. Esta modularidad del RDB Connect se presta bien para lograr lo siguiente:

· Sincronizar los datos entre distintas bases de datos· Generar un proceso de información de datos que re-

siden en sistemas remotos· Eliminar las transferencias de datos o duplicar la en-

trada de datos· Leer, insertar, actualizar y eliminar registros sin in-

tervención interactiva Una vez que el software RDB Connect está instalado

y configurado, los siguientes puntos son una muestra de mandatos que se pueden utilizar:

· El mandato de ejecutar una declaración RDB SQL (RDBRUNSQL) proporciona una interfase para ejecutar mandatos en las bases de datos remotas.

· El mandato de importar base de datos remota (RD-BIMPORT) proporciona una interfase para ejecutar man-datos en la base de datos remota y devolver los resultados a un archivo de base de datos local.

· El mandato de recuperar la lista de tablas (RDBTA-BLES) proporciona una lista de tablas disponibles en el servidor remoto. La lista se basa en el parámetro de tabla.

· El mandato para la lista de recuperar campos (RDB-

FIELDS) proporciona una lista de campos para una tabla determinada. La lista se basa en la sentencia Select en-trada.

· RDBConnect incluye un conjunto de funciones que pueden ser incorporadas en un programa ILE/COBOL o RPG/ILE. Estas funciones permiten al programa obtener acceso completo a la base de datos remota, como si fuera local al System i.

Estos mandatos y mucho más se explica así como otro detalles se incluyen en la documentación del software dis-ponible en nuestra página web, www.att.es

12 Noviembre-Diciembre 2016ATTITUDES Nº 312

CONSULTING

Pregunta usuario:Cuando manipulo encima de RDi, el registro de mandatos (Commands Log tab) en el explorador de

sistemas remotos (RSE) está vacía. Esto significa que hay ningún cuadro en el cual yo puedo teclear un mandato hasta que se ejecute un comando. ¿Cómo ejecutar un comando si no hay ningún cuadro?

Pregunta usuario:Utilizando SQL, ¿cómo puedo consultar un archivo que tiene un punto en el nombre?

Pregunta usuario: Tenemos dos archivos físicos, uno antes del

inventario, el otro después de hacer el inventario. Los campos son los mismos en cada archivo. Tenemos que demostrar algo que está en el archivo 1 y que no está en el archivo 2. Y también algo que está en el archivo2 y que no está en el archivo 1. ¿Esto es posible en una instrucción SELECT de SQL?

Respuesta attHaga clic en Objects debajo de la conexión en el panel

de navegación y seleccione Run Command. Hay mucho que aprender acerca de RDi, pero vale la pena.

Respuesta attPara consultar el archivo, escriba el nombre entre comi-

llas.

select F00001, K00001, F00002 from qs36f."J.MAST" where F00001 = 'A' and F00002 like '%3%'

También puede crear un alias y hacer consulta.

create alias QS36F/JMAST for QS36F/"J.MAST" (M060127)select . . . from qs36f/jmast . . .

pROpuesta usaRIO IBMEl mandato Delete Program (DLTPGM) acepta un valor genérico, pero no el valor especial *ALL, por nombre del programa. Sin embargo, puede utilizar el mandato Remove Link (RMVLNK) para eliminar todos los programas en una biblioteca

rmvlnk '/QSYS.LIB/MYLIB.LIB/*.PGM'

13 Noviembre-Diciembre 2016ATTITUDES Nº 312

Pregunta usuario:El mandato Display Program (DSPPGM) muestra el archivo de código fuente y el miembro en que se creó

un programa. ¿Cómo ver que miembro fuente creó un archivo de pantalla o impresora, un archivo físico o lógico, etc.?

Pregunta usuario:Muchos de nuestros programas RPG tienen hard-coded nombres de biblioteca en sentencias SQL. Hay

alguna forma de seleccionar una biblioteca en tiempo de ejecución (run time), o ¿tengo que quitar la calificación?

Pregunta usuario:Tengo un problema con un script de FTP. Deseo

enviar un archivo en QTEMP a un sistema remoto, pero la secuencia de mandatos intenta enviar el archivo de QGPL en su lugar. El mandato PUT no dice qué biblioteca para enviar el archivo de porque nuestras normas prohíben el uso de hard-code nombres de librerias. Cualquier sugerencia será agradecida.

Respuesta attPuede utilizar el mandato Work with Object

(WRKOBJ). Entre en la opción 8 y pulse F4 para ampliar. Cambiar el campo detalle de *FULL a *SERVICE.

Si lo prefiere, puede ir directamente a la misma pantalla

de esta manera:

DSPOBJD OBJ(mylib/myfile) OBJTYPE(*FILE) DETAIL(*SERVICE)

Respuesta attCréalo o no, un simple override hará el truco. Aquí le damos una instrucción UPDATE en un programa RPG.

exec sql update mylib/textfile set redfield = 'COMPLETE' where onefield = :Key;

He aquí un override:

OVRDBF TEXTFILE TOFILE(QTEMP/TEXTFILE)

El sistema actualiza el archivo en QTEMP.

Respuesta attFelicito a usted y otras personas sabias en tu tienda para pros-

cribir el hard-code nombres de librerias. La lista de bibliotecas es una característica maravillosa de IBM i, la cual está ausente en otros sistemas de base de datos.

Sin embargo, QTEMP es un animal diferente. Puesto que cada trabajo tiene su propia biblioteca QTEMP, no hay manera de que dos usuarios pueden caminar con los mismos pies. Le su-

Respuesta attNecesita una combinación de excepción completo, que

normalmente se hace con un UNION ALL de una left ex-ception join y una right exception join. Ya que está compa-rando filas (registros), puede utilizar una de esas caracterís-ticas que tendemos a olvidar, EXCEPT.

(select * from file1 except select * from file2)

union all(select * from file2 except select * from file1)El primer SELECT encuentra las filas en archivo1 que

no están en fichero2.El segundo SELECT encuentra las filas en archivo2 que

no están en el fichero1.UNIÓN ALL los pone todos juntos.

14 Noviembre-Diciembre 2016ATTITUDES Nº 312

giero que proponga el cambio de las normas para hacer una excepción de QTEMP. Solucionaría su problema FTP.

Si tiene éxito xito en el cambio de la política, entonces recomiendo como siguiente paso el considerar la mejor ma-nera de trabajar con hard-code QTEMP. Voy a mostrar lo que quiero decir. Con el siguiente programa que utiliza QTEMP.

pgm

dcl &Abending *lgl dcl &MsgKey *char 4 dcl &PgmName *char 10 dcl &Sender *char 80

monmsg cpf0000 exec(goto Abend)

/* Retrieve the program name. */ sndpgmmsg msg(' ') topgmq(*same) msgtype(*info)

keyvar(&msgkey) rcvmsg pgmq(*same) msgtype(*info)

sender(&sender) rmv(*yes) chgvar &amp;PgmName %sst(&Sender 56 10)

/* Create temporary objects */ crtdtaara qtemp/Sequence *dec (3 0)

crtpf qtemp/billwork1 crtpf qtemp/billwork2 crtpf qtemp/billwork3

ovrdbf billwork1 tofile(qtemp/billwork1) ovrdbf billwork2 tofile(qtemp/billwork2) ovrdbf billwork3 tofile(qtemp/billwork3)

call Bill500r

dltovr billwork1 dltovr billwork2 dltovr billwork3

return

Abend: if (&Abending) do sndpgmmsg msgid(cpf9898) msgf(qcpfmsg) + msgdta('Unexpected error in' *bcat &PgmName) + msgtype(*escape) keyvar(&MsgKey) enddo chgvar &Abending '1'

movpgmmsg msgtype(*diag) rsnescmsg

endpgm

El programa crea un área de datos y tres archivos físi-cos en QTEMP, el RPG programa funciona y todo está bien con todo el mundo. No hay nada malo con esto. Pero habrá que hacer esto en su lugar:

pgm

dcl &WorkLib *char 10 value(QTEMP)

dcl &Abending *lgl dcl &MsgKey *char 4 dcl &PgmName *char 10 dcl &Sender *char 80

monmsg cpf0000 exec(goto Abend)

/* Retrieve the program name. */ sndpgmmsg msg(' ') topgmq(*same) msgtype(*info) keyvar(&msgkey) rcvmsg pgmq(*same) msgtype(*info) sender(&sender) rmv(*yes) chgvar &PgmName %sst(&Sender 56 10)

/* Create temporary objects */ crtdtaara &WorkLib/Sequence *dec (3 0)

crtpf &WorkLib/billwork1 crtpf &WorkLib/billwork2

Tel. 93 3191612 Fax 93 3191755 [email protected] www.att.es

DECOMPILER

Recuperación de programas fuente

desde programas objeto

Recuperación objetos:

- RPG IV- RPG 36/38- RPG 400- COBOL 36/38- COBOL 400- CL- DDS

En poco más del tiempo empleado en compilar un programa fuente, puede descompilar un programa objeto.

- Proteja su inversión.

- Simplifique las migraciones

- Evite reprogramaciones.

15 Noviembre-Diciembre 2016ATTITUDES Nº 312

crtpf &WorkLib/billwork3

ovrdbf billwork1 tofile(&WorkLib/billwork1) ovrdbf billwork2 tofile(&WorkLib/billwork2) ovrdbf billwork3 tofile(&WorkLib/billwork3)

call qad06631r dltovr billwork1 dltovr billwork2 dltovr billwork3

return

Abend: if (&Abending) do sndpgmmsg msgid(cpf9898) msgf(qcpfmsg) + msgdta('Unexpected error in' *bcat &PgmName) + msgtype(*escape) keyvar(&MsgKey) enddo chgvar &Abending '1'

movpgmmsg msgtype(*diag) rsnescmsg

endpgm

La QTEMP está todavía hard-coded en el programa, pero sólo en un lugar, el valor inicial de la variable &WORKLIB. En muchas ocasiones, he encontrado y co-rregidos los errores en los trabajos por lotes (batch) cam-biando el valor de la variable de la biblioteca de trabajo. La secuencia es:

· Iniciar un trabajo de servicio en el trabajo por lotes· Poner el programa en debug· Establecer un punto de interrupción antes de la pri-

mera instrucción ejecutable· Cambiar el valor de la variable de trabajo de la bi-

blioteca por el nombre de una biblioteca temporal que había creado para la ocasión

· Dejar el programa hasta la finalización· Consultar las tablas de base de datos temporal

QTEMP es otra característica de IBM que no existe en otros sistemas. Me duele cada vez que veo este tipo de software bien diseñado sustituido por un surtido utilida-des de diversos origenes.