Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / UniQuery получить реальное имя поле по всевдониму / 25 сообщений из 32, страница 1 из 2
11.02.2020, 22:40
    #39925423
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UniQuery получить реальное имя поле по всевдониму
Есть SQL запрос типа

Код: sql
1.
2.
3.
4.
5.
6.
select 
a.id,
a.date_input,
USR.NAME USEREDIT_NAME,
from table1 a
LEFT JOIN USERS USR ON A.UID = USR.ID



в процессе работы программы нужно добавить
Код: sql
1.
WHERE (lower(USR.NAME) LIKE '%вася%')



Это связано с тем, что в каждом столбце сетки, как у cxGrid есть встроенная строка фильтрации по данному столбцу.
У UniQuery у persistent-полей есть возможность добраться до TField UniDBGrid.Columns[I].Field.

Вот такая предыстория.
Т.е. фактически вопрос состоит в том, есть ли готовая встроенная возможность получить реальное имя поля у TField?

По идее, есть Field.Origin:
http://docwiki.embarcadero.com/Libraries/XE6/en/Data.DB.TField.Origin
Но TField.Origin возвращает пустую строку всегда
Код: pascal
1.
sFieldName := UniDBGrid.DataSource.DataSet.FieldByName(UniDBGrid.Columns[I].FieldName).Origin;
...
Рейтинг: 0 / 0
11.02.2020, 23:19
    #39925435
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UniQuery получить реальное имя поле по всевдониму
Нашел ещё

Код: pascal
1.
2.
3.
4.
5.
6.
7.
Var
CRFieldDesc: TCRFieldDesc;
begin
...
..
      CRFieldDesc := TCRFieldDesc(UniDBGrid.DataSource.DataSet.FieldByName(UniDBGrid.Columns[I].FieldName));
      sFieldName := CRFieldDesc.ActualName;// пусто


но ActualName возвращает пустое значение
...
Рейтинг: 0 / 0
12.02.2020, 11:41
    #39925541
b0rk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UniQuery получить реальное имя поле по всевдониму
X11
Нашел ещё

Код: pascal
1.
2.
3.
4.
5.
6.
7.
Var
CRFieldDesc: TCRFieldDesc;
begin
...
..
      CRFieldDesc := TCRFieldDesc(UniDBGrid.DataSource.DataSet.FieldByName(UniDBGrid.Columns[I].FieldName));
      sFieldName := CRFieldDesc.ActualName;// пусто


но ActualName возвращает пустое значение

если использовать кошерный каст, то можно избежать многих ошибок:
Код: pascal
1.
CRFieldDesc := UniDBGrid.DataSource.DataSet.FieldByName(UniDBGrid.Columns[I].FieldName) as TCRFieldDesc;
...
Рейтинг: 0 / 0
12.02.2020, 12:06
    #39925561
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UniQuery получить реальное имя поле по всевдониму
b0rk,

а это не одно и то же
TCRFieldDesc(...FieldByName);
и
FieldByName as TCRFieldDesc;
...
Рейтинг: 0 / 0
12.02.2020, 12:08
    #39925563
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UniQuery получить реальное имя поле по всевдониму
b0rk
Код: pascal
1.
 UniDBGrid.DataSource.DataSet.FieldByName(UniDBGrid.Columns[I].FieldName) as TCRFieldDesc;



error Incompatible types: 'TField' and 'TCRFieldDesc'
...
Рейтинг: 0 / 0
12.02.2020, 12:47
    #39925591
devart
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UniQuery получить реальное имя поле по всевдониму
X11
Есть SQL запрос типа

Код: sql
1.
2.
3.
4.
5.
6.
select 
a.id,
a.date_input,
USR.NAME USEREDIT_NAME,
from table1 a
LEFT JOIN USERS USR ON A.UID = USR.ID



в процессе работы программы нужно добавить
Код: sql
1.
WHERE (lower(USR.NAME) LIKE '%вася%')



Это связано с тем, что в каждом столбце сетки, как у cxGrid есть встроенная строка фильтрации по данному столбцу.
У UniQuery у persistent-полей есть возможность добраться до TField UniDBGrid.Columns[I].Field.

Вот такая предыстория.
Т.е. фактически вопрос состоит в том, есть ли готовая встроенная возможность получить реальное имя поля у TField?

По идее, есть Field.Origin:
http://docwiki.embarcadero.com/Libraries/XE6/en/Data.DB.TField.Origin
Но TField.Origin возвращает пустую строку всегда
Код: pascal
1.
sFieldName := UniDBGrid.DataSource.DataSet.FieldByName(UniDBGrid.Columns[I].FieldName).Origin;


На последней доступной версии UniDAC 8.1.2 вам следует использовать свойство TUniQuery.Options.FieldOrigins. TFieldOrigins это перечисление (foNone, foField, foTableAndField, foTableAliasAndField) и значение пор умолчанию foNone, поэтому TField.Origin возвращает пустую строку. Для решения вашей задачи вам следует установить свойство TUniQuery.Options.FieldOrigins в значение отличное от foNone.
...
Рейтинг: 0 / 0
12.02.2020, 13:17
    #39925633
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UniQuery получить реальное имя поле по всевдониму
devart
На последней доступной версии UniDAC 8.1.2


В последней доступной МНЕ или в последней доступной сейчас на сайте?
Просто моя лицензия закончилась в ноябре.

Насколько я понял, я успел скачать версию 8.0.1. И в в этой версии моя проблема не решится, правильно?
...
Рейтинг: 0 / 0
12.02.2020, 13:27
    #39925648
devart
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UniQuery получить реальное имя поле по всевдониму
X11
devart
На последней доступной версии UniDAC 8.1.2


В последней доступной МНЕ или в последней доступной сейчас на сайте?
Просто моя лицензия закончилась в ноябре.

Насколько я понял, я успел скачать версию 8.0.1. И в в этой версии моя проблема не решится, правильно?

Данное свойство было добавлено в UniDAC 7.3.10 от 17 сентября 2018
...
Рейтинг: 0 / 0
15.02.2020, 18:20
    #39927043
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UniQuery получить реальное имя поле по всевдониму
А в Options есть есть такое же. И оно может иметь отличное от свойства значение.
...
Рейтинг: 0 / 0
17.02.2020, 14:13
    #39927478
devart
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UniQuery получить реальное имя поле по всевдониму
X11
А в Options есть есть такое же. И оно может иметь отличное от свойства значение.

Мы уже исправили данное поведение. Данное изменение вошло в UniDAC 8.1.2, который доступен для скачивания на нашем сайте.
...
Рейтинг: 0 / 0
17.02.2020, 14:24
    #39927485
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UniQuery получить реальное имя поле по всевдониму
доступно но только после оплаты лицензии
...
Рейтинг: 0 / 0
18.02.2020, 20:33
    #39928177
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UniQuery получить реальное имя поле по всевдониму
в запросе есть поле

Код: sql
1.
2.
3.
4.
5.
6.
select 
...,
...,
(SELECT CAST(COUNT(CL.ID) AS INTEG) FROM CLIENT CL WHERE CL.ID_CLIENT = C.ID) CLIENTS_COUNT,
...
from Table1




В общем, в origin попадает "CAST" и получается в итоге
Код: sql
1.
ORDER BY CAST
...
Рейтинг: 0 / 0
18.02.2020, 21:00
    #39928184
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UniQuery получить реальное имя поле по всевдониму
X11
В общем, в origin попадает "CAST"
Предлагаю костыль
Код: sql
1.
2.
3.
4.
5.
6.
select 
...,
...,
(SELECT CAST(COUNT(CL.ID) AS INTEG) FROM CLIENT CL WHERE CL.ID_CLIENT = C.ID) AS "CAST",
...
from Table1
...
Рейтинг: 0 / 0
18.02.2020, 21:11
    #39928189
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UniQuery получить реальное имя поле по всевдониму
Проблема в том, что там может быть больше одного поля, у меня их на данный момент два.
...
Рейтинг: 0 / 0
19.02.2020, 13:56
    #39928426
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UniQuery получить реальное имя поле по всевдониму
В общем, решил проблему с помощью вычисляемых полей.
...
Рейтинг: 0 / 0
19.02.2020, 14:06
    #39928431
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UniQuery получить реальное имя поле по всевдониму
Странно, в запросе CASE нету.
Код: sql
1.
2.
3.
4.
5.
6.
select 
...
...
  IIF(C.DELETED = 1, TRUE, FALSE) DELETED,
