 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
risu Invitado
|
Publicado: Lun 17 Nov, 2003 2:35 pm Asunto: Mensaje error: cambio del registro por otro usuario? |
|
|
Me sale el siguiente mensaje cuando intento editar un campo que acabo de insertar en una BBDD Oracle
Exception class EDBEngine Error with message, "Couldn't perform the edit, because another user changed the record"
Al pulsar un botón, hago un post, y luego un edit, (es para añadir campos de tablas dependientes en el mismo formulario, cuando meto la clave principal hago el post )
Pero me da ese mensaje de error. No hay nadie más trabajando sobre la BBDD porque por ahora es monopuesto, y antes me pasaba tambien sobre SQL server. Alguna idea por qué puede ser? algún bug del BDE?
Gracias por la ayuda. |
|
| Volver arriba |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Mar 18 Nov, 2003 6:40 am Asunto: |
|
|
Posiblemente, estas Grabando y editando al mismo tiempo el registro en el boton, donde estableces el post y el edit, intenta, verificar si tu tabla o consulta esta en modo dsInsert o dsEdit, si es asi, establece el post,
ejemplo
| Código: |
if (DataModule1->TEMPLEADO->State == dsEdit || DataModule1->TEMPLEADO->State==dsInsert)
DataModule1->TEMPLEADO->Post();
else
DataModule1->TEMPLEADO->Edit() ;
|
espero no haberte dicho alguna locura, y haberte ayudado... _________________
 |
|
| Volver arriba |
|
 |
risu Cdt

Registrado: 17 Nov 2003Mensajes: 6Ubicación: Las Palmas (Islas Canarias)
|
Publicado: Mar 18 Nov, 2003 10:28 am Asunto: No, |
|
|
No, el fallo no debe ser ese, porque sigue sin funcionar. Es raro, porque hace el post en la BBDD, pero inmediatamente despues al intentar editar otro DBEdit da el error. Voy a añadir el código de la aplicación de prueba que estoy usando:
Un Form con 1 TDatabase, 1 TTable, 1 TSource, 2 DBEdit asociados a la misma tabla y 2 campos (clave y empresa) y 2 botones.
Cuando muestro el form (simulo entro en formulario de alta) hago un append, y cuando pulso botón 1, hago el post de la clave. (se supone que ya con esto podría añadir más campos de otras tablas que cumplan la integridad referencial) pero lo que hago en esta prueba es despues de hacer el post, hacer un edit, para poder seguir editando la tabla.
Al entrar en el DBEdit del campo empresa, y solo modificarlo ya me lanza el mensaje de error | Cita: | | Exception class EDBEngine Error with message, "Couldn't perform the edit, because another user changed the record" |
Lo más raro, es que si ha hecho la inserción en la BBDD. Añado el código de toda la prueba.
| Código: | __fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormShow(TObject *Sender)
{
Table1->Append();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if (Table1->State == dsEdit || Table1->State==dsInsert)
Table1->Post();
else
Table1->Edit() ;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Table1->Post();
}
|
Si lo hago como tenía yo antes (sin la sugerencia de Cesar, es decir en el codigo del boton1
| Código: | Table1->Post();
Table1->Edit() ; |
El error se produce antes de ejecutarse la sentencia del Edit.
Lo más raro es que me pasa con algunas tablas pero con otras funciona perfectamente. Normalmente son tablas con bastantes campos. Alguna idea? |
|
| Volver arriba |
|
 |
alfredo Master

Registrado: 13 Oct 2003Mensajes: 246Ubicación: Valencia Venezuela
|
Publicado: Mar 18 Nov, 2003 11:09 pm Asunto: |
|
|
Lo que he podido ver es que con el codigo de verificacion de estado la instruccion del else no sera ejecutada nunca y la del post si, cuando entras en el edit y escribes estas implicitamente llamando a un Edit() por esto es la diferencia de comportamiento de los dos codigos.
No conozco Oracle y por eso no puedo opinar sobre la causa del fenomeno. Puede ser que el post cierre una transaccion y el edit inicie otra, o tal vez un trigger que actue asociado al post intervenga,una solucion es metodologica: usa un menu estilo documento de Oficce, Registro, Nuevo, Editar, Borrar, Aceptar, Cancelar, donde nuevo hace el Append(), Editar el Edit().... Aceptar Post() y Cancelar Cancel() si requieres obtener una clave o codigo automatico no lo pongas en un trigger sino en un procedimiento almacenado, asi lo podras llamar sin necesidad de postear ni volver a editar el mismo registro. |
|
| Volver arriba |
|
 |
Invitado
|
Publicado: Mar 18 Nov, 2003 11:53 pm Asunto: |
|
|
Creo que te voy entendiendo,
cuando abres tu form,
1. creas automaticamente, un registro en blanco,
2. ingresas una clave, e intentas guardarla en ese momento,
2-a. en ese momento pones el Post() y luego El Edit(), correcto
3. cuando entras a poner la empresa te dice que "el bde etc etc, el msg de error.
claro, lo que pasa, es que estas perdiendo tu registro, cuando haces un post, grabas toda la informacion, de los campos que estan en modo edicion o modo Inserccion, bueno te recomiendo, que antes de grabar utilices el BookMark, para que despues del post regreses, al registro y asi no tengas problema, debe funcionar, es lo mas logico, a exepcion que exista otro metodo, por el momento te mando este codigo, con lo que tu explicas, mas el BookMark
| Código: |
TBookmark Marca;
Marca = = Tabla->GetBookmark(); // grabas el lugar donde estas
Table1->Post(); //el momento del post, guardar los datos.
Table1->GotoBookmark(Marca);// te regresas al lugar
Table1->FreeBookmark(Marca);// liberas la marca
Table1->Edit() ; // y luego editas el campo,
|
puede funcionar mas logico, talvez no entendi tu primera pregunta.. bueno.. prueba haber que pasa..
espero haberte ayudado... |
|
| Volver arriba |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Mar 18 Nov, 2003 11:56 pm Asunto: |
|
|
Perdon se me olvido registrarme para enviarlo, je je
Creo que te voy entendiendo,
cuando abres tu form,
1. creas automaticamente, un registro en blanco,
2. ingresas una clave, e intentas guardarla en ese momento,
2-a. en ese momento pones el Post() y luego El Edit(), correcto
3. cuando entras a poner la empresa te dice que "el bde etc etc, el msg de error.
claro, lo que pasa, es que estas perdiendo tu registro, cuando haces un post, grabas toda la informacion, de los campos que estan en modo edicion o modo Inserccion, bueno te recomiendo, que antes de grabar utilices el BookMark, para que despues del post regreses, al registro y asi no tengas problema, debe funcionar, es lo mas logico, a exepcion que exista otro metodo, por el momento te mando este codigo, con lo que tu explicas, mas el BookMark
| Código: |
TBookmark Marca;
Marca = = Tabla->GetBookmark(); // grabas el lugar donde estas
Table1->Post(); //el momento del post, guardar los datos.
Table1->GotoBookmark(Marca);// te regresas al lugar
Table1->FreeBookmark(Marca);// liberas la marca
Table1->Edit() ; // y luego editas el campo,
|
espero haberte ayudado... _________________
 |
|
| Volver arriba |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Mie 19 Nov, 2003 8:15 am Asunto: |
|
|
se me fue un (=), de mas la funcion debe quedar asi
| Código: |
TBookmark Marca;
// fallo aqui abajo, je je estaba Marca = = Tabla->GetBookmark();
Marca = Tabla->GetBookmark(); // grabas el lugar donde estas
Table1->Post(); //el momento del post, guardar los datos.
Table1->GotoBookmark(Marca);// te regresas al lugar
Table1->FreeBookmark(Marca);// liberas la marca
Table1->Edit() ; // y luego editas el campo,
|
_________________
 |
|
| Volver arriba |
|
 |
risu Cdt

Registrado: 17 Nov 2003Mensajes: 6Ubicación: Las Palmas (Islas Canarias)
|
Publicado: Mie 19 Nov, 2003 9:59 am Asunto: Mas difícil todavía!!! |
|
|
Bueno lo primero gracias a todos por las posibles soluciones.
Finalmente lo arregle. como? pues borrando la tabla, y creandola de nuevo en la BBDD!!!!
Lo más raro, es que ya lo había intentado renombrando la tabla y clonandola, pero tampoco funcionaba, y de pronto ahora sí.
Encima como ya comenté, otra aplicación similar sobre SQL Server me daba el mismo error, por lo que me inclino a pensar que el error sea producido por algún parámetro de conexión con la BBDD o en la Sesion o del BDE.
De todos modos guardaré la opción del bookmark ke me parece bastante interesante, y la probaré si (condicional) me vuelve a pasar.
Si alguien tiene alguna idea de a que puede ser debido esto, se lo agradecería, ya más que nada para satisfacer mi curiosidad personal. |
|
| Volver arriba |
|
 |
risu Cdt

Registrado: 17 Nov 2003Mensajes: 6Ubicación: Las Palmas (Islas Canarias)
|
Publicado: Vie 21 Nov, 2003 11:44 am Asunto: Socorro, me vuelve a pasar!!! |
|
|
Pues yo no sé que pasa, pero despues de dos días funcionando bien, el mismo código me vuelve a fallar. Lo único que he hecho es añadirle nuevas funcionalidades a la aplicación (o sea, la compilé muchas veces), pero que ni siquiera tocaban esta tabla, y el caso es que ahora no funciona.
Cada vez me extraño más, e intuyo debe ser algún fallo en la configuración del BDE o algo de eso.... |
|
| Volver arriba |
|
 |
|
|
No puedes publicar temas nuevos en este foro No puedes responder a temas en este foro No puedes editar tus mensajes en este foro No puedes borrar tus mensajes en este foro No puedes votar en las encuestas de este foro
|
© 2002–2026 Club Builder · Funciona con phpBB.
|