#acumatica
Вопрос:
Отказ от ответственности: Я новичок в C# и Acumatica Framework
Я хочу реализовать слот базы данных, однако мне нужно извлечь данные из объединенных таблиц. Я использую PXDatabase.SelectMulti
метод из приведенного ниже фрагмента, однако мне не удалось заставить его работать с соединениями. Я также не могу найти никаких примеров метода со связанными таблицами.
Есть ли способ объединить таблицы с помощью этого метода или, возможно, другой способ запроса данных?
public class DatabaseSlotsExample : IPrefetchable
{
protected List<string> values = new List<string>(); // store your values here
public static List<string> Values
{
get
{
//Get the values from the slot dynamically. By providing table name, you inform system when it should reset the slot.
return PXDatabase.GetSlot<DatabaseSlotsExample>("SlotSuperKey", typeof(YourTable)).values;
}
}
public void Prefetch()
{
//read database here
foreach(PXDataRecord rec in PXDatabase.SelectMulti<YourTable>(
new PXDataField<YourTable.tableField>(), //definition for fields that system should select
new PXDataFieldValue<YourTable.tableKey>("Some Condition") //definition for restriction that you need to apply
))
{
//populate your collection from the database here
values.Add(rec.GetString(0));
}
}
}
Комментарии:
1. Я не уверен, сработает ли это, но не могли бы вы попробовать использовать проекцию? Я имею в виду, что ваша таблица выше будет проекцией, и вы будете выполнять объединение в проекции. Снова… не уверен, сработает ли это, потому что я сам никогда не использовал SelectMulti с проекцией.
Ответ №1:
Да, если вы используете BQL.Свободно, как ссылка, запрос BQL также упрощен. См. Ниже, используемые в Заказах на обслуживание:
foreach (PXResult<FSServiceOrder> res in
SelectFrom<FSServiceOrder>.
InnerJoin<FSAppointment>.On<FSAppointment.soRefNbr.IsEqual<FSServiceOrder.refNbr>>.
InnerJoin<FSWFStage>.On<FSWFStage.wFStageID.IsEqual<FSAppointment.wFStageID>>.
InnerJoin<FSRoom>.On<FSRoom.roomID.IsEqual<FSServiceOrder.roomID>>.
InnerJoin<FSEquipment>.On<FSEquipment.registrationNbr.IsEqual<FSRoom.descr>>.
Where<FSServiceOrder.srvOrdType.IsEqual<P.AsString>.
And<FSWFStage.wFStageCD.IsEqual<P.AsString>>>.
View.Select(this, "TO", "SCHEDULED")
{
FSServiceOrder fsServiceOrder = res.GetItem<FSServiceOrder>();
FSAppointment fsAppointment = res.GetItem<FSAppointment>();
}
Затем вы можете использовать приведенные ниже данные для извлечения конкретных данных таблицы: