c# asp.net axapta dynamics-ax-2012 enterprise-portal

c# - Multiseleccione desde Ax 2012 Listpage(EP) para descargarDocument.aspx



asp.net axapta (1)

Tuve un requisito similar hace algún tiempo. Intente usar este fragmento. Tenga en cuenta que esto llama al método ax para cada línea marcada. Puede haber una manera más eficiente de enviar el conjunto de datos en conjunto.

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);

He estado luchando con esto por un tiempo y parece que no puedo encontrar una solución para mi problema. Realmente me gustaría algo de ayuda aquí si fuera posible, significaría mucho para mí.

Actualmente estoy ejecutando una página de lista de ax 2012 en un sitio de portal de Enterprise que permite a los usuarios seleccionar una factura y luego hacer clic en un botón que comienza a descargar un PDF generado de la factura. Se parece a esto:

El botón EpDocuGetMenuitem (elemento del menú de salida) hace referencia a una URL webMenuItem que inicia el archivo estático downloadDocument.aspx .

downloadDocument.aspx obtiene la Websession y axaptasession y extrae un único registro que se seleccionó en la ListPage . downloadDocument.aspx tiene el siguiente código:

<%@ 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>

y la parte interesante del archivo es este código:

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); } } } } } }

El objetivo aquí es obtener todos los registros seleccionados accesibles en downloadDocument.aspx . He habilitado la selección múltiple en Ax, así que supongo que debería ser posible obtener todos los registros de alguna manera. Supongo que este fragmento debería ser diferente de alguna manera

IAxaptaRecordAdapter record = tableContext.DataKey.GetRecord(session)

Pero no puedo entenderlo.

Si puedo obtener todos los registros en el archivo downloadDocument.aspx , podría enviar una cadena a ax para crear los documentos necesarios y enviarlos al usuario.

¿¿Alguna sugerencia sobre cómo hacer esto??