Script to run report and save as attachment

One of my customers asked me to take a kind of snapshot of work orders at a specific point of the workflow to keep track of special approvals and exact situation of the approved record.

I decided to implement such requirement through the implementation of an automation script to generate a BIRT report automatically and attach it the work order. I my scenario I have triggered it from the workflow but it can be also triggered from an escalation.

# Launch Point: WORKORDER - Action
# Generate a BIRT report and save it as an attachment.

from psdi.mbo import Mbo, MboConstants
from psdi.util.logging import MXLoggerFactory
from psdi.server import MXServer

from import ReportAdminServiceRemote
from import ReportParameterData

from import FileOutputStream


logger = MXLoggerFactory.getLogger("")

reportName = "wodetail.rptdesign"    # name of the report to be lauched
appName = "WOTRACK"                  # application
reportFolder = "Attachments"         # folder where the report will be stored


logger.debug("Entering WOREPORTGENSAVE")

wonum = mbo.getString("WONUM")

logger.debug("Retrieving destination file and folder")

doctypesMboSet = MXServer.getMXServer().getMboSet('DOCTYPES', mbo.getUserInfo())
doctypesMboSet.setWhere("DOCTYPE='" + reportFolder + "'")


logger.debug("Output folder: " + outputFilePath)

outputFileName = wonum + "-details.pdf"
outputFile = outputFilePath + "/" + outputFileName

logger.debug("Output file: " + outputFile)
logger.debug("Generating report" + reportName)

# get the handler to BIRT report engine
reportAdminService = MXServer.getMXServer().lookup("BIRTREPORT")

# pass WONUM as report parameter
parameterData = ReportParameterData()
parameterData.addParameter("where", "(WORKORDER.wonum='"+wonum+"')")

reportBytes = reportAdminService.runReport(MXServer.getMXServer().getSystemUserInfo(), reportName, appName, parameterData, outputFileName, ReportAdminServiceRemote.OUTPUT_FORMAT_PDF)

# writes the binary data to the output file
fos = FileOutputStream(outputFile)

logger.debug("Creating DOCLINKS record")

doclinksMboSet = mbo.getMboSet("DOCLINKS")

doclinksMbo = doclinksMboSet.add()

doclinksMbo.setValue("URLTYPE", "FILE")
doclinksMbo.setValue("URLNAME", outputFile)
doclinksMbo.setValue("NEWURLNAME", outputFile)
doclinksMbo.setValue("DOCTYPE", reportFolder)
doclinksMbo.setValue("ADDINFO", True)
doclinksMbo.setValue("DESCRIPTION", "Test Results")
Script to run report and save as attachment

4 thoughts on “Script to run report and save as attachment

  1. Thanks for posting this Bruno… solved a specific business requirement.
    I found I had to modify the parameters line to use the where parameter in the report.
    parameterData.addParameter(“where”, “(WORKORDER.wonum = ‘” + wonum + “‘)”)

    Also had to remove the testtype field (undefined).
    I set the description as the outputFileName (instead of Test Results).

    Overall having your script to work from saved me a ton of time… thank you.

  2. Hi,
    If I want to upload the attachement to network path for example \\\d$\folder\ with username and pssowrd to access the server. How I can do that.

    Please help.

  3. Thanks Bruno, this was very helpful. I added code below to send an email with the generated report as well as any other attachments on the application record.

    #Created report and attaching all documents————————————
    clMbo = mbo.createComm()
    clMbo.setValue(‘TEMPLATEID’, emailTemplateName)

    while docLink is not None:

    commLogDoc.setValue(“docinfoid”,docInfo.getInt(“docinfoid”), mbo.NOACCESSCHECK|mbo.NOVALIDATION)
    commLogDoc.setValue(“urlname”,docInfo.getString(“urlname”), mbo.NOACCESSCHECK|mbo.NOVALIDATION)
    commLogDoc.setValue(“commlogid”,clMbo.getInt(“commlogid”), mbo.NOACCESSCHECK|mbo.NOVALIDATION)
    commLogDocLink.setValue(“ownertable”,’COMMLOG’, mbo.NOACCESSCHECK|mbo.NOVALIDATION)
    commLogDocLink.setValue(“ownerid”,clMbo.getInt(“commlogid”), mbo.NOACCESSCHECK|mbo.NOVALIDATION)
    commLogDocLink.setValue(“doctype”,’Attachments’, mbo.NOACCESSCHECK|mbo.NOVALIDATION)
    commLogDocLink.setValue(“docinfoid”,docInfo.getInt(“docinfoid”), mbo.NOACCESSCHECK|mbo.NOVALIDATION)

    clMbo.setValue(“ISSENDFAIL”, True, MboConstants.NOACCESSCHECK)

Leave a Reply

Your email address will not be published. Required fields are marked *

Scroll to top