Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Ejecucion:No modifica los campos de un Query (Delphi) (https://www.clubdelphi.com/foros/showthread.php?t=66779)

sizne 11-03-2010 22:55:53

Ejecucion:No modifica los campos de un Query (Delphi)
 
Planteo mi problema:
Estoy realizando un pequeño sistema en Delphi con Base de Datos SQL SERVER 2000. Tengo dos tablas BDusuario y otra BDbitacora creadas en SQL, Y el el Módulo de Delphi he creado las respectivas tablas, y tambien estoy usando un Query (<--QbitUsuario), donde selecciono todo los campos de las dos tablas (Usuario y Bitacora) comparando sus llaves en este caso es CiUsuario:

Select *
From DBusuario,DBbitacora
Where CiUsuario=CiU

Todo bien hasta esta parte.
Pero una vez que ejecuto el sistema, ingreso el password y si es correcta la contraseña pues ahi programe lo sigte, donde Q <--es el Modulo donde esta el Query<--QbitUsuario y su DataSource

Q.QbitUsuario.Append;
Q.QbitUsuario.Insert;
Q.QbitUsuario.Edit;
Q.QbitUsuario['CiUsuario']:=DM.Tusuario['CiUsuario'];
Q.QbitUsuario['NomUsuario']:=DM.Tusuario['NomUsuario'];
Q.QbitUsuario['ApePU']:=DM.Tusuario['ApePU'];
Q.QbitUsuario['NivelU']:=DM.Tusuario['NivelU'];
Q.QbitUsuario['Fec_Ingreso']:=Date;
Q.QbitUsuario['Hr_Ingreso']:=Time;
Q.QbitUsuario.Post;
Con est código quiero que me registre en QbitUsuario los usuarios que estan ingresando al sistema, la hora y la fecha.
Y una vez terminado las tareas, pues debo cerrar el sistema. Y donde esta el boton SalirSistema programe lo siguiente: Recordando "Q" es el Modulo donde esta el Query<--QbitUsuario

procedure TFprincipal.SalirSistemaClick(Sender: TObject);
begin
With Q do
Begin
QbitUsuario.Append;
QbitUsuario.Edit;
QbitUsuario.Insert;
QbitUsuario['Hr_Salida']:=Time;
QbitUsuario.Post;
End;
Application.Terminate; //close;
end;

Y justo cuando estoy por terminar la aplicacion me aparece el siguiente error:

Project Pbecarios.exe raised exception class EDBEngineError with message 'QbitUsuario:Cannot modify a read-only dataset'.Process stopped. Use Step or Run to continue.

Pues revicé en sus propiedades ya no se donde es el error...y luego me aparece el siguiente error, despues de hacer click en OK.

QbitUsuario:Cannot modify a read-only dataset

Por favor preciso sus ayudas.

Gracias!

afunez2007 11-03-2010 23:15:57

Cita:

Empezado por sizne (Mensaje 356627)
Q.QbitUsuario.Append;
Q.QbitUsuario.Insert;
Q.QbitUsuario.Edit;
Q.QbitUsuario['CiUsuario']:=DM.Tusuario['CiUsuario'];
Q.QbitUsuario['NomUsuario']:=DM.Tusuario['NomUsuario'];
Q.QbitUsuario['ApePU']:=DM.Tusuario['ApePU'];
Q.QbitUsuario['NivelU']:=DM.Tusuario['NivelU'];
Q.QbitUsuario['Fec_Ingreso']:=Date;
Q.QbitUsuario['Hr_Ingreso']:=Time;
Q.QbitUsuario.Post;

Aqui veo el primer problema no debes hacer append, edit e insert en la misma instruccion, todo depende si haras una insersion solo haces insert y si haras una modificacion haces un esdit
Otra cosa es que estas trabajando con una Query y para modificar directamente datos en una query debes poner el requestlive=true
Código Delphi [-]
Q.QbitUsuario.Open;
Q.QbitUsuario.RequestLive:=True;
Q.QbitUsuario.Insert;
Q.QbitUsuario['CiUsuario']:=DM.Tusuario['CiUsuario'];
Q.QbitUsuario['NomUsuario']:=DM.Tusuario['NomUsuario'];
Q.QbitUsuario['ApePU']:=DM.Tusuario['ApePU'];
Q.QbitUsuario['NivelU']:=DM.Tusuario['NivelU'];
Q.QbitUsuario['Fec_Ingreso']:=Date;
Q.QbitUsuario['Hr_Ingreso']:=Time;
Q.QbitUsuario.Post;

Igual en este caso
Cita:

procedure TFprincipal.SalirSistemaClick(Sender: TObject);
begin
With Q do
Begin
QbitUsuario.Append;
QbitUsuario.Edit;
QbitUsuario.Insert;
QbitUsuario['Hr_Salida']:=Time;
QbitUsuario.Post;
End;
Application.Terminate; //close;
end;
Deberia de ser asi:
Código Delphi [-]
With Q do
Begin
Q.QbitUsuario.Open;
Q.QbitUsuario.RequestLive:=True;
QbitUsuario.Edit;
QbitUsuario['Hr_Salida']:=Time;
QbitUsuario.Post;
End;

Ojala te sirvan esos consejos, aunque veo que estas usando el objeto query como que fuera un TTable, seria mejor ingresarle el sql.text atravez de un boton para hacer el insert o update de lo que necesitas.

Saludos

BrunoBsso 12-03-2010 01:36:56

Esto ya te lo había respondido yo en otro hilo que creaste, te había dicho que necesitabas usar insert para datos nuevos y edit para modificar datos existentes.
Hasta me acuerdo que tu error era que intentabas agregar los datos con post sin haber puesto la tabla en modo insert.
Tratá de no abrir más de un hilo para la misma pregunta, y también tratá de leer las respuestas.
Espero que con la respuesta de afunez2007 te haya quedado claro y no habras otro hilo de nuevo con lo mismo :rolleyes:

sizne 12-03-2010 15:29:33

Cita:

Empezado por afunez2007 (Mensaje 356629)
Aqui veo el primer problema no debes hacer append, edit e insert en la misma instruccion, todo depende si haras una insersion solo haces insert y si haras una modificacion haces un esdit
Otra cosa es que estas trabajando con una Query y para modificar directamente datos en una query debes poner el requestlive=true

Código Delphi [-]
Q.QbitUsuario.Open;
Q.QbitUsuario.RequestLive:=True;
Q.QbitUsuario.Insert;
Q.QbitUsuario['CiUsuario']:=DM.Tusuario['CiUsuario'];
Q.QbitUsuario['NomUsuario']:=DM.Tusuario['NomUsuario'];
Q.QbitUsuario['ApePU']:=DM.Tusuario['ApePU'];
Q.QbitUsuario['NivelU']:=DM.Tusuario['NivelU'];
Q.QbitUsuario['Fec_Ingreso']:=Date;
Q.QbitUsuario['Hr_Ingreso']:=Time;
Q.QbitUsuario.Post;





Igual en este caso


Deberia de ser asi:

Código Delphi [-]
With Q do
Begin
Q.QbitUsuario.Open;
Q.QbitUsuario.RequestLive:=True;
QbitUsuario.Edit;
QbitUsuario['Hr_Salida']:=Time;
QbitUsuario.Post;
End;





Ojala te sirvan esos consejos, aunque veo que estas usando el objeto query como que fuera un TTable, seria mejor ingresarle el sql.text atravez de un boton para hacer el insert o update de lo que necesitas.

Saludos

Hola!
Antes que nada gracias por tu ayuda. Hice lo que me dices. Pero cuando estoy ejecutando e ingreso al sistema pues me parece este msj. :

Project Pbecarios.exe raised exception class EDatabaseError with message 'QbitUsuario:Cannot modify a read-only dataset'.Process stopped. Use Step or Run to continue.

Después de hacer click en OK. aparece el sigte msj.:

QbitUsuario:Cannot modify a read-only dataset

Luego ingreso a los otros formularios sin problema, solo cuando ingreso al formulario para ver quienes ingresaron al sistema con la horas y fechas pues me aparece el form en blanco, sin ningun dato registrado.

Y cuando quiero salir del sistema vuelve aparecerme:

Project Pbecarios.exe raised exception class EDatabaseError with message 'QbitUsuario:Cannot modify a read-only dataset'.Process stopped. Use Step or Run to continue.

Después de hacer click en OK. aparece el sigte msj.:

QbitUsuario:Cannot modify a read-only dataset

Y tengo q salir de otra forma (Crtl+Alt+Supr) del sistema.

Por favor...

sizne 12-03-2010 15:34:15

Hola!
Antes que nada gracias por tu ayuda. Hice lo que me dices. Pero cuando estoy ejecutando e ingreso al sistema pues me parece este msj. :

Project Pbecarios.exe raised exception class EDatabaseError with message 'QbitUsuario:Cannot modify a read-only dataset'.Process stopped. Use Step or Run to continue.

Después de hacer click en OK. aparece el sigte msj.:

QbitUsuario:Cannot modify a read-only dataset

Luego ingreso a los otros formularios sin problema, solo cuando ingreso al formulario para ver quienes ingresaron al sistema con la horas y fechas pues me aparece el form en blanco, sin ningun dato registrado.

Y cuando quiero salir del sistema vuelve aparecerme:

Project Pbecarios.exe raised exception class EDatabaseError with message 'QbitUsuario:Cannot modify a read-only dataset'.Process stopped. Use Step or Run to continue.

Después de hacer click en OK. aparece el sigte msj.:

QbitUsuario:Cannot modify a read-only dataset

Y tengo q salir de otra forma (Crtl+Alt+Supr) del sistema.

Por favor...
Nota: (Puedes explicarme como es lo de SQL.TEX?)

afunez2007 12-03-2010 15:55:30

Exactamente es muy normal que te de ese tipo de problemas ya que esa programacion corresponde a un objeto de TTable y no un TQuery como ya te habia dicho, si quieres utilizar con query, obviamente tienque que ser una query distinta y deberia ser algo asi como:
Código Delphi [-]
Q.QUpds.SQL.Clear;
Q.QUpds.SQL.SQL.Text:='INSERT INTO DBBitacora (CiUsuario,NomUsuario,ApePU,NivelU,Fec_Ingreso,Hr_Ingreso)'
+' Values (:CiUsuario,:NomUsuario,:ApePU,:NivelU,:Fec_Ingreso,:Hr_Ingreso)';
Q.QUpds.ParamByName('CiUsuario').AsString:=DM.Tusuario['CiUsuario'];
Q.QUpds.ParamByName('NomUsuario').AsString:=DM.Tusuario['NomUsuario'];
Q.QUpds.ParamByName('ApePU').AsString:=DM.Tusuario['ApePU'];
Q.QUpds.ParamByName('NivelU').AsString:=DM.Tusuario['NivelU'];
Q.QUpds.ParamByName('Fec_Ingreso').AsDate:=Date;
Q.QUpds.ParamByName('Hr_Ingreso').AsTime:=Time;
Q.QUpds.ExecSql;

Como veras se trabaja directamente en lenguaje SQL y no utilizando programacion delphi para trabajar como si fueran objetos TTable que era como lo intentabas hacer.

Espero te sirva

sizne 13-03-2010 17:21:57

Tienes toda la razón afunez2007, por el momento he solucionado el problema que tenia con las consultas y las tablas.
Muuuuchas gracias!

afunez2007 13-03-2010 17:24:31

Exelente, es un verdadero placer colaborar, maxime recordando los dias en que yo estaba crudo en programacion delphi y los integrantes de este foro muy amablemente me han ayudado

Saludos


La franja horaria es GMT +2. Ahora son las 18:35:55.

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