Перенос атрибутов из номенклатуры в настраиваемое поле строки SO

#acumatica

#acumatica

Вопрос:

Я относительно новичок в программировании настройки в Acumatica, и у меня есть вопрос о наилучшем способе переноса значений атрибутов с экрана номенклатуры в настраиваемое поле в строке SO на экране заказа на продажу.

Я сделал нечто подобное на другом экране, используя событие выбора поля и оператор PXSelect для извлечения данных с другого экрана и обновления моего настраиваемого поля.

Меня ставит в тупик необходимость извлекать значения из значения атрибута, должен ли я просто присоединиться к таблице CSAnswers в pxselect?

Я также хотел спросить, существует ли лучший общий подход для извлечения данных с другого экрана в настраиваемое поле при настройке Acumatica.

* обновление * Я пытаюсь использовать атрибут PXDBScalar, но не могу понять, как объединить несколько таблиц. Вот что я пробовал.

     [PXDBScalar(typeof(
     Search2<CSAnswers.value,
         InnerJoin<InventoryItem,
             On<SOLine.inventoryID, Equal<InventoryItem.inventoryID>>>,
         InnerJoin<CSAnswers,
             On<InventoryItem.noteID, Equal<CSAnswers.refNoteID>>>,
         Where<CSAnswers.attributeID, Like<QHOLDAttr>>
                           >))]
  

Спасибо
Скотт

Ответ №1:

Поскольку вы просили «лучший общий подход», я поделюсь своим предпочтительным способом решения этой проблемы. Не сказать, что это «лучше», но, возможно, просто «по-другому».

Я стараюсь, чтобы мои данные были привязаны к объекту, с которым они связаны напрямую. В случае атрибута InventoryItem я бы повысил значение этого атрибута до InventoryItem в расширении DAC, чтобы его можно было использовать везде, где используется InventoryItem. Кажется, вы хотите использовать его в сочетании с записью SOLine, но поскольку атрибут не привязан к SOLine, я бы не стал расширять SOLine для его добавления. Нет ничего плохого в том, чтобы добавить его туда, если это требует ваше бизнес-требование, но мне кажется более разумным знать, что связанные с InventoryItem данные InventoryItem поступают из InventoryItem, а не пытаться вспомнить, куда я их поместил, и, возможно, дублировать усилия в другом месте (например, на POLine) позже.

Вот пример того, как я это сделал, вытащил прямо из своего проекта, но изменил ссылки на атрибуты, чтобы они были более общими.

 public sealed class InventoryItemExt : PXCacheExtension<PX.Objects.IN.InventoryItem>
{
    #region MyAttribute
    [PXString]
    [PXUIField(DisplayName = Messages.MyAttribDisplayName)]
    [PXDBScalar(typeof(Search<CSAnswers.value, 
        Where<CSAnswers.refNoteID, Equal<InventoryItem.noteID>,
          And<CSAnswers.attributeID, Equal<MyAttribute>>>>))]
    public string MyAttribute { get; set; }
    public abstract class myAttribute : PX.Data.BQL.BqlString.Field<myAttribute> { }
    #endregion

    public class MyAttribute : PX.Data.BQL.BqlString.Constant<MyAttribute>
    {
        public MyAttribute() : base("MYATTRIB") { }
    }
}
  

Обратите внимание на константу, определенную для доступа к идентификатору атрибута «MYATTRIB», который привязан к классу элемента записи InventoryItem.

Теперь, когда атрибут помещен в расширение DAC в InventoryItem, я могу легко использовать его на любом экране, связанном с InventoryItem, при условии, что InventoryItem (и связанное с ним расширение DAC) доступны для этого экрана.

Без тестирования я могу быть не в курсе этого, но в отношении вашей попытки объединить 2 таблицы в PXDBScalar…

Когда вы говорите Search2 Я полагаю, что вы, по сути, сказали, что, впоследствии, пытаясь подключиться обратно к CSAnswers:

 Select CSAnswers.Value From CSAnswers
  Inner Join InventoryItem On SOLine.InventoryID = InventoryItem.InventoryID
  Inner Join CSAnswers...
  

Я не уверен, что ссылка на SOLine действительна здесь, но это может быть, если вы определяете это непосредственно в расширении SOLine DAC. Однако вы пытались запросить CSAnswers для внутреннего соединения CSAnswers. Не уверен, исправит ли это ваш PXD-скал, но если вы действительно хотите использовать свой метод для подключения этого к SOLine, попробуйте:

  Search2<CSAnswers.value,
     InnerJoin<InventoryItem,
         On<InventoryItem.inventoryID, Equal<SOLine.inventoryID>>>,
     Where<InventoryItem.noteID, Equal<CSAnswers.refNoteID>,
     And<CSAnswers.attributeID, Equal<QHOLDAttr>>>
     >))]
  

(Обратите внимание, что я поменял порядок отношений в предложениях On.)