Microsoft KB Archive/895277

= How to generate and then e-mail a report by using Visual FoxPro 9.0 =

Article ID: 895277

Article Last Modified on 3/28/2005

-

APPLIES TO


 * Microsoft Visual FoxPro 9.0 Professional Edition

-





INTRODUCTION
Microsoft Visual FoxPro 9.0 introduces object-assisted reporting architecture. One benefit of this new design is the ability to directly interact with Visual FoxPro 9.0 reporting tools by using code. For example, you can interact with the Report Designer, report output, and report previews. The new ReportListener base class has been introduced to interact with report output. This article describes how to use the ReportListener class to output a report as an HTML page. Then, you can use automation of Microsoft Office Outlook to e-mail the HTML page.



MORE INFORMATION
The ReportListener class provides object-based assistance to the REPORT FORM and LABEL FORM commands. When the VFP9 Report Engine processes a report in object-assisted mode, it does not directly send the output to a printer or preview device. Instead, it sends information to a ReportListener object first. The ReportListener object &quot;listens&quot; for these instructions. Then, it must evaluate and render the content of your report appropriately for your output device. Therefore, you can &quot;hook into&quot; the report processing. Then, you can use code to directly affect elements of the report. A report can have multiple ReportListener objects. You can design each ReportListener object to perform a different function. For example, multiple ReportListener objects may be used to produce multiple types of output during a single report run. These ReportListener objects may also be used to perform secondary tasks. For example, the objects may be used to compress and to e-mail a report. Report enhancement possibilities are almost limitless with ReportListener objects.

When you run the code that is in this article, the sample report file that is named Colors.frx runs. Colors.frx is included with Visual FoxPro 9.0. The code outputs the report to an HTML page. Then, the code sends the HTML page through e-mail by using automation of Microsoft Outlook. Depending on specific settings, the report is added to the e-mail message in one of the following ways:
 * The report is embedded in an HTML-based e-mail message. The report is embedded in the body of the message.
 * The report is sent as a compressed attachment together with the message.

The following conditions must be true for this code to work as-is:  You must have Microsoft Outlook installed on your Visual FoxPro 9.0 development computer. Also, Microsoft Outlook must be configured correctly to send and to receive e-mail. To test the compression and attachment part of the code, you must obtain Cabarc.exe. Cabarc.exe is a command-line tool that lets users create, query, and extract CAB files. Cabarc.exe is available in the Microsoft Cabinet Software Development Kit. It is also availabe in other packages and SDKs from Microsoft. For more information about the Microsoft Cabinet Software Development Kit, click the following article number to view the article in the Microsoft Knowledge Base:

310618 Microsoft Cabinet Software Development Kit

Note Cabarc.exe is just one of many options for compressing files by using code. It is used in this example for demonstration purposes only. For additional information about the redistribution of Cabarc.exe, see the Redist.txt file that is included with the Microsoft Cabinet Software Development Kit.

To use this code, follow these steps:  In Visual FoxPro 9.0, copy the following code to a new program file. Change the following variables at the start of the code:  Set the value of the lcMailTo variable to your own e-mail address. Set the value of the llSendAsAttachment variable. For additional information, see the following table. </li></ul> </li> Save the code. Note where you saved the code.</li> Note This step is optional.

If you want to test the compression and the attachment of the report, the Cabarc.exe file must be in the same folder as the Visual FoxPro 9.0 program that you saved in step 3. To copy the Cabarc.exe file to this folder, follow these steps: <ol style="list-style-type: lower-alpha;"> Locate the Cabarc.exe file in the Bin subfolder where the Microsoft Cabinet Software Development Kit was uncompressed.</li> Copy the file to the folder where you saved the sample code in step 3.</li></ol> </li> Run the code.</li></ol>

If you set the value of the lcMailTo variable to your own e-mail address, the report should be in a new e-mail message in Outlook. If you experience any problems, set the llShowReportProgress_Errs variable in the code to a value of .T.. When you do this, any errors that occur when you use the ReportListener class are reported. *---
 * AUTHOR: Trevor Hancock
 * CREATED: 03/01/05 02:31:14 PM
 * ABSTRACT: Sample code for Microsoft
 * Knowledge Base article 895277.
 * Demo of sending a report
 * to a .HTML file and then e-mailing it
 * by using Outlook automation
 * and chained ReportListener objects.
 * 1) DEFINE HTML_Listener  5
 * 1) DEFINE HTML_Listener  5

LOCAL lcThisDir AS STRING, ; loHTMLRL AS ReportListenenr, ; loMailerRL AS ReportMailer OF SYS(16), ; lcMailTo AS STRING, ; lcMailSubjectLine AS STRING, ; lcReport AS STRING, ; llSendAsAttach AS Boolean, ; llShowReportProgress_Errs AS Boolean


 * -- Set up some variables.

lcThisDir = ADDBS( JUSTPATH( SYS( 16 ) ) ) loHTMLRL = NULL loMailerRL = NEWOBJECT( 'ReportMailer' ) lcMailTo = '' lcMailSubjectLine = ; 'Report generated and e-mailed by Visual FoxPro 9.0!' lcReport = HOME + ; 'Samples\Solution\Reports\colors.frx' llSendAsAttachment = .F. llShowReportProgress_Errs = .F.
 * -- Set the path of the folder that this program is in.
 * -- This variable holds the object reference to an HTML ReportListener object.
 * -- This variable is a second ReportListener object that is responsible for e-mail.
 * -- This ReportListener object is defined later in the program.
 * -- This variable is the e-mail address of the person that you want to receive the report.
 * -- For example, someone@example.com.
 * -- This variable is the subject line for the e-mail.
 * -- Report to e-mail.
 * -- This variable controls whether the report is
 * -- sent embedded in the HTML body of the
 * -- e-mail message (.F.) or is sent as a .CAB file
 * -- attachment (.T.)
 * -- This variable is used to set the QuietMode
 * -- property of the HTML ReportListener object. When the
 * -- QuietMode property is set, no report progress or error messages
 * -- are displayed. Set the property to on (.T.) during development. Then, set
 * -- the property to off (.F.) when you are finished. This reduces the need for
 * -- any user interaction.

CD ( lcThisDir ) ERASE TEST.HTM
 * -- Set the current folder, and then clean up a bit.

IF EMPTY( lcMailTo ) MESSAGEBOX(      'Please specify an e-mail address by ' + ;        'setting the &quot;lcMailTo&quot; variable in the program.',0,'No Destination') RETURN .F. ENDIF
 * -- This code performs error checking.

IF llSendAsAttachment AND !FILE('CabArc.exe') MESSAGEBOX(      'Cabarc.exe is required in the same ' + ;        'folder as this program to e-mail the report ' + ;        'as an attachment. For additional information, see the Knowledge Base article.', ;        0,'Cabarc.exe is missing') RETURN .F. ENDIF

DO (_REPORTOUTPUT) WITH HTML_Listener, loHTMLRL
 * -- Run the application that is registered to handle report
 * -- output. Then, ask it to store a ReportListener
 * -- object reference to the loHTMLRL variable.
 * -- The application knows that we want an HTML ReportListener object because
 * -- the first parameter, HTML_Listener, equals 5.
 * -- The HTML_Listener parameter is defined at the start of this code.

WITH loHTMLRL *-- Tell the object where to put the .htm file. .TargetFileName = lcThisDir + 'TEST.HTM' *-- Setting the QuietMode property tells the object not to prompt with any dialog boxes. *-- Warning: This setting also disables error reporting. .QUIETMODE = IIF(llShowReportProgress_Errs, .F., .T.) *-- Set the successor to the ReportMailer *-- ReportListener object that is defined later in this program. *-- By doing this, the code tells the Report Engine to   *-- process instructions in the ReportMailer ReportListener object *-- after the instructions in this listener. .Successor = loMailerRL ENDWITH
 * --Set up the HTML ReportListener object.

WITH loMailerRL .Report2Mail = lcThisDir + 'TEST.HTM' .SendReportasAttachment = llSendAsAttachment .MailSubject = lcMailSubjectLine .MailTo = lcMailTo ENDWITH
 * -- Set up the e-mail ReportMailer ReportListener object.

REPORT FORM ( lcReport ) OBJECT loHTMLRL
 * -- Run the report by using the HTML ReportMailer ReportListener object.
 * -- First, an HTML file is created. Then, the second ReportMailer ReportListener object
 * -- (loMailerRL) is used. In the UnloadReport event
 * -- of that object, the report is e-mailed.

RELEASE loHTMLRL, loMailerRL


 * -- Warning: This code only contains light error trapping.
 * 1) DEFINE olMailItem 0
 * -- Warning: This code only contains light error trapping.
 * 1) DEFINE olMailItem 0

DEFINE CLASS ReportMailer AS REPORTLISTENER Report2Mail = '' SendReportasAttachment = .F.   MailSubject = '' MailTo = ''

PROCEDURE UNLOADREPORT IF !FILE( THIS.Report2Mail ) DODEFAULT RETURN ENDIF

LOCAL loOutlook AS Outlook.APPLICATION, ; loMsg AS Outlook.MESSAGE

ERASE ( THIS.Report2Mail ) ERASE 'REPORT.CAB'

loOutlook = CREATEOBJECT( 'Outlook.Application' ) loMsg = loOutlook.CreateItem( olMailItem ) WITH loMsg .Recipients.ADD( THIS.MailTo ) .Subject = THIS.MailSubject

IF THIS.SendReportasAttachment *-- Run Cabarc.exe to make a CAB file. RUN cabarc N REPORT.cab TEST.HTM IF !FILE('Report.cab') DODEFAULT RETURN ENDIF .Attachments.ADD(                  JUSTPATH( THIS.Report2Mail ) + ;                    '\Report.cab' ) ELSE .HTMLBody = FILETOSTR( THIS.Report2Mail ) ENDIF

.SEND ENDWITH

RELEASE loMsg, loOutlook ERASE ( THIS.Report2Mail ) ERASE 'REPORT.CAB' DODEFAULT ENDPROC ENDDEFINE

Additional query words: VFP9

Keywords: kbhowto kbcodesnippet kbautomation KB895277

-

[mailto:TECHNET@MICROSOFT.COM Send feedback to Microsoft]

© Microsoft Corporation. All rights reserved.