Capturar desde VFP la data en una hoja de cálculo de Excel

2,687 views
Skip to first unread message

José Luis

unread,
Jan 2, 2011, 8:46:39 AM1/2/11
to Comunidad de Visual Foxpro en Español
Feliz año a todos y que este nuevo año 2011 nos traiga a todos salud,
bienestar, amor, paz, estabilidad en nuestro trabajo y otros.

Expongo mi situación. Todos los días me envían una data en un
archivo de cálculo de Excel (archivo.xls), este tiene 15 encabezado y
ordenados por un identificador único (IdUniNro). Esta data
diariamente aumenta la cantidad de registros que ellos van
almacenando, por ejemplo, hoy me envían el CD con los registros
(IdUniNro) desde el 00001 hasta 01005 y al otro día me envían otra ves
la data en el CD desde el registro 00001 hasta el 03798.

Lo que deseo hacer es que desde VFP capturar los registros que no
existan en mi Tabla y almacenarlos, por ejemplo, si hoy recibí el CD
con los registros desde el 00001 hasta 01005 y mañana lo recibo otra
ves desde el 00001 hasta el 03798 VFP me los capture desde el 01006
en adelante. ¿Como logro hacer esto?

Saludos y espero sus gratas respuestas.

Ing.Daniel Bojorge

unread,
Jan 2, 2011, 8:51:12 AM1/2/11
to publice...@googlegroups.com
Utiliza Automation para tomar el dato de Excel.  Que lo podés hacer con el CrateObject, pero si sólo vas a leer (obviamente tenés que abrir el archivo y tenerlo como único archivo de excel abierto), te recomiendo utilizar GetObject.  Te doy un pequeño ejemplo que yo uso para actualizar los precios de una balanza.


CREATE Cursor maecod (Codigo C(20),Tipo C(4))

oXLS = Getobject(,"Excel.Application")

IF Type('oXLS') <> 'O'
MESSAGEBOX("Abrir Primero Excel con el archivo a Procesar")
RETURN .F.
ENDIF

fila = 2
vlcodigo = "VALOR"
DO While !Empty(vlcodigo)

vlcodigo = Alltrim(oXLS.Cells(fila,4).Text)

IF !Empty(vlcodigo)
SELECT maecod
APPEND Blank

REPLACE Codigo With vlcodigo
vlcodigo = Alltrim(oXLS.Cells(fila,12).Text)
REPLACE Tipo With upper(vlcodigo)
IF RIGHT(TIPO,1)="C"
REPLACE TIPO WITH "Q"
ELSE
REPLACE TIPO WITH "X"
ENDIF
ENDIF
fila = fila + 1
ENDDO

SELECT a.Codigo,nprice from icitem b, maecod a;
where a.Codigo = b.citemno;
order by a.Codigo;
into cursor curPrecios


fila = 2
vlcodigo = "VALOR"

DO While !Empty(vlcodigo)
vlcodigo = Alltrim(oXLS.Cells(fila,4).Text)

IF !Empty(vlcodigo)

SELECT curPrecios
LOCATE for Codigo = vlcodigo

IF found()
vlprecio = Allt(Str(Int(nprice * 100)))
IF Allt(oXLS.Cells(fila,6).Text) <> vlprecio
oXLS.Cells(fila,17).value = oXLS.Cells(fila,6).Text
oXLS.Cells(fila,6).value = vlprecio
ENDIF
ENDIF
ENDIF
fila = fila + 1
ENDDO


Release oXLS



La idea es leer todo lo que está en el archivo, cuando en la fila 1 no hay nada, el programa se detiene.  Espero te sirva.



Dios L@s Bendiga

Saludos,

Daniel (Con 1 Estrella DCE de Microsoft)
Nicaragua

"Si ustedes permanecen unidos a mí, y si permanecen fieles a mis enseñanzas, pidan lo que quieran y se les dará.
(Juan 15:7 DHH)
Bendito el varón que se fía en el SEÑOR, y cuya confianza es el SEÑOR.
(Jeremías 17:7 RV2000)

José Luis

unread,
Jan 2, 2011, 10:05:09 AM1/2/11
to Comunidad de Visual Foxpro en Español
Hola daniel gracias por responder.

Me da el siguiente error el código que me enviaste:
Código de error OLE 0x800401ea: El moniker no puede abrir un archivo.

A que se debe.

Gracias

edgar suarez kummers

unread,
Jan 2, 2011, 10:14:54 AM1/2/11
to publice...@googlegroups.com
Tienes dos soluciones:

Comprar SOBOLSOFT que te une dos tablas de Excel.

O hacer lo que ofrece SOBOLSOFT desde VFP.

Yo terminaré ese software a finales de enero, pero a grandes rasgos te explico así:

Hay que importar mediante WZIMPORT dos veces consecutivas las dos tablas de EXCEL, si apenas tienes una, la nueva, entonces exportas la compendiada desde VFP.

Las dos tablas importadas deben cumplir ciertos requisitos, primero que el identificador en ambas sea único, pero esto lo puedes hacer desde VFP. 

Luego hay que manipular las dos tablas según tus requerimentos ya desde VFP.

Saludos

Edgar


De: José Luis <joselg...@gmail.com>
Para: Comunidad de Visual Foxpro en Español <publice...@googlegroups.com>
Enviado: dom,2 enero, 2011 08:46
Asunto: [vfp] Capturar desde VFP la data en una hoja de cálculo de Excel

Walter R. Ojeda Valiente

unread,
Jan 2, 2011, 11:14:56 AM1/2/11
to publice...@googlegroups.com
Hola José Luis

Para hacer lo que deseas debes utilizar automatización. Y para saber cual fue la última fila de la planilla Excel que visitaste, debes guardar ese número de fila en alguna tabla de tu aplicación VFP. Así al día siguiente sabrías desde cual fila continuar. Para automatizar Excel:
 
  Fila = 1     && Aquí deberías poner el número de la primera fila a la cual quieres acceder

  RutinaError = On("ERROR")
 
  NumError = 0
 
  on Error NumError = Error()
 
  oExcel = GetObject(NombrePlanilla)     && Aquí el nombre de tu planilla, con la extensión .XLS
 
  on Error &RutinaError
 
  if NumError == 0     && Si se pudo abrir EXCEL
    with oExcel.Application
      .Visible  = .F.
      .Application.WorkBooks.Open(NombrePlanilla)
      Codigo = .Cells(Fila, 1)
      do while VarType(Codigo) <> "U"     && Condición para que termine el do while
          Nombre = .Cells(Fila, 2)
          Precio = .Cells(Fila, 3)
          Fila = Fila + 1
          Codigo = .Cells(Fila, 1)
      enddo
      .Visible = .T.
    endwith
    Release oExcel
  endif

En estos casos lo que yo hago es lo siguiente:
- Obtengo los valores de la planilla Excel
- Guardo esos valores en una tabla temporal
- Los voy mostrando en una grilla, para que el usuario vea como está trabajando la conversión de Excel a VFP
- Al finalizar, puede navegar por esa grilla, para verificar que todos los datos han pasado correctamente
- Si hace click sobre un botón entonces (y solo entonces) los grabo en mi tabla de VFP

Saludos.

Walter.

Miguel Canchas

unread,
Jan 3, 2011, 8:31:25 AM1/3/11
to Comunidad de Visual Foxpro en Español
Que tal crear un cursor y hacerle un append from.

Hacerle un scan con un locate y pasar lo que no que este.

Sin Object ni cargar 2 archivos ni nada de eso, algo directo y sencillo.

MK


-----Mensaje original-----
De: publice...@googlegroups.com [mailto:publice...@googlegroups.com] En nombre de José Luis
Enviado el: domingo, 02 de enero de 2011 10:05


Para: Comunidad de Visual Foxpro en Español

Asunto: [vfp] Re: Capturar desde VFP la data en una hoja de cálculo de Excel

Jairo Miranda

unread,
Jan 3, 2011, 9:51:20 AM1/3/11
to publice...@googlegroups.com
Buenos días

Esto es lo que hago...


Selecciono la hoja de calculo en formato Excel 95/2003
LOCAL siexp
siexp = MESSAGEBOX(" Por favor verifique formato de hoja de calculo en la
hoja EN FORMATO EXCEL 5.0/95 localizada en su directorio, Desea realmente
exportar datos desde una hoja de calculo en excel?, solo se acepta formato
de excel 5.0/95 ",32+1, "!!!!Atención......!!!")
IF siexp = 1
*Driver ODBC de Excel.
cFileXLS = Getfile("XLS")

IF !FILE(cFileXLS)
=MESSAGEBOX("No se presentó selección de archivo .... ",16,"!!!
Atención....")
RETURN
ENDIF
cConn = "Driver={Microsoft Excel Driver (*.xls)};"+;
"DriverId=790;Dbq="+cFileXLS+;
";DefaultDir="+Justpath(cFileXLS)+";"

nH = SqlStringConnect(cConn)

SQLTables(nH,"", "SheetNames")

cTabla = Trim(SheetNames.Table_Name)
cCursor = Chrtran(cTabla," $","_")
SQLExec(nH,'Select * From ['+cTabla+']',cCursor)
Select (cCursor)

WAIT WINDOW " Archivo Seleccionado Ok..... " at 20, 40 timeout 1

Select (cCursor)
GO TOP

SCAN
Store UPPER(ALLTRIM(IdUniNro)) to m.IdUniNro
Select tabla_de
Set order to tag IdUniNro
If seek(m.IdUniNro)
*Ya existe... y se puede hacer una actualización de datos
Else
* No existe , se puede agregar
Endif
Endscan


Espero te sierva

Jairo


-----Mensaje original-----
De: publice...@googlegroups.com
[mailto:publice...@googlegroups.com] En nombre de José Luis

Enviado el: Domingo, 02 de Enero de 2011 08:47


Para: Comunidad de Visual Foxpro en Español

Asunto: [vfp] Capturar desde VFP la data en una hoja de cálculo de Excel

José Luis

unread,
Jan 3, 2011, 5:11:48 PM1/3/11
to Comunidad de Visual Foxpro en Español
Gracias compañeros por responder. Los ejemplos que me han dado los he
probado y no me han resultado.

Explico como estan estructurado el archivo de excel y la tabla de vfp.

La estructura de la hoja de cálculo de Excel es más o menos así:
ARCHIVO.XLS
Columna: A ; Fila: 1 ; identificada como: IdUniNro (tipo texto)
Columna: B ; Fila: 1 ; identificada como: CI (tipo numérico sin
decimal)
Columna: C ; Fila: 1 ; identificada como: NyA (tipo texto)
Columna: D ; Fila: 1 ; identificada como: CarDes (tipo texto)
Columna: E ; Fila: 1 ; identificada como: MonBas (tipo numérico con 2
decimales)
Columna: F ; Fila: 1 ; identificada como: CodPre (tipo texto)
Columna: G ; Fila: 1 ; identificada como: LugTra (tipo texto)
Columna: H ; Fila: 1 ; identificada como: FI (tipo fecha)
Columna: I ; Fila: 1 ; identificada como: FC (tipo fecha)
Columna: J ; Fila: 1 ; identificada como: TT (tipo numérico con 2
decimales)
Columna: K ; Fila: 1 ; identificada como: FeOf (tipo fecha)
Columna: L ; Fila: 1 ; identificada como: NuOf (tipo texto)
Columna: M ; Fila: 1 ; identificada como: MonTot (tipo numérico con 2
decimales)


La estructura de la tabla es así: TABLA.DBF
Campo Nombre de campo Tipo Ancho Dec Índice Ordenación
Nulos
1 IDUNINRO Carácter 5 Asc
Machine No
2 CI Numérico
8 No
3 NYA Carácter
50 No
4 CARDES Carácter
50 No
5 MONBAS Numérico
2 No
6 CODPRE Carácter
30 No
7 LUGTRA Carácter
50 No
8 FI Fecha
8 No
9 FC Fecha
8 No
10 TT Numérico 4
2 No
11 FEOF Fecha
8 No
12 NUOF Carácter
5 No
13 MONTOT Numérico 10
2 No


Saludos y gracias a todos; espero sus gratas respuestas.

Miguel Canchas

unread,
Jan 3, 2011, 5:16:02 PM1/3/11
to Comunidad de Visual Foxpro en Español
Juega tu archivo para probarlo.

MK


-----Mensaje original-----
De: publice...@googlegroups.com [mailto:publice...@googlegroups.com] En nombre de José Luis

Enviado el: lunes, 03 de enero de 2011 17:12


Para: Comunidad de Visual Foxpro en Español

Asunto: [vfp] Re: Capturar desde VFP la data en una hoja de cálculo de Excel

José Luis

unread,
Jan 3, 2011, 5:21:48 PM1/3/11
to Comunidad de Visual Foxpro en Español
>Juega tu archivo para probarlo.
No entiendo.

Miguel Canchas

unread,
Jan 3, 2011, 5:25:21 PM1/3/11
to Comunidad de Visual Foxpro en Español
Pasa tu archivo....

MK


-----Mensaje original-----
De: publice...@googlegroups.com [mailto:publice...@googlegroups.com] En nombre de José Luis

Enviado el: lunes, 03 de enero de 2011 17:22

José Luis

unread,
Jan 3, 2011, 5:25:41 PM1/3/11
to Comunidad de Visual Foxpro en Español
Compañero si me puedes explicar como los envio te lo agradeceria
mucho, por favor.

Miguel Canchas

unread,
Jan 3, 2011, 5:46:18 PM1/3/11
to publice...@googlegroups.com
Como ?

Solo anexa tu archivo y mandalo, mientras no sea muy grande...

MK


-----Mensaje original-----
De: publice...@googlegroups.com [mailto:publice...@googlegroups.com] En nombre de José Luis

Enviado el: lunes, 03 de enero de 2011 17:26

José Luis

unread,
Jan 3, 2011, 5:50:02 PM1/3/11
to Comunidad de Visual Foxpro en Español
Yo leo los temas desde googlegroups con mi correo gmail, y no consigo
como enviarlos.

Luis Maria Guayan

unread,
Jan 3, 2011, 9:02:06 PM1/3/11
to publice...@googlegroups.com
Envialos a la direccón: publice...@googlegroups.com


Luis María Guayán
Tucumán, Argentina
_________________________
http://www.PortalFox.com
Nada corre como un zorro
_________________________

José Luis

unread,
Jan 3, 2011, 10:19:53 PM1/3/11
to Comunidad de Visual Foxpro en Español
Gracias Luis Maria (Feliz Año 2011) compañero.

Enviando el archivo relacionado a este tema.

Gracias, espero sus gratas respuestas.



On 3 ene, 22:02, Luis Maria Guayan <luisma...@portalfox.com> wrote:
> Envialos a la direccón: publice...@googlegroups.com
>
> Luis María Guayán
> Tucumán, Argentina
> _________________________http://www.PortalFox.com
> Nada corre como un zorro
> _________________________
>
Reply all
Reply to author
Forward
0 new messages