COLABORACIONES ¿Puedo implementar rápidamente un sistema … · 2016-05-26 · noches. Hay...

16
SUMARIO Colaboraciones SBMJOB, CALL y parámetros decimales 2 Fácil impresión desde un CL 3 Tres fuentes de RUNSQLSTM 6 ¿Puedo implementar rápidamente un sistema MFT? 8 Utilizando las funciones MIN/MAX en SQL 12 He aquí 3 métodos para unir 3 tablas 13 Novedades GoAnywhere gestión centralizada de transferencia de archivos multiplataforma 7 Crypto Complete un sistema de encriptación y control de contraseñas para Campos, IFS y Backups 16 COLABORACIONES ¿Puedo implementar rápidamente un sistema MFT? Utilizando las funciones MIN/MAX en SQL Fácil impresión desde un CL Información sobre Power Systems, incluidos AS/400, iSeries y System i Año 30 - Marzo-Abril 2016 Nº 308 Precio: 7 Euros Existe una percepción general de que cualquier software de servidor requiere mucho tiempo para ser configurado e implementado. Con soluciones MFT, raro es el caso. Al contrario, resulta relativamente sencillo. Sin embargo, el proceso de conseguir el hardware del servidor, encontrar espacio en el centro de cálculo, obtener aprobaciones para todas las compras de licencias, como un sistema operativo, así como otros detalles relacionados pueden requerir su tiempo. Obviamente no es culpa del software, por supuesto, pero así son las cosas. No obstante, y a pesar de estos detalles, existen algunos trucos que permitirán montar y poner en marcha una solución MFT rápidamente. Una cosa a tener en cuenta: “No asuma que las necesidades inmediatas del proyecto son las únicas que van a poder aprovechar una solución MFT”. Las funciones MIN y MAX han sido una parte de SQL desde el prin- cipio. Pero MIN y MAX aún no fun- cionan del mismo modo en todas las implementaciones de SQL, y para col- mo, tienen una peculiaridad en la que se tropieza de vez en cuando. MIN y MAX comenzaron como funciones de agregado. Como tal, busque el máxi- mos y mínimos valores no nulos dentro de una columna en un conjunto de filas. En esto, todos en el mundo de base de datos están de acuerdo. La controversia se presenta con el uso de MIN y MAX como las funciones escalares. Asumamos un archivo físico de las transacciones de fabricación. Tiene campos separados decimal empaqueta- dos de fecha y de hora. La fecha tiene siete dígitos en formato CYYMMDD. El CL no puede escribir en archivos de impresora. Esto es comprensible, ya que CL encaja en la categoría de len- guajes de control de trabajo. Aunque yo no hubiera utilizado nunca un CL para generar un informe de cuentas por co- brar, hay veces que es ventajoso, para un programa CL, generar un informe (Por ejemplo, producir un archivo de cola de espera), y aquí hay dos formas bastante fáciles hacerlo. Suponga que tiene un programa CL que ejecuta tres programas RPG en procesamiento por lotes todas las no- ches. Hay personas en su organización que necesitan saber si estos programas funcionaron con éxito o no. Si puede crear un archivo spool con esa informa- ción, podría dirigir ese archivo de cola de espera a una cola de salida que sería monitoreada por un software de terce- ros, que a su vez podría enviar el infor- me en formato PDF. Sigue en página 8 Sigue en página 12 Sigue en página 3

Transcript of COLABORACIONES ¿Puedo implementar rápidamente un sistema … · 2016-05-26 · noches. Hay...

Page 1: COLABORACIONES ¿Puedo implementar rápidamente un sistema … · 2016-05-26 · noches. Hay personas en su organización que necesitan saber si estos programas funcionaron con éxito

SUMARIO

ColaboracionesSBMJOB, CALL y parámetros decimales 2

Fácil impresión desde un CL 3 Tres fuentes de RUNSQLSTM 6 ¿Puedo implementar rápidamente un sistema MFT? 8 Utilizando las funciones MIN/MAX en SQL 12 He aquí 3 métodos para unir 3 tablas 13

NovedadesGoAnywhere gestión centralizadade transferencia de archivos multiplataforma 7

Crypto Complete un sistema deencriptación y control de contraseñaspara Campos, IFS y Backups 16

COLABORACIONES¿Puedo implementar rápidamente un sistema MFT?

Utilizando las funciones MIN/MAX en SQL

Fácil impresión desde un CL

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

Año 30 - Marzo-Abril 2016 Nº 308 Precio: 7 Euros

Existe una percepción general de que cualquier software de servidor requiere mucho tiempo para ser configurado e implementado. Con soluciones MFT, raro es el caso. Al contrario, resulta relativamente sencillo. Sin embargo, el proceso de conseguir el hardware del servidor, encontrar espacio

en el centro de cálculo, obtener aprobaciones para todas las compras de licencias, como un sistema operativo, así como otros detalles relacionados pueden requerir su tiempo.

Obviamente no es culpa del software, por supuesto, pero así son las cosas. No obstante, y a pesar de estos detalles,

existen algunos trucos que permitirán montar y poner en marcha una solución MFT rápidamente. Una cosa a tener en cuenta: “No asuma que las necesidades inmediatas del proyecto son las únicas que van a poder aprovechar una solución MFT”.

Las funciones MIN y MAX han sido una parte de SQL desde el prin-cipio. Pero MIN y MAX aún no fun-cionan del mismo modo en todas las implementaciones de SQL, y para col-mo, tienen una peculiaridad en la que se tropieza de vez en cuando. MIN y MAX comenzaron como funciones de agregado. Como tal, busque el máxi-mos y mínimos valores no nulos dentro de una columna en un conjunto de filas.

En esto, todos en el mundo de base de datos están de acuerdo. La controversia se presenta con el uso de MIN y MAX como las funciones escalares.

Asumamos un archivo físico de las transacciones de fabricación. Tiene campos separados decimal empaqueta-dos de fecha y de hora. La fecha tiene siete dígitos en formato CYYMMDD.

El CL no puede escribir en archivos de impresora. Esto es comprensible, ya que CL encaja en la categoría de len-guajes de control de trabajo. Aunque yo no hubiera utilizado nunca un CL para generar un informe de cuentas por co-brar, hay veces que es ventajoso, para un programa CL, generar un informe (Por ejemplo, producir un archivo de cola de espera), y aquí hay dos formas bastante fáciles hacerlo.

Suponga que tiene un programa

CL que ejecuta tres programas RPG en procesamiento por lotes todas las no-ches. Hay personas en su organización que necesitan saber si estos programas funcionaron con éxito o no. Si puede crear un archivo spool con esa informa-ción, podría dirigir ese archivo de cola de espera a una cola de salida que sería monitoreada por un software de terce-ros, que a su vez podría enviar el infor-me en formato PDF.

