Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 UniQuery получить реальное имя поле по всевдониму  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13870
Есть SQL запрос типа

select 
a.id,
a.date_input,
USR.NAME USEREDIT_NAME,
from table1 a
LEFT JOIN USERS USR ON A.UID = USR.ID


в процессе работы программы нужно добавить
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 возвращает пустую строку всегда
sFieldName := UniDBGrid.DataSource.DataSet.FieldByName(UniDBGrid.Columns[I].FieldName).Origin;
11 фев 20, 22:40    [22077908]     Ответить | Цитировать Сообщить модератору
 Re: UniQuery получить реальное имя поле по всевдониму  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13870
Нашел ещё

Var
CRFieldDesc: TCRFieldDesc;
begin
...
..
      CRFieldDesc := TCRFieldDesc(UniDBGrid.DataSource.DataSet.FieldByName(UniDBGrid.Columns[I].FieldName));
      sFieldName := CRFieldDesc.ActualName;// пусто

но ActualName возвращает пустое значение
11 фев 20, 23:19    [22077922]     Ответить | Цитировать Сообщить модератору
 Re: UniQuery получить реальное имя поле по всевдониму  [new]
b0rk
Member

Откуда: Харьков
Сообщений: 593
X11
Нашел ещё

Var
CRFieldDesc: TCRFieldDesc;
begin
...
..
      CRFieldDesc := TCRFieldDesc(UniDBGrid.DataSource.DataSet.FieldByName(UniDBGrid.Columns[I].FieldName));
      sFieldName := CRFieldDesc.ActualName;// пусто

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

если использовать кошерный каст, то можно избежать многих ошибок:
CRFieldDesc := UniDBGrid.DataSource.DataSet.FieldByName(UniDBGrid.Columns[I].FieldName) as TCRFieldDesc;
12 фев 20, 11:41    [22078099]     Ответить | Цитировать Сообщить модератору
 Re: UniQuery получить реальное имя поле по всевдониму  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13870
b0rk,

а это не одно и то же
TCRFieldDesc(...FieldByName);
и
FieldByName as TCRFieldDesc;
12 фев 20, 12:06    [22078125]     Ответить | Цитировать Сообщить модератору
 Re: UniQuery получить реальное имя поле по всевдониму  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13870
b0rk
 UniDBGrid.DataSource.DataSet.FieldByName(UniDBGrid.Columns[I].FieldName) as TCRFieldDesc;


error
Incompatible types: 'TField' and 'TCRFieldDesc'
12 фев 20, 12:08    [22078127]     Ответить | Цитировать Сообщить модератору
 Re: UniQuery получить реальное имя поле по всевдониму  [new]
devart
Member

Откуда: www.devart.com
Сообщений: 1155
X11
Есть SQL запрос типа

select 
a.id,
a.date_input,
USR.NAME USEREDIT_NAME,
from table1 a
LEFT JOIN USERS USR ON A.UID = USR.ID


в процессе работы программы нужно добавить
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 возвращает пустую строку всегда
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.
12 фев 20, 12:47    [22078176]     Ответить | Цитировать Сообщить модератору
 Re: UniQuery получить реальное имя поле по всевдониму  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13870
devart
На последней доступной версии UniDAC 8.1.2


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

Насколько я понял, я успел скачать версию 8.0.1. И в в этой версии моя проблема не решится, правильно?
12 фев 20, 13:17    [22078238]     Ответить | Цитировать Сообщить модератору
 Re: UniQuery получить реальное имя поле по всевдониму  [new]
devart
Member

Откуда: www.devart.com
Сообщений: 1155
X11
devart
На последней доступной версии UniDAC 8.1.2


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

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

Данное свойство было добавлено в UniDAC 7.3.10 от 17 сентября 2018
12 фев 20, 13:27    [22078264]     Ответить | Цитировать Сообщить модератору
 Re: UniQuery получить реальное имя поле по всевдониму  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13870
А в Options есть есть такое же. И оно может иметь отличное от свойства значение.

К сообщению приложен файл. Размер - 90Kb
15 фев 20, 18:20    [22080546]     Ответить | Цитировать Сообщить модератору
 Re: UniQuery получить реальное имя поле по всевдониму  [new]
devart
Member

Откуда: www.devart.com
Сообщений: 1155
X11
А в Options есть есть такое же. И оно может иметь отличное от свойства значение.

Мы уже исправили данное поведение. Данное изменение вошло в UniDAC 8.1.2, который доступен для скачивания на нашем сайте.
17 фев 20, 14:13    [22081346]     Ответить | Цитировать Сообщить модератору
 Re: UniQuery получить реальное имя поле по всевдониму  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13870
доступно но только после оплаты лицензии
17 фев 20, 14:24    [22081367]     Ответить | Цитировать Сообщить модератору
 Re: UniQuery получить реальное имя поле по всевдониму  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13870
в запросе есть поле

select 
...,
...,
(SELECT CAST(COUNT(CL.ID) AS INTEG) FROM CLIENT CL WHERE CL.ID_CLIENT = C.ID) CLIENTS_COUNT,
...
from Table1



