 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
ercea Ens

Registrado: 07 May 2007Mensajes: 48
|
Publicado: Mar 26 Jun, 2007 2:39 am Asunto: Problema al eliminar tuplas con Interbase |
|
|
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 |
|
 |
Buildero Master


Registrado: 23 Dic 2003Mensajes: 523Ubicación: Puebla, México
|
Publicado: Mar 26 Jun, 2007 2:13 pm Asunto: |
|
|
¿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 |
|
 |
ercea Ens

Registrado: 07 May 2007Mensajes: 48
|
Publicado: Mar 26 Jun, 2007 3:24 pm Asunto: |
|
|
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í . 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
Bueno siento mucho las molestias a todos espero que no me vuelva a pasar |
|
| Volver arriba |
|
 |
Buildero Master


Registrado: 23 Dic 2003Mensajes: 523Ubicación: Puebla, México
|
Publicado: Mie 27 Jun, 2007 2:33 pm Asunto: |
|
|
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 |
|
 |
ercea Ens

Registrado: 07 May 2007Mensajes: 48
|
Publicado: Vie 06 Jul, 2007 5:31 pm Asunto: |
|
|
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
saludos! |
|
| 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.
|