Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Sugerencias para realizar una actualizacion de un registro en Firebird (https://www.clubdelphi.com/foros/showthread.php?t=78024)

agustinbus 14-03-2012 00:09:42

Sugerencias para realizar una actualizacion de un registro en Firebird
 
Hola como estan! Queria pedirles opiniones al momento de realizar una actualizacion en firebird que es mas correcto.

Bueno el tema es que en MySql y firebird si utilizamos el siguiente codigo:
Código Delphi [-]
Query.Open;
Query.Edit;
QueryNOMBRE.Value := 'Valor';
QUery.Post;
y tenemos por ejemplo los siguiente valores en una tabla:

Nombre Apellido
Juan Rodriguez
Matiaz Fernandez
... ...
Maria Gimenez


Cuando ponemos en modo de edicion el Query e insertamos en un campo el MISMO valor que tenia antes nos arroja un error, es decir quiero modificar Juan Rodriguez y le vuelvo a poner de nombre y apellido Juan Rodriguez y automaticamente Firebird chilla.

Para ello yo lo soluciono de dos maneras pero no se cual es la adecuada.

La primera (mucho codigo) asigno en variables los valores que tenia y pregunto si cambio algun valor, en el caso de que cambio realizo el Query.Edit

La segunda (menos codigo) Utilizo try except de la siguiente forma:
Código Delphi [-]
Query.Open;
try
begin
Query.Edit;
QueryNOMBRE.Value := 'Valor';
QUery.Post;
end
except
Query.Cancel;
end;

Actualmente utilizo la primera forma, pero cuando una tabla tiene muchos campos mi codigo crece el doble al realizar las verificaciones para saber si se modifico un dato o no.
Bueno simplemente queria saber que forma es mas adecuada, o si es mejor utilizar alguna otra. Desde ya muchas gracias a todos!

Casimiro Notevi 14-03-2012 00:28:30

Cita:

Empezado por agustinbus (Mensaje 427594)
automaticamente Firebird chilla.

Debo de estar sordo, jamás he oído chillar a firebird ;)

Bromas aparte, no tiene sentido lo que dices, si actualizas un campo da igual lo que pusiera antes o después.

Yo lo suelo hacer todo en sql, por ejemplo:

Código SQL [-]
update latabla set nombre='Pedro' where codigo=1

agustinbus 14-03-2012 00:45:55

Claro que si tiene sentido porque da error, mira dejo unas imagenes para que veas, hice un ejemplo rapido.
La primera imagen muestra que me posiciono en el registro con CODIGO = B10003
En el edit de abajo del dbgrid pongo el mismo codigo: B10003


La segunda y tercera imagen muestra que pasa al presionar el boton:




y luego de generarse el error, cada vez q me muevo por la grilla, (se genera el OnDataChange), me arroja el error. El codigo de toda la aplicacion es este:
Cita:

procedure TForm1.Button1Click(Sender: TObject);
begin
ZQuery1.Open;
ZQuery1.Edit;
ZQuery1CODIGO.Value := Edit1.Text;
ZQuery1.Post;

ZQuery1.Cancel;
end;
sin embargo si cambio el codigo por el siguiente:
Cita:

procedure TForm1.Button1Click(Sender: TObject);
begin
ZQuery1.Open;
try
begin
ZQuery1.Edit;
ZQuery1CODIGO.Value := Edit1.Text;
ZQuery1.Post;
end
except
ZQuery1.Cancel;
end;

end;

se soluciona.

Esete error es conocido en MySql y Firebird, pero si por ejemplo lo conecto a una base en Access no es necesario comprobar si se modifico algun dato porq no tira error.

Cañones 14-03-2012 01:45:40

Si usas el try except se realiza la modificacion?

RONPABLO 14-03-2012 02:20:34

Por curiosidad, trabajando con FieldByName ocurre lo mismo??

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
  ZQuery1.Open;
  try
    begin
  ZQuery1.Edit;
  ZQuery1.FieldByName('CODIGO').Value := Edit1.Text;
  ZQuery1.Post;
    end
  except
  ZQuery1.Cancel;
  end;

end;

Respecto a Try como lo usas lo único que hace es capturar el error y no mostrarlo, por lo cual no se cumplirá el cambio pedido.

agustinbus 14-03-2012 03:42:32

Cañones:
Si uso el try except se realiza el cambio solo si se cambio algun dato, que es lo q en definitiva queremos. pero si se ingresan los mismos datos que ya estan almacenados en el registro tira la excepcion

RONPABLO:
Cita:

Respecto a Try como lo usas lo único que hace es capturar el error y no mostrarlo, por lo cual no se cumplirá el cambio pedido
Exactamente, porq lo que quiero es que el error no se le muestre al usuario. Y si no se cambiaron los datos, no hace falta que se realice la modificacion asi que no influye.

Con fieldByName ocurre lo mismo.

RONPABLO 14-03-2012 06:28:09

acá sí quede desconcertado... Eso parece más un bug del componente, yo trabajo con firebird y ese error no me ocurre con componentes IBX, ADO o DBX... O hay algo mal en el query ModifySQL (o como se llame en este componente) del ZUbdateSQL.

RONPABLO 14-03-2012 06:37:34

"unexpected end of command..." es un error que ocurre cuando no se cierra bien una comilla simple o cuando no se cierra un parentesis.. puedes poner todos los querys que usas?

agustinbus 14-03-2012 07:13:48

En las imagenes se muestra el ejemplo que hice, es de lo mas sencillo posible solo para mostrar el error:

1 ZConnection
1 ZQuery
1 Datasource

En la propiedad SQL del ZQuery puse: SELECT * FROM MESAS

y en el OnClick del boton:
Código:

  ZQuery1.Open;
  ZQuery1.Edit;
  ZQuery1CODIGO.Value := Edit1.Text;
  ZQuery1.Post;

Eso es todo el codigo! Es muy raro lo que sucede

Casimiro Notevi 14-03-2012 09:08:42

Cita:

Empezado por agustinbus (Mensaje 427617)
En la propiedad SQL del ZQuery puse: SELECT * FROM MESAS

Si los zeos trabajan como cualquier otro componente, deberías tener todas las setencias sql: select, insert, update, delete y refresh

Echa un vistazo a este minitutorial, está hecho para IBX, pero para el caso es lo mismo.

guillotmarc 14-03-2012 11:10:54

Estoy con Casimiro, además de la sentencia SQL para el SELECT, probablemente deberás tener también que especificar las sentencias UPDATE, INSERT, DELETE, ...

Está claro que el error puede ser perfectamente ese, puesto que dice que no se envía una sentencia SQL válida.

Algunos componentes no trabajan así (como los dbExpress conectados a ClientDatasets, que son los que utilizo habitualmente). En ese caso hay que comprobar que el DatasetProvider pueda identificar el nombre de la tabla a modificar y el de su clave primaria. Pero vamos, que dudo que Zeos trabaje así, con lo que lo primero es verificar lo que dice Casimiro.

Saludos.

agustinbus 14-03-2012 17:49:50

Muchas gracias por responder! es decir que con los componentes ZEOS no es correcto realizar las actualizaciones de la siguiente manera?
Código:

ZQuery.open;
ZQuery. Edit;
....
ZQuery.Post;

sino que hay que realizar sentencias Sql ?

Puede ocacionar algun problema en el futuro hacerlo asi?:

Código:

ZQuery.open;
try
begin
ZQuery. Edit;
....
ZQuery.Post;
end;
except
ZQuery.Cancel;
end;


Casimiro Notevi 14-03-2012 18:57:29

Sí puedes hacer "edit -> post", pero debes tener las sentencias sql.
¿Has visto el tutorial que te aconsejé?, ahí viene explicado muy sencillamente, verás que es facilito hacerlo.

agustinbus 14-03-2012 19:09:28

Casimiro! Vi el minituto hace como un mes, y ahora lo volvi a revisar, pero no encuentro en que parte hace la actualizacion. El tutorial muestra como loguearse en un sistema. No entiendo eso de que debo tener las sentencias SQL. Porque necesito las sentencias SQL si las actualizaciones las realizo con
Query.Open; Query.Edit;

Estoy muy confundido en eso de necesitar las sentencias.

Casimiro Notevi 14-03-2012 19:26:47

Para empezar ¿qué componente usas?.
Si usas un query, este tiene distintos apartados, para el select, para el insert, el delete, el update y el refresh.
Si solamente has puesto "select * from latabla" en el select, si haces una modificación y un post entonces salta el "update", y si no has escrito nada en el update... pues... error, evidentemente, no hay sentencia.
Pero esto es más difícil explicarlo que entenderlo si ves un ejemplo, mira el tutorial que te he comentado.

Si usas un componente "tabla", como el "ztable" (creo que se llama), este componente tiene todas las sentencias ya incorporadas/declaradas: select, insert, update, delete y refresh. Por eso no necesitas escribirlas tú, porque ya están.
Pero, claro, un componente "tabla" no es lo más adecuado para un sistema cliente/servidor funcionando con sql.

agustinbus 14-03-2012 19:41:01

Casimiro:
Uso los ZEOS por eso puse la Z antes de Query: ZQuery, tal vez no fui claro. No utilizo Tables.
Vi el tutorial que me has comentado, y no vi en ninguna parte algun insert o update, solo Select.

Cita:

Bien, ahora nos queda poner el codigo que necesitamos:
Empecemos por el IBQuery:

En la propiedad Database pondremos la direccion de la IBDatabase:
DataModule2.IBDatabase1

En la propiedad SQL (strings) presionaremos el boton y nos saldra una pantalla:
En este caso solo tendremos la Tabla Usuarios, escribiremos esto:

Código SQL [-]
SELECT CodUsuario, Nombre, Clave FROM Usuarios WHERE
CodUsuario = :cod
Cita:

Presionamos OK.

Ahora en la propiedad Params del IBQuery, presionamos el boton y nos saldra una pequeña pantalla, ahi cambiaremos algunos datos, quedara asi:

En el boton OK:
Código:

procedure TFLogin.BtnOkClick(Sender: TObject);
begin
  IBQuery1.Params.ParamByName('Cod').Value:= Edit1.Text;
  IBQuery1.Active:= True;



Es toda la informacion sensible que encontre en el tutorial. NO hay nada acerca de Inserts y Updates... por eso no entiendo que parte del tutorial es la que tengo que ver

agustinbus 14-03-2012 23:10:11

Bueno gracias a todos por las respuestas, ya lo resolvi utilizando sentencias SQL. No queria hacerlo de esa manera ya que significaba cambiar muuuucho codigo en el sistema, pero bueno, mejor hacer las cosas bien. Se redujo a mas de la mitad mi codigo!!! :). Durante estos dias voy a hacer un mini tuto de insert y update con zeos y firebird. Aunque se que hay mucha info, en ningun lado lo vi bien explicado.

Casimiro!: puedo agregar ese tuto en el hilo http://www.clubdelphi.com/foros/showthread.php?t=68708 de caral? o recomiendas que haga uno nuevo?

Saludos y gracias por su tiempo!

Casimiro Notevi 14-03-2012 23:37:03

Vaya, estuve todo el rato indicándote un tutorial que no correspondía :o
Era este el que quería que vieras, donde se explica cómo crear automáticamente los distintos sqls.

Casimiro Notevi 14-03-2012 23:39:00

Cita:

Empezado por agustinbus (Mensaje 427687)
Durante estos dias voy a hacer un mini tuto de insert y update con zeos y firebird. Aunque se que hay mucha info, en ningun lado lo vi bien explicado.
Casimiro!: puedo agregar ese tuto en el hilo http://www.clubdelphi.com/foros/showthread.php?t=68708 de caral? o recomiendas que haga uno nuevo?
Saludos y gracias por su tiempo!

Mejor uno nuevo, para no mezclar IBX con Zeos, luego lo ponemos con la "chincheta" para que quede en las primeras posiciones siempre :)


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