Sigue en página 8

Sigue en página 12

Sigue en página 3

Page 2: COLABORACIONES ¿Puedo implementar rápidamente un sistema … · 2016-05-26 · noches. Hay personas en su organización que necesitan saber si estos programas funcionaron con éxito

A pesar de mi gran admiración para la IBM sistema operativo, hay que admitir tiene sus peculiaridades. Una de ellas, que ha estado allí desde el primer día, es la manera que el Mandato para someter un trabajo (SBMJOB) formatea parámetros decimales del mandato CALL. Afortunadamente, una adición relativamente reciente al CL proporciona una manera fácil de lidiar con esta peculiaridad.

Asumamos que un programa CL llama a un programa RPG, pasándole dos variables decimales y una variable de caracteres.

dcl &Option *char 1dcl &Account *dec 5dcl &ThruDate *dec 7

call AR100R (&Account &ThruDate &Option)

Un día tiene que cambiar este programa por lo que somete el programa AR100R al subsistema batch. Puede incluir la llamada del programa dentro de un comando SBMJOB, como este:

sbmjob cmd(callAR100R (&Account &ThruDate &Option)) + job(AR100) jobd(ARJOBD)

Pero ello ocasionaría un error de datos decimales la primera que el programa RPG accediera al número de cuenta o la fecha. En cambio, la superposición de las

variables decimales con variables de carácter del mismo tamaño, como este:

/*parameters for submitted program */ dcl &cAccount *char 3 stg(*defined) defvar(&Account) dcl &cThruDate *char 4 stg(*defined) defvar(&ThruDate)

&Account tiene cinco dígitos decimal empaquetado, que ocupa tres bytes, por lo que &cAccount se define como una variable de caracteres de tres bytes que sobrepone &Account. La variable &ThruDate ocupa cuatro bytes de la memoria, por lo que &cThruDate se define como una variable de caracteres de cuatro bytes.(Para encontrar el número de bytes de almacenamiento que ocupa una variable decimal empaquetada, añadir 1 al número de cifras y dividir por 2. Si la respuesta no es un número entero, redondear. Otro método es añadir 2 al número de dígitos, divida por 2 y tirar el resto.)

Utilizar estas variables de carácter en lugar de las variables decimales en el comando SBMJOB:

sbmjob cmd(call AR100R (&cAccount &cThruDate &Option)) job(AR100) jobd(ARJOBD)

Ahí lo tienen: Una solución fácil para un viejo

problema.

SBMJOB, CALL, y parámetros decimales

COLABORACIONES

2 Marzo-Abril 2016ATTITUDES Nº 308

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.

Page 3: COLABORACIONES ¿Puedo implementar rápidamente un sistema … · 2016-05-26 · noches. Hay personas en su organización que necesitan saber si estos programas funcionaron con éxito

COLABORACIONES

3 Marzo-Abril 2016ATTITUDES Nº 308

El CL no puede escribir en archivos de impresora. Esto es comprensible, ya que CL encaja en la categoría de lenguajes de control de trabajo. Aunque yo no hubiera utilizado nunca un CL para generar un informe de cuentas por cobrar, hay veces que es ventajoso, para un programa CL, generar un informe (Por ejemplo, producir un archivo de cola de espera), y aquí hay dos formas bastante fáciles hacerlo.

Suponga que tiene un programa CL que ejecuta tres

programas RPG en procesamiento por lotes todas las no-ches. Hay personas en su organización que necesitan saber si estos programas funcionaron con éxito o no. Si puede crear un archivo spool con esa información, podría dirigir ese archivo de cola de espera a una cola de salida que se-ría monitoreada por un software de terceros, que a su vez podría enviar el informe en formato PDF.

En primer lugar, cree un archivo de impresora con la configuración adecuada.

Aquí hay dos maneras de generar el archivo de cola de espera.

La variable &Cmd tendrá un valor semejante (salvo que haya puesto dos signos de interrogación donde aparecen el retorno de carro y los caracteres de avance de línea):

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

Fácil impresión desde un CL

COLABORACIÓN

Fácil impresión desde un CL El CL no puede escribir en archivos de impresora. Esto es comprensible, ya que CL encaja en la categoría de lenguajes de control de trabajo. Aunque yo no hubiera utilizado nunca un CL para generar un informe de cuentas por cobrar, hay veces que es ventajoso, para un programa CL, generar un informe (Por ejemplo, producir un archivo de cola de espera), y aquí hay dos formas bastante fáciles hacerlo. Suponga que tiene un programa CL que ejecuta tres programas RPG en procesamiento por lotes todas las noches. Hay personas en su organización que necesitan saber si estos programas funcionaron con éxito o no. Si puede crear un archivo spool con esa información, podría dirigir ese archivo de cola de espera a una cola de salida que sería monitoreada por un software de terceros, que a su vez podría enviar el informe en formato PDF. En primer lugar, cree un archivo de impresora con la configuración adecuada. CRTPRTF FILE(MYLIB/STATUSPRTF) + TEXT('Nightly production status report') + OUTQ(EMAILOUTQ)

Aquí hay dos maneras de generar el archivo de cola de espera.

Método 1: Qshell y Rfile

Hacer que el programa CL construya un mandato Qshell que utilice la utilidad Rfile para escribir en el archivo de impresora. pgm parm(&RunDate) dcl &RunDate *char 8 /* YYYYMMDD */ dcl &Status *char dcl &EOL *char 2 x'0d25' dcl &Cmd *char 256 chgvar &Cmd ('echo ''') call QDP007101R (&RunDate &Status) chgvar &Cmd (&Cmd *tcat 'Widgets =' *cat &Status *cat &EOL) call QDP007102R (&RunDate &Status) chgvar &Cmd (&Cmd *tcat 'Thingies =' *cat &Status *cat &EOL) call QDP007103R (&RunDate &Status) chgvar &Cmd (&Cmd *tcat 'Dohickeys =' *cat &Status *cat &EOL) chgvar &Cmd (&Cmd *tcat ''' | rfile -wQ mylib/StatusPrtf') qsh cmd(&Cmd) endpgm

La variable &Cmd tendrá un valor semejante (salvo que haya puesto dos signos de interrogación donde aparecen el retorno de carro y los caracteres de avance de línea): echo 'Widgets =OK??Thingies =OK??Dohickeys =FAIL??' | rfile -wQ mylib/StatusPrtf

COLABORACIÓN

Fácil impresión desde un CL El CL no puede escribir en archivos de impresora. Esto es comprensible, ya que CL encaja en la categoría de lenguajes de control de trabajo. Aunque yo no hubiera utilizado nunca un CL para generar un informe de cuentas por cobrar, hay veces que es ventajoso, para un programa CL, generar un informe (Por ejemplo, producir un archivo de cola de espera), y aquí hay dos formas bastante fáciles hacerlo. Suponga que tiene un programa CL que ejecuta tres programas RPG en procesamiento por lotes todas las noches. Hay personas en su organización que necesitan saber si estos programas funcionaron con éxito o no. Si puede crear un archivo spool con esa información, podría dirigir ese archivo de cola de espera a una cola de salida que sería monitoreada por un software de terceros, que a su vez podría enviar el informe en formato PDF. En primer lugar, cree un archivo de impresora con la configuración adecuada. CRTPRTF FILE(MYLIB/STATUSPRTF) + TEXT('Nightly production status report') + OUTQ(EMAILOUTQ)

Aquí hay dos maneras de generar el archivo de cola de espera.

Método 1: Qshell y Rfile

Hacer que el programa CL construya un mandato Qshell que utilice la utilidad Rfile para escribir en el archivo de impresora. pgm parm(&RunDate) dcl &RunDate *char 8 /* YYYYMMDD */ dcl &Status *char dcl &EOL *char 2 x'0d25' dcl &Cmd *char 256 chgvar &Cmd ('echo ''') call QDP007101R (&RunDate &Status) chgvar &Cmd (&Cmd *tcat 'Widgets =' *cat &Status *cat &EOL) call QDP007102R (&RunDate &Status) chgvar &Cmd (&Cmd *tcat 'Thingies =' *cat &Status *cat &EOL) call QDP007103R (&RunDate &Status) chgvar &Cmd (&Cmd *tcat 'Dohickeys =' *cat &Status *cat &EOL) chgvar &Cmd (&Cmd *tcat ''' | rfile -wQ mylib/StatusPrtf') qsh cmd(&Cmd) endpgm

La variable &Cmd tendrá un valor semejante (salvo que haya puesto dos signos de interrogación donde aparecen el retorno de carro y los caracteres de avance de línea): echo 'Widgets =OK??Thingies =OK??Dohickeys =FAIL??' | rfile -wQ mylib/StatusPrtf

COLABORACIÓN

Fácil impresión desde un CL El CL no puede escribir en archivos de impresora. Esto es comprensible, ya que CL encaja en la categoría de lenguajes de control de trabajo. Aunque yo no hubiera utilizado nunca un CL para generar un informe de cuentas por cobrar, hay veces que es ventajoso, para un programa CL, generar un informe (Por ejemplo, producir un archivo de cola de espera), y aquí hay dos formas bastante fáciles hacerlo. Suponga que tiene un programa CL que ejecuta tres programas RPG en procesamiento por lotes todas las noches. Hay personas en su organización que necesitan saber si estos programas funcionaron con éxito o no. Si puede crear un archivo spool con esa información, podría dirigir ese archivo de cola de espera a una cola de salida que sería monitoreada por un software de terceros, que a su vez podría enviar el informe en formato PDF. En primer lugar, cree un archivo de impresora con la configuración adecuada. CRTPRTF FILE(MYLIB/STATUSPRTF) + TEXT('Nightly production status report') + OUTQ(EMAILOUTQ)

Aquí hay dos maneras de generar el archivo de cola de espera.

Método 1: Qshell y Rfile

Hacer que el programa CL construya un mandato Qshell que utilice la utilidad Rfile para escribir en el archivo de impresora. pgm parm(&RunDate) dcl &RunDate *char 8 /* YYYYMMDD */ dcl &Status *char dcl &EOL *char 2 x'0d25' dcl &Cmd *char 256 chgvar &Cmd ('echo ''') call QDP007101R (&RunDate &Status) chgvar &Cmd (&Cmd *tcat 'Widgets =' *cat &Status *cat &EOL) call QDP007102R (&RunDate &Status) chgvar &Cmd (&Cmd *tcat 'Thingies =' *cat &Status *cat &EOL) call QDP007103R (&RunDate &Status) chgvar &Cmd (&Cmd *tcat 'Dohickeys =' *cat &Status *cat &EOL) chgvar &Cmd (&Cmd *tcat ''' | rfile -wQ mylib/StatusPrtf') qsh cmd(&Cmd) endpgm

La variable &Cmd tendrá un valor semejante (salvo que haya puesto dos signos de interrogación donde aparecen el retorno de carro y los caracteres de avance de línea): echo 'Widgets =OK??Thingies =OK??Dohickeys =FAIL??' | rfile -wQ mylib/StatusPrtf

Page 4: COLABORACIONES ¿Puedo implementar rápidamente un sistema … · 2016-05-26 · noches. Hay personas en su organización que necesitan saber si estos programas funcionaron con éxito

COLABORACIONES

4 Marzo-Abril 2016ATTITUDES Nº 308

El mandato echo escribe texto en la secuencia de salida estándar. La salida estándar se canaliza en la utilidad Rfile. Es decir, la salida de la eco es la entrada al

Rfile. Rfile escribe los datos por streaming en el archivo de la impresora que hemos creado. Voilà! Varios teléfonos celulares mostraran lo siguiente:

El mandato echo escribe texto en la secuencia de salida estándar. La salida estándar se canaliza en la utilidad Rfile. Es decir, la salida de la eco es la entrada al Rfile. Rfile escribe los datos por streaming en el archivo de la impresora que hemos creado. Voilà! Varios teléfonos celulares mostraran lo siguiente: Widgets =OK Thingies =OK Dohickeys =FAIL

Método 2: Archivos nativos y RUNSQL

Con la excepción de la orden RUNSQL, este método utiliza características que han estado operando desde el primer día. pgm parm(&RunDate) dcl &RunDate *char 8 /* YYYYMMDD */ dcl &Status *char dcl &PrintLine *char 24 dcl &Cmd *char 256 dcl &Quote *char 1 value('''') clrpfm qtemp/StatusRpt monmsg cpf3142 exec(do) crtpf qtemp/StatusRpt rcdlen(24) enddo call QDP007101R (&RunDate &Status) chgvar &PrintLine ('Widgets =' *cat &Status) callsubr WriteStat call QDP007102R (&RunDate &Status) chgvar &PrintLine ('Thingies =' *cat &Status) callsubr WriteStat call QDP007103R (&RunDate &Status) chgvar &PrintLine ('Dohickeys =' *cat &Status) callsubr WriteStat cpyf qtemp/statusrpt StatusPrtf fmtopt(*nochk) return subr WriteStat chgvar &Cmd ('insert into qtemp/StatusRpt values(' *cat + &Quote *cat &PrintLine *tcat &Quote *cat ')') runsql sql(&Cmd) commit(*none) endsubr endpgm

Esta rutina comienza limpiando el programa descrito como archivo de trabajo StatusRpt si existe y creándolo en caso contrario. Después de cada llamada de programa, la subrutina WriteStat escribe un registro en el archivo de trabajo. El mandato copiar archivo (CPYF) copia el archivo de trabajo en el archivo de la impresora, produciendo el informe.

Donde hay una voluntad hay un camino.

n - - - - - - - - - - - - - - --

El mandato echo escribe texto en la secuencia de salida estándar. La salida estándar se canaliza en la utilidad Rfile. Es decir, la salida de la eco es la entrada al Rfile. Rfile escribe los datos por streaming en el archivo de la impresora que hemos creado. Voilà! Varios teléfonos celulares mostraran lo siguiente: Widgets =OK Thingies =OK Dohickeys =FAIL

Método 2: Archivos nativos y RUNSQL

Con la excepción de la orden RUNSQL, este método utiliza características que han estado operando desde el primer día. pgm parm(&RunDate) dcl &RunDate *char 8 /* YYYYMMDD */ dcl &Status *char dcl &PrintLine *char 24 dcl &Cmd *char 256 dcl &Quote *char 1 value('''') clrpfm qtemp/StatusRpt monmsg cpf3142 exec(do) crtpf qtemp/StatusRpt rcdlen(24) enddo call QDP007101R (&RunDate &Status) chgvar &PrintLine ('Widgets =' *cat &Status) callsubr WriteStat call QDP007102R (&RunDate &Status) chgvar &PrintLine ('Thingies =' *cat &Status) callsubr WriteStat call QDP007103R (&RunDate &Status) chgvar &PrintLine ('Dohickeys =' *cat &Status) callsubr WriteStat cpyf qtemp/statusrpt StatusPrtf fmtopt(*nochk) return subr WriteStat chgvar &Cmd ('insert into qtemp/StatusRpt values(' *cat + &Quote *cat &PrintLine *tcat &Quote *cat ')') runsql sql(&Cmd) commit(*none) endsubr endpgm

Esta rutina comienza limpiando el programa descrito como archivo de trabajo StatusRpt si existe y creándolo en caso contrario. Después de cada llamada de programa, la subrutina WriteStat escribe un registro en el archivo de trabajo. El mandato copiar archivo (CPYF) copia el archivo de trabajo en el archivo de la impresora, produciendo el informe.

Donde hay una voluntad hay un camino.

n - - - - - - - - - - - - - - --

Page 5: COLABORACIONES ¿Puedo implementar rápidamente un sistema … · 2016-05-26 · noches. Hay personas en su organización que necesitan saber si estos programas funcionaron con éxito

COLABORACIONES

5 Marzo-Abril 2016ATTITUDES Nº 308

El mandato echo escribe texto en la secuencia de salida estándar. La salida estándar se canaliza en la utilidad Rfile. Es decir, la salida de la eco es la entrada al Rfile. Rfile escribe los datos por streaming en el archivo de la impresora que hemos creado. Voilà! Varios teléfonos celulares mostraran lo siguiente: Widgets =OK Thingies =OK Dohickeys =FAIL

Método 2: Archivos nativos y RUNSQL

Con la excepción de la orden RUNSQL, este método utiliza características que han estado operando desde el primer día. pgm parm(&RunDate) dcl &RunDate *char 8 /* YYYYMMDD */ dcl &Status *char dcl &PrintLine *char 24 dcl &Cmd *char 256 dcl &Quote *char 1 value('''') clrpfm qtemp/StatusRpt monmsg cpf3142 exec(do) crtpf qtemp/StatusRpt rcdlen(24) enddo call QDP007101R (&RunDate &Status) chgvar &PrintLine ('Widgets =' *cat &Status) callsubr WriteStat call QDP007102R (&RunDate &Status) chgvar &PrintLine ('Thingies =' *cat &Status) callsubr WriteStat call QDP007103R (&RunDate &Status) chgvar &PrintLine ('Dohickeys =' *cat &Status) callsubr WriteStat cpyf qtemp/statusrpt StatusPrtf fmtopt(*nochk) return subr WriteStat chgvar &Cmd ('insert into qtemp/StatusRpt values(' *cat + &Quote *cat &PrintLine *tcat &Quote *cat ')') runsql sql(&Cmd) commit(*none) endsubr endpgm

Esta rutina comienza limpiando el programa descrito como archivo de trabajo StatusRpt si existe y creándolo en caso contrario. Después de cada llamada de programa, la subrutina WriteStat escribe un registro en el archivo de trabajo. El mandato copiar archivo (CPYF) copia el archivo de trabajo en el archivo de la impresora, produciendo el informe.

Donde hay una voluntad hay un camino.

n - - - - - - - - - - - - - - --

Esta rutina comienza limpiando el programa descrito como archivo de trabajo StatusRpt si existe y creándolo en caso contrario. Después de cada llamada de programa, la subrutina WriteStat escribe un registro en el archivo de

trabajo. El mandato copiar archivo (CPYF) copia el archivo de trabajo en el archivo de la impresora, produciendo el informe.

Donde hay una voluntad hay un camino.

Page 6: COLABORACIONES ¿Puedo implementar rápidamente un sistema … · 2016-05-26 · noches. Hay personas en su organización que necesitan saber si estos programas funcionaron con éxito

COLABORACIONES

6 Marzo-Abril 2016ATTITUDES Nº 308

El Mandato de ejecutar declaraciones SQL (RUNS-QLSTM) ejecuta un archivo de mandatos CL y/o SQL. Si ha usado este mandato, probablemente sabe que RUNS-QLSTM lee los mandatos de un miembro de archivo físi-co fuente. Pero ¿sabía usted que existen dos lugares desde donde poder leer los mandatos SQL?

En primer lugar, la forma habitual. He aquí un miem-bro LOADPLANTS en archivo físico fuente SCRPTS.

CREATE TABLE PLANTS (ID DEC(3), LOCATION VARCHAR(24),PRIMARY KEY (ID));INSERT INTO PLANTS VALUES( 1, 'Lost Angeles'),( 2, 'New Yolk'),( 3, 'Waste Virginia');

Para crear la tabla de plantas e inicializarla con los datos, haga lo siguiente:

RUNSQLSTM SRCFILE(SCRIPTS) SRCMBR(LOADPLANTS) COMMIT(*NONE)

También puede almacenar sentencias SQL en el siste-ma integrado de archivos (IFS). He aquí cómo deberá eje-cutar el mismo script de secuencia de archivo LoadPlants.SQL en el directorio actual.

RUNSQLSTM SRCSTMF('LoadPlants.SQL')

COMMIT(*NONE)

Por último, usted puede poner las sentencias SQL en un fichero de datos en línea. He aquí el miembro PLANT-LOAD en archivo físico fuente BATCHJOBS:

//BCHJOB JOB(PLANTLOAD) JOBQ(QBATCH)RUNSQLSTM SRCFILE(QINLINE) SRCMBR(QINLINE) COMMIT(*NONE)//DATA FILETYPE(*SRC)CREATE TABLE PLANTS (ID DEC(3), LOCATION VARCHAR(24),PRIMARY KEY (ID));INSERT INTO PLANTS VALUES( 7, 'Lost Angeles'),( 8, 'New Yolk'),( 9, 'Waste Virginia');////ENDBCHJOB

Para crear y cargar la tabla de las plantas, utilizar el mandato someter base de datos trabajo (SBMDBJOB).

SBMDBJOB FILE(SOMELIB/BATCHJOBS) MBR(PLANTLOAD)

Dudo de que nadie utilice el método de archivo de da-tos en línea, pero ejecutar scripts de SQL del IFS tiene posibilidades, ¿no cree?

Tres fuentes de RUNSQLSTM

Page 8: COLABORACIONES ¿Puedo implementar rápidamente un sistema … · 2016-05-26 · noches. Hay personas en su organización que necesitan saber si estos programas funcionaron con éxito

Visión a largo plazo; implementación a corto plazo Una forma de implementar una solución

MFT y luego ponerla en marcha lo más rápidamente posible, es aplicar en su visión de largo plazo la solución MFT más general, pero implementando ahora solo la parte de ella que satisfaga la necesidad real más inmediata. A modo de ejemplo, vamos a considerar la figura adyacente.

La visión es disponer de una instalación redundante de alta disponibilidad que incluya dos servidores. También hay un plan para implementar un sistema de transferencias específicas persona a persona basado en un cliente web e incluso, una aplicación de transferencia personalizada de archivos a los PC (Desktops) de la empresa.

De acuerdo con el gráfico, la necesidad más inmediata, sin embargo, parece ser la de

un único servidor MFT, no redundante, que sólo maneje transferencias de servidor a servidor. Las otras partes del proyecto aparecen marcadas como "Fase 2", lo que indica que tendrán lugar más adelante. Esta visión a largo plazo es una manera inteligente de satisfacer las necesidades inmediatas de un proyecto, a la vez que se planifica una infraestructura más robusta y flexible de cara al futuro.

¿Puedo implementar rápidamente un sistema MFT (Managed File Transfer) tan solo para un proyecto que tiene una necesidad inmediata?

Existe una percepción general de que cualquier software de servidor requiere mucho tiempo para ser configurado e implementado. Con soluciones MFT, raro es el caso. Al contrario, resulta relativamente sencillo. Sin embargo, el proceso de conseguir el hardware del servidor, encontrar espacio en el centro de cálculo, obtener aprobaciones para todas las compras de licencias, como un sistema operativo, así como otros detalles relacionados pueden requerir su tiempo.

Obviamente no es culpa del software, por supuesto, pero así son las cosas. No obstante, y a pesar de estos detalles, existen algunos trucos que permitirán montar y poner en marcha una solución MFT rápidamente.

Una cosa a tener en cuenta: “No asuma que las necesidades inmediatas del proyecto son las únicas que van a poder aprovechar una solución MFT”. Aunque en este preciso momento quizás solo este considerando los objetivos inmediatos, por muy simples que parezcan hoy, este sería el momento de planificar una solución Managed File Transfer que satisfaga la mayor parte de las necesidades de la Empresa, presentes y futuras, en el ámbito de la transferencia de archivos.

Solución MFT en Multiplataformas Windows, Linux, IBM i, AIX, z/OS Unix, HP-UX, Solaris, Mac OS,..

Boletín Informativo.- GA-1604 Página 1/3 25 de Abril de 2016

American Top Tools S.L Tel. 9333191612 [email protected] www.mftsolutions.es

¿Puedo implementar rápidamente un sistema MFT?

Servidores Partners

Sistema MFT

Fase 2

Fase 3

MFT A MFT B

Transfer

Log Data

Log

Syslog Cliente

Web MFT Cliente MFT Sobremesa

Page 9: COLABORACIONES ¿Puedo implementar rápidamente un sistema … · 2016-05-26 · noches. Hay personas en su organización que necesitan saber si estos programas funcionaron con éxito

En el esquema, también aparece una “Fase 3” que aparentemente incluye la adición de un registro de auditoría de seguridad centralizado mediante un servidor de syslog (Registro de actuaciones). Insistimos, si éste no es un componente crítico del proyecto inmediato, se puede planificar su instalación y configuración para una fase posterior, de modo que la necesidad más inmediata pueda conseguirse más rápidamente.

La habilidad radica en planificar siempre pensando en la configuración a largo plazo. Si usted planea solamente teniendo en cuenta la necesidad inmediata del proyecto, podría no tener luego la opción de añadir un servidor redundante en la “Fase 2”, o podría seleccionar hoy una solución incapaz de apoyar sus planes de registro de actuaciones (syslog) en una tercera fase.

Externalizar Por supuesto, la otra opción es encontrar

un proveedor de soluciones MFT que aporte una solución Software como Servicio (SaaS) en un servidor externo. Este enfoque, no solo permite estar funcionando en unos pocos días, sino en horas, satisfaciendo los objetivos inmediatos del proyecto.

Ahora bien, a menos que haya analizado cuidadosamente el conjunto completo de requerimientos potenciales de la empresa y esté totalmente seguro de que una solución externa satisfará sus necesidades de forma permanente, evite trabajar con una solución MFT externa que no permita disponer de otras alternativas.

Lo mejor es encontrar un proveedor de soluciones MFT para instalar en nuestra

propia Empresa la cual, a su vez, esté disponible como SaaS, facilitando así, una solución externa temporal. De este modo, en el futuro podrá migrar más fácilmente de la solución externalizada a un sistema propio, de forma gradual y controlada.

De hecho, sería prudente discutir esa migración con su proveedor MFT antes de empezar a trabajar juntos. ¿Será difícil esa migración?

Si ha invertido recursos, tiempo y esfuerzo en la creación de flujos de trabajo personalizados, conversión de datos y otras características, ¿serán fáciles de trasladar desde la plataforma externalizada al sistema informático propio llegado el momento? O bien, ¿tendrá que rehacer mucho de ese trabajo y perder tiempo y esfuerzo en el proceso de migración?

En algunos casos, puede ser tan simple como copiar una base de datos o un conjunto de archivos desde la solución alojada en su centro de datos compartido a su propia instalación. En otros casos, podría implicar un proceso demasiado complejo. De cualquier manera, usted querrá asegurarse de que el proveedor le dará soporte y apoyo, y que usted conoce de antemano como será el proceso.

Boletín informativo.- GA-1604 Página 2/3 25 de Abril de 2016

¿Puedo implementar rápidamente un sistema MFT?

American Top Tools S.L Tel. 9333191612 [email protected] www.mftsolutions.es

Evite trabajar con una solución MFT externa que no permita

disponer de otras alternativas.

Encuesta usuarios GoAnywhere 2016

¿Cómo gestionaba la transferencia de archivos antes de utilizar GoAnywhere?

¿ En que procesos utiliza más GoAnywhere?

Uso intensivo scripts

Otro producto de transferencia de archivos

Manualmente mediante aplicación de PC

Automatizar FTP, FTPS, SFTP

Cifrar y descifrar PGP

Monitores de archivos en procesos

Conversión formatos de datos

Proporcionar servicios intercambio seguro de archivos para clientes

La habilidad radica en planificar siempre pensando en la

configuración a largo plazo.

Page 10: COLABORACIONES ¿Puedo implementar rápidamente un sistema … · 2016-05-26 · noches. Hay personas en su organización que necesitan saber si estos programas funcionaron con éxito

American Top Tools S.L Tel. 9333191612 [email protected] www.mftsolutions.es

Desarrollo Proyecto

En mi calidad de consultor, he trabajado con clientes que tenían una real e inmediata necesidad de recurrir a una solución MFT. Habían investigado soluciones disponibles y elegido un proveedor que ofrecía la misma solución como una opción instalable en su propio ordenador propio (in‐house) o bien, externalizada (SaaS).

Determinaron que migrar de una opción a otra era tan fácil como copiar unos archivos, y que el proveedor disponía de soporte total y documentación adecuada garantizando el buen fin del proceso. Empezaron con la solución MFT SaaS de inmediato y estaban en línea en un par de días. En una semana, habían creado los flujos de trabajo y otros elementos de la configuración que su proyecto necesitaba.

Una vez el proyecto hubo despegado, se inició inmediatamente la implementación de la solución en sus propios ordenadores. Al haber alcanzado ya el cumplimiento de las necesidades del proyecto crítico, fueron capaces de:

Implementar y probar de forma extensiva las soluciones in‐house

Probar el proceso de migración desde el

sistema SaaS Simular una posible migración

completa a un sistema exclusivamente en su ordenador propio (in-house).

Este cliente en particular, decidió

conservar una parte de la solución SaaS como respaldo a su solución in‐house, si bien realizaba la mayor parte de sus operaciones diarias a través de la solución MFT instalada en su propio centro de datos.

A mi modo de ver, es definitivamente un enfoque eficaz, siempre y cuando todo ello permita satisfacer todas las necesidades de su empresa, tanto inmediatas como a largo plazo.

Boletín informativo.- GA-1604 Página 3/3 25 de Abril de 2016

¿Puedo implementar rápidamente un sistema MFT?

ENCRYPTION AND COMPRESSION AES SSH FIPS 140-2 Compliance SSL

GPG TLS Open PGP ZIP, GZIP, TAR

CONNECTIVITY AS2 Message Queue Amazon S3 SFTP / SCP / SSH

FTP SMB / CIFS FTPS SMS Text Messages

GoFast Acceleration SMTP, POP3, and IMAP HTTPS SNMP

ICAP for Antivirus & DLP WebDAV

DATABASES DB2 Oracle

IBM DB2 for i PostgreSQL Informix SQL Server

MySQL Sybase

TRANSLATION Delimited text Flat File and Fixed Width

Excel XML

AUTHENTICATION Active Directory, LDAP, IBM i, Database

RADIUS (RSA SecurID) SAML for single sign-on and dual factor authentication SSH Keys

SSL Certificates

PLATFORMS Windows Linux IBM i

Mac OS Unix VMware AIX Solaris

Page 11: COLABORACIONES ¿Puedo implementar rápidamente un sistema … · 2016-05-26 · noches. Hay personas en su organización que necesitan saber si estos programas funcionaron con éxito

COLABORACIONES

11 Marzo-Abril 2016ATTITUDES Nº 308

Este es otro método.

select mxItem,max(digits(mxDate) concat digits(mxtime))from mfgtranswhere mxStatus = 40group by mxItemorder by mxItem

Prefiero esto al método anterior basado en la teoría ge-neral de que las operaciones de cadenas tienden a tienden a penalizar el sistema menos que las operaciones aritméti-ca. También podría convertir la fecha y la hora en un cam-po de fecha y hora (timestamp), pero no soy lo suficiente valiente y aventurero como para dedicar mi tiempo para lograr la expresión requerida para ello.

He aquí un enfoque diferente.

with Temp as(select m.*, row_number() over(partition by mxItemorder by mxItem,mxDate desc,mxTime desc) as Row_Nbrfrom mfgtrans as m

where mxStatus = 40)select mxItem, mxDate, mxTimefrom Tempwhere Row_Nbr = 1order by mxItem

He utilizado funciones OLAP en lugar de funciones agregadas. El sistema ordena los datos por número de ar-tículo, fecha descendente y tiempo descendente.

PARTITION BY es similar a GROUP BY. En térmi-nos de RPG, se podría pensar de esto como una ruptura del control sobre el número de artículo. La función ROW NUMBER asigna a un número secuencial, llamado ROW NBR, a cada fila del conjunto de resultados, y como los datos se reparten según el nº de artículo, la numeración se reinicia en 1 con cada elemento.

Este conjunto de resultados constituye la expresión de tabla común de TEMP. La consulta principal (el segundo SELECT) examina el valor de ROW NBR para escoger sólo la primera fila por artículo. La ventaja de este enfo-que es la falta de columnas derivadas (calculadas).¿Qué les parece? Una manera de encontrar el mínimo o máximo sin utilizar las funciones MIN y MAX.

¿Quién podía creerlo?

Page 12: COLABORACIONES ¿Puedo implementar rápidamente un sistema … · 2016-05-26 · noches. Hay personas en su organización que necesitan saber si estos programas funcionaron con éxito

COLABORACIONES

12 Marzo-Abril 2016ATTITUDES Nº 308

Las funciones MIN y MAX han sido una parte de SQL desde el principio. Pero MIN y MAX aún no funcionan del mismo modo en todas las implementaciones de SQL, y para colmo, tienen una peculiaridad en la que se tropieza de vez en cuando. MIN y MAX comenzaron como funcio-nes de agregado. Como tal, busque el máximos y mínimos valores no nulos dentro de una columna en un conjunto de filas. En esto, todos en el mundo de base de datos están de acuerdo. La controversia se presenta con el uso de MIN y MAX como las funciones escalares.

Asumamos un archivo físico de las transacciones de fabricación. Tiene campos separados decimal empaque-tados de fecha y de hora. La fecha tiene siete dígitos en formato CYYMMDD. La hora tiene seis dígitos de seis dígitos en formato HHMMSS. Y queremos que la última fecha en que una orden de producción fue terminada (Por ejemplo, el estado de fabricación completado es de 40) para cada elemento.

select mxItem, max(mxDate)from mfgtranswhere mxStatus = 40group by mxItemorder by mxItem

Supongamos que quiero que la última fecha y hora de finalización de cada operación. Esto sería una obviedad si la fecha y hora se almacenaran en una sóla columna timestamp, pero muchos lectores de esta publicación tra-bajan con tablas de bases de datos que son anteriores a la introducción del tipo de datos timestamp.

He aquí una forma que no funciona:

select mxItem, max(mxDate, mxTime)from mfgtranswhere mxStatus = 40group by mxItemorder by mxItem

Si intenta ejecutar esta consulta, DB2 for i responde con el mensaje SQL0122 (La columna MXDATE o la expresión en la lista SELECT no son válidos.) En otras palabras, la expresión MAX no es una columna de agru-pación. Puede estar tentado a omitir GROUP BY.

select mxItem, max(mxDate, mxTime)from mfgtranswhere mxStatus = 40order by mxItem

Esta consulta funciona, pero tiene dos problemas. En primer lugar, cuando se utiliza como las funciones escala-res, MIN y MAX devuelve los valores menores y mayores en una lista. Aquí la función MAX compara la fecha y hora y devuelve la mayor de las dos, que no es lo que queremos.

Algunos sistemas evitan este problema utilizando MIN y MAX únicamente como funciones agregadas y definiendo otras funciones para uso escalar. Oracle, por ejemplo, tiene las LEAST y GREATEST funciones esca-lares. Pero el mayor problema es que la consulta no va a agrupar por número de artículo, así que volvamos al de-safío original.

He aquí una manera de encontrar la última fecha y hora en que una orden de producción se completó.

select mxItem, max(mxDate * 1000000 + mxtime)

from mfgtranswhere mxStatus = 40group by mxItemorder by mxItem

Esto crea un número de 13 dígitos con la fecha y hora. El sistema no tiene ningún problema en encontrar el valor máximo de la expresión para cada elemento.

Utilizando las funciones MIN/MAX en SQL

Page 13: COLABORACIONES ¿Puedo implementar rápidamente un sistema … · 2016-05-26 · noches. Hay personas en su organización que necesitan saber si estos programas funcionaron con éxito

COLABORACIONES

13 Marzo-Abril 2016ATTITUDES Nº 308

La normalización es el proceso de asegurarse de que cada dato se almacena en la tabla apropiada. Almacenar datos en el lugar incorrecto da lugar a anomalías, una pa-labra elegante para los problemas, y ya tiene suficientes problemas.

Para dar sentido a los datos normalizados se requiere unir tablas. ¿Conoce los métodos para codificar un Join con SQL y las ventajas y desventajas de cada uno?

Método 1: WHERECuando empecé a trabajar con SQL, la unión (Join) se

realizaba con la cláusula WHERE de la instrucción SE-LECT. He aquí un ejemplo:

select h.*, d.* from SalesOrderHeaders as h, SalesOrderLines as d where h.OrderNumber = d.OrderNumber

En esta consulta, solicito todas las columnas de la ta-bla de cabecera de pedido de ventas y todas las columnas de las líneas de pedido de ventas. La cláusula WHERE indica al sistema como encontrar coincidencias con los datos de un número común de orden de venta. Es decir, la información del encabezado en cualquier fila de cabecera de pedido se aplica a una línea de detalle de la misma orden de ventas.

Esta sintaxis tiene sus deficiencias, que el mayor de los cuales considero que es que los pedidos que no en-

cuentran coincidencias no aparecen finalmente. Es decir, si una orden tiene un encabezado pero sin líneas de deta-lle, o una o más líneas no tienen cabecera, ese orden no se presenta en el resultado. Los proveedores de DBMS tuvieron que trabajar con extensiones para soportar estos Outer Joins.

No uso esta sintaxis porque no veo ninguna ventaja en ella. Yo recomiendo que conozca esta sintaxis para que la pueda reconocer y entender, pero si la ve, no le recomien-do que la use.

Método 2: JOIN... USINGSe trata de una implementación de la Unión natural

(Join). Lo primero que debe saber sobre Join es que dos tablas o views se unen nombres de campo comunes del mismo tipo de datos.

select * from SalesOrderHeaders join SalesOrderLines using (OrderNumber)

OrderNumber es la columna común. Es decir, el nú-mero de orden OrderNumber estaba en ambas tablas y se define con el mismo tipo de datos en ambas tablas.

La segunda cosa sobre Uniones naturales (Join) es cómo se comportan cuando se utiliza un asterisco para se-leccionar todas las columnas. Aquí está el resultado de la consulta anterior.

He aquí 3 métodos para unir tablas

Page 14: COLABORACIONES ¿Puedo implementar rápidamente un sistema … · 2016-05-26 · noches. Hay personas en su organización que necesitan saber si estos programas funcionaron con éxito

COLABORACIONES

14 Marzo-Abril 2016ATTITUDES Nº 308

La segunda cosa sobre Uniones naturales (Join) es cómo se comportan cuando se utiliza un asterisco para seleccionar todas las columnas. Aquí está el resultado de la consulta anterior. ORDERNUMBER ENTRYDATE CUSTOMERID LINENUMBER ITEMNUMBER QUANTITY 1001 2015-09-01 102 1 B-1 5 1001 2015-09-01 102 2 B-2 6 1002 2015-09-01 103 3 F-3 2 El resultado conjunto consiste en: · las columnas en USING · las columnas de la primera tabla que no están en USING · las columnas de la segunda tabla que no están en USING Esto tiene sentido para mi. ¿Por qué volver a dos columnas con los mismos datos? ¿Quiere ver algo que no tiene sentido para mí? Mire esto: select h.*, d.* from SalesOrderHeaders as h join SalesOrderLines as d using (OrderNumber)

Aquí está el resultado conjunto de: ENTRYDATE CUSTOMERID LINENUMBER ITEMNUMBER QUANTITY 2015-09-01 102 1 B-1 5 2015-09-01 102 2 B-2 6 2015-09-01 103 3 F-3 2

Fíjese. No aparece ningún número de pedido. Como si las columnas comunes no son parte de cualquier tabla. Rara vez uso la sintaxis JOIN ... USING. No lo necesito, porque hay algo mejor, simplemente.

Método 3: JOIN... ON

Este es el método que lo hace todo. Usted puede hacer JOIN ... ON de lo que quiera, sin importar el nombre de la columna y el tipo de dato.

He aquí un ejemplo de JOIN... ON. select h.*, d.* from SalesOrderHeaders as h join SalesOrderLines as d on h.OrderNumber = d.OrderNumber

Y aquí está el resultado. ORDERNUMBER ENTRYDATE CUSTOMERID ORDERNUMBER LINENUMBER ITEMNUMBER QUANTITY 1001 2015-09-01 102 1001 1 B-1 5 1001 2015-09-01 102 1001 2 B-2 6 1002 2015-09-01 103 1002 3 F-3 2

La segunda cosa sobre Uniones naturales (Join) es cómo se comportan cuando se utiliza un asterisco para seleccionar todas las columnas. Aquí está el resultado de la consulta anterior. ORDERNUMBER ENTRYDATE CUSTOMERID LINENUMBER ITEMNUMBER QUANTITY 1001 2015-09-01 102 1 B-1 5 1001 2015-09-01 102 2 B-2 6 1002 2015-09-01 103 3 F-3 2 El resultado conjunto consiste en: · las columnas en USING · las columnas de la primera tabla que no están en USING · las columnas de la segunda tabla que no están en USING Esto tiene sentido para mi. ¿Por qué volver a dos columnas con los mismos datos? ¿Quiere ver algo que no tiene sentido para mí? Mire esto: select h.*, d.* from SalesOrderHeaders as h join SalesOrderLines as d using (OrderNumber)

Aquí está el resultado conjunto de: ENTRYDATE CUSTOMERID LINENUMBER ITEMNUMBER QUANTITY 2015-09-01 102 1 B-1 5 2015-09-01 102 2 B-2 6 2015-09-01 103 3 F-3 2

Fíjese. No aparece ningún número de pedido. Como si las columnas comunes no son parte de cualquier tabla. Rara vez uso la sintaxis JOIN ... USING. No lo necesito, porque hay algo mejor, simplemente.

Método 3: JOIN... ON

Este es el método que lo hace todo. Usted puede hacer JOIN ... ON de lo que quiera, sin importar el nombre de la columna y el tipo de dato.

He aquí un ejemplo de JOIN... ON. select h.*, d.* from SalesOrderHeaders as h join SalesOrderLines as d on h.OrderNumber = d.OrderNumber

Y aquí está el resultado. ORDERNUMBER ENTRYDATE CUSTOMERID ORDERNUMBER LINENUMBER ITEMNUMBER QUANTITY 1001 2015-09-01 102 1001 1 B-1 5 1001 2015-09-01 102 1001 2 B-2 6 1002 2015-09-01 103 1002 3 F-3 2

La segunda cosa sobre Uniones naturales (Join) es cómo se comportan cuando se utiliza un asterisco para seleccionar todas las columnas. Aquí está el resultado de la consulta anterior. ORDERNUMBER ENTRYDATE CUSTOMERID LINENUMBER ITEMNUMBER QUANTITY 1001 2015-09-01 102 1 B-1 5 1001 2015-09-01 102 2 B-2 6 1002 2015-09-01 103 3 F-3 2 El resultado conjunto consiste en: · las columnas en USING · las columnas de la primera tabla que no están en USING · las columnas de la segunda tabla que no están en USING Esto tiene sentido para mi. ¿Por qué volver a dos columnas con los mismos datos? ¿Quiere ver algo que no tiene sentido para mí? Mire esto: select h.*, d.* from SalesOrderHeaders as h join SalesOrderLines as d using (OrderNumber)

Aquí está el resultado conjunto de: ENTRYDATE CUSTOMERID LINENUMBER ITEMNUMBER QUANTITY 2015-09-01 102 1 B-1 5 2015-09-01 102 2 B-2 6 2015-09-01 103 3 F-3 2

Fíjese. No aparece ningún número de pedido. Como si las columnas comunes no son parte de cualquier tabla. Rara vez uso la sintaxis JOIN ... USING. No lo necesito, porque hay algo mejor, simplemente.

Método 3: JOIN... ON

Este es el método que lo hace todo. Usted puede hacer JOIN ... ON de lo que quiera, sin importar el nombre de la columna y el tipo de dato.

He aquí un ejemplo de JOIN... ON. select h.*, d.* from SalesOrderHeaders as h join SalesOrderLines as d on h.OrderNumber = d.OrderNumber

Y aquí está el resultado. ORDERNUMBER ENTRYDATE CUSTOMERID ORDERNUMBER LINENUMBER ITEMNUMBER QUANTITY 1001 2015-09-01 102 1001 1 B-1 5 1001 2015-09-01 102 1001 2 B-2 6 1002 2015-09-01 103 1002 3 F-3 2

El resultado conjunto consiste en:· las columnas en USING· las columnas de la primera tabla que no están

en USING· las columnas de la segunda tabla que no están en USING

Esto tiene sentido para mi. ¿Por qué volver a dos co-

lumnas con los mismos datos? ¿Quiere ver algo que no tiene sentido para mí? Mire esto:

select h.*, d.* from SalesOrderHeaders as h join SalesOrderLines as d using (OrderNumber)

Aquí está el resultado conjunto de:

Fíjese. No aparece ningún número de pedido. Como si las columnas comunes no son parte de cualquier tabla. Rara vez uso la sintaxis JOIN ... USING. No lo necesito, porque hay algo mejor, simplemente.

MétOdO 3: JOIN... ONEste es el método que lo hace todo. Usted puede hacer

JOIN ... ON de lo que quiera, sin importar el nombre de la

columna y el tipo de dato.He aquí un ejemplo de JOIN... ON.select h.*, d.* from SalesOrderHeaders as h join SalesOrderLines as d on h.OrderNumber = d.OrderNumber

Y aquí está el resultado.

No sólo puedo poner nombres de columna en la expre-sión JOIN, puedo incluso poner expresiones y literales. En este ejemplo, el número de trabajo de fabricación 123456, coincide con el número de orden de venta S123456.

Esta es la sintaxis que uso y recomiendo:

select m.MfgOrderNo, m.DueDate, c.SalesOrderNo, c.CustomerNofrom MfgOrdHdr as m left join SalesOrdHdr as con m.jobno = substr(c.SalesOrderNo,2)