Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Comandos SQL para añadir o modificar (https://www.clubdelphi.com/foros/showthread.php?t=41887)

_Willa 28-03-2007 17:37:47

Comandos SQL para añadir o modificar
 
Buenas!,,

Lo cierto es que la primera vez que vuelco , se realizará sobre todos los
registros son añadidos, pero la segunda vez que use este, pueden existir esos registros por lo que debera solo actualizar los campos.

Por ejemplo tengo un tabla _Almacen que contiene campos IdProducto,IdNombre,IdFechaCaducidad, y por ejemplo se trata de mover
hacia otra tabla _Historica los que cumplan una determinada fecha de caducidad.

- Es decir, no se si me estoy liando un poco.
- Buscar IdProducto, comprobar que existe, sino añadirlo y si existe
actualizarlo, ... todo sobre la tabla _Historica.

Uso Interbase, atraves de una sentencia sql.

TIBSQL *sql_almacen = ib.DefineSQL();
sql_almacen->SQL->Add("Select * from _Almacen");
sql_almacen->SQL->Add("where IdFechaCaducidad<:fecha");
sql_almacen->Params->ByName("fecha")->AsDateTime = tMiFecha;
sql_almacen->ExecQuery();

ya se que esto no es asi, pero es lo que tengo de momento para que
os hagais una idea de como lo tengo ...

Alguien me puede dar alguna idea ?

poliburro 28-03-2007 19:06:37

Esto quedaría de perlas en un Sp

Esto actualizará los existentes

Código SQL [-]

      Update Destino
           Set Destino.Campo = Origen.Valor
         From Destino 
   Inner Join (Select ClaveArticu, ValorCampo
                    From Origen 
                  Where Fecha >= Inicio And
                           Fecha <= Fin
                  ) As Origen
             On Destino.ClaveArticu = Origen.ClaveArticu


Esto Insertará los nuevos (Mi favorita por cuestiones de rendimiento)

Código SQL [-]
  Insert 
     Into Destino
           (Campos)
           Select Campos
             From (Select ClaveArticu, Campos
                        From Origen 
                      Where Fecha >= Inicio And
                                Fecha <= Fin
                     ) As Origen
        Left Join  Destino
                On Origen.ClaveArticu = Destino.ClaveArticu 
     Where Not Destino.AlgunCampo is null

Esta otra aplica, pero es más costosa en cuestión de rendimiento

Código SQL [-]
  Insert 
     Into Destino
             (Campos)
   Select Campos
    From Origen 
   Where Fecha >= Inicio And
                Fecha <= Fin And
                 CveArticulo Not In (Select CveArticulo From Destino)


Suerte

_Willa 29-03-2007 12:50:38

Seguimos con la Sencia SQL
 
Gracias poliburro por tu apreciación pero encuentro un pequeño detalle
que todavia no tengo claro.

La secuencia SQL ( q puede estar en un SP, como bien dices )
El Seudo-codigo, debe ser algo asi como ....

mientras no sea Fin Fichero
si reg existe
entonces
Actualizar
sino
Añadir
fin-si
fin-mientras

Como me lo das en dos partes no sabemos q registros deben actualizarse
y cuales deben añadirse, no ? , acaso puede estar en dos bloques distintos
o es necesario formar uno solo tal y como te pongo en el seudo-codigo

Saludos, y como bien dices, siempre hay una piedra en el zapato y se llama Rajoy y amigos!!
:)

Lepe 29-03-2007 13:38:23

La filosofía de poliburro es diferente:
El SQL de Update:
Actualiza los productos que ya existen en el Histórico con los nuevos datos de Almacen

Y después:

Su SQL favorita (inserción de nuevos productos en histórico):
Busca los productos de almacen que no existen en el histórico.
Inserta en histórico dichos productos

Las dos consultas anteriores son excluyentes, es decir, ningún registro puede entrar en ambas consultas.

Es exactamente lo que pides, pero hecho de forma "eficiente" y por lotes.

Saludos


La franja horaria es GMT +2. Ahora son las 08:13: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