sql запрос на EntitySchemaQuery
Коллеги подскажите как переписать 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 
 
  .jpg) 
   
  