Добавление файлов в строку заказа на продажу

#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 /…