FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
||||
|
||||
Llevar desde Excel a una BD paradox
Necesito recuperar información desde una planilla Excel a una BD, en este caso Paradox. El problema es que son mas de 50.000 lineas, y en el traspaso se queda pegado en la 4.000 aprox., ademas que el proceso resulta demasiado lento, si bien se va a realizar una o dos veces al año, calculo que llevaria mas de media hora en completarse. Si alguien tiene alguna solución mas eficiente, por favor de enviarmela, o alguna dirección de internet que hable del tema.
A continuación les envio el codigo fuente. Esta en Delphi 5.0 y paradox 7.0. de antemnao muchas gracias: uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, Db, DBTables, ComObj, ComCtrls; ... public Excel: Variant; // Objeto OLE. ... procedure TfrmImporta.btnImportaClick(Sender: TObject); var Hoja: OleVariant; nFil: Integer; xVal: String; begin // Crea objeto Excel. try Excel := CreateOleObject('Excel.Application'); except showmessage('No se pudo crear el Objecto Excel.'); Exit; end; Excel.Workbooks.Open(Edit1.Text); // Abre libro Excel Hoja := Excel.Worksheets.Item['Datos']; // Abre Hoja 'Datos'. Hoja.Activate; // Elimina datos anteriores Table1.Open; Table1.First; while not Table1.Eof do begin Table1.Delete; end; nFil:= 2; repeat Table1.Insert; Table1.FieldByName('fecha').AsDateTime:= Excel.Cells[nFil,1].Value; Table1.FieldByName('cuenta').AsString := Excel.Cells[nFil,4].Value; Table1.FieldByName('debe').AsString := Excel.Cells[nFil,7].Value; Table1.FieldByName('debe_d').AsString := Excel.Cells[nFil,9].Value; Table1.FieldByName('haber').AsString := Excel.Cells[nFil,8].Value; Table1.FieldByName('haber_d').AsString:= Excel.Cells[nFil,10].Value; Table1.FieldByName('ccosto').AsString := Excel.Cells[nFil,12].Value; Table1.FieldByName('cpadre').AsString := Excel.Cells[nFil,16].Value; Table1.FieldByName('tcomp').AsString := Excel.Cells[nFil,11].Value; Table1.FieldByName('comp').AsString := Excel.Cells[nFil,2].Value; Table1.FieldByName('predio').AsString := Excel.Cells[nFil,6].Value; Table1.FieldByName('tconc').AsString := Excel.Cells[nFil,14].Value; Table1.FieldByName('conc').AsString := Excel.Cells[nFil,15].Value; Table1.Post; nFil:= nFil + 1; xVal:= IntToStr(Excel.Cells[nFil,4].Value); until (xVal = '0'); // Cierra archivo excel. try Excel.Quit; except ShowMessage('La aplicación Excel no se pudo finalizar automaticamente.'); Excel.Visible := True; end; end; |
#2
|
||||
|
||||
Quizá te sirva usar ADO. Jamás había utilizado estas componentes pero recordaba haber leído alguna vez acerca de acceder a Excel mediante ellas. Hice una pequeña búsqueda y me encontré este artículo en Delphi Magazine. Quizá no tengas acceso a él ya que muchos artículos son sólo para suscriptores pero si conoces ADO no tendrás problemas, si no, pregunta y te digo los pasos a seguir (que yo seguí como burro pues, repito, desconozco ADO).
El punto importante es que hice una prueba con una hija de Excel con 65534 filas (el máximo que permite Excel) y tres columnas. Además de no colgarse el traspaso duró no más de cuatro minutos. Será cuestión de que experimentes a ver si te sirve. // Saludos |
#3
|
||||
|
||||
Fe de erratas:
En el mensaje anterior donde dice "hija de Excel" debe decir "hoja de Excel". Yo mejor no me meto con las hijas del señor Excel, no quiero problemas ni con él n i con mi novia |
#4
|
||||
|
||||
Gracias por contestar. Me parece increible que en solo cuatro minutos se haya traspasado 65.000 lineas, lamentablemente no he trabajado con ADO, asi que recurro a tu ayuda, solo necesito un empujon incial y despues me voy solito.
En cuanto a las 'hijas de Excel' no te preocupes que yo me encargo, ya que por ahora no tengo novia, ja. |
#5
|
||||
|
||||
Ok, ahí va.
1. Agrega las componentes ADO a la paleta de componentes 2. Agrega una componente TAdoConnection a tu formulario y pon su propiedad LoginPrompt en false. 3. Haz doble click en la componente para que se abra el editor de la propiedad ConnectionString y selecciona "Use connection string" y luego oprime el botón "Build" para que se abra la ventana de vínculo de datos. 4. En esa ventana, en la ficha "Proveedor" (Provider) selecciona Microsoft Jet 4.0 OLE DB y da click en siguiente. 5. En la ficha "Conexión" (Connection), en el cuadro "Usar nombre de origen de datos" (o algo así) escribe el nombre del archivo excel (te deja buscarlo con un botoncito) 6. En la ficha "Todas" (All) selecciona "Extended properties" y luego "Modificar valor" y escribes "Excel 8.0" (sin las comillas) 7. Oprime 'Ok' las veces necesarias para cerrar todas las ventanas. Esta fue la parte "difícil", crear la cadena de conexión. 8. Ahora coloca una componente TAdoDataSet en el formulario y asigna el AdoConnectio a su propiedad "Connection" 9. Pon la propiedad CommandType del DataSet en cmdTableDirect y en la propiedad CommandText escoges la hoja que desees del archivo de Excel (si todo salió bien te aparece una lista con las hojas del libro) El nombre de la hoja aparece seguido de un signo $, es normal. A partir de aquí ya todo es "coser y cantar". El AdoDataSet funciona similar a un Table (aunque de sólo lectura) y lo abres con su propiedad Active:=true o con el método Open (cuidado porque a mi me marcó un error cuando lo activé en tiempo de diseño y luego corrí la aplicación así que mejor lo dejé inactivo y lo abrí hasta la ejecución). Para la transferencia simplemente usas un bucle: Código:
while not AdoDataSet1.EoF do begin Table1.Append; Table1.Fields[0].Value := AdoDataSet1.Fields[0].Value; Table1.Fields[1].Value := AdoDataSet1.Fields[1].Value; Table1.Fields[2].Value := AdoDataSet1.Fields[2].Value; ... AdoDataSet1.Next; end; Espero que te sirva. Parece complicado pero en realidad no lo es tanto, es sólo que es largo describir los pasos de forma escrita. // Saludos Última edición por roman fecha: 28-04-2008 a las 21:12:59. Razón: Faltaba la instrucción Append |
#6
|
|||
|
|||
"segui tus pasos Roman, pero estoy detenida en el punto 9"
Cita:
Alguien podría ayudarme dandome un ejemplo de como se abre una ADO en tiempo de ejecución, ya que me no he podido ver la aplicación funcionando y pretendo continuar pasando la info a paradox. Por su apoyo, muchas Gracias. p.d. Gracias a Bicho por sus sugerencias. |
#7
|
||||
|
||||
Hola Clau,
ahora he revisado los pasos de Roman, he visto que me había equivocado en el paso 6, pero ya lo he corregido y me funciona perfectamente. Me has comentado por privado que tenias problemas en el punto 9. ¿Puedes indicarnos que problema exactamente te sucede? ¿Aparece algún mensaje de error? 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. Saludos |
#8
|
||||
|
||||
Cita:
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
__________________
El único hombre que no se equivoca es el que nunca hace nada. |
#9
|
|||
|
|||
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 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 ¿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. |
#10
|
|||
|
|||
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. |
#11
|
||||
|
||||
Cita:
Cita:
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:
Cita:
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. |
#12
|
|||
|
|||
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.
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. |
#13
|
|||
|
|||
Prueba así:
No es necesario activar el AdoDataset en cada vuelta. Y al desactivarlo, no le das tiempo a que se guarden los datos. Bye |
#14
|
||||
|
||||
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.
Saludos.
__________________
De los sueños se construye la realidad... |
#15
|
|||
|
|||
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.
|
#16
|
||||
|
||||
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... |
#17
|
|||
|
|||
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 |
#19
|
|||
|
|||
Cita:
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... |
#20
|
|||
|
|||
Pudiste solucionar este problema de alguna forma?
|
|
|
|