Вопрос

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'

 

Нравится

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

Здравствуйте! Можете использовать класс CustomQuery и не переписывать данный запрос. Потом через IDataReader читать результат 

как это сделать , есть пример?

это для версии 7 10 3 

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 

 

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