Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Hacer un UPDATE deacuerdo a los campos de otra tabla (https://www.clubdelphi.com/foros/showthread.php?t=89984)

Edwardfeliz 14-03-2016 14:31:23

Hacer un UPDATE deacuerdo a los campos de otra tabla
 
Saludos,
Me explico, tengo dos tablas, "Productos" y "FacturaItem" simplemente quiero hacer una UPDATE sobre la tabla productos dependiendo de los registros de la tabla FacturaItem, la idea es "regresarlos al inventario".

Para retirarlos uso el siguiente codigo:
Código SQL [-]
Begin // Descontar los Articulos segun los items de la factura
    Qtemp.SQL.Clear;
    Qtemp.SQL.Add('UPDATE PRODUCTOS');                     // Acción
    Qtemp.SQL.Add('SET Existencia = Existencia - :VALOR'); // Descrementar
    Qtemp.SQL.Add('WHERE Cod =:Codigo');                        // Condición (sobre que registro)
    for i := 1 to Sg.RowCount-1 do
  begin
    Qtemp.Parameters.ParamByName('VALOR').Value := SG.Cells[1, i];     // Valor a descrementar
    Qtemp.Parameters.ParamByName('Codigo').Value:= SG.Cells[0, i];      // Registro
    Qtemp.ExecSQL;
  end;
end;

Pero esto lo hago tomando como punto de referencia un String Grid, pero ahora quiero hacerlo directamente de una tabla a Otra, tomando los criterios de la tabla de Facturaitem "para que producto" y "que cantidad".
-----------------------------------------------------------------
En la Tabla FacturaItem, los campos pertinentes son:
CodParte
Cantidad
------------------------------------------------------------------
En la tabla Productos, los campos pertinentes son:
Cod
Existencia

Componentes ADO.
Delphi 7

ecfisa 14-03-2016 17:00:44

Hola.

Si interpreté bién tu consulta, intenta algo similar a esto:
Código Delphi [-]
begin
  // FACTURAITEM
  qyFactura.Close;
  qyFactura.SQL.Text := 'SELECT CODPARTE, CANTIDAD FROM FACTURAITEM';
  qyFactura.Open;

  // PRODUCTOS
  qyProducto.Close;
  qyProducto.SQL.Clear;
  qyProducto.SQL.Add('UPDATE PRODUCTOS');
  qyProducto.SQL.Add('SET EXISTENCIA = EXISTENCIA - :VALOR');
  qyProducto.SQL.Add('WHERE COD = :CODIGO');

  qyProducto.Prepared := True;
  try
    while not qyFactura.Eof do
    begin
      qyProducto.Parameters.ParamByName('VALOR').Value :=
        qyFactura.FieldByName('CANTIDAD').Value;
      qyProducto.Parameters.ParamByName('CODIGO').Value :=
        qyFactura.FieldByName('CODPARTE').Value;
      qyProducto.ExecSQL;
      qyFactura.Next;
    end;
  finally
    qyProducto.Prepared := False;
  end;
  ...
( Revisa que los nombres de tablas y campos sean los correctos )

Saludos :)

mamcx 14-03-2016 17:22:46

Que motor sql usas?

Edwardfeliz 14-03-2016 17:28:38

Cita:

Empezado por ecfisa (Mensaje 503327)
Hola.

Si interpreté bién tu consulta, intenta algo similar a esto:
Código Delphi [-]
begin
  // FACTURAITEM
  qyFactura.Close;
  qyFactura.SQL.Text := 'SELECT CODPARTE, CANTIDAD FROM FACTURAITEM';
  qyFactura.Open;

  // PRODUCTOS
  qyProducto.Close;
  qyProducto.SQL.Clear;
  qyProducto.SQL.Add('UPDATE PRODUCTOS');
  qyProducto.SQL.Add('SET EXISTENCIA = EXISTENCIA - :VALOR');
  qyProducto.SQL.Add('WHERE COD = :CODIGO');

  qyProducto.Prepared := True;
  try
    while not qyFactura.Eof do
    begin
      qyProducto.Parameters.ParamByName('VALOR').Value :=
        qyFactura.FieldByName('CANTIDAD').Value;
      qyProducto.Parameters.ParamByName('CODIGO').Value :=
        qyFactura.FieldByName('CODPARTE').Value;
      qyProducto.ExecSQL;
      qyFactura.Next;
    end;
  finally
    qyProducto.Prepared := False;
  end;
  ...
( Revisa que los nombres de tablas y campos sean los correctos )

Saludos :)

Gracias por la respuesta pero en facturaItem, falta espesificar el codigo de la factura en especifico de cada producto.
es decir, en el Select de la facturaItem, va a seleccionar todos los articulos de la tabla, hay que espesificar que solo va a seleccionar los de una factura en específico, se puede utilizar la variable "CodFactura" donde va a estar ahi el codigo de la factura.

Edwardfeliz 14-03-2016 17:34:20

Cita:

Empezado por mamcx (Mensaje 503329)
Que motor sql usas?

no se si responde a tu pregunta pero Uso los componentes ADO.

Edwardfeliz 14-03-2016 17:45:01

Lo resolvi así
 
Código SQL [-]
 // FACTURAITEM
  qyFactura.Close;
  qyFactura.SQL.Text := 'SELECT CODFACTURA, CODPARTE, CANTIDAD FROM FACTURAITEM';
  qyFactura.SQL.Add('WHERE CODFACTURA = :CODIGO');
   qyFactura.Parameters.ParamByName('CODIGO').Value := Ecod.Text;
  qyFactura.Open;

Y EN ESTA PARTE TENIA QUE SUMAR EN VEZ DE RESTAR XD PERO YA LO ARREGLE, GRACIAS POR EL CÓDIGO EFICSA.

Código SQL [-]
  QyProducto.Close;
  QyProducto.SQL.Clear;
  QyProducto.SQL.Add('UPDATE PRODUCTOS');
  QyProducto.SQL.Add('SET EXISTENCIA = EXISTENCIA + :VALOR');
  QyProducto.SQL.Add('WHERE COD = :CODIGO');

mamcx 14-03-2016 17:47:54

Cita:

Empezado por Edwardfeliz (Mensaje 503331)
no se si responde a tu pregunta pero Uso los componentes ADO.

No, me refiero a si usas firebird, Sql Server, etc (y que version)

Edwardfeliz 14-03-2016 17:58:45

Cita:

Empezado por mamcx (Mensaje 503335)
No, me refiero a si usas firebird, Sql Server, etc (y que version)

Access 2013 "nada Complejo"


La franja horaria es GMT +2. Ahora son las 04:29:05.

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