#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.)