Gracias Luis y Disculpa no habia tenido tiempo de responder pero esta parte de 
la tabla intermedia no la entendi correctamente, si no es mucho pedir me lo 
podias explicar un poco mas a detalle porfa porque sigo tratando de bajar este 
tiempo. Gracias por tu interes  

--- El lun, 12/27/10, Luis . <digic...@hotmail.com> escribió:


De: Luis . <digic...@hotmail.com>
Asunto: RE: AYUDA EN SQL
A: "forum.help400" <forum.help400@listas.combios.es>
Fecha: lunes, 27 de diciembre de 2010, 04:58 am




Hola Oscar:
 
Mirando lo que me has mandado, y reconociendo que hace mucho que no trabajo con 
vistas SQL, según creo recordar la vista sql no es algo que se guarde, sino que 
se calcula en el momento de acceder a ella, a ver si alguien más puesto en SQL 
lo confirma.
 
AUnque el Join de la vista no parece complejo, también dependerá del tamaño de 
las tablas, no es lo mismo un par de miles de registros,  cientos de miles o 
unos cuantos millones.
 
Mirando el procedimiento almacenado, y partiendo de que mi supuesto de las 
vistas es correcto, por cada vez que tu llames al procedimiento almacenado, 
tiene que volver a generar la vista, buscar algo en ella, que al no tener 
índices, tiene que recorrer toda la vista para ver que registros cumplen la 
condición del where. Si tienes miles de registros son miles de veces que crea 
la vista y  miles de búsquedas. Por eso creo que es ahí donde se te van las 6 
horas.
 
Mi consejo, prueba lo que te dije, y si el join es rápido, el problema es que 
te lo está haciendo tantas veces como clientes tengas. La solución que yo veo, 
es lo de crear la tabla intermedia con los tres o cuatro campos que te 
interesan, y luego desde tu programa en lugar de llamar a procedimiento, haces 
un chain a la tabla y listo.
 
Un saludo
 
Luis
 


Date: Thu, 23 Dec 2010 17:19:21 -0800
From: oosc...@yahoo.com
Subject: RE: AYUDA EN SQL
To: forum.help400@listas.combios.es






gracias voy a probar con el insert a otra tabla y te voy a enviar las 
sentencias de la vista logica que cree asi como el procedimiento almacenado a 
ver si asi le entendes y nuevamente gracias
vista logica
CREATE VIEW file2 (EMPCOD, CANUCR, CLDOC, CACSTC, SECBCR, VACATE,
 EMPCOB, CANUCB, VACATG) AS SELECT DISTINCT A.EMPCOD, A.CANUCR, A.CL
DOC, A.CACSTC, A.SECBCR, A.VACATE, B.EMPCOD, B.CANUCR, B.VACATG FROM
 CARTDAT.CACREDIT A INNER JOIN CARTDAT.CACREDCR B ON A.EMPCOD = B.EM
PCOD AND A.CANUCR = B.CANUCR WHERE A.CACSTC < 50 AND A.EMPCOD NOT IN
 ('A', 'B', 'C', '5', '6', '9')                                     

procedimiento almacenado este por cada registro lo llama para extrar la 
categoria maxima
CREATE PROCEDURE CARTPGM.CPCATMAX (   
       IN @CLDOC1 CHAR(18) ,          
       IN @SECBCR1 DECIMAL(3, 0) ,    
       OUT @RESULT CHAR(4) )          
       DYNAMIC RESULT SETS 1          
       LANGUAGE SQL                   
       SPECIFIC CARTPGM.CPCATMAX      
       NOT DETERMINISTIC              
       MODIFIES SQL DATA              
       CALLED ON NULL INPUT           
       SET OPTION  ALWBLK = *ALLREAD ,
       ALWCPYDTA = *OPTIMIZE ,        
       COMMIT = *NONE ,               
       DECRESULT = (31, 31, 00) ,     
       DFTRDBCOL = *NONE ,            
       DYNDFTCOL = *NO ,              
       DYNUSRPRF = *USER ,
       SRTSEQ = *HEX       
       BEGIN  
 
DECLARE SQLSTR VARCHAR ( 1000 ) ;                              
DECLARE AT_END SMALLINT DEFAULT 0 ;                            
DECLARE @CAMPO1 DEC ( 4 , 0 ) ;                                
DECLARE @RESUTALDO CHAR ( 4 ) ;                                
DECLARE CURSORSQL CURSOR FOR RESULTADO ;                       
SET @RESULT = 'null' ;                                         
                                                               
SET SQLSTR = ' SELECT SECBCR, MAX(VACATG) FROM CARTDAT.file2
 WHERE TRIM ( CLDOC ) = TRIM (''' || @CLDOC1 || ''')           
 AND SECBCR =' || TRIM ( CAST ( @SECBCR1 AS CHAR ( 3 ) ) ) || '
 GROUP BY SECBCR ' ;                                           
PREPARE RESULTADO FROM SQLSTR ;                 
OPEN CURSORSQL ;                                
FETCH_LOOP :                                    
LOOP                                            
FETCH CURSORSQL INTO @CAMPO1 , @RESUTALDO ;     
          IF AT_END <> 0 THEN LEAVE FETCH_LOOP ;
          END IF ;                              
          SET @RESULT = @RESUTALDO ;            
          SET AT_END = 1 ;                      
END LOOP FETCH_LOOP ;                           
CLOSE CURSORSQL ;                               
END  ;                                                      
--- El mar, 12/21/10, Luis . <digic...@hotmail.com> escribió:


De: Luis . <digic...@hotmail.com>
Asunto: RE: AYUDA EN SQL
A: "forum.help400" <forum.help400@listas.combios.es>
Fecha: martes, 21 de diciembre de 2010, 03:33 am




#yiv47003523 .yiv47003523ExternalClass #yiv47003523ecxyiv657516216 
.yiv47003523ecxyiv657516216hmmessage P
{padding:0px;}
#yiv47003523 .yiv47003523ExternalClass #yiv47003523ecxyiv657516216 
.yiv47003523ecxyiv657516216hmmessage
{font-size:10pt;font-family:Tahoma;}


La verdad es que al no saber muy bien de que hablamos no lo tengo claro. Pero a 
bote pronto si lo quieres hacer por sql insert into tabla_resumen (cliente, ct) 
select cliente, max(categoría) as ct from tabla group by cliente.
 
O si lo quieres hacer en RPG con un setll *hival. De todas maneras si ya tenías 
un procedimiento almacenado que te buscaba la categoría mayor, sería cosa de 
modificarlo un poco para que te rellenara la tabla.
 
A mi lo que me da la sensación, ya que dices que ahora tarda como 6 horas, que 
cada vez que llamas al procedimiento almacenado se te está volviendo a crear el 
join, y es ahí donde pierde el tiempo, por eso la cosa sería hacer solo una vez 
el join, y sacar toda la información de un tirón, y por eso te digo que crees 
la taba intermedia.  
 
Son cosas a mirar, prueba a generar el join a mano y mira cuanto tarda, si 
tarda poco estoy en lo cierto, si tarda 4 horas el problema es el join, y 
tendrías que replantearte como obtener esa información de otra manera, sin ese 
join.
 
Un saludo
 
Luis


Date: Mon, 20 Dec 2010 17:00:07 -0800
From: oosc...@yahoo.com
Subject: RE: AYUDA EN SQL
To: forum.help400@listas.combios.es






Ok, pero como haria para que en esa nueva tabla me queden solo la categoria 
mayor de todos los registros de un cliente, y gracias por la respuesta no habia 
visto la respuesta porque me cayo en el correo como spam,  
--- El lun, 12/13/10, Luis . <digic...@hotmail.com> escribió:


De: Luis . <digic...@hotmail.com>
Asunto: RE: AYUDA EN SQL
A: "forum.help400" <forum.help400@listas.combios.es>
Fecha: lunes, 13 de diciembre de 2010, 03:00 am




#yiv47003523 .yiv47003523ExternalClass #yiv47003523ecxyiv657516216 
.yiv47003523ecxyiv657516216ExternalClass 
#yiv47003523ecxyiv657516216ecxyiv1781765403 
.yiv47003523ecxyiv657516216ecxyiv1781765403hmmessage P
{padding:0px;}
#yiv47003523 .yiv47003523ExternalClass #yiv47003523ecxyiv657516216 
.yiv47003523ecxyiv657516216ExternalClass 
#yiv47003523ecxyiv657516216ecxyiv1781765403 
.yiv47003523ecxyiv657516216ecxyiv1781765403hmmessage
{font-size:10pt;font-family:Tahoma;}

Hola Oscar:
 
La verdad es que no entiendo muy bien la pregunta, pero por lo que intuyo, yo 
lo haría al revez. Es decir, primero ejecuto un programa que me lea la vista 
lógica y me genere una tabla con todos los clientes y su mayor valor (que no se 
muy bien que es, pero parece que es lo que buscas), y luego de tu programa en 
lugar de llamar al procedimiento almacenado hago una lectura sobre esa nueva 
tabla.
 
Un saludo
 
Luis
 


Date: Sun, 12 Dec 2010 20:11:49 -0800
From: oosc...@yahoo.com
Subject: AYUDA EN SQL
To: forum.help400@listas.combios.es





Buen dia estimados foreros primero como ya se aproxima navidad desearles una 
feliz navidad anticipadamente y luego solicitarle una ayuda que es la siguiente:
Tengo un programa en ile que llama un procedimiento almacenado el cual tiene un 
cursor para poder tomar el valor mayor de todos los registro de un cliente 
desde una vista logica creada con INNER JOIN de varios archivos para 
asignarselo a todos los registros que tenga ese cliente y que tenga la 
categoria mas alta esto lo ejecuto registro por registro y cada uno llama este 
procedimiento almacenado todo funciona a la perfecccion el inconveniente es que 
es demasiado lento se tarda como cerca de 6  horas para verificar todos los 
registro lo cual es demasiado si alguien me puede hechar una manito le estare 
eternamente agradecido ya he probado con varias tegnicas pero no logro 
optimizarlo. de Antemano Gracias.    

 
____________________________________________________ �nete a Recursos AS400, 
nuestra Comunidad ( http://bit.ly/db68dd ) Forum.Help400 � Publicaciones 
Help400, S.L. 
-----Adjunto en línea a continuación-----


____________________________________________________
Únete a Recursos AS400, nuestra Comunidad ( http://bit.ly/db68dd )
Forum.Help400 © Publicaciones Help400, S.L.
 
____________________________________________________ �nete a Recursos AS400, 
nuestra Comunidad ( http://bit.ly/db68dd ) Forum.Help400 � Publicaciones 
Help400, S.L. 
-----Adjunto en línea a continuación-----


____________________________________________________
Únete a Recursos AS400, nuestra Comunidad ( http://bit.ly/db68dd )
Forum.Help400 © Publicaciones Help400, S.L.
 
____________________________________________________ �nete a Recursos AS400, 
nuestra Comunidad ( http://bit.ly/db68dd ) Forum.Help400 � Publicaciones 
Help400, S.L. 
-----Adjunto en línea a continuación-----


____________________________________________________
Únete a Recursos AS400, nuestra Comunidad ( http://bit.ly/db68dd )
Forum.Help400 © Publicaciones Help400, S.L.


      
____________________________________________________
Únete a Recursos AS400, nuestra Comunidad ( http://bit.ly/db68dd )
Forum.Help400 © Publicaciones Help400, S.L.

Responder a