Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Mensaje error: cambio del registro por otro usuario?

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Mensaje error: cambio del registro por otro usuario? Responder citando

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
Mensaje    Asunto: Responder citando

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...
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: No, Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

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
Mensaje    Asunto: Responder citando

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...
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

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,

_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Mas difícil todavía!!! Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Socorro, me vuelve a pasar!!! Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
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


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.