Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Ayuda con sql para descontar articulo. (https://www.clubdelphi.com/foros/showthread.php?t=50374)

Petolansa 15-11-2007 18:46:40

Ayuda con sql para descontar articulo.
 
Buenas gente, los molesto de nuevo...esta vez para pedirle un a ayudita en un cofigo sql, de a poco empeze a usar querys y realemnte que le voy agarrando la mano, mas o menos.
Ya habia consultado en otro hilo hace tiempo pero no pude llegar a una solucion, revise todos los hios que hablan de descontar stock, pero no llegue a adaptarlo porque siempre me falta algo.

Tengo una tabla rxmemory llamada md temporal, tiene los campos cantidad y codigo, ambos de tipo float intente hacer esto, al compilar no me da error, pero no me hace nada directamente.

Código:

while not frmfactura.MDtemporal.Eof do
begin
query1.Close;
query1.SQL.Clear;
query1.SQL.Text:='update stock set prostkact=prostkact    -'+quotedstr(frmfactura.DBGrid1.DataSource.DataSet.fieldbyname('cantidad').AsString)+
'where'+'procod='+quotedstr(frmfactura.DBGrid1.DataSource.DataSet.fieldbyname('codigo').AsString);
query1.ExecSQL;
end;

Luego intente por el ladod e recorrer el dbgrid, pero tampoco.

en el dbgri las el indice de las columnas con 0-cantidad y 1-codigo


Código:

for i:=0 to frmfactura.DBGrid1.FieldCount-1 do
begin
query1.SQL.Text:='Update stock set prostkact=prostkact-'+frmfactura.DBGrid1.Fields[0,i]
+'where'+'procod='+quotedstr(frmfactura.DBGrid1.Fields[1,i]);
query1.ExecSQL;
end;
end;

Cual seria la forma correcta para poder actualizar la tabla "stock". los campos "prostkact" es la cantidad actual a la cual le quiero restar el campo de mi tabla "mdtemporal" cantidad que es la que tengo asociada en el dbgrid, con el indice 0.
Donde el "procod" que seria el codigo de producto que tendria que ser igual que el campo mdtemporal con el que tiene el nombre "codigo", ascociado al dbgrid con el indice 1.
POr ahi lei que conviene recorrer la tabla..

Agradezco de antema su ayuda

Saludos

Caral 15-11-2007 18:49:59

Hola
Esto es solo para tratar de entenderlo mejor
Código Delphi [-]
while not frmfactura.MDtemporal.Eof do
begin
query1.Close;
query1.SQL.Clear;
query1.SQL.Text:='update stock set prostkact=prostkact     -'+quotedstr(frmfactura.DBGrid1.DataSource.DataSet.fieldbyname('cantidad').AsString)+
'where'+'procod='+quotedstr(frmfactura.DBGrid1.DataSource.DataSet.fieldbyname('codigo').AsString);
query1.ExecSQL;
end;

Código Delphi [-]
for i:=0 to frmfactura.DBGrid1.FieldCount-1 do
begin
query1.SQL.Text:='Update stock set prostkact=prostkact-'+frmfactura.DBGrid1.Fields[0,i]
+'where'+'procod='+quotedstr(frmfactura.DBGrid1.Fields[1,i]);
query1.ExecSQL;
end;
end;
por favor usa las etiquetas
Saludos

Petolansa 15-11-2007 18:54:53

Si me equivoque de etiquetas y si me quedo mal, disculpas

Caral 15-11-2007 19:08:36

Hola
vamos a ver si entiendo.
Lo que quieres hacer es una resta del campo prostkact menos cantidad que esta el la tabla temporal.
Veamos asi, para mi es un asunto de concatenado:

Código Delphi [-]
while not frmfactura.MDtemporal.Eof do
begin
query1.Close;
query1.SQL.Clear;
query1.SQL.Text:='update stock set prostkact= prostkact' - +quotedstr(frmfactura.DBGrid1.DataSource.DataSet.fieldbyname('cantidad').AsString)+
'where procod= '+quotedstr(frmfactura.DBGrid1.DataSource.DataSet.fieldbyname('codigo').AsString);
query1.ExecSQL;
end;
bueno, no estoy muy conforme con esto, tendrias que revisarlo, tengo dudas con el menos.
Saludos

Petolansa 15-11-2007 19:18:08

Si Caral tenes razon en mi pc lo tengo con una coma antes del quotedstr despues del menos , lo que quisiera saber si esa es la forma de trabajar con sql, cuando compilo no me da error, simplemente no funciona.
Esta bien traajado o no se hace asi, conviene acceder a la tabla o trabajar con lsoc ampos del dbgrid?

Garcias

Caral 15-11-2007 19:26:06

Hola
Me harias un favor?
Me podrias explicar campo por campo de que se trata?

Me parece que prostkact pertenece a la tabla stock y que es el campo que quieres actualizar con el dato obtenido de cantidad que esta en la tabla MDtemporal y que sera de acuerdo al campo codigo, que tambien estas en temporal, supongo?

me gustaria si me lo puedes explicar un poco mas a ver si lo logro entender, recuerda que soy novato.
Saludos

Petolansa 15-11-2007 19:34:43

Caral, primer lugar, se que no eres novato, he leido muchos de tus hilos, y hasta el foro dice lo contrario. jaja
Aca el novato muy novato soy yo.
Te comento la tabla Stock es la tabla que yo guardo los articulos, y en esa tabla tengo los campos "prostkact" que describe el stock actual y el campo "procod", obviamente posee mas campos pero los que utilizaria para descontarlo serien esos.
Y por otro lado, tengo las lineas de detalle de la factura en una tabla de tipo rxmemory table, en esta tabla, tengo los campos "cantidad", "codigo", etc.

Mi intencion para descontar el stock era de restarle al campo de la tabla "stock", osea a "prostkact" el campo "cantidad" de la tabla temporal llamada mdtemporal. donde el codigo del producto de mi tabla stock "procod" sea igual al codigo de la tabla temporal, llamado "codigo".

Todas las variables son de tipo float.

Espero haberme explicado mejor, cualquier cosa, tratare de hacerlo mejor.

Saludo y gracias

Caral 15-11-2007 19:45:43

Hola
perdon una pregunta mas:
De donde saca los datos el dbgrid?
Este debe estar enlazado a un table o query, me puedes decir el nombre de este?
Espero no molestarte mas.
Saludos

Petolansa 15-11-2007 19:55:03

No caral, como va ser molestia, si los que me ayudan son uds.
El dbgrid esta enlazado a la tabla mdtemporal, en otro form, que se llama frmfactura. Ahi es donde estan los detalles de la factura, en el dbgrid estan los campos codigo y cantidad de la tabla mdtemporal.
Por eso cuando ponfo frmfactura.dbgrid1.dataset.datasource, es porque lo tengo en otro form, y el form que quiero actiualizar los datos es el de forma de pago, donde le ingreso la forma de pago, y actalizo todas las tablas.

Espero haberme explicado, sino no hay problema en volver hacerlo.

Gracias, saludos

Me olvidaba el dbgrid se llama dbgrid1. Gracias

Caral 15-11-2007 20:02:25

Hola
Intentemos esto, pero no estoy muy seguro todavia.
Código Delphi [-]
while not frmfactura.MDtemporal.Eof do
begin
query1.Close;
query1.SQL.Text:='update stock set prostkact = prostkact -' +quotedstr(frmfactura.MDtemporal.fieldbyname('cantidad').AsString)+
'where procod = '+quotedstr(frmfactura.MDtemporal.fieldbyname('codigo').AsString);
query1.ExecSQL;
end;
El asunto es que no veo por donde meter las Cells del dbgrid, que creo seria lo adecuado.
Sigamos intentando, tal vez algun maestro aparezca por aqui y lo soluciones en un dos por tres.
Saludos

Lepe 15-11-2007 20:43:21

Bueno, no soy un "maestro", pero intentaré lo que pueda.

Algunos detallitos:
- Si un campo es numérico (leasé integer, float, currency, BCD) hay que quitar el "QuotedStr" ya que a un número no se le puede restar un string (cadena de texto).
- Al pasar cantidades con decimales a un sql, hay que tener especial cuidado con formato, (leasé separador de miles y separador decimal), porque el SQL es un Standard y espera un número sin separador de miles y como separador decimal el punto.
- Además es un bucle, hay que "agilizar esa ejecución sea como sea"

Vamos a pasar del tema:
- Usaremos un sql con parámetros, así nos quitamos el problema del separador decimal y de millar (que delphi haga las conversiones).
- Usaremos una consulta compilada (Prepare), ésto hace indicar a delphi que su SQL no ha sido modificada, y por tanto en cada ciclo del bucle, no es necesario chequear la sintaxis de la misma (ahorramos algunos milisegundos).
- Haremos un disableControls de la consulta, así delphi no actualiza el grid (recordemos que los mensajes de pintado del grid, el registro activo y demás consume tiempo).

Código Delphi [-]

query1.Close;
query1.SQL.Text:='update stock set prostkact = prostkact - :prCantidad where procod = :prProcod';
query1.Prepare;
frmfactura.MDtemporal.First; // no sé donde andará el registro activo, me aseguro
frmfactura.MDtemporal.DisableControls; // dejamos de actualizar los controles data-Aware
try
  while not frmfactura.MDtemporal.Eof do
  begin
    query1.parambyname('prCantidad').Asinteger := frmfactura.MDtemporal.fieldbyname('cantidad').AsInteger;
    query1.parambyname('prProcod').AsInteger :=  frmfactura.MDtemporal.fieldbyname('codigo').AsString;
    query1.ExecSQL;
  frmfactura.MDtemporal.Next; // <<<<<<<<<< ¿esto no estaba en tu código?
  end;
finally
  frmfactura.MDtemporal.First;
  frmfactura.MDtemporal.EnableControls;
end;

Otra cosa: Si en frmfactura tienes los campos persistentes, sería mejor usar:
Código Delphi [-]
frmfactura.MDtemporalcantidad.AsInteger; // asinteger, asfloat lo que sea
usando Fieldbyname, se tiene que perder tiempo en averiguar si ese campo está en la tabla o no. Teniendo el campo persistente, se accede directamente a él.

sALUDOS

Caral 15-11-2007 21:27:02

Hola
Lepe, me puedes explicar que es un campo persistente?
No entiendo el concepto?
Es cuando el campo esta en el query y no se modifica?
Perdon por la pregunta de novato, pero si no la hago no aprendo.
El resto esta genial, impresionas Maestro.
Saludos

Petolansa 15-11-2007 23:18:36

Gracias tanto como a Caral como a Lepe, realmente da gusto haya personas como Uds con la predisposicion para ayudar a la gente que le gusta aprender este lenguaje. Yo las ganas de ayudar las tengo pero me faltan los conocimientos todavia:(. Pero ni bien pueda sin dudas estar ayudando.

En este momento me da un error en otra parte del codigo, asi que ni bien termine eso, me meto de lleno con esto y por supuesto avisare como me fue.

Gente, muy agradecido.

Lepe 15-11-2007 23:32:25

Cuando le das doble clic a un TTable, aparece la ventana editor de campos, botón derecho y Add All Fields.

A eso se le llama campos persistentes porque en tu Form aparece:
Código Delphi [-]

Type TForm1 = Class(TForm)

  query1NombreCliente :TStringField;
Al crear la ventana, se crea ese campo como si se tratara de un panel, un edit, etc.

Al usar FieldbyName esto es lo que ocurre:
Código Delphi [-]
function TFields.FieldByName(const FieldName: WideString): TField;
begin
  Result := FindField(FieldName);
  if Result = nil then DatabaseErrorFmt(SFieldNotFound, [FieldName], DataSet);
end;

Y aquí está la madre del borrego:

function TFields.FindField(const FieldName: WideString): TField;
var
  I: Integer;
begin
  for I := 0 to FList.Count - 1 do  Un bucle por todos los campos que tiene la tabla
  begin
    Result := FList.Items[i];
    if WideCompareText(Result.FFieldName, FieldName) = 0 then Exit;
  end;
  Result := nil;
end;
Si tu tabla tiene 10 campos, al usar FieldByName:
- En el mejor de los casos, lo encuentras al primer intento de ese bucle.
- En el peor de los casos, tendrás que dar 10 vueltas en ese bucle For

Al usar campos persistentes, tienes ese campo como si fuera un panel o un Edit, no hay que realizar bucle alguno.

En el caso que nos ocupa, nosotros tenemos otro bucle más:
while not frmfactura.MDtemporal.Eof do

si tenemos 20 registros en la tabla, 10 campos, usamos 2 veces fieldbyname dentro de nuestro bucle:
-En el peor de los casos, 390 ciclos
-En el mejor de los casos: 60 ciclos

Usando campos persistentes: 20 ciclos

No hay que meterse en paranoias :D, pero si tenemos los campos persistentes, es preferible usarlos ;).

Petolansa: Si no entiendes algo de ese código usa la tecla F1, es la única forma de aprender, si aún así tienes dudas, avisa.


Saludos

eduarcol 15-11-2007 23:40:25

Cita:

Empezado por Caral (Mensaje 246464)
Hola
Lepe, me puedes explicar que es un campo persistente?
No entiendo el concepto?
Es cuando el campo esta en el query y no se modifica?
Perdon por la pregunta de novato, pero si no la hago no aprendo.
El resto esta genial, impresionas Maestro.
Saludos

es cuando agregas los campos en el field editor del query.

Caral 16-11-2007 00:04:27

Hola
Me imaginaba que era eso, pero como tenéis nombres raros para todo, pues no sabia este.:D
Gracias Maestros, como aprendo aquí, da gusto.:)
Saludos


La franja horaria es GMT +2. Ahora son las 15:40:13.

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