Объединение таблиц с помощью PXDatabase SelectMulti

#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>();
}
 

Затем вы можете использовать приведенные ниже данные для извлечения конкретных данных таблицы: