Components for Delphi and C++ Builder.

Перейти в английский форум
Перейти на EhLib.com
Текущее время: 27 апр 2024, 18:54

Часовой пояс: UTC




Начать новую тему Ответить на тему  [ Сообщений: 8 ] 
Автор Сообщение
СообщениеДобавлено: 17 ноя 2020, 18:17 
Не в сети

Зарегистрирован: 18 июн 2018, 22:16
Сообщений: 16
Доброе время суток,
Есть такой запрос:
Код:
EXECUTE BLOCK RETURNS (ID integer, NAME varchar(400), "TYPE" varchar(40), NUMBER varchar(25), NEMBER_INVENTORY varchar(10), PRODUCER varchar(200),  YEAR_BEGIN integer,

for select eq.ID,
      eq.HOST_LABORATORY, eq.CALIBRATION_INTERVAL from EQUIPMENT eq where ARCHIVE in (1)   and PASSPORT = 1  order by NAME into :ID_EQUIP, :LAB_ID, :CALIBR_INT
       do for select eq.ID,

… into ID, NAME, "TYPE", … do suspend; END

т.е. сортировка "order by NAME" стоит внутри запроса.
Я знаю чтоб работала сортировка (серверная), нужно предложение «order by» начинать с новой строки.
Составил такую комбинацию:
Код:
    ADataSet.SelectSQL.Clear;
    ADataSet.SelectSQL.Add(L_SQL1);
    ADataSet.SelectSQL.Add('order by '+ AColumn.FieldName+' ');
    ADataSet.SelectSQL.Add(L_SQL2);
   ADataSet.Active := true;

В которой «L_SQL1» часть представленного выше запроса до 'order by ', а «L_SQL2» - часть запроса после 'order by '.
Сортировка происходит, точнее данные в столбце сортируются но по непонятному полю. но не по NAME.
Конечно же подключен модуль "EhLibIBX".

В чем может быть зацепка.
Запрос который в результате формируется такой комбинацией рабочий, я проверял его с помощью IBExpert

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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 18 ноя 2020, 15:52 
Не в сети

Зарегистрирован: 21 дек 2011, 18:48
Сообщений: 1549
Добрый день.

Добрый день.
Если вы имеете в виду серверную сортировку при клике на заголовок грида, то попробуйте отладить функцию, которая формирует SQL выражение при сортировке.
Для этого установите точку останова в методе
Код:
procedure TSQLDatasetFeaturesEh.ApplySorting(Sender: TObject; DataSet: TDataSet; IsReopen: Boolean);

_________________
Best regards
EhLib support Team


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 18 ноя 2020, 18:27 
Не в сети

Зарегистрирован: 18 июн 2018, 22:16
Сообщений: 16
Та не, там вроде все нормально...
в
Код:
procedure ApplySortingForSQLBasedDataSet(Grid: TCustomDBGridEh; DataSet: TDataSet;
   UseFieldName: Boolean; IsReopen: Boolean; const SQLPropName: String);

....
    SetDataSetSQLLikeProp(DataSet, SQLPropName, WideString(SQL.Text));
...

во время отладки
в "SQL.Text"
Код:
'EXECUTE BLOCK RETURNS (ID integer, NAME varchar(400), "TYPE" varchar(40), NUMBER varchar(25), NEMBER_INVENTORY varchar(10), PRODUCER varchar(200),  YEAR_BEGIN integer, CALIBRATION_INTERVAL integer, NAME_TEST varchar(300), REMARK varchar(2000), USER_ID integer, DEPARTMENT_ID integer,  TIME_EDIT timestamp, ARCHIVE integer, SPECIFICATION  varchar(2000), DEVICE_DEPARTMENT_ID integer,  TYPE_SERIES integer, DISLOCATION  varchar(50),  TYPE_EQUIP integer, PASSPORT integer, HOST_LABORATORY integer, NAME_SHORT_LAB varchar(20), NUMBER_CERT varchar(25), LAST_DATE date, HOST_USER varchar(30), COUNT_CERT integer)  AS  declare variable ID_EQUIP integer; declare variable LAB_ID integer; declare variable CALIBR_INT integer;  declare procedure RECIEVE_LAB(LAB_ID integer) RETURNS(ID integer, NAME_SHORT_LAB varchar(20))  as  begin for execute statement '' SELECT ID, NAME_SHORT FROM LABORATORY where ID = ''||LAB_ID  on external ''D:\Database\Plan.fdb'' AS USER ''SYSDBA'' PASSWORD ''masterkey''   into :ID, :NAME_SHORT_LAB do suspend; end   declare procedure LAST_CERT(ID_EQUIP integer, CALIBR_INT integer) returns(NUMBER_CERT varchar(25), LAST_DATE date, DEVICE_ID_CL integer) as  begin for execute statement ''SELECT ce.NUMBER_CERT, ce.DATE_OUT, ce.DEVICE_ID_CL FROM CERTIFICATE ce  left join CERTIFICATE b on ce.DEVICE_ID_CL = b.DEVICE_ID_CL and ce.DATE_OUT < b.DATE_OUT  where b.DEVICE_ID_CL is NULL and ce.DEVICE_ID_CL in (''||ID_EQUIP||'')''   on external ''192.168.0.222:D:\Database\Plan.fdb'' AS USER ''SYSDBA'' PASSWORD ''masterkey''   into :NUMBER_CERT, :LAST_DATE, :DEVICE_ID_CL do suspend; end   begin for select eq.ID, eq.HOST_LABORATORY, eq.CALIBRATION_INTERVAL from EQUIPMENT eq where ARCHIVE in (1)   and PASSPORT = 1  '#$D#$A#$D#$A#$D#$A'ORDER BY 3 DESC'#$D#$A'into :ID_EQUIP, :LAB_ID, :CALIBR_INT do for select eq.ID, eq.NAME, eq."TYPE", eq.NUMBER, eq.NEMBER_INVENTORY, eq.PRODUCER, eq.YEAR_BEGIN, eq.CALIBRATION_INTERVAL, eq.NAME_TEST, eq.REMARK, eq.USER_ID,  eq.DEPARTMENT_ID, eq.TIME_EDIT, eq.ARCHIVE, eq.SPECIFICATION, eq.DEVICE_DEPARTMENT_ID, eq.TYPE_SERIES, eq.DISLOCATION, eq.TYPE_EQUIP, eq.PASSPORT,  eq.HOST_LABORATORY, eq.HOST_USER, eq.COUNT_CERT, rl.NAME_SHORT_LAB, (case when lc.NUMBER_CERT = ''-1'' then '''' else lc.NUMBER_CERT end),  lc.LAST_DATE from EQUIPMENT eq left join RECIEVE_LAB(:LAB_ID) rl on rl.id = eq.HOST_LABORATORY  left join LAST_CERT(:ID_EQUIP, :CALIBR_INT) lc on lc.DEVICE_ID_CL = eq.ID where eq.ID = :ID_EQUIP   into ID, NAME, "TYPE", NUMBER, NEMBER_INVENTORY, PRODUCER, YEAR_BEGIN, CALIBRATION_INTERVAL, NAME_TEST, REMARK, USER_ID, DEPARTMENT_ID, TIME_EDIT, ARCHIVE,  SPECIFICATION, DEVICE_DEPARTMENT_ID, TYPE_SERIES, DISLOCATION, TYPE_EQUIP, PASSPORT, HOST_LABORATORY, HOST_USER, COUNT_CERT, NAME_SHORT_LAB, NUMBER_CERT, LAST_DATE do suspend; END'#$D#$A#$D#$A#$D#$A#$D#$A


я вижу, что в предложении сортировки стоит
Код:
...ORDER BY 3 DESC...


Последний раз редактировалось Konstantin78 18 ноя 2020, 23:13, всего редактировалось 1 раз.

Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 18 ноя 2020, 18:56 
Не в сети

Зарегистрирован: 18 июн 2018, 22:16
Сообщений: 16
ВСЕ РАЗОБРАЛСЯ...
проблема в подстановке в предложении "order by"
Код:
select eq.ID, eq.HOST_LABORATORY, eq.CALIBRATION_INTERVAL, eq.NAME, eq."TYPE"
from EQUIPMENT eq where ARCHIVE in (1)   and PASSPORT = 1  ORDER BY 3 DESC


в том что вместо наименования поля, например "TYPE"
процедура
Код:
procedure ApplySortingForSQLBasedDataSet(Grid: TCustomDBGridEh; DataSet: TDataSet;
   UseFieldName: Boolean; IsReopen: Boolean; const SQLPropName: String);

подставляет порядковый номер поля c запроса, т.е "eq.CALIBRATION_INTERVAL".
Хотя в самой таблице под номером 3 стоит поле не с названием "eq.CALIBRATION_INTERVAL", а с названием "eq.TYPE"-по которому я жму в гриде заголовок колонки.

А можно, вместо номера, указывать название поля?


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 18 ноя 2020, 21:31 
Не в сети

Зарегистрирован: 21 дек 2011, 18:48
Сообщений: 1549
Добрый день.

Вы можете написать свою версию TIBSQLDatasetFeaturesEh.
И в порожденном классе указать в конструкторе
SortUsingFieldName := True;

Зарегистрируйте ваш класс сортировки и фильтрации для DataSet'а.
Код:
initialization
  RegisterDatasetFeaturesEh(TMyIBSQLDatasetFeaturesEh, TIBQuery);
end.


---
Если данное изменение необходимо только в одном гриде, то вы можете переопределить событие DBGridEh.OnSortMarkingChanged
и вызвать
Код:
      ApplySortingForSQLBasedDataSet(TCustomDBGridEh(Sender), DataSet,
        SortUsingFieldName=True, IsReopen, SQLPropName);
напрямую.

_________________
Best regards
EhLib support Team


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 19 ноя 2020, 13:20 
Не в сети

Зарегистрирован: 18 июн 2018, 22:16
Сообщений: 16
EhLibSupport писал(а):

Если данное изменение необходимо только в одном гриде, то вы можете переопределить событие DBGridEh.OnSortMarkingChanged
и вызвать
Код:
      ApplySortingForSQLBasedDataSet(TCustomDBGridEh(Sender), DataSet,
        SortUsingFieldName=True, IsReopen, SQLPropName);
напрямую.


Еще раз спасибо. воспользовался вторым вами предложеным вариантом.
Код:
ApplySortingForSQLBasedDataSet(TCustomDBGridEh(Sender), DM.ibdsEquipment, true, true, 'SelectSQL');

Пока работает.
Надеюсь это не повлияет на работу других DBGridEh (которой пока на заметил)


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 19 ноя 2020, 15:26 
Не в сети

Зарегистрирован: 18 июн 2018, 22:16
Сообщений: 16
А извините еще вопрос из этой же "оперы"
если в DataSet есть вычисляемое поле (сделанное в TIBDataSet отображаемое DBGridEh, сортировка серверная) напирмер "calc_СOLOR", и поле-источник в БД "СOLOR".
При нажатии на заголовок колонки "calc_СOLOR", я корректирую order by и подставляю в запрос "СOLOR".
Но в процедуре ApplySortingForSQLBasedDataSet, всеравно поставляется "calc_СOLOR"?

в этой ситуации как быть?


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 20 ноя 2020, 00:09 
Не в сети

Зарегистрирован: 18 июн 2018, 22:16
Сообщений: 16
Т.е. не знаю насколько это правильно...
Но для сортировки по вычисляемому полю (сделанное в TIBDataSet отображаемое DBGridEh, сортировка серверная)

сначало в запрос конечно подставляю в предложение order by поле "COLOR" (см. предыдущий пост)
происходит сортировка (в том числе работа процедуры "ApplySortingForSQLBasedDataSet")
которую я прямо вызываю с события "DBGridEh.SortMarkingChanged".
Следующей строкой
DBGridEh.Columns[10].FieldName := 'calc_COLOR';
- я ставлю все на свои места

Это работает


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

Часовой пояс: UTC


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 32


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB