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 15-11-2007
Petolansa Petolansa is offline
Miembro
 
Registrado: jul 2005
Posts: 159
Poder: 19
Petolansa Va por buen camino
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
Responder Con Cita
  #2  
Antiguo 15-11-2007
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
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
Responder Con Cita
  #3  
Antiguo 15-11-2007
Petolansa Petolansa is offline
Miembro
 
Registrado: jul 2005
Posts: 159
Poder: 19
Petolansa Va por buen camino
Si me equivoque de etiquetas y si me quedo mal, disculpas
Responder Con Cita
  #4  
Antiguo 15-11-2007
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
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
Responder Con Cita
  #5  
Antiguo 15-11-2007
Petolansa Petolansa is offline
Miembro
 
Registrado: jul 2005
Posts: 159
Poder: 19
Petolansa Va por buen camino
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
Responder Con Cita
  #6  
Antiguo 15-11-2007
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
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
Responder Con Cita
  #7  
Antiguo 15-11-2007
Petolansa Petolansa is offline
Miembro
 
Registrado: jul 2005
Posts: 159
Poder: 19
Petolansa Va por buen camino
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
Responder Con Cita
  #8  
Antiguo 15-11-2007
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
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
Responder Con Cita
  #9  
Antiguo 15-11-2007
Petolansa Petolansa is offline
Miembro
 
Registrado: jul 2005
Posts: 159
Poder: 19
Petolansa Va por buen camino
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
Responder Con Cita
  #10  
Antiguo 15-11-2007
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
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
Responder Con Cita
  #11  
Antiguo 15-11-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
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
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.

Última edición por Lepe fecha: 15-11-2007 a las 21:48:58.
Responder Con Cita
  #12  
Antiguo 15-11-2007
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
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
Responder Con Cita
  #13  
Antiguo 16-11-2007
Petolansa Petolansa is offline
Miembro
 
Registrado: jul 2005
Posts: 159
Poder: 19
Petolansa Va por buen camino
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.
Responder Con Cita
  #14  
Antiguo 16-11-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
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 , 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
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #15  
Antiguo 16-11-2007
Avatar de eduarcol
[eduarcol] eduarcol is offline
Miembro Premium
 
Registrado: ago 2003
Ubicación: En los estados Zulia y Merida de Venezuela
Posts: 4.151
Poder: 25
eduarcol Va por buen camino
Cita:
Empezado por Caral Ver Mensaje
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.
__________________
...Yo naci en esta ribera del arauca vibr@d0r
Soy hermano de la espuma,
de la garza, de la rosa y del sol...
Viva Venezuela
Responder Con Cita
  #16  
Antiguo 16-11-2007
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola
Me imaginaba que era eso, pero como tenéis nombres raros para todo, pues no sabia este.
Gracias Maestros, como aprendo aquí, da gusto.
Saludos
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
Articulo similar al de Paradox en red, pero para Access Wonni Conexión con bases de datos 0 17-05-2007 15:51:03
Codificar para el cambio: Mi primer articulo en BDN!!! mamcx Noticias 11 22-09-2006 02:37:20
Articulo -> Ventas - Borrar Articulo hmoner Conexión con bases de datos 7 14-10-2005 19:24:54
Artículo de Paradox en red Mariana Conexión con bases de datos 4 22-12-2004 05:23:27
Duda para crear índice de artículo Tio Firebird e Interbase 2 10-06-2003 02:00:14


La franja horaria es GMT +2. Ahora son las 18:48:32.


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