Просьба помочь собрать такой запрос при помощи класса select

select count(ID)

   from [dbo].[Case] AS TI

WHERE DATEPART(HOUR, DATEADD(hh, 6, TI.[UsrDueDate])) >=9  and DATEPART(HOUR, DATEADD(hh, 6, TI.[UsrDueDate])) <12

and FORMAT(DATEADD(hh, 6, TI.[UsrDueDate]), N'yyyy.MM.dd') = FORMAT(cast(GETDATE() +1 as date), N'yyyy.MM.dd')

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

Нравится

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

Добрый день, Адилет.

 

Вы можете настроить SQL-представление (view) с нужным условием.

 

А потом из этого представления уже делать выборку с помощью класса select.

 

Или же попробовать сделать по аналогии с примерами запросов по этой ссылке.

Alla Savelieva,

Благодарю, будем пробовать.

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

Доброго времени суток!

Столкнулся с такой ситуацией. Для справочного поля в sql-запросе select через left join я выходил на "Название" значения (вместо айди, которое по умолчанию). Но, как выяснилось с помощью "Sys{объект}Lcz", отображались в запросе значения из другой локализации справочника, не "ru-RU". И на данный момент установлено у меня 2 локализации: RU и EN.



Вопрос. Можно ли как-то избавится от иной локализации вовсе, оставив русскую соответственно? Ну или убрать для уже существующих в системе объектов иную локализацию?

П.с. Мои коллеги подсказали, что, убрав локализацию, это повысило бы чутка быстродействие системы.

Изображение удалено.

Нравится

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

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

 

Их можно выключить, отключив признак "активный". Это, а также список всех языков в системе можно увидеть в Languages разделе в дизайнере системы. 

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

Скрипты есть, но выполнять их стоит на свой страх и риск. Скрипт удаляет все языки, которые не используются в профиле пользователей и который не является основным. 

Если всё же вы решитесь удалять анг. культуру, сделайте копию приложения и удалите её там. После чего проверьте работу приложения в разделах, компиляцию, генерацию кода, установку пакетов - по максимуму провести тестирование. 

 

IF OBJECT_ID('tempdb..#UsedCultures') IS NOT NULL

       DROP Table #UsedCultures

-- Получение списка используемых культур

SELECT DISTINCT cult.Id

INTO #UsedCultures

FROM SysCulture cult

INNER JOIN SysAdminUnit au

       ON au.SysCultureId = cult.Id

INSERT INTO #UsedCultures

    (Id)

SELECT

    SysSettingsValue.GuidValue

FROM

    SysSettingsValue

INNER JOIN SysSettings

    ON SysSettings.Id = SysSettingsValue.SysSettingsId

WHERE

    SysSettings.Code = 'PrimaryCulture'

-- Получение списка таблиц, из которых нужно удалять данные

DECLARE TableNamesCursor CURSOR FOR

SELECT

        t3.TABLE_NAME AS ChildTableName  

FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS AS t1 

        INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS t2 ON t1.UNIQUE_CONSTRAINT_NAME = t2.CONSTRAINT_NAME

        INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS t3 ON t1.CONSTRAINT_NAME = t3.CONSTRAINT_NAME

WHERE

       t2.TABLE_NAME = 'SysCulture'

       and t2.COLUMN_NAME = 'Id'

       and t3.COLUMN_NAME = 'SysCultureId'

DECLARE @TableName SYSNAME

OPEN TableNamesCursor

FETCH NEXT FROM TableNamesCursor INTO @TableName

WHILE @@FETCH_STATUS = 0  

BEGIN  

       PRINT @TableName

       DECLARE @Sql NVARCHAR(MAX);

       SET @Sql = 'DELETE FROM ' + @TableName + '

            WHERE SysCultureId NOT IN (SELECT Id FROM #UsedCultures)';

       PRINT @Sql

       EXECUTE sp_executesql @Sql

       FETCH NEXT FROM TableNamesCursor INTO @TableName

END

CLOSE TableNamesCursor

DEALLOCATE TableNamesCursor

DELETE FROM SysCulture

WHERE Id NOT IN (SELECT Id FROM #UsedCultures)

IF OBJECT_ID('tempdb..#UsedCultures') IS NOT NULL

       DROP Table #UsedCultures

K.Ivan,

здравствуйте!



Нет, удалять англ. культуру не собираемся.



Проблема в том, что меняются данные в таблице локализации, а не в таблице справочника.

Не подскажете, как обеспечить сохранение данных в справочнике, а не в таблице локализации? Или как привязать таблицу локализации объекта к пакету?



И после Вашего ответа я поставил на русской культуре признак "по умолчанию", с англ. признак убрался, но признак "активный" на англ. культуре не даёт снять (серый чекбокс).

Английскую культуру деактивировать полностью невозможно, серый чекбокс - это нормальное поведение. 

 

Опишите, пожалуйста, детальнее касательно проблемы с изменением данные в таблице локализации, не до конца понятна суть вопроса.

Доброго дня коллеги, а есть такой скрипт для PostgreSQL?

Носуля Роман Викторович,



Роман, добрый день!

 

BEGIN;

-- Получение списка используемых культур

CREATE TEMP TABLE "UsedCultures" ON COMMIT DROP AS

SELECT DISTINCT cult."Id"

FROM "SysCulture" cult

INNER JOIN "SysAdminUnit" au

ON au."SysCultureId" = cult."Id";

INSERT INTO "UsedCultures" ("Id")

SELECT "SysSettingsValue"."GuidValue"

FROM "SysSettingsValue"

INNER JOIN "SysSettings"

ON "SysSettings"."Id" = "SysSettingsValue"."SysSettingsId"

WHERE "SysSettings"."Code" = 'PrimaryCulture';

-- Получение списка таблиц, из которых нужно удалять данные

DO $$

DECLARE

TableNamesCursor REFCURSOR;

TableName varchar;

BEGIN

OPEN TableNamesCursor FOR

SELECT kcu.TABLE_NAME

FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE ccu

INNER JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc

ON ccu.CONSTRAINT_CATALOG = rc.UNIQUE_CONSTRAINT_CATALOG

AND ccu.CONSTRAINT_SCHEMA = rc.UNIQUE_CONSTRAINT_SCHEMA

AND ccu.CONSTRAINT_NAME = rc.UNIQUE_CONSTRAINT_NAME

INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu

ON kcu.CONSTRAINT_CATALOG = rc.CONSTRAINT_CATALOG

AND kcu.CONSTRAINT_SCHEMA = rc.CONSTRAINT_SCHEMA

AND kcu.CONSTRAINT_NAME = rc.CONSTRAINT_NAME

WHERE ccu.COLUMN_NAME = 'Id'

AND ccu.TABLE_SCHEMA = 'public'

AND ccu.TABLE_NAME = 'SysCulture';

--Удаление локализаций

LOOP

FETCH TableNamesCursor INTO TableName;

EXIT WHEN TableName IS NULL;

RAISE NOTICE 'Deleting from table %', TableName;

EXECUTE format('DELETE FROM %I WHERE "SysCultureId" NOT IN (SELECT "Id" FROM

"UsedCultures")', TableName);

END LOOP;

CLOSE TableNamesCursor;

END $$;

DELETE FROM "SysCulture"

WHERE "Id" NOT IN (SELECT "Id" FROM "UsedCultures");

COMMIT

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

SQL-script ручного переноса функциональных ролей.

-- Функциональные роли. Перенос данных.
declare @change bit = 0
declare @select bit = 1
declare @id nvarchar(255)
declare @name nvarchar(255)
declare @unittype int = 6
if (@change = 1) begin
	set nocount on
	print N'[+] Изменение данных включено'
  -- Начало блока ФР --
	set @name = N'Administrator for organization on the portal'
	set @id = N'6f9af602-3a22-455c-b056-2cf14241f943'
		if not exists(select 1 from [SysAdminUnit] where Id = @id) begin
			print N'[!] Запись [' + @name + N'] не обнаружена, имя = [' + @name + N'], будет создана заново'
			insert into [SysAdminUnit](Name, SysAdminUnitTypeValue) values(@name, @unittype)
			update [SysAdminUnit] set Id = @id where [Name] = @name
		end
		update [SysAdminUnit] set [Name] = @name where Id = @id
		print N'[+] Запись [' + @id + N'] изменена успешно, имя = [' + @name + ']'
  -- Конец блока ФР --
  -- Начало блока ФР --
	set @name = N'Partner portal users'
	set @id = N'3017ae20-8e3c-40f6-a465-1920f7143c0f'
		if not exists(select 1 from [SysAdminUnit] where Id = @id) begin
			print N'[!] Запись [' + @name + N'] не обнаружена, имя = [' + @name + N'], будет создана заново'
			insert into [SysAdminUnit](Name, SysAdminUnitTypeValue) values(@name, @unittype)
			update [SysAdminUnit] set Id = @id where [Name] = @name
		end
		update [SysAdminUnit] set [Name] = @name where Id = @id
		print N'[+] Запись [' + @id + N'] изменена успешно, имя = [' + @name + ']'
  -- Конец блока ФР --
  -- Начало блока ФР --
  -- ... и т.д. для остальных ролей.
  -- Конец блока ФР --
	set nocount off
end else begin
	print N'[-] Изменение данных отключено'
end
if (@select = 1) begin
	select [sa].[Id], [sa].[Name]
	from [SysAdminUnit] [sa]
	where [sa].[SysAdminUnitTypeValue] = '6'
	order by [sa].[Name]
end

 

Нравится

Поделиться

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

Добрый вечер! Не знаю как такое возможно, чтобы ESQ.GetEntity() возвращал другую строку, при заданном первичном ключе в параметре функции. На скрине видно, что Id который задан и тот который вернул запрос совсем разные, а именно эта запись которую он взял идёт первой в таблице, что я не так делаю или в чём может ошибка? 

Прикрепленные файлы

Нравится

1 комментарий

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

Мне такую же ошибку не удалось воспроизвести - GetEntity отрабатывает правильно.

Попробуйте явно указать id, вот так: esq.GetEntity(UserConnection, new Guid("e76f59d2-c8ca-4bc1-80fd-0cdf02ab92dc"));

Ещё отловить бы запрос, который уходит в БД, возможно он некорректно формируется.

 

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

Коллеги, приветствую.

Столкнулся с некоторыми трудностями чтения из базы данных с помощью объекта DBExecutor.

Есть простой кастомный запрос:

 

var userConnection = Get("UserConnection");
Guid addedRecordId = Get("addedRecordId");

var selectQuery = new Select(userConnection)
        .Column("UsrName")
        .From("UsrDebt").As("ud")
        .Where("UD", "Id")
                .IsEqual(Column.Parameter(addedRecordId));

 

Читаю значение UsrName (пример - Помогите с запросом):

 

using (var dbExecutor = userConnection.EnsureDBConnection()) {
        var name = selectQuery.ExecuteScalar(dbExecutor); // строка 46
}

 

Получаю ошибку компиляции -

Если читаю набор данных, как показано в статье Использование EntitySchemaQuery для построения запросов к базе данных:

 

var userConnection = Get("UserConnection");
Guid addedRecordId = Get("addedRecordId");

var selectQuery =
        new Select(userConnection)
        .Column("UsrName")
        .From("UsrDebt").As("ud")
        .Where("UD", "Id")
                .IsEqual(Column.Parameter(addedRecordId));

// Выполнение запроса к базе данных и получение результирующего набора данных.
using (DBExecutor dbExecutor = userConnection.EnsureDBConnection())
{
    using (IDataReader reader = selectQuery.ExecuteReader(dbExecutor)) // строка 48
    {
        while (reader.Read())
        {
            // Обработка результатов запроса.
        }
    }
}

 

Получаю такую ошибку:

Как я могу получить значения из базы данных с помощью объекта DBExecutor?

Был бы весьма признателен за информацию.

Спасибо.

--
С уважением, Алексей Быков.

Нравится

1 комментарий

Добавил преобразование к типу Select, теперь все Ок.

var selectQuery = new Select(userConnection)
    	.Column("UsrName")
    	.From("UsrDebt").As("ud")
    	.Where("UD", "Id")
	.IsEqual(Column.Parameter(addedRecordId)) as Select;
Показать все комментарии

Возможно ли создание такого запроса в Terrasoft?
SELECT
[tbl_Application].[CarID] AS [CarID],
[tbl_Car].[Name] AS [NameCarID],
[tbl_Application].[ContactID] AS [ContactID],
[tbl_Contact].[Name] AS [NameContactID],
[tbl_Contact].[Communication1] AS [Communication1],
[tbl_Application].[Date] AS [Date],
[tbl_Application].[Name] AS [Name],
[tbl_Application].[Number] AS [Number],
[tbl_Application].[SummaOstatok] AS [SummaOstatok],
[tbl_Application].[SummaDiscount] AS [SummaDiscount],
[tbl_Application].[CheckBroken] AS [CheckBroken],
[tbl_Application].[TypeID] AS [TypeID],
[tbl_ApplicationType].[Name] AS [NameTypeID],
(SELECT COUNT(App.ID)
FROM tbl_Application AS App
WHERE App.CarID = tbl_Application.CarID
GROUP BY App.CarID) AS [Kvo]
FROM
[dbo].[tbl_Application] AS [tbl_Application]
LEFT OUTER JOIN
[dbo].[tbl_Car] AS [tbl_Car] ON [tbl_Car].[ID] = [tbl_Application].[CarID]
LEFT OUTER JOIN
[dbo].[tbl_Contact] AS [tbl_Contact] ON [tbl_Contact].[ID] = [tbl_Application].[ContactID]
LEFT OUTER JOIN
[dbo].[tbl_ApplicationType] AS [tbl_ApplicationType] ON [tbl_ApplicationType].[ID] = [tbl_Application].[TypeID]
ORDER BY
[Kvo] DESC,
2 ASC,
4 ASC,
6 ASC,
13 ASC
Собственно интересует строчка - [Kvo] DESC

Нравится

1 комментарий

По колонке с подзапросом (как и по "обычной" колонке) можно настроить сортировку:

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

Как выполнить sql скрипт из кода bpm 5.4 ? (не нашел на комьюнити)

Нравится

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

Здравствуйте, Илья!
Ссылки Вам в помощь:
http://www.community.terrasoft.ru/developer/article/7043
http://www.terrasoft.ru/bpmonlinesdk/ (раздел "Примеры")
http://www.community.terrasoft.ru/search/node/esq (можно найти примеры)

Андрей, подскажите, а как получить доступ к странице: http://www.community.terrasoft.ru/developer/article/7043 ?

"D.T." написал:

Андрей, подскажите, а как получить доступ к странице: http://www.community.terrasoft.ru/developer/article/7043 ?


+1

Прошу прощения, дал не ту ссылку.
Вот та же статья:
http://www.community.terrasoft.ru/blogs/8977

В примерах http://www.terrasoft.ru/bpmonlinesdk/ не понятно откуда берется userConnection.
Примера объявления userConnection не нашел.

Обычно в процессе страницы или объекта есть глобальная переменная UserConnection, можно подставить её.

"Зверев Александр" написал:

Обычно в процессе страницы или объекта есть глобальная переменная UserConnection, можно подставить её.

Подскажите каким образом подставлять глобальные переменные.

Просто к ней обращаться.

Илья, UserConnection - это класс ядра, который включает функции и свойства соединения пользователя (уникальные данные пользователя, сессии, временная зона).

Пример использования:

UserConnection.CurrentUser.Id // текущий пользователь
UserConnection.CurrentUser.ContactId // Контакт текущего пользователя
UserConnection.CurrentUser.AccountId // Контрагент текущего пользователя 
UserConnection.CurrentUser.GetCurrentDateTime() // Текущие время в часовой зоне пользователя

Как написал Александр, чтобы использовать UserConnection, достаточно обратиться (без дополнительных объявлений).

У меня такой код:

var insert = new Insert(userConnection).Into("massmailingcontact")
        .Set("ContactId", Column.Parameter("C92EA9E7-CC76-4FA1-9CA4-5186AA32FC2A"))
		.Set("MassMailingId", Column.Parameter("8EC7B788-401E-40F0-9B82-05937B4399B0"))
		.Set("EmailAddress", Column.Parameter("cc-sib@yandex.ru"))
        .Set("EmailId", Column.Parameter("6EEC951D-C89A-42A2-9DE4-AFCA74A72B97"));

и вот такую ошибку в итоге получаю http://joxi.ru/knMUU_3JTJBHE4UZoAc

Надо с большой буквы U.

Спасибо по букве U. Теперь не ругается при публикации, но запрос не выполняется (в таблице не появляется записей), использую такой код:

var insert = new Insert(UserConnection).Into("massmailingcontact")
        .Set("ContactId", Column.Parameter("C92EA9E7-CC76-4FA1-9CA4-5186AA32FC2A"))
		.Set("MassMailingId", Column.Parameter("8EC7B788-401E-40F0-9B82-05937B4399B0"))
		.Set("EmailAddress", Column.Parameter("cc-sib@yandex.ru"))
        .Set("EmailId", Column.Parameter("6EEC951D-C89A-42A2-9DE4-AFCA74A72B97"));
 
return true;

а SQL запрос выполняется

insert into massmailingcontact ("ContactId","MassMailingId","EmailAddress","EmailId") VALUES ('C92EA9E7-CC76-4FA1-9CA4-5186AA32FC2A','8EC7B788-401E-40F0-9B82-05937B4399B0','cc-sib@yandex.ru','6EEC951D-C89A-42A2-9DE4-AFCA74A72B97') 

Надо в конце

insert.Execute();

или прямо:

...
.Set("EmailId", Column.Parameter("6EEC951D-C89A-42A2-9DE4-AFCA74A72B97")).Execute();

"Зверев Александр" написал:

Надо в конце

insert.Execute();

Спасибо, работает!

Еще вопрос вдогонку, как после Insert узнать id новой записи?

"Андрей Каспаревич" написал:

Здравствуйте, Илья!

Ссылки Вам в помощь:

http://www.community.terrasoft.ru/developer/article/7043

http://www.terrasoft.ru/bpmonlinesdk/ (раздел "Примеры")

http://www.community.terrasoft.ru/search/node/esq (можно найти примеры)

С уважением,

Каспаревич Андрей

Эксперт 3-й линии поддержки

В примерах www.terrasoft.ru/bpmonlinesdk/ "userConnection" с маленькой буквы написан и не хватает в примерах ...Execute(); Просьба добавить.

"Соколов Илья Андреевич" написал:Еще вопрос вдогонку, как после Insert узнать id новой записи?

Сначала сгенерировать функцией:

var NewRecordId = Guid.NewGuid();

а при вставке указать поле "Id" и это значение:

...
.Set("Id", Column.Parameter(NewRecordId))
...

"Соколов Илья Андреевич" написал:"userConnection" с маленькой буквы написан

Глобальный объект UserConnection доступен не везде. Если, например, пишем функцию в отдельной схеме вроде CommonUtilities, то его нужно передавать в функцию как параметр. При вызове функции будет с большой буквы, а параметр функции — с маленькой, чтобы не перепутать.

"Соколов Илья Андреевич" написал:В примерах www.terrasoft.ru/bpmonlinesdk/ "userConnection" с маленькой буквы написан и не хватает в примерах ...Execute(); Просьба добавить.

Илья, в примерах SDK основной целью было показать, как формировать различные виды запросов к БД. Выполнение экземпляра запроса вторичен в данных примерах.
В связи с описанной Вами необходимостью уточнить дальнейший порядок действий, будет добавлена информацию о том, как запускать команды на выполнение.
Обновленные статьи будут опубликованы в следующем запланированном обновлении SDK.

"Зверев Александр" написал:
Соколов Илья Андреевич пишет:

Еще вопрос вдогонку, как после Insert узнать id новой записи?

Сначала сгенерировать функцией:

var NewRecordId = Guid.NewGuid();

а при вставке указать поле "Id" и это значение:

...

.Set("Id", Column.Parameter(NewRecordId))

...

Использую код:

var NewRecordId = Guid.NewGuid();
var insert = new Insert(UserConnection).Into("ContactCommunication")
        .Set("Id", Column.Parameter(NewRecordId))
		.Set("Number", Column.Parameter("cc-sib@yandex.ru"));
 
var insert2 = new Insert(UserConnection).Into("massmailingcontact")
        .Set("ContactId", Column.Parameter("C92EA9E7-CC76-4FA1-9CA4-5186AA32FC2A"))
		.Set("MassMailingId", Column.Parameter("8EC7B788-401E-40F0-9B82-05937B4399B0"))
		.Set("EmailAddress", Column.Parameter("cc-sib@yandex.ru"))
        .Set("EmailId", Column.Parameter(NewRecordId));
insert2.Execute();

Получаю ошибку:

Date: 05.03.2014 13:19:34
Date (UTC): 05.03.2014 6:19:35
 
Exception Message: The INSERT statement conflicted with the FOREIGN KEY constraint "FK1al75M40naNJlg36z3fYVOHfw". The conflict occurred in database "BPMonline CRM", table "dbo.ContactCommunication", column 'Id'.
The statement has been terminated.
Exception Type: System.Data.SqlClient.SqlException
Exception Source: .Net SqlClient Data Provider
 
Exception Stack Trace:
   в System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   в System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   в System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
   в System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
   в System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
   в System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite)
   в System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite)
   в System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite)
   в System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
   в Terrasoft.Core.DB.DBExecutor.FailoverExecute[TResult](DbCommand command, Func`1 func)
   в Terrasoft.Core.DB.DBExecutor.Execute(String sqlText, QueryParameterCollection parameters)
   в Terrasoft.Core.DB.BaseInsert.Execute()
   в Terrasoft.WebApp.AccountsGridPageEventsProcessSchema`1.ScriptTask1Execute(ProcessExecutingContext context)
   в Terrasoft.Core.Process.ProcessScriptTask.InternalExecute(ProcessExecutingContext context)
   в Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)
   в Terrasoft.Core.Process.ProcessScriptTask.Execute(ProcessExecutingContext context, Func`2 internalExecute)
   в Terrasoft.WebApp.AccountsGridPageEventsProcessSchema`1.ProcessQueue(ProcessExecutingContext context)
   в Terrasoft.WebApp.AccountsGridPageEventsProcessSchema`1.OnExecuted(Object sender, ProcessActivityAfterEventArgs e)
   в Terrasoft.Core.Process.ProcessFlowElement.OnExecuted(ProcessActivityAfterEventArgs e)
   в Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)
   в Terrasoft.WebApp.AccountsGridPageEventsProcessSchema`1.ProcessQueue(ProcessExecutingContext context)
   в Terrasoft.WebApp.BaseGridPageEventsProcess`1.ThrowEvent(ProcessExecutingContext context, String message)
   в Terrasoft.WebApp.AccountsGridPageEventsProcessSchema`1.ThrowEvent(ProcessExecutingContext context, String message)
   в Terrasoft.UI.WebControls.PageSchemaUserControl.ThrowEvent(String message)
   в Terrasoft.WebApp.AccountsGridPageSchemaUserControl.ButtonKP1Click(Object sender, EventArgs e)
   в Terrasoft.UI.WebControls.Controls.ComponentAjaxEvent.OnEvent(Object sender, AjaxEventArgs e)
   в Terrasoft.UI.WebControls.Controls.Observable.FireAsyncEvent(String eventName, ParameterCollection extraParams)
   в Terrasoft.UI.WebControls.Controls.ScriptManager.RaisePostBackEvent(String eventArgument)
   в Terrasoft.UI.WebControls.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument)
   в System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData)
   в System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
 
Form:
	submitAjaxEventConfig: {&quot;config&quot;:{&quot;viewStateMode&quot;:&quot;include&quot;,&quot;extraParams&quot;:{}}}
	__EVENTTARGET: ScriptManager
	__EVENTARGUMENT: PageContainer_AccountsModulePage_Grid_ButtonKP1|event|Click
	__VIEWSTATEFIELDCOUNT: 25
	__VIEWSTATE0: ...................................

Нужно было вызвать Execute для insert.
Кроме того, ContactCommunication — деталь раздела контактов и в новой записи нужно заполнить связь ContactId и другие стандартные поля.

"Зверев Александр" написал:

Нужно было вызвать Execute для insert.


спасибо добавляет и рассылка идет

А как выполнить из скрипта хранимую процедуру или функцию sql?

Екатерина, с примером вызова хранимой процедуры из скрипта Вы можете ознакомиться в процессе страницы BaseDuplicateMergeEditPage, а именно в OKButtonClickScriptTask:

…
var storedProcedure = new StoredProcedure(UserConnection, "tsp_MergeDuplicates");
storedProcedure.WithParameter(Column.Const(EntityPrimaryColumnValue));
storedProcedure.WithParameter(Column.Const(entitiesToMerge));
storedProcedure.WithParameter(Column.Const(Page.DataSource.Schema.UId));
storedProcedure.WithOutputParameter("return_value", dataValueTypeManager.GetInstanceByName("Integer"));
storedProcedure.WithOutputParameter("error_message", dataValueTypeManager.GetInstanceByName("Text"));
using (DBExecutor dbExecutor = UserConnection.EnsureDBConnection()) {
         dbExecutor.StartTransaction(System.Data.IsolationLevel.ReadUncommitted);
         Page.DataSource.ActiveRow.Save();
         storedProcedure.Execute(dbExecutor);
         if (storedProcedure.Parameters.Count > 0) {
                   int result = (int)storedProcedure.Parameters[0].Value;
                   string errorMessage = storedProcedure.Parameters[1].Value as string;
                   if (result != 0) {
                            dbExecutor.RollbackTransaction();
                            throw new Exception(errorMessage);
                   }
         }        
         dbExecutor.CommitTransaction();  
}
Показать все комментарии

Есть потребность выводить в реестр Контрагентов юридическое наименование и ИНН. Я в запросе для контрагента делаю следующее:
SELECT
[tbl_Account].[ID] AS [ID],
[tbl_Account].[Name] AS [Name],
[tbl_Account].[OfficialAccountName] AS [OfficialAccountName],
[tbl_Account].[AnnualRevenue] AS [AnnualRevenue],
[tbl_Account].[EmployeesNumber] AS [EmployeesNumber],
[tbl_Account].[Address] AS [Address],
[tbl_Account].[AddressTypeID] AS [AddressTypeID],
[tbl_Account].[Communication1] AS [Communication1],
[tbl_Account].[Communication1TypeID] AS [Communication1TypeID],
[tbl_Account].[Communication2] AS [Communication2],
[tbl_Account].[Communication2TypeID] AS [Communication2TypeID],
[tbl_Account].[Communication3] AS [Communication3],
[tbl_Account].[Communication3TypeID] AS [Communication3TypeID],
[tbl_Account].[Communication4] AS [Communication4],
[tbl_Account].[Communication4TypeID] AS [Communication4TypeID],
[tbl_Account].[Communication5] AS [Communication5],
[tbl_Account].[Communication5TypeID] AS [Communication5TypeID],
[tbl_City].[Name] AS [CityName],
[tbl_Account].[CityID] AS [CityID],
[tbl_Account].[ZIP] AS [ZIP],
[tbl_Campaign].[Name] AS [CampaignName],
[tbl_Account].[CampaignID] AS [CampaignID],
[tbl_Contact].[Name] AS [PrimaryContactName],
[tbl_Account].[PrimaryContactID] AS [PrimaryContactID],
[tbl_Country].[Name] AS [CountryName],
[tbl_Account].[CountryID] AS [CountryID],
[tbl_State].[Name] AS [StateName],
[tbl_Account].[StateID] AS [StateID],
[tbl_Territory].[Name] AS [TerritoryName],
[tbl_Account].[TerritoryID] AS [TerritoryID],
[Owner].[Name] AS [OwnerName],
[tbl_Account].[OwnerID] AS [OwnerID],
[tbl_Account].[ActivityID] AS [ActivityID],
[tbl_Activity].[Name] AS [ActivityName],
[tbl_Account].[FieldID] AS [FieldID],
[tbl_Field].[Name] AS [FieldName],
[tbl_Account].[AccountTypeID] AS [AccountTypeID],
[tbl_AccountType].[Name] AS [AccountTypeName],
[tbl_AddressType].[Name] AS [AddressTypeName],
[CommunicationType1].[Name] AS [Communication1TypeName],
[CommunicationType2].[Name] AS [Communication2TypeName],
[CommunicationType3].[Name] AS [Communication3TypeName],
[CommunicationType4].[Name] AS [Communication4TypeName],
[CommunicationType5].[Name] AS [Communication5TypeName],
[tbl_Account].[Code] AS [Code],
[tbl_Account].[TaxRegistrationCode] AS [TaxRegistrationCode],
[tbl_Account].[CreatedOn] AS [CreatedOn],
[tbl_Account].[CreatedByID] AS [CreatedByID],
[CreatedBy].[Name] AS [CreatedByName],
[tbl_Account].[ModifiedOn] AS [ModifiedOn],
[tbl_Account].[ModifiedByID] AS [ModifiedByID],
[ModifiedBy].[Name] AS [ModifiedByName],
[tbl_Job].[NameOf] AS [JobNameOf],
[tbl_Account].[SettledCredit] AS [SettledCredit],
[tbl_Account].[PostponementPayment] AS [PostponementPayment],
NULL AS [UID1C],
NULL AS [Object1C],
[tbl_Account].[SiteID] AS [SiteID],
[tbl_Account].[IsActive] AS [IsActive],
[tbl_Account].[DoNotCall] AS [DoNotCall],
[vw_AppealInfo].[AppealDate] AS [AppealDate],
[vw_AppealInfo].[AppealStatusID] AS [AppealStatusID],
[AITaskStatus].[Status] AS [AppealStatus],
[vw_AppealInfo].[AppealTypeID] AS [AppealTypeID],
[AITaskType].[Name] AS [AppealTypeName],
[vw_LoyaltyInfo].[LoyContDate] AS [LoyContDate],
[vw_LoyaltyInfo].[LoyContTypeID] AS [LoyContTypeID],
[LITaskType].[Name] AS [LoyContTypeName],
[vw_LoyaltyInfo].[LoyOrderNum] AS [LoyOrderNum],
[vw_LoyaltyInfo].[LoyResultID] AS [LoyResultID],
[LITaskResult].[Result] AS [LoyResultName],
[vw_LoyaltyInfo].[LoyComment] AS [LoyComment],
[vw_LoyaltyRepInfo].[LoyRepCallDate] AS [LoyRepCallDate],
[vw_ReminderInfo].[RemContDate] AS [RemContDate],
[vw_ReminderInfo].[RemContTypeID] AS [RemContTypeID],
[RITaskType].[Name] AS [RemContTypeName],
[vw_ReminderInfo].[RemOrderNum] AS [RemOrderNum],
[vw_ReminderInfo].[RemResultID] AS [RemResultID],
[RITaskResult].[Result] AS [RemResultName],
[vw_ReminderInfo].[RemComment] AS [RemComment],
[vw_ReminderRepInfo].[RemRepCallDate] AS [RemRepCallDate],
[tbl_Account].[SitePaymentRecID] AS [SitePaymentRecID],
[tbl_AccountBillingInfo].[INN] AS [INN],
[tbl_AccountBillingInfo].[Name] AS [NameUr]

FROM
[dbo].[tbl_Account] AS [tbl_Account]
LEFT OUTER JOIN
[dbo].[tbl_Contact] AS [tbl_Contact] ON [tbl_Contact].[ID] = [tbl_Account].[PrimaryContactID]
LEFT OUTER JOIN
[dbo].[tbl_Territory] AS [tbl_Territory] ON [tbl_Territory].[ID] = [tbl_Account].[TerritoryID]
LEFT OUTER JOIN
[dbo].[tbl_Contact] AS [Owner] ON [Owner].[ID] = [tbl_Account].[OwnerID]
LEFT OUTER JOIN
[dbo].[tbl_Campaign] AS [tbl_Campaign] ON [tbl_Campaign].[ID] = [tbl_Account].[CampaignID]
LEFT OUTER JOIN
[dbo].[tbl_City] AS [tbl_City] ON [tbl_City].[ID] = [tbl_Account].[CityID]
LEFT OUTER JOIN
[dbo].[tbl_State] AS [tbl_State] ON [tbl_State].[ID] = [tbl_Account].[StateID]
LEFT OUTER JOIN
[dbo].[tbl_Country] AS [tbl_Country] ON [tbl_Country].[ID] = [tbl_Account].[CountryID]
LEFT OUTER JOIN
[dbo].[tbl_Activity] AS [tbl_Activity] ON [tbl_Activity].[ID] = [tbl_Account].[ActivityID]
LEFT OUTER JOIN
[dbo].[tbl_Field] AS [tbl_Field] ON [tbl_Field].[ID] = [tbl_Account].[FieldID]
LEFT OUTER JOIN
[dbo].[tbl_AccountType] AS [tbl_AccountType] ON [tbl_AccountType].[ID] = [tbl_Account].[AccountTypeID]
LEFT OUTER JOIN
[dbo].[tbl_Contact] AS [CreatedBy] ON [CreatedBy].[ID] = [tbl_Account].[CreatedByID]
LEFT OUTER JOIN
[dbo].[tbl_Contact] AS [ModifiedBy] ON [ModifiedBy].[ID] = [tbl_Account].[ModifiedByID]
LEFT OUTER JOIN
[dbo].[tbl_AddressType] AS [tbl_AddressType] ON [tbl_AddressType].[ID] = [tbl_Account].[AddressTypeID]
LEFT OUTER JOIN
[dbo].[tbl_CommunicationType] AS [CommunicationType1] ON [CommunicationType1].[ID] = [tbl_Account].[Communication1TypeID]
LEFT OUTER JOIN
[dbo].[tbl_CommunicationType] AS [CommunicationType2] ON [CommunicationType2].[ID] = [tbl_Account].[Communication2TypeID]
LEFT OUTER JOIN
[dbo].[tbl_CommunicationType] AS [CommunicationType3] ON [CommunicationType3].[ID] = [tbl_Account].[Communication3TypeID]
LEFT OUTER JOIN
[dbo].[tbl_CommunicationType] AS [CommunicationType4] ON [CommunicationType4].[ID] = [tbl_Account].[Communication4TypeID]
LEFT OUTER JOIN
[dbo].[tbl_CommunicationType] AS [CommunicationType5] ON [CommunicationType5].[ID] = [tbl_Account].[Communication5TypeID]
LEFT OUTER JOIN
[dbo].[tbl_Job] AS [tbl_Job] ON [tbl_Job].[ID] = [tbl_Contact].[JobID]
LEFT OUTER JOIN
[dbo].[vw_AppealInfo] AS [vw_AppealInfo] ON [vw_AppealInfo].[AccountID] = [tbl_Account].[ID]
LEFT OUTER JOIN
[dbo].[vw_LoyaltyInfo] AS [vw_LoyaltyInfo] ON [vw_LoyaltyInfo].[AccountID] = [tbl_Account].[ID]
LEFT OUTER JOIN
[dbo].[vw_LoyaltyRepInfo] AS [vw_LoyaltyRepInfo] ON [vw_LoyaltyRepInfo].[AccountID] = [tbl_Account].[ID]
LEFT OUTER JOIN
[dbo].[vw_ReminderInfo] AS [vw_ReminderInfo] ON [vw_ReminderInfo].[AccountID] = [tbl_Account].[ID]
LEFT OUTER JOIN
[dbo].[vw_ReminderRepInfo] AS [vw_ReminderRepInfo] ON [vw_ReminderRepInfo].[AccountID] = [tbl_Account].[ID]
LEFT OUTER JOIN
[dbo].[tbl_TaskStatus] AS [AITaskStatus] ON [AITaskStatus].[ID] = [vw_AppealInfo].[AppealStatusID]
LEFT OUTER JOIN
[dbo].[tbl_TaskType] AS [AITaskType] ON [AITaskType].[ID] = [vw_AppealInfo].[AppealTypeID]
LEFT OUTER JOIN
[dbo].[tbl_TaskType] AS [LITaskType] ON [LITaskType].[ID] = [vw_LoyaltyInfo].[LoyContTypeID]
LEFT OUTER JOIN
[dbo].[tbl_TaskResult] AS [LITaskResult] ON [LITaskResult].[ID] = [vw_LoyaltyInfo].[LoyResultID]
LEFT OUTER JOIN
[dbo].[tbl_TaskType] AS [RITaskType] ON [RITaskType].[ID] = [vw_ReminderInfo].[RemContTypeID]
LEFT OUTER JOIN
[dbo].[tbl_TaskResult] AS [RITaskResult] ON [RITaskResult].[ID] = [vw_ReminderInfo].[RemResultID]
LEFT OUTER JOIN
[dbo].[tbl_AccountBillingInfo] AS [tbl_AccountBillingInfo] ON [tbl_AccountBillingInfo].[AccountID] = [tbl_Account].[ID]

Использую левое соедиение с таблицей tbl_AccountBillingInfo.
Когда я вывожу колонки NameUr,INN в реестр контрагентов строка контрагентов начинает повторяться столько раз сколько у контрагента в детали строк, это логично, но мне нужно что бы в реестре строка контрагента выводилась только один раз без дублирований, помогите пожалуйста как это сделать.

Нравится

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

вывод строк реестра контаргентов

Поскольку связь между контрагентом и платежными реквизитами, из которых Вы выбираете ИНН, представляет собой 1:M, выводить данные таким образом некорректно.
Реализуйте задачу аналогично отраслям контрагента:
- в таблицу контрагента добавлено поле отрасль.
- для каждой отрасли на детали можно указать признак «Основная».
- при добавлении основной отрасли на детали, обновляется значение в таблице контрагента.

Наталия, дело в том, что деталь "Платежные реквизиты" блокируется по действию: синхронизировать с ИС. не имеет смысла делать признак "Основной" Можно ли вместо признака "Основная" в запросе использовать значение ID импортируемой записи?

Тогда создайте в запросе sq_Account колонку подзапроса (SubSelectColumn), в ней определите нужные условия.
Например:
/system/files/subselectcolumn.png

(SELECT TOP 1
		[BillingInfo].[INN] AS [INN]
	FROM
		[dbo].[tbl_AccountBillingInfo] AS [BillingInfo]
	WHERE([BillingInfo].[AccountID] = [tbl_Account].[ID] AND
		[BillingInfo].[RSN] = :RSN)) AS [INN]

Спасибо, все получилось

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

Добрый день уважаемая компания Террасофт!!!

в террасофте Платформа 3.3.2.254 создал SQL запрос, (сервис запроса прилагаю). В результате при просмотре(средствами администратора) вижу и не могу исполнить следующий запрос:

SELECT
[SubQuery123].[ID] AS [ID],
[SubQuery123].[Date] AS [Date]
FROM
(SELECT
[tbl_Document].[ID] AS [ID],
[tbl_Document].[Date] AS [Date],
ROW_NUMBER() OVER (ORDER BY tbl_Document.Date DESC) AS [RowNum]
FROM
[dbo].[tbl_Document] AS [tbl_Document]) AS [SubQuery123]
WHERE(ROW_NUMBER() OVER (ORDER BY tbl_Document.Date DESC) = :RowNUMM)

а верный запрос должен быть такой:

SELECT
[SubQuery123].[ID] AS [ID],
[SubQuery123].[Date] AS [Date]
FROM
(SELECT
[tbl_Document].[ID] AS [ID],
[tbl_Document].[Date] AS [Date],
ROW_NUMBER() OVER (ORDER BY tbl_Document.Date DESC) AS [RowNum]
FROM
[dbo].[tbl_Document] AS [tbl_Document]) AS [SubQuery123]
WHERE([SubQuery123].[RowNum] = :RowNUMM)

именно так (как правильный вариант) все в Админке я и сделал. А террасофт неправильно при показе и в работе преобразовывает запрос. просьба исправить данную ошибку в платформе. Подобный запрос нам срочно требуется исполнить уже в ближайшее время. Спасибо!!!

Нравится

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

Здравствуйте Михаил,
При использовании в качестве CompareFilter SQLTextColumn в Terrasoft подставляется его текст, даже в подзапросах.

К сожалению данный функционал не реализован на текущий момент, он будет реализован в Terrasoft 3.4.1

А сроки когда это планируется сделать. И по какой причине невозможно реализовать и исправить данную ошибку в 3.3.2?

А почему именно так?

Почему не устраивает select Top ... Order by Date desc ?

потому что Евгений требуется в запросе выбрать определенное количество записей. Данное количество предварительно должно быть отсортировано по дате. при этом какое количество требуется взять в итоговой выборке Неизвестная величина и вычисляется программно. поэтому и требуется подзапрос с колонкой ROW_NUMBER(). чтобы в результирующей выборке можно было с легкостью взять любое количество которое когда нибудь будет известно

Так перед открытием датасета можно указать свойство TOP селекта и датасет вернет нужное кол-во записей.

А если Селект следующий:

select *
from (select *
from tbl_Account
UNION ALL
select *
from tbl_Contact
UNION ALL
select
*
from tbl_Document
)

вопрос как тогда перед открытием датасете УКАЗАТЬ TOP у вложенного униона чтобы получилось так:

select *
from (select *
from tbl_Account
UNION ALL
select *
from tbl_Contact
UNION ALL
select TOP 20
*
from tbl_Document
)

вот для решения данного вопроса я и стал использывать ROW_NUMBER()

Михаил, создайте на уровне mssql представление с кастомной колонкой, а в Администраторе таблицу с таким названием как у представления, но сохраняйте физически в БД. Далее в запросе сможете оперировать кастомной колонкой как с обычной.

