Multiselect от страницы списка Axe 2012 (EP) для скачивания Document.aspx
Я боролся с этим некоторое время и не могу найти решение своей проблемы. Я бы очень хотел помочь, если это возможно, для меня это очень много значит.
В настоящее время я запускаю страницу списка от ax 2012 на сайте корпоративного портала, которая позволяет пользователям выбрать счет-фактуру и затем нажать кнопку, которая начинает загрузку сгенерированного PDF-счета. Это выглядит так:
Кнопка EpDocuGetMenuitem
(пункт меню вывода) относится к URL-адресу webMenuItem, который запускает статический файл downloadDocument.aspx
,
downloadDocument.aspx
получает Websession и axaptasession и извлекает одну запись, выбранную в Ax ListPage
,downloadDocument.aspx
имеет следующий код:
<%@ 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>
и интересная часть файла - этот код:
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);
}
}
}
}
}
}
Цель здесь - получить доступ ко всем выбранным записям в downloadDocument.aspx
, Я включил множественный выбор в Ax, так что я думаю, что все записи можно каким-то образом получить. Я предполагаю, что этот фрагмент должен отличаться как-то
IAxaptaRecordAdapter record = tableContext.DataKey.GetRecord(session)
Но я не могу понять это.
Если я смогу получить все записи в downloadDocument.aspx
Файл Я мог бы отправить строку обратно в топор, чтобы создать необходимые документы и отправить их пользователю.
Любые предложения о том, как это сделать?
1 ответ
Некоторое время назад у меня было подобное требование. Попробуйте использовать этот фрагмент. Обратите внимание, что при этом вызывается метод ax для каждой отмеченной строки. Может быть более эффективный способ отправки набора данных в целом.
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);