Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Tablas planas (https://www.clubdelphi.com/foros/forumdisplay.php?f=20)
-   -   Maestro/Detalle (No graba en tabla Maestro) (https://www.clubdelphi.com/foros/showthread.php?t=55420)

teclilla 16-04-2008 18:41:07

Maestro/Detalle (No graba en tabla Maestro)
 
Hola a todos,
estoy empezando a programar en delphi con una aplicacion para hacer presupuestos, albaranes, etc. con clientes y productos. Uso delphi 5 y paradox 7 y mi problema es el siguiente:

tengo un formulario para hacer un albaran, del siguiente modo:
DBedits con datos generales del albaran, Idalb, fecha, observaciones, etc. (Talbaranes) Tabla Maestra.
Un apartado para seleccionar el cliente mediante un boton en el que se abre otro formulario donde se selecciona y se rellena el campo cliente de Talbaranes.
Otro apartado para ir añadiendo la linea de detalle del albaran, es decir, producto, cantidad, precio. Estos ultimos datos los guardo en TalbprodDetalle, Tabla Detalle.
Hasta aqui todo funciona bien, despues tengo un botón Confirmar, para validar el albaran y guardarlo en tabla, este botón realiza el siguiente codigo, (entre otras cosas):
Código Delphi [-]
procedure TFormAlbaran.GrabarAlbaran;
begin
    if ((DBEditIdalb.Field.IsNull) or (DBEditFechaAlb.Field.IsNull) or (DBEditNifCli.Field.IsNull))then
        if Application.MessageBox('Faltan datos obligatorios del Albarán','Añadiendo Albarán',mb_iconExclamation+mb_ok)= id_ok then
        begin
        SpeedButtonCancelarClick(Self);
        Abort;
        end
    else
        begin
        //guardamos presupuesto
        Talbaranes.Post;
        Talbaranes.ApplyUpdates;
        TalbprodDetalle.Post;
        TalbprodDetalle.ApplyUpdates;
        end;
end;

Bien pues el tema es que guarda los datos en la tabla detalle, pero no en la tabla maestra, ya que lo compruebo abriendo directamente las tablas con el Database Desktop.

Espero que alguien sepa el porqué ocurre esto y haberlo explicado adecuadamente.

Un saludo.
Muchas gracias.

Caral 16-04-2008 23:39:15

Hola
Esto no lo se (para variar), nunca lo he hecho pero me pregunto, no es al revés?.
Código Delphi [-]
 begin
        //guardamos presupuesto
        Talbaranes.ApplyUpdates;
        Talbaranes.Post;
        TalbprodDetalle.ApplyUpdates;
        TalbprodDetalle.Post;
        end;
Saludos

BlueSteel 16-04-2008 23:46:05

Hola teclilla

Cita:

Bien pues el tema es que guarda los datos en la tabla detalle, pero no en la tabla maestra, ya que lo compruebo abriendo directamente las tablas con el Database Desktop.
Podrias agregar el código de cuando guardas los datos en las respectivas tablas...

según el código, veo que solo realizas una actualización de la base.. pero no indicas como almacenas la info...

por lo general se ingresa (insert) y luego se realiza el Refresh (update ) y con el post se estaría confirmando el ingreso y/o actualizacion


Cita:

Esto no lo se (para variar)
Buena acotación Caral...

pero como es eso de Eso no lo sabes (para variar),

veo que te gusta pasar de incognito... (o de novato...) ;):D

Salu2:p:D

eduarcol 16-04-2008 23:55:15

a ver si tengo la misma duda, porq realizas un applyupdate y luego un post?, deja cacheupdate en falso y listo.

Por otro lado lo que dice bluesteel es logico, te falta la parte de la insercion.

Como recomendacion agrega la instruccion MiTabla.FlushBuffer; en el evento afterpost de las tablas para asegurar que se guarde la info.

teclilla 18-04-2008 18:02:47

Ok, el formulario visualiza los datos del albaran en DBEdits y el detalle del albarán en Datagrid. Despues tengo un DBNavegator para moverme.
El formulario tiene un boton Añadir (para añadir un albaran) que realiza lo siguiente:
Código Delphi [-]
procedure TFormAlbaran.SpeedButtonAnadirClick(Sender: TObject);
var
   id_ant: longint;
begin
        DBEditsEscritura;
        Label13.Caption:='Añadiendo un nuevo albarán.';
        DesactivarBotones;
        Talbaranes.Last;
        id_ant:=Talbaranes.FieldByName('Idalb').AsInteger;
        Talbaranes.Append; //modo insert
        //introducimos idalb calculado y fecha actual
        Talbaranes.FieldByName('Idalb').AsInteger:=id_ant+1;
        Talbaranes.FieldByName('Fecha').AsDateTime:=Date;
end;

entonces relleno en los DbEdits los demás campos generales del albarán observaciones y tal, y despues tengo un boton que me lleva a otro formulario para elegir producto y cantidad y al darle aceptar lo añado al Dbgrid del siguiente modo:
Código Delphi [-]
procedure TFormAlbaran.SpeedButtonAnaLProdClick(Sender: TObject);
begin
        if (EditCodigo.Text='') or (EditCantidad.Text='') then
           if Application.MessageBox('Seleccione un producto e introduzca la cantidad','Detalle del Albarán',mb_iconExclamation+mb_ok)= id_ok then
              Abort;
        //pasamos datos al DBGrid
        TalbprodDetalle.Last;
        TalbprodDetalle.Append; //modo edicion
        TalbprodDetalle.FieldByName('Codprod').AsString:=EditCodigo.Text;
        //lookup nombre
        TalbprodDetalle.FieldByName('Cantidad').AsString:=EditCantidad.Text;
        EditCodigo.Text:='';
        EditNombre.Text:='';
        EditCantidad.Text:='';
end;

en las dos tablas realizo un Append y despues al pulsar el Boton de Confirmar realiza el codigo que os puse en el post de mas arriba.

¿Hay algo que estoy haciendo mal?

Muchas gracias.

teclilla 21-04-2008 17:46:04

Hola de nuevo,
Caral he probado a intercambiar las instrucciones, es decir:
Código Delphi [-]
Talbaranes.ApplyUpdates;
        Talbaranes.Post;
        TalbprodDetalle.ApplyUpdates;
        TalbprodDetalle.Post;

pero sigue igual,
Eduarcol tambien he comprobado que tengo CachedUpdates de Talbaranes False y las dos tablas estan en edicion mientras voy escribiendo en los DBedits correspondientes ...
Me faltaria comprobar esta instrucción:
Código Delphi [-]
MiTabla.FlushBuffer;

¿he de ponerla tanto en la tabla maestra como en Detalle o solo en la maestra?

Muchas gracias a todos.
Espero poder resolverlo.
Saludos.

eduarcol 21-04-2008 17:57:04

en las dos, esa instruccion se utiliza en paradox para forzar la escritura a disco

teclilla 21-04-2008 19:01:30

He probado esta ultima instruccion y sigue igual, aunque he probado una cosa: Si inserto un registro en la tabla Maestro/Detalle (Talbaranes/TalbprodDetalle), confirmo y cierro la aplicacion no me guarda en la tabla maestra pero si en la tabla detalle. Pero si antes de cerrar me muevo de registro con el DBNavegator entonces si guarda bien en las dos tablas. ¿A que puede ser debido? ¿Como puedo solvertarlo por si el usuario cierra al dar de alta un registro sin moverse en la tabla?

MUCHAS GRACIAS.

eduarcol 21-04-2008 19:21:03

tienes que hacer post en la tabla de albarranes

TAlbarranes.Post;

teclilla 21-04-2008 19:35:55

Perdona Eduarcol, pero si que lo hago,
¿tengo que hacerlo otra vez antes de cerrar la aplicacion?
Gracias.

eduarcol 21-04-2008 20:09:49

si yo veo que en el codigo que colocas lo pones, pero estas seguro que ese codigo es llamado en la ejecucion del programa?:confused:

Delphius 21-04-2008 20:16:17

Hola teclilla,
¿Podrías por favor exponernos el código? Dices que haces eso y aquello otro... es posible que el problema venga de otro lado.

Necesitamos que nos aportes mayores detalles de lo que nos brindas. Un poco más de tu código podría revelarnos parte del problema y/o su solución.

No dudes en exponer tu duda, cuanto más información nos brindes mejor sera para ti. No te vamos a cobrar por la cantidad palabras.

Pon un poco más de tu parte para que podamos ayudarte.

Saludos,

teclilla 21-04-2008 20:59:54

OK,
Al crear el formulario:
Código Delphi [-]
procedure TFormAlbaran.FormCreate(Sender: TObject);
begin
        //abrimos tablas
        Talbaranes.Open;
        Talbaranes.First;
        TCliente.Open;
        TProductos.Open;
        TalbprodDetalle.Open;
end;

Despues tengo en el formulario un botón para añardir un nuevo albaran:

Código Delphi [-]
procedure TFormAlbaran.SpeedButtonAnadirClick(Sender: TObject);
var
   id_ant: longint;
begin
        DBEditsEscritura;       //(Readonly:=false)
        Label13.Caption:='Añadiendo un nuevo albarán.';
        DesactivarBotones;  //Solo visibles Botones Confirmar y cancelar
        Talbaranes.Last;
        id_ant:=Talbaranes.FieldByName('Idalb').AsInteger;
        Talbaranes.Append; //modo insert
        //introducimos idalb calculado y fecha actual
        Talbaranes.FieldByName('Idalb').AsInteger:=id_ant+1; //siguiente alb
        Talbaranes.FieldByName('Fecha').AsDateTime:=Date; //fecha hoy
end;

Despues introducimos los demas DbEdits que queramos del albaran y despues le damos al boton de confirmar para grabar:
Código Delphi [-]
procedure TFormAlbaran.SpeedButtonConfirmarClick(Sender: TObject);
begin
     GrabarAlbaran;
     ControlStock;
     DBEditsLectura;     //(Readonly:=true)
     ActivarBotones;   // Visibles los demas botones 
     Label13.Caption:='';
end;

Código Delphi [-]
procedure TFormAlbaran.GrabarAlbaran;
begin
    if ((DBEditIdalb.Field.IsNull) or (DBEditFechaAlb.Field.IsNull) or (DBEditNifCli.Field.IsNull))then
        if Application.MessageBox('Faltan datos obligatorios del Albarán','Añadiendo Albarán',mb_iconExclamation+mb_ok)= id_ok then
        begin
        SpeedButtonCancelarClick(Self);
        Abort;
        end
    else
        begin
        //guardamos presupuesto
        Talbaranes.ApplyUpdates;
        Talbaranes.Post;
        TalbprodDetalle.ApplyUpdates;
        TalbprodDetalle.Post;
        end;
end;
 
//este procedimiento lleva el stock de los productos que se añaden al
//albaran y salen de fabrica.
procedure TFormAlbaran.ControlStock;
begin
        //para los detalles del alb correspondiente
        TalbprodDetalle.First;
        while not TalbprodDetalle.Eof do
        begin
        TProductos.Locate('Codigo',TalbprodDetalleCodprod.asString,[]);
        TProductos.Edit;//editamos
        //modificamos
        TProductos.FieldByName('Stock').asInteger:=TProductos.FieldByName('Stock').asInteger - TalbprodDetalleCantidad.AsInteger;
        TProductos.Post;//grabamos
        TalbprodDetalle.next;
        end;
end;

Al ejecutar el programa, si doy de alta un albaran, y sin cambiar de registro cierro, no se guarda en la tabla maestra y si en la tabla detalle, pero si cambio de registro antes de salir se graba en las dos :confused:

MUCHAS GRACIAS.


La franja horaria es GMT +2. Ahora son las 09:04:41.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi