Monday, September 30, 2013

Of Busy Schedules and (busier) Recurring Schedules!!

I was recently asked to create a schedule for multiple reports and jobs. Now, creating the schedule for one report is fairly simple. You login into the portal, navigate to the report that you would like to schedule, set the schedule options, and viola! You are all set.

Creating the schedule for multiple reports posed more of a challenge. I did not want to manually navigate to each report path and edit the schedule for each report when I could whip up a simple script for doing the same automatically. Little did I know that the simple script would turn out to be not-so-simple.

I had a looooooong list of requirements that pretty much included having the entire list of options available on the portal UI such as

  • Having the flexibility of being able to choose which of the output formats (HTML, PDF, XLS 2003, XLS 2007, CSV) would be needed for which report.
  • Having the flexibility of being able to choose if the report should be saved to the file system.
  • Having the flexibility of being able to choose if the report (link or attachment or both) should be emailed, and if yes then the list of email addresses.
  • And of course, the schedule (daily / weekly / monthly), start time, end time, recurrence pattern, etc.

The below code snippets are part of what I use to perform these operations. They are written in VB.NET. Some of the code is taken from the original Cognos SDK sample code. The part that is not, is mine.

Create a new Schedule object

            Dim newSched As New schedule()

Set up options to set the schedule start time and date, frequency / recurrence pattern, etc
These are available as methods under the newSched object which is of class schedule

For the schedule to work, the system has to have valid user credentials. Below code gets the user credentials. That would be the current logged on user through the SDK

getCredential is a function that I wrote to get the credential of the current logged on user

            Dim schedCred As credential = getCredential()
            Dim credentials As New baseClassArrayProp()
            credentials.value = New baseClass() {schedCred}
            newSched.credential = credentials

Save the report output. Note that this saves the output under the same report output and not as a reportView

            saveOutput.name = runOptionEnum.saveOutput
            saveOutput.value = True

Set schedule email options

            Dim deliveryOptionString As New deliveryOptionString
            deliveryOptionString.name = deliveryOptionEnum.subject
            deliveryOptionString.value = reportName

            Dim deliveryOptionAddrSMTPArray As New deliveryOptionAddressSMTPArray
            deliveryOptionAddrSMTPArray.name = deliveryOptionEnum.toAddress
            Dim addrSMTP As addressSMTP() = New addressSMTP(1) {}
            addrSMTP(0) = New addressSMTP
            addrSMTP(0).Value = "email@emailprovider.com"

            addrSMTP(1) = New addressSMTP
            addrSMTP(1).Value = "email2@emailprovider.com"

            deliveryOptionAddrSMTPArray.value = addrSMTP

            Dim deliveryOptionMemoPart As New deliveryOptionMemoPart
            deliveryOptionMemoPart.name = deliveryOptionEnum.memoPart

            Dim memoPart As New memoPartComposite
            memoPart.contentDisposition = smtpContentDispositionEnum.inline
            memoPart.contentType = smtpContentTypeEnum.alternative

            deliveryOptionMemoPart.value = memoPart

            Dim parts As memoPart() = New memoPart(1) {}

            Dim memoPartString As New memoPartString
            memoPartString.contentDisposition = smtpContentDispositionEnum.inline
            memoPartString.text = "Report Body"

            Dim memoPartMIMEAttachment As New memoPartMIMEAttachment
            memoPartMIMEAttachment.contentDisposition = smtpContentDispositionEnum.inline
            memoPartMIMEAttachment.dataType = "text/html"
            memoPartMIMEAttachment.dataSize = "0"

            Dim bArr() As Byte = System.Text.Encoding.UTF8.GetBytes("asdf")

            memoPartMIMEAttachment.data = bArr ' Byte array
            parts(0) = memoPartString
            parts(1) = memoPartMIMEAttachment

            emailAsAttachment.name = runOptionEnum.emailAsAttachment
            emailAsAttachment.value = True

            emailAsUrl.name = runOptionEnum.emailAsURL
            emailAsUrl.value = True

            email.name = runOptionEnum.email
            email.value = True

END Set schedule email options

Once the schedule email options are added, these options need to be added into an array of type 'option'.

Dim opts() As [option] = New [option](5) {}
            opts(0) = emailAsAttachment
            opts(1) = emailAsUrl
            opts(2) = deliveryOptionString
            opts(3) = deliveryOptionAddrSMTPArray
            opts(4) = deliveryOptionMemoPart
            opts(5) = email

Next, this options array will have to be added to the schedule object
           
            Dim schOpts As New optionArrayProp
            schOpts.value = opts
            newSched.options = schOpts

Finally, create a new schedule (or update an existing schedule) for the report / job by using the add method of the contentmanagerservice1 class