Tengo un problema con una aplicación que estoy haciendo sobre una tienda con Form Builder. Yo tengo un formulario con dos bloque Pedido y linea de Pedido, el bloque lineadepedido lo he representado de froma tabular con varios registros. ¿El problema es que al insertar varios registros de linea solo me inserta en la tabal el ultimo como puedo insertarlos todos? ¿?
Primero que nada aclarame si el bloque detalle que es donde quieres hacer la inserción de varios registros es un bloque asociado a una tabla o no, si no es de una tabla dime como es que insertas, si es de una tabla no deberías de tener problemas
El bloque detalle es linea de pedido y el maestro pedido. Y si es en el bloque detalle donde quiero hacer la inserción de varios registros. Estos dos bloques no están asociados a ninguna tabla. El código que utilizo para insertar es: Declare prov number; nped number; -- FIN number; BEGIN --Comprobamos que se ha indicado el numero de pedido if nvl(length(:pedidonuevo.pedido#),0)=0 then bell; message(' Error indique el numero de pedido '); raise form_trigger_failure; end if; -- Comprobamos que que se ha indicado el proveedor y dicho proveedor existe if nvl(length(:pedidonuevo.proveedor),0)=0 then bell; message(' Error indique el codigo del proveedor '); raise form_trigger_failure; end if; select prov# into prov from Proveedor where Proveedor.prov#=:Pedidonuevo.Proveedor; --Al seguir sabemos q si existe el proveedor --Comprobamos que se ha indicado la linea de pedido if nvl(length(:lineadepedidonuevo.linea),0)=0 then bell; message(' Error indique el numero de linea de pedido '); raise form_trigger_failure; end if; --Comprobamos que el codigo del producto if nvl(length(:lineadepedidonuevo.producto),0)=0 then bell; message(' Error indique el codigo del producto '); raise form_trigger_failure; end if; --Comprobamos que el nombre del producto if nvl(length(:lineadepedidonuevo.nom_producto),0)=0 then bell; message(' Error indique el nombre del producto '); raise form_trigger_failure; end if; --Comprobamos que se ha indicado la cantidad if nvl(length(:lineadepedidonuevo.cantidad),0)=0 then bell; message(' Error indique la cantidad '); raise form_trigger_failure; end if; --Comprobamos que la cantidad es mayor que 0 if :lineadepedidonuevo.cantidad<=0 then bell; message(' Error la cantidad tiene que ser mayor que 0 '); raise form_trigger_failure; end if; --Si todo ha ido bien hacemos los insert correspondientes insert into Pedido values(:Pedidonuevo.pedido#,:Pedidonuevo.proveedor, :Pedidonuevo.fecha, :Pedidonuevo.Empleado); insert into LineadePedido values(:LineadePedidonuevo.linea,:Pedidonuevo.pedido#,:LineadePedidonuevo.producto, :LineadePedidonuevo.nom_producto,:LineadePedidonuevo.cantidad); --last_record; --end loop; bell; message(' Pedido nuevo grabado '); commit; EXCEPTION WHEN NO_DATA_FOUND THEN bell; message(' Error DATOS NO EXISTENTES '); WHEN DUP_VAL_ON_INDEX THEN BELL; MESSAGE('ERROR NO SE PUEDE GRABAR CLAVE DUPLICADA '); END; Gracias
Espero aun te sirva ... Mira cuando accedes a los valores de los items (:block. Item) Forms toma el valor del registro en el que estas posicinado es por esto que te guarda solamente el ultimo. Haz una prueba antes de guardar regresate al registro anterior y guarda y veras como no guarda el ultimo sino el anterior. Ahora para resolver tu bronca lo que debes hacer es un pequeño ciclo más o menos así, este ciclo debe ir después de insertar el registro maestro: Begin first_record; -- obvio para irnos al primero registro loop -- comeinza el ciclo exit when :block.item1 is null -- esto para saber si es el ultimo puede ser otra condicion depende de como lo manejes -- aqui deberia de ir todas las validaciones q tienes de los registro detalle insert into tabla values (:block.item1, :block.item2 ...) -- insertamos en la tabla netx_record; -- pasamos al siguiente registro end loop; End; Más o menos así.