Amigos tengo el siguiente sencillo código:
delphi
procedure TOrdenTrabajoP.SavePiezas(const ADetalles: TList<TPiezasUsedRec>; AIndex: Integer; ADataSet: TFDQuery; aVme, ATypeSave: Integer); var i,p: Integer; aList: TList<TPiezasUsedRec>; begin if ADetalles.Count > 0 then begin aList := TList<TPiezasUsedRec>.Create; try case ATypeSave of //Guardamos los Insumos de preventivos recientes //Cuando sólo se guarda la orden 0: begin for i := 0 to ADetalles.Count -1 do begin if (ADetalles.Items[i].PTipo = 0) and (ADetalles.Items[i].PStatus = 1) then aList.Add(ADetalles.Items[i]) end; end; //Guardamos sólo los insumos nuevos y los de almacén //Cuando finalizamos la orden 1: begin for i := 0 to ADetalles.Count -1 do begin if (ADetalles.Items[i].PTipo = 1) and (ADetalles.Items[i].PStatus = 0) then aList.Add(ADetalles.Items[i]) else if (ADetalles.Items[i].PTipo = 0) and (ADetalles.Items[i].PStatus = 1) then aList.Add(ADetalles.Items[i]); end; end; end; if aList.Count > 0 then begin //Cargamos los parámetros para guardarlos for p := 0 to aList.Count -1 do begin ADataSet.Close; ADataSet.ParamByName('id').AsInteger := AIndex; ADataSet.ParamByName('nom').Value := aList.Items[p].PInsumo; ADataSet.ParamByName('ref').Value := aList.Items[p].PReferencia; ADataSet.ParamByName('und').AsInteger := aList.Items[p].PUnidadID; ADataSet.ParamByName('cant').AsExtended := aList.Items[p].PDespachada; ADataSet.ParamByName('fecha').AsDate := aList.Items[p].PFecha; ADataSet.ParamByName('vence').AsDate := 0; ADataSet.ParamByName('isid').AsInteger := aList.Items[p].PInsumoID; ADataSet.ParamByName('costo').AsCurrency := aList.Items[p].PCosto; ADataSet.ParamByName('renglon').AsInteger := 2; ADataSet.ParamByName('vme').AsInteger := aVme; ADataSet.ParamByName('almacen').AsInteger := aList.Items[p].PAlmacen; ADataSet.ParamByName('cat').AsInteger := aList.Items[p].PCategoria; try ADataSet.ExecSQL; except Datos.dbDatos.Rollback; raise Exception.Create('¡Ocurrió un problema al intentar guardar los insumos al finalizar la orden!'); break; end; end; end; finally aList.Free; end; end; end;
He verificado el Parámetro ADetalles y no están duplicados, verificado la lista aLIst antes de guardar y tampoco se duplican, y aún así termina duplicandome los datos, 4 (ó 6 ó 8, etc.) ojos ven más que dos, también me pueden sugerir otra manera de hacerlo-
Saludos.