![]() |
Firebird, IBDatasets y Relacion Maestro/Detalle
Buenas tardes a todos, estoy experimentando con firebird, IBX y una aplicacion maestro detalle en delphi 6, tengo dos IBDatasets uno el maestro y otro el detalle, en el insertsql del detalle tengo:
insert into FACTURAS_DATOS (FACTURA_ID, PARTIDA, CANTIDAD, DESCRIPCION, PRECIO) values (:FACTURA_ID, :PARTIDA, :CANTIDAD, :DESCRIPCION, :PRECIO) El valor de FACTURA_ID lo deberia de tomar automaticamente (bueno en ADO asi lo hace) pero si no agrego la siguiente linea en el IBDataset2AfterInsert (el detalle) IBDataset2.FieldByName('FACTURA_ID').AsString := IBDataset1.FieldByName('FACTURA_ID').AsString; La insersion no se realiza y me dice que FACTURA_ID no puede ser nulo, mi pregunta es: Hay que poner el codigo que refiere el IBDataset1 al IBDataset2 en el IBDataset2AfterInsert o algo estoy haciendo mal y esta liena es la que esta haciendo "manualmente" este link, tengo esta duda ya que tambien he estado experimentando con dbexpress y ado y en estas no tengo que poner nada en el afterinsert, automaticamente el valor es asignado a la relacioin maestro detalle si configuro el mastersource, etc. Ayuda profavor De antemano muchas gracias Alejandro Jourdan |
Hola todos:
Resulta que los IBDataSet no tienen la propiedad MasterSource pero tienen la propiedad DataSource. Basandome en eso prueba esto: IbdatasetFactura ----> DataSourceFactura IbdatasetDetalles ----> DataSourceDetalles A la propiedad DataSource de IbDataSetDetalles le asignas DataSourceFactura. en el SelectSQL de IbdatesetFactura: select id_factura //o mas campos from tbl_factura El insertSQL de IbdatasetDetalles tal cual como lo tienes, ahora solo debes tener en cuenta que el nombre del parametro en el detalle (id_factura) debe tener el mismo nombre del campo maestro (id_factura). Espero esto te pueda servir de algo Suerte |
Muchas gracias por tu respuesta, ya verifique y tengo todo como me mencionas, pero si no pongo el codigo en el IBDataset2AfterInsert (el detalle)
IBDataset2.FieldByName('FACTURA_ID').AsString := IBDataset1.FieldByName('FACTURA_ID').AsString; no se genera el valor de factura_id en el detalle y de ahi no paso. Deberia traer automaticamente el valor de factura_id de la tabla maestra, correcto?? Gracias nuevamente |
Despues de mucho batallar ya encontre la
solucion, en el foro de borland (borland.public.delphi.database.interbaseexpress) me ayudo jeff overcash que tengo entendido que es el que escribio esos componentes o el que los esta actualizando, no fue nada facil ya que esto lo deberia hacer en automatico pero segun me dice el que ya no es asi, ahora hay que prenderlo, este es un pedazo del readme de los ibx: 19. Added support to copy the master value down to the detail field on a new record. The GeneratorField will fire first before the copy is made. Also there is a new global variable, CopyMasterFieldToDetail, which MUST be true for this to work. It defaults to false. The copy logic is simple, if the master field name matches the detail param name and also matches a detail field name it will be copied down. Entonces para que agarre el valor el ibdtaset detalle del maestro hay que agregar a uses lo siguiente: IButils y en cualquier parte del programa asignar la siguiente variable como verdadera: CopyMasterFieldToDetail := true; antes de que vaya a usar los ibdatasets. El foro de noticias de borland es muy bueno porque ahi te ayudan los que hacen estas cosas lo malo es que dan la informacion a cuenta gotas y ellos piensan que los que preguntan ahi son expertos en delphi y la verdad yo estoy empezando, si que batalle con esto!!! Es extraño que algo que uno considera por default correcto no lo sea y haya que hacer estos pasos para que funcione pero por fin lo logre. Espero mi experiencia ayude a alguien mas. Saludos y gracias Alejandro Jourdan |
La franja horaria es GMT +2. Ahora son las 06:46:43. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi