16
SUMARIO Colaboraciones El poderoso SQL Upsert. Actualizar o agregar una Entidad 2 ¿Qué debería buscar en una solución MFT? 7 Consulting Como cambiar parte de un valor de cadena en una tabla de base de datos 4 ¿Puedo utilizar la instrucción SQL MERGE para escribir un "Upsert"? 6 Como actualizar un campo en un archivo físico con un valor de otro archivo basado en valores de campo de Unión comunes 12 Hacer un Update con uso menos intensivo del procesador 13 Novedades Crypto Complete un sistema de encriptación y control de contraseñas para Campos, IFS y Backups 15 GoAnywhere gestión centralizada de transferencia de archivos multiplataforma 16 COLABORACIONES El poderoso SQL Upsert. Actualizar o agregar una Entidad Un Update que consuma poco procesador Que buscar en una solución MFT Información sobre Power Systems, incluidos AS/400, iSeries y System i Año 30 - Enero-Febrero 2016 Nº 307 Precio: 7 Euros Como usted bien sabe, una tarea común en informática empresarial es actualizar una entidad (cliente, proveedor, línea de orden de compra, etc.) que existe, pero si no existe, se agrega la entidad. En RPG esto requiere dos operaciones: una actualización y una escritura dentro de una instrucción condicional. En SQL una declaración maneja todo el asunto. El programa ejecuta una lectura al azar (CHAIN) en el archivo de cliente. Si la lectura es correcta (es decir, el cliente está en la base de datos), el programa desactiva el indicador 99. Si la lectura falla, se enciende indicador 99. Una vez que los campos han sido cambiados, se almacenan los datos en la base de datos. Tenía curiosidad por averiguar cuál es más eficiente. Tengo que creer que es COALESCE, porque no parece estar ejecutando otro select con la cláusula EXISTS. Pero mi verdadero problema es actualizar más de un campo basado en otro archivo. He tenido ocasión de actualizar dos o más campos en un archivo, basado en otro y he utilizado la solución EXISTS, algo como esto: Mi conjetura es que el rendimiento sufre porque accede al archivo FIXES tres veces. Puede eliminar alguno algo de la sobrecarga actualizando ambos campos con una cláusula SET. He aquí está un ejemplo que utiliza campos que resultan más familiares para la mayoría de los lectores. Sea un archivo maestro de clientes que contiene, entre otras cosas, cam- pos de dirección, dos campos de ca- lles, ciudad, estado y código postal (ZIP). Siempre debe evaluar los sistemas de gestión de transferencia de archivos (MFT) con la mirada puesta en las ne- cesidades totales de la organización en lugar de las necesidades de un proyecto específico el que se pudiera estar con- siderando una inmediata adquisición o instalación de un Mpor FT. Aunque ini- cialmente puede centrarse en conseguir únicamente resolver funcionalidades y capacidades específicas, tener una solu- ción que pueda crecer para dar cabida a toda la organización es un acierto. La mayoría de las organizaciones consultadas querían empezar con una proyecto específico en mente; pero casi todos ellos, eventualmente, pensaban usar el MFT para algo más que ese proyecto. Muchos de ellos, adquieren un sistema MFT basándose en los re- querimientos del proyecto inicial, y ter- minan adquiriendo un sistema diferente para el siguiente nuevo proyecto, Sigue en página 2 Sigue en página 13 Sigue en página 7

Attitudes 307 As400

Embed Size (px)

DESCRIPTION

tecnico

Citation preview

Page 1: Attitudes 307 As400

SUMARIOColaboracionesEl poderoso SQL Upsert. Actualizar oagregar una Entidad 2 ¿Qué debería buscar en una solución MFT? 7

ConsultingComo cambiar parte de un valor de cadena en una tabla de base de datos 4 ¿Puedo utilizar la instrucción SQL MERGE para escribir un "Upsert"? 6 Como actualizar un campo en un archivofísico con un valor de otro archivo basadoen valores de campo de Unión comunes 12 Hacer un Update con uso menos intensivo del procesador 13

NovedadesCrypto Complete un sistema de encriptación y control de contraseñas para Campos, IFS y Backups 15

GoAnywhere gestión centralizada de transferencia de archivos multiplataforma 16

COLABORACIONESEl poderoso SQL Upsert. Actualizar o agregar una Entidad

Un Update que consuma poco procesador

Que buscar en una solución MFT

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

Año 30 - Enero-Febrero 2016 Nº 307 Precio: 7 Euros

Como usted bien sabe, una tarea común en informática empresarial es actualizar una entidad (cliente, proveedor, línea de orden de compra, etc.) que existe, pero si no existe, se agrega la entidad. En RPG esto requiere dos operaciones: una actualización y

una escritura dentro de una instrucción condicional. En SQL una declaración maneja todo el asunto. El programa ejecuta una lectura al azar (CHAIN) en el archivo de cliente. Si la lectura es correcta (es decir, el cliente está en la base de datos), el programa desactiva el

indicador 99. Si la lectura falla, se enciende indicador 99.

Una vez que los campos han sido cambiados, se almacenan los datos en la base de datos.

Tenía curiosidad por averiguar cuál es más eficiente. Tengo que creer que es COALESCE, porque no parece estar ejecutando otro select con la cláusula EXISTS.

Pero mi verdadero problema es actualizar más de un campo basado en otro archivo. He tenido ocasión de actualizar dos o más campos en un archivo, basado en otro y he utilizado la solución EXISTS, algo como esto:

Mi conjetura es que el rendimiento sufre porque accede al archivo FIXES

tres veces. Puede eliminar alguno algo de la sobrecarga actualizando ambos campos con una cláusula SET. He aquí está un ejemplo que utiliza campos que resultan más familiares para la mayoría de los lectores.

Sea un archivo maestro de clientes que contiene, entre otras cosas, cam-pos de dirección, dos campos de ca-lles, ciudad, estado y código postal (ZIP).

Siempre debe evaluar los sistemas de gestión de transferencia de archivos (MFT) con la mirada puesta en las ne-cesidades totales de la organización en lugar de las necesidades de un proyecto específico el que se pudiera estar con-siderando una inmediata adquisición o instalación de un Mpor FT. Aunque ini-cialmente puede centrarse en conseguir únicamente resolver funcionalidades y capacidades específicas, tener una solu-ción que pueda crecer para dar cabida a

toda la organización es un acierto.La mayoría de las organizaciones

consultadas querían empezar con una proyecto específico en mente; pero casi todos ellos, eventualmente, pensaban usar el MFT para algo más que ese proyecto. Muchos de ellos, adquieren un sistema MFT basándose en los re-querimientos del proyecto inicial, y ter-minan adquiriendo un sistema diferente para el siguiente nuevo proyecto,

