PDA

Ver la Versión Completa : Error - Not in edit mode


Jose Roman
23-01-2008, 16:54:33
Hola a todos, Tengo Delphi 7, Firebird 2.0, MDO, un form con sus respectivos DBEdit, DataSourge, DBNavigator. La tabla de datos TIngreso esta vacia, doy clic a insertar, pero al momento de cerrar el form sin dar clic en cancelar aparece este error , que hago para que no aparezca este error si yo deseo que al momento de cerrar la aplicacion cuando mi dataset esta en dsInsert o dsEdit se pueda cancelar desde codigo, yo aplique en el evento FormClose lo siguiente:

If fbDataSet.State in dsEditModes then fbDataSet.Cancel;
trLocal.Commit;
Action := caFree;

Y aun asi sale este error, cabe notar que si estoy en modo Inser o Edit y doy clic a cancel en el DBNavigator no lo genera, y necesito cancelar cualquier cambio si el cliente cierra el form.

juanelo
23-01-2008, 17:01:44
Que tal José Román,
Creo que tu error está en:

If fbDataSet.State in dsEditModes then fbDataSet.Cancel;
trLocal.Commit; // <-- Aquí
Action := caFree;

Ya no tiene sentido hacer commit si tus modificaciones o inserciones se cancelaron.

Saludos

Jose Roman
23-01-2008, 17:51:46
Se reporta el mismo error....

jachguate
23-01-2008, 18:52:15
Que tal José Román,
Creo que tu error está en:

If fbDataSet.State in dsEditModes then fbDataSet.Cancel;
trLocal.Commit; // <-- Aquí
Action := caFree;

Ya no tiene sentido hacer commit si tus modificaciones o inserciones se cancelaron.

Saludos

¡claro que tiene sentido!, solo por decir un par de casos que se me ocurren:

Si el nivel de aislamiento de tu transacción es "Repetable read" o "serializable" que es lo mismo, y requerís obtener información "fresca" en tu siguiente select.
Que tal si la aplicación correrá sin parar durante un año, no querras que tu Oldest Transaction en el servidor sea tan viejo... y tener todas las versiones de todos los registros solo por eso... si la base de datos tiene unos cuantos miles de registros, y unos cuantos millones de updates en el transcurso de un año (una tabla de existencias, es un buen ejemplo). ¡el tamaño de la base de datos sería monstruoso!


Te recuerdo que también los select's y no no solo los insert/update/delete corren en el contexto de una transacción.

Hasta luego.

;)

jachguate
23-01-2008, 18:55:44
Jose Roman: ¿En cual de las líneas que mostras ocurre la excepción?

Jose Roman
23-01-2008, 19:46:26
If fbDataSet.State in dsEditModes then fbDataSet.Cancel; No entiendo porque, realizo clic en el boton Insert o Edit del DBNavigator, si realizo click en el boton Cancel y cierro el Form no hay error, pero si el DataSet esta en modo Insert o Edit y lo cierro aparece el error, indicandole lo que se debe realizar en el evento OnClose;

Luis M.
23-01-2008, 20:00:35
Solo por curiosidad.
No tendrás ningún código en BeforeCancel o AfterCancel del Dataset que
asignes algún valor.

Un saludo.

jachguate
23-01-2008, 20:04:52
Solo por curiosidad.
No tendrás ningún código en BeforeCancel o AfterCancel del Dataset que
asignes algún valor.

Un saludo.

Es una buena posibilidad.

Me pregunto si lo has ejecutado paso a paso o solamente estas suponiendo que esa es la línea que produce el error.

Hasta luego.

;)

Jose Roman
23-01-2008, 20:28:07
Encontre el error. El error radica en el evento OnExit de un DBEdit, en el cual le asigno un valor a un campo, mas no le informaba que debia asignarle el valor solo cuando esta en modo de Insert o Edit.

juanelo
23-01-2008, 20:28:25
¡claro que tiene sentido!, solo por decir un par de casos que se me ocurren:
Si el nivel de aislamiento de tu transacción es "Repetable read" o "serializable" que es lo mismo, y requerís obtener información "fresca" en tu siguiente select.
Que tal si la aplicación correrá sin parar durante un año, no querras que tu Oldest Transaction en el servidor sea tan viejo... y tener todas las versiones de todos los registros solo por eso... si la base de datos tiene unos cuantos miles de registros, y unos cuantos millones de updates en el transcurso de un año (una tabla de existencias, es un buen ejemplo). ¡el tamaño de la base de datos sería monstruoso!
Te recuerdo que también los select's y no no solo los insert/update/delete corren en el contexto de una transacción.

Hasta luego.

;)

Que tal,
Yo respondo en el contexto en que el amigo Jose Roman hace su pregunta

Hola a todos, Tengo Delphi 7, Firebird 2.0, MDO, un form con sus respectivos DBEdit, DataSourge, DBNavigator. La tabla de datos TIngreso esta vacia

Entonces no creo que su tabla tenga un millón de registros ni mucho menos ;).

jachguate
23-01-2008, 20:37:26
Que tal,
Yo respondo en el contexto en que el amigo Jose Roman hace su pregunta

Entonces no creo que su tabla tenga un millón de registros ni mucho menos ;).

Jose Roman dice que actualmente la tabla está vacia. No dice cuantos datos tendrá en el futuro.

Si programasemos las aplicaciones pensando solamente en que cuando se instalan, normalmente la gran mayoría de las tablas están vacias... no quiero imaginarme el desempeño y los resultados cuándo esas aplicaciones tengan unos cuantos años en producción... :D

juanelo
23-01-2008, 20:56:09
Jose Roman dice que actualmente la tabla está vacia. No dice cuantos datos tendrá en el futuro.

Si programasemos las aplicaciones pensando solamente en que cuando se instalan, normalmente la gran mayoría de las tablas están vacias... no quiero imaginarme el desempeño y los resultados cuándo esas aplicaciones tengan unos cuantos años en producción... :D

Estoy de acuerdo, pero tambien hay que saber hacer lo que el cliente en realidad quiere, recuerdo muy bien una serie de imagenes en la cual un cliente solicita que se le contruya un columpio, y el programador termino contruyendo una montaña rusa con una llanta a modo de balancin. ¿Esta era su verdadera necesidad del usario?.
El problema que tenemos a veces es pensar en lugar del usuario, y le presentamos soluciones que van mas alla de sus necesidades.

En ninguna parte del mensaje del compañero Jose Roman menciono que su aplicacion es 24x7x365 con transacciones cada 1/2 segundo, etc ... Creeme que que si lo hubiese mencionado otra cosa hubiera sido. ;)

PD: No es mi intencion polemizar ni seguir con este debate, es mi punto de vista y ya.

jachguate
23-01-2008, 21:19:47
Estoy de acuerdo en no buscar la polémica.

Normalmente no hago afirmaciones solamente en el contexto del hilo, pues la idea es que lo que acá se dice sea leido por mas gente, ahora y en el futuro, por lo que mejor si es útil para muchos.

Lamento la desviación al tema original.

egostar
23-01-2008, 22:36:18
PD: No es mi intencion polemizar ni seguir con este debate, es mi punto de vista y ya.


Estoy de acuerdo en no buscar la polémica.


Debate, debate, debate !!!!! :D:D:D

Salud OS

eduarcol
23-01-2008, 22:41:11
Debate, debate, debate !!!!! :D:D:D

Salud OS

Sereno Moreno,
Ya Egostar, calma, relajate, a ver respira conmigo 1,2,3...

egostar
23-01-2008, 22:48:03
Sereno Moreno,
Ya Egostar, calma, relajate, a ver respira conmigo 1,2,3...

Epa eduarcol, eres un desvirtuador de hilos ya no se puede confiar en nadie...... :D:D:D

eduarcol
23-01-2008, 23:09:29
Epa eduarcol, eres un desvirtuador de hilos ya no se puede confiar en nadie...... :D:D:D

Pero si yo solo estoy evitando que la sangre llegue al rio :D:D