Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Servers (https://www.clubdelphi.com/foros/forumdisplay.php?f=9)
-   -   Llevar desde Excel a una BD paradox (https://www.clubdelphi.com/foros/showthread.php?t=2696)

oracle 12-01-2007 15:43:49

Cita:

... por Lepe
Lo de Error catastrófico lo he vivido también. Busca Updates de delphi.

Di la versión que tienes de delphi y si tienes algún Update pack instalado.

Creo recordar que había problemas al tener instalado C++ y Delphi al mismo tiempo en las versiones 6, tenías que bajar un parche de Borland.

Excelente Lepe. Yo tenia instalado el Borland C++ Builder 6 y el Delphi 7. Lo he probado en otra PC con solo el C++ y funciona perfectamente. Muchas gracias y disculpen la demora pero es que estaba de vacaciones muy lejos...ah y muchas felicidades en este nuevo año a todos...

Saludos

roraclau 12-01-2007 17:45:23

como activar un componente ADODataSet en tiempo de ejecución.
 
Bicho Hola,

Perdón que hasta ahorita te conteste dormi un poco de las 5 a estas horas, ahora te digo:

¿Puedes indicarnos que problema exactamente te sucede?
si, según creo es porque tenia el Componente ADODataSet en su propiedad active en True, pero ya lo deje en false y de todas maneras sigo con el error :confused:
Hice los pasos hasta el 9 y aquí puse un componente DbGrid para ver la info del archivo excel ligandolo con un componente DataSurce, corrir el proyecto y bolas el error:rolleyes: aunque el en modo de diseño si puedo ver la info


¿Aparece algún mensaje de error?

si, el error que me marca es:
El motor de base de datos Microsoft Jet no puede abrir el archivo”. Está abierto en modo exclusivo por otro usuario o bien necesita permiso para ver sus datos.

Y eso de que no has podido ver la aplicación funcionando, ¿a que te refieres?
Cuantos más datos des, más posibilidades habrá de que entre todos encontremos una solucion.


Bueno, por el error no he podido ver el proyecto en tiempo de ejecución, como te comento solo en diseño me funciona. Me gustaría verlo en ejecución para poder continuar ahora con el traspaso de datos a tablita de paradox, tal como lo explica Roman.:)

muchisimas gracias por tu apoyo Bicho. Saludos
Ojalá sea buena esta explicación para que me puedan ayudar.

p.d. según yo intente activar así: puse un Botón para que en su evento OnClick activara el componente ADODataSet lo hice así:

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
TADODataSet.True;
end;


pero tambien me marco error: Undeclared identifier: True
este es mi problema no se como va la instrucción.:o

roraclau 12-01-2007 18:05:31

Bicho
 
Hola ya te conteste, pero no supe como, no se manejar bien las respuestas enseguidita de lo que me contestan, y quien sabe a donde se fue lo que te conteste, porque no los veo.
Me podrás ayudar. Gracias.

Bicho 12-01-2007 18:25:14

Cita:

Empezado por Clau
Hola ya te conteste, pero no supe como, no se manejar bien las respuestas enseguidita de lo que me contestan, y quien sabe a donde se fue lo que te conteste, porque no los veo.

:confused: No se a que te refieres, pero bueno.

Cita:

Empezado por Clau
si, según creo es porque tenia el Componente ADODataSet en su propiedad active en True, pero ya lo deje en false y de todas maneras sigo con el error
Hice los pasos hasta el 9 y aquí puse un componente DbGrid para ver la info del archivo excel ligandolo con un componente DataSurce, corrir el proyecto y bolas el error aunque el en modo de diseño si puedo ver la info

Es lo que comenta Roman, que da muchos problemas si lo tienes activado en tiempo de diseño y no de ejecución. Procura tenerlo desactivado o desconectado y conectarlo al ejecutar la aplicación, en los eventos OnCreate o OnActivate o un Click de botón sino no necesitas la conexión desde el inicio de la ejecución de la aplicación.
Yo lo he estado probando, como te comenté. Y no he visto la manera en diseño de conectar el DBGrid a un AdoDataSet. Es decir, tenía que hacerlo "a mano", recorrer el DataSet y asignar los datos a un StringGrid.

Cita:

Empezado por Clau
si, el error que me marca es:
El motor de base de datos Microsoft Jet no puede abrir el archivo”. Está abierto en modo exclusivo por otro usuario o bien necesita permiso para ver sus datos.

Quizá sea por lo de tener activado en tiempo de diseño.

Cita:

Empezado por Clau
p.d. según yo intente activar así: puse un Botón para que en su evento OnClick activara el componente ADODataSet lo hice así:

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
TADODataSet.True;
end;


pero tambien me marco error: Undeclared identifier: True
este es mi problema no se como va la instrucción.

La forma correcta es así:

Código Delphi [-]
 ADODataSet1.Active := True; //ADODataSet1, es el name que aparece en eobjeto que has arrastrado en el formulario, mientras que TADODataSet es el nombre de la clase a la que pertenece ese objeto.
//Active es la propiedad que tiene el dataset para conectarse. y el ":=" es para realizar una asignación
  
//Seguramente tambien deberías hacer antes conectar el ADOConnection de la misma forma.
  AdoConnection1.Connected := True; //En este caso la propiedad para activar o conectar el AdoConnection es Connected

Espero te sirva para avanzar. Ya nos comentas que tal.

En cuanto a tu experiencia en los foros, cuando escribas un hilo tienes una barra arriba que te permite encerrar el texto y formatearlo para hacerlo más legible. Échales un vistazo te ayudarán mucho. Son etiquetas muy sencillas.
Tienes [quote] para envolver citas, para escribir lo que ha dicho alguien.
Y etiquetas [delphi] y [code] para encerrar el código que escribas.

Saludos y suerte.

oracle 12-01-2007 18:49:17

Bueno primero: Clau quizas no ves las respuestas nuevas porque hay mas de una pagina en la vista que tienes del foro y tienes que mirar en las otras para ver los nuevo mensajes u ordenarlos en otro orden.

Por lo otro, creo que la forma de conectar el DBgrid al AdoDataSet es a traves de un DataSource, al menos asi es como lo hago yo. O sea la propiedad "DataSource" de nuestro DBGrid debe tener el DataSource del que les hablo, y a su ves este DataSource, en su propiedad "DataSet" debe tener el ADODataSet y asi ya estan conectados. Lo de la coneccion en tiempo de diseño o en tiempo de ejecucion es a discricion de uds, igual funciona...

Y por el otro error, ademas de lo que comenta Bicho asegurate de tener la coneccion que estableciste con el Excel, (pasos 6-7 u 8) en la ventana donde te pide el modo de lectura tener marcado read solamente, a mi eso me dio ese error...

Saludos

egostar 02-02-2007 01:23:35

Retomando el tema
 
Hola compañeros

Estoy con el tema de abrir una hoja de excel con ADO, seguí las indicaciones que se mostraron en este tema y funciona perfectamente.

Resulta que este procedimiento se hace en tiempo de diseño y funciona muy bien, ahora el punto es que necesito hacerlo en tiempo de ejecución y abrir cualquier archivo excel y cualquier hoja dentro del archivo.

En este momento he logrado abrir un archivo excel cualquiera desde un OpenDialog, pero según las instrucciones proporcionadas en tiempo de diseño al momento que se indica al ADODataSet.CommandType = cmdTableDirect, automaticamente muestra en la propiedad CommandText las hojas que están dentro de ese archivo.

Mi pregunta es la siguiente:

Como puedo obtener en un ComboBox o un ListBox los nombres de las hojas que están dentro del archivo.

Aqui pego lo que ya he hecho, aún me faltan algunas validaciones que ya agregaré posteriormente.

Código Delphi [-]
 
unit ULeeSalientes;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, DB, ADODB, Grids, DBGrids, ExtCtrls;
 
type
  TForm1 = class(TForm)
    ADOConnection1: TADOConnection;
    ADODataSet1: TADODataSet;
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    OpenDialog1: TOpenDialog;
    Panel1: TPanel;
    Panel2: TPanel;
    BitBtn1: TBitBtn;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure ADOConnection1BeforeConnect(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
  Archivo: String;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.ADOConnection1BeforeConnect(Sender: TObject);
begin
   ADOConnection1.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;'+
                                      'Data Source='+Archivo+
                                      ';Extended Properties=Excel 8.0;'+
                                      'Persist Security Info=False';
end;
 
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  If OpenDialog1.Execute then begin
     Archivo := OpenDialog1.FileName;
     ADODataSet1.CommandText  := 'Dic 06$'; //Aqui estoy asignando el nombre de la hoja
     ADOConnection1.Connected := True;
     AdoDataSet1.Open;
  end;
end;
 
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  AdoDataSet1.Close;
  ADOConnection1.Connected := False;
end;
 
end.

Gracias anticipadas.

egostar 02-02-2007 03:29:30

Problema Resuelto
 
Pues actualizando la duda que tenia, ya encontré la manera de obtener el nombre de las hojas.

Código Delphi [-]
 
ADOConnection1.GetTablesNames(ComboBox1.Items,False);

Resulta que el archivo excel lo debía haber considerado como una base de datos y las hojas como las tablas que contiene.

Pues nada, creo que con esto ya quedó resuelto mi problema.

Aqui pego el código completo espero que sirva para alguien mas.

Código Delphi [-]
 
unit ULeeSalientes;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, DB, ADODB, Grids, DBGrids, ExtCtrls;
 
type
  TForm1 = class(TForm)
    ADOConnection1: TADOConnection;
    ADODataSet1: TADODataSet;
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    OpenDialog1: TOpenDialog;
    Panel1: TPanel;
    BitBtn1: TBitBtn;
    ComboBox1: TComboBox;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure ADOConnection1BeforeConnect(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
    procedure ComboBox1Change(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
  Archivo,Hoja: String;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.ADOConnection1BeforeConnect(Sender: TObject);
begin
   ADOConnection1.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;'+
                                      'Data Source='+Archivo+
                                      ';Extended Properties=Excel 8.0;'+
                                      'Persist Security Info=False';
end;
 
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  If OpenDialog1.Execute then begin
     Archivo := OpenDialog1.FileName;
     ADOConnection1.Connected := True;
     ADOConnection1.GetTableNames(ComboBox1.Items,False);
  end;
end;
 
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
  ADODataSet1.CommandText  := ComboBox1.Text;
  AdoDataSet1.Open;
end;
 
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  AdoDataSet1.Close;
  ADOConnection1.Connected := False;
end;
 
end.

Saludos.

Dalmine 06-02-2007 02:37:41

que tal una pregunta se puede seguir agregando datos al archivo excel abierto y guardar los cambios


saludos

ozegarra 05-02-2008 23:49:14

Buenas estuve chekeando este hilo para saber como pasar una tabla excel a firebird.
He seguido todos los pasos pero no me graba los datos en mi tabla firebird, quiza me falta algo (soy nuevo en esto asi que perdonen mi ingenuidad). Les paso las lineas de codigo que tengo.

Código Delphi [-]
AdoDataSet1.Active :=True;
  while not AdoDataSet1.Eof do
  begin
    Table_Importado.Active := True;
    Table_Importado.Append;
    Table_Importado.Fields[0].Value := AdoDataSet1.Fields[0].Value;
    Table_Importado.Fields[1].Value := AdoDataSet1.Fields[1].Value;
    Table_Importado.Fields[2].Value := AdoDataSet1.Fields[2].Value;
    Table_Importado.Active := False;
    AdoDataSet1.Next;
  end;

esto no me marca ningun error, entra al bucle y recorreo todo el excel pero no me graba nada, que es lo que me falta?.

Gracias de antemano por su ayuda.

keyboy 06-02-2008 06:00:28

Prueba así:

Código Delphi [-]
AdoDataSet1.Active :=True;
Table_Importado.Active := True;

while not AdoDataSet1.Eof do
begin
  Table_Importado.Append;

  Table_Importado.Fields[0].Value := AdoDataSet1.Fields[0].Value;
  Table_Importado.Fields[1].Value := AdoDataSet1.Fields[1].Value;
  Table_Importado.Fields[2].Value := AdoDataSet1.Fields[2].Value;

  AdoDataSet1.Next;
end;

Table_Importado.Active := False;

No es necesario activar el AdoDataset en cada vuelta. Y al desactivarlo, no le das tiempo a que se guarden los datos.

Bye

DarkSide 06-02-2008 16:24:05

Como te dijo keyboy, no es necesario activar y desactivar la tabla en cada ciclo de ingreso, lo que si debes hacer es agregar el metodo "post", para forzar que grabe los datos, asi te deberia funcionar.

Código Delphi [-]
  Table_Importado.Active := True;
  AdoDataSet1.Active :=True;

  while not AdoDataSet1.Eof do
  begin
    Table_Importado.Append;
    Table_Importado.Fields[0].Value := AdoDataSet1.Fields[0].Value;
    Table_Importado.Fields[1].Value := AdoDataSet1.Fields[1].Value;
    Table_Importado.Fields[2].Value := AdoDataSet1.Fields[2].Value;

    Table_Importado.Post;
    
    AdoDataSet1.Next;
  end;
  
  Table_Importado.Active := False;
  AdoDataSet1.Active :=False;

Saludos.

keyboy 06-02-2008 16:35:19

Yo ttiendo a poner ese post que indicas, pero en realidad es innecesario. Un dataset hace un post automático cada vez que nos movemos de registro, de manera que en cada vuelta se guarda el registro de la vuelta anterior.

Bye

ozegarra 06-02-2008 16:38:23

Gracias por las respuestas, cambie un poco la logica para poder ejecutar un procedimiento almacenado que haga la insercion ya que no era tan simple como grabar una tabla directa. Ya pude realizar la tarea que requeria que era grabar dos tablas con ese excel.

De todas maneras probaré lo mencionado para cuando lo requiera, cada dia se aprende mas asi que muchas gracias por el apoyo y lo anotare en el libro...

Saludos
Oscar

faustofabian 05-03-2008 21:57:21

Paleta Servers
 
hola genta me interesaria saber si alguien tiene conocimiento de la paleta SERVER en realidad me interesa manejar formatos en exel desde delphi5 como ser, combinar seldas, darle un formato de fuente especial, recuadros, manejo de colores. todo lo que es formatos en exel desde delphi. Gracias, a la espera de alguna respuesta.

ledesmarc 15-07-2008 15:33:59

Excel
 
Roman gracias por la info, pero tengo un problema cuando quiero importar desde el excel (usando Ado) lo hace bien cuando se trata de una columna que sean todos del mismo tipo para mi caso(son todos numeros) el tema es que cuando en la columna hay mesclados numeros y letras en una misma celda, la importacion se corta (osea importa hasta esa celda)y la verdad me he cansado de buscar pero no encuentro el porque.
Te agredecere cualquier sugerencia
Saludos.
Marcos

ingabraham 17-06-2011 16:40:36

tengo problemas con hojas de excel .xlsx
Código Delphi [-]
error .  la tabla externa no tiene el formato esperado

kapcomx 23-06-2011 20:00:36

veo ke ya solucionaste el problema, nada mas te recomendaria cambiar el paradox por otra base de datos con el numero de registros que mencionas, yo utilizaba paradox con tablas de medianas a grandes y era una autentica pesadilla, ahora con mysql 5.0 todo es felicidad....

Saludos...

LuisAlf:: 28-08-2011 22:34:06

Cita:

Empezado por ledesmarc (Mensaje 300564)
Roman gracias por la info, pero tengo un problema cuando quiero importar desde el excel (usando Ado) lo hace bien cuando se trata de una columna que sean todos del mismo tipo para mi caso(son todos numeros) el tema es que cuando en la columna hay mesclados numeros y letras en una misma celda, la importacion se corta (osea importa hasta esa celda)y la verdad me he cansado de buscar pero no encuentro el porque.
Te agredecere cualquier sugerencia
Saludos.
Marcos

Hola!

Estuve siguiendo el hilo para hacer la conexión...

Pero tuve un inconveniente, en mi archivo de excel tengo celdas que inician con una letra y otros donde son puros números, al hacer la importación el DBGrid solo me muestra los valores que inician con letra y los que solo son números se los saltea dejando la celda vacia...

La verdad no se porque pasa esto, ni como solucionar el problema...

Si alguien me puede ayudar se lo agradecería...

LuisAlf:: 03-09-2011 20:00:13

Pudiste solucionar este problema de alguna forma? :(

juanlaplata 08-09-2011 14:58:23

Importar Excel:
Código Delphi [-]
procedure TForm80.ExcelClick(Sender: TObject);
var
 Excel, Sheet: OLEVariant;
 CantRow, CantCol, i, j : Integer;
 RangoMatriz: Variant;
 FileName :string ;
begin

      OpenDialog.Title := 'Excel a Importar ...';
      OpenDialog.DefaultExt := 'xls';
      OpenDialog.InitialDir := ExtractFilePath(Application.ExeName);
      OpenDialog.FileName := '';
      OpenDialog.Filter:='Archivos Excel (*.xls)|*.xls';
      OpenDialog.FilterIndex:=1;
      if(OpenDialog.Execute)then
           begin
           if(OpenDialog.FileName <> '')then
              begin  

              FileName := OpenDialog.FileName;
              Excel := CreateOleObject('Excel.Application');
              Excel.Workbooks.Open(FileName);

              Sheet := Excel.Workbooks[ExtractFileName(FileName)].WorkSheets[1];
              Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;

              CantRow := Excel.ActiveCell.Row;
              CantCol := Excel.ActiveCell.Column;

              RangoMatriz := Excel.Range['A1', Excel.Cells.Item[CantRow,CantCol]].Value;

              for i:=1 to CantRow do
                 begin
                      for j:=1 to CantCol do
                       begin

                            Table1.Append;
                            Table1Campo.AsString := trim(RangoMatriz[i,j]);
                            Table1.Post;

                       end; // for j
                 end;//for i
              Excel.quit;
              end;
           end;
end;

Este Codigo, no es de mi autoria, deberia colocar la fuente, que la verdad, no la tengo en este momento.
Lo que hace es recorrer todas las celdas del Excel y cargar en una tabla.
La idea es ver como se hace y q cada uno lo reprograme a gusto y necesidad.
Saludos.


La franja horaria es GMT +2. Ahora son las 03:00:11.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi