Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Actualizar registro.. ayuda (https://www.clubdelphi.com/foros/showthread.php?t=73918)

Rofocale 24-05-2011 18:35:39

Actualizar registro.. ayuda
 
Código Delphi [-]
  icodex := strtoint(txtcodigo.Text);

        with dmDatos.qryventarea do begin
         Close;
        SQL.Clear;
        SQL.Add('SELECT * FROM ventasareas');
        open;
        if(not Eof)then begin
        if icodex <> FieldByName('codigo').value then
        begin
     // dmDatos.cdsventarea.Active := false;
        Close;
        SQL.Clear;
        SQL.Add('INSERT INTO ventasareas (areaventa, orden, articulo, codigo, descrip, cantidad, precio, cliente, categoria, fecha)');
        SQL.Add('VALUES(:areaventa, :orden, :articulo, :codigo, :descrip, :cantidad, :precio, :cliente, :categoria, :fecha)');
            params.ParamByName('areaventa').Value := sAreaVenta;
             if(iCliente < 1) then
               params.ParamByName('orden').Value := NULL
            else
               params.ParamByName('orden').Value := iorden;

            params.ParamByName('articulo').Value := txtclave.Text;
            params.ParamByName('codigo').Value := txtcodigo.Text;
            params.ParamByName('descrip').Value := txtdescripc.Text;
            params.ParamByName('cantidad').Value := txtcantidad.Text;
            params.ParamByName('precio').Value := txtprecio.Text;

            if(iCliente < 1) then
               params.ParamByName('cliente').Value := NULL
            else
               params.ParamByName('cliente').Value := IntToStr(iCliente);

            if(Length(txtcategoria.Text) > 0) then
               params.ParamByName('categoria').Value := txtcategoria.Text
            else
               params.ParamByName('categoria').Value := NULL;


            params.ParamByName('fecha').Value := FormatDateTime('dd/mm/yyyy',Date);
            ExecSQL;
            Close;
        end;
        end
        else begin
          Close;
            SQL.Clear;
            SQL.Add('UPDATE ventasareas SET areaventa = :areaventa,orden = :orden,');
            SQL.Add('articulo = :articulo,codigo = :codigo,descripcion = :descripcion,');
            SQL.Add('cantidad = :cantidad,precio = :precio,cliente = :cliente,');
            SQL.Add('categoria = :categoria,fecha = :fecha WHERE codigo = :codigo');

            params.ParamByName('areaventa').Value := sAreaventa;
            params.ParamByName('orden').Value := iorden;
            params.ParamByName('articulo').Value := txtclave.Text;
            params.ParamByName('codigo').Value := txtcodigo.Text;
            params.ParamByName('descripcion').Value := txtdescripc.Text;
           params.ParamByName('cantidad').Value := txtcantidad.Text;
            params.ParamByName('precio').Value := txtprecio.Text;
            params.ParamByName('cliente').Value :=IntToStr(iCliente);
            params.ParamByName('categoria').Value := txtcategoria.Text;
            params.ParamByName('fecha').Value := FormatDateTime('dd/mm/yyyy',Date);
        end;
        end;

buenas estaba haciendo este codigo para insertar articulos con un boton agregar desde una lista, lo que quiero es que si escribes en un edit el codigo y este sea igual al ya ingresado anteriormente en un grid lo actualize en ves de ponerlo en la sgte linea y si no es el mismo codigo agregarlo en la siguiente linea..

bueno el codigo no hace nada cuando apreto el boton agregar..
que estoy haciendo mal, alguna sugerencia ?

oscarac 24-05-2011 18:46:09

me parece que estas equivocandote en el

NOT EOF

si no es vacio Inserta y si esta vacion Actualiza???

no deberia ser al reves?

al menos es lo que he podido interpretar del pedazo de codigo que has puesto

Rofocale 24-05-2011 19:02:36

se supone que not eof es mientras no llega al final ? en que parte dice si es vacio INSERTA 8-)

oscarac 24-05-2011 19:05:59

ah mientras not eof

y el while? donde lo pones?

quiza ahi esta el error, solo esta pasando 1 vez por ese proceso

Rofocale 24-05-2011 19:17:49

no eso tambien ya probe y no funciona con while tampoco

elarys 24-05-2011 19:56:59

No se entiende muy bien lo que haces con el codigo pero proba cambiar
if (not Eof) then begin

Código Delphi [-]
if Query.RecordCount = 0 then
  //insterta
else
  //actualiza

como sabes a que campo esta apuntando el query
deberias agregarle un order by codigo
entiendo que codigo es la clave y va en orden ascendete
luego query.last para ir al ultimo y ver cual es el ultimo codigo agregado
va por lo menos eso es lo que entiendo... si no deberias explicarte detalladamente

oscarac 24-05-2011 20:01:03

parece que no me has entendido....
tu dices que el NOT EOF es mientras no termine el archivo.. verdad?

pero no veo el
Código Delphi [-]
 
While NOT query.eof do

si haces una revision del codigo que has puesto (salvo que no este completo)

dices
Código Delphi [-]
  SQL.Add('SELECT * FROM ventasareas');
  open;
  if(not Eof)then begin
     if icodex <> FieldByName('codigo').value then
     begin

YO interpreto que si HAY datos en ventasareas (el not eof significa que no es fin de archivo), pero como no hay un while, se podria interpretar como ventasareas tiene al menos 1 registro

entonces si HAY datos insertar y si no hay datos Actualizas.... (no se puede actualizar un dato que no existe previamente)

me entiendes ahora?

Rofocale 25-05-2011 04:18:47

como podria hacer entonces...
alguien me ayuda ? :(

oscarac 25-05-2011 04:21:59

ayudaria mucho si es que mencionas si tengo o no razon.... porque no se si lo que te digo te ayuda o no

enfoca bien el problema
dinos mas o menos cual es el flujo del programa... ese codigo que has colocado donde lo tienes?

Rofocale 25-05-2011 04:36:59

en un boton agregar tengo ese codigo.. antes del boton agregar ya deben de estar llenos algunos edits..

bueno con el codigo de solo insertar

Código Delphi [-]
Close;
        SQL.Clear;
        SQL.Add('INSERT INTO ventasareas (areaventa, orden, articulo, codigo, descrip, cantidad, precio, cliente, categoria, fecha)');
        SQL.Add('VALUES(:areaventa, rden, :articulo, :codigo, :descrip, :cantidad, recio, :cliente, :categoria, :fecha)');
            params.ParamByName('areaventa').Value := sAreaVenta;
             if(iCliente < 1) then
               params.ParamByName('orden').Value := NULL
            else
               params.ParamByName('orden').Value := iorden;

            params.ParamByName('articulo').Value := txtclave.Text;
            params.ParamByName('codigo').Value := txtcodigo.Text;
            params.ParamByName('descrip').Value := txtdescripc.Text;
            params.ParamByName('cantidad').Value := txtcantidad.Text;
            params.ParamByName('precio').Value := txtprecio.Text;

            if(iCliente < 1) then
               params.ParamByName('cliente').Value := NULL
            else
               params.ParamByName('cliente').Value := IntToStr(iCliente);

            if(Length(txtcategoria.Text) > 0) then
               params.ParamByName('categoria').Value := txtcategoria.Text
            else
               params.ParamByName('categoria').Value := NULL;


            params.ParamByName('fecha').Value := FormatDateTime('dd/mm/yyyy',Date);
            ExecSQL;
            Close;

me ha funcionado bien, osea inserta en el grid todo lo que esta en los edits, pero si el articulo era repetido lo ponia en la siguiente fila del grid

asi que lo que queria hacer era comparar el codigo del articulo y si eran iguales lo actualizaba en ves de insertarlo en otra fila y si eran distintos insertaba el articulo en una nueva fila

me explico ?..

y asi que estaba haciendo mas o menos lo que te puse al inicio para poder hacer lo que te explico, pero no me sale...

oscarac 25-05-2011 04:46:39

los datos del grid lo tienes en una tabla verdad?
entonces mas o menos podrias hacer asi..
(te pongo el PseudoCodigo)

Código Delphi [-]
 
if tblDatos.Locate ('Codigo', edtCodigo.Text, []) Then
   Begin
       Update....
   end
Else
   Begin
      Append
   end

Rofocale 25-05-2011 06:21:51

no funciona ya lo probe... agrego al grid de forma normal.. cada uno en una fila mas no actualiza el item si es repetido

oscarac 25-05-2011 06:41:35

OJO el dato no se agrega al Grid...
se agrega a una tabla la cual mediante el datasource muestra los datos en el grid

Rofocale 25-05-2011 07:07:41

lo se.. mi grid esta ligado a la tabla.. pero no funciona.. inserta como siempre repetidamente uno tras de otro y no actualiza el mismo registro

oscarac 25-05-2011 07:10:44

pues lo unico que me queda decirte es que depures el programa
que veas que es lo que hace cuando tienes un codigo que ya existe... que flujo continua

Rofocale 26-05-2011 02:54:57

nada no logro hacer funcionar el codigo....

alguna otra sugerencia señores ?

gracias

Casimiro Noteví 26-05-2011 09:32:08

Cita:

Empezado por Rofocale (Mensaje 401382)
nada no logro hacer funcionar el codigo....
alguna otra sugerencia señores ?
gracias

¿Cómo que otra sugerencia? :confused:, ¿por qué no logras hacer funcionar el código?, ¿no sabes, da error, qué error, qué estás haciendo, qué código estás usando, etc.?

Rofocale 26-05-2011 17:59:25

eso estoy tratando de hacer desde varios dias atras, hacerlo funcionar, por eso puse todo el codigo para ver si alguien mas podia ver el error y ayudarme simplemente.. de todas maneras gracias

oscarac 26-05-2011 18:11:08

sabes que te recomiendo
1. lapiz y papel para armar lo que quieres...
2.- en una primera instancia no actualices todos los campos (porque eso genera mas codigo y cuando lo expones aqui se ve muy extenso), actuailza solo los principales
3.- trata de colocar un campo numerico para que cuando actualices incrementes ese campo y ver si realmente funciona o no

respira profundo y replanteate con calma lo que estas haciendo


La franja horaria es GMT +2. Ahora son las 11:02:30.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi