Добрый день,
помогите соединить таблицы Application и Contact. Выходит ошибка

EntitySchemaQuery query = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "Application");
var param1 = query.CreateFilterWithParameters(FilterComparisonType.Equal, "par1", par1);

query.Filters.Add(param1);

query.PrimaryQueryColumn.IsAlwaysSelect = true;
query.AddColumn("FirstName");
query.AddColumn("FamilyName");
query.AddColumn("Number");
query.AddColumn("=Contact.Name");

var list = query.GetEntityCollection(UserConnection);
Listobject> Applications = new Listobject>();
foreach (var item in list)
{
    var Application = new
    {
        FirstName = item.GetTypedColumnValuestring>("FirstName"),
        FamilyName = item.GetTypedColumnValuestring>("FamilyName"),
        Number = item.GetTypedColumnValuestring>("Number"),
                Contact_Name = item.GetTypedColumnValuestring>("Contact.Name")
                       
    };
    Applications.Add(Application);
}
ApplicationList = Applications;
return true;

Нравится

3 комментария

Добрый день.

Попробуйте так:

var FirstNameColumn = query.AddColumn("FirstName");
...
FirstName = item.GetTypedColumnValue(FirstNameColumn),

либо

FirstName = item.GetColumnValue(FirstNameColumn),

Также не плохо было бы указать ошибку, которая возникает.

Хорошего дня!

Добрый день,
не так и не так не работает
пишет поля такого нет
второй вариант вообще не компилится

у меня второй вопрос
почему при подключении к сервису выходит такая ошибка
var context = new BPM.BPMonline(dataSeviceUri);
context.Credentials = new NetworkCredential("Supervisor", "Supervisor");
try
{
DataServiceQuery allContacts = context.CurrencyCollection;
foreach (BPM.Currency contact in allContacts)
{
listBox1.Items.Add(contact.Name);
}
}
catch (Exception ex)
{
textBox1.Text = ex.Message;
}

<?xml version="1.0" encoding="utf-8" standalone="yes"?>5Текущий пользователь не имеет прав на объект "Currency"Текущий пользователь не имеет прав на объект "Currency"System.Security.SecurityException в Terrasoft.Core.Entities.Services.EntityDataService.CheckResourcesRights(IEnumerable`1 queryResources, String requestMethod)&#xD;
в Terrasoft.Core.Entities.Services.EntityDataService.OnStartProcessingRequest(ProcessRequestArgs args)&#xD;
в System.Data.Services.DataService`1.ProcessIncomingRequestUri()&#xD;
в System.Data.Services.DataService`1.HandleRequest()

Здравствуйте.

По первой проблеме - у Вас где-то ошибка. Можно прикрепить схему, в которой Вы выполняете запрос ESQ?
По второй - вы делаете запрос к объекту "Currency". Данный объект у Вас администрируется по операциям? Какие права у пользователя установлены?

Показать все комментарии

Необходимо реализовать в Террасофт следующий INNER JOIN

FROM tbl_Contract c
INNER JOIN tbl_ContractReportMonth m ON c.StartDate BETWEEN m.DateFrom AND m.DateTo

так, чтобы в Select потом была возможность обращаться к полям таблицы tbl_ContractReportMonth

Как это можно сделать?

Нравится

10 комментариев

я думаю, Вам придется решать Вашу задачу подзапросами (если надо иметь данные именно в том же датасете)

Андросов Дмитрий
Что значит подзапросы? Где это находится? (Я работаю с ТерраСофт всего вторую неделю)

Заранее спасибо!

Подзапрос - это, например, второй select в следующем запросе

SELECT
	[tbl_Account].[ID] AS [ID],
	[tbl_Account].[Name] AS [Name],
	[tbl_Account].[OfficialAccountName] AS [OfficialAccountName],
	[tbl_Account].[AnnualRevenue] AS [AnnualRevenue],
	(SELECT
                [tbl_Empty].[column5]
	FROM
		[dbo].[tbl_Empty] AS []) AS [PODZAPROS]
FROM
	[dbo].[tbl_Account] AS [tbl_Account]
where ......

в Администраторе подзапросы добавляются так

Спасибо. Идею поняла.

Здравствуйте, Наталия!

Тип Join-а можно выбрать при его настройке:

111

Для того, чтобы добавить новый JOIN нужно на существующую таблицу нажать правой кнопкой мыши, и добавить его.

111

В некоторых случаяых удобнее действительно использовать и колонки подзапроса, как рекомендовал Дмитрий, например, когда Вам нужны агрегирующие значения по связанным таблицам.

В традиционном случае, например, при выводе заголовка значения справочника в запрос, рекомендуется использование Join-ов в блоке FROM

Анна, обратите внимание на условие JOIN'a, которое нужно Наталии

В том то и дело, что у меня нет прямой связки, соединение данных - это условие попадания в диапазон.
Со стандартным JOIN проблем бы не было.

Дмитрий, Вы абсолютно правы, в данном конкретном случае на уровне sq_ задачу можно решить только колонкой подзапроса.

Однако с точки зрения оптимизации и ускорения запроса я бы рекомендовала создать представление, которое бы ограничивало tbl_ContractReportMonth по датам, зарегистрировать его в Terrasoft как таблицу и джоинить. Правда, это допустимо только в том случае, если пределы можно задать неким выражением от текущей даты. Если они задаются в системе в ручную - тогда колонки подзапроса.

Наталия,
можете вместо INNER JOIN создать CROSS JOIN, а условия соединения заменить на условия фильтрации, типа:

FROM tbl_Contract c
CROSS JOIN tbl_ContractReportMonth m 
WHERE c.StartDate BETWEEN m.DateFrom AND m.DateTo

С точки зрения СУБД по идее результат должен быть аналогичным.

Но мне вариант Ани нравится больше.

Показать все комментарии