![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|||||||
| Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
![]() |
|
|
Herramientas | Buscar en Tema | Desplegado |
|
|
|
#1
|
||||
|
||||
|
Mil gracias
![]() gluglu, funciona perfectamente. Lo mejor es lo más simple ... tengo que perder ciertos vicios.Ciertamente al estar dentro de una transacción, el tema de CachedUpdates sobra. Gracias |
|
#2
|
|||
|
|||
|
no lo veo claro
Hola, me veo en una situación muy parecida a la de morta71 y he despejado algunas dudas con este hilo pero en el código corregido por gluglu veo esto al hacer click en añadir:
Código Delphi [-] procedure TForm1.Button1Click(Sender: TObject); begin DataModule2.Master.Append; // El Generador es el que te incrementa automáticamente // el valor de ID. // Tienes que asegurarte que antes de insertar en LINEAS // se haga el POST con el ID correspondiente. DataModule2.Master.Post; // Por ello hago el Post aquí. end; Pero de esta manera no estamos insertando un registro vacío (bueno con su id) y luego mediante el autoedit de los dbedit editandolo? y luego vale, añadimos lineas de detalle sin problemas porque nos aseguramos que exista el registro maestro. Y si no puedo insertar un registro vacío (solo con su id) porque tengo campos obligados?? no puedo hacer un post justo después del append. He optado por hacer el post del master en el onnewrecord de lineas pero si el usuario no rellena los campos obligados antes de ponerse a insertar lineas en la factura CATACRAC, y eso no puede ser. No se... no lo veo claro. |
|
#3
|
||||
|
||||
|
Evidentemente la cosa se puede complicar todo lo que uno quiera.
Una cosa es el código simple que añadí a este hilo, como corrección del que puso morta71, y otra cosa muy diferente es cualquier otro código que se quiera programar. Lo único que hay que tener claro es que antes de hacer el Post del detalle, tiene que existir el correspondiente registro en el Maestro (que se habrá confirmado con su correspondiente Post en el Maestro). Las operaciones y comprobaciones que puedas o tengas que hacer previamente en el maestro, es asunto particular tuyo. En el código que adjunté, como precisamente no había que hacer ninguna comprobación ni nada parecido, y a fines de comprensión y aclaración, opté por poner el Post justo después del Append, que la verdad es que no se debería hacer nunca en condiciones normales. A lo mejor te puedo ayudar en algunas cosas más concretas. Si es así, te rogaría exponer un poco más del código que pretendes ejecutar. Saludos ![]()
__________________
Piensa siempre en positivo ! |
|
#4
|
|||
|
|||
|
Grácias gluglu por tu interés.
Pues mi código es muy similar al de morta71: tengo una tabla maestra: create table FACTURA ( FAC_ID IDENTIFICADOR not null, CLI_ID IDENTIFICADOR not null, FAC_FECHA FECHA, etc, etc, constraint PK_FACTURA primary key (FAC_ID) ); alter table FACTURA add constraint FK_FACTURA_RELATIONS_RECIBO foreign key (REC_ID) references RECIBO (REC_ID); alter table FACTURA add constraint FK_FACTURA_RELATIONS_FORMAPAG foreign key (FPA_ID) references FORMAPAGO (FPA_ID); alter table FACTURA add constraint FK_FACTURA_TIENE_CLIENTE foreign key (CLI_ID) references CLIENTE (CLI_ID); y otra tabla detalle: create table DETALLEFACTURA ( DTF_ID IDENTIFICADOR not null, FAC_ID IDENTIFICADOR not null, DTF_DESCRIPCION CHAR(40), etc, etc, constraint PK_DETALLEFACTURA primary key (DTF_ID) ); alter table DETALLEFACTURA add constraint FK_DETALLEF_DETALLE_FACTURA foreign key (FAC_ID) references FACTURA (FAC_ID); Ambas con identificador autoincremental. En el formulario muestro en dbedits los campos de FACTURA y en un dbgrid los datos de DETALLEFACTURA. En el formulario están los botones Insertar, Buscar, Modificar, Aceptar, Cancelar y Eliminar que en principio actuan sobre la tabla FACTURA amenos que añada algo para la tabla DETALLEFACTURA, y esta última se gestiona automáticamente mediante el dbgrid con su propiedad dgEditing a true.
(tengo bastante más código pero no tiene porque afectar a este asunto, en principio) De esta manera cuando hago clic en insertar e inmediatamente intento insertar una linea en el dbgrid del detalle ma da el error "Field 'CLI_ID' must have a value" Por qué me da el erro lo tengo claro, que lo podria controlar y mostrarle un mensaje que le digera al usuario que tiene que rellenar el campo CLI_ID antes de añadir lineas en el detalle, también lo tengo claro. Pero, no sería más bonito si el formulario en sí se comportara como el que muestra una simple tabla donde el mensaje de control de datos no se muestraria (si fuera preciso) hasta clicar el botón de Aceptar?? Hay alguna posibilidad para lo que quiero? o soy muy pijotero? jejeje me salió un pareado! Un saludo. |
|
#5
|
||||
|
||||
|
Como tu dices, está claro que no puedes añadir líneas de detalle hasta que no exista el correspondiente registro en el maestro. Y ya sabes por qué te dá el error y como lo podrías evitar.
Respecto a como sería mejor hacerlo e indicar sólo el error en el momento de pulsar el botón aceptar ? ... pues cada uno tendrá una manera de programar diferente y cada uno entenderá una mejor forma de hacerlo. Yo expongo dos opiniones : 1. Si tienes el campo CLI_ID con la condición NOT NULL, pues no lo dejes a Null cuando insertes líneas en el detalle. Reemplázalo por ejemplo en el Insert del Master con el valor 0. De esta manera la Base de Datos no te dará error. Al pulsar el botón compruebas si el valor de CLI_ID es 0, y si es así lanzas el mensaje de error. Si le pides al usuario posteriormente introducir un valor de CLI_ID, basta que en la definición de tu tabla DETALLE en la Base de Datos incluyas junto con la Foreign Key una condición de 'On Update Cascade' por ejemplo. 2. No pongas la condición NOT NULL para el campo CLI_ID, y lo que haces en esta ocasión es conprobar precisamente si ese campo está a Null al pulsar el botón Aceptar. Esto en cambio te impide utilizar CLI_ID como clave referencial, que creo haber visto que sí la utilizas como tal clave referencial. Pero podrías utilzar Triggers que te actualizaran las demás tablas al realizar un cambio sobre CLI_ID. Lo dicho, cada programador tendrá una visión diferente de como solucionar un problema identificado, tal y como tu ya lo has identificado. Saludos, ![]()
__________________
Piensa siempre en positivo ! |
|
#6
|
|||
|
|||
|
bueno... me sirve de muchisima ayuda ver diferentes maneras de solventar un problema y al final he optado por mostrar un mensaje al intentar añadir una linea en el detalle advirtiendo que hay que indicar primero un cliente, y para que el usuario no se moleste en buscar el campo que tiene que rellenar, justo al cerrarse el mensaje de aviso le abro el formulario de busqueda de cliente para que lo elija y ale.. a correr. jejeje no és lo que queria en un principio pero ha quedado apañao.
de las 2 opciones que me das: 1- me obliga a tener un registro en la tabla cliente con todos los campos vacios y el id = 0, para que no me de un "violation key" y no me gusta. 2-no se corresponde a mi planteamiento inicial. ...como bien dices, sobre gustos no hay nada escrito Muchas grácias, otra vez, gluglu por tu atención. Saludos. |
![]() |
|
|
Temas Similares
|
||||
| Tema | Autor | Foro | Respuestas | Último mensaje |
| Dá error "Master has detail records" cuando no debería darlo! | JuanBCT | Tablas planas | 3 | 06-08-2005 03:48:37 |
| DBLookupComboBoxs Master/Detail o Detail/Master | yusnerqui | OOP | 5 | 29-07-2005 18:40:20 |
| master/detail, imprimiendo master en cada hoja | acalderonr | Impresión | 4 | 29-11-2003 14:46:07 |
| interbase:¿como crear un master-detail-detail? | ElSanto24 | Firebird e Interbase | 2 | 22-10-2003 10:24:45 |
| Master/Detail/Detail/Detail/etc... | hgiacobone | Tablas planas | 2 | 24-07-2003 17:20:31 |
|