#acumatica
#acumatica
Вопрос:
Я хочу добавлять файлы в строки заказа на продажу в Acumatica с помощью веб-служб. Какую конечную точку следует использовать?
Я хочу добавить изображение, как показано на скриншоте выше, используя конечную точку веб-службы.
Комментарии:
1. Вот статья, демонстрирующая пример REST: asiablog.acumatica.com/2018/01/attach-files-with-rest-api.html
2. @Brendan я уже проверил это, я хочу добавить файл в строку сведений о заказе на продажу. http:/localhost/entity/Custom/1.2/SalesOrder/SO/076267 /<ключ>/files/image.jpg Каким должно быть значение в <key> для элемента «Подробная строка»
3. @HB_ACUMATICA Не могли бы вы, пожалуйста, объяснить немного больше?
4. Случайно опубликовал комментарий до того, как закончил. Кажется, что только API веб-службы на основе экрана может прикреплять файлы к строке сведений. Я опубликую пример для screen based, поскольку, как мне сказали, это единственное, что может это сделать.
Ответ №1:
Это старый вопрос, но я только что столкнулся с этой же проблемой, помогая клиенту с интеграцией сторонней. Сторонние разработчики были непреклонны в том, что они могут использовать только службу REST, поскольку они уже построили остальную часть своей интеграции вокруг нее, прежде чем поняли, что не могут прикреплять файлы к строкам заказа на продажу.
Я смог создать обходной путь, используя настройку. Проблема заключается в том, что способ, которым REST API Acumatica прикрепляет файлы, доступен только для объектов верхнего уровня, что означает, что должен быть экран, который использует объект в качестве основного DAC.
Обходной путь заключается в том, чтобы сделать именно это, создать новый пользовательский экран, который использует объект SOLine в качестве основного ЦАП. Чтобы сделать селекторы доступными, мне пришлось удалить и заменить пару атрибутов в ключевых полях, чтобы они могли быть видны и включены. Вот графический код — он очень прост, поскольку это, по сути, всего лишь минимум, необходимый для создания пользовательской конечной точки, которая использует SOLine DAC в качестве объекта верхнего уровня.
public class SOLineAttachmentEntry : PXGraph<SOLineAttachmentEntry, SOLine>
{
public PXSelect<SOLine> SOLineDetail;
[PXMergeAttributes(Method = MergeMethod.Append)]
[PXRemoveBaseAttribute(typeof(PXUIFieldAttribute))]
[PXUIField(DisplayName = "Order Type", Visible=true, Enabled = true)]
protected virtual void SOLine_OrderType_CacheAttached(PXCache sender) { }
[PXMergeAttributes(Method = MergeMethod.Append)]
[PXRemoveBaseAttribute(typeof(PXUIFieldAttribute))]
[PXUIField(DisplayName = "Order Nbr", Visible=true, Enabled = true)]
protected virtual void SOLine_OrderNbr_CacheAttached(PXCache sender) { }
[PXMergeAttributes(Method = MergeMethod.Append)]
[PXRemoveBaseAttribute(typeof(PXUIFieldAttribute))]
[PXRemoveBaseAttribute(typeof(PXLineNbrAttribute))]
[PXUIField(DisplayName = "Line Nbr", Visible=true, Enabled = true)]
protected virtual void SOLine_LineNbr_CacheAttached(PXCache sender) { }
}
Пользовательский макет экрана должен представлять собой простую форму, содержащую только эти три ключевых поля: OrderType, OrderNbr, LineNbr. В экранном редакторе настройки вы захотите установить CommitChanges = true на вкладке свойств макета для каждого поля.
После публикации экрана вы можете использовать его для создания новой пользовательской конечной точки и добавления отдельного объекта, выбрав SOLine view на пользовательском экране. Я назвал конечную точку «SalesOrderDetailAttach», присвоил конечной точке версию 1.0 и назвал новый объект «SalesOrderDetail». Используя эти имена, запрос на вложение файла должен быть запросом PUT с данными двоичного файла в теле запроса, используя формат url:
[AcumaticaBaseUrl]/entity/SalesOrderDetailAttach/1.0/SalesOrderDetail/[OrderType]/[OrderNbr]/[LineNbr]/files/[Desired filename in Acumatica]
Это сработало в этом очень специфическом случае, прикрепив файл к объекту SOLine. Экран и конечная точка действительно никогда не должны использоваться ни для чего другого, а пользовательский экран не должен быть доступен никаким пользователям, кроме администратора и пользователя API. В конечном счете, я бы рекомендовал использовать экранный метод из другого ответа, но если использование REST API является абсолютно обязательным, это потенциальный обходной путь.
Ответ №2:
REST API должен ссылаться на строку сведений в теле. Поскольку тело используется для передачи двоичных данных вложения, REST API нельзя использовать для прикрепления файлов к строке сведений.
Ниже приведен фрагмент API на основе экрана, который создает новый основной / подробный документ и прикрепляет изображения к строке сведений. Если вы решите использовать API на основе экрана, вам нужно будет адаптировать фрагмент для экрана заказа на продажу в формате XML и получать заказ на продажу с расширенными подробностями SOLine. Шаблон для прикрепления файла будет таким же:
string[] detailDescription = "Test";
List<string> filenames = "image.jpg";
List<byte[]> images = new byte[] { put_image_binary_data_here } ;
ServiceReference1.Screen context = new ServiceReference1.Screen();
context.CookieContainer = new System.Net.CookieContainer();
context.Url = "http://localhost/Demo/Soap/XYZ.asmx";
context.Login("admin@CompanyLoginName", "admin");
ServiceReference1.XY999999Content content = PX.Soap.Helper.GetSchema<ServiceReference1.XY999999Content>(context);
List<ServiceReference1.Command> cmds = new List<ServiceReference1.Command>
{
// Insert Master
new ServiceReference1.Value { Value="<NEW>", LinkedCommand = content.Document.KeyField},
new ServiceReference1.Value { Value="Description", LinkedCommand = content.Document.Description},
// Insert Detail
content.DataView.ServiceCommands.NewRow,
new ServiceReference1.Value { Value = noteDetail[0], LinkedCommand = content.DataView.Description },
// Attaching a file to detail
new ServiceReference1.Value
{
Value = Convert.ToBase64String(images[0]),
FieldName = filenames[0],
LinkedCommand = content.DataView.ServiceCommands.Attachment
},
content.Actions.Save,
content.Document.KeyField
};
var returnValue = context.PP301001Submit(cmds.ToArray());
context.Logout();
Комментарии:
1. как я могу использовать экранный API для прикрепления файла к элементу сведений о заказе на продажу?
2. Страница учебного документа по API на основе экрана I200 объясняет «Обновление строк сведений заказа на продажу» на странице 94. Вы можете использовать пример в моем ответе, чтобы прикрепить файлы к подробной части. openuni.acumatica.com/courses/integration /…