Wednesday, August 14, 2019

Refresh DataSource and retain position

Refresh a DataSource is a very common task to Dynamics AX developers, as you'll most likely perform changes on a record and have to present it to the user, on a form.


The most commonly used method to refresh the DataSource to make a form show what you have changed on a record is the research method.
The only problem is that the research method doesn't retain the record that was selected, it positions the DataSource on the first record of the result, causing the user to see another record. To resolve this matter, the research method, only in Dynamics AX 2009, has a boolean parameter, retainPosition. Now if you call it by passing true to it, it will sure retain the position of the selected record after the refresh, right? Wrong...


This should only work when your form has DataSources linked by Inner Joins in it, what means that the generated query has Inner Joins in it. Having any other link types or temporary tables causes it to not retain the position, even if you pass truewhen calling it.

So I'll present you two ways of retaining the position of the selected record, one that works sometimes, and one that always works, although you should always try and see if it works with research(true) before trying anything else.


On the first way, you could simply get the position of the DataSource before calling research(), like this:

?
1
2
3
4
5
6
7
int position;
;
position = myTable_ds.getPosition();
myTable_ds.research();
myTable_ds.setPosition(position);

But does this work perfectly? Not again...

The code above should select the record that was on the previously selected record's position. What does that mean? It means that if your query result changes the record's orders, you won't have the correct record selected. This could easily happen if your form handles the records' order in a special way, or if the action is performed when the record or any records are inserted, which will certainly cause the the form to reorder the records when you tell it to refresh the DataSource.


The second way to do it will actually look for the correct record and then select it, so you can imagine it will perform a little worse than the others, but at least it will never fail (unless you, somehow, delete the record you're looking for in the meantime).


Simply copy the RecId from the record you want to keep selected to a new table buffer, like this:


?
1
2
3
4
5
6
7
8
9
MyTable      myTableHolder;
;
 myTableHolder.RecId = myTableRecord.RecId;
myTable_ds.research(); // or: myTableRecord.dataSource().research();
myTable_ds.findRecord(myTableHolder); // or: myTableRecord.dataSource.findRecord(myTableHolder);    

We copy if to a new table buffer because the findRecord method expects a parameter of type Common. If you stored the RecId in a variable, you would have to pass it to a table buffer anyway...


And that's it, it'll first refresh the DataSource, and then look for your record and select it, so the screen might even "blink" for a second. As I said, this is not the best when thinking about performance, but at least it works...

Wednesday, June 19, 2019

AX2012 Multiple SSRS installs


Multiple SSRS installs
1)      Get your first instance of Dynamics AX with SSRS up and running.
2)      Install an additional SSRS instance.  In the SQL Server 2008 R2 installer be sure to select Installation then New installation or add new features to an existing installation.  On the Feature Selection page select SSRS.  In the Named instance field enter a name for the second instance of SSRS on this machine.  When you select the account that will run SSRS be sure to use the bc proxy account that you will use in the second environment.
3)      Go to Reporting Services Configuration Manager and be sure to connect to your new instance and then finish the setup of this new SSRS instance.  Be sure to give this site a different port than other sites already being used on this machine.
4)      We need to modify four of the SSRS configuration files.  It is recommended that you make backups of these files before you modify them.

The information below assumes the following:
1.            The SSRS Instance is running SQL Server 2008 R2
Note:  The path will differ slightly for non-R2 installations – “C:\Prog~1\SQL\MSR10\MSSQL02”
2.            The SSRS Instance has been installed on the C:\ drive
3.            The SSRS Instance is named “MSSQLSERVER02".

If your path or instance name are different you will need to change that in the instructions below.

a)       Modify the ReportManager's web.config file.  The location should be Location: C:\Program Files\Microsoft SQL Server\MSRS10_50.MSSQLSERVER02\Reporting Services\ReportManager.  In the configuration section you will find an entry for httpRuntime.  Change that entry to look like what is highlighted below.
<configuration>
</>
<system.web>
  </>
    <httpRuntime maxRequestLength="100000" executionTimeout="90000" />
    <securityPolicy>
      <trustLevel name="RosettaMgr" policyFile="rsmgrpolicy.config" />
    </securityPolicy>
  </>
</system.web>


b)      Modify the ReportServer's rsreportserver.config file.  The location should  C:\Program Files\Microsoft SQL Server\MSRS10_50.MSSQLSERVER02\Reporting Services\ReportServer.  In the Configuration section if you have the entry <RSWindowsNegotiate> you need to remove this (it is highlighted in red below).   You will want to add the sections that are in yellow.  Note that you can use the first instance's rsreportserver.config file as a reference because it will have these entries.  Don't just use that instances copy of this file though.  Make the edits in this instances file.

<configuration>
</>
<Authentication>
<AuthenticationTypes>
<RSWindowsNegotiate>
</>
<AuthenticationTypes>
   </Authentication>
<Service>
  </>
     <IsRdceEnabled>True</IsRdceEnabled>
   </Service>
    </>
<Extensions>
  </>
     <Data>
</>
<Extension Name="AXQUERY" Type="Microsoft.Dynamics.Framework.Reports.AxQueryConnection,Microsoft.Dynamics.Framework.ReportsExtensions, Version=6.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
<Extension Name="AXDATAMETHOD" Type="Microsoft.Dynamics.Framework.Reports.AxDataMethodConnection,Microsoft.Dynamics.Framework.ReportsExtensions, Version=6.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
<Extension Name="AXREPORTDATAPROVIDER" Type="Microsoft.Dynamics.Framework.Reports.AxReportProviderConnection,Microsoft.Dynamics.Framework.ReportsExtensions, Version=6.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
<Extension Name="AXADOMD" Type="Microsoft.Dynamics.Framework.Reports.AxAdomdConnection,Microsoft.Dynamics.Framework.ReportsExtensions, Version=6.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
<Extension Name="AXENUMDATAPROVIDER" Type="Microsoft.Dynamics.Framework.Reports.EnumProviderConnection,Microsoft.Dynamics.Framework.ReportsExtensions, Version=6.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
     </Data>
</>
<ReportDefinitionCustomization>
   <Extension Name="AXRDCE" Type="Microsoft.Dynamics.Framework.Reports.AxRdce.CustomizationExtension,Microsoft.Dynamics.Framework.ReportsExtensions, Version=6.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
</ReportDefinitionCustomization>
   </Extensions>
</configuration>
 

c)       Modify the ReportServer's rssrvpolicy.config file.  It should be located at Location: C:\Program Files\Microsoft SQL Server\MSRS10_50.MSSQLSERVER02\Reporting Services\ReportServer.  Add the material that is highlighted below.  I would use the original report servers configuration file as a guide when updating this one.

<configuration>
  <mscorlib>
    <security>
      <policy>
        <PolicyLevel version="1">
          <SecurityClasses>
          </>
            <SecurityClass Name="AxSessionPermission" Description="Microsoft.Dynamics.Framework.Reports.AxSessionPermission, Microsoft.Dynamics.Framework.Reports, Version=6.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
          </SecurityClasses>
         <NamedPermissionSets>
         </>
          <PermissionSet class="NamedPermissionSet" version="1" Name="AxSessionPermissionSet">
              <IPermission class="AxSessionPermission" version="1" Unrestricted="true" />
              <IPermission class="SecurityPermission" version="1" Flags="Assertion" />
            </PermissionSet>
          </NamedPermissionSets>
         <CodeGroup class="FirstMatchCodeGroup" version="1" PermissionSetName="Nothing">
         </>
          <CodeGroup class="UnionCodeGroup" version="1" PermissionSetName="FullTrust" Name="AX_Reports_Strong_Name" Description="This code group grants Dynamics AX Reports code full trust. ">
             <IMembershipCondition class="StrongNameMembershipCondition" version="1" PublicKeyBlob="0024000004800000940000000602000000240000525341310004000001000100B5FC90E7027F67871E773A8FDE8938C81DD402BA65B9201D60593E96C492651E889CC13F1415EBB53FAC1131AE0BD333C5EE6021672D9718EA31A8AEBD0DA0072F25D87DBA6FC90FFD598ED4DA35E44C398C454307E8E33B8426143DAEC9F596836F97C8F74750E5975C64E2189F45DEF46B2A2B1247ADC3652BF5C308055DA9" />
          </CodeGroup>
        </CodeGroup>

d)      Modify the ReportServer's web.config file.  It should be located at C:\Program Files\Microsoft SQL Server\MSRS10_50.MSSQLSERVER02\Reporting Services\ReportServer.  Add the material that is highlighted below.  I would use the original report servers configuration file as a guide when updating this one.

<configuration>
</>
<system.web>
  </>
       <httpModules>
       </>
        <add name="AxReportsHttpModule" type="Microsoft.Dynamics.Framework.Reports.AxReportsHttpModule,Microsoft.Dynamics.Framework.ReportsExtensions, Version=6.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
       </httpModules>
       <globalization requestEncoding="utf-8" responseEncoding="utf-8" />
       <httpRuntime maxRequestLength="100000" executionTimeout="90000" />
       <securityPolicy>
        <trustLevel name="RosettaSrv" policyFile="rssrvpolicy.config" />
       </securityPolicy>
       </>
  </>
<hostingEnvironment shadowCopyBinAssemblies="true" />
</system.web>


5)      You will now need to restart SSRS.  After it is restarted be sure to try to access the Report Server website and Report Manager website and that they come up.
6)      Create a new Client Configuration in the Configuration Utility.
a.       Be sure to give it a name that you will remember what it is for such as DAXDev.
b.       Verify that the AOS connection information is set correctly for this environment.
c.       On the Connection tab of the Configuration utility click on the refresh button.


Important:  This step will be necessary anytime there is a change to the WCF Service Endpoints.
d.       Export the Configuration file and save it to the Report Server's bin directory of your new SSRS instance and use the name “Microsoft.Dynamics.AX.ReportConfiguration.axc”.
Important:  The file must have the name “Microsoft.Dynamics.AX.ReportConfiguration.axc” to be recognized by the SSRS framework.
7)    Create an SSRS binding.  Complete the following procedure to add another Reporting Services instance binding using the Report Servers configuration dialog in Microsoft Dynamics AX.
a.     Click System administration > Setup > Business intelligence > Reporting Services > Report servers.
b.    In the Configuration ID field, enter a name that will identify the Reporting Services and AOS instances that you are connecting.
c.     In the Description field, enter a brief description to help you identify the Reporting Services and AOS instances.
d.    Select the Default configuration check box if the Reporting Services instance specified in this configuration is the default report server.
e.     On the Reporting Server information tab, enter the following information about the Reporting Services instance:
                                          i.    Enter the name of the server computer running Reporting Services.
                                        ii.    Enter the name of the Reporting Services instance for the second instance.
                                        iii.    Enter the Report Manager URL. By default, the URL is http://ServerName/Reports02.
                                        iv.    Enter the URL of the Reporting Services web service. By default, the URL is http://ServerName/ReportServer02.
                                         v.    Enter a name for a report folder. This report folder will be created for you in Reporting Services.
f.      On the Application Object Server information tab, select an AOS instance.
g.    Click the Create report folder button to create the report folder.
h.    Click Validate settings to verify that the information you entered in this form is correct and to verify that the report folder has been created.
If the validation fails, do the following:
                                          i.    Verify the name of the report server in the Server name field.
                                         ii.    Verify that Reporting Services is running.
                                        iii.    Verify in IIS (on the report server) that the DefaultAppPool is running.
                                        iv.    If you are using SSL on your report server, verify that the SSL certificate is stored in the certificate store for the local computer. For more information, see the IIS documentation.
Note:  Alternatively, you can use the Set_AXReportServerConfiguration PowerShell command to create the new SSRS configuration entry.

8)    Deploy the SSRS reports.  The site http://technet.microsoft.com/en-us/library/dd309703.aspx talks about this.
9)    Revert to the original configuration.  At this point, you’ll want to clear out the temporary configuration in the AX Configuration dialog. This will prevent the original SSRS Instance from being affected by the AOS configuration changes made for the new SSRS Instance.
a.     Launch the Dynamics AX Server Configuration utility located under Start > Administrative Tools > Microsoft Dynamics AX 2012 Configuration.  Select the original configuration to enable the original SSRS Configuration.