Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Multiselect from Ax 2012 Listpage (EP) to downloadDocument.aspx

I have been struggling with this for a while now and can't seem to find a solution for my problem. I would really like some help here if possible, it would mean a great deal to me.

I'm currently running a listpage from ax 2012 on a Enterprise portal site that allows users to select an invoice and then click a button that starts downloading a generated PDF of the invoice. It looks like this: enter image description here

The button EpDocuGetMenuitem (output menu item) refers to a URL webMenuItem that starts the static file downloadDocument.aspx.

downloadDocument.aspx gets the Websession and axaptasession and extracts a single record that was selected in the Ax ListPage. downloadDocument.aspx has the following code:

<%@ Page Language="C#" Trace="false" %>
<%@ Assembly Name="Microsoft.Dynamics.Framework.Portal, Version=6.2.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, Custom=null" %>
<%@ Assembly Name="Microsoft.Dynamics.Framework.Data.Ax, Version=6.2.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, Custom=null" %>
<%@ Assembly Name="Microsoft.Dynamics.Framework.BusinessConnector, Version=6.2.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, Custom=null" %>
<%@ Assembly Name="Microsoft.Dynamics.Framework.BusinessConnector.Proxy, Version=6.2.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, Custom=null" %>
<%@ Assembly Name="Microsoft.Dynamics.Framework.Metadata.AX, Version=6.2.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, Custom=null" %>
<%@ Import Namespace="Microsoft.Dynamics.Framework.Portal" %>
<%@ Import Namespace="Microsoft.Dynamics.Framework.Portal.UI" %>
<%@ Import Namespace="Microsoft.Dynamics.AX.Framework.Portal.Data" %>
<%@ Import Namespace="Microsoft.Dynamics.Framework.BusinessConnector.Proxy" %>
<%@ Import Namespace="Microsoft.Dynamics.Framework.BusinessConnector.Session" %>
<%@ Import Namespace="Microsoft.Dynamics.Framework.BusinessConnector.Adapter" %>
<%@ Import Namespace="Microsoft.Dynamics.AX.Framework.Services.Client" %>
<%@ Register TagPrefix="dynamics" TagName="EPSecurityControl" src="EPSecurityControl.ascx" %>
<dynamics:EPSecurityControl ID="AxEPSecurity" runat="server" /> 
<script runat="server">
    void Page_Load(object sender, EventArgs e)
    {
        AxSharepointWebSession session = null;
        try
        {
            session = SessionHelper.Instance.GetSharepointSession();

            if (session != null)
            {
                using (EPDocuGet doc = new EPDocuGet(session.AxaptaAdapter))
                {
                    // EPDocuGet writes directly to the output stream
                    AxQueryString query = new AxQueryString(this.Request);
                    if (query.RecordContext != null)
                    {
                        AxTableContext tableContext = AxTableContext.Create(session, query);
                        if(tableContext != null && tableContext.DataKey != null)
                        {
                            using (IAxaptaRecordAdapter record = tableContext.DataKey.GetRecords(session))
                            {
                                if (tableContext.TableId == TableMetadata.TableNum("DocuRef"))
                                {
                                    doc.runDownload(record);

                                }
                                else
                                {
                                    // Run a report using the Client SDK UserImpersonationContext to revert the credentials from EP application pool to the authenticated user
                                    using (new UserImpersonationContext())
                                    {
                                        doc.runDownload(record);
                                    }
                                }
                            }
                        }
                    }
                }

                Response.Flush();
            }
        }
        catch (System.Exception)
        {
            // Current design is to not display errors to the user

            // Errors are stored in the event log for review by the site operator
        }
        finally
        {
            if (session != null)
            {
                SessionHelper.Instance.ReleaseSharepointSession(session);
            }
        }
    }
</script>

and the interesting part of the file is this code:

using (EPDocuGet doc = new EPDocuGet(session.AxaptaAdapter))
{
    // EPDocuGet writes directly to the output stream
    AxQueryString query = new AxQueryString(this.Request);
    if (query.RecordContext != null)
    {
        AxTableContext tableContext = AxTableContext.Create(session, query);
        if (tableContext != null && tableContext.DataKey != null)
        {
             using (IAxaptaRecordAdapter record = tableContext.DataKey.GetRecord(session))
             {
                 if (tableContext.TableId == TableMetadata.TableNum("DocuRef"))
                 {
                       doc.runDownload(record);
                 }
                 else
                 {
                      // Run a report using the Client SDK UserImpersonationContext to revert the credentials from EP application pool to the authenticated user
                      using (new UserImpersonationContext())
                      {
                           doc.runDownload(record);
                      }
                 }
             }
        }
    }
}

The goal here is to get all the selected records accessible in downloadDocument.aspx. I have enabled multi select in Ax so I guess it should be possible to get all the records somehow. I assume this snippet should be different somehow

IAxaptaRecordAdapter record = tableContext.DataKey.GetRecord(session)

But I can't figure it out.

If I can get all the records in the downloadDocument.aspx file I could send a string back to ax to create the necessary documents and send them to the user.

Any suggestions on how to do this??

like image 853
Heygar Avatar asked Sep 11 '25 00:09

Heygar


1 Answers

I had a similar requirement some time ago.Try using this snippet. Note that this calls the ax method for each marked line.There might be a more efficient way to send the dataSet as a whole.

 IReadOnlySet<DataSetViewRow> rows     = this.ds_yourDSName.GetDataSourceView("YourDSName").DataSetView.GetMarkedRowsSet();
 IEnumerator<DataSetViewRow> enumRows  = rows.GetEnumerator(); 


        while (enumRows.MoveNext())
        {
            //code to get fields needed
            //call to a static ax method to send the fields as parms
            this.AxSession.AxaptaAdapter.CallStaticClassMethod("ClasName","MethodName", parm1, parm2);
        }

        DialogHelper.Close(CloseDialogBehavior.RefreshDataSource);
like image 155
Nikolay Georgiev Avatar answered Sep 12 '25 14:09

Nikolay Georgiev