Sigue en página 2

Sigue en página 13

Sigue en página 7

Page 2: Attitudes 307 As400

Como usted bien sabe, una tarea común en informática empresarial es actualizar una entidad (cliente, proveedor, línea de orden de compra, etc.) que existe, pero si no existe, se agrega la entidad. En RPG esto requiere dos

operaciones: una actualización y una escritura dentro de una instrucción condicional. En SQL una declaración maneja todo el asunto. Veamos cómo funciona. Aquí aparece algo de código RPG III que ilustra la situación:

El programa ejecuta una lectura al azar (CHAIN) en el archivo de cliente. Si la lectura es correcta (es decir, el cliente está en la base de datos), el programa desactiva el indicador 99. Si la lectura falla, se enciende indicador 99.

Una vez que los campos han sido cambiados, se almacenan los datos en la base de datos. El programa utiliza el indicador 99 para controlar si se van a actualizar o agregar los datos.

En el mundo de SQL, este tipo de operación de salida se llama informalmente un “upsert”, una combinación de actualización e introducción. La instrucción SQL que se encarga de “upserts” es MERGE.

Aquí está un fragmento de programa con SQL que hace al mismo tipo de cosa que el ejemplo RPG III hace.

El poderoso SQL Upsert

COLABORACIONES

2 Enero-Febrero 2016ATTITUDES Nº 307

El Poderoso SQL UpsertFCUSTF UF E K DISK . . . code omitted C CUSKEY KLIST C KFLD COMP C KFLD ACCT C* . . . more code omitted C* HILOEQ C CUSKEY CHAINCUSTREC 99 C* . . . code to load the fields omitted C* C *IN99 IFEQ *OFF C UPDATCUSTREC C ELSE C WRITECUSTREC C ENDIF . . . etc.

D aCompany s 3p 0 D aAccount s 5p 0 D aName s 20a D aCity s 15a D aState s 2a D aZip s 10a

exec sql merge into custf as tgt using (values(:aCompany, :aAccount, :aName, :aCity, :aState, :aZip))

El Poderoso SQL UpsertFCUSTF UF E K DISK . . . code omitted C CUSKEY KLIST C KFLD COMP C KFLD ACCT C* . . . more code omitted C* HILOEQ C CUSKEY CHAINCUSTREC 99 C* . . . code to load the fields omitted C* C *IN99 IFEQ *OFF C UPDATCUSTREC C ELSE C WRITECUSTREC C ENDIF . . . etc.

D aCompany s 3p 0 D aAccount s 5p 0 D aName s 20a D aCity s 15a D aState s 2a D aZip s 10a

exec sql merge into custf as tgt using (values(:aCompany, :aAccount, :aName, :aCity, :aState, :aZip))

as src (Company, Account, Name, City, State, Zip) on (tgt.Comp, tgt.Acct) = (src.Company, src.Account) when matched then update set tgt.Comp = src.Company, tgt.Acct = src.Account, tgt.Name = src.Name, tgt.City = src.City, tgt.State = src.State, tgt.Zip = src.Zip when not matched then insert values(src.Company, src.Account, src.Name, src.City, src.State, src.Zip);

merge into custf as tgt using (values(:aCompany, :aAccount, :aName, :aCity, :aState, :aZip)) as src (Company, Account, Name, City, State, Zip)

on (tgt.Comp, tgt.Acct) = (src.Company, src.Account) when matched then update set tgt.Comp = src.Company, tgt.Acct = src.Account, tgt.Name = src.Name, tgt.City = src.City, tgt.State = src.State, tgt.Zip = src.Zip

when not matched then insert values(src.Company, src.Account, src.Name, src.City, src.State, src.Zip);

Page 3: Attitudes 307 As400

Las variables del Host, aCompany, aAccount, aName, aCity, aState, and aZip han sido cargados con los valores

apropiados y almacenan los datos en la base de datos. He aquí un desglose del MERGE la fusión, paso a paso.

COLABORACIONES

3 Enero-Febrero 2016ATTITUDES Nº 307

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.

as src (Company, Account, Name, City, State, Zip) on (tgt.Comp, tgt.Acct) = (src.Company, src.Account) when matched then update set tgt.Comp = src.Company, tgt.Acct = src.Account, tgt.Name = src.Name, tgt.City = src.City, tgt.State = src.State, tgt.Zip = src.Zip when not matched then insert values(src.Company, src.Account, src.Name, src.City, src.State, src.Zip);

merge into custf as tgt using (values(:aCompany, :aAccount, :aName, :aCity, :aState, :aZip)) as src (Company, Account, Name, City, State, Zip)

on (tgt.Comp, tgt.Acct) = (src.Company, src.Account) when matched then update set tgt.Comp = src.Company, tgt.Acct = src.Account, tgt.Name = src.Name, tgt.City = src.City, tgt.State = src.State, tgt.Zip = src.Zip

when not matched then insert values(src.Company, src.Account, src.Name, src.City, src.State, src.Zip);

La tabla de base de datos que debe actualizarse es CUSTF, aquí da un nombre de correlación de tgt (destino).

Los datos que se combinarán en la base de datos están en las seis variables host mencionadas. La función de los valores, agrupa en una tabla derivada de una fila, conocida

por el nombre correlación src (fuente). Esta tabla derivada tiene seis columnas, nombradas como Company, Account, Name, City, State, and Zip.

El CUSTF y la tabla derivada creada por valores deben combinarse con empresa y número de cuenta.

Si una fila (registro) para la empresa y la cuenta ya está en CUSTF, se actualiza la fila con los datos de la tabla

derivada creada a partir de las variables host.

Si existe una fila para la empresa y la cuenta, se añade una nueva fila a la tabla CUSTF.

Con un poco de práctica, pronto estará upserting con lo mejor de ellos.

as src (Company, Account, Name, City, State, Zip) on (tgt.Comp, tgt.Acct) = (src.Company, src.Account) when matched then update set tgt.Comp = src.Company, tgt.Acct = src.Account, tgt.Name = src.Name, tgt.City = src.City, tgt.State = src.State, tgt.Zip = src.Zip when not matched then insert values(src.Company, src.Account, src.Name, src.City, src.State, src.Zip);

merge into custf as tgt using (values(:aCompany, :aAccount, :aName, :aCity, :aState, :aZip)) as src (Company, Account, Name, City, State, Zip)

on (tgt.Comp, tgt.Acct) = (src.Company, src.Account) when matched then update set tgt.Comp = src.Company, tgt.Acct = src.Account, tgt.Name = src.Name, tgt.City = src.City, tgt.State = src.State, tgt.Zip = src.Zip

when not matched then insert values(src.Company, src.Account, src.Name, src.City, src.State, src.Zip);

as src (Company, Account, Name, City, State, Zip) on (tgt.Comp, tgt.Acct) = (src.Company, src.Account) when matched then update set tgt.Comp = src.Company, tgt.Acct = src.Account, tgt.Name = src.Name, tgt.City = src.City, tgt.State = src.State, tgt.Zip = src.Zip when not matched then insert values(src.Company, src.Account, src.Name, src.City, src.State, src.Zip);

merge into custf as tgt using (values(:aCompany, :aAccount, :aName, :aCity, :aState, :aZip)) as src (Company, Account, Name, City, State, Zip)

on (tgt.Comp, tgt.Acct) = (src.Company, src.Account) when matched then update set tgt.Comp = src.Company, tgt.Acct = src.Account, tgt.Name = src.Name, tgt.City = src.City, tgt.State = src.State, tgt.Zip = src.Zip

when not matched then insert values(src.Company, src.Account, src.Name, src.City, src.State, src.Zip);

as src (Company, Account, Name, City, State, Zip) on (tgt.Comp, tgt.Acct) = (src.Company, src.Account) when matched then update set tgt.Comp = src.Company, tgt.Acct = src.Account, tgt.Name = src.Name, tgt.City = src.City, tgt.State = src.State, tgt.Zip = src.Zip when not matched then insert values(src.Company, src.Account, src.Name, src.City, src.State, src.Zip);

merge into custf as tgt using (values(:aCompany, :aAccount, :aName, :aCity, :aState, :aZip)) as src (Company, Account, Name, City, State, Zip)

on (tgt.Comp, tgt.Acct) = (src.Company, src.Account) when matched then update set tgt.Comp = src.Company, tgt.Acct = src.Account, tgt.Name = src.Name, tgt.City = src.City, tgt.State = src.State, tgt.Zip = src.Zip

when not matched then insert values(src.Company, src.Account, src.Name, src.City, src.State, src.Zip);

as src (Company, Account, Name, City, State, Zip) on (tgt.Comp, tgt.Acct) = (src.Company, src.Account) when matched then update set tgt.Comp = src.Company, tgt.Acct = src.Account, tgt.Name = src.Name, tgt.City = src.City, tgt.State = src.State, tgt.Zip = src.Zip when not matched then insert values(src.Company, src.Account, src.Name, src.City, src.State, src.Zip);

merge into custf as tgt using (values(:aCompany, :aAccount, :aName, :aCity, :aState, :aZip)) as src (Company, Account, Name, City, State, Zip)

on (tgt.Comp, tgt.Acct) = (src.Company, src.Account) when matched then update set tgt.Comp = src.Company, tgt.Acct = src.Account, tgt.Name = src.Name, tgt.City = src.City, tgt.State = src.State, tgt.Zip = src.Zip

when not matched then insert values(src.Company, src.Account, src.Name, src.City, src.State, src.Zip);

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

Page 4: Attitudes 307 As400

4 Enero-Febrero 2016ATTITUDES Nº 307

PREGUNTA USUARIO:De vez en cuando necesito cambiar parte de un valor de cadena en una tabla de base de datos. SQL tiene tres mecanismos que me permiten lograr tal cosa.¿Sabe usted cuáles son los tres mecanismos y cómo utilizarlos?

RESPUESTA ATT :En primer lugar, necesitamos una tabla para fines ilustrativos.

Mecanismo 1: Subcadena y concatenaciónPuede utilizar la función substring y concatenación para construir un nuevo valor para la cadena. Este método es apropiado cuando se sabe dónde comienza la subcadena.Por ejemplo, algunas de las partes tienen identificadores que comienzan con XX. Cambiemos XX por AA.

create table Parts ( ID char(6) primary key, Description varchar(40), Cost dec (5,2), Price dec (5,2));

insert into parts values ('XX-101', '20-inch Doodad', 0.12, 0.25), ('XX-105', '2-foot Doodad left-hand', 0.48, 0.75), ('XX-106', '2-foot Doodad right-hand', 0.48, 0.75), ('XX-118', '12-foot Doodad', 1.25, 3.00), ('BA-101', '5CM Widget', 0.30, 0.45), ('BA-104', '15Cm Widget', 1.00, 1.35), ('BA-111', '150cm Widget', 5.00, 8.00), ('BA-145', 'Used 15cm Widget', 0.20, 0.80), ('CT-201', 'ACME chain stretcher', 4.75, 19.99), ('CT-202', 'Refurbished ACME sky hook', 3.00, 12.00); update parts set ID = 'AA' concat substr(ID,3) where ID between 'XX' and 'XX9'

ID DESCRIPTION AA-101 20-inch Doodad AA-105 2-foot Doodad left-hand AA-106 2-foot Doodad right-hand AA-118 12-foot Doodad BA-101 5CM Widget BA-104 15Cm Widget BA-111 150cm Widget BA-145 Used 15cm Widget CT-201 ACME chain stretcher CT-202 Refurbished ACME sky hook

create table Parts ( ID char(6) primary key, Description varchar(40), Cost dec (5,2), Price dec (5,2));

insert into parts values ('XX-101', '20-inch Doodad', 0.12, 0.25), ('XX-105', '2-foot Doodad left-hand', 0.48, 0.75), ('XX-106', '2-foot Doodad right-hand', 0.48, 0.75), ('XX-118', '12-foot Doodad', 1.25, 3.00), ('BA-101', '5CM Widget', 0.30, 0.45), ('BA-104', '15Cm Widget', 1.00, 1.35), ('BA-111', '150cm Widget', 5.00, 8.00), ('BA-145', 'Used 15cm Widget', 0.20, 0.80), ('CT-201', 'ACME chain stretcher', 4.75, 19.99), ('CT-202', 'Refurbished ACME sky hook', 3.00, 12.00); update parts set ID = 'AA' concat substr(ID,3) where ID between 'XX' and 'XX9'

ID DESCRIPTION AA-101 20-inch Doodad AA-105 2-foot Doodad left-hand AA-106 2-foot Doodad right-hand AA-118 12-foot Doodad BA-101 5CM Widget BA-104 15Cm Widget BA-111 150cm Widget BA-145 Used 15cm Widget CT-201 ACME chain stretcher CT-202 Refurbished ACME sky hook

Concatena la cadena a A al tercer y siguientes caracteres de la identificación y asigna el resultado a la columna ID. Que-daría así:

La cadena que debe ser reemplazada y la cadena de reemplazo no deben tener la misma longitud. Que es el caso de este ejemplo.

Mecanismo 2: La función de reemplazarCuando no sabe donde comienza una subcadena, puede utilizar la función reemplazar para sustituir una cadena por otra.

Permite reemplazar el término “doodad” por el término “doohickey” término más elegante y urbano.

create table Parts ( ID char(6) primary key, Description varchar(40), Cost dec (5,2), Price dec (5,2));

insert into parts values ('XX-101', '20-inch Doodad', 0.12, 0.25), ('XX-105', '2-foot Doodad left-hand', 0.48, 0.75), ('XX-106', '2-foot Doodad right-hand', 0.48, 0.75), ('XX-118', '12-foot Doodad', 1.25, 3.00), ('BA-101', '5CM Widget', 0.30, 0.45), ('BA-104', '15Cm Widget', 1.00, 1.35), ('BA-111', '150cm Widget', 5.00, 8.00), ('BA-145', 'Used 15cm Widget', 0.20, 0.80), ('CT-201', 'ACME chain stretcher', 4.75, 19.99), ('CT-202', 'Refurbished ACME sky hook', 3.00, 12.00); update parts set ID = 'AA' concat substr(ID,3) where ID between 'XX' and 'XX9'

ID DESCRIPTION AA-101 20-inch Doodad AA-105 2-foot Doodad left-hand AA-106 2-foot Doodad right-hand AA-118 12-foot Doodad BA-101 5CM Widget BA-104 15Cm Widget BA-111 150cm Widget BA-145 Used 15cm Widget CT-201 ACME chain stretcher CT-202 Refurbished ACME sky hook

Page 5: Attitudes 307 As400

5 Enero-Febrero 2016ATTITUDES Nº 307

La cláusula WHERE no era necesaria, pero incluyéndolo se evita al SQL actualizar otras filas innecesariamente.Contemple la tabla ahora:

Mecanismo 3: Expresiones regularesLas expresiones regulares son de tipo críptico pero de gran alcance para el procesamiento del comodín. Para conocer más

acerca de ellas, lea la excelente explicación de Michael Sansoterras en este enlace:

http://www.itjungle.com/fhg/fhg051915-story01.html

Vamos a cambiar las piezas que se miden en centímetros de dos maneras. En primer lugar, aseguremos que la abreviatura de centímetro, cm, está en letras minúsculas. En segundo lugar, dejaremos sólo un espacio entre el cm y el siguiente texto. Aquí está la actualización:

update parts set Description = replace(Description, 'Doodad', 'Doohickey') where ID between 'AA' and 'AA9' ID Description AA-101 20-inch Doohickey AA-105 2-foot Doohickey left-hand AA-106 2-foot Doohickey right-hand AA-118 12-foot Doohickey BA-101 5CM Widget BA-104 15Cm Widget BA-111 150cm Widget BA-145 Used 15cm Widget CT-201 ACME chain stretcher CT-202 Refurbished ACME sky hook

update parts as p set p.description = regexp_replace(p.description, '([0-9]+)[Cc][Mm]( +)','$1cm ') where regexp_like (p.description,'[0-9]+[Cc][Mm]')

update parts set Description = replace(Description, 'Doodad', 'Doohickey') where ID between 'AA' and 'AA9' ID Description AA-101 20-inch Doohickey AA-105 2-foot Doohickey left-hand AA-106 2-foot Doohickey right-hand AA-118 12-foot Doohickey BA-101 5CM Widget BA-104 15Cm Widget BA-111 150cm Widget BA-145 Used 15cm Widget CT-201 ACME chain stretcher CT-202 Refurbished ACME sky hook

update parts as p set p.description = regexp_replace(p.description, '([0-9]+)[Cc][Mm]( +)','$1cm ') where regexp_like (p.description,'[0-9]+[Cc][Mm]')

Mire ahora la tabla:

update parts set Description = replace(Description, 'Doodad', 'Doohickey') where ID between 'AA' and 'AA9' ID Description AA-101 20-inch Doohickey AA-105 2-foot Doohickey left-hand AA-106 2-foot Doohickey right-hand AA-118 12-foot Doohickey BA-101 5CM Widget BA-104 15Cm Widget BA-111 150cm Widget BA-145 Used 15cm Widget CT-201 ACME chain stretcher CT-202 Refurbished ACME sky hook

update parts as p set p.description = regexp_replace(p.description, '([0-9]+)[Cc][Mm]( +)','$1cm ') where regexp_like (p.description,'[0-9]+[Cc][Mm]')

ID Description AA-101 20-inch Doohickey AA-105 2-foot Doohickey left-hand AA-106 2-foot Doohickey right-hand AA-118 12-foot Doohickey BA-101 5cm Widget BA-104 15cm Widget BA-111 150cm Widget BA-145 Used 15cm Widget CT-201 ACME chain stretcher CT-202 Refurbished ACME sky hook

where regexp_like (p.description,'[0-9]+[Cc][Mm]')

regexp_replace(p.description, '([0-9]+)[Cc][Mm]( +)','$1cm ')

La cláusula WHERE utiliza la expresión regular como función para seleccionar las filas que tienen un número seguido de las letras “CM” en cualquier caso. Ver más de cerca.

· (0-9) .- Coincide con cualquier dígito.· (+) .- Significa que coincide con una o más apariciones de la selección anterior. Esto evita que el sistema seleccione las piezas ACME para actualización.· (Cc) .- Nos dice que el sistema busca la letra “C” en mayúscula o en minúscula.· (Mm) .- Nos indica que el sistema busca la letra “M” en mayúscula o en minúscula.

La función de reemplazar expresiones regulares cambia parte de la cadena.

ID Description AA-101 20-inch Doohickey AA-105 2-foot Doohickey left-hand AA-106 2-foot Doohickey right-hand AA-118 12-foot Doohickey BA-101 5cm Widget BA-104 15cm Widget BA-111 150cm Widget BA-145 Used 15cm Widget CT-201 ACME chain stretcher CT-202 Refurbished ACME sky hook

where regexp_like (p.description,'[0-9]+[Cc][Mm]')

regexp_replace(p.description, '([0-9]+)[Cc][Mm]( +)','$1cm ')

ID Description AA-101 20-inch Doohickey AA-105 2-foot Doohickey left-hand AA-106 2-foot Doohickey right-hand AA-118 12-foot Doohickey BA-101 5cm Widget BA-104 15cm Widget BA-111 150cm Widget BA-145 Used 15cm Widget CT-201 ACME chain stretcher CT-202 Refurbished ACME sky hook

where regexp_like (p.description,'[0-9]+[Cc][Mm]')

regexp_replace(p.description, '([0-9]+)[Cc][Mm]( +)','$1cm ')

Page 6: Attitudes 307 As400

6 Enero-Febrero 2016ATTITUDES Nº 307

