Вызов отчета Acumatica с использованием экранного мыла API в Java - PullRequest
1 голос
/ 22 июня 2019

Я использую Java для получения Acumatica отчета с использованием экранных веб-служб SOUP (код, сгенерированный с использованием Apache CXF) . Интересующий меня доклад - Transactions for Periods в области финансов. Я знаю, как передавать команды в веб-службу для определения возвращаемых результатов, но я не знаю, как передавать параметры.

Параметры, которые я хочу передать: fromPeriod, toPeriod, Ledger, fromAccount и toAccount. Я передаю параметры в виде фильтров или каким-либо другим способом? Если в качестве фильтров, как я могу создать объекты фильтра?

Я не могу найти никаких примеров в Java для вызова Acumatica SOAP Web Services, поэтому любая помощь очень ценится.


screen = service.getScreenSoap();
LoginResult lres = screen.login(username, password);

Content content = screen.getSchema();  
ArrayOfFilter filters = new ArrayOfFilter();

ArrayOfCommand commands = new ArrayOfCommand();

commands.getCommand().add(content.getReportResults().getHtmlContent());
ArrayOfArrayOfString result = screen.export(commands, filters, 0, true, true);
List<ArrayOfString> lines = result.getArrayOfString();

Если я вызываю отчет без параметров, я получаю следующие ошибки:

javax.xml.ws.soap.SOAPFaultException: 
System.Web.Services.Protocols.SoapException: 
Server was unable to process request. --> PX.Data.PXViewDoesNotExitException: 
Error: The view Parameters doesn't exist.

Я изменил свой код в соответствии с кодом C # в ответе:

              Content content = screen.getSchema();  
              ArrayOfFilter filters = new ArrayOfFilter();

              Value fromPeriod = new Value();
              fromPeriod.setLinkedCommand(content.getParameters().getFromPeriod());
              fromPeriod.setValue("06-2018");

              Value toPeriod = new Value();
              toPeriod.setLinkedCommand(content.getParameters().getToPeriod());
              toPeriod.setValue("06-2018");

              Value ledger = new Value();
              ledger.setLinkedCommand(content.getParameters().getLedger());
              ledger.setValue("ACTUAL");

              Value company = new Value();
              company.setLinkedCommand(content.getParameters().getCompany());
              company.setValue("PRODUCTS");

              Value branch = new Value();
              branch.setLinkedCommand(content.getParameters().getBranch());
              branch.setValue("PRODWHOLE");

              ArrayOfCommand commands = new ArrayOfCommand();
              commands.getCommand().add(content.getReportResults().getHtmlContent());
              commands.getCommand().add(fromPeriod);
              commands.getCommand().add(toPeriod);
              commands.getCommand().add(ledger);
              commands.getCommand().add(company);
              commands.getCommand().add(branch);

              ArrayOfArrayOfString result = screen.export(commands, filters, 0, true, true);

Теперь я получаю новую ошибку:

javax.xml.ws.soap.SOAPFaultException: System.Web.Services.Protocols.SoapException: серверу не удалось обработать запрос. ---> System.ArgumentNullException: значение не может быть нулевым. Имя параметра: ключ в System.ThrowHelper.ThrowArgumentNullException (аргумент ExceptionArgument) в System.Collections.Generic.Dictionary 2.FindEntry(TKey key) at PX.Data.PXViewCollection.get_Item(String key) at PX.Api.SyImportProcessor.ExportTableHelper..ctor(SyExportContext context, Boolean submit) at PX.Api.ScreenUtils.a(String A_0, Command[] A_1, Int32 A_2, Int32 A_3, Boolean A_4, Boolean A_5, Dictionary 2 A_6, OptimizedExportProviderBuilderForScreenBasedApi A_7, логическое A_8, PXViewDescription [] A_9, ScreenInfo A_10, HashSet 1 A_11, Dictionary 2 A_12, SyExportContext A_13) в PX.Api.ScreenUtils.ExportInternal (строковые команды screenId, Command [], фильтры Filter [], int32 startRow, Int32 topCount, логическое значение includeHeaders, логическое значение breakOnError, граф PXGraph, логическое связывание bindGuids, логическое мобильное устройство, логическое значение isSelector, строковое значение String forcePmary bindContainer, словарь 2 sorts, String guidViewName, OptimizedExportProviderBuilderForScreenBasedApi buildOptimizedExportProviderDelegate, Func 3 сериализации, делегат) в PX.Api.Services.ScreenService.Export (String id, Command [] команды, фильтры Filter [], Int32 startRow, Int32 topCount, логический includeHeaders, логический breakOnError, логический bindGuids, логический мобильный, логический isSelector, строковый forcePriraphViewG, PX) , String bindContainer, Словарь 2 sorts, String guidViewName, Boolean disableOptimizedExport) at PX.Api.Soap.Screen.ScreenGate.Export(Command[] commands, Filter[] filters, Int32 topCount, Boolean includeHeaders, Boolean breakOnError) --- End of inner exception stack trace --- at org.apache.cxf.jaxws.JaxWsClientProxy.mapException(JaxWsClientProxy.java:195) ~[cxf-rt-frontend-jaxws-3.3.2.jar:3.3.2] at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:145) ~[cxf-rt-frontend-jaxws-3.3.2.jar:3.3.2] at com.sun.proxy.$Proxy45.export(Unknown Source) ~[?:?] at com.appcomputing.be.acdata.acumatica.gl633000.GL633000.getReport(GL633000.java:89) [classes/:?] at com.appcomputing.be.acdata.acumatica.gl633000.GL633000.main(GL633000.java:115) [classes/:?] Caused by: org.apache.cxf.binding.soap.SoapFault: System.Web.Services.Protocols.SoapException: Server was unable to process request. ---> System.ArgumentNullException: Value cannot be null. Parameter name: key at System.ThrowHelper.ThrowArgumentNullException(ExceptionArgument argument) at System.Collections.Generic.Dictionary 2.FindEntry (клавиша TKey) в PX.Data.PXViewCollection.get_Item (ключ строки) в PX.Api.SyImportProcessor.ExportTableHelper..ctor (контекст SyExportContext, логическая отправка) в PX.Api.ScreenUtils.a (Строка A_0, команда [] A_1, Int32 A_2, Int32 A_3, логическое A_4, логическое A_5, словарь 2 A_6, OptimizedExportProviderBuilderForScreenBasedApi A_7, Boolean A_8, PXViewDescription[] A_9, ScreenInfo A_10, HashSet 1 A_11, словарь 2 A_12, SyExportContext A_13) at PX.Api.ScreenUtils.ExportInternal(String screenId, Command[] commands, Filter[] filters, Int32 startRow, Int32 topCount, Boolean includeHeaders, Boolean breakOnError, PXGraph graph, Boolean bindGuids, Boolean mobile, Boolean isSelector, String forcePrimaryView, String bindContainer, Dictionary 2 сортировки, строка guidViewName, OptimizedExportProviderBuilderForScPeBeasePeBeaseBeBeasePeaseBase 3 serializationDelegate) at PX.Api.Services.ScreenService.Export(String id, Command[] commands, Filter[] filters, Int32 startRow, Int32 topCount, Boolean includeHeaders, Boolean breakOnError, Boolean bindGuids, Boolean mobile, Boolean isSelector, String forcePrimaryView, PXGraph forceGraph, String bindContainer, Dictionary 2 вида, строка guidViewName, логическое значение disableOptimizedExport) в PX.Api.Soap.Screen.ScreenGate.Export (команды Command [], фильтры Filter [], Int32 topCount, логический includeHeaders, логический breakOnError) --- Конец внутренней трассировки стека исключений ---

Я наконец-то заставил веб-сервис работать после замены screen.export (...) на screen.submit (команды). Но у результата просто длинная двоичная (нетекстовая) строка.

Если кто-то может помочь интерпретировать эту строку (нам нужны значения данных в отчете), это было бы очень полезно

1 Ответ

0 голосов
/ 26 июня 2019

Этот пример кода на C # и для файла PDF, но я думаю, что это может быть полезно. Это говорит само за себя:

//Getting the printable version of an invoice
//on the Invoice & Memo form (S0643000)
public static void GetPrintableInvoice()
{
    //Invoice data
    string docType = "Invoice";
    string invoiceNbr = "INV000045";
    using
    (
    //Connect to the web services and log in to Acumatica ERP
    Screen context = WebServiceConnector.InitializeWebService())
    {
        try
        {
            //Get the schema of the Invoice & Memo form (S0643000)
            SO643000Content invoiceFormSchema = context.SO643000GetSchema();
            //Specify the needed invoice and get a PDF version of it
            var commands = new Command[]
            {
                new Value
                {
                    Value = docType,
                    LinkedCommand = invoiceFormSchema.Parameters.DocumentType
                },
                new Value
                {
                    Value = invoiceNbr,
                    LinkedCommand = invoiceFormSchema.Parameters.ReferenceNumber
                },
                invoiceFormSchema.ReportResults.PdfContent
            };
            //Submit the commands to the form
            SO643000Content[] pdfInvoice = context.SO643000Submit(commands);
            //Save the result in a PDF file
            if (pdfInvoice != null && pdfInvoice.Length > 0)
            {
                File.WriteAllBytes(string.Format(@"Invoice_{0}.pdf", invoiceNbr),
                Convert.FromBase64String(pdfInvoice[0].ReportResults.PdfContent.Value));
            }
        }
        finally
        {
            //Log out from Acumatica ERP
            context.Logout();
        }
    }
}

Итак, в вашем случае это должно быть примерно так:

screen = service.getScreenSoap();
LoginResult lres = screen.login(username, password);

Content content = screen.getSchema();  
ArrayOfFilter filters = new ArrayOfFilter();

ArrayOfCommand commands = new ArrayOfCommand();

commands.getCommand().add(content.getValue("ParamValue",content.Parameters.fromPeriod));
commands.getCommand().add(content.getReportResults().getHtmlContent());
ArrayOfArrayOfString result = screen.export(commands, filters, 0, true, true);
List<ArrayOfString> lines = result.getArrayOfString();

По сути, вы устанавливаете значения параметров так же, как вы устанавливаете значения для полей при обновлении записи

...