Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 20-06-2019
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 3.457
Poder: 20
newtron Va camino a la fama
Instrucción SQL

Hola a tod@s.


Tengo dos tablas, ARTICULOS y EXISTENCIAS. En la tabla EXISTENCIAS hay un registro con las existencias por cada artículo y almacén. Si quiero sumar en el campo EXISTT de la tabla ARTICULOS el total de existencias (campo EXISTENCIA) que hay en la tabla EXISTENCIAS paso la siguiente instrucción:


Código Delphi [-]
UPDATE ARTICULOS
SET EXISTT=SELECT SUM(EXISTENCIA) FROM EXISTENCIAS WHERE (ARTICULOS.CODIGO=EXISTENCIAS.ARTICULO)


Esto funciona correctamente pero tiene un problema, si en la tabla EXISTENCIAS no hay registros de un artículo determinado el campo sumatorio EXISTT se queda con valor NULL y quisiera que quedara 0.


he probado con esto:


Código Delphi [-]
UPDATE ARTICULOS
SET EXISTT=SELECT SUM(EXISTENCIA) FROM EXISTENCIAS WHERE (ARTICULOS.CODIGO=EXISTENCIAS.ARTICULO)
AND (ARTICULO IN (SELECT ARTICULO FROM EXISTENCIAS))


y con esto:



Código Delphi [-]
UPDATE ARTICULOS
SET EXISTT=CAST(SELECT SUM(EXISTENCIA) FROM EXISTENCIAS WHERE (ARTICULOS.CODIGO=EXISTENCIAS.ARTICULO) AS FLOAT)


pero nada, siguen cogiendo valor NULL los artículos que no encuentra registros en la tabla EXISTENCIAS


¿Algún ilustre SQLero puede iluminarme?


Gracias y un saludo
__________________
Be water my friend.
Responder Con Cita
  #2  
Antiguo 20-06-2019
bucanero bucanero is offline
Miembro
 
Registrado: nov 2013
Ubicación: Almería, España
Posts: 208
Poder: 11
bucanero Va camino a la fama
Hola Newtron

lo puedes hacer con dos sentencias, primero actualizas a 0 el stocks de los artículos que no tienen existencias y luego el stock de los que si tienen existencias:

Código SQL [-]
UPDATE ARTICULOS
SET EXISTT=0
WHERE NOT ARTICULOS.CODIGO IN (SELECT EXISTENCIAS.ARTICULO FROM EXISTENCIAS);

UPDATE ARTICULOS
SET EXISTT=(SELECT SUM(EXISTENCIA) FROM EXISTENCIAS WHERE (ARTICULOS.CODIGO=EXISTENCIAS.ARTICULO))
WHERE ARTICULOS.CODIGO IN (SELECT EXISTENCIAS.ARTICULO FROM EXISTENCIAS);

O si lo quieres hacer en una sola instrucción, en MySQL existe la funcion IFNULL que establece un valor por defecto para cuando un campo es null, imagino que otros motores de BBDD tendran algo similar, si no siempre se puede utilizar el standar CASE WHEN ... ELSE ... END y se puede hacer de esta forma:
Código SQL [-]
UPDATE ARTICULOS
SET EXISTT = ifNull((SELECT SUM(EXISTENCIA) FROM EXISTENCIAS WHERE (ARTICULOS.CODIGO=EXISTENCIAS.ARTICULO)), 0)

aquí tienes otra forma de plantear la consulta, la diferencia esta en el numero de consultas que realiza el motor de BD para ejecutar la sentencia. Comprueba con cual ganas mas en rendimiento, si con esta forma o con la anterior
Código SQL [-]
UPDATE ARTICULOS
LEFT JOIN (
SELECT ARTICULO, SUM(EXISTENCIAS) AS STOCK
FROM EXISTENCIAS
GROUP BY ARTICULO
) STOCK ON STOCK.ARTICULO=ARTICULOS.CODIGO
SET ARTICULOS.EXISTT = ifNull(STOCK.stock, 0)

un saludo

Última edición por bucanero fecha: 20-06-2019 a las 12:01:46. Razón: solventar error en la instrucción SQL
Responder Con Cita
  #3  
Antiguo 20-06-2019
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 3.457
Poder: 20
newtron Va camino a la fama
Bucanero.


Por lo menos en la base de datos que yo uso (ElevateDB) la sintaxis de las instrucciones que me propones no funciona pero ciertamente me has dado la pista y usando COALESCE si que he podido resolver el tema.



Código Delphi [-]
UPDATE ARTICULOS
SET EXISTT = COALESCE((SELECT SUM(EXISTENCIA) FROM EXISTENCIAS WHERE ARTICULOS.CODIGO=EXISTENCIAS.ARTICULO),0)


Gracias por tu ayuda y un saludo
__________________
Be water my friend.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
¿busco una instruccion? candia API de Windows 4 01-10-2008 23:44:00
instruccion WITH... armadillo Varios 4 08-05-2006 17:48:07
Problemilla con instrucción Last android_beat Conexión con bases de datos 5 26-05-2005 18:35:11
instruccion CHECK CHiCoLiTa MS SQL Server 3 01-03-2005 19:12:58
instruccion sql rqc Firebird e Interbase 4 21-01-2005 15:59:20


La franja horaria es GMT +2. Ahora son las 11:00:26.


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