При биндинеге значения поля или его свойства на метод, последний вызывается при инициализации соответствующего значения.
Можно ли в последующем как либо в коде инициализировать его повторно, т.е. заставить биндинг поля отработать снова.
(Обходные пути через бизнес-правила и биндинг на атрибут мне известны).
Но если бы можно было скажем повторно инициализировать целевое свойство или значение целевого поля - это было бы более лаконичным решением, без "оверхеда" по сущностям и коду.
А так же открыло бы возможность осуществлять псевдо-реактивную привязку данных, без переработки существующих схем, просто инициализируя их повторно в нужный момент в собственной "бизнес-логике"

Нравится

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

Здравствуйте,
Такой возможности нет, только биндить на атрибут, а его значение заполнять методом в нужные вам моменты.

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

Зачастую в атрибуте объявляется целый перечень колонок
н/п

attributes: {
                        "UsrConfigProduct": {
                                lookupListConfig: {
                                        columns: [
                                                "UsrBrand",
                                                "UsrClass",
                                                "UsrProductType",
                                                "UsrProductCountry"
                                        ]
                                }
                        }
                }

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

Нравится

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

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

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

Добрый день!
При разработке на препроде возникла необходимость переименовать базовые разделы, и само собой изменена некая логика этих базовых разделов.
Так вот проблема в чем, при переносе этих всех изменений заголовки разделов в меню разделов, данные заголовки не меняются.
Собственно вопрос в том, как изменить заголовки раздела не через мастер и без использования esq запросов? Перепробовал менять все caption, но так и не нашел решения данной проблемы.
Или же вариант решения только тем, что придется добавить sql-скрипт к пакету при установке на проде?

Нравится

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

Михаил, здравствуйте!

Лучшим вариантом будет это:

- создать SQL скрипт, который «проайпдейтит» необходимые локализируемые строки;

Например:

Название кнопки берется из поля ActionKindCaption таблицы SysModuleEdit.

Предположим раздел "Контрагенты" имеет несколько страниц редактирования. Тогда страницы можно определить следующим запросом:

select * from SysModuleEdit
where SysModuleEntityId = (select Id from SysModuleEntity
where SysEntitySchemaUId = (select UID from SysSchema where Name = 'Account' and ExtendParent = 0))

Далее запросом update необходимо задать новое значение в колонку ActionKindCaption для требуемой записи.

- в пакете разработке добавить этот скрипт во вкладке «SQL сценарии» и указать тип установки «После сохранения пакета» (чтобы скрипт запустился после установке пакета на другую среду) + создать привязку скрипта к пакету, чтобы его можно было переносить на другую среду.

Другой пока возможности нет.
Приятной работы!

Дмитрий, благодарю.

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

Стоит задача расширить поле "Решение" статьи БЗ от "края до края" для мониторов с разрешением 1920x1080. В принципе можно подключить свой модуль с CSS, и указать

#KnowledgeBasePageV2KnowledgeBasePageGeneralBlockGridLayout-item-KnowledgeBasePageV2NotesContainer{
        width: 110% !important;
}

но в таком случае на мониторах с разрешением меньше, поле не подгоняется под их размер. Подскажите как решить данную задачу.

Нравится

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

Олег, в базовых карточках (кроме EmailPageV2, можете как пример использовать) задана фиксируемая ширина:

body[OldUI=false] .center-main-container .grid-layout-row {
  max-width: 140em;
}

Вы можете переопределить базовый для нужного раздела, только укажите дополнительный селектор, чтобы не перекрыть логику ВСЕХ карточек. Например: data-item-marker="KnowledgeBasePageGeneralBlock"

Спасибо за ответ. Такой вариант почему-то не срабатывает. Я нашел немного другое решение, но в таком случае приходится задавать ширину под определенное разрешение

@media (min-width: 1920px) {
	width: 110% !important;
}

Здравствуйте,
Вам нужно классу grid-layout-row ts-box-sizing
Во вложенности под id KnowledgeBasePageV2KnowledgeBasePageGeneralBlockGridLayout
Сбросить стиль max-width в none;
Тогда нужное поле будет во всю ширину на любых разрешениях.

Сбросил max-width в none, теперь не нужно указывать конкретное разрешение. Приведите пожалуйста пример как переопределить свойство класса во вложенности по id? Не смог разобраться, и сделал пока так:

#KnowledgeBasePageV2KnowledgeBasePageGeneralBlockGridLayout > div{
	max-width: none;
}

Извиняюсь, под #KnowledgeBasePageV2KnowledgeBasePageGeneralBlockGridLayout и нет id, так что вариант с #KnowledgeBasePageV2KnowledgeBasePageGeneralBlockGridLayout > div идеальный :twisted:

Если Вам требуется на всю ширину экрана, можете не заморачиваться с @media селекторами
Используйте специальные CSS единицы измерения Viewport Units: vw (1/100 процентное отношение к текущей ширине окна браузера) и vh (1/100 процентное отношение к текущей высоте окна браузера).

width: 100vw
В таком случае вне зависимости от размера экрана - элемент будет занимать всю доступную ширину окна, будьте внимательны с текущим значением box-sizing от чего будет зависеть будут ли в размер элемента включаться его border и margin в зависимости от этого иногда установка 100vw может привести к появлению горизонтальной полосы прокрутки, в таком случае необходимо будет или дополнительно скорректировать отсуты/границы или установить чуть меньшее значение в vw (98 - исходя из практики решает вопросы с типовыми проблемами)

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

Здравствуйте. Подскажите пожалуйста можно ли сделать, чтобы в зависимости от раздела, у одной и той же детали был различный заголовок и отображались разные поля на странице добавления записи?

Нравится

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

Здравствуйте,
Можно, средствами разработки. Что касательно заголовка детали, с версии на версию данный функционал немного отличался, так что, если возникнут трудности, уточните конкретный продукт и версию системы. А так, заголовок можно вернуть тот или иной заместив метод в схеме детали, и анализировать имя карточки, в которой мы находимся:

getDetailCaption: function() {
var cardPageName = this.get("CardPageName");
if (cardPageName === "ActivityPageV2") {
return "Name 1";
}
return "Name 2";
}

Что касательно полей на карточке, можно вывести их все, а видимость каждых полей что в зависимости от условий должны отображаться или не отображаться на атрибут, который в рантайме ставить в истину или ложь, в зависимости от того, из какой карточки была открыта страница редактирования.
Проверить от куда мы пришли, можно используя песочницу, между двумя схемами, схемой карточки, и схемой детали, подробнее про песочницу:
http://www.community.terrasoft.ru/forum/topic/15210

Добрый день! В 7.8.4 я реализовал вот так в схеме детали:

initDefaultCaption: function() {
if (Ext.isEmpty(this.get("Caption"))) {
var cardPageName = this.get("CardPageName");
var caption;
caption = (cardPageName === "SmrPaymentPageV2") ? this.get("Resources.Strings.CaptionInPayments") : this.get("Resources.Strings.CaptionInApplication");
this.set("Caption", caption);
}
}

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

Помогите сделать запрос функции SQL из Исходного кода c возможностью записи результата и дальнейшим его использованием.

В sql запрос выглядит так :

SELECT  dbo.fn_dateadd_work ('minute', 20, defValues)

 

Нравится

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

Функцию с одним возвращаемым значением можно запустить так:

string number = "12345";
using (DBExecutor dbExecutor = userConnection.EnsureDBConnection()) {
	UserDefinedFunction userDefinedFunction = new UserDefinedFunction(userConnection, "fn_GetPhoneNumberSearchForm")
		.WithParameter("SourcePhoneNumber", number) as UserDefinedFunction;
	userDefinedFunction.PackageName = userConnection.DBEngine.SystemPackageName;
	userDefinedFunction.ReturnType = UserDefinedFunctionReturnType.Scalar;
	searchNumber = userDefinedFunction.ExecuteScalar<string>(dbExecutor);
}

Если же функция возвращает много значений:

using (DBExecutor dbExecutor = userConnection.EnsureDBConnection()) {
				UserDefinedFunction userDefinedFunction = new UserDefinedFunction(userConnection, "fn_GetFreeIntervalsForContactToDeadline")
					.WithParameter("ContactId", ContactId)
					.WithParameter("CalendarId", calendarId)
					.WithParameter("FromDate", userConnection.CurrentUser.GetCurrentDateTime())
					.WithParameter("Deadline", deadLineDate.ToString("yyyy-MM-dd HH:mm:ss"))
					.WithParameter("Offset", userConnection.CurrentUser.TimeZone.BaseUtcOffset.TotalMinutes) as UserDefinedFunction;
 
				userDefinedFunction.PackageName = userConnection.DBEngine.SystemPackageName;
				userDefinedFunction.ReturnType = UserDefinedFunctionReturnType.Table;
				using(IDataReader dataReader = userDefinedFunction.ExecuteReader(dbExecutor)) {
					while (dataReader.Read()) {
						DateTime startDate = dataReader.GetColumnValue<DateTime>("StartDate");
						DateTime endDate = dataReader.GetColumnValue<DateTime>("EndDate");
						//...
					}
				}
			}
string datepart = "day";
var defValues3 = "";
var defValues5 = "";
 
using (DBExecutor dbExecutor = userConnection.EnsureDBConnection()) {
                    UserDefinedFunction userDefinedFunction = new UserDefinedFunction(userConnection, "fn_dateadd_work ")
                            .WithParameter("datepart", datepart) 
            				.WithParameter("number", 3)
            				.WithParameter("date", defValues.StartDate)as UserDefinedFunction;
                    userDefinedFunction.PackageName = userConnection.DBEngine.SystemPackageName;
                    userDefinedFunction.ReturnType = UserDefinedFunctionReturnType.Scalar;
                    defValues3 = userDefinedFunction.ExecuteScalar<string>(dbExecutor);
            }
 

Выдает ошибку:
Exception Message: Не удалось найти столбец "dbo", определяемую пользователем функцию или агрегатную функцию "dbo.fn_dateadd_work ". Также возможно, имя является неоднозначным.
Exception Type: System.Data.SqlClient.SqlException
Exception Source: .Net SqlClient Data Provider

Функция Скалярная

Это значит, что такой функции у Вас в базе нет. Возможно, дело в пробеле в конце.

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

Это значит, что такой функции у Вас в базе нет. Возможно, дело в пробеле в конце.

			string datepart = "day";
			var defValues3 = "";
			var defValues5 = "";
            using (DBExecutor dbExecutor = userConnection.EnsureDBConnection()) {
            UserDefinedFunction userDefinedFunction = new UserDefinedFunction(userConnection, "fn_dateadd_work")
                .WithParameter("datepart", datepart) 
				.WithParameter("number", 3)
				.WithParameter("date", defValues.StartDate)as UserDefinedFunction;
            userDefinedFunction.PackageName = userConnection.DBEngine.SystemPackageName;
            userDefinedFunction.ReturnType = UserDefinedFunctionReturnType.Scalar;
            defValues3 = userDefinedFunction.ExecuteScalar<string>(dbExecutor);
			}

Убарала пробел, ошибка та же. Функция в Бд есть.
В инете пишут, что возможно фн табличная и к ней так и нужно обращаться...
http://www.cyberforum.ru/sql-server/thread735489.html

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

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

Может, на функцию нет прав на запуск у пользователя, который прописан в конфиге ConnectionStrings.

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


Спасибо, проблема в правах.

А можно как то в исходном коде реализовать такой вызов функции:

select * from dbo.fn_SomeFunctionName()  where someColumnName>2

Руслан, если через UserDefinedFunction такое нельзя, можно воспользоваться CustomQuery.

Хорошо, а через Select можно? Если да то как?

Пробовал так, не работает.

var select = (Select)new Select(_userConnection)
    .Column("Id")
    .From("fn_GetContactDescendantRoles")
    .Where("level")
    .IsEqual(Column.Parameter(1));
select.Parameters.Add("contact", new Guid("40445C52-FFD1-4DBA-94D8-127A7B29806A"));
select.Parameters.Add("parentRole", new Guid("CFB6F756-B740-44AD-A221-80C5E441EBF4"));

Выходит ошибка:

System.Data.SqlClient.SqlException: "Параметры функции "dbo.fn_GetContactDescendantRoles" не были предоставлены."

Руслан, я имел в виду не Select, а CustomQuery.

В Вашей попытке через Select, вероятно, это получаются параметры не функции, а всего запроса (как при запросе на выборку из обычной таблицы). Проверить можно, сгенерировав перед выполнением текст запроса при помощи GetSqlText().

Зверев Александр,

Я понял что вы имели ввиду, но мне не хочется делать приложение жестко привязанным к базе данных MSSQL. Ожидаю что использование класса Select оставит приложение "кроссплатформенным". Поэтому предположил что можно использовать Select как при обычном обращении к таблице, т.к. функция возвращает таблицу.

Руслан, в справке написано:

Класс Terrasoft.Core.DB.Select предназначен для построения запросов выборки записей из таблиц базы данных. 

Для работы с  функциями используют другой класс, UserDefinedFunction . Для произвольных запросов — CustomQuery.

Зверев Александр,

Это все замечательно. Но в sql существует возможность выполнения такой конструкции:

select * from dbo.fn_SomeFunctionName()  where someColumnName&gt;2

Вы сказали что это не предусмотрено в классе UserDefinedFunction. Конечно моя функция не возвращает +100500 записей и можно было просто пробежаться по нужным в цикле, но я хочу задать условие на стороне сервера, чтобы он вернул только нужные по условию where. Вроде мелочь, но если количество запросов будет большое, то и сетевой трафик вырастет. В общем я за оптимизацию. Есть ли возможность в будущем расширить функционал данного класса?

В SQL можно и drop database выполнить. Возможность есть (но для этого нужно иметь доступ к исходникам ядра системы), больше вопрос, есть ли востребованность. Обходной вариант я предложил. Думаю, написать три строчки вызова для разных БД и получив ConnectionString (например, как тут в комментарии) выбрать нужную проще, чем вносить изменения в классы ядра.

Завёл идею, но не уверен, что до неё скоро доберутся.

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

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

Кейс такой. Создаем деталь у объекта.
Деталь создается но уже в заблокированном состоянии.
Пытаемся зафиксировать пакет в СВН, Система ругается, что нет прав, ктото уже заблокировал его.

Покопавшись понимаю что был удален файл из репозитария. Но его блокировка осталась.

Мной было сделано след-е в тортиле.
1. восстановил из старой версии файлы детали, которые были удалены.
2. скопировал в текущую
3. делаю коммит и выходит сообщение is locked in another working copy

Делал cleanup не помогло. Попробовал еще пару деталей сделать, но они автоматом блокированы (с зеленым замком)

круговорот такой не понятной.
bpmn ругается что нет такого в репозитарии
а тортила не может зафиксировать потому что объект заблокирован.

Как быть?

Нравится

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

Создал модули пустые а они зараза залоченные. А разблокировать невозможно, т.к. их нет в SVN.

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

Попробуйте удалить свою локальную working copy, после чего выполнить update из svn.
Скорее всего на Вашей машине хранится мусор в локальной папке svn, который блокирует работу.

Сделал
Select *
FROM [SysSchema]
where [IsLocked] > 0

Оказалось что они заблокированы.

Разблокировал.

Не помогло.
Сейчас даже детали через мастер создаются заблокированные сразу.
А как таковых деталей нет.

Удалите содержимое папки %TEMP%\%APPLICATION%\%WORKSPACE%\ находящуюся на локальной машине, кроме папки SVN, в ней находятся логины/пароли к SVN

Павел, не могу найти эти папки. в webconfig у меня так %TEMP%\%APPLICATION%\%WORKSPACE%\ но не нашел.

Описание параметров:

  • %TEMP% - C:\Windows\Temp
  • %APPLICATION% - порядковый номер сайта в IIS
  • %WORKSPACE% - название конфигурации (Default)

На моей локальной машине, следующий путь: C:\Windows\Temp\2\Default

Спасибо, Павел.

Я тоже столкнулся с таким багом. Вопрос к террасофту, как же можно было такое допустить то? Удалил схему, попытался её обратно залить, но не удалось, она заблокирована в СВН. Её там НЕТ! И хоть ты тресни.

Юсупов Марат,

Маракт, ну как ты решил этот вопрос?

Здравствуйте, Дмитрий!

Видимо, Марат не видит Ваших комментариев. Рекомендуем Вам написать ему в личные сообщения.

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

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

Я заметил, что к OData в BPM можно обращаться используя basic authentication в заголовке запроса. Как можно сделать тоже самое для своего веб-сервиса? Я попробовал сделать сам, получая заголовок запроса, вытаскивая от туда данные basic authentication и пытался через класс AuthService сделать авторизацию, но у меня не получилось, т.к. в методе Login происходила ошибка.

Нравится

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

Спасибо, помощь больше не нужна, разобрался сам. Если ,вдруг, кому нужно, то авторизовать пользователя можно вызвав метод RecreateUserConnection у класса SessionHelper и передав ему логин, пароль и др. данные.

Колебянов Виталий Романович,

то есть внутри вашего кастомного сервиса вы написали метод авторизации и при вызове этого метода происходит авторизация? система не говорит что вы не авторизованы для вызова сервиса?

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

В обновлении 7.9.1 добавили сохранение отображения дерева папок в профиль пользователя. Подскажите возможно ли сделать отображение дерева по умолчанию для новых пользователей? Сейчас по умолчанию дерево папок скрыто.

Нравится

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

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

Для настройки прав на группы, необходимо перейти в конфигурирование на вкладку "Администрирование" и найти объект "Группа базы знаний", на данный объект уже включено администрирование по записям, но права не настроены специально с расчетом на то, что кто создал группу, тот ее и видит.
Для настройки прав, чтоб при создании группы ее выдели другие пользователи, необходимо добавить правило раздачи прав по умолчанию на "Чтение", как минимум.
Например, как указано на скриншоте "2017-02-28"
В таком случае при создании группы любым пользователем, входящим в роль "Все сотрудники компании" будут розданы права всем пользователям, входящим в роль "Все сотрудники компании" и "Все пользователи портала". Это правило указано как пример, Вы можете настроить согласно Вашим требованиям.

Для того, чтоб применились Ваши правила раздачи прав на уже существующие записи в системе, необходимо выполнить два скрипта во вложении. Сначала выполнить скрипт №1, потом №2.
После, для всех уже существующих групп будут розданы права согласно правилам.

Я имел ввиду визуальное отображение дерева папок (по действию Фильтр - Показать группы).

Здравствуйте, Олег!

К сожалению, на текущий момент данный функционал не реализован в базовой версии системы.
Мы передали Ваше пожелание в отдел разработки, для анализа возможности внедрения в будущих версиях системы.

Спасибо конечно, но я уже сделал. Может кому-то будет нужно:

initLeftSectionContainerSize: function(callback, scope) {
    Terrasoft.require(["profile!" + this.getLeftSectionContainerSizeProfileKey()],
        function(leftSectionContainerSize) {
            this.set("ShowFolders", !Object.getOwnPropertyNames(leftSectionContainerSize).length);
            this.set("LeftSectionContainerSize", leftSectionContainerSize);
            Ext.callback(callback, scope);
    }, this);
},
onGridDataLoaded: function() {
    this.callParent(arguments);
    if ( this.get("ShowFolders") ) {
        this.showFolderTree();
    }
}

ShowFolders - атрибут типа bool

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

Здравствуйте! В теме новичок, столкнулся с необходимостью интеграции сервиса клиента на сайт. В целом сервис был написан еще до меня и работал, но появилась непредвиденная ситуация. На сайт выгружаются объекты (квартиры/дома и т.п.) из crm клиента, проверка идет по полю ModifiedOn. И для самих объектов это срабатывает. Но в отдельной коллекции есть фото объектов, и там меняется именно поле updated (поле ModifiedOn при этом может быть года этак 2015 и в выборку свежих объектов не попадает). Пример запроса:

https://ordoag.bpmonline.com/0/ServiceModel/EntityDataService.svc/PropertyGalleryImageCollection?$top=1

Результат:

version="1.0" encoding="utf-8"?>
xml:base="https://ordoag.bpmonline.com/0/ServiceModel/EntityDataService.svc/" xmlns="http://www.w3.org/2005/Atom" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:georss="http://www.georss.org/georss" xmlns:gml="http://www.opengis.net/gml">
        >https://ordoag.bpmonline.com/0/ServiceModel/EntityDataService.svc/PropertyGalleryImageCollection>

        </span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">"text"</span><span style="color: #000000; font-weight: bold;">></span></span>PropertyGalleryImageCollection<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">>
        >2017-02-27T14:32:38Z>
        rel="self" title="PropertyGalleryImageCollection" href="PropertyGalleryImageCollection" />
        >
                >https://ordoag.bpmonline.com/0/ServiceModel/EntityDataService.svc/PropertyGalleryImageCollection(guid'cc758317-6214-4d84-ab95-0002e72a9411')>
                term="Terrasoft.Configuration.PropertyGalleryImage" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />
                rel="edit" title="PropertyGalleryImage" href="PropertyGalleryImageCollection(guid'cc758317-6214-4d84-ab95-0002e72a9411')" />
                rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/CreatedBy" type="application/atom+xml;type=entry" title="CreatedBy" href="PropertyGalleryImageCollection(guid'cc758317-6214-4d84-ab95-0002e72a9411')/CreatedBy" />
                rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/ModifiedBy" type="application/atom+xml;type=entry" title="ModifiedBy" href="PropertyGalleryImageCollection(guid'cc758317-6214-4d84-ab95-0002e72a9411')/ModifiedBy" />
                rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/LockedBy" type="application/atom+xml;type=entry" title="LockedBy" href="PropertyGalleryImageCollection(guid'cc758317-6214-4d84-ab95-0002e72a9411')/LockedBy" />
                rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Type" type="application/atom+xml;type=entry" title="Type" href="PropertyGalleryImageCollection(guid'cc758317-6214-4d84-ab95-0002e72a9411')/Type" />
                rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Property" type="application/atom+xml;type=entry" title="Property" href="PropertyGalleryImageCollection(guid'cc758317-6214-4d84-ab95-0002e72a9411')/Property" />
                </span> <span style="color: #000000; font-weight: bold;">/></span></span><br />                 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;"><updated<span style="color: #000000; font-weight: bold;">></span></span></span>2017-02-27T14:32:38Z<span style="color: #009900;"><span style="color: #000000; font-weight: bold;"></updated<span style="color: #000000; font-weight: bold;">></span></span></span><br />                 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;"><author<span style="color: #000000; font-weight: bold;">></span></span></span><br />                         <span style="color: #009900;"><span style="color: #000000; font-weight: bold;"><name</span> <span style="color: #000000; font-weight: bold;">/></span></span><br />                 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;"></author<span style="color: #000000; font-weight: bold;">></span></span></span><br />                 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;"><link</span> <span style="color: #000066;">rel</span>=<span style="color: #ff0000;">"http://schemas.microsoft.com/ado/2007/08/dataservices/edit-media/Data"</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">"application/octet-stream"</span> <span style="color: #000066;">title</span>=<span style="color: #ff0000;">"Data"</span> <span style="color: #000066;">href</span>=<span style="color: #ff0000;">"PropertyGalleryImageCollection(guid'cc758317-6214-4d84-ab95-0002e72a9411')/Data"</span> <span style="color: #000000; font-weight: bold;">/></span></span><br />                 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;"><content</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">"application/xml"</span><span style="color: #000000; font-weight: bold;">></span></span><br />                         <span style="color: #009900;"><span style="color: #000000; font-weight: bold;"><m:properties<span style="color: #000000; font-weight: bold;">></span></span></span><br />                                 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;"><d:Id</span> <span style="color: #000066;">m:type</span>=<span style="color: #ff0000;">"Edm.Guid"</span><span style="color: #000000; font-weight: bold;">></span></span>cc758317-6214-4d84-ab95-0002e72a9411<span style="color: #009900;"><span style="color: #000000; font-weight: bold;"></d:Id<span style="color: #000000; font-weight: bold;">></span></span></span><br />                                 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;"><d:Name<span style="color: #000000; font-weight: bold;">></span></span></span>IMG_8264_marged(14-05-2014).jpg<span style="color: #009900;"><span style="color: #000000; font-weight: bold;"></d:Name<span style="color: #000000; font-weight: bold;">></span></span></span><br />                                 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;"><d:CreatedOn</span> <span style="color: #000066;">m:type</span>=<span style="color: #ff0000;">"Edm.DateTime"</span><span style="color: #000000; font-weight: bold;">></span></span>2015-12-16T15:47:39.2810926<span style="color: #009900;"><span style="color: #000000; font-weight: bold;"></d:CreatedOn<span style="color: #000000; font-weight: bold;">></span></span></span><br />                                 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;"><d:CreatedById</span> <span style="color: #000066;">m:type</span>=<span style="color: #ff0000;">"Edm.Guid"</span><span style="color: #000000; font-weight: bold;">></span></span>0a043409-0d95-4833-a11d-6b1d4e5ae568<span style="color: #009900;"><span style="color: #000000; font-weight: bold;"></d:CreatedById<span style="color: #000000; font-weight: bold;">></span></span></span><br />                                 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;"><d:ModifiedOn</span> <span style="color: #000066;">m:type</span>=<span style="color: #ff0000;">"Edm.DateTime"</span><span style="color: #000000; font-weight: bold;">></span></span>2015-12-16T15:47:39.2810926<span style="color: #009900;"><span style="color: #000000; font-weight: bold;"></d:ModifiedOn<span style="color: #000000; font-weight: bold;">></span></span></span><br />                                 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;"><d:ModifiedById</span> <span style="color: #000066;">m:type</span>=<span style="color: #ff0000;">"Edm.Guid"</span><span style="color: #000000; font-weight: bold;">></span></span>0a043409-0d95-4833-a11d-6b1d4e5ae568<span style="color: #009900;"><span style="color: #000000; font-weight: bold;"></d:ModifiedById<span style="color: #000000; font-weight: bold;">></span></span></span><br />                                 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;"><d:ProcessListeners</span> <span style="color: #000066;">m:type</span>=<span style="color: #ff0000;">"Edm.Int32"</span><span style="color: #000000; font-weight: bold;">></span></span>0<span style="color: #009900;"><span style="color: #000000; font-weight: bold;"></d:ProcessListeners<span style="color: #000000; font-weight: bold;">></span></span></span><br />                                 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;"><d:Notes</span><span style="color: #000000; font-weight: bold;">/></span></span><br />                                 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;"><d:LockedById</span> <span style="color: #000066;">m:type</span>=<span style="color: #ff0000;">"Edm.Guid"</span><span style="color: #000000; font-weight: bold;">></span></span>00000000-0000-0000-0000-000000000000<span style="color: #009900;"><span style="color: #000000; font-weight: bold;"></d:LockedById<span style="color: #000000; font-weight: bold;">></span></span></span><br />                                 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;"><d:LockedOn</span> <span style="color: #000066;">m:type</span>=<span style="color: #ff0000;">"Edm.DateTime"</span><span style="color: #000000; font-weight: bold;">></span></span>0001-01-01T00:00:00<span style="color: #009900;"><span style="color: #000000; font-weight: bold;"></d:LockedOn<span style="color: #000000; font-weight: bold;">></span></span></span><br />                                 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;"><d:TypeId</span> <span style="color: #000066;">m:type</span>=<span style="color: #ff0000;">"Edm.Guid"</span><span style="color: #000000; font-weight: bold;">></span></span>529bc2f8-0ee0-df11-971b-001d60e938c6<span style="color: #009900;"><span style="color: #000000; font-weight: bold;"></d:TypeId<span style="color: #000000; font-weight: bold;">></span></span></span><br />                                 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;"><d:Version</span> <span style="color: #000066;">m:type</span>=<span style="color: #ff0000;">"Edm.Int32"</span><span style="color: #000000; font-weight: bold;">></span></span>1<span style="color: #009900;"><span style="color: #000000; font-weight: bold;"></d:Version<span style="color: #000000; font-weight: bold;">></span></span></span><br />                                 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;"><d:Size</span> <span style="color: #000066;">m:type</span>=<span style="color: #ff0000;">"Edm.Int32"</span><span style="color: #000000; font-weight: bold;">></span></span>6106506<span style="color: #009900;"><span style="color: #000000; font-weight: bold;"></d:Size<span style="color: #000000; font-weight: bold;">></span></span></span><br />                                 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;"><d:Position</span> <span style="color: #000066;">m:type</span>=<span style="color: #ff0000;">"Edm.Int32"</span><span style="color: #000000; font-weight: bold;">></span></span>9<span style="color: #009900;"><span style="color: #000000; font-weight: bold;"></d:Position<span style="color: #000000; font-weight: bold;">></span></span></span><br />                                 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;"><d:Link</span><span style="color: #000000; font-weight: bold;">/></span></span><br />                                 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;"><d:PropertyId</span> <span style="color: #000066;">m:type</span>=<span style="color: #ff0000;">"Edm.Guid"</span><span style="color: #000000; font-weight: bold;">></span></span>e70021e1-b7a2-4644-a121-7ca975b6bc73<span style="color: #009900;"><span style="color: #000000; font-weight: bold;"></d:PropertyId<span style="color: #000000; font-weight: bold;">></span></span></span><br />                         <span style="color: #009900;"><span style="color: #000000; font-weight: bold;"></m:properties<span style="color: #000000; font-weight: bold;">></span></span></span><br />                 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;"></content<span style="color: #000000; font-weight: bold;">></span></span></span><br />         <span style="color: #009900;"><span style="color: #000000; font-weight: bold;"></entry<span style="color: #000000; font-weight: bold;">></span></span></span><br /> <span style="color: #009900;"><span style="color: #000000; font-weight: bold;"></feed<span style="color: #000000; font-weight: bold;">></span></span></span></div></div></p> <p>Видно, что updated свежий, а ModifiedOn - нет.</p> <p>Фильтрация по ModifiedOn:<br /> <a href="https://ordoag.bpmonline.com/0/ServiceModel/EntityDataService.svc/PropertyGalleryImageCollection?$top=1&$filter=ModifiedOn%20gt%20datetime%272017-02-20%27" rel="nofollow" >https://ordoag.bpmonline.com/0/ServiceModel/EntityDataService.svc/PropertyGalleryImageCollection?$top=1&$filter=ModifiedOn%20gt%20datetime%272017-02-20%27</a><br /> При попытке изменения ModifiedOn на updated:<br /> <a href="https://ordoag.bpmonline.com/0/ServiceModel/EntityDataService.svc/PropertyGalleryImageCollection?$top=1&$filter=updated%20gt%20datetime%272017-02-20%27" rel="nofollow" >https://ordoag.bpmonline.com/0/ServiceModel/EntityDataService.svc/PropertyGalleryImageCollection?$top=1&$filter=updated%20gt%20datetime%272017-02-20%27</a></p> <p>Ошибка следующего содержания.<br /> No property 'updated' exists in type 'Terrasoft.Configuration.PropertyGalleryImage' at position 0.<br /> Вопрос следующий: как модифицировать запрос для выборки именно по дате обновления исходного объекта, а не самого файла изображения?</p>

Нравится

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

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

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

Результат выполнения простого запроса http://localhost:84/0/ServiceModel/EntityDataService.svc/ContactCollect…? в разное время:
2017-02-28T08:27:53Z

2017-02-28T09:01:13Z

При том, что данные в таблице не изменялись.
Когда устанавливаете фильтр $filter, то это означает, что Вы обращаетесь к значениям элементов

Здравствуйте,
вы неправильно поняли, поля updated не существует в базе данных для данной сущности. Это поле добавляется сервисом, и отображает серверное время ответа на ваш запрос, а дата изменения сущности в Bpmonline, это как раз колонка ModifiedOn, которая существует, и меняется в рамках Bpmonline когда данная сущность изменяется. Следовательно, если у картинки такая дата изменения, то возможно она именно тогда и была загружена\изменена. Сам объект недвижимости мог быть скорректирован вчера, но картинки загружены в него еще полгода назад, и конечно же их ModifiedOn не будет изменен только потому что ModifiedOn самого объекта изменен, и.т.д. В общем одата судя по всему работает корректно, а вам стоит пересмотреть саму бизнес задачу получения данных.
Вы можете получать свою информацию в несколько этапов, к примеру, вначале получаете объекты недвижимости, измененные сегодня, потом оббегая список этих объектов, делаете запрос к их картинкам, с условием по родителю. Id которого вы получили в предыдущем запросе.

