item.use = "[great_outdoors_company].[Years].[Years].[Year]->:[PC].[@MEMBER].[20050101-20051231]";
item.inclusive = true;
drillOptionParameterValues d1 = new drillOptionParameterValues();
d1.name = drillOptionEnum.down;
d1.value = parameters;
drillOptions[0] = d1;
{
if (this.rptService == null)
{
this.rptService = rptService;
}
String reportPath = "/content/package[@name='Great Outdoors Company']/report[@name='MyTestReport']";
String savePath = "c:\\temp";
parameterValue[] parameters = new parameterValue[1];
asynchReply response;
searchPathSingleObject reportPathObj = new searchPathSingleObject();
reportPathObj.Value = reportPath;
try
{
option[] runOptions = new option[6];
                runOptionBoolean saveOutput = new runOptionBoolean();
                saveOutput.name = runOptionEnum.saveOutput;
                saveOutput.value = false;
                runOptions[0] = saveOutput;
                // Specify the output format.
                runOptionStringArray outputFormat = new runOptionStringArray();
                outputFormat.name = runOptionEnum.outputFormat;
                outputFormat.value = new String[] { "HTML" };
                 runOptions[1] = outputFormat;
                //Set the report not to prompt as we pass the parameters if any
                runOptionBoolean rop = new runOptionBoolean();
                rop.name = runOptionEnum.prompt;
                 rop.value = false;
                runOptions[2] = rop;
                runOptionInt maxRows = new runOptionInt();
                maxRows.name = runOptionEnum.verticalElements;
                maxRows.value = 20;
                runOptions[3] = maxRows;
                option[] drillOptions = new option[1];
                drillOptionParameterValues d1 = new drillOptionParameterValues();
                d1.name = drillOptionEnum.down;
                 d1.value = parameters;
                drillOptions[0] = d1;
                //Set the option to always have the primaryRequest in the response 
                asynchOptionBoolean includePrimaryRequest = new asynchOptionBoolean();
                includePrimaryRequest.name = asynchOptionEnum.alwaysIncludePrimaryRequest;
                includePrimaryRequest.value = true;
                runOptions[4] = includePrimaryRequest;
                runOptionLanguageArray roOutputFormat = new runOptionLanguageArray();
                roOutputFormat.name = runOptionEnum.outputLocale;
                String[] fmt = { "en-us" };
                roOutputFormat.value = fmt;
                 runOptions[5] = roOutputFormat;
                //Run the report
                response = this.rptService.run(reportPathObj, new parameterValue[] { }, runOptions);
                //If response is not immediately complete, call wait until complete
                 if (!(response.status == (asynchReplyStatusEnum.complete)))
                {
                    while (!(response.status == asynchReplyStatusEnum.complete))
                    {
                        //before calling wait, double check that it is okay
                         if (hasSecondaryRequest(response, "wait"))
                        {
                            response =
                             this.rptService.wait(
                               response.primaryRequest,
                                new parameterValue[] { },
                               new option[] { });
                        }
                        else
                        {
                            Console.Write("Error: Wait method not available as expected.");
                             return;
                        }
                    }
                    //check if output is ready
                    if (outputIsReady(response))
                    {
                        response =
                         this.rptService.getOutput(response.primaryRequest, new parameterValue[] { },
                           new option[] { });
                    }
                    else
                    {
                        Console.Write("output is not ready!");
                    }
                 }
                String data = getOutputPage(response);
                // Write the report output to file system
                Console.Write("Writing the output of the original report..");
                StreamWriter sw = File.CreateText(savePath + "\\original.html");
                sw.Write(data);
                sw.Flush();
                sw.Close();
                //Drill down in the report
                //set up drill down parameter.
                simpleParmValueItem item = new simpleParmValueItem();
                item.use = "[great_outdoors_company].[Years].[Years].[Year]->:[PC].[@MEMBER].[20050101-20051231]";
                 item.inclusive = true;
                parmValueItem[] pvi = new parmValueItem[1];
                pvi[0] = item;
                parameters[0] = new parameterValue();
                parameters[0].name = "Year";
                parameters[0].value = pvi;
response = this.rptService.drill(response.primaryRequest, parameters, drillOptions);
                if (!(response.status == (asynchReplyStatusEnum.complete)))
                {
                    while (!(response.status == asynchReplyStatusEnum.complete))
                    {
                        //before calling wait, double check that it is okay
                         if (hasSecondaryRequest(response, "wait"))
                        {
                            response =
                             this.rptService.wait(
                               response.primaryRequest,
                                new parameterValue[] { },
                               new option[] { });
                        }
                        else
                        {
                            Console.Write("Error: Wait method not available as expected.");
                             return;
                        }
                    }
                    //check if output is ready
                    if (outputIsReady(response))
                    {
                        response =
                         this.rptService.getOutput(response.primaryRequest, new parameterValue[] { },
                           new option[] { });
                    }
                    else
                    {
                        Console.Write("output is not ready!");
                    }
                 }
                data = getOutputPage(response);
                // Write the report output to file system
                Console.Write("Writing the output of the drill down report..");
                StreamWriter sw2 = File.CreateText(savePath + "\\drilldown.html");
                sw2.Write(data);
                sw2.Flush();
                sw2.Close();
                // release the conversation to free resources.
                this.rptService.release(response.primaryRequest);
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error: " + ex.Message.ToString());
                Console.WriteLine(ex.StackTrace);
            }
        }
 

