Ir al contenido


Foto

importar registros con excel a delphi

delphi excel

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

#1 the walrus

the walrus

    Advanced Member

  • Miembros
  • PipPipPip
  • 60 mensajes

Escrito 16 julio 2018 - 11:42

hola gente necesito hacer una importación de datos en una planilla excel desde un botón o con componentes desde ya gracias


  • 0

#2 Agustin Ortu

Agustin Ortu

    Advanced Member

  • Moderadores
  • PipPipPip
  • 831 mensajes
  • LocationArgentina

Escrito 16 julio 2018 - 08:45

Hay muchas formas de leer excel desde Delphi, desde cosas "artesanales", hasta componentes de terceros, de los cuales hay gratuitos y pagos

 

Una forma sencilla de hacerlo es acceder usando ADO. Yo me he creado una pequeña clase que me ayuda a trabajar con este enfoque. Basicamente te permite usar un archivo excel como si fuera un DataSet. Podes estudiar el codigo acá

 

Es cierto que para usar mi solucion hay que tener en cuenta algunas dependencias (como por ejemplo, el Spring4D Framework). Sino, podes estudiar el codigo fuente para ver como obtener los datos con ADO (que tambien es muy sencillo). En realidad esta solucion es algo mas complicada para alguna necesidad que tuve en algun momento


  • 0

#3 santiago14

santiago14

    Advanced Member

  • Miembros
  • PipPipPip
  • 334 mensajes
  • LocationCerrillos - Salta - Argentina

Escrito 17 julio 2018 - 06:27

Bueno. Te pongo una parte de un código que uso para ello. No depende de ningún componente de terceros. Por supuesto, está sujeto a todo tipo de modificaciones y comentarios.


delphi
  1. procedure TfrmPrincipal.btnbuscarClick(Sender: TObject);
  2. var
  3. archivo:string;
  4. begin
  5. if dlgAbrir.Execute then
  6. begin
  7. archivo:=dlgAbrir.FileName;
  8. txtArchivo.Text:=archivo;
  9. end;
  10. end;
  11.  
  12. procedure TfrmPrincipal.btndatosgrillaClick(Sender: TObject);
  13. var
  14. excel, hoja:Variant;
  15. i:integer;
  16. PrimeraFila, UltimaFila, CantidadFilas, FilaExcel:Integer;
  17. begin
  18. if campoCompleto(txtPrimeraFila.Text) and campoCompleto(txtUltimaFila.Text) then
  19. begin
  20. grdNumeros.ClearRows;
  21. try
  22. excel:=CreateOleObject('excel.application');
  23. excel.workbooks.open(txtArchivo.Text);
  24. hoja:=excel.Worksheets[StrToInt(txtNroHojaExcel.Text)];
  25. PrimeraFila:=StrToInt(txtPrimeraFila.Text);
  26. UltimaFila:=StrToInt(txtUltimaFila.Text);
  27. //grdNumeros.AddRow(UltimaFila - PrimeraFila + 1);
  28. CantidadFilas:=UltimaFila - PrimeraFila + 1;
  29. grdNumeros.RowCount:=CantidadFilas;
  30. gNumeros.MaxValue:=CantidadFilas;
  31. gNumeros.Progress:=0;
  32. with grdNumeros do
  33. begin
  34. BeginUpdate;
  35. for i:=0 to (CantidadFilas - 1) do
  36. begin
  37. FilaExcel:=PrimeraFila + i;
  38. CellByName['clNroCarton', i].AsInteger:=hoja.cells[FilaExcel, 1];
  39. CellByName['clCombinacion', i].AsInteger:=hoja.cells[FilaExcel, 2];
  40. //Los Números
  41. CellByName['clNro1', i].AsInteger:=hoja.cells[FilaExcel, 3];
  42. CellByName['clNro2', i].AsInteger:=hoja.cells[FilaExcel, 4];
  43. CellByName['clNro3', i].AsInteger:=hoja.cells[FilaExcel, 5];
  44. CellByName['clNro4', i].AsInteger:=hoja.cells[FilaExcel, 6];
  45. CellByName['clNro5', i].AsInteger:=hoja.cells[FilaExcel, 7];
  46. CellByName['clNro6', i].AsInteger:=hoja.cells[FilaExcel, 8];
  47. CellByName['clNro7', i].AsInteger:=hoja.cells[FilaExcel, 9];
  48. CellByName['clNro8', i].AsInteger:=hoja.cells[FilaExcel, 10];
  49. CellByName['clNro9', i].AsInteger:=hoja.cells[FilaExcel, 11];
  50. CellByName['clNro10', i].AsInteger:=hoja.cells[FilaExcel, 12];
  51. Application.ProcessMessages;
  52. gNumeros.Progress:=i + 1;
  53. //Application.ProcessMessages;
  54. end;
  55. //Eliminamos la Hoja de Excel en cuestión
  56. excel.quit;
  57. EndUpdate;
  58. CalculateFooter();
  59. end;
  60. Application.MessageBox('Cartones cargados con éxito.',
  61. PWideChar(lblTitulo.Caption), MB_OK + MB_ICONINFORMATION);
  62. except
  63. on e:Exception do
  64. begin
  65. excel.quit;
  66. mErrores(e, 'Imposible cargar Cartones', lblTitulo.Caption);
  67. end;
  68. end
  69. end
  70. else
  71. begin
  72. Application.MessageBox('Debe poner la primera y última fila',
  73. PWideChar(lbltitulo.caption), mb_ok + mb_iconerror);
  74. txtPrimeraFila.SetFocus;
  75. end;
  76. end;

Esto usa la Grilla NextGrid, pero puede reemplazarse fácilmente por la tradicional StringGrid. En la ventana tengo un componente grilla, dos botones (uno para traer la planilla y otro para la carga de la grilla), un Progress para ver el procentaje, unas cajitas de texto para la primera y última fila de Excel que quiero leer  y creo que nada mas.

Espero sirva.


Editado por santiago14, 17 julio 2018 - 06:30 .

  • 0

#4 the walrus

the walrus

    Advanced Member

  • Miembros
  • PipPipPip
  • 60 mensajes

Escrito 17 julio 2018 - 02:01

Hay muchas formas de leer excel desde Delphi, desde cosas "artesanales", hasta componentes de terceros, de los cuales hay gratuitos y pagos

 

Una forma sencilla de hacerlo es acceder usando ADO. Yo me he creado una pequeña clase que me ayuda a trabajar con este enfoque. Basicamente te permite usar un archivo excel como si fuera un DataSet. Podes estudiar el codigo acá

 

Es cierto que para usar mi solucion hay que tener en cuenta algunas dependencias (como por ejemplo, el Spring4D Framework). Sino, podes estudiar el codigo fuente para ver como obtener los datos con ADO (que tambien es muy sencillo). En realidad esta solucion es algo mas complicada para alguna necesidad que tuve en algun momento

hola, gracias por responder que componentes gratuitos conoces que me puedas recomendar o en caso que tengas uno me lo puedas pasar 

saludos


  • 0

#5 the walrus

the walrus

    Advanced Member

  • Miembros
  • PipPipPip
  • 60 mensajes

Escrito 17 julio 2018 - 02:03

Bueno. Te pongo una parte de un código que uso para ello. No depende de ningún componente de terceros. Por supuesto, está sujeto a todo tipo de modificaciones y comentarios.


delphi
  1. procedure TfrmPrincipal.btnbuscarClick(Sender: TObject);
  2. var
  3. archivo:string;
  4. begin
  5. if dlgAbrir.Execute then
  6. begin
  7. archivo:=dlgAbrir.FileName;
  8. txtArchivo.Text:=archivo;
  9. end;
  10. end;
  11.  
  12. procedure TfrmPrincipal.btndatosgrillaClick(Sender: TObject);
  13. var
  14. excel, hoja:Variant;
  15. i:integer;
  16. PrimeraFila, UltimaFila, CantidadFilas, FilaExcel:Integer;
  17. begin
  18. if campoCompleto(txtPrimeraFila.Text) and campoCompleto(txtUltimaFila.Text) then
  19. begin
  20. grdNumeros.ClearRows;
  21. try
  22. excel:=CreateOleObject('excel.application');
  23. excel.workbooks.open(txtArchivo.Text);
  24. hoja:=excel.Worksheets[StrToInt(txtNroHojaExcel.Text)];
  25. PrimeraFila:=StrToInt(txtPrimeraFila.Text);
  26. UltimaFila:=StrToInt(txtUltimaFila.Text);
  27. //grdNumeros.AddRow(UltimaFila - PrimeraFila + 1);
  28. CantidadFilas:=UltimaFila - PrimeraFila + 1;
  29. grdNumeros.RowCount:=CantidadFilas;
  30. gNumeros.MaxValue:=CantidadFilas;
  31. gNumeros.Progress:=0;
  32. with grdNumeros do
  33. begin
  34. BeginUpdate;
  35. for i:=0 to (CantidadFilas - 1) do
  36. begin
  37. FilaExcel:=PrimeraFila + i;
  38. CellByName['clNroCarton', i].AsInteger:=hoja.cells[FilaExcel, 1];
  39. CellByName['clCombinacion', i].AsInteger:=hoja.cells[FilaExcel, 2];
  40. //Los Números
  41. CellByName['clNro1', i].AsInteger:=hoja.cells[FilaExcel, 3];
  42. CellByName['clNro2', i].AsInteger:=hoja.cells[FilaExcel, 4];
  43. CellByName['clNro3', i].AsInteger:=hoja.cells[FilaExcel, 5];
  44. CellByName['clNro4', i].AsInteger:=hoja.cells[FilaExcel, 6];
  45. CellByName['clNro5', i].AsInteger:=hoja.cells[FilaExcel, 7];
  46. CellByName['clNro6', i].AsInteger:=hoja.cells[FilaExcel, 8];
  47. CellByName['clNro7', i].AsInteger:=hoja.cells[FilaExcel, 9];
  48. CellByName['clNro8', i].AsInteger:=hoja.cells[FilaExcel, 10];
  49. CellByName['clNro9', i].AsInteger:=hoja.cells[FilaExcel, 11];
  50. CellByName['clNro10', i].AsInteger:=hoja.cells[FilaExcel, 12];
  51. Application.ProcessMessages;
  52. gNumeros.Progress:=i + 1;
  53. //Application.ProcessMessages;
  54. end;
  55. //Eliminamos la Hoja de Excel en cuestión
  56. excel.quit;
  57. EndUpdate;
  58. CalculateFooter();
  59. end;
  60. Application.MessageBox('Cartones cargados con éxito.',
  61. PWideChar(lblTitulo.Caption), MB_OK + MB_ICONINFORMATION);
  62. except
  63. on e:Exception do
  64. begin
  65. excel.quit;
  66. mErrores(e, 'Imposible cargar Cartones', lblTitulo.Caption);
  67. end;
  68. end
  69. end
  70. else
  71. begin
  72. Application.MessageBox('Debe poner la primera y última fila',
  73. PWideChar(lbltitulo.caption), mb_ok + mb_iconerror);
  74. txtPrimeraFila.SetFocus;
  75. end;
  76. end;

Esto usa la Grilla NextGrid, pero puede reemplazarse fácilmente por la tradicional StringGrid. En la ventana tengo un componente grilla, dos botones (uno para traer la planilla y otro para la carga de la grilla), un Progress para ver el procentaje, unas cajitas de texto para la primera y última fila de Excel que quiero leer  y creo que nada mas.

Espero sirva.

hola, gracias por responder en mi caso estoy trabajando con un dbgrid ya que requiero pasar ciertos campos a otro formulario 

saludos


  • 0

#6 the walrus

the walrus

    Advanced Member

  • Miembros
  • PipPipPip
  • 60 mensajes

Escrito 10 agosto 2018 - 04:57

Bueno. Te pongo una parte de un código que uso para ello. No depende de ningún componente de terceros. Por supuesto, está sujeto a todo tipo de modificaciones y comentarios.


delphi
  1. procedure TfrmPrincipal.btnbuscarClick(Sender: TObject);
  2. var
  3. archivo:string;
  4. begin
  5. if dlgAbrir.Execute then
  6. begin
  7. archivo:=dlgAbrir.FileName;
  8. txtArchivo.Text:=archivo;
  9. end;
  10. end;
  11.  
  12. procedure TfrmPrincipal.btndatosgrillaClick(Sender: TObject);
  13. var
  14. excel, hoja:Variant;
  15. i:integer;
  16. PrimeraFila, UltimaFila, CantidadFilas, FilaExcel:Integer;
  17. begin
  18. if campoCompleto(txtPrimeraFila.Text) and campoCompleto(txtUltimaFila.Text) then
  19. begin
  20. grdNumeros.ClearRows;
  21. try
  22. excel:=CreateOleObject('excel.application');
  23. excel.workbooks.open(txtArchivo.Text);
  24. hoja:=excel.Worksheets[StrToInt(txtNroHojaExcel.Text)];
  25. PrimeraFila:=StrToInt(txtPrimeraFila.Text);
  26. UltimaFila:=StrToInt(txtUltimaFila.Text);
  27. //grdNumeros.AddRow(UltimaFila - PrimeraFila + 1);
  28. CantidadFilas:=UltimaFila - PrimeraFila + 1;
  29. grdNumeros.RowCount:=CantidadFilas;
  30. gNumeros.MaxValue:=CantidadFilas;
  31. gNumeros.Progress:=0;
  32. with grdNumeros do
  33. begin
  34. BeginUpdate;
  35. for i:=0 to (CantidadFilas - 1) do
  36. begin
  37. FilaExcel:=PrimeraFila + i;
  38. CellByName['clNroCarton', i].AsInteger:=hoja.cells[FilaExcel, 1];
  39. CellByName['clCombinacion', i].AsInteger:=hoja.cells[FilaExcel, 2];
  40. //Los Números
  41. CellByName['clNro1', i].AsInteger:=hoja.cells[FilaExcel, 3];
  42. CellByName['clNro2', i].AsInteger:=hoja.cells[FilaExcel, 4];
  43. CellByName['clNro3', i].AsInteger:=hoja.cells[FilaExcel, 5];
  44. CellByName['clNro4', i].AsInteger:=hoja.cells[FilaExcel, 6];
  45. CellByName['clNro5', i].AsInteger:=hoja.cells[FilaExcel, 7];
  46. CellByName['clNro6', i].AsInteger:=hoja.cells[FilaExcel, 8];
  47. CellByName['clNro7', i].AsInteger:=hoja.cells[FilaExcel, 9];
  48. CellByName['clNro8', i].AsInteger:=hoja.cells[FilaExcel, 10];
  49. CellByName['clNro9', i].AsInteger:=hoja.cells[FilaExcel, 11];
  50. CellByName['clNro10', i].AsInteger:=hoja.cells[FilaExcel, 12];
  51. Application.ProcessMessages;
  52. gNumeros.Progress:=i + 1;
  53. //Application.ProcessMessages;
  54. end;
  55. //Eliminamos la Hoja de Excel en cuestión
  56. excel.quit;
  57. EndUpdate;
  58. CalculateFooter();
  59. end;
  60. Application.MessageBox('Cartones cargados con éxito.',
  61. PWideChar(lblTitulo.Caption), MB_OK + MB_ICONINFORMATION);
  62. except
  63. on e:Exception do
  64. begin
  65. excel.quit;
  66. mErrores(e, 'Imposible cargar Cartones', lblTitulo.Caption);
  67. end;
  68. end
  69. end
  70. else
  71. begin
  72. Application.MessageBox('Debe poner la primera y última fila',
  73. PWideChar(lbltitulo.caption), mb_ok + mb_iconerror);
  74. txtPrimeraFila.SetFocus;
  75. end;
  76. end;

Esto usa la Grilla NextGrid, pero puede reemplazarse fácilmente por la tradicional StringGrid. En la ventana tengo un componente grilla, dos botones (uno para traer la planilla y otro para la carga de la grilla), un Progress para ver el procentaje, unas cajitas de texto para la primera y última fila de Excel que quiero leer  y creo que nada mas.

Espero sirva.

hola Santiago opte por tu opción, quería hacerte una consulta  el lblTitulo y dlgAbrir a que hace referencia en la parte del diseño

saludos


  • 0

#7 santiago14

santiago14

    Advanced Member

  • Miembros
  • PipPipPip
  • 334 mensajes
  • LocationCerrillos - Salta - Argentina

Escrito 13 agosto 2018 - 08:14

hola Santiago opte por tu opción, quería hacerte una consulta  el lblTitulo y dlgAbrir a que hace referencia en la parte del diseño

saludos

 

Hola. La cosa es sencilla.

lblTitulo es un Label, que está en el formulario y dice algo así como: "Exportación desde Excel". Solamente cartelería.

dlgAbrir es el componente TOpenDialog, para poder buscar el archivo Excel en la computadora.


  • 0

#8 the walrus

the walrus

    Advanced Member

  • Miembros
  • PipPipPip
  • 60 mensajes

Escrito 14 agosto 2018 - 07:06

Hola. La cosa es sencilla.

lblTitulo es un Label, que está en el formulario y dice algo así como: "Exportación desde Excel". Solamente cartelería.

dlgAbrir es el componente TOpenDialog, para poder buscar el archivo Excel en la computadora.

tengo otra duda a que hace referencia " campo completo " , el " grdNumeros" hace referencia a la grilla no?  y el "gNumeros " al Progress ?


  • 0

#9 santiago14

santiago14

    Advanced Member

  • Miembros
  • PipPipPip
  • 334 mensajes
  • LocationCerrillos - Salta - Argentina

Escrito 15 agosto 2018 - 05:34

tengo otra duda a que hace referencia " campo completo " , el " grdNumeros" hace referencia a la grilla no?  y el "gNumeros " al Progress ?


delphi
  1. function campoCompleto(codigo:string):boolean; overload;
  2. begin
  3. result := not (Trim(codigo) = '');
  4. // if (trim(codigo) = '') then
  5. // result:=false //algun campo está incompleto
  6. // else
  7. // result:=true; //todos los campos están completos
  8. end;

grdNumeros es la NextGrid

gNumeros es un ProgressBar


  • 0

#10 the walrus

the walrus

    Advanced Member

  • Miembros
  • PipPipPip
  • 60 mensajes

Escrito 15 agosto 2018 - 06:09


delphi
  1. function campoCompleto(codigo:string):boolean; overload;
  2. begin
  3. result := not (Trim(codigo) = '');
  4. // if (trim(codigo) = '') then
  5. // result:=false //algun campo está incompleto
  6. // else
  7. // result:=true; //todos los campos están completos
  8. end;

grdNumeros es la NextGrid

gNumeros es un ProgressBar

 

otra pregunta  es con el "txtNroHojaExcel.Text "  y con respecto a la importación solo es una lectura del archivo o hace la lectura y la información del archivo la guarda en la base de datos ?gracias saludos


  • 0

#11 santiago14

santiago14

    Advanced Member

  • Miembros
  • PipPipPip
  • 334 mensajes
  • LocationCerrillos - Salta - Argentina

Escrito 16 agosto 2018 - 06:02

otra pregunta  es con el "txtNroHojaExcel.Text "  y con respecto a la importación solo es una lectura del archivo o hace la lectura y la información del archivo la guarda en la base de datos ?gracias saludos

txtNroHojaExcel.Text es simplemente una caja de texto donde se indica la Hoja de Excel de la que se quiere leer. Creo que la primera es la 0 (cero), la segunda la 1 (uno), y así... Con esto, puedo leer de cualquier hoja que tenga el Libro.

 

En este caso, solamente es una lectura del archivo y la pone en la grilla. No hay inserción de estos datos a una BBDD. 


  • 0

#12 the walrus

the walrus

    Advanced Member

  • Miembros
  • PipPipPip
  • 60 mensajes

Escrito 16 agosto 2018 - 02:55

txtNroHojaExcel.Text es simplemente una caja de texto donde se indica la Hoja de Excel de la que se quiere leer. Creo que la primera es la 0 (cero), la segunda la 1 (uno), y así... Con esto, puedo leer de cualquier hoja que tenga el Libro.

 

En este caso, solamente es una lectura del archivo y la pone en la grilla. No hay inserción de estos datos a una BBDD. 

mi intención es que esos datos se guarden en la base de datos,como podría guardar el excel existen componentes para guardar información gracias saludos     


  • 0

#13 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 16 agosto 2018 - 03:57

mi intención es que esos datos se guarden en la base de datos,como podría guardar el excel existen componentes para guardar información gracias saludos     

 

Se puede.

Y dependerá de los componentes/suite que utilices para la conexión y acceso a la base de datos. El motor que utilices puede condicionar en parte a la elección de la suite. Por ejemplo, si empleas Firebird seguramente optases por emplear Zeos por ej, en lugar de ADO. Y si usas MS SQL Server lo más probable es que decantes por ADO.

 

Y ni siquiera hace falta que coloques el contenido del archivo Excel en una grilla (un StringGrid). Puedes hacer pase de forma directa: simplemente a medida que lees fila a fila ejecutas una instrucción SQL INSERT INTO tabla con el contenido leido de las columnas en cuestión. Ya tienes la parte que hace la "lectura" del archivo, lo que sigue es que uses un Query, le definas en su propiedad SQL la consulta INSERT y le pases por parámetros (es lo más recomendable) los datos que te interesa almacenar en la base de datos.

 

Ejemplos de como hacer INSERT INTO con diversos componentes sobran en DelphiAccess si es lo que te preocupa. Me animo a decir que la forma en como se hace esto es prácticamente idéntica en todas las suites. Lo que va a variar es si usas parámetros, ya que en ADO se los invoca por Parameters, mientras que en el resto de las suites por Params. Todas las suites tienen su componente "Query", y lo que puede variar de una a otra es el componente "Conexión" y/o de "Transacción" (este último no todas las suites lo tienen, por lo que hacen transacciones de forma implícita)

 

Ahora, si necesitas mostrar lo que tiene la planilla ahi si te entendería que recurras a un componente visual para ello. Pero como dije: si al final de toda esta "discusión" en este hilo era para únicamente insertar la data en una DB, me parece un gasto absolutamente inncesario pasarlo a un "contenedor" cuando puede evitarse.

 

Saludos,


  • 0

#14 santiago14

santiago14

    Advanced Member

  • Miembros
  • PipPipPip
  • 334 mensajes
  • LocationCerrillos - Salta - Argentina

Escrito 10 septiembre 2018 - 07:10

mi intención es que esos datos se guarden en la base de datos,como podría guardar el excel existen componentes para guardar información gracias saludos     

Hola. Es bastante simple. He aquí una pequeña parte de un código:


delphi
  1. procedure NuevoDetRemitoTransporte(qryRemito:TFDQuery; DetRemito:TDetRemitosTransporte);
  2. begin
  3. with qryRemito, DetRemito do
  4. begin
  5. Close;
  6. sql.Clear;
  7. sql.Add('Insert into det_remitos_transporte (cod_remito, renglon_remito, ');
  8. sql.Add('cod_existencia, Descripcion_existencia, cant_producto, cant_entregada, cant_devuelta_producto, ');
  9. sql.Add('estado_det_remito) ');
  10. sql.Add('Values (:cod_remito, :renglon_remito, ');
  11. sql.Add(':cod_existencia, :Descripcion, :cant_producto, :cant_entregada, :cant_devuelta_producto, ');
  12. sql.Add(':estado_remito) ');
  13. ParamByName('cod_remito').AsInteger:=cod_remito;
  14. ParamByName('renglon_remito').AsInteger:=renglon;
  15. ParamByName('cod_existencia').AsInteger:=cod_existencia;
  16. ParamByName('Descripcion').AsString:=Descripcion;
  17. ParamByName('cant_producto').AsFloat:=CantidadProducto;
  18. ParamByName('cant_entregada').AsFloat:=CantidadEntregada;
  19. ParamByName('cant_devuelta_producto').AsFloat:=CantidadDevuelta;
  20. ParamByName('estado_remito').AsString:=EstadoDetRemito;
  21. try
  22. ExecSQL();
  23. except
  24. raise;
  25. end;
  26. end;
  27. end;
  28.  
  29. procedure TfrmRemitoTransporte.NuevoDetalleRemito(CodRemito:Integer);
  30. var
  31. i:Integer;
  32. DetRemito:TDetRemitosTransporte;
  33. begin
  34. DetRemito.cod_remito:=CodRemito;
  35. for i:=0 to grdCargaTransportada.RowCount - 1 do
  36. begin
  37. DetRemito.renglon:=i;
  38. DetRemito.cod_existencia:=grdCargaTransportada.CellByName['clCodExistencia', i].AsInteger;
  39. DetRemito.Descripcion:=grdCargaTransportada.CellByName['clCargaTransportada', i].AsString;
  40. DetRemito.CantidadProducto:=grdCargaTransportada.CellByName['clCantidadTransportada', i].AsFloat;
  41. DetRemito.CantidadEntregada:=0;
  42. DetRemito.CantidadDevuelta:=0;
  43. DetRemito.ObsDetRemitoEntrega:=''; //Sirve para las observaciones al momento de la devolución de esta moto
  44. DetRemito.EstadoDetRemito:='ACTIVO';
  45. try
  46. NuevoDetRemitoTransporte(DataModule1.qryRemitosTransporte, DetRemito);
  47. except
  48. raise;
  49. end;
  50. end;
  51. end;
  52.  
  53. procedure TfrmRemitoTransporte.btnRemitoClick(Sender: TObject);
  54. var
  55. validaciones:Boolean;
  56. Remito:TRemitosTransporte;
  57. DetRemito:TDetRemitosTransporte;
  58. Remitente:TRemitente;
  59. Chofer:TDatosChofer;
  60. Vendedor:TVendedores;
  61. Transporte:TDatosTransporte;
  62. Destino:TDestino;
  63. FilaCarga:FilaGrilla;
  64. i:Integer;
  65. begin
  66. validaciones:=DatosValidosEncRemito and DatosValidosRemitente and DatosValidosChofer
  67. and DatosValidosTransporte and DatosValidosVendedor
  68. and DatosValidosDestino and CargaTransportadaValida(ObtenerMaximaCantidadMotosPermitida);
  69. if validaciones and (IDYES = Application.MessageBox('¿Confirma registración de nuevo Remito de Transporte?',
  70. PWideChar(self.Caption), MB_YESNO + MB_ICONQUESTION + MB_DEFBUTTON2)) then
  71. begin
  72. Remito:=TomarDatosEncRemito;
  73. Remitente:=TomarDatosRemitente;
  74. Chofer:=TomarDatosChofer;
  75. Transporte:=TomarDatosTransporte;
  76. Vendedor:=TomarDatosVendedor;
  77. Destino:=TomarDatosDestino;
  78. //Nuevo Remito Transporte
  79. with DataModule1 do
  80. begin
  81. terminarTransaccion;
  82. transaccion.StartTransaction;
  83. try
  84. NuevoEncRemitoTransporte(qryRemitosTransporte, Remitente, Vendedor,
  85. Chofer, Transporte, Destino, Remito);
  86. remito.cod_remito:=qryRemitosTransporte.FieldByName('cod_remito').AsInteger;
  87. //self.AsignarCodRemito(Remito.cod_remito);
  88. //Detalle del remito
  89. Self.NuevoDetalleRemito(remito.cod_remito);
  90. transaccion.CommitRetaining;
  91. //Impresión
  92. self.ImpresionRemitoTransporte(Remitente.cod_remitente, remito.cod_remito,
  93. Chofer.cod_chofer, Transporte.cod_transporte);
  94. transaccion.Rollback;
  95. Application.MessageBox(PWideChar('Remito de Transporte registrado con éxito.'),
  96. PWideChar(self.Caption), MB_OK + MB_ICONINFORMATION);
  97. LimpiarRemitoTransporte;
  98. //chkConLineas.Enabled:=True;
  99. //btnImpresion.Enabled:=True;
  100. except
  101. on e:Exception do
  102. begin
  103. terminarTransaccion;
  104. mErrores(e, 'Imposible registrar Remito de Transporte solicitado.',
  105. self.Caption);
  106. end;
  107. end;
  108. end;
  109. end;
  110. end;

De todo ese código lo que interesa es: 

NuevoDetRemitoTransporte: Insert hacia la BBDD. Esto es unitario, uno por renglón que tenga la grilla.

NuevoDetalleRemito: Un ciclo que va sacando los datos, fila por fila, de la grilla. En este caso los va poniendo en un Record para luego pasarlo al Insert.

 

Todos los demás métodos son para diversas cosas que hay que meter en otras tablas de la BBDD, pero que no vienen al caso aquí. Para sacar los datos de la grilla se usan métodos de esta grilla en particular (NextGrid), pero puede hacerse sin problemas en la TStringGrid con DetRemito.CantidadEntregada:=STrToInt(grilla.Cells[fila, columna]);

 

En el módulo principal (btnRemitoClick), se inicia y termina la transacción, puesto que puede ser medio larga según la cantidad de registros que haya que meter. También se gestiona el caso en que haya algún problema contra la BBDD.

 

 

Espero ayude. 


  • 0

#15 the walrus

the walrus

    Advanced Member

  • Miembros
  • PipPipPip
  • 60 mensajes

Escrito 17 septiembre 2018 - 03:11

pude hacer la importación, gracias a todos por sus comentarios 


  • 0




IP.Board spam blocked by CleanTalk.