В общем, в origin попадает "CAST" и получается в итоге
ORDER BY CAST


Сообщение было отредактировано: 18 фев 20, 20:42
18 фев 20, 20:33    [22082534]     Ответить | Цитировать Сообщить модератору
 Re: UniQuery получить реальное имя поле по всевдониму  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11503
X11
В общем, в origin попадает "CAST"
Предлагаю костыль
select 
...,
...,
(SELECT CAST(COUNT(CL.ID) AS INTEG) FROM CLIENT CL WHERE CL.ID_CLIENT = C.ID) AS "CAST",
...
from Table1
18 фев 20, 21:00    [22082548]     Ответить | Цитировать Сообщить модератору
 Re: UniQuery получить реальное имя поле по всевдониму  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13870
Проблема в том, что там может быть больше одного поля, у меня их на данный момент два.
18 фев 20, 21:11    [22082558]     Ответить | Цитировать Сообщить модератору
 Re: UniQuery получить реальное имя поле по всевдониму  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13870
В общем, решил проблему с помощью вычисляемых полей.
19 фев 20, 13:56    [22082999]     Ответить | Цитировать Сообщить модератору
 Re: UniQuery получить реальное имя поле по всевдониму  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13870
Странно, в запросе CASE нету.
select 
...
...
  IIF(C.DELETED = 1, TRUE, FALSE) DELETED,
...
from ...


а origion выдет название поля CASE вместо DELETED или C.DELETED.
19 фев 20, 14:06    [22083008]     Ответить | Цитировать Сообщить модератору
 Re: UniQuery получить реальное имя поле по всевдониму  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11503
X11
а origion выдет название поля CASE вместо DELETED или C.DELETED.
Я бы исходники посмотрел. Если с CAST все более менее логично (первое слово после пробела), то с IIF что-то ты не договариваешь
select 
  IIF(C.DELETED = 1, TRUE, FALSE) DELETED
from my_table c
что получится?

Сообщение было отредактировано: 19 фев 20, 14:31
19 фев 20, 14:31    [22083039]     Ответить | Цитировать Сообщить модератору
 Re: UniQuery получить реальное имя поле по всевдониму  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13870
Я понял почему. Заполняется свойство ORIGIN, и если ты меняешь запрос, то и persistent-поле нужно пересоздавать, иначе там старое значение.
Я так думаю, что свойство ORIGIN можно и самом заполнять ручками?

К сообщению приложен файл. Размер - 30Kb
19 фев 20, 14:56    [22083073]     Ответить | Цитировать Сообщить модератору
 Re: UniQuery получить реальное имя поле по всевдониму  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11503
X11
если ты меняешь запрос, то и persistent-поле нужно пересоздавать
И снова грабли с персистентными полями
19 фев 20, 15:10    [22083097]     Ответить | Цитировать Сообщить модератору
 Re: UniQuery получить реальное имя поле по всевдониму  [new]
devart
Member

Откуда: www.devart.com
Сообщений: 1155
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.
19 фев 20, 18:11    [22083297]     Ответить | Цитировать Сообщить модератору
 Re: UniQuery получить реальное имя поле по всевдониму  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13870
Подскажите, а в какой момент заполняется свойство Origin?
При создании persistent-поле в дизайне или во время исполнения программы?
19 фев 20, 20:35    [22083344]     Ответить | Цитировать Сообщить модератору
 Re: UniQuery получить реальное имя поле по всевдониму  [new]
maratvg
Member

Откуда: 74
Сообщений: 119
X11,

В фибах есть такая функция GetFieldByAlias, которая примерно тем и занимается, что вытаскивает имя поля или целое выражение из SQL-запроса по алиасу поля. Бывает что ошибается, просто надо помнить, что выражение должно быть целиком заключено в скобки. На самом деле - это некий текстовый парсер, который как-то что-то вытаскивает из текста запроса. Можно, наверное, целиком заюзать эту функцию и в унидаках, если у них такой нет. А может в унидаках тоже что-то похожее есть?
20 фев 20, 07:41    [22083467]     Ответить | Цитировать Сообщить модератору
 Re: UniQuery получить реальное имя поле по всевдониму  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13870
devart
Мы заполняем значения свойства Origin для полей набора данных на основании информации, которую нам возвращает сервер для колонок SQL выражения.


т.е. SQL-сервер САМ парсит SQL запрос программиста?
20 фев 20, 12:59    [22083702]     Ответить | Цитировать Сообщить модератору
 Re: UniQuery получить реальное имя поле по всевдониму  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 31050

20.02.2020 12:59, X11 пишет:
> т.е. SQL-сервер САМ парсит SQL запрос программиста?

us!
а как же иначе то?!

Posted via ActualForum NNTP Server 1.5

20 фев 20, 13:01    [22083705]     Ответить | Цитировать Сообщить модератору
 Re: UniQuery получить реальное имя поле по всевдониму  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13870
я про то, что парсит на предмет выдачи названий полей
20 фев 20, 13:08    [22083713]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Delphi Ответить