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:
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??