powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Не получается вывести строки, которых нет в одной из таблиц
10 сообщений из 35, страница 2 из 2
Не получается вывести строки, которых нет в одной из таблиц
    #40020040
Kos-2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Polesov

Совершенно не обязательно. Какой компонент ADataSet используется?

Текст запроса можно посмотреть в отладчике. Надо на строке ADataSet.Active := true; поставить точку останова
И при попадании в нее в окне "Evalute/Modify" посмотреть значение ADataSet.SelectSQL.Text
Или в том же окне "Evalute/Modify" сохранить текст запроса, введя ADataSet.SelectSQL.SaveToFile( <FileName.Ext> )


ADataSet - компонент TIBDataSet

про " Evalute/Modify " - я так и делал, я от туда вставлял запрос в IBExpert
...
Рейтинг: 0 / 0
Не получается вывести строки, которых нет в одной из таблиц
    #40020042
Kos-2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan_Pisarevsky
Посмотри через трассировку, что фактически улетает на сервер, и про эхалиб лучше спросить в соседнем разделе.

Уже...
шел, шел... "F8" (через разные "System.Classes", "System", "System.TypInfo", "System.SysUtils") минут 10 - терпения не хватило...

Хотя наверное нужно выборку сократить до записей пяти (просто там их у меня 310)
...
Рейтинг: 0 / 0
Не получается вывести строки, которых нет в одной из таблиц
    #40020128
Kos-2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как подсказали, собака может быть зарыта в методе:
Код: sql
1.
procedure TSQLDatasetFeaturesEh.ApplySorting(Sender: TObject; DataSet: TDataSet; IsReopen: Boolean);


и в этом методе поставить точку останова.
пришлось добавить в проект модуль "EhLibIBX"

P.S.
Да этот метод срабатывает уже после моих строк:
Код: sql
1.
2.
3.
...
ADataSet.SelectSQL.Add(L_SQL2);
ADataSet.Active := true;
...
Рейтинг: 0 / 0
Не получается вывести строки, которых нет в одной из таблиц
    #40020130
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kos-2010

про " Evalute/Modify " - я так и делал, я от туда вставлял запрос в IBExpert

А теперь то же самое после строки
Код: pascal
1.
  ADataSet.Active := true;


и сравнить с тем, что было до
...
Рейтинг: 0 / 0
Не получается вывести строки, которых нет в одной из таблиц
    #40020142
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kos-2010,

ваше applySorting может само добавлять к запросу order by. Прочитайте документацию.
И я так понял, финальный запрос, который выдает ошибку, мы не увидим?
Я так и не понял - каким образом вы В СЕРЕДИНУ запроса сами добавляете order by fieldname?
Order by может быть только в самом конце запроса (ну или в подзапросе, но это не приветствуется в SQL).
...
Рейтинг: 0 / 0
Не получается вывести строки, которых нет в одной из таблиц
    #40020146
Kos-2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Метод:
Код: sql
1.
2.
3.
4.
5.
6.
procedure ApplySortingForSQLBasedDataSet(Grid: TCustomDBGridEh; DataSet: TDataSet;
   UseFieldName: Boolean; IsReopen: Boolean; const SQLPropName: String);

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



во время отладки
в " SQL.Text "

Код: sql
1.
'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



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



РАЗОБРАЛСЯ
проблема в подстановке в предложении " order by "
Код: sql
1.
2.
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 "
процедура

Код: sql
1.
2.
procedure ApplySortingForSQLBasedDataSet(Grid: TCustomDBGridEh; DataSet: TDataSet;
   UseFieldName: Boolean; IsReopen: Boolean; const SQLPropName: String);



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

Т.е. сортировка происходит не по ЖЕЛАЕМОМУ ПОЛЮ

Нужно как-то туда поставить НУЖНОЕ название поля или его номер
...
Рейтинг: 0 / 0
Не получается вывести строки, которых нет в одной из таблиц
    #40020148
Kos-2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv
Kos-2010,
...
Я так и не понял - каким образом вы В СЕРЕДИНУ запроса сами добавляете order by fieldname?

ну парсингом запроса занимаюсь: в средине запроса ищу " order by " и потом заменяю его на свой " order by "
и как я выше указывал
Составил такую комбинацию:
Код: sql
1.
2.
3.
4.
5.
    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 '.
...
Рейтинг: 0 / 0
Не получается вывести строки, которых нет в одной из таблиц
    #40020192
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kos-2010Хотя в самой таблице под номером 3 стоит поле
да хоть под номером 10. ORDER BY number - это номер столбца в выборке.
Его имя и порядковое место в таблице вообще до лампочки.
У вас "eq.TYPE" стоит на 5м месте, значит должно быть
ORDER BY 5
Kos-2010а с названием "eq.TYPE"-по которому я жму в гриде заголовок колонки.
то есть, грид не соображает, что у этого столбца в выборке номер не тот, который в списке грида.
Получается, в таблице у вас один порядок столбцов, в запросе - другой, а в гриде - третий?
Kos-2010 ADataSet.SelectSQL.Add('order by '+ AColumn.FieldName+' ');
в AColumn.FieldName что написано - eq.TYPE или eq."TYPE" ?

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

Kos-2010select 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'
тут то что не так? три столбца, order by 3, всё нормально.
...
Рейтинг: 0 / 0
Не получается вывести строки, которых нет в одной из таблиц
    #40020242
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv

Kos-2010select 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'

тут то что не так?
Видимо, то, что в запросе отсутствует eq.TYPE и при order by 3 сортировка производится по полю eq.CALIBRATION_INTERVAL
...
Рейтинг: 0 / 0
Не получается вывести строки, которых нет в одной из таблиц
    #40020466
Kos-2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если кому интересно
на EhLib'e в таком случае посоветовали

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


зарегистрировав мой класс сортировки и фильтрации для DataSet'а.
Код: sql
1.
2.
3.
initialization
  RegisterDatasetFeaturesEh(TMyIBSQLDatasetFeaturesEh, TIBQuery);
end.


или

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


напрямую.

Ну я воспользовался вторым вариантом.
Пока работает. Далее посмотрим.
...
Рейтинг: 0 / 0
10 сообщений из 35, страница 2 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Не получается вывести строки, которых нет в одной из таблиц
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]