PREGUNTA USUARIO AS/400:Estoy tratando de utilizar la instrucción SQL MERGE para escribir un “upsert” que almacene los datos

para ser insertados o actualizados en una estructura de datos descritos externamente. ¿Es esto posible? Cualquier idea al respecto sería útil.

Cuando se encuentra tal coincidencia, el sistema utiliza el tercer parámetro para sustituir el texto coincidente.

· “S1” significa incluir el contenido del primer grupo de captura, que consiste en los dígitos anteriores a las letras “CM”.· Las letras “cm” y un espacio en blanco son para introducirse en la cadena tras el primer grupo de captura.· El segundo grupo de captura, que contiene los espacios en blanco después de “CM”, no está referenciado, por lo que el

sistema no lo incluye en la cadena de reemplazo.

El resto de la descripción no es parte de la búsqueda y por lo tanto no se ve afectado.Así que ahí lo tienen. Tres mecanismos de reemplazo. Si usted necesita reemplazar parte de una cadena, puede conse-

guirlo con lo explicado.

RESPUESTA ATT:Aunque Ud. sólo quería ocuparse de una fila en la tabla

de base de datos, lo que estaba haciendo califica como un upsert en mi libro. Está actualizando una fila si está allí y agregándola si no es así. Sin embargo, no creo que MER-GE sea la herramienta adecuada para este trabajo.

MERGE está diseñado para actualizar muchos registros

en una tabla desde un lote de filas de otra tabla. Si Ud. trata de upsert un montón de filas de una matriz de estructura de datos o una estructura de datos de ocurrencia, múltiple, tal vez sería sensato MERGE, pero estoy bastante seguro de que el SQL no lo permite. En cambio, recomiendo que trate de ejecutar cualquier operación, INSERT o UPDATE, y si fallase, pruebe con esto:

· ( .- Indica el inicio del primer grupo de captura.· (0-9) .- Coincide con cualquier dígito.· (+) .- Significa que coincide con una o más apariciones del partido anterior.· ) .- Indica el final del primer grupo de captura.· (Cc) .- Nos dice que el sistema busca la letra “C” en mayúscula o en minúscula.· (Mm) .- Nos indica que el sistema busca la letra “M” en mayúscula o en minúscula.· “(“ .- Indica el inicio del primer grupo de captura.· El espacio en blanco indica al sistema que busque un carácter en blanco.· “+” .- Significa que coincide con una o más apariciones de la selección anterior.· “)” .- Indica el final del primer grupo de captura.

Sigue en página 12

Page 7: Attitudes 307 As400

9 Noviembre-Diciembre 2015ATTITUDES Nº 306

Encryption Standards Este es un área donde no debe escatimar.

Tal vez su proyecto actual no implica o no requiere cifrado, o tal vez el proyecto no requiere una técnica de cifrado muy potente porque los datos que se transfieren no son especialmente sensibles.

Bien, pero no debe elegir una solución MFT en base solo a ese criterio. Algún día, su organización puede necesitar un mejor cifrado incluso el actual proyecto puede tener que cumplir con nuevos requerimientos por influencias externas como requisitos de la legislación o de la industria.

Facilita mucho la elección de un Managed File Transfer (MFT) el que un organismo independiente certifique su tecnología de encriptación y cuente con un certificado de validación FIPS 140-2. Hay dos razones para ello: En primer lugar, es el mejor cifrado que el dinero puede comprar. Y segundo, contar

con esta validación fuerza al fabricante a construir el software de criptografía como un módulo, lo que facilita al fabricante sustituir ese módulo y reemplazarlo por uno mejor, si los estándares de cifrado evolucionan en el futuro (como sin duda lo harán). De esta forma, el fabricante del software puede actualizarlo sin obligarle a instalar una solución enteramente nueva.

Protocol Flexibility Haga lo que haga, es importante escoger

aquella solución MFT con el mayor abanico de protocolos de transferencia estándar y capacidad de actualización posible.

Eso significa elegir una solución que, como mínimo, soporte:

De esa manera, nunca quedará atrapado cuando algún nuevo requisito de seguridad sea necesario o se tenga que relacionar con un socio de negocios cuyo sistema esta más

Siempre debe evaluar los sistemas de gestión de transferencia de archivos (MFT) con la mirada puesta en las necesidades totales de la organización en lugar de las necesidades de un proyecto específico en el que se pudiera estar considerando una inmediata adquisición o instalación de un MFT. Aunque inicialmente puede centrarse en conseguir únicamente resolver funcionalidades y capacidades específicas, tener una solución que pueda crecer para dar cabida a toda la organización es un acierto.

La mayoría de las organizaciones consultadas querían empezar con una proyecto específico

en mente; pero casi todos ellos, eventualmente, pensaban usar el MFT para algo más que ese proyecto. Muchos de ellos, adquieren un sistema MFT basándose en los requerimientos del proyecto inicial, y terminan adquiriendo un sistema diferente para el siguiente nuevo proyecto, acabando con una mezcla de sistemas dispares. Cuanto más pueda pensar en el futuro de lo que la empresa puede necesitar, más podrá centrarse en elegir una solución capaz de crecer adaptándose a esas necesidades futuras.

En general, es deseable una solución que ofrezca flexibilidad. De esa manera, no tendrá

necesariamente que predecir con exactitud todas las necesidades futuras. En su lugar, puede confiar en un sistema bien equipado el cual simplemente pueda atender lo que las necesidades futuras puedan implicar.

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

Boletín Informativo.- GA-1603 Página 1/4 15 de Marzo de 2016

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

¿Qué debería buscar en una solución MFT?

• FTP • SSL/FTPS • SSH/SFTP/SCP2 • HTTP (y HTTPS)

• SMTP/POP • CIFS/SMB • EDINT AS1, AS2, y AS3

Page 8: Attitudes 307 As400

COLABORACIONES

3 Junio-Julio 2012ATTITUDES Nº 282

limitado en sus selecciones de protocolo o bien, vaya por delante ya en cuanto a los protocolos de última generación utilizados.

Algunas soluciones MFT pueden ofrecer algunos de los protocolos ya estandarizados como un módulo opcional. No es problema siempre y cuando usted tenga la posibilidad de disponer de ellos, será capaz de manejar cualquier situación del negocio con la que se encuentre en el futuro.

Una solución que cubre todos y cada uno de estos protocolos es lo que debe proponer un vendedor que pretenda dar una amplia cobertura; incluso si apareciera un muevo protocolo, una solución de amplia cobertura debería poder adoptar ese nuevo protocolo, en cuanto sea aceptado por el mundo de los negocios.

Workflow Flexibility A lo largo de esta información, se repite la

idea de que MFT es algo más que una mera transferencia de archivos. De hecho, la parte de "FT" (File Transfer) es la parte menos desafiante técnicamente hablando de una solución MFT; es la parte de "M" (Managed) la que es realmente difícil.

Una solución de Gestión de Transferencia Archivos (MFT) no sólo envía archivos de un lugar a otro sino que también distribuye el archivo a través de varios sistemas propios para completar procesos de negocio. Es poco frecuente tener sólo que coger o dejar un archivo en uno u otro directorio o carpeta.

Habitualmente, querrá que el archivo sea procesado de alguna manera. La capacidad de procesar esos archivos es conocida por los proveedores de MFT con términos, como

integración, coordinación y otros similares. Preferimos usar el término flujo de trabajo porque estamos utilizando la solución MFT para implementar un proceso más amplio, normalmente basado en un flujo predefinido de acciones.

Así que, ¿qué debe buscar en términos de capacidades del flujo de trabajo? • La codificación mínima necesaria.

Muchas soluciones permiten construir, sin necesidad de recurrir a código alguno, procesos bastante complicados, Tal vez, en algunos casos baste una mínima cantidad de código personalizado para una acción determinada. A menor codificación más fácil resulta la ejecución y la implementación. • Estandarización.

Las interfases de programación de aplicaciones (API) deben utilizar lenguajes estándar, ampliamente utilizados por la industria como “C” o Java y la información debe fluir en formatos estándar como XML. • Workflows personalizables.

En algunas soluciones MFT de bajo perfil, la idea de "flujo de trabajo" consiste en unos cuantos pasos fijos preestablecidos. Hay que ser ambicioso y buscar un sistema MFT que ofrezca una puerta abierta para incorporar cualquier tipo de proceso. Si trata de un sistema con plantillas o flujos de trabajo (procesos) preestablecidos con los que se pueda empezar a trabajar, estupendo, pero evite quedar limitado por las ideas de un fabricante y condicionar los objetivos a conseguir en su empresa.

Data Handling Flexibility Recapitulando lo que hemos cubierto

hasta ahora a nivel de procesos, podemos transferir archivos de un sitio a otro y tratar esos archivos a través de un flujo de trabajo. En algún momento, ese flujo de trabajo puede tener que convertir o transformar los datos o realizar una validación de datos.

La mayoría de empresas se conformaría

con un sistema MFT que pudiera invocar componentes externos de forma sencilla para hacer conversiones de datos y luego, codificar o adquirir esos componentes por

Boletín informativo.- GA-1603 Página 2/4 15 de Marzo de 2016

¿Qué debería buscar en una solución MFT?

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

Page 9: Attitudes 307 As400

COLABORACIONES

3 Junio-Julio 2012ATTITUDES Nº 282 American Top Tools S.L Tel. 9333191612 [email protected] www.mftsolutions.es

separado. Una auténtica solución MFT ya incluye estas valiosas capacidades en su propia estructura de producto.

¿Cómo no habría de hacerlo? Siendo el objetivo la gestión de los datos a lo largo de su ciclo de vida, la simple recepción y envío de datos a otros procesos no está cubriendo todo el ciclo de vida.

El manejo de la conversión de los datos para enviarlos a sus propios sistemas o para facilitar su uso a sus socios externos o entre dos sistemas internos, es una parte muy sensible en el ciclo de vida de sus datos. La utilización de una solución MFT adecuada puede ayudarle a hacerlo con seguridad y precisión.

La traducción o transformación de los datos, por lo general, toma la forma de unos mapas de datos predefinidos. "ES debería ser España" y "GE debería ser Gerona" son simples ejemplos de mapas de datos que una solución MFT debería implementar. Además, algunos sistemas MFT permiten establecer reglas, rechazando datos que no cumplen ciertas normas.

En este tipo de conversión depende cómo el software está escrito. Si no está escrito en un lenguaje nativo (tipo C++/C), es probable que con el tratamiento masivo de datos no funcione ágilmente. Durante el proceso de evaluación de las distintas soluciones MFT, asegúrese de ejecutar pruebas del software de conversión con una muestra altamente representativa de los datos para obtener un resultado para una ejecución fiable de ensayo.

Interface Flexibility La flexibilidad del interfaz es el área

donde las empresas descuidan más aún la planificación para el futuro. A menudo, el MFT se introduce en la empresa con el fin de resolver la necesidad actual de un proyecto específico el cual, casi siempre implica tratar requisitos de transferencia de datos Servidor a Servidor. Habitualmente, transferir datos en un horario programado, entre la empresa y un socio de negocios. Es lo que MFT hace bien y es un escenario relativamente sencillo con el que iniciarse en el MFT.

¡Cuidado! Transferir archivos y datos no es la única necesidad de transferencia que tienen las empresas. Las transferencias de Servidor a Servidor, Persona a Persona o Persona a Servidor, son todas importantes.

En realidad, las empresas que se inician en MFT con simples transferencias Servidor a Servidor, luego descubren que el tráfico de Persona a Persona abarca la mayor parte de los datos gestionados por la solución MFT, quedando atónitos ante un escenario poco esperado, por fin dándose cuenta de que las transferencias Persona a Persona pueden constituir una seria necesidad del negocio.

Boletín informativo.- GA-1603 Página 3/4 15 de Marzo de 2016

En realidad las compañías que comienzan con simples transferencias Servidor a Servidor, luego descubren que su tráfico de Persona a Persona es la mayor parte de los datos que utilizan la solución MFT .

¿Qué debería buscar en una solución MFT?

Page 10: Attitudes 307 As400

COLABORACIONES

3 Junio-Julio 2012ATTITUDES Nº 282

Sin embargo, esto es lo que sucede. La empresa se inicia con el MFT, haciendo las transferencias de Servidor a Servidor. Luego, se dan cuenta de que muchos otros datos deberían ser transferidos a través del MFT, (protegidos, entrega garantizada, auditados y más). Más procesos de negocio se incluyen bajo el paraguas del servidor MFT.

Poco tiempo después, alguien se pregunta por qué los usuarios utilizan su herramienta de correo electrónico, sin protección, sin garantía de entrega, y sin auditoría para mover archivos entre usuarios. ¿Podrá la solución MFT ayudar a gestionar, asegurar y auditar así los "archivos adjuntos"? Con la solución adecuada de la MFT, si se puede.

Aunque su necesidad inmediata no contemple la transferencias de Persona a Persona, debe considerarla seriamente de cara al futuro. Seleccione una solución MFT que no sólo los soporte sino que los soporte bien. Lo que Ud. quiere es un sistema que puede proporcionar una interfase de usuario basada en Web, de modo que los usuarios externos puedan enviar archivos a la organización o recoger archivos enviados a ellos por alguien de dentro de la empresa.

