Você está na página 1de 24

Conferencia Visual FoxPro Espaa 2003

Automatizando Office con Visual FoxPro

Luis Mar a !ua"#n Vicente $rapani %&A& $ucum#n' Ar(entina luismaria)portalfox&com

Luis Mara Guayn es programador en lenguajes xBase desde el ao 1990. En 1994 comenz a desarrollar en Microsoft ox!ro ".# para $indo%s. &esde all' transit por todas las (ersiones de ox!ro) *asta la actualidad con la +ltima (ersin de ,isual ox!ro. Es el -esponsa.le del /rea de &esarrollo 0nform1tico de ,icente 2rapani 3.4.) un esta.lecimiento citr'cola industrial en la pro(incia de 2ucum1n) en la -ep+.lica 4rgentina. Es cofundador en el ao "000) 5 35s6p de !ortal ox) el ma5or portal gratuito para todos los desarrolladores en ,isual ox!ro de *a.la *ispana. En los aos "00" 5 "007 fue nom.rado por Microsoft como M,! 8Most ,alua.le !rofessional9 en ,isual ox!ro) por su cola.oracin en las distintas comunidades en l'nea.

Automatizando Office con Visual FoxPro

Automatizando Office con Visual FoxPro


Tabla de contenidos
Introduccin ......................................................................................................................... 3 Cmo comenzar? ................................................................................................................. 3 Instanciando un Servidor de Automatizacin ............................................................................. 3 El Examinador de Objetos de Visual ox!ro............................................................................... " A#rendamos con IntelliSense .................................................................................................. $ El uso de las %acros de O&&ice ................................................................................................. ' (as constantes de O&&ice ......................................................................................................... ) Combinar corres#ondencia con *ord ....................................................................................... + ,e&inicin de la clase c*ord ................................................................................................. + El #ro-rama %ail%er-e.#r- .................................................................................................. . (os m/todos en la clase c*ord ............................................................................................. . Abrir 01o crear la carta ................................................................................................... 23 (a &uente de los datos .................................................................................................... 22 Combinar la carta .......................................................................................................... 22 4uardar la carta ............................................................................................................ 22 4r5&icos 0 tablas din5micas con Excel .................................................................................... 22 ,nde est5 la a0uda? ...................................................................................................... 26 ormas de ex#ortar los datos de Visual ox!ro a Excel .......................................................... 26 ,e&inicin de la clase cExcel ............................................................................................... 23 (os m/todos de la clase cExcel ........................................................................................... 23 Ex#ortar los datos .......................................................................................................... 2" Abrir los libros ex#ortados............................................................................................... 2" 4uardar 0 cerrar el libro ................................................................................................. 2" 4enerar un -r5&ico ............................................................................................................ 2" El #ro-rama 4ra&ico.#r- .................................................................................................. 2$ 4enerar una tabla din5mica ............................................................................................... 2' !ro-rama 7abla,inamica.#r- ........................................................................................... 2) Otros m/todos auxiliares ................................................................................................ 2+ Enviar 0 leer correo con Outloo8 ............................................................................................ 2+ Versiones de Outloo8 ........................................................................................................ 2. 9n breve ejem#lo ............................................................................................................. 2. !roblemas de se-uridad .................................................................................................... 2. : a;ora <ue? ............................................................................................................... 63 ,e&inicin de la clase cOutloo8 ........................................................................................... 63 El &ormulario de ejem#lo .................................................................................................... 62 (os m/todos de la clase cOutloo8 ....................................................................................... 62 Enviar un correo ............................................................................................................ 66 (eer los correos ............................................................................................................. 63 =esumen ............................................................................................................................ 6"

Pgina 2

Automatizando Office con Visual FoxPro

*ntroducci+n
Visual ox!ro es una #oderosa ;erramienta> #ero ;a0 tareas <ue no las #uede realizar /l solo. !or ejem#lo si tenemos una a#licacin en la cual <ueremos enviar un correo> realizar un -r5&ico> escribir un documento> &ormatear un texto> etc.> necesitamos de otras ;erramientas. !ara automatizar estas tareas desde %icroso&t Visual ox!ro> ele-imos la ;erramienta %icroso&t O&&ice. En este documento vamos a ver como #odemos Automatizar O&&ice desde Visual ox!ro> vamos a conocer las distintas ;erramientas <ue dis#onemos 0 veremos al-unos ejem#los de cdi-o. 7odos los ejem#los descri#tos &ueron realizados con %icroso&t Visual ox!ro + 0 %icroso&t O&&ice ?!.

,C+mo comenzar(o #rimero <ue debemos #re-untarnos es cmo comenzar la tarea de automatizacin? Esta #re@ -unta #areciera <ue tiene una res#uesta di&Acil> #ero veremos... (a ma0orAa de la in&ormacin dis#onible enB la A0uda de O&&ice> los artAculos de la Case de Conoci@ mientos de %icroso&t D%SECF o en la =ed de ,esarrolladores de %icroso&t D%S,GF esta escrita en Visual Casic 0 Visual Casic &or A##lication. Como una desventaja m5s #ara los desarrolladores en Visual ox!ro de ;abla ;is#ana> la in&ormacin dis#onible en Internet esta -eneralmente en in-l/s. En es#aHol> existen varios artAculos> ideas 0 trucos dis#onibles en los si-uientes sitios de la *ebB Sitio de %S,G (atinoam/ricaB ;tt#B11III.microso&t.com1latam1msdn Sitio de %S,G Es#aHaB ;tt#B11III.microso&t.com1s#ain1msdn Sitio de %S,G en Es#aHolB ;tt#B11III.microso&t.com1s#anis;1msdn !ortal oxB ;tt#B11III.#ortal&ox.com =evista ox!ressB ;tt#B11III.&#ress.com =evista 97%a- Dedicin en es#aHolFB ;tt#B11III.universalt;read.com1s#anis;1ma-azine En in-l/s existe un excelente libro #ara tener en cuenta a la ;ora de automatizar O&&iceB J%icroso&t O&&ice Automation Iit; Visual ox!roJ escrito #or 7amar E. 4ranor 0 ,ella %artin> editado en el mes de Kunio de 6333. Est5 dis#onible #ara su com#ra en &ormato im#reso 0 electrnico en el sitio de LentzenIer8eB ;tt#B11III.;entzenIer8e.com

*nstanciando un %er.idor de Automatizaci+n


!ara comenzar a utilizar la automatizacin de O&&ice> vamos a crear una instancia del servidor. Esto se lo-ra desde Visual ox!ro con las &unciones CREATEOBJECT() o GETOBJECT(). Con CREATEOBJECT() siem#re se crea una nueva instancia del servidor> aun<ue exista una instancia de dic;o servidor. !ara crear una instancia de *ord> Excel 0 Outloo8 se ejecutan las si-uientes &un@ cionesB loWord = CREATEOBJECT('Word.Application') loExcel = CREATEOBJECT('Excel.Application') loOutlook = CREATEOBJECT('Outlook.Application')

Pgina 3

Automatizando Office con Visual FoxPro

Con GETOBJECT() se instancia al servidor de la si-uiente &ormaB loExcel = GETOBJECT( , 'Excel.Application') Si no existe una instancia dis#onible del servidor> el comando &allar5 0 a#arecer5 el Error O(E 2"6'. !ara evitar este error sin im#ortar si existe o no una instancia del servidor> #asamos como #ar5me@ tro el nombre del arc;ivo. loExcel = GETOBJECT('C:\MiPlanilla.xls', 'Excel.Application') !or de&ecto> la instancia del servidor estar5 oculta. !odemos ;acer visible la instancia con la #ro#ie@ dad Visible = .T. Esto lo ;aremos solo #ara ver los cambios <ue #roducimos> -eneralmente en la eta#a de desarrollo> 0a <ue esto ;ar5 m5s lento el #roceso de automatizacin.

El Examinador de O/0etos de Visual FoxPro


A #artir de la versin ) de Visual ox!ro> #odemos dis#oner del JExaminador de ObjetosJ <ue nos #ermite examinar una -ran cantidad de in&ormacin Mtil sobre las #ro#iedades 0 m/todos de cual@ <uier servidor de automatizacin> en este caso de las a#licaciones de %icroso&t O&&ice. El Examinador de Objetos de Visual ox!ro tambi/n nos #ermite ver la ubicacin del arc;ivo de a0uda> con solo ;acer clic en el nodo raAz. El nombre del arc;ivo de a0uda es mostrado en la #arte in&erior del Examinador de Objetos D i-ura 2F. Si el arc;ivo de a0uda se encuentra en la misma car@ #eta de la a#licacin> /ste se mostrar5 como un vAnculo 0 lo #odemos abrir desde allA. Si el arc;ivo de a0uda no se encuentra> el Examinador de Objetos nos indicar5 JGo instaladoJ. Se #uede co#iar el arc;ivo de a0uda a la car#eta de la a#licacin. En el caso de %icroso&t O&&ice ?! en Es#aHol este se encuentra en "C:\Archivos de programa\Microsoft Office\Office10\3082\"

i-ura 2B El Ex#lorador de Objetos de Visual ox!ro Con el Ex#lorador de Objetos> #odemos recorrer las distintas #ro#iedades> eventos 0 m/todos D!E%sF> con la sintaxis corres#ondiente a cada caso D i-ura 6F.

Pgina 4

Automatizando Office con Visual FoxPro

i-ura 6B (os m/todos 0 su sintaxis Con el Examinador de Objetos tambi/n #odemos tener acceso a los valores de las distintas cons@ tantes de cada a#licacin D i-ura 3F.

i-ura 3B (as constantes 0 sus valores

Aprendamos con *ntelli%ense


9no de los cambios m5s llamativos a #artir de la versin ) de Visual ox!ro> es la im#lementacin de IntelliSense. Esta ;erramienta nos #ermite conocer acerca de los objetos> sus m/todos 0 #ro#ie@ dades directamente desde la JVentana de ComandosJ o desde el JEditor de #ro-ramasJ de Visual ox!ro.

Pgina 5

Automatizando Office con Visual FoxPro

9na vez instanciado el objeto desde la JVentana de ComandosJ o declarado desde el JEditorJ> con solo escribir el nombre del objeto nos a#arecer5n sus #ro#iedades 0 m/todos D i-ura "F 0 la sintaxis corres#ondiente D i-ura $F.

i-ura "B (as distintas #ro#iedades 0 m/todos mostrados con IntelliSense

i-ura $B (a sintaxis de un m/todo

El uso de las Macros de Office


9na manera &5cil de comenzar la tarea de automatizacin> es -enerar el cdi-o de automatizacin -rabando una %acro con la a#licacin de O&&ice <ue deseamos automatizar. Esto lo lo-ramos con el J4rabador de %acrosJ <ue recuerda las tareas <ue ejecutamos 0 -enera au@ tom5ticamente un cdi-o en VCA DVisual Casic &or A##licationF.

i-ura 'B 4rabar una macro en *ord

Pgina 6

Automatizando Office con Visual FoxPro

i-ura )B Cdi-o VCA -enerado autom5ticamente !odemos &5cilmente traducir el cdi-o -enerado en VCA a Visual ox!roB ChangeFileOpenDirectory 'D:\Espana\Automation\Documentos\' Documents.Open FileName:='Automation.doc', ConfirmConversions:=False, _ ReadOnly:=False, AddToRecentFiles:=False, PasswordDocument:='', _ PasswordTemplate:='', Revert:=False, WritePasswordDocument:='', _ WritePasswordTemplate:='', Format:=wdOpenFormatAuto El cdi-o en Visual ox!ro <uedarAaB loWord.Documents.Open('D:\Espana\Automation\Documentos\Automation.doc', ; .F., .F., .F., '', '', .F., '', '',wdOpenFormatAuto) (os #asos a se-uir #ara esta traduccin son los si-uientesB Encerrar con #ar/ntesis la lista de #ar5metros Observar una llamada ti#o del m/todo 0 ordenar los #ar5metros en el orden <ue estos a#are@ cen. Nuitar los nombres de los #ar5metros 0 los sAmbolos ':=' =eem#lazar los nombres de constantes #or sus valores> como #or ejem#lo JTrue" con .T. 1. 9na alternativa Dcomo en el ejem#loF es de&inir estos valores conB #DEFINE wdOpenFormatAuto 0 #DEFINE true .T.

Las constantes de Office


Si bien dis#onemos de las ;erramientas como el Examinador de Objetos o IntelliSense #ara &acilitar la tarea de automatizacin> existen otras ;erramientas <ue nos #ermitir5n tener acceso a las cons@ tantes 0 crear &5cilmente un arc;ivo de encabezados DJArc;ivo.;JF #ara de&inirlas 0 utilizarlas direc@ tamente desde Visual ox!ro. 9n ejem#lo de un arc;ivo de encabezados esB #DEFINE olTo #DEFINE olCC #DEFINE olBCC 1 2 3

En Visual ox!ro incluimos un arc;ivo de cabecera con la si-uiente ordenB

Pgina 7

Automatizando Office con Visual FoxPro

#INCLUDE 'Archivo.h' !ara la creacin de estos arc;ivos dis#onemos al menos de dos ;erramientasB Cdi-o en V ! de 7revor Lancoc8 DCase de Conocimientos de %icroso&t> ArtAculo 6+$3.'F dis#onible enB ;tt#B11su##ort.microso&t.com1?scidO6+$3.' !ro-rama de utilidades de =ic8 Stra;l D4etConstantsF dis#onible libremente enB ;tt#B11III.Iest@Iind.com1Iebtools.as#

Com/inar correspondencia con 1ord


En este ejem#lo vamos a abrir> crear 0 com#letar con datos una carta en %icroso&t *ord desde Visual ox!ro> 0 vamos a utilizar una -ran ;erramienta de *ord como lo es JCombinar Corres#on@ denciaJ D%ail %er-eF. (os datos a combinar en este ejem#lo los tomaremos de la base de datos JGort;IindJ. En un caso desde Visual ox!ro 0 en el otro desde un servidor SN( Server 6333.

Definicin de la clase cWord


!ara combinar corres#ondencia dis#onemos de una clase de&inida #or el usuario> llamada c*ord con los m/todos necesarios #ara esta tarea. %iremos las #rimeras lAneas de la de&inicin de esta claseB DEFINE CLASS cWord AS CUSTOM *-- Interfaz de ApplicationEvents2 IMPLEMENTS ApplicationEvents2 IN 'Word.Application' *-* Propiedades *-oWord = .NULL. && Objeto Word ... ... En la de&inicin de la clase c*ord vemos la cl5usula IMPLEMENTS <ue nos es#eci&ica <ue la de&inicin de la clase ;ereda la inter&az de otro com#onente CO% Den este caso *ordF. Esto nos #ermitir5 <ue los eventos de *ord interactMen con el cdi-o de Visual ox!ro. Con ello #odremos controlar> #or ejem#lo si ;acemos la a#licacin visible> cuando el usuario cierra *ord 0 evitar <ue un objeto de Visual ox!ro <uede re&erenciado a este. Cuando im#lementamos una inter&az debemos incluir en la de&inicin de clase todos los m/todos de dic;a inter&az. 9tilizamos el nombre de inter&az como #rinci#io del nombre de los m/todos D#or ejem#lo, ApplicationEvents2_QuitF. AsA evitamos con&lictos entre dos inter&aces <ue conten-an m/todos con el mismo nombre. !ara esta tarea <ue #areciera tan com#leja> usamos el Examinador de Objetos de Visual ox!ro #ara arrastrar 0 colocar una de&inicin de inter&az en el cdi-o 0 a;orrar tiem#o. (a instruccin IMPLEMENTS> junto con los dem5s m/todos im#lementados con sus #ar5metros> PPPse escribir5 auto@ m5ticamenteQQQ !ara vincular los m/todos del servidor con los m/todos de la inter&az im#lementados en el objeto de Visual ox!ro> utilizamos la &uncin EventHandler() #resente desde la versin ) de Visual ox!ro. Este ti#o de vAnculo re<uiere <ue el objeto Visual ox!ro 0 el com#onente CO% est/n activos. Como ex#resamos anteriormente> toda esta im#lementacin en nuestra a#licacin es solo #ara sa@ ber cuando se ejecuta el evento Quit en el servidor de automatizacin. Cuando esto ocurre liberamos el objeto de Visual ox!ro con la si-uiente sentencia en el m/todo

Pgina 8

Automatizando Office con Visual FoxPro

ApplicationEvents2_QuitB THIS.oWord = .NULL.

El programa MailMerge.prg
Este es el cdi-o de nuestro #ro-rama "MailMerge.prg"> en donde creamos una instancia de la clase c*ord 0 comenzamos a ejecutar sus m/todos. LOCAL lo AS OBJECT, loDoc AS OBJECT lo = NEWOBJECT('cWord','cWord.prg') IF lo.CrearServidor() *-- Vinculo los eventos de Word a mtodos del objeto 'lo' IF NOT EVENTHANDLER(lo.oWord, lo) MESSAGEBOX('No se pudo vincular a los eventos de Word', 16, 'Error!' ) ENDIF *-- Maximizo y hago visible lo.oWord.WINDOWSTATE = 1 && wdWindowStateMaximize lo.oWord.VISIBLE = .T. loDoc = lo.AbrirCarta('Carta') lo.GenerarDataSource('CSV') *lo.GenerarDataSource('ODC') lo.CombinarCarta(loDoc) lo.GuardarCarta(loDoc, .T.) *-- Desvinculo los eventos de Word IF NOT EVENTHANDLER(lo.oWord, lo, .T.) MESSAGEBOX('No se pudo desvincular a los eventos de Word', 16, 'Error!' ) ENDIF ELSE MESSAGEBOX('No se pudo instanciar el servidor', 16, 'Error!') ENDIF lo = .NULL. RETURN

Los mtodos en la clase cWord


En #rimer lu-ar invocamos el m/todo CrearServidor() <ue nos crea una instancia de *ord. AnteR riormente vimos <ue #odAamos instanciar a *ord con la &uncinB GETOBJECT('Word.Application') 0 si no existAa una instancia de *ord> sur-e el Error O(E 2"6'. !ara evitar esto> Visual ox!ro + trae un nuevo mecanismo #ara el manejo de errores> im#lemen@ tado mediante el blo<ue de sentencias TRY ... CATCH ... FINALLY. El cdi-o <ue #otencialmente #uede #roducir un error> se aAsla en la cl5usula TRY Destas se #ueden anidarF> 0 cuando el error e&ectivamente ocurre> el control de la ejecucin #asa al cdi-o en la cl5u@ sula CATCH> en el orden <ue a#arecen dentro del blo<ue Den &orma similar a cmo &unciona el DO CASEF. (a cl5usula o#cional FINALLY> se ejecuta> se ;a0a #roducido o no el error. (o novedoso de este mecanismo es <ue siem#re <ue se #roduce un error dentro de un blo<ue TRY ... CATCH ... FINALLY> Visual ox!ro crea un objeto de la nueva clase Exce#tion. *-- Manejo el error con TRY ... CATH ... FINALLY TRY *-- Instancio el objeto THIS.oWord = GETOBJECT( , 'Word.Application') WAIT WINDOW 'Ya existe una instancia de Word...' TIMEOUT 2 CATCH TRY

Pgina

Automatizando Office con Visual FoxPro

*-- Creo el objeto THIS.oWord = CREATEOBJECT('Word.Application') WAIT WINDOW 'Nueva instancia de Word...' TIMEOUT 2 CATCH MESSAGEBOX('Microsoft Word no est instalado.', 16, 'Problemas!!!') FINALLY ENDTRY FINALLY ENDTRY RETURN VARTYPE(THIS.oWord) = 'O' !ara <ue este ejem#lo sea m5s descri#tivo> vamos a ;acer visible a la a#licacin *ord #ara ver #aso a #aso como se ejecutan los distintos m/todos. Esto lo ;acemos en la sentenciaB lo.oword.VISIBLE = .T.

A/rir "2o crear la carta


El m/todo AbrirCarta()> abre la carta de *ord si esta existe o crea una nueva carta con el m/todo CrearCarta(). Ambos m/todos retornan un objeto ,ocument de *ord. PROCEDURE AbrirCarta(tcArchivo) LOCAL loDoc AS 'Word.Document' tcArchivo = FORCEEXT(tcArchivo,'DOC') IF NOT FILE(THIS.cDirDoc + tcArchivo) *-- Si no existe la carta, la creo loDoc = THIS.CrearCarta(tcArchivo) ELSE *-- Si existe la carta, la abro loDoc = THIS.oWord.Documents.OPEN(THIS.cDirDoc + tcArchivo) *-- y me aseguro que no tiene un documento asociado loDoc.MailMerge.MainDocumentType = -1 && wdNotAMergeDocument ENDIF *-- Retorno un objeto Document RETURN loDoc ENDPROC PROCEDURE CrearCarta(tcArchivo) LOCAL loDoc AS 'Word.Document' *-- Creo un nuevo documento loDoc = THIS.oWord.Documents.ADD(,,0) *-- Guardo el documento como... loDoc.SAVEAS(THIS.cDirDoc + tcArchivo) *-- Activo el documento loDoc.ACTIVATE *-- Comienzo a 'escribir' el documento WITH THIS.oWord.SELECTION .FONT.NAME = 'Tahoma' .FONT.SIZE = 10 ... ENDWITH RETURN loDoc ENDPROC En el caso de crear o abrir una carta 0a existente de *ord> estas deben contener los nombres de los cam#os #ara su reem#lazo en la combinacin. Estas cartas ser5n los documentos #rinci#ales #ara la combinacin.

Pgina !"

Automatizando Office con Visual FoxPro

La fuente de los datos


7ambi/n debemos crear o abrir los documentos con los datos a combinar. En este ejem#lo tenemos dos casosB Crear un arc;ivo ti#o CSV DValores Se#arados #or ComasF desde una cl5usula SELECT a la ta@ bla JCustomersJ de la base de datos JGort;IindJ D<ue viene con Visual ox!roF. %ediante una Conexin de ,atos de O&&ice DO,CF 0a existente> traer los datos de la tabla JCustomersJ de la base de datos JGort;IindJ> #ero esta vez desde un servidor SN( Server 6333. !ara esta tarea tenemos el m/todo GenerarDataSource() <ue crea el arc;ivo con los datos 0 esta@ blece la #ro#iedad cDataSource.

Com/inar la carta
En el m/todo CombinarCarta() ejecutamos las si-uientes sentencias #araB Lacer la carta del ti#o ,ocumento !rinci#al. Abrir el arc;ivo con la &uente de datos. Ejecutar la combinacin WITH toDoc.MailMerge .MainDocumentType = 0 && wdFormLetters .OpenDataSource(THIS.cDataSource) .Execute() ENDWITH

!uardar la carta
!ara &inalizar tenemos el m/todo GuardarCarta() <ue -uarda el documento #rinci#al> con la #osibi@ lidad mediante un #ar5metro de cerrar el documento. PROCEDURE GuardarCarta(toDoc, tlCierra) *-- Guardo el documento toDoc.SAVE() IF tlCierra *-- Cierro el documento toDoc.CLOSE() ENDIF ENDPROC En este ejem#lo el documento combinado <ue se -enera <uedar5 abierto> entonces ;acemos la a#li@ cacin visible #ara <ue el usuario lo -uardar directamente de la ventana de *ord. 7ambi/n estable@ cemos la car#eta donde est5n los documentos de este ejem#lo> #ara <ue *ord #or de&ecto la selec@ cione en la ventana de J4uardar...J. WITH THIS.oWord .ChangeFileOpenDirectory(THIS.cDirDoc) .VISIBLE = .T. ENDWITH

!r#ficos " ta/las din#micas con Excel


En nuestras a#licaciones #odemos aumentar el im#acto de los resultados de las consultas> mostran@ do los datos en distintos &ormatos. !ara ello vamos a recurrir a dos -randes ;erramientas de Excel como lo son los -r5&icos 0 las tablas din5micas.

Pgina !!

Automatizando Office con Visual FoxPro

Antes de comenzar a analizar el ejem#lo en Visual ox!ro vamos a com#render al-unos conce#tos #ara #oder ;acer m5s &5cil la automatizacin de Excel desde Visual ox!ro> esto siem#re lo lo-ramos con los arc;ivos de a0uda. 7ambi/n vamos a conocer distintas &ormas <ue dis#onemos #ara #asar los datos de Visual ox!ro a Excel.

Dnde est la ayuda!


!ara tener una idea mas clara acerca de todos los objetos de Excel> debemos siem#re examinar la a0uda dis#onible. !arte de esta a0uda la #odemos encontrar en el tema J=e&erencia Visual Casic de %icroso&t ExcelJ en el arc;ivo de a0uda Jvbaxl23.c;mJ en la car#eta de la instalacin de O&&ice. En esta a0uda #odemos conocer acerca de los objetos dis#onibles en Excel> como #or ejem#lo el objeto C;art D i-ura +F

i-ura +B El Objeto C;art de Excel

"ormas de e#portar los datos de $isual "o#%ro a E#cel


(a &orma mas sim#le> es seleccionar el 5rea de trabajo con datos de Visual ox!ro Destos #ueden estar en una tabla> un cursor o una vistaF 0 ejecutar las ordenes COPY TO ... EXPORT TO ... con los #ar5metros corres#ondientes. Si ele-imos esta manera> solo necesitamos tener activa la a#lica@ cin de Visual ox!ro. SELECT 'MiCursor' COPY TO 'C:\Planilla1' TYPE XL5 EXPORT TO 'C:\Planilla2' TYPE XL5 Otra &orma <ue dis#onemos es usando el m/todo DataToClip() del objeto A##lication de Visual ox!ro D'VisualFoxPro.Application'F. (a variable del sistema _VFP ;ace re&erencia al objeto A##lication de la instancia actual. ,e esta manera co#iamos un conjunto de re-istros como texto al J!orta#a#elesJ. =ecordar <ue el tercer #ar5metro del m/todo DataToClip() debemos con&i-urarlo en 3 #ara <ue los cam#os se delimiten con tabulaciones. SELECT 'MiCursor' GO TOP _VFP.DataToClip(,,3)

Pgina !2

Automatizando Office con Visual FoxPro

9na vez <ue tenemos los datos en el !orta#a#eles> creamos una instancia de Excel desde Visual ox!ro> creamos un nuevo (ibro 0 #e-amos los datos desde el !orta#a#eles con el m/todo Paste(). loExcel = CREATEOBJECT('Excel.Application') loLibro = loExcel.Workbooks.Add() WITH loLibro .Activate() .ActiveSheet.Paste() .SaveAs('C:\Planilla3.xls') ENDWITH loExcel.Visible = .T. STORE .NULL. TO loLibro, loExcel Otra &orma de #asar los datos de Visual ox!ro a Excel> es tener ambas a#licaciones activas 0 reco@ rrer los datos de nuestra tabla 0 escribirlos directamente en una Loja de Excel celda #or celda. Esta o#cin es muc;o m5s lenta <ue las anteriores> #ero es Mtil cuando la ;oja de Excel 0a tiene un &or@ mato establecido o cuando <ueremos escribir &rmulas en la ;oja de Excel. SELECT 'MiCursor' loExcel = CREATEOBJECT('Excel.Application') loLibro = loExcel.Workbooks.Add() loHoja = loLibro.ActiveSheet() lnFil = 1 && Nombres de campos FOR lnCol = 1 TO FCOUNT() loHoja.Cells(1,lnCol).VALUE = FIELD(lnCol) ENDFOR lnFil = lnFil + 1 && Resto de las filas SCAN ALL FOR lnCol = 1 TO FCOUNT() loHoja.Cells(lnFil,lnCol).VALUE = EVALUATE(FIELD(lnCol)) ENDFOR lnFil = lnFil + 1 ENDSCAN loLibro.SaveAs('C:\Planilla4.xls') loExcel.Visible = .T. STORE .NULL. TO loHoja, loLibro, loExcel

Definicin de la clase cE#cel


En esta clase de&inida #or el usuario tendremos los m/todos <ue nos #ermitir5n crear 0 manejar los -r5&icos 0 las tablas din5micas de Excel desde Visual ox!ro. DEFINE CLASS cExcel AS CUSTOM *-* Propiedades *-oExcel = .NULL. ...

Los mtodos de la clase cE#cel


El #rimer m/todo <ue vamos a invocar de esta clase es CrearServidor() <ue establece la #ro#ie@ dad oExcel como una re&erencia a la instancia de Excel creada. THIS.oExcel = CREATEOBJECT('Excel.Application')

Pgina !3

Automatizando Office con Visual FoxPro

Al i-ual <ue en la clase c*ord <ue vimos anteriormente> este m/todo tiene el mismo manejo de errores con el blo<ue TRY ... CATCH ... FINALLY #ara manejar el error O(E 2"6'.

Exportar los datos


!ara ex#ortar nuestros datos de Visual ox!ro a Excel vamos a ele-ir la o#cin de COPY TO ... <ue la ejecutamos en el m/todo ExportarDatos(). PROCEDURE ExportarDatos(tcCursor) LOCAL lcArchivo AS CHARACTER lcArchivo = FORCEEXT(THIS.cDirDoc + tcCursor, 'XLS') *-- Opcin COPY TO ... SELECT (tcCursor) COPY TO (lcArchivo) TYPE XL5 RETURN ENDPROC

A/rir los li/ros exportados


Con el m/todo AbrirLibro() vamos a abrir el libro #ara comenzar con la automatizacin. Este m/@ todo retorna un objeto *or8Coo8 de Excel. PROCEDURE AbrirLibro(tcArchivo) LOCAL loLibro AS 'Excel.Workbook' tcArchivo = FORCEEXT(tcArchivo,'XLS') IF FILE(THIS.cDirDoc + tcArchivo) loLibro = THIS.oExcel.Workbooks.OPEN(THIS.cDirDoc + tcArchivo) ELSE *-- Si no existe el libro loLibro = .NULL. ENDIF *-- Retorno un objeto Workbook RETURN loLibro ENDPROC

!uardar " cerrar el li/ro


Con el m/todo GuardarLibro() vamos a -uardar el libro. Este m/todo tiene un #ar5metro adicional <ue indica si se cierra el libro lue-o de -uardarlo. PROCEDURE GuardarLibro(toLibro, tlCierra) *-- Guardo el Libro toLibro.SAVE() IF tlCierra *-- Cierro el Libro toLibro.CLOSE() ENDIF RETURN ENDPROC

Generar un grfico
A #artir de los resultados de una consulta a las tablas de la base de datos JGort;IindJ> -eneraremos un -r5&ico del ti#o de columnas en 3 dimensiones Dxl3DColumnStackedF como lo vemos en la i-ura .> 0 daremos &ormato a al-unos objetos del -r5&ico> como los tAtulos> los ejes 0 las barras.

Pgina !4

Automatizando Office con Visual FoxPro

i-ura .B 4ra&ico de barras en 3 dimensiones

El pro(rama !rafico&pr(
En este #ro-rama vamos a crear un objeto cExcel 0 ejecutaremos los m/todos vistos anteriormente #ara la creacin del -r5&ico. LOCAL lo AS OBJECT, loLibro AS OBJECT lo = NEWOBJECT('cExcel','cExcel.prg') *-- Genero cursor y exporto datos lo.VtaAnualEmpleado(1997, 'VtaAnualEmpleado') lo.ExportarDatos('VtaAnualEmpleado') IF lo.CrearServidor() *-- Maximizo y hago visible lo.oExcel.WINDOWSTATE = -4137 && xlMaximized lo.oExcel.VISIBLE = .T. *-- Abro el libro copiado loLibro = lo.AbrirLibro('VtaAnualEmpleado') *-- Genero grfico lo.GenerarGrafico(loLibro, 'Ventas Anuales por Empleado (AO 1997)') *--- Grabo planilla y cierro lo.GuardarLibro(loLibro, .T.) *-- Cierro el servidor lo.CerrarServidor() ELSE MESSAGEBOX('No se pudo instanciar el servidor', 16, 'Error!') ENDIF lo = .NULL. RETURN El m/todo GenerarGrafico() de la clase cExcel> es el <ue ;ace la tarea #ro#iamente dic;a. PROCEDURE GenerarGrafico(toLibro, tcTitulo) LOCAL lcRango AS CHARACTER, oGrafico AS 'Excel.Chart', ; loHoja AS 'Excel.WorkSheet' loHoja = toLibro.ActiveSheet lcRango = 'A1:' + CHR(loHoja.UsedRange.COLUMNS.COUNT + 64) + ; ALLTRIM(STR(loHoja.UsedRange.ROWS.COUNT)) loGrafico = THIS.oExcel.Charts.ADD WITH loGrafico

Pgina !5

Automatizando Office con Visual FoxPro

*-- Tipo, rango y localizacin .ChartType = 55 && xl3DColumnStacked .SetSourceData(loHoja.RANGE(lcRango), 2) .Location(1, 'Ventas Anuales') && xlLocationAsNewSheet = 1 *-- Titulo .HasTitle = .T. .ChartTitle.TEXT = tcTitulo WITH .ChartTitle.FONT .NAME = 'Arial' .SIZE = 14 .Bold = .T. ENDWITH *-- Ejes WITH .Axes(1,1) .HasTitle = .T. .AxisTitle.TEXT = 'Empleado' ENDWITH WITH .Axes(2,1) .HasTitle = .T. .AxisTitle.TEXT = '$' ENDWITH *-- Sin Leyendas .HasLegend = .F. *-- Formato 3D .RightAngleAxes = .T. .AutoScaling = .T. *-- Grupo de grfico WITH .ChartGroups(1) *-- Ancho separacin barras .GapWidth = 50 ENDWITH ENDWITH RETURN ENDPROC

Generar una tabla dinmica


Guestro #ro-rama de ejem#lo es "TablaDinamica.prg" <ue crea una instancia de la clase cExcel 0 ejecuta sus m/todos #ara -enerar la tabla din5mica. En nuestro ejem#lo vamos a -enerar una tabla din5mica <ue nos muestra las Ventas Anuales a-ru@ #adas #or !aAs> Em#leado 0 7i#o de !roducto.

i-ura 23B ,iseHo de la tabla din5mica

Pgina !6

Automatizando Office con Visual FoxPro

Con anterioridad a la #ro-ramacin de los m/todos debemos diseHar la &orma de la tabla din5mica <ue deseamos -enerar. El diseHo ele-ido lo observamos en la i-ura 23.

Pro(rama $a/la3inamica&pr(
Este es el cdi-o de nuestro #ro-ramaB LOCAL lo AS OBJECT, loLibro AS OBJECT lo = NEWOBJECT('cExcel','cExcel.prg') *-- Genero cursor y exporto datos lo.VtaAnualPais('VtaAnualPais') lo.ExportarDatos('VtaAnualPais') IF lo.CrearServidor() *-- Maximizo y hago visible lo.oExcel.WINDOWSTATE = -4137 && xlMaximized lo.oExcel.VISIBLE = .T. *-- Abro el libro copiado loLibro = lo.AbrirLibro('VtaAnualPais') *-- Genero tabla dinmica lo.GenerarTablaDinamica(loLibro) *--- Grabo planilla y cierro lo.GuardarLibro(loLibro, .T.) *-- Cierro el servidor lo.CerrarServidor() ELSE MESSAGEBOX('No se pudo instanciar el servidor', 16, 'Error!') ENDIF lo = .NULL. RETURN !ara -enerar la tabla din5mica ejecutamos el m/todo GenerarTablaDinamica() de la clase cExcel. Este m/todo nos -enera la tabla din5mica D i-ura 22F ordenada descendentemente #or las Ventas #or !aAs. PROCEDURE GenerarTablaDinamica(toLibro) LOCAL laPagina(1), laFilas(2), laColumnas(1), lcRango *--- Arrays con los datos de la tabla dinmica laPagina(1)='Anio' laFilas(1)='Pais' laFilas(2)='Empleado' laColumnas(1)='TipoProd' lcRango = 'A1:E1275' WITH THIS.oExcel *--- Formato de los datos hoja principal .Cells.SELECT .SELECTION.COLUMNS.AUTOFIT .COLUMNS('E:E').SELECT .SELECTION.NumberFormat = '$ #,##0.00' .RANGE('A2').SELECT *--- Llamo al generador de Tablas Dinmicas .ActiveSheet.PivotTableWizard(1, lcRango, '', 'TablaDinamica') *--- Armo la Tabla dinmica WITH .ActiveSheet.PivotTables('TablaDinamica') .AddFields(@laFilas, @laColumnas, @laPagina) WITH .PivotFields('Ventas') .ORIENTATION = 4 && xlDataField .NumberFormat = '$ #,##0.00' ENDWITH .PivotFields('Pais').AutoSort(2,'Suma de ventas') && xlDescending = 2

Pgina !7

Automatizando Office con Visual FoxPro

ENDWITH *--- Formato de los datos hoja tabla dinmica .Cells.SELECT .SELECTION.COLUMNS.AUTOFIT .ActiveSheet.NAME = 'Ventas Anuales' .RANGE('A2').SELECT ENDWITH RETURN ENDPROC

i-ura 22B 7abla din5mica -enerada

Otros m4todos auxiliares


En la clase cExcel tambi/n existen otros m/todos> solo v5lidos #ara este ejem#lo. Estos m/todos son VtaAnualPais() 0 VtaAnualEmpleado() utilizados #ara crear los cursores con los datos #ara ex#ortar a Excel. Estos cursores toman los datos de la base de datos JGort;IindJ <ue se encuentra en la car#eta "\Samples\Northwind" de la car#eta de la instalacin ori-inal de Visual ox!ro.

En.iar " leer correo con Outloo5


El modelo de objetos de Outloo8 es mu0 rico 0 #oderoso. Esta inter&az est5 dis#onible como un ser@ vidor de automatizacin> o sea> <ue todo lo #odemos ;acer #or #ro-rama desde Visual ox!ro. Como en temas anteriores> siem#re recurriremos a la a0uda. AllA #odemos ver los distintos objetos de Outloo8 D i-ura 26F.

i-ura 26B (a a0uda de Outloo8 en el arc;ivo Jvbaol23.c;mJ

Pgina !8

Automatizando Office con Visual FoxPro

(o #rimero <ue debemos ;acer #ara automatizar Outloo8> es crear un objeto Outloo8> similar a como vimos anteriormente con las otras ;erramientas de O&&ice. 9na vez creado el objeto> debemos acceder al ori-en de los datos> #ero esto no lo lo-ramos en &orma directa> debemos crear un objeto JGameS#aceJ a#ro#iado <ue actuar5 como entrada Den este ejem#lo %A!IF. El objeto GameS#ace #ro#orciona entre otros> los m/todos (o-on 0 (o-o&&.

$ersiones de &utloo'
Se-uramente conocemos varias versiones de Outloo8> solo daremos las #rinci#ales caracterAsticas de cada uno. Outloo5 Express6 Go es Outloo8> es un #ro-rama com#letamente di&erente 0 no es servidor de automatizacin. Outloo5 78 " 20006 Existen dos versiones> Internet %ail Onl0 DI%OF 0 Cor#orate *or8-rou# DC1*F. Ambas trabajan con Internet %ail> #ero solo Cor#orate *or8-rou# trabaja con la in@ ter&az %A!I. Outloo5 9P6 Combina las versiones Internet %ail 0 Cor#orate *or8-rou#.

(n bre)e e*emplo
9na de las tareas m5s &5cil de automatizar en Outloo8 es el envAo de un correo. Veremos un ejem#lo de solamente unas #ocas lAneas. LOCAL lcPerfil AS CHARACTER, lcContrasenia AS CHARACTER , ; lcDestinatario AS CHARACTER, lcTema AS CHARACTER , ; lcCuerpo AS CHARACTER LOCAL loOutlook AS "Outlook.Application", ; loNameSpace AS OBJECT, loMailItem AS OBJECT #DEFINE LF_CR CHR(10)+CHR(13) *-- Datos del correo lcPerfil = "Prueba" lcContrasenia = "prueba" lcDestinatario = "luismaria@portalfox.com" lcTema = "Prueba" lcCuerpo = "Prueba desde la Conferencia Visual FoxPro Espaa 2003." + LF_CR lcCuerpo = lcCuerpo + "Saludos desde A Corua." + LF_CR *-- Creo objetoa Outlook y NameSpace loOutlook = CREATEOBJECT("Outlook.Application") loNameSpace = loOutlook.GetNameSpace("MAPI") *-- Ejecuto los mtodos loNameSpace.Logon(lcPerfil , lcContrasenia) loMailItem = loOutlook.CreateItem(0) loMailItem.Recipients.ADD(lcDestinatario) loMailItem.Subject = lcTema loMailItem.Body = lcCuerpo loMailItem.SEND loNameSpace.Logoff loNameSpace = .NULL. loOutlook = .NULL.

%roblemas de seguridad
Outloo8 ?! 0 Outloo8 6333 S!6> inclu0en los #arc;es de se-uridad de %icroso&t. Estos #arc;es res@ trin-en> entre otras cosas> el acceso a la libreta de direcciones 0 el envAo de correo mediante auto@ matizacin> con el &in de evitar cdi-os maliciosos <ue toman los datos de nuestra libreta de direc@ ciones 0 envAan correo sin nuestro consentimiento.

Pgina !

Automatizando Office con Visual FoxPro

Cuando intentamos enviar un correo desde Visual ox!ro> se nos #resenta el si-uiente cuadro de dialo-o> <ue lue-o de $ se-undos ;abilita el botn JSiJ D i-ura 23F.

i-ura 23B J...intentando enviar correo...J Cuando intentamos acceder a la libreta de direcciones a#arece el cuadro de dialo-o el cual nos #er@ mitir5 un acceso inmediato> o de 2> 6> $> 23 minutos <ue debemos seleccionar D i-uras 2"F.

i-ura 2"B J...intentando tener acceso a direcciones...J

,: a;ora <ueEstas son al-unas de las o#ciones dis#onemos nosotros #ara trabajar con estos #arc;es de se-uri@ dadB %antener la versin de O&&ice 6333 S=@2 0 no actualizarla ni instalarle #arc;es de se-uridad> con los #eli-ros <ue esto si-ni&ica. Si se tienen Outloo8 0 Exc;an-e instalados> el administrador de Exc;an-e> #uede disminuir las alertas o re-istrar al-unas a#licaciones como se-uras. Outloo8 =edem#tionB Es un objeto CO% <ue se ada#ta &5cilmente a la automatizacin 0 utiliza la %A!I extendida. Esta ,(( &ue escrita #or ,mitr0 Streblec;en8o D%S Outloo8 %V!F 0 esta dis#o@ nible en ;tt#B11III.dimastr.com1redem#tion. Este es un #roducto comercial con un valor de 9SS 633 a#roximadamente. Existe #ara descar-a una versin libre con &ines de desarrollo. Ex#ress Clic8:esB Es un #e<ueHo #ro-rama residente <ue se maneja mediante la A!I de *in@ doIs. Este J#resionar5J el botn JSiJ antes de <ue el dialo-o a#arezca. Este #ro-rama es -ratis 0 esta dis#onible en ;tt#B11III.ex#ress@so&t.com1mailmate1clic80es.;tml. En el mismo sitio existe un ejem#lo #ara Visual ox!ro.

Definicin de la clase c&utloo'


En este ejem#lo dis#onemos de una clase de&inida #or el usuario> llamada cOutloo8 con los distintos m/todos #ara realizar el envAo 0 la lectura de los correos. (a de&inicin de esta clase es la si-uienteB DEFINE CLASS cOutlook AS CUSTOM *-- Heredo la interfaz de _Application Events_10 IMPLEMENTS ApplicationEvents_10 IN 'Outlook.Application' *-- Propiedades

Pgina 2"

Automatizando Office con Visual FoxPro

oOutlook = .NULL. oNameSpace = .NULL. ... ... Como vimos anteriormente en la de&inicin de la clase c*ord> la sentencia IMPLEMENTS nos #ermi@ tir5 interactuar con los eventos de Outloo8 desde Visual ox!ro. Solo #ondremos cdi-o #ara interactuar con el ApplicationEvents_10_Quit()B WITH THIS .oNameSpace = .NULL. .oOutlook = .NULL. ENDWITH evento Quit de Outloo8 en el m/todo

El formulario de e*emplo
En este ejem#lo utilizaremos un &ormulario con un objeto !a-e rame con dos !5-inas> una #ara en@ viar correo 0 la otra #ara leer los correos desde la Candeja de Entrada. En el m/todo Init() creamos una instancia de la clase cOutloo8 0 vinculamos los eventos de Outloo8B THISFORM.oCorreo = NEWOBJECT('cOutlook','cOutlook.prg') IF THISFORM.oCorreo.CrearServidor() *-- Vinculo los eventos de Outlook a mtodos del objeto oCorreo IF NOT EVENTHANDLER(THISFORM.oCorreo.oOutlook, THISFORM.oCorreo) MESSAGEBOX('No se pudo vincular a los eventos de Outllok', 16, 'Error!' ) ENDIF ENDIF 7ambi/n en el m/todo Init() llamamos a un &ormulario #ara el inicio de sesinB DO FORM Inicio WITH THISFORM.oCorreo TO llAceptar IF NOT (llAceptar AND THISFORM.oCorreo.IniciarSesion()) MESSAGEBOX('Fall el inicio sesin', 48, 'Inicio de sesin') RETURN .F. ENDIF

Los mtodos de la clase c&utloo'


En el inicio del &ormulario invoc5bamos al m/todo CrearServidor() <ue establece una re&erencia a la instancia de Outloo8 en la #ro#iedad oOutloo8. THIS.oOutlook = CREATEOBJECT('Outlook.Application') I-ualmente como en las clases anteriores> este m/todo tiene el manejo de errores con el blo<ue TRY ... CATCH ... FINALLY. En este m/todo tambi/n creamos un objeto GameS#ace <ue nos #ermitir5 acceder a las car#etas es#eciales de Outloo8. THIS.oNameSpace = THIS.oOutlook.GetNameSpace('MAPI')

Pgina 2!

Automatizando Office con Visual FoxPro

En.iar un correo
Antes de invocar el m/todo EnviarCorreo()> con&i-uramos todas las #ro#iedades necesarias #ara el envAo de correo. Esto lo ;acemos en el m/todo Click() del botn JEnviarJ. WITH THISFORM.oCorreo .CargarVector(THIS.PARENT.txtTo.VALUE, 'aTO') .CargarVector(THIS.PARENT.txtCC.VALUE, 'aCC') .CargarVector(THIS.PARENT.txtAdjunto.VALUE, 'aAdjuntos') .cTema = ALLTRIM(THIS.PARENT.txtTema.VALUE) .cCuerpo = ALLTRIM(THIS.PARENT.edtCuerpo.VALUE) IF .EnviarCorreo() MESSAGEBOX('Mensaje enviado con xito.', 64, 'Aviso') THISFORM.LimpiarPagina() ELSE MESSAGEBOX('No se pudo enviar el mensaje.', 48, 'Problemas') ENDIF ENDWITH RETURN En el m/todo EnviarCorreo() de la clase cOutloo8 creo un nuevo mensaje 0 lo armo se-Mn las #ro@ #iedades anteriormente con&i-uradas. PROCEDURE EnviarCorreo() LOCAL loMensaje AS OBJECT, llRet AS Logical LOCAL lnI AS INTEGER, lnIndex AS INTEGER *-- Creo un nuevo mensaje WITH THIS loMensaje = .oOutlook.CreateItem(0) IF VARTYPE(loMensaje) = 'O' loMensaje.Subject = .cTema loMensaje.Body = .cCuerpo *-- Recipientes lnIndex = 0 *-- TO lnLen = ALEN(.aTO) FOR lnI = 1 TO lnLen IF NOT EMPTY(.aTO(lnI)) lnIndex = lnIndex + 1 loMensaje.Recipients.ADD(.aTO(lnI)) loMensaje.Recipients(lnIndex).TYPE = 1 ENDIF ENDFOR *-- CC lnLen = ALEN(.aCC) FOR lnI = 1 TO lnLen IF NOT EMPTY(.aCC(lnI)) lnIndex = lnIndex + 1 loMensaje.Recipients.ADD(.aCC(lnI)) loMensaje.Recipients(lnIndex).TYPE = 2 ENDIF ENDFOR *-- BCC lnLen = ALEN(.aBCC) FOR lnI = 1 TO lnLen IF NOT EMPTY(.aBCC(lnI)) lnIndex = lnIndex + 1 loMensaje.Recipients.ADD(.aBCC(lnI)) loMensaje.Recipients(lnIndex).TYPE = 3 ENDIF

Pgina 22

Automatizando Office con Visual FoxPro

ENDFOR *-- Adjuntos lnLen = ALEN(.aAdjuntos) FOR lnI = 1 TO lnLen IF NOT EMPTY(.aAdjuntos(lnI)) AND FILE(.aAdjuntos(lnI)) loMensaje.Attachments.ADD(.aAdjuntos(lnI)) ENDIF ENDFOR llRet = loMensaje.SEND ELSE llRet = .F. ENDIF ENDWITH RETURN llRet ENDPROC

Leer los correos


!ara leer los correos de la bandeja de entrada invocamos el m/todo LeerMensajes() de la clase cOutloo8 desde el m/todo Click() del botn J(eerJ. ZAP IN curMsg IF THISFORM.oCorreo.LeerMensajes(THIS.PARENT.opgTipo.VALUE = 1, 'curMsg') GO TOP IN curMsg THIS.PARENT.grdMensajes.SETFOCUS ELSE MESSAGEBOX('No existen mensajes para traer', 64, 'Aviso') ENDIF THIS.PARENT.edtCuerpo.REFRESH En el m/todo LeerMensajes() creamos un objeto loInbox 0 traemos todos los mensajes> o solo los mensajes JGo leAdosJ 0 recorremos uno a uno #ara car-arlos en un cursor <ue lue-o mostraremos en una 4rilla 0 un Cuadro de Edicin. PROCEDURE LeerMensajes(tlNoLeidos, tcAlias) LOCAL loInbox AS 'Outlook.MAPIFolder', loMensajes AS 'Outlook.Items' LOCAL loMsg AS OBJECT, lnI AS INTEGER, llRet AS Logical IF EMPTY(tcAlias) tcAlias = 'curMsg' ENDIF *-- Inbox loInbox = THIS.oNameSpace.GetDefaultFolder(6) *-- Mensajes del Inbox IF tlNoLeidos loMensajes = loInbox.Items.RESTRICT("[Unread] = True") ELSE loMensajes = loInbox.Items ENDIF IF VARTYPE(loMensajes) = 'O' WITH loMensajes IF .Count > 0 *-- Recorro los mensajes FOR lnI = 1 TO .COUNT loMsg = .ITEM(lnI) WITH loMsg INSERT INTO (tcAlias) ; (EnviadoPor, Tema, Recibido, Cuerpo, NoLeido) ; VALUES (.SenderName, .Subject, .ReceivedTime, .Body, .UnRead) ENDWITH ENDFOR

Pgina 23

Automatizando Office con Visual FoxPro

llRet = .T. ELSE llRet = .F. ENDIF ENDWITH ELSE llRet = .F. ENDIF RETURN llRet ENDPROC

=esumen
En este documento vimos solo al-unos ejem#los de automatizacin de O&&ice. (as #osibilidades son muc;as 0 cada una de#ende de la solucin <ue debemos im#lementar en nuestras a#licaciones. =e@ cuerden <ue todo el #oder <ue nos brindan las distintas ;erramientas de O&&ice> #ueden ser maneja@ das desde Visual ox!ro. Solo es cuestin de ado#tar al-una de las t/cnicas vistas 0 #onerse a tra@ bajar...

Pgina 24

Você também pode gostar