...
from ...



а origion выдет название поля CASE вместо DELETED или C.DELETED.
...
Рейтинг: 0 / 0
19.02.2020, 14:31
    #39928457
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UniQuery получить реальное имя поле по всевдониму
X11
а origion выдет название поля CASE вместо DELETED или C.DELETED.
Я бы исходники посмотрел. Если с CAST все более менее логично (первое слово после пробела), то с IIF что-то ты не договариваешь
Код: sql
1.
2.
3.
select 
  IIF(C.DELETED = 1, TRUE, FALSE) DELETED
from my_table c

что получится?
...
Рейтинг: 0 / 0
19.02.2020, 14:56
    #39928483
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UniQuery получить реальное имя поле по всевдониму
Я понял почему. Заполняется свойство ORIGIN, и если ты меняешь запрос, то и persistent-поле нужно пересоздавать, иначе там старое значение.
Я так думаю, что свойство ORIGIN можно и самом заполнять ручками?
...
Рейтинг: 0 / 0
19.02.2020, 15:10
    #39928495
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UniQuery получить реальное имя поле по всевдониму
X11
если ты меняешь запрос, то и persistent-поле нужно пересоздавать
И снова грабли с персистентными полями
...
Рейтинг: 0 / 0
19.02.2020, 18:11
    #39928610
devart
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UniQuery получить реальное имя поле по всевдониму
Код: sql
1.
2.
3.
4.
5.
6.
select 
...,
...,
(SELECT CAST(COUNT(CL.ID) AS INT) FROM CLIENT CL WHERE CL.ID_CLIENT = C.ID) CLIENTS_COUNT,
...
from Table1



Мы заполняем значения свойства Origin для полей набора данных на основании информации, которую нам возвращает сервер для колонок SQL выражения. Для колонки CLIENTS_COUNT сервер не вернет никакой информации о таблице. Поэтому в свойстве Origin может быть только псевдоним колонки.
Если Вы установили свойству FieldOrigins значение foTableAliasAndField, и для поля "CLIENTS_COUNT" в наборе данных свойство Origin не равно "CLIENTS_COUNT", тогда вы можете написать нам в поддержку и мы обязательно исследуем такое поведение UniDAC.
...
Рейтинг: 0 / 0
19.02.2020, 20:35
    #39928635
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UniQuery получить реальное имя поле по всевдониму
Подскажите, а в какой момент заполняется свойство Origin?
При создании persistent-поле в дизайне или во время исполнения программы?
...
Рейтинг: 0 / 0
20.02.2020, 07:41
    #39928720
maratvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UniQuery получить реальное имя поле по всевдониму
X11,

В фибах есть такая функция GetFieldByAlias , которая примерно тем и занимается, что вытаскивает имя поля или целое выражение из SQL-запроса по алиасу поля. Бывает что ошибается, просто надо помнить, что выражение должно быть целиком заключено в скобки. На самом деле - это некий текстовый парсер, который как-то что-то вытаскивает из текста запроса. Можно, наверное, целиком заюзать эту функцию и в унидаках, если у них такой нет. А может в унидаках тоже что-то похожее есть?
...
Рейтинг: 0 / 0
20.02.2020, 12:59
    #39928862
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UniQuery получить реальное имя поле по всевдониму
devart
Мы заполняем значения свойства Origin для полей набора данных на основании информации, которую нам возвращает сервер для колонок SQL выражения.


т.е. SQL-сервер САМ парсит SQL запрос программиста?
...
Рейтинг: 0 / 0
20.02.2020, 13:01
    #39928865
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UniQuery получить реальное имя поле по всевдониму
20.02.2020 12:59, X11 пишет:
> т.е. SQL-сервер САМ парсит SQL запрос программиста?

us!
а как же иначе то?!
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
20.02.2020, 13:08
    #39928872
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UniQuery получить реальное имя поле по всевдониму
я про то, что парсит на предмет выдачи названий полей
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / UniQuery получить реальное имя поле по всевдониму / 25 сообщений из 32, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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