Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 09-05-2011
wopc wopc is offline
Miembro
 
Registrado: ene 2007
Posts: 10
Poder: 0
wopc Va por buen camino
Update con Select

Hola a todos...

Uso Firebird

Tengo una duda quiero calcular la produccion y actualizar la tabla AUX_INFPLANTA

el campo M3PRODUCIDOS

y necesito los datos de otras dos tablas INFPLANTA y ART_PLANTA
al ejecutar la instrucción me sale error.

multiple rows in singleton select.
multiple rows in singleton select.


Código SQL [-]

update aux_infplanta
set aux_infplanta.m3producidos =

  (select (art_planta.m3xhora * (infplanta.hmetro_termino - infplanta.hmetro_inicio))

   from infplanta,  art_planta, aux_infplanta

where  infplanta.infnro = aux_infplanta.numinf
and    aux_infplanta.codart = art_planta.codart
and    infplanta.planta = art_planta.codplanta
and    infplanta.fecha > (:FECHA))

Los datos ya existen en las tablas incluida la M3PRODUCCION quiero reemplazarlo con el nuevo calculo

Ayuda por favor... Gracias
Responder Con Cita
  #2  
Antiguo 09-05-2011
Avatar de duilioisola
[duilioisola] duilioisola is online now
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Parece que en TODOS los registro de la tabla aux_infplanta estás poniendo el mismo resultado.
Verifica si esto es realmente lo que quieres.

Segundo "multiple rows...".
Esto se refiere que que estas tratando de poner varios registros dentro de un lugar donde entra solo uno.

Mi sospecha es que el SELECT devuelve más de un resultado.
Código SQL [-]
select (art_planta.m3xhora * (infplanta.hmetro_termino - infplanta.hmetro_inicio))
from  infplanta,  art_planta, aux_infplanta
where infplanta.infnro = aux_infplanta.numinf
and   aux_infplanta.codart = art_planta.codart
and   infplanta.planta = art_planta.codplanta
and   infplanta.fecha > (:FECHA)

Prueba a hacer el select solo y lo verás.

Normalmente para solucionar este problema utilizarías algo así como select sum(campo) from ...

Código SQL [-]
update aux_infplanta
set aux_infplanta.m3producidos =
  (select SUM( (art_planta.m3xhora * (infplanta.hmetro_termino - infplanta.hmetro_inicio)) )
   from  infplanta,  art_planta, aux_infplanta
   where infplanta.infnro = aux_infplanta.numinf
   and   aux_infplanta.codart = art_planta.codart
   and   infplanta.planta = art_planta.codplanta
   and   infplanta.fecha > (:FECHA)
  )
Responder Con Cita
  #3  
Antiguo 09-05-2011
wopc wopc is offline
Miembro
 
Registrado: ene 2007
Posts: 10
Poder: 0
wopc Va por buen camino
Ejecute el procedimiento solo con el SELECT y me arrojo una columna con los 50.000 registros aprox. de AUX_INFPLANTA.

INFPLANTA: es donde esta al registro de la diferencia que se produce de las horas trabajadas de las PLANTAS (INICIO Y TERMINO).

AUX_INFPLANTA es el detalle por cada producto de la planta, almacena las HORAS PRODUCIDAS por cada producto en forma diaria.

ART_PLANTA Maestro productos que contiene la hora base de producción por planta.

No tengo que sumar solo leer el detalle de AUX_INFPLANTA y volver a calcular

M3PRODUCIDAS tomando como datos de calculo las diferencias de hora de INFPLANTA y el M3XHORA de ART_PLANTA como datos base de calculo

no se si me explico bien..... sorry
Responder Con Cita
  #4  
Antiguo 09-05-2011
Avatar de duilioisola
[duilioisola] duilioisola is online now
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Empecemos:
Código SQL [-]
update aux_infplanta
set aux_infplanta.m3producidos =
  (select (art_planta.m3xhora * (infplanta.hmetro_termino - infplanta.hmetro_inicio))
   from  infplanta,  art_planta, aux_infplanta
   where infplanta.infnro = aux_infplanta.numinf
   and   aux_infplanta.codart = art_planta.codart
   and   infplanta.planta = art_planta.codplanta
   and   infplanta.fecha > (:FECHA)
  )
El update recorre los 50.000 registros de aux_infplanta.
Para cada registro ejecuta el select. Este select no está filtrado, pues la línea aux_infplanta.codart = art_planta.codart no sabe si se refiere al registro de la tabla que se está "updateando" o al registro que se está "seleccionando".
Deberías utilizar alias para resolver este caso:
Código SQL [-]
update aux_infplanta UPD
set aux_infplanta.m3producidos =
  (select (art_planta.m3xhora * (infplanta.hmetro_termino - infplanta.hmetro_inicio))
   from  infplanta,  art_planta, aux_infplanta
   where infplanta.infnro = aux_infplanta.numinf
   and   aux_infplanta.codart = art_planta.codart
   and   UPD.codart = aux_infplanta.codart
   and   infplanta.planta = art_planta.codplanta
   and   infplanta.fecha > (:FECHA)
  )

