ChartBlocks / php-ssrs

PHP library for connecting to SSRS over SOAP
MIT License
25 stars 22 forks source link

Is it possible to retrieve the parameters for a given ssrs report? #25

Closed faridjame closed 6 years ago

faridjame commented 8 years ago

Is it possible to retrieve the required parameters for a given ssrs report?

rb-cohen commented 8 years ago

If you call loadReport() you should get back lots of information on the report, including the parameters. Each parameter should have a required flag on it.

Something like this:

<?php
require(__DIR__ . '/../vendor/autoload.php');

$options = array(
    'username' => 'testing',
    'password' => 'password'
);

$ssrs = new \SSRS\Report('http://localhost/reportserver/', $options);
$result = $ssrs->loadReport('/Reports/Reference_Report');

$parameters = $result->getReportParameters();
oranges13 commented 6 years ago

How do you retrieve conditional parameters? For example: based on the parameter chosen in one field, it updates the available params in another field. I'd prefer to default this value if I can before loading the list of parameters the first time.

Is this possible?

rb-cohen commented 6 years ago

IIRC you have to update the parameters, then grab the 'updated' conditional parameters from SSRS. I don't think you can get a list of everything right off the bat.

It has been a while, but we did something like this, where $knownValues are the default values or the previously submitted values:

$executionParameters = new SSRS_Object_ExecutionParameters($knownValues);
$newExecutionInfo = $ssrs->setExecutionParameters($executionParameters);

$ssrs->setSessionId($newExecutionInfo->ExecutionID);
$newParameters = $newExecutionInfo->getReportParameters();

// here we had a form generator, eventually populating a HTML form based off the available parameters and values
$formGenerator->generate($newParameters);

$output = $ssrs->render('HTML4.0'); // PDF | XML | CSV
oranges13 commented 6 years ago

Thanks for the response. Unfortunately this code doesn't work. Here's the full snippet of what I tried:

This code fails with "Session ID not set"

// You need to connect to the server and load your report
$ssrs = new \SSRS\Report('http://myserver/ReportServer', array('username' => 'user', 'password' => 'password'));
$report = $ssrs->loadReport('/Folder/Report');

// Add execution parameters from submission
$execution_params = new \SSRS\Object\ExecutionParameters($requestedFilters);
$new_report = $ssrs->setExecutionParameters($execution_params);

$ssrs->setSessionId($new_report->ExecutionID);

// Params to send to the form view
$available_params = $new_report->getReportParameters();

Your other examples in the wiki indicate that the session id has to be set in the same statement as the setExecutionParameters but if I use that session ID, the parameters I get at the end are just the defaults, not reflective of the data I sent for the report.

// If I instead use the previous session ID:
$new_report = $ssrs->setSessionId($report->ExecutionID)->setExecutionParameters($execution_params);

// Do not reflect the values submitted
$available_params = $new_report->getReportParameters();

// Just for giggles and grins
$new_report->executionInfo->Parameters; // this is null

Here's an example -- you can see value is null even though I am sending a value and the report executes as if a value has been sent.

array:9 [▼
  0 => ReportParameter {#1181 ▼
    +name: "parForecastDate"
    +value: null
    +data: array:13 [▶]
  }
  1 => ReportParameter {#1555 ▼
    +name: "parMonths"
    +value: null
    +data: array:13 [▶]
  }
  2 => ReportParameter {#1561 ▼
    +name: "parType"
    +value: null
    +data: array:13 [▶]
  }
]

The issue with this is that sending these available parameters to our form builder, and one of them has no options available because it's not showing a value for a dependency.

At this point I'm stumped and I might have to build the form filters manually and just send the data to get the report.

rb-cohen commented 6 years ago

If the execution ID isn't updated any subsequent requests won't reflect your submission. The execution ID from SSRS is like a state marker.

In your example, where you keep the old session ID, you'll get back the state before you submitted anything.

Unfortunately I don't have access to an SSRS server at the moment to run some tests, but the code should work. Here is a fuller example from the snippet I sent, you'll see we keep updating the session ID to the latest execution ID:

$ssrs = new SSRS_Report('http://testing/reportserver/', $options);
$executionInfo = $ssrs->loadReport($reportName);
$ssrs->setSessionId($executionInfo->ExecutionID);

$executionParameters = new SSRS_Object_ExecutionParameters($knownValues);
$newExecutionInfo = $ssrs->setExecutionParameters($executionParameters);

$ssrs->setSessionId($newExecutionInfo->ExecutionID);
$newParameters = $newExecutionInfo->getReportParameters();

// here we had a form generator, eventually populating a HTML form based off the available parameters and values
$formGenerator->generate($newParameters);

$output = $ssrs->render('HTML4.0'); // PDF | XML | CSV

Hopefully that helps a bit? Sounds like its almost there...

oranges13 commented 6 years ago

Hey that works! Gotta love Microsoft and their exacting requirements.

Thank you for your help!

rb-cohen commented 6 years ago

Phew, good to hear! :)