Escolar Documentos
Profissional Documentos
Cultura Documentos
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.
Pgina 2
*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
Pgina 3
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.
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
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.
Pgina 5
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.
Pgina 6
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.
Pgina 7
#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#
Pgina 8
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
Pgina
*-- 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.
Pgina !"
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
Pgina !!
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.
Pgina !2
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
Pgina !3
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'.
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
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
*-- 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
Pgina !6
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
ENDWITH *--- Formato de los datos hoja tabla dinmica .Cells.SELECT .SELECTION.COLUMNS.AUTOFIT .ActiveSheet.NAME = 'Ventas Anuales' .RANGE('A2').SELECT ENDWITH RETURN ENDPROC
Pgina !8
(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 !
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.
,: 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.
Pgina 2"
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
Pgina 2!
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
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
Pgina 23
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