Спасибо за ваши ответы, что-то такое я и подозревал (собственно, ранее уже пытался брать фотку по id исходного объекта, и столкнулся с той же ошибкой, что опишу далее).

Почитал еще по поводу фильтра, но делаю как в примерах, и ответ сервера не тот)

В данном случае id исходного объекта - PropertyId. Взял guid этого объекта из сообщения выше, создал запрос:

https://ordoag.bpmonline.com/0/ServiceModel/EntityDataService.svc/Prope…

Ответ следующий:

<error xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
[geshifilter-code]1[/geshifilter-code]
<message xml:lang="">Элемент коллекции с именем PropertyId не найден</message>
<innererror>
<message>Элемент коллекции с именем PropertyId не найден</message>
<type>Terrasoft.Common.ItemNotFoundException</type>
<stacktrace>
at Terrasoft.Core.MetaItemCollection`1.GetByName(String name)
 at Terrasoft.Core.Entities.EntitySchema.GetInheritedPath(String columnPath)
 at Terrasoft.Core.Entities.EntitySchemaQuery.CreateSchemaColumnExpression(EntitySchemaQuery parentQuery, EntitySchema rootSchema, String columnPath, Boolean useCoalesceFunctionForMultiLookup, Boolean useDisplayValue)
 at Terrasoft.Core.Entities.EntityQueryWhereBlockBuilder.CreateExpression(Expression node)
 at Terrasoft.Core.Entities.EntityQueryWhereBlockBuilder.CreateSimpleFilter(BinaryExpression binary)
 at Terrasoft.Core.Entities.EntityQueryWhereBlockBuilder.BuildBlock(MethodCallExpression node)
 at Terrasoft.Core.Entities.EntityQueryProvider.VisitMethodCall(MethodCallExpression node)
 at Terrasoft.Core.Entities.EntityQueryProvider.Build(Expression expression)
 at Terrasoft.Core.Entities.EntityQueryProvider.LoadEntityCollection(Expression expression)
 at Terrasoft.Core.Entities.EntityQueryProvider.ExecuteEnumerable(Type elementType, Expression expression)
 at Terrasoft.Core.Entities.EntityQuery`1.GetEnumerator()
 at System.Data.Services.WebUtil.GetRequestEnumerator(IEnumerable enumerable)
 at System.Data.Services.DataService`1.SerializeResponseBody(RequestDescription description, IDataService dataService, IODataResponseMessage responseMessage)
 at System.Data.Services.DataService`1.HandleRequest()
</stacktrace>
</innererror>
</error>

Куда копать дальше?

Используйте запрос: https://ordoag.bpmonline.com/0/ServiceModel/EntityDataService.svc/Prope… eq guid'e70021e1-b7a2-4644-a121-7ca975b6bc73')

Всем большое спасибо!

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