Ir al contenido


Foto

Ciclo guarda los datos duplicados


  • Por favor identifícate para responder
2 respuestas en este tema

#1 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 11 julio 2018 - 02:14

Amigos tengo el siguiente sencillo código:


delphi
  1. procedure TOrdenTrabajoP.SavePiezas(const ADetalles: TList<TPiezasUsedRec>; AIndex: Integer; ADataSet: TFDQuery; aVme, ATypeSave: Integer);
  2. var i,p: Integer;
  3. aList: TList<TPiezasUsedRec>;
  4. begin
  5.  
  6. if ADetalles.Count > 0 then begin
  7.  
  8. aList := TList<TPiezasUsedRec>.Create;
  9.  
  10. try
  11. case ATypeSave of
  12. //Guardamos los Insumos de preventivos recientes
  13. //Cuando sólo se guarda la orden
  14. 0: begin
  15. for i := 0 to ADetalles.Count -1 do begin
  16. if (ADetalles.Items[i].PTipo = 0) and (ADetalles.Items[i].PStatus = 1) then
  17. aList.Add(ADetalles.Items[i])
  18. end;
  19. end;
  20.  
  21. //Guardamos sólo los insumos nuevos y los de almacén
  22. //Cuando finalizamos la orden
  23. 1: begin
  24. for i := 0 to ADetalles.Count -1 do begin
  25. if (ADetalles.Items[i].PTipo = 1) and (ADetalles.Items[i].PStatus = 0) then
  26. aList.Add(ADetalles.Items[i])
  27. else if (ADetalles.Items[i].PTipo = 0) and (ADetalles.Items[i].PStatus = 1) then
  28. aList.Add(ADetalles.Items[i]);
  29. end;
  30. end;
  31. end;
  32.  
  33. if aList.Count > 0 then begin
  34.  
  35. //Cargamos los parámetros para guardarlos
  36. for p := 0 to aList.Count -1 do begin
  37. ADataSet.Close;
  38. ADataSet.ParamByName('id').AsInteger := AIndex;
  39. ADataSet.ParamByName('nom').Value := aList.Items[p].PInsumo;
  40. ADataSet.ParamByName('ref').Value := aList.Items[p].PReferencia;
  41. ADataSet.ParamByName('und').AsInteger := aList.Items[p].PUnidadID;
  42. ADataSet.ParamByName('cant').AsExtended := aList.Items[p].PDespachada;
  43. ADataSet.ParamByName('fecha').AsDate := aList.Items[p].PFecha;
  44. ADataSet.ParamByName('vence').AsDate := 0;
  45. ADataSet.ParamByName('isid').AsInteger := aList.Items[p].PInsumoID;
  46. ADataSet.ParamByName('costo').AsCurrency := aList.Items[p].PCosto;
  47. ADataSet.ParamByName('renglon').AsInteger := 2;
  48. ADataSet.ParamByName('vme').AsInteger := aVme;
  49. ADataSet.ParamByName('almacen').AsInteger := aList.Items[p].PAlmacen;
  50. ADataSet.ParamByName('cat').AsInteger := aList.Items[p].PCategoria;
  51. try
  52. ADataSet.ExecSQL;
  53. except
  54. Datos.dbDatos.Rollback;
  55. raise Exception.Create('¡Ocurrió un problema al intentar guardar los insumos al finalizar la orden!');
  56. break;
  57. end;
  58. end;
  59. end;
  60.  
  61. finally
  62. aList.Free;
  63. end;
  64.  
  65. end;
  66. 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.


  • 0

#2 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 11 julio 2018 - 06:04

Hice un cambio utilizando TFDScript en vez de TFDQuery lo cual no tuve inconvenientes en local, mañana haré las pruebas en producción:


delphi
  1. if aList.Count > 0 then begin
  2.  
  3. With ADataSet do begin
  4. SQLScripts.Clear;
  5. SQLScripts.Add;
  6. with SQLScripts[0].SQL do begin
  7. for p := 0 to aList.Count -1 do begin
  8. Add('insert into ot_preventivo_detalle(ot_id,ot_insumo,ot_despachada,ot_coste,ot_renglon,is_id,ot_medida,ot_referencia, ' +
  9. 'ot_garante_vence,ot_insumo_cat,ot_fecha,ot_vme_id,ins_almacen) ' +
  10. 'values(' + AIndex.ToString + ', ' +
  11. QuotedStr(aList.Items[p].PInsumo) + ',' +
  12. FloatToStr(aList.Items[p].PDespachada) + ',' +
  13. FloatToStr(aList.Items[p].PCosto) + ',' +
  14. '2,' +
  15. aList.Items[p].PInsumoID.toString + ',' +
  16. aList.Items[p].PUnidadID.ToString + ',' +
  17. QuotedStr(aList.Items[p].PReferencia) + ',' +
  18. QuotedStr(FormatDateTime('dd.MM.yyyy',0)) + ',' +
  19. aList.Items[p].PCategoria.ToString + ',' +
  20. QuotedStr(FormatDateTime('dd.MM.yyyy',aList.Items[p].PFecha)) + ',' +
  21. aVme.ToString + ',' +
  22. aList.Items[p].PAlmacen.ToString + ');');
  23.  
  24. end;
  25. end;
  26.  
  27. ValidateAll;
  28. ExecuteAll;
  29.  
  30. end;
  31.  
  32. end;


  • 0

#3 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.446 mensajes
  • LocationMéxico

Escrito 12 julio 2018 - 07:30

Ah vaya, pues que bien.  (y)

 

Saludos


  • 0




IP.Board spam blocked by CleanTalk.