powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / UniQuery получить реальное имя поле по всевдониму
32 сообщений из 32, показаны все 2 страниц
UniQuery получить реальное имя поле по всевдониму
    #39925423
Фотография 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;
...
Рейтинг: 0 / 0
UniQuery получить реальное имя поле по всевдониму
    #39925435
Фотография 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 возвращает пустое значение
...
Рейтинг: 0 / 0
UniQuery получить реальное имя поле по всевдониму
    #39925541
b0rk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
UniQuery получить реальное имя поле по всевдониму
    #39925561
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
b0rk,

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



error Incompatible types: 'TField' and 'TCRFieldDesc'
...
Рейтинг: 0 / 0
UniQuery получить реальное имя поле по всевдониму
    #39925591
Фотография devart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
UniQuery получить реальное имя поле по всевдониму
    #39925633
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
devart
На последней доступной версии UniDAC 8.1.2


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

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


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

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

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

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

Код: 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
UniQuery получить реальное имя поле по всевдониму
    #39928184
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
UniQuery получить реальное имя поле по всевдониму
    #39928189
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблема в том, что там может быть больше одного поля, у меня их на данный момент два.
...
Рейтинг: 0 / 0
UniQuery получить реальное имя поле по всевдониму
    #39928426
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем, решил проблему с помощью вычисляемых полей.
...
Рейтинг: 0 / 0
UniQuery получить реальное имя поле по всевдониму
    #39928431
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Странно, в запросе CASE нету.
Код: sql
1.
2.
3.
4.
5.
6.
select 
...
...
  IIF(C.DELETED = 1, TRUE, FALSE) DELETED,
...
from ...



а origion выдет название поля CASE вместо DELETED или C.DELETED.
...
Рейтинг: 0 / 0
UniQuery получить реальное имя поле по всевдониму
    #39928457
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
UniQuery получить реальное имя поле по всевдониму
    #39928483
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я понял почему. Заполняется свойство ORIGIN, и если ты меняешь запрос, то и persistent-поле нужно пересоздавать, иначе там старое значение.
Я так думаю, что свойство ORIGIN можно и самом заполнять ручками?
...
Рейтинг: 0 / 0
UniQuery получить реальное имя поле по всевдониму
    #39928495
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11
если ты меняешь запрос, то и persistent-поле нужно пересоздавать
И снова грабли с персистентными полями
...
Рейтинг: 0 / 0
UniQuery получить реальное имя поле по всевдониму
    #39928610
Фотография devart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
UniQuery получить реальное имя поле по всевдониму
    #39928635
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите, а в какой момент заполняется свойство Origin?
При создании persistent-поле в дизайне или во время исполнения программы?
...
Рейтинг: 0 / 0
UniQuery получить реальное имя поле по всевдониму
    #39928720
maratvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,

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


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

us!
а как же иначе то?!
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
UniQuery получить реальное имя поле по всевдониму
    #39928872
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я про то, что парсит на предмет выдачи названий полей
...
Рейтинг: 0 / 0
UniQuery получить реальное имя поле по всевдониму
    #39928877
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
20.02.2020 13:08, X11 пишет:
>
> я про то, что парсит на предмет выдачи названий полей
>

А КАК ИНАЧЕ ТО?!

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
UniQuery получить реальное имя поле по всевдониму
    #39928884
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11> я про то, что парсит на предмет выдачи названий полей

Незнание азов - ещё ладно. Но подумай о ситуации, когда у полей
(колонок) нет названий - калькулируемые выражения, например.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
UniQuery получить реальное имя поле по всевдониму
    #39928907
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
или View
...
Рейтинг: 0 / 0
UniQuery получить реальное имя поле по всевдониму
    #39928908
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
20.02.2020 13:47, X11 пишет:
>
> или View
>

серверу пофиг.
он железный.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
UniQuery получить реальное имя поле по всевдониму
    #39929540
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задача: получить название таблицы из запроса.

Код: pascal
1.
2.
  q := grid.DataSource.DataSet as TUniQuery;
  t := TCRFieldDesc(q.GetFieldDescNo(q.Fields[0])).TableInfo.TableName;


выдает ошибку, что поле ID не найдено, хотя поле точно есть, вот запрос

Код: pascal
1.
2.
3.
4.
5.
6.
7.
SELECT
    A.ID,
    A.ID_TYPE,
....
FROM TABLE1 A
....
...


Свойство foTableAliasAndField включено.
обязательно ли открывать TUniQuery, потому что мне нужно получить имя таблицы до открытия.
...
Рейтинг: 0 / 0
UniQuery получить реальное имя поле по всевдониму
    #39929557
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11
обязательно ли открывать TUniQuery,
Обычно достаточно Prepare. Хотя список Fields заполняется именно при открытии
...
Рейтинг: 0 / 0
UniQuery получить реальное имя поле по всевдониму
    #39929579
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Prepare cannot be called in the SmartFetch mode
а у меня постранично, у меня UniGUI сетка и пагинатор
...
Рейтинг: 0 / 0
32 сообщений из 32, показаны все 2 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / UniQuery получить реальное имя поле по всевдониму
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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