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);
Другие вопросы по тегам