PDA

Ver la Versión Completa : Borrar registro en tabla maestra y todos los de la tabla detalles correspondientes


jealousy
08-10-2003, 17:09:48
Holita de nuevo :)

Me estoy volviendo loco con este problema:

Tengo dos tablas: Ventas, LineasVentas (paradox). Todo va bien, pero me falta una cosa. Quiero poder cancelar una venta que tiene ya lineas. Pero siempe me sale el error diciendo que la tabla no esta en modo de edicion.

Tengo una opcion de borrar linea y esa si funciona bien.

¿Como puedo cancelar esa venta? Osea, Eliminar la venta de la Tabla Maestra y las lineas que corresponden a esta.

He probado con While Not LineasVenta.EOF y eliminar todas las lineas de esa venta y despues la Venta Maestra pero me muestra el error de que no esta en modo edicion.

Aparte de esto, es que me viene ocurriendo una cosa en todas las tablas que uso en el programa, y es que aunque elimine todos los registros de una tabla, siempre queda uno que no tiene nada, pero hay esta y no hay forma de quitarlo. Hago delete y se elimina pero me crea otro, pues lo veo en el campo codigo autoincrementable. Y con este problema nunca puedo usar la funcion RecordCount=0 por ejemplo porque nunca es 0.

Espero q puedan ayudarme, estoy desesperado ya :(

Gracias y saludos

franchihq
08-10-2003, 18:14:41
no he trabajado mucho con paradox y al paradox no ser una base de datos relacional no puedes hacer eso a nivel de base de datos o se debes hacerlo en el codigo de delphi, entonces en el objeto table en delphi en la propiedades puedes espeficicarle cual es el padre y cual es el hijo y tambien puedes espedificarle por que campo estan relacionados y hay una opcion en la cual le exiges integridad referencial, por ahi creo que puedes solucionar tu problema.

Saludos,

sanxpue
08-10-2003, 19:17:01
En Paradox si puedes hacer referecia pero no es muy fiable...

pero weno me imagino que no hiciste entonces supongamos

en ventas cuando cancelas..supongamos el indice de la venta es 10
entonces cierras ventas despues lo abres y escribes

While TablaVentas.FindKey(['10']) Do
TablaVentas.Delete;
TablaVentas.Close;

Arriba imaginandonos que el Indice primario es indice en ventas

Ahora en LineasVentas me imagino que tienes un dato que lleva el 10 (digamos se llama el campo : IndiceVenta)

TablaLineasVentas.Index := 'IndVen'
(imaginandonos que le pusiste un indice secundario a tablaLineasVentas llamado IndVen que tiene el campo IndiceVenta)
While TablaLineasVentas.FindKey(['10']) Do
TablaLineasVentas.Delete;
TablaLineasVentas.Close;

TablaLineasVentas.Index := '';

y con eso debe de jalar...

jealousy
09-10-2003, 23:35:54
Muchas gracias. Me va bien, ya lo tengo.

Pero me queda un registro en la tabla lineas, un registro vacio. Este problema ya lo he comentado aqui en el foro. Pero nadie me ha respondido y yo no he encontrado la solucion tampoco.

Saludos :)

Lepe
14-10-2003, 11:57:50
Los autoincrementables son una lata, yo los he tenido que quitar todos de mi aplicación.

Si es una tabla maestra, sip, siempre se queda ahí ese registro para indicar que ese registro es el siguiente a Crear. Si además usas un autoincrementable, verás como se va aumentando cada vez más y más :( La única forma que he encontrado es quitar el autoincrementable, y programarlo a mano.

Al tiempo de llevar al cliente las tablas, borra con el database Desktop el registro ese que se te queda pillado. ;)

Al borrar el ultimo registro, la tabla se queda en modo insercion, (por eso aparece ese registro)

Saludos.

jealousy
14-10-2003, 12:26:12
Muchas gracias por la info :)

Pues vaya putada ¿no?

Y eso de crear los autoincrementables uno mismo, ¿como se puede hacer?

¿Seria mejor usar dBase en lugar de Paradox?

De nuevo, muchas gracias y saludos!

Lepe
14-10-2003, 12:36:47
function NuevoIdCliente():integer ;
begin
Result:= 1;
with dtm do
begin
if qryNClientes.Active then qryNclientes.Close;
qryNClientes.Open;
if not qryClientes.IsEmpty then
if (qryNclientes.Fields[0].AsInteger > 0) then
Result:= qryNclientes.Fields[0].AsInteger+1;
qryNclientes.Close;
end;

end;

dtm es mi Datamodule
qryNClientes es una Tquery y en su SQL tiene : SELECT MAX(IDCLIENTE) FROM CLIENTES;


Si buscas por el foro encontrarás más información.

si tu programa es en red, en el BeforePost, busca el NuevoIdCliente de nuevo... no vaya a ser que otro gracioso en la red haya añadido un registro con ese Id ;)

Saludos

Lepe
14-10-2003, 12:46:23
Posteado originalmente por jealousy
Pero siempe me sale el error diciendo que la tabla no esta en modo de edicion.



if not (tabla.State in dsEditModes) then
tabla.Edit ; //


y como decimos en Lepe .... " a juí " (y a salir corriendo)