Конференция "Базы" » Есть ли возможность узнать какому объекту БД принадлежит поле? [D7, FB2.1]
 
  • TheEd (27.10.12 12:42) [0]
    Собственно сабж. Ведь TField должен быть связан с породившим его объектом (таблица, вьюшка, процедура).
    Неужели без "Парсить SQL" не обойтись?

    ps: пользуюсь FIBPlus, но там тоже не нашёл такой возможности...
  • Inovet © (27.10.12 15:10) [1]
    Системные таблицы смотреть. Или где, в результате запроса? Так там пожет и не быть соответсвия физическому полю.
  • Медвежонок Пятачок © (27.10.12 21:22) [2]
    TField может быть, и может не быть ни одной таблицы и ни одной вьюхи и ни одной процедуры, из которых это поле получило данные.
  • Германн © (28.10.12 01:37) [3]

    > Есть ли возможность узнать какому объекту БД принадлежит
    > поле?

    А зачем это нужно?
    http://www.gunsmoker.ru/2008/10/x-y-z.html
  • Ega23 © (29.10.12 10:29) [4]
    select 1 as number from rdb$database


    Какому объекту принадлежит поле Number?
  • TheEd (30.10.12 09:56) [5]
    нет, в контексте моей задачи предполагается, что есть выборка, пока выглядящая весьма просто:
    select * from some_db_object_for_ex_table_or_view_or_procedure


    и, для неё из базы выбираются описания полей:

    quSomeSQL.SQL.Text := 'SELECT RDB$DESCRIPTION from RDB$RELATION_FIELDS '
             + 'where (RDB$RELATION_NAME = ''' + dsname + ''') and '
             + '      (RDB$FIELD_NAME = ''' + fname + ''')';


    Пока использую простейший парсинг, выбирая в dsname слово, после 'FROM '. Однако возникла мысль, что компонент "должен" знать из какого набора данных он черпает поле...
    В этом контексте на вопрос Ega23 ответить просто: rdb$database
  • anatoly pogoretsky (30.10.12 10:17) [6]
    > TheEd  (30.10.2012 09:56:05)  [5]

    Какой компонент и почему
    он не знает?
  • Ega23 © (30.10.12 10:35) [7]

    > Пока использую простейший парсинг, выбирая в dsname слово,
    >  после 'FROM '. Однако возникла мысль, что компонент "должен"
    > знать из какого набора данных он черпает поле...
    > В этом контексте на вопрос Ega23 ответить просто: rdb$database


    select A.* from
    (
      select 0 as id, 'Нету такого' as caption from rdb$database
        union all
      select id, caption from ttt
    ) as A
    order by id


    А здесь - что? Между прочим, весьма частая операция

    ИМХО, не делом ты занялся.
  • Медвежонок Пятачок © (30.10.12 12:01) [8]
    Если поля создать в дизайне, то TField.Origin (не всегда и не везде) покажет имя таблицы
  • TheEd (30.10.12 15:08) [9]
    to anatoly pogoretsky:
    Компонент - TpFIBQuery.

    to Ega23: предполагается, что это не запрос к серверу, а сущность, хранящаяся в БД и имеющая описания полей.

    to Медвежонок Пятачок:
    предполагается дизайном не пользоваться в пользу универсальности - ввёл запрос, кликнул баттон, получил таблицу. При этом, как уже говорил, выборки предполагаются по существующим в БД объектам. Для всех прочих оставляем FieldName как есть без изменений...
  • Ega23 © (30.10.12 15:29) [10]

    >  предполагается, что это не запрос к серверу, а сущность,
    >  хранящаяся в БД и имеющая описания полей.


    create table People (
     id integer,
     name1 varchar(32),
     name2 varchar(32),
     name3 varchar(32),
    )

    Select id, name1 + ' ' + name2 + ' ' + name3 as FIO from People



    Не тем занимаешься, ну послушай уже совета... :)
  • Медвежонок Пятачок © (30.10.12 15:29) [11]
    ввел, кликнул, получил.
    зачем тебе таблица-то?
    тем более что секунду назад этот кто-то, кто ввел запрос, самолично написал в нем список таблиц во from
  • Медвежонок Пятачок © (30.10.12 15:43) [12]
    или:
    две таблицы в которых одноименные поля.
    запрос :

    select * from table1, table2

    удачи с парсингом имен полей, которых вообще физически в этих таблицах нет, так как к именам приклеились суффиксы
  • Ega23 © (30.10.12 17:56) [13]

    > так как к именам приклеились суффиксы

    Причём не факт, что они приклеились, это IBExplorer так показывает. А что реально на клиенте - не знаю, проверять лень.
  • Медвежонок Пятачок © (30.10.12 18:08) [14]
    А чего здесь проверять-то?
    Достаточно уверовать в два поля с одним именем в одном датасете.
  • TheEd (01.11.12 18:20) [15]

    > >  предполагается, что это не запрос к серверу, а сущность,
    > >  хранящаяся в БД и имеющая описания полей.create table
    > People (  id integer,  name1 varchar(32),  name2 varchar(32),
    >   name3 varchar(32),)Select id, name1 + ' ' + name2 + '
    > ' + name3 as FIO from PeopleНе тем занимаешься, ну послушай
    > уже совета... :)

    Да я согласен что такие ситуации возможны, но, повторяю если поле не опирается на реальную сучность в БД, то по запросу описания получим ноль записей, и в шапке таблицы в данном примере будет просто FIO.
    В принципе ответ я получил - у поля связи с реальной сущностью в БД нет, вариант либо корректно парсить SQL, либо ограничиться теми рамками которые я описал...
    Всем спасибо за помощь!
  • Ega23 © (02.11.12 11:04) [16]

    > В принципе ответ я получил - у поля связи с реальной сущностью в БД нет

    Так точно.
    Более того, не факт, что значение этого поля вообще будет из этой базы взято, гетерогенные запросы ещё никто не отменял.


    > вариант либо корректно парсить SQL

    Опять же, нереально.
    Вот пример для MSSQL, для FB наверняка есть нечто подобное:
    USE Northwind  ;
    GO
    SELECT c.*, o.*
    FROM Northwind.dbo.Customers AS c
      INNER JOIN OPENROWSET('Microsoft.Jet.OLEDB.4.0',
      'C:\Program Files\Microsoft Office\OFFICE11\SAMPLES\Northwind.mdb';'admin';'', Orders)    
      AS o
      ON c.CustomerID = o.CustomerID ;
    GO


    http://msdn.microsoft.com/en-us/library/ms190312.aspx
    Т.е. соединяешься с конкретным сервером и с конкретной БД, а данные тащишь из Access.
 
Конференция "Базы" » Есть ли возможность узнать какому объекту БД принадлежит поле? [D7, FB2.1]
Есть новые Нет новых   [119451   +49][b:0][p:0.002]