Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 03-04-2004
atirado atirado is offline
Miembro
 
Registrado: mar 2004
Posts: 41
Poder: 0
atirado Va por buen camino
Question Saber el nombre de una tabla/hoja en Access/Excel

Hola de nuevo a tod@s!
Vaya que si me surgen cosas retadoras, jeje
El caso es que estoy haciendo una aplicación donde se compara una tabla de Access contra una tabla de Excel. Hasta ahí todo bien; lo hago usando un ADODataSet, con su conectionstring utilizando adecuadamente el MDB y XLS que el usuario abre.
Sin embargo, la necesidad del programa es que el usuario pueda seleccionar la tabla/hoja desde donde se importarán los datos.
Se que dicho nombre debe ir en la propiedad CommandText, eso no es problema. Lo que quiero saber es si hay alguna propiedad del ADODataSet desde donde pueda recuperar los nombres de todas las tablas/hojas disponibles para que el usuario elija la que necesita.
Les paso una parte del código, aclarando que estoy usando D7 y la versión más nueva de ADO (no recuerdo cuál es, pero sí se que es la más nueva), así como un action list donde se ejcutan las siguientes instrucciones:
Código:
 try
   strConexionS			 := actAbrirSua.Dialog.FileName;
   dscSua.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;
Data Source='+strConexionS+';Mode=ReadWrite;
Persist Security Info=False';
   dscSua.CommandType	  := cmdTableDirect;
//aquí directamente le tengo qué decir que la tabla se llama 'datosempleados'
   dscSua.CommandText	  := 'datosempleados';
   dscSua.Open;
   dscSua.Active		   := True;
 except
	on EOLEException do
	begin
	  ShowMessage('No se pudo abrir la tabla');
	  raise;
	end
	else
		ShowMessage('Error desconocido');
		raise;
 end; //try
De antemano agradezco la ayuda que me puedan brindar. Y no se preocupen, les estaré trayendo nuevos retos

Saludos desde México
Alejandro
Responder Con Cita
  #2  
Antiguo 03-04-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Desconozco si es posible hacer esto utilizando ADO. A fin de cuentas un libro de Excel no es propiamente una base de datos cuyas tablas sean las hojas.

Prueba a ver si te sirve esto:

Código:
uses
  ComObj;

...

procedure HojasExcel(Archivo: String; Lista: TStrings);
var
  Excel: OleVariant;
  Libro: OleVariant;
  I: Integer;

begin
  Excel := CreateOleObject('Excel.Application');
  Libro := Excel.WorkBooks.Open(Archivo);

  try
    Lista.Clear;
    for I := 1 to Libro.Worksheets.Count do
      Lista.Add(Libro.Worksheets.Item[i].Name);
  finally
    Libro.Close;
  end;
end;
Al procedimiento le pasas el nombre del archivo de Excel y un objeto de tipo TStrings para recibir los nombres de las hojas, por ejemplo un ListBox:

Código:
HojasExcel('archivo.xls', ListBox.Items);
Este código me funciona bien con Excel 2000.

// Saludos
Responder Con Cita
  #3  
Antiguo 03-04-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Una observación:

En lugar de crear una instancia de Excel con CreateOleObject podrías utilizar una componente TExcelApplication de la paleta Servers. Así lo probé inicialmente y funciona. El incoveniente es que entonces debes llenar todos los parámetros del método Open que son muchísimos e irrelevantes para lo que se busca.

// Saludos
Responder Con Cita
  #4  
Antiguo 03-04-2004
atirado atirado is offline
Miembro
 
Registrado: mar 2004
Posts: 41
Poder: 0
atirado Va por buen camino
Muchas gracias, Román! Lo intentaré de inmediato y te dejo saber si me funcionó o no


Saludos desde México
Alejandro
Responder Con Cita
  #5  
Antiguo 03-04-2004
atirado atirado is offline
Miembro
 
Registrado: mar 2004
Posts: 41
Poder: 0
atirado Va por buen camino
Unhappy

Hola de nuevo, Román!

Pues no, no funcionó, fíjate. Lo intenté con ADO y con un TExcelApplication y nada.
Ni siquiera me acepta la propiedad Names, pues me dice que no existe, y eso lo hice cuando ya tenía el TExcelApplication, por lo que no se a qué se debe.
Mi código de todo el Unit quedó de la siguiente manera:
Código:
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, OleServer, Excel2000, DB;
type
  TForm1 = class(TForm)
	DataSource1: TDataSource;
	Excel: TExcelApplication;
	cbxHojas: TComboBox;
	Button1: TButton;
	procedure Button1Click(Sender: TObject);
  private
	{ Private declarations }
  public
	{ Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
   Libro: _WORKBOOK;
   Hoja: _WORKSHEET;
   I : Integer;
begin
  Libro := Excel.Workbooks.Open('D:\Mis Documentos\atirado\Excel\nomina.xls',
false,false,
null,'',null,true,null,'',
true,null,null,false,0);
  For I:= 1 to Libro.Worksheets.Count do
	 cbxHojas.items.add(Libro.Worksheets.Item[i].Name);
  Hoja := Libro.Sheets[1] as _WORKSHEET;
  Excel.Visible[0] := true;
end;
end.
De cualquier manera gracias; creo que simplemente no se puede hacer eso en Delphi

Salu2 desde MX
Alejandro
Responder Con Cita
  #6  
Antiguo 04-04-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por atirado
creo que simplemente no se puede hacer eso en Delphi
El código que te puse lo hace sin ningún problema de manera que tu observación es demasiado contundente y falsa.

Es posible que dependiendo de la versión de Excel, el nombre de algunas propiedades sea distinto y habrá que ajustarse a ello estudiando la ayuda de VB que incluye Office o bien consultando el SDK de Windows.

De cualquier manera, como no dices si probaste el procedimiento que te pasé ni en su caso, que errores te marcó, así como tampoco indicas la versión de Excel que usas, ni la versión de Delphi ni la versión de las componentes Office, es imposible en estos momentos tratar de dilucidar lo que pasa.

// Saludos
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 06:13:23.


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
Copyright 1996-2007 Club Delphi