Ver Mensaje Individual
  #13  
Antiguo 11-04-2007
niñotaliban niñotaliban is offline
Miembro
 
Registrado: nov 2005
Posts: 13
Reputación: 0
niñotaliban Va por buen camino
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.
Código Delphi [-]
//al clickar en Insert:
IbDataPrincipal.Insert;     //en IbDataPrincipal está cargada la tabla FACTURA
 
//al clickar en Aceptar:
if IbDataPrincipal.State in dsEditModes then IbDataPrincipal.Post;
if IBDataDetalleFactura.State in [dsEdit, dsInsert] then IBDataDetalleFactura.Post;
IBTrans.CommitRetaining;
 
//al clicar en Cancelar:
IbDataPrincipal.Cancel;
IBTrans.RollbackRetaining;
 
//en onnewrecord del dataset de DETALLEFACTURA:
if IbDataPrincipal.State = dsinsert then IbDataPrincipal.Post;
IBDataDetalleFactura.Edit;
IBDataDetalleFacturaFAC_ID.Value:= IbDataPrincipalFAC_ID.Value;

(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.
Responder Con Cita