Коллеги подскажите как переписать SQL запрос на EntitySchemaQuery
select DATEDIFF(day,d.DatePGP,d.DateOfContract)
from Document d LEFT OUTER JOIN
Guarantee g ON d.ApplicationId = g.Id
where g.GuaranteeProgramId in ('806ABB8C-1BB8-4614-9EBB-CA7E255A1381',
'B46D781A-4FF4-4AF8-ADA5-E391BA34AD19')
and d.TypeId ='C145B619-E1A2-45CE-870C-90925CA33C0B'
Нравится
Здравствуйте! Можете использовать класс CustomQuery и не переписывать данный запрос. Потом через IDataReader читать результат
var select = @"select DATEDIFF(day,d.DatePGP,d.DateOfContract) from Document d WITH(NOLOCK) LEFT OUTER JOIN Guarantee g WITH(NOLOCK) ON d.ApplicationId = g.Id where g.GuaranteeProgramId in ('806ABB8C-1BB8-4614-9EBB-CA7E255A1381', 'B46D781A-4FF4-4AF8-ADA5-E391BA34AD19') and d.TypeId ='C145B619-E1A2-45CE-870C-90925CA33C0B'"; var query = new CustomQuery(UserConnection, select); using (var dbExecutor = UserConnection.EnsureDBConnection()) { using (var dataReader = query.ExecuteReader(dbExecutor)) { while (dataReader.Read()) { //Обработка результата } } }
Это скорее всего не подойдет, мне нужно выполнить это запрос при нажатии на кнопку Сохранить,и в зависимости от результата между датами сохранить запись либо вывести сообщение пользователю что даты не корректно заполнены.
именно так и хотел сделать. но как добавить дополнительные условия?
g.GuaranteeProgramId in ('806ABB8C-1BB8-4614-9EBB-CA7E255A1381',
'B46D781A-4FF4-4AF8-ADA5-E391BA34AD19')
and d.TypeId ='C145B619-E1A2-45CE-870C-90925CA33C0B'
Что то вроде этого
var firstDt = this.get("DatePGP"); var secondDt = this.get("DateOfContract"); var timeDiff = Math.abs(secondDt.getTime() - firstDt.getTime()); var diffDays = Math.ceil(timeDiff / (1000 * 3600 * 24));
так уже сложнее получается., я думал что запросом чрезе EntitySchemaQuery вытащу разницу в днях и ее уже буду анализировать.
никак не получиться?
Как вариант, можно сделать в объекте числовое поле «Разница в днях» и при добавлении записи или изменении дат при помощи БП (обычного или встроенного) или триггера в базе заполнять его вычисленными значением. Затем с ним работать.
Евдокимов Евгений пишет:
так уже сложнее получается., я думал что запросом чрезе EntitySchemaQuery вытащу разницу в днях и ее уже буду анализировать.никак не получиться?
Можно делать эту проверку в обработчике события Before saving record в Entity Schema.
Если условие некорректно генерировать исключение:
throw new System.InvalidOperationException("Даты внесены некорректно!")
Однако более правильно реализовать такую проверку на клиенте.
делаю проверку на клиенте, теперь invalid date ругается на это поле
var PGPDATE = new Date (this.get("Datepgp"));
подскажите как преобразовать в формат Wed Apr 1 00:00:00 UTC+0400 2009, ??
Евдокимов Евгений,
Не нужно this.get("Datepgp") подставлять в new Date(), Вам и так возвращает дату.
в том и дело что не возвращается почему то... пусто.
может дело в том что это поле я заполняю в тригере и берется из другой таблицы.
var DateOfContract = new Date (this.get("DateOfContract"));
var PGPDATE = this.get("Datepgp");
{ this.showInformationDialog(DateOfContract);
return;
}
в данном варианте дата показывается
var PGPDATE = this.get("Datepgp");
{ this.showInformationDialog(PGPDATEt);
return;
}
то пусто
если вот так
var PGPDATE = ew Date (this.get("Datepgp"));
{ this.showInformationDialog(DateOfContract);
return;
}
то invalid date
самом собой сравнить между собой DateOfContract и PGPDATE не получается
Может, там действительно из базы возвращается пусто. Посмотрите в профайлере, какой запрос идёт в базу, а потом его запустите в Management Studio, чтобы увидеть выдачу по нему. Или просто посмотрите содержимое поля в таблице.
А если там дата, но в неподдерживаемом формате, можно её разбирать регулярными выражениями (или просто по пробелам), а потом формировать из частей при помощи new Date со многими параметрами.
Если поле в базе и в объекте типа «Дата и время», то должно считываться стандартными средствами нормально. Посмотрите в отладчке браузера, что в переменной PGPDATE и чем отличается от других дат.
Нигрескул Алексей пишет:
Нигрескул Алексей,
этот вариант не работает выдает ошибку
var DateOfContract = new Date (this.get("DateOfContract"));
это значение можно увидеть так
а для var PGPDATE = new Date (this.get("PGPDATE"));
вот так
поле PGPDATE заполняю в триггере
update Document
set document.PGPDATE=Activity.DueDate
from document , Activity
where Activity.Title='Подготовить гарантийное письмо.'
and Activity.GuaranteeId=document.ApplicationId
and Document.TypeId ='C145B619-E1A2-45CE-870C-90925CA33C0B'
and Document.PGPDATE is null
поле DateOfContract заполняется через карточку при редактировании созданого документа и идет проверка на разницу с PGPDATE
Евдокимов Евгений,
попробуйте так -
var PgpDate= new Date (this.get("PgpDate")); может проблема в регистре. Так же для просчета разницы в днях можно использовать следующую функцию:
Terrasoft.utils.date.dateDiffDays(new Date("2019-04-11"), new Date());
Евдокимов Евгений пишет:
поле PGPDATE заполняю в триггере
Если там и так есть триггер, сделайте ещё одно числовое поле и в том же триггере заполняйте разницей.
Зверев Александр,
дело в том что поле DayteOfContact не заполнено когда срабатывает триггер, это поле вводится с карточки документа.Так то конечно было был проще
Нигрескул Алексей,
пробовал и так var PgpDate= new Date (this.get("PgpDate"))
все равно не получается
Евдокимов Евгений пишет:
дело в том что поле DayteOfContact не заполнено когда срабатывает триггер
Значит, можно триггер на его заполнение.
Евдокимов Евгений пишет:
все равно не получается
Значит, дата не в том формате.
скорее всего чт то с форматом, не могу понять. в БД формат Date, заетм изменил на datetime но результат такой же.
хочу попробовать тащить дату для сравнения не через триггер а сразу на клиенте для это нужно чрезе запрос
select a.duedate
from Activity a left outer join Guarantee g on a.guaranteeid=g.id
left outer join Document d
on d.ApplicationId=g.id
where d.id='69135BBB-E7FA-430D-B801-C390B3FEA5D0'
and a.Title='Подготовить гарантийное письмо.'
вытащить дату и потом результат сравнить с DateOfContarct