Я использую 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 (команды). Но у результата просто длинная двоичная (нетекстовая) строка.
Если кто-то может помочь интерпретировать эту строку (нам нужны значения данных в отчете), это было бы очень полезно