Конечно же, у ROW_NUMBER() есть свое назначение, и он облегчает ряд задач. Я предложил реализовать первый приведенный вами пример по-другому. Приведенный Вами пример выше, работать не будет т.к. у этих таблиц набор полей разный. Если же действительно Вам никак не обойтись без ROW_NUMBER(), то предложение Александра единственное решение на текущий момент.

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

Добрый день,
как преобразовать SQL запрос на EntitySchemaQuery
пример SQL

SELECT "OwnerId",count("OwnerId") abc,

(SELECT count(*) FROM "Activity" b
WHERE "TypeId" = '{FBE0ACDC-CFC0-DF11-B00F-001D60E938C6}'AND b."OwnerId" = a."OwnerId") a,

(SELECT count(*) FROM "Activity" c
WHERE "TypeId" = '{E1831DEC-CFC0-DF11-B00F-001D60E938C6}'AND c."OwnerId" = a."OwnerId") b,

(SELECT count(*) FROM "Activity" c
WHERE "TypeId" = '{E2831DEC-CFC0-DF11-B00F-001D60E938C6}'AND c."OwnerId" = a."OwnerId") c

FROM "Activity" a WHERE a."Id" IS NOT NULL
GROUP BY "OwnerId"

Нравится

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

Здравствуйте Alik Bory,
к сожалению, существующий функционал EntitySchemaQuery не покрывает требования вашего запроса. Необходимые расширения функционала уже запланированы в следующей версии BPMonline.

Для получения списка entity по вашему запросу можно использовать следующий код в котором используется более низкоуровневый класс Select и установка прав с использованием класса DBSecurityEngine:

var securityEngine = UserConnection.DBSecurityEngine;
//Создание объекта данных для построения подзапроса на проверку прав доступа текущего пользователя
var options = new RecordsByRightOptions() {
	RightEntitySchemaName = securityEngine.GetRecordRightsSchemaName("Activity"), // Имя таблицы прав
	PrimaryColumnName = "Id", // Имя главной колонки таблицы
	RecordRightColumnName = "CanRead", // Имя колонки отвечающей за права чтения данных
	UserId = UserConnection.CurrentUser.Id // Идентификатор текущего пользователя
};
 
options.EntitySchemaSourceAlias = "Activity"; // Указание Alias базовой таблицы
// Построение подзапроса проверки прав для базового запроса
var condition = securityEngine.GetRecordsByRightCondition(options);
condition.LogicalOperation = LogicalOperation.And;
 
 
options.EntitySchemaSourceAlias = "SubActivity"; // Указание Alias таблицы подзапроса получение количеста Активностей по типу
// Построение подзапроса проверки прав для подзапросов получения количества Активностей по типу
var innerSelectCondition = securityEngine.GetRecordsByRightCondition(options);
innerSelectCondition.LogicalOperation = LogicalOperation.And;
 
// Построение подзапроса получающего количество Активностей с типом Задача
var selectSubQuery1 = new Select(UserConnection)
	.Column(Func.Count(Column.Asterisk()))
	.From("Activity").As("SubActivity")
	.Where("SubActivity", "OwnerId").IsEqual("Activity", "OwnerId")
		.And("SubActivity", "TypeId").IsEqual(Column.Parameter("{FBE0ACDC-CFC0-DF11-B00F-001D60E938C6}")) as Select;
selectSubQuery1.Condition.Add(innerSelectCondition);
 
// Построение подзапроса получающего количество Активностей с типом Звонок
var selectSubQuery2 = new Select(UserConnection)
	.Column(Func.Count(Column.Asterisk()))
	.From("Activity").As("SubActivity")
	.Where("SubActivity", "OwnerId").IsEqual("Activity", "OwnerId")
		.And("SubActivity", "TypeId").IsEqual(Column.Parameter("{E1831DEC-CFC0-DF11-B00F-001D60E938C6}")) as Select;
selectSubQuery2.Condition.Add(innerSelectCondition);
 
// Построение подзапроса получающего количество Активностей с типом E-mail
var selectSubQuery3 = new Select(UserConnection)
	.Column(Func.Count(Column.Asterisk()))
	.From("Activity").As("SubActivity")
	.Where("SubActivity", "OwnerId").IsEqual("Activity", "OwnerId")
		.And("SubActivity", "TypeId").IsEqual(Column.Parameter("{E2831DEC-CFC0-DF11-B00F-001D60E938C6}")) as Select;
selectSubQuery3.Condition.Add(innerSelectCondition);
 
// Построение основного запроса
var selectQuery = new Select(UserConnection)
	.Column("OwnerId")
	.Column(Func.Count("OwnerId")).As("abc")
	.Column(selectSubQuery1).As("a")
	.Column(selectSubQuery2).As("b")
	.Column(selectSubQuery3).As("c")
	.From("Activity")
	.Where("Id").Not().IsNull()
	.GroupBy("OwnerId") as Select;
selectQuery.Condition.Add(condition);
 
// Получение списка entity по построеному запросу
var entityCollection = new EntityCollection(UserConnection, "Activity");
entityCollection.Load(selectQuery.ExecuteReader(UserConnection.EnsureDBConnection()));
// После выполнения функции Load в списке entityCollection содержаться все обработанные записи из таблицы Activity к которым текущий пользователь имеет доступ. 
// Каждая из записей состоит из 4-х колонок - OwnerId, abc, a, b, c

Спасибо, Andrii Derkach.
У нас при разработке отчета возникают много вопросов. Единственная справка это библиотека VS, которого просто трудно без справочника. У вас имеются ли справки по EntitySchema,примеры?
Спасибо

Здравствуйте Alik Bory. На email Вам была отправлена статья с описанием основных методов EntitySchemaQuery.

Добрый день!
А можете мне тоже выслать статью?

Добрый день Антон!

На Ваш e-mail были направлены материалы.
opisanie_osnovnyh_metodov_entityschemaquery.docx

С уважением,
Белецкий Арсений
Группа компаний Terrasoft

А возможно ли в EntitySchemaQuery написать order?

Екатерина, ответил Вам в теме:
http://www.community.terrasoft.ru/forum/topic/11184#comment-50360

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