Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Tablas planas
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 16-04-2008
teclilla teclilla is offline
Miembro
 
Registrado: feb 2008
Posts: 41
Poder: 0
teclilla Va por buen camino
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.
Responder Con Cita
  #2  
Antiguo 17-04-2008
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
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
Responder Con Cita
  #3  
Antiguo 17-04-2008
Avatar de BlueSteel
[BlueSteel] BlueSteel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Concepción - Chile
Posts: 2.310
Poder: 23
BlueSteel Va por buen camino
Cool

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...)

Salu2
__________________
BlueSteel
Responder Con Cita
  #4  
Antiguo 17-04-2008
Avatar de eduarcol
[eduarcol] eduarcol is offline
Miembro Premium
 
Registrado: ago 2003
Ubicación: En los estados Zulia y Merida de Venezuela
Posts: 4.151
Poder: 25
eduarcol Va por buen camino
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.
__________________
...Yo naci en esta ribera del arauca vibr@d0r
Soy hermano de la espuma,
de la garza, de la rosa y del sol...
Viva Venezuela
Responder Con Cita
  #5  
Antiguo 18-04-2008
teclilla teclilla is offline
Miembro
 
Registrado: feb 2008
Posts: 41
Poder: 0
teclilla Va por buen camino
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.
Responder Con Cita
  #6  
Antiguo 21-04-2008
teclilla teclilla is offline
Miembro
 
Registrado: feb 2008
Posts: 41
Poder: 0
teclilla Va por buen camino
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.
Responder Con Cita
  #7  
Antiguo 21-04-2008
Avatar de eduarcol
[eduarcol] eduarcol is offline
Miembro Premium
 
Registrado: ago 2003
Ubicación: En los estados Zulia y Merida de Venezuela
Posts: 4.151
Poder: 25
eduarcol Va por buen camino
en las dos, esa instruccion se utiliza en paradox para forzar la escritura a disco
__________________
...Yo naci en esta ribera del arauca vibr@d0r
Soy hermano de la espuma,
de la garza, de la rosa y del sol...
Viva Venezuela
Responder Con Cita
  #8  
Antiguo 21-04-2008
teclilla teclilla is offline
Miembro
 
Registrado: feb 2008
Posts: 41
Poder: 0
teclilla Va por buen camino
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.
Responder Con Cita
  #9  
Antiguo 21-04-2008
Avatar de eduarcol
[eduarcol] eduarcol is offline
Miembro Premium
 
Registrado: ago 2003
Ubicación: En los estados Zulia y Merida de Venezuela
Posts: 4.151
Poder: 25
eduarcol Va por buen camino
tienes que hacer post en la tabla de albarranes

TAlbarranes.Post;
__________________
...Yo naci en esta ribera del arauca vibr@d0r
Soy hermano de la espuma,
de la garza, de la rosa y del sol...
Viva Venezuela
Responder Con Cita
  #10  
Antiguo 21-04-2008
teclilla teclilla is offline
Miembro
 
Registrado: feb 2008
Posts: 41
Poder: 0
teclilla Va por buen camino
Perdona Eduarcol, pero si que lo hago,
¿tengo que hacerlo otra vez antes de cerrar la aplicacion?
Gracias.
Responder Con Cita
  #11  
Antiguo 21-04-2008
Avatar de eduarcol
[eduarcol] eduarcol is offline
Miembro Premium
 
Registrado: ago 2003
Ubicación: En los estados Zulia y Merida de Venezuela
Posts: 4.151
Poder: 25
eduarcol Va por buen camino
si yo veo que en el codigo que colocas lo pones, pero estas seguro que ese codigo es llamado en la ejecucion del programa?
__________________
...Yo naci en esta ribera del arauca vibr@d0r
Soy hermano de la espuma,
de la garza, de la rosa y del sol...
Viva Venezuela
Responder Con Cita
  #12  
Antiguo 21-04-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
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,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #13  
Antiguo 21-04-2008
teclilla teclilla is offline
Miembro
 
Registrado: feb 2008
Posts: 41
Poder: 0
teclilla Va por buen camino
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

MUCHAS GRACIAS.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Tabla Paradox maestro/detalle Ayuda Jaros Tablas planas 2 05-01-2008 14:35:33
Problema tabla Maestro-detalle en la q la pk de t.detalle formad por 2cods de la maes akinom38 Varios 1 09-11-2007 20:27:44
Respecto a la relacion maestro detalle detalle ilichhernandez Conexión con bases de datos 0 15-05-2007 19:13:54
Maestro-Detalle 'virtual' con una sola tabla gluglu Conexión con bases de datos 2 11-10-2004 20:44:23
Maestro-Detalle ;Actualizar detalle a partir de un DBgrid norberto_larios Conexión con bases de datos 1 11-09-2004 19:17:34


La franja horaria es GMT +2. Ahora son las 15:41:35.


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
Copyright 1996-2007 Club Delphi