Algunos sistemas de MFT además ofrecen software muy completo de entorno cliente, tal vez una utilidad independiente o incluso un módulo para el Outlook, facilitando a los los usuarios la realización de transferencias específicas persona a persona. Los módulos accesorios para Outlook son ideales, ya que proporcionan a los usuarios un medio de acceso a las transferencias específicas que se ven y se sienten como el habitual envío de "archivos adjuntos" que ya conocen.

Happy Auditors Estos son algunos de los registros o logs

más importantes que un auditor esperará encontrar en un buen sistema MFT:

Auditoría de Registros de cada archivo transferido. Según el protocolo y software utilizado, debe incluir registros que prueben la recepción del archivo.

Auditoría de registros de la actividad MFT relacionada. Habitualmente, inicio/cierre de sesión, cambios de configuración o de permisos, creación de nuevas cuentas de

usuario y cualquier otra actividad que ocurra enteramente dentro de la propia solución MFT.

Auditoría de los registros de las distintas configuraciones de seguridad, como el nivel de cifrado, para cada transferencia de archivo.

Log paso a paso de los distintos pasos , como la transformación de datos, dentro de un proceso, de aquellas Soluciones que están coordinando también los datos a través de un flujo completo de procesos de trabajo.

Log de los detalles de las actividades realizadas por aquellas soluciones que se pueden configurar para limpiar bien los datos después de que han sido enviados, limitar el número de envíos de un archivo u otras opciones, que garanticen al auditor que las cosas están ocurriendo según lo configurado.

Estos datos deben estar disponibles para

cada transferencia de archivos, incluidas las transferencias específicas (ad hoc) realizadas entre usuarios individuales que usan los sistemas MFT para sus objetivos específicos. Otra razón por la que los auditores aprecian los sistemas de MFT. Pueden saber mucho más acerca de este tipo de transferencias ahora que cuando se envían a través del correo electrónico como archivos adjuntos.

Algunas soluciones MFT ofrecen informes

formales, otras necesitan escribir un pequeño script que consulta la información de auditoría de una base de datos.

Boletín informativo.- GA-1603 Página 4/4 15 de Marzo de 2016

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

¿Qué debería buscar en una solución MFT?

Page 11: Attitudes 307 As400

11 Enero-Febrero 2016ATTITUDES Nº 307

Page 12: Attitudes 307 As400

12 Enero-Febrero 2016ATTITUDES Nº 307

PREGUNTA USUARIO AS/400:¿Es posible utilizar SQL para actualizar un campo de base de datos en un archivo físico con un valor de

otro archivo basado en valores de campo de Unión comunes?

RESPUESTA ATT:Sí. Esta es una pregunta común y su respuesta es una

buena técnica para saber. Aquí está una ilustración.Supongamos que la Empresa XYZ está reduciendo el

número de regiones de ventas. Necesitan actualizar el ar-chivo maestro de clientes mediante la sustitución de un nú-mero de región existente con otro número de región. Por ejemplo, todos los clientes en la región 4 son reasignadas a región 1, y todos los clientes en la región 5 son reasignadas a región 3.

Supongamos que hay cientos de estas reasignaciones.

Las reasignaciones se almacenan en un archivo físico llamado FIXES, que tiene dos campos: Número de región antigua y número de nueva región. He aquí un manadato SQL que consigue la tarea:

de upsert un montón de filas de una matriz de estructura de datos o una estructura de datos de ocurrencia, múltiple, tal vez sería sensato MERGE, pero estoy bastante seguro de que el SQL no lo permite. En cambio, recomiendo que trate de ejecutar cualquier operación, INSERT o UPDATE, y si fallase, pruebe con esto:

La tabla de empresas está codificada en una sola colum-na (campo)--ID.

Lo que me ha gustado de su código es la expresión de conjunto de filas (Set Row) que utiliza en su sentencia MERGE. La he copiado en la sentencia de actualización (Update) en mi ejemplo. Escribí sobre el conjunto de filas (set Row) unos años atrás,

http://www.itjungle.com/mgo/mgo121203-story02.html

pero no creo que haya mencionado utilizarlo con una estructura de datos RPG. Utilizando una estructura de datos en las sentencias INSERT y UPDATE se consegue un códi-go corto y claro.

En este caso, si la región es siendo reasignada, la región se establece en la nueva región en el archivo FIXES. Pero si la región no se va a reasignar (es decir, no hay ningún re-gistro coincidente en FIXES), la región se establece en su valor actual. La función COALESCE, que elige el primer valor no null de una lista, lo hace todo posible.

Una cosa que me gusta de esta técnica es que el primer

argumento de COALESCE es un mandato SELECT de SQL. IBM ha mejorado SQL400 para permitir mandatos SELECT más integrados, lo que hace el SQL más potente. Una gran diferencia entre estas dos consultas es que la pri-mera sólo actualiza los registros modificados, mientras que la segunda consulta actualiza todos los registros en el ar-chivo físico.

D CompanyInfo e ds qualified extname(COMPANIES)

D DUPLICATE_KEY c const('23505')

exec sql insert into companies values(:CompanyInfo);

if SqlState = DUPLICATE_KEY exec sql update companies set row = :CompanyInfo where ID = :CompanyInfo.ID; endif;

PREGUNTA USUARIO IBM i: update customer as c set region = (select newregion from fixes where oldregion = c.region) where exists (select * from fixes where oldregion = c.region)

update customer as c set region = coalesce((select newregion from fixes where oldregion = c.region), region)

Page 13: Attitudes 307 As400

13 Enero-Febrero 2016ATTITUDES Nº 307

PREGUNTA USUARIO AS/400:Agradezco su sugerencia para utilizar COALESCE al actualizar un archivo a través de una combinación:

http://www.itjungle.com/mgo/mgo100303-story02.html

Pero tenía curiosidad por averiguar cuál es más eficiente. Tengo que creer que es COALESCE, porque no parece estar ejecutando otro select con la cláusula EXISTS.

Pero mi verdadero problema es actualizar más de un campo basado en otro archivo. He tenido ocasión de actualizar dos o más campos en un archivo, basado en otro y he utilizado la solución EXISTS, algo como esto:

Éste merece siempre una ¿qué haces? llamada desde el administrador. ¿Qué puedo hacer para que esto tenga un uso menos intensivo del procesador?

RESPUESTA ATT:Mi conjetura es que el rendimiento sufre porque accede

al archivo FIXES tres veces. Puede eliminar alguno algo de la sobrecarga actualizando ambos campos con una cláusula SET. He aquí está un ejemplo que utiliza campos que resul-

tan más familiares para la mayoría de los lectores.Sea un archivo maestro de clientes que contiene, entre

otras cosas, campos de dirección, dos campos de calles, ciudad, estado y código postal (ZIP).

UPDATE MLIB/PRODFILE A SET FIELD1 = (SELECT NEWFIELD1 FROM FIXES B WHERE A.CO# = 1 AND A.CUST# = B.CUST#), SET FIELD2 = (SELECT NEWFIELD2 FROM FIXES C WHERE A.CO# = 1 AND A.CUST# = C.CUST#) WHERE EXISTS (SELECT * FROM FIXES D WHERE A.CO# = 1 AND A.CUST# = D.CUST#)

Éste merece siempre una ¿qué haces? llamada desde el administrador. ¿Qué puedo hacer para que esto tenga un uso menos intensivo del procesador?

create table custmaster (custnbr dec(5), custname char(20), custaddr1 char(20), custaddr2 char(20), custcity char(14), custstate char(2), custzip char(10), . . . more fields omitted . . . primary key(custnbr))

create table newaddr (custnbr dec(5), addr1 char(20), addr2 char(20), city char(14), state char(2), zip char(10), primary key(custnbr))

update custmaster as c set (custaddr1, custaddr2, custcity, custstate, custzip) = (select addr1, addr2, city, state, zip from newaddr as na where c.custnbr = na.custnbr) where custnbr in (select custnbr from newaddr)

Page 14: Attitudes 307 As400

14 Enero-Febrero 2016ATTITUDES Nº 307

Digamos además que tenemos un archivo con nuevas direcciones que se deben aplicar al maestro de cliente.

En este ejemplo, hay cinco campos que necesitan ser actua-lizados basados en el número de cliente. Para llevar a cabo la actualización, hay poner los nombres de los cinco cam-

pos en la cláusula SET y rodearlos con paréntesis. Luego hay asignar cinco valores a la lista de campos entre parén-tesis.

Hay otro atajo que quizás le interese conocer. Si desea re-emplazar todos los campos de un registro, puede seguir

SET con la palabra ROW.

Para abordar su pregunta acerca de la eficacia, siempre es difícil decir cuál es más eficiente. Una de las grandes cosas acerca de SQL es que releva a los seres humanos de la ta-rea de descubrir la mecánica de la manipulación y recupe-ración de datos. Es decir, le decimos al ordenador lo que queremos y él decide cómo hacerlo.

Cuando dudas sobre cual de los dos métodos es mejor, eje-cuto los dos y veo cual funciona mejor. En muchos casos, no importa. El motor de base de datos a menudo convierte

las consultas de un tipo a otro, de todos modos. Por ejem-plo, se puede codificar una cláusula SELECT después de un predicado IN, pero el administrador de base de datos puede cambiar a una combinación interna INNER JOIN.

Otra cosa a tener en cuenta es que la eficiencia cambia de telease en release de sistema operativo o del propio motor del SQL. Cuando una consulta se ejecuta bien, dejarla sola. Cuando se ejecuta lenta o mal, use debug o Visual Explain para averiguar cómo hacer que funcione mejor.

UPDATE MLIB/PRODFILE A SET FIELD1 = (SELECT NEWFIELD1 FROM FIXES B WHERE A.CO# = 1 AND A.CUST# = B.CUST#), SET FIELD2 = (SELECT NEWFIELD2 FROM FIXES C WHERE A.CO# = 1 AND A.CUST# = C.CUST#) WHERE EXISTS (SELECT * FROM FIXES D WHERE A.CO# = 1 AND A.CUST# = D.CUST#)

Éste merece siempre una ¿qué haces? llamada desde el administrador. ¿Qué puedo hacer para que esto tenga un uso menos intensivo del procesador?

create table custmaster (custnbr dec(5), custname char(20), custaddr1 char(20), custaddr2 char(20), custcity char(14), custstate char(2), custzip char(10), . . . more fields omitted . . . primary key(custnbr))

create table newaddr (custnbr dec(5), addr1 char(20), addr2 char(20), city char(14), state char(2), zip char(10), primary key(custnbr))

update custmaster as c set (custaddr1, custaddr2, custcity, custstate, custzip) = (select addr1, addr2, city, state, zip from newaddr as na where c.custnbr = na.custnbr) where custnbr in (select custnbr from newaddr)

UPDATE MLIB/PRODFILE A SET FIELD1 = (SELECT NEWFIELD1 FROM FIXES B WHERE A.CO# = 1 AND A.CUST# = B.CUST#), SET FIELD2 = (SELECT NEWFIELD2 FROM FIXES C WHERE A.CO# = 1 AND A.CUST# = C.CUST#) WHERE EXISTS (SELECT * FROM FIXES D WHERE A.CO# = 1 AND A.CUST# = D.CUST#)

Éste merece siempre una ¿qué haces? llamada desde el administrador. ¿Qué puedo hacer para que esto tenga un uso menos intensivo del procesador?

create table custmaster (custnbr dec(5), custname char(20), custaddr1 char(20), custaddr2 char(20), custcity char(14), custstate char(2), custzip char(10), . . . more fields omitted . . . primary key(custnbr))

create table newaddr (custnbr dec(5), addr1 char(20), addr2 char(20), city char(14), state char(2), zip char(10), primary key(custnbr))

update custmaster as c set (custaddr1, custaddr2, custcity, custstate, custzip) = (select addr1, addr2, city, state, zip from newaddr as na where c.custnbr = na.custnbr) where custnbr in (select custnbr from newaddr)

UPDATE MLIB/PRODFILE A SET FIELD1 = (SELECT NEWFIELD1 FROM FIXES B WHERE A.CO# = 1 AND A.CUST# = B.CUST#), SET FIELD2 = (SELECT NEWFIELD2 FROM FIXES C WHERE A.CO# = 1 AND A.CUST# = C.CUST#) WHERE EXISTS (SELECT * FROM FIXES D WHERE A.CO# = 1 AND A.CUST# = D.CUST#)

Éste merece siempre una ¿qué haces? llamada desde el administrador. ¿Qué puedo hacer para que esto tenga un uso menos intensivo del procesador?

create table custmaster (custnbr dec(5), custname char(20), custaddr1 char(20), custaddr2 char(20), custcity char(14), custstate char(2), custzip char(10), . . . more fields omitted . . . primary key(custnbr))

create table newaddr (custnbr dec(5), addr1 char(20), addr2 char(20), city char(14), state char(2), zip char(10), primary key(custnbr))

update custmaster as c set (custaddr1, custaddr2, custcity, custstate, custzip) = (select addr1, addr2, city, state, zip from newaddr as na where c.custnbr = na.custnbr) where custnbr in (select custnbr from newaddr)

update custmaster set row = (1, "Jax Hamburgers", . . . other values omitted . . .)