Aqui le digo que el select me devuelva solo los registros que contienen el mismo CODART que el registro que estoy "updateando".

Te propongo que para que el SQL sea más simple utilices JOINS y ALIAS:

Código SQL [-]
update aux_infplanta UPD
set aip.m3producidos =
  (select (ap.m3xhora * (infplanta.hmetro_termino - infplanta.hmetro_inicio))
   from  infplanta ip
   join art_planta ap on ip.planta = ap.codplanta
   join aux_infplanta aip on aip.codart = ap.codart
   where 
   ip.infnro = aip.numinf and 
   ip.fecha > (:FECHA)
   and UPD.codart = aux_infplanta.codart
  )

Ten en cuenta que para hacer los joins es conveniente utilizar todos los campos de las Foreign Keys. No conozco tu base de datos, por lo que quizás no sea la mejor manera de hacer los joins.
Responder Con Cita
  #5  
Antiguo 10-05-2011
wopc wopc is offline
Miembro
 
Registrado: ene 2007
Posts: 10
Poder: 0
wopc Va por buen camino
gracias por Responder tan pronto a mis consultas

aun sigo con mi tema he tratado de diferentes formas hice los que me indicaste modificando un pequeño detalle

Código SQL [-]
update aux_infplanta UPD
set UPD.m3producidos =
  (select (art_planta.m3xhora * (infplanta.hmetro_termino - infplanta.hmetro_inicio))
   from  infplanta,  art_planta, aux_infplanta
   where infplanta.infnro = aux_infplanta.numinf
   and   aux_infplanta.codart = art_planta.codart
   and   UPD.codart = aux_infplanta.codart
   and   infplanta.planta = art_planta.codplanta
   and   infplanta.fecha > (:FECHA)
  )

Me da error (lo que esta en rojo) y lo reemplazo por Alias (UPD) y corre,
pero sigue al dando el mismo error

multiple rows in singleton select.
multiple rows in singleton select.


Luego lo intento con el segundo Ejemplo que me diste...

Código SQL [-]

update aux_infplanta UPD
set UPD.m3producidos =
  (select (ap.m3xhora * (ip.hmetro_termino - ip.hmetro_inicio))
   from  infplanta ip
   join art_planta ap on ip.planta = ap.codplanta
   join aux_infplanta aip on aip.codart = ap.codart
   where 
   ip.infnro = aip.numinf and 
   ip.fecha > (:FECHA)
   and UPD.codart = ap.codart
  )

Tambien me rechaza usar los nombres originales de las tablas cuando ocupo Alias. si lo reemplazo usando alias
me vuelve dar el mismo error.......



multiple rows in singleton select.
multiple rows in singleton select.


Alguna otra idea ?

Gracias
Responder Con Cita
  #6  
Antiguo 10-05-2011
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 21
gluglu Va por buen camino
El Select que tienes dentro de los Paréntesis te debe de devolver UN UNICO registro. Mientras eso no sea así, te seguirá dando siempre ese error.

Lo que estás indicando con tu Update es que reemplaze un valor de un registro con un Select que te devuelve varios registros, y por eso no sabe con qué valor reemplazarlo y te da error.
__________________
Piensa siempre en positivo !
Responder Con Cita
  #7  
Antiguo 10-05-2011
wopc wopc is offline
Miembro
 
Registrado: ene 2007
Posts: 10
Poder: 0
wopc Va por buen camino
GRACIAAAAAAAS


SOLUCIONADOOOOO

Agregue un validador mas efectivamente era eso. Seleccionaba mas de un valor...por lo tanto tener cuidado a futuro de validar bien el requerimiento..




Código SQL [-]

update aux_infplanta UPD
set UPD.m3producidos =
  (select (art_planta.m3xhora * (infplanta.hmetro_termino - infplanta.hmetro_inicio))
   from  infplanta,  art_planta, aux_infplanta
   where infplanta.infnro = aux_infplanta.numinf
   and   aux_infplanta.codart = art_planta.codart
   and   UPD.codart = aux_infplanta.codart
   and   infplanta.planta = art_planta.codplanta
   and   infplanta.fecha > (:FECHA)
   and   upd.numinf = aux_infplanta.numinf
  )


Tema Solucionado



Gracias por sus Aportes.....
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
UPDATE con SELECT como??? advancexz SQL 4 17-03-2009 12:13:50
transacciones y select for update tksko MySQL 1 17-12-2008 16:50:22
Select bloquea update luis1980 MySQL 2 22-09-2008 12:51:04
Update Select JAI_ME Varios 2 18-07-2008 23:36:15
Un select y update en una misma instruccion dmagui SQL 2 06-07-2005 17:17:49


La franja horaria es GMT +2. Ahora son las 16:42:53.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi