Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 14-03-2012
agustinbus agustinbus is offline
Miembro
 
Registrado: ago 2007
Posts: 44
Poder: 0
agustinbus Va por buen camino
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!

Última edición por Casimiro Notevi fecha: 14-03-2012 a las 00:29:21.
Responder Con Cita
  #2  
Antiguo 14-03-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.038
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por agustinbus Ver Mensaje
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
Responder Con Cita
  #3  
Antiguo 14-03-2012
agustinbus agustinbus is offline
Miembro
 
Registrado: ago 2007
Posts: 44
Poder: 0
agustinbus Va por buen camino
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.
Responder Con Cita
  #4  
Antiguo 14-03-2012
Avatar de Cañones
Cañones Cañones is offline
Miembro
 
Registrado: ene 2007
Ubicación: La Paz Entre Ríos
Posts: 354
Poder: 18
Cañones Va por buen camino
Si usas el try except se realiza la modificacion?
Responder Con Cita
  #5  
Antiguo 14-03-2012
Avatar de RONPABLO
[RONPABLO] RONPABLO is offline
Miembro Premium
 
Registrado: oct 2004
Posts: 1.514
Poder: 21
RONPABLO Va por buen camino
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.
__________________
"Como pasa el tiempo..... ayer se escribe sin H y hoy con H"
Responder Con Cita
  #6  
Antiguo 14-03-2012
agustinbus agustinbus is offline
Miembro
 
Registrado: ago 2007
Posts: 44
Poder: 0
agustinbus Va por buen camino
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.
Responder Con Cita
  #7  
Antiguo 14-03-2012
Avatar de RONPABLO
[RONPABLO] RONPABLO is offline
Miembro Premium
 
Registrado: oct 2004
Posts: 1.514
Poder: 21
RONPABLO Va por buen camino
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.
__________________
"Como pasa el tiempo..... ayer se escribe sin H y hoy con H"
Responder Con Cita
  #8  
Antiguo 14-03-2012
Avatar de RONPABLO
[RONPABLO] RONPABLO is offline
Miembro Premium
 
Registrado: oct 2004
Posts: 1.514
Poder: 21
RONPABLO Va por buen camino
"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?
__________________
"Como pasa el tiempo..... ayer se escribe sin H y hoy con H"
Responder Con Cita
  #9  
Antiguo 14-03-2012
agustinbus agustinbus is offline
Miembro
 
Registrado: ago 2007
Posts: 44
Poder: 0
agustinbus Va por buen camino
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
Responder Con Cita
  #10  
Antiguo 14-03-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.038
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por agustinbus Ver Mensaje
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.
Responder Con Cita
  #11  
Antiguo 14-03-2012
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 23
guillotmarc Va por buen camino
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.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).
Responder Con Cita
  #12  
Antiguo 14-03-2012
agustinbus agustinbus is offline
Miembro
 
Registrado: ago 2007
Posts: 44
Poder: 0
agustinbus Va por buen camino
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;
Responder Con Cita
  #13  
Antiguo 14-03-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.038
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
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.
Responder Con Cita
  #14  
Antiguo 14-03-2012
agustinbus agustinbus is offline
Miembro
 
Registrado: ago 2007
Posts: 44
Poder: 0
agustinbus Va por buen camino
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.
Responder Con Cita
  #15  
Antiguo 14-03-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.038
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
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.
Responder Con Cita
  #16  
Antiguo 14-03-2012
agustinbus agustinbus is offline
Miembro
 
Registrado: ago 2007
Posts: 44
Poder: 0
agustinbus Va por buen camino
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
Responder Con Cita
  #17  
Antiguo 14-03-2012
agustinbus agustinbus is offline
Miembro
 
Registrado: ago 2007
Posts: 44
Poder: 0
agustinbus Va por buen camino
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!
Responder Con Cita
  #18  
Antiguo 14-03-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.038
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Vaya, estuve todo el rato indicándote un tutorial que no correspondía
Era este el que quería que vieras, donde se explica cómo crear automáticamente los distintos sqls.
Responder Con Cita
  #19  
Antiguo 14-03-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.038
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por agustinbus Ver Mensaje
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
Responder Con Cita
Respuesta



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
Sugerencias para pasar XML a Tabla MaMu Varios 0 01-11-2008 01:41:33
web (PHP) + Firebird. Sugerencias y comentarios. Delphius PHP 1 11-06-2007 14:49:17
Sugerencias sobre un procesador P4 DUALCORE en firebird AGAG4 Firebird e Interbase 13 06-06-2007 21:20:33
Sugerencias para programa 3D... Er_Manué Varios 2 30-10-2006 15:05:22
Actualizacion de registro JorgeBec Conexión con bases de datos 8 22-11-2004 22:14:54


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


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