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 

Problema al eliminar tuplas con Interbase

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Bases de Datos
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Problema al eliminar tuplas con Interbase Responder citando

Hola a todos de nuevo, poco a poco me estoy integrando con Interbase, y buf, hay mucha diferencia y me está gustando mas que Paradox.
Ahora estoy teniendo problemas para confirmar la inserción o elminacion de los datos y no sé el por qué. Bueno la inserción ya está solucionado. Os cuento un poco la situación (todo con Firebird 2.0 y componentes IBX):

Tengo un formulario con un database que conecta la base de datos de mi programa ok?. Luego en otro formulario para gestionar una de las tablas (un ejemplo Clientes), tengo un IBDataSet con los parametros SQL's (inserción eliminación, etc) puestos correctamente, un grid correctamente asociado, un componente IBTransaction (y este creo que es el que me la está liando) cuya configuracion es (siguiendo los consejos de unos hilos que he encontrado):

-write
-read_committed
-rec_version
-nowait

-AllowAutoStart : true
-Default y auto action = CommitRetaining
-DefaultDatabase: Al componente Database que tenía al principio

Bien, he leido mucho que siempre se recomeinda poner el Commit o CommitRetaining no?, pues bien, cuando inserto (mediante otro formulario rellenando dbedits). Al pulsar "Insertar" pues tenía al principio:

DataSetClientes->Post();
TransClientes->CommitRetaining(); //Transaccion

Pues no se insertaba correctamente (una tupla vacia concretamente), ahora solo tengo puesto:

DataSetClientes->Post();

Y me funciona correctamente, supuse que sería por las acciones por defecto (que las tengo con CommitRetaining) no hace falta indicar el CommitRetaining porque lo tengo puesto por defecto. Sin embargo a la hora de eliminar una tupla, ponga lo que ponga hace como que elimina (en el grid se ve que se elimina) pero si salgo y vuelvo a ese formulario dicho grid vuelve a contener la tupla eliminada.

Tanto si pongo:

DataSetClientes->Delete();
TransClientes->CommitRetaining();

Como simplemente:

DataSetClientes->Delete();

El resultado es el mismo, no se elimina realmente. También he leid que antes de hacer nada ponga StarTransaction al componente, pero me sale una excepción diciendo que ya está activa (supongo que por tener la propiedad AllowAutoStart en true). Con que ya no sé que hacer xDD

¿Cuál es el fallo que estoy teniendo?

Os lo agradeceria mucho y quitarme estos quebraderos xDDD

saludos!!
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

¿Tu componente IBDataSet apunta a la transacción que mencionas?

Por todo lo que has explicado, teóricamente debería de funcionar. Commit o CommitRetaining fijarán los cambios de manera definitiva, ya sea un Insert, Delete o Update.

Saludos!
_________________
Quien hace una pregunta teme parecer un ignorante durante cinco minutos, quien no pregunta se mantiene ignorante toda la vida.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Gracias Buildero por responder. Sí, tengo asociado el componente IBDataSet con el componente IBTransaction. Por si os sirve de ayuda, para eliminar tengo en la propiedad DeleteSQL del componente IBDataSet:

DELETE
FROM Clientes
WHERE clt_num = :OLD_NUM;

Para eliminar, lo que hago es selecciono un cliente del grid (el grid es sólo lectura), y pulso un botón eliminar, que lo que hace es lo que os he explicado anteriormente, en el evento OnClick:

Código:

    frmClientes->DataSetClientes->Delete();
    frmClientes->TransClientes->CommitRetaining();

    MessageDlg("El cliente se ha eliminado correctamente",mtInformation,TMsgDlgButtons()<<mbOK,0);



Se "elimina" aparentemente del grid, pero al volver sigue ahí Crying or Very sad . En fin, seguiré mirando y "probando" cosas jeje

saludos!

EDITO: Ya he encontrado el fallo... DIOS, dos días perdidos por una tonteria. Al final resulto la sentencia SQL, como dije antes tenia:

DELETE
FROM Clientes
WHERE clt_num = :OLD_NUM;

Y para que sea efectivo, tiene que ser:

DELETE
FROM Clientes
WHERE clt_num = :OLD_CLT_NUM;

vamos escribir el mismo nombre del atributo (clt_num) anteponiendo el OLD_.... que coraje Embarassed

Bueno siento mucho las molestias a todos espero que no me vuelva a pasar
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Me alegra que los hayas resulto ercea, solo que si me salta una gran duda, ¿cómo es que en tu grid se eliminaba? si se supone que no "old..." pudiera tener cualquier valor.

Sugerencia, normalmente yo uso la auto-generación de sentencias SQL (update, insert y delete). Precisamente para evitarnos esos dolores de cabeza.

Saludos!
_________________
Quien hace una pregunta teme parecer un ignorante durante cinco minutos, quien no pregunta se mantiene ignorante toda la vida.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Pues sinceramente yo tampoco me explico cómo borraba en el grid xD y por eso me llevé dos días comiendome la cabeza, en fin cosas que pasan.

Sobre la autogeneración, ¿te refieres en el editor SQL que te aparecen dos columnas una con las tablas y otra con los atributos y vas seleccionando de ellas no?, si es eso, ya lo voy usando para evitar esto jejeje.

Gracias por responder Buildero Wink

saludos!
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.