Найти в таблице данные из всех полей

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Найти в таблице данные из всех полей

Сообщение sergey-911 » 11.05.2005 (Ср) 22:36

Доброго времени суток всем. Нужно найти информацию во всех полях таблицы в БД. Заранее неизвестно количество полей и название полей в таблице, т.к. поля добавляются и удаляются, взависимости от нужд пользователя. Должно получиться, что-то вроде:
Код: Выделить всё
SELECT * FROM TABLE1 WHERE * = 'VALUE1'

В этом запросе допущена ошибка для аглядности. Как реализовать вышеописанное? :shock:
С уважением, Сергей.

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 11.05.2005 (Ср) 22:56

К сожалению, слово AnyField не является даже зарезервированным словом в SQL-99, не говоря уже о "ключевости". Так что, посредством статического SQL - никак. Использовать метаданные и перебирать все поля по очереди, либо через кучу OR в одном запросе (что весьма невыгодно с точки зрения производительности), либо последовательность запросов, каждый с проверкой одного поля. БД какая?

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 12.05.2005 (Чт) 5:55

Спасибо за отзыв. Но не то. БД - SQL (для фирмы) и Access (для клиентов). Поля я бы перечислил, но, заранее не знаю, ни их название, ни количество полей. В итоге, должен получиться прайс по автозапчастям. В таблицу периодически будут импортировать данные из Excel, каждое поле - поставщик. Поэтому, заранее не могу предсказать структуру таблицы.
С уважением, Сергей.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 12.05.2005 (Чт) 8:53

Какой ужас... А нельзя ли создать еще одну таблицу FIELDS, в которой будут перечислены названия полей? А основная будет состоять из ключа, FIELDS.ID и VALUE.
Lasciate ogni speranza, voi ch'entrate.

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 12.05.2005 (Чт) 10:34

если у тебя сиквел - основная база, то тебе прямая дорога в Full Text Search (см. BOL)

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 12.05.2005 (Чт) 18:07

sergey-911 писал(а):каждое поле - поставщик.
:shock:
Если я правильно понял, в каждом поле таблицы будут храниться поставщики. В таком случае, где ты собираешься хранить названия и артикулы деталей, цену на них, в конце концов???

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 13.05.2005 (Пт) 0:18

Структура БД очень простая. Не нужно никаких лишних реквизитов. Есть специализированные программы по аытозапчастям Toyota, Nissan и тп (сам устанавливал, занимают около 18 гб каждая, в зависимости от фирмы авто)... Они позволяют найти оригинальный номер изделия. Он и является всей необходимой информацией. Товарищ открыл магазин по запчастям и попросил написать ему прайс для клиентов в VB под акцесс, а себе под SQL базу. У него есть файл Excel, в котором 1-е поле - это этот оригинальный номер изделия, второе - это цена изделия на заказ из Японии. Остальные поля - это не оригинальные номера изделий поставщиков - переход на неоригинал (на каждого поставщика по одной колонке). По неоригиналу можно узнать цену у данного поставщика (из др. таблиц). Файл Excel постоянно обновляется и будет импортироваться в базу (следовательно с новыми поставщиками в таблицу будут добавляться (удаляться) новые поля). Поэтому, структуру менять не буду. Нужно, чтобы человек введя номер детали (не зная поставщика, а соответственно - названия поля в таблице) получил всю информацию (название, цену, поставщика, срок доставки и т.п.). Для этого мне и нужно найти то, не зная где (в каком поле искать этот неоригинальный номер изделия, чтобы получить поставщика и оригинальный номер). Ключом для связи с другими таблицами служит оригинальный номер детали.
С уважением, Сергей.

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 13.05.2005 (Пт) 0:23

alibek
Какой смысл здесь создавать еще одну таблицу с названиями полей?Konst_One
А что с Full Text Search, неужели есть способ, который решит проблему?
С уважением, Сергей.

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 13.05.2005 (Пт) 0:39

В крайнем случае, частично решу вопрос в клиенте. Использую таблицу, при заолнении которой через свойства DataSet смогу узнать количество полей, а затем, в цикле перебирая колонки, с первой до последней, смогу узнать названия полей в БД. А зная названия полей, смогу и найти всю необходимую информацию дополнительным запросом, перебирающим все поля в БД, либо поиском в самой таблице (в зависимости от фантазии). Но хочется узнать, есть ли способ другой, реализуемый в самой БД? Ведь, если Grid понимает названия полей (в табл. БД поля называются также, как и в гриде), значит их можно узнать самому... Буду признателен всем за любую информацию.
С уважением, Сергей.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 13.05.2005 (Пт) 8:27

Да где тут вообще проблема-то?

Так делается простейшая форма с фильтром (Grid и одно поле поиска):

В Grid выводится значение Recordset-a, при изменении содержимого поля поиска программно перебираем поля Recordset-a узнавая их тип и строим выражение фильтра, который потом применяем для данного Recordset-a или включаем это выражение в условие WHERE.

Все довольно просто. Единственное что функцию придется написать на самом VB.
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 13.05.2005 (Пт) 22:51

Всем доброго времени суток и спасибо за помощь.
Andrey Что-то я не понял твоего ответа, или ты - моего вопроса. Форма - да, условно - Grid и текстовое поле, для ввода номера запчасти. Ты имеешь ввиду:

Код: Выделить всё
'Заполнение грида всеми данными
Dim Soedinenie As String     'Параметры подключения
Dim query As String
Dim rs As ADODB.Recordset
Dim cn As ADODB.Connection

MousePointer = 11

Soedinenie = "PROVIDER=MSDASQL;dsn=PRICE;uid=USER1;pwd=PASS;"
query = "SELECT * FROM Table1 "

Set cn = New ADODB.Connection
cn.Open (Soedinenie)
Set rs = cn.Execute(query)
Set VSFlexGrid1.DataSource = rs
Set VSFlexGrid1.DataSource = Nothing
rs.Close
Set rs = Nothing
Set cn = Nothing

MousePointer = vbDefault


Код: Выделить всё
'Поиск1
Dim Soedinenie As String
Dim query As String
Dim rs As ADODB.Recordset
Dim cn As ADODB.Connection
Dim i As Integer

MousePointer = 11

Soedinenie = "PROVIDER=MSDASQL;dsn=PRICE;uid=USER1;pwd=PASS;"
query = "SELECT * FROM Table1 WHERE "

VSFlexGrid1.Row = 0
For i = 1 To VSFlexGrid1.Cols - 1
    VSFlexGrid1.Col = i
    query = query & "[" & VSFlexGrid1.Text & "] Like '%" & Replace(Text1.Text, "*", "_") & "%' OR "
Next
VSFlexGrid1.Col = i
query = query & "[" & VSFlexGrid1.Text & "] Like '%" & Replace(Text1.Text, "*", "_") & "%'"

Set cn = New ADODB.Connection
cn.Open (Soedinenie)
Set rs = cn.Execute(query)
Set VSFlexGrid1.DataSource = rs
Set VSFlexGrid1.DataSource = Nothing
rs.Close
Set rs = Nothing
Set cn = Nothing

MousePointer = vbDefault


А что ты имеешь ввиду под програмным перебором RecordSet-a? Не:
Код: Выделить всё
VSFlexGrid1.Row = 0
For i = 1 To VSFlexGrid1.Cols - 1
    VSFlexGrid1.Col = i
    While Not rs.EOF
        If Text1.Text = rs.Fields(0) & "" Then
            VSFlexGrid1.IsSelected(j) = True 'Выделяем запись в таблице
        End If
        rs.MoveNext
    Wend
Next

Если да, так это долго очень, пока весь грид переберется...
Кстати, не подскажешь, почему Grid Заполняется гораздо быстрее через DataSet, нежели, если его заполнять в цикле (VSFlexGrid1.Text = rs.Fields(0) &"" )?
С уважением, Сергей.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 14.05.2005 (Сб) 7:02

sergey-911 писал(а):запчасти. Ты имеешь ввиду


Ну примерно так я сделал фильтр недавно (попросили сделать для старого проекта под DAO):

Код: Выделить всё
Private Sub txFilter_Change()
    Static sOld As String
    Dim s As String, jc As GridEX20.JSColumn, ss As String, r As DAO.Recordset

    s = Trim$(txFilter.Text)
    If 0 = StrComp(s, sOld, vbTextCompare) Then Exit Sub
    sOld = s

    Set r = Grid.Recordset
    If Len(s) Then
        If Left$(s, 1) <> "*" Then s = "*" & s
        If Right$(s, 1) <> "*" Then s = s & "*"
        s = " LIKE '" & Replace(s, "'", "''") & "'"
        For Each jc In Grid.Columns
            If jc.Visible Then
                If Len(ss) Then ss = ss & " OR "
                ss = ss & jc.DataField & s
            End If
        Next jc
        m_r.Filter = ss
        Grid.HoldFields
        Set Grid.Recordset = m_r.OpenRecordset
    Else
        Grid.HoldFields
        Set Grid.Recordset = m_r
    End If
End Sub


sergey-911 писал(а):А что ты имеешь ввиду под програмным перебором RecordSet-a? Не:


Нет.
Например, в приведенном выше коде я заранее знал что все поля Recordset-a текстовые, но они могут быть и других типов, соответственно и собирать выражение фильтра нужно по разному.
То есть я вначале должен узнать тип поля - для этого перебираем поля Recordset-a, навроде:

Код: Выделить всё
For Each f In r.Fields
    Select Case f.Type
        Case adInteger, adLong, adByte
             ....
        Case adVarWChar, adWChar, adVarChar, adChar
             ....
    End Select
Next


И уже в зависимости от типа поля действуем.

sergey-911 писал(а):Кстати, не подскажешь, почему Grid Заполняется гораздо быстрее через DataSet, нежели, если его заполнять в цикле (VSFlexGrid1.Text = rs.Fields(0) &"" )?


Так и должно быть по определению.
Но объяснять сложновато - просто прими это за аксиому...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 14.05.2005 (Сб) 21:20

Andrey. Спасибо большое!
А для чего узнавать тип поля?
Извини за назойливость. Не объяснишь, что значит
Код: Выделить всё
        Grid.HoldFields
        Set Grid.Recordset = m_r

и еще, в каком случае используют DAO? Я читал, что в основном, применяют ADO, поэтому, DAO не изучал.

А вот здесь есть вопрос, который мне давно покоя не дает. При выполнении команды SQL, каждый раз открываю новое соединение, выполняю команду, после этого закрываю соединение, как в приведенном примере.
Код: Выделить всё
Dim Soedinenie As String
Dim query As String
Dim rs As ADODB.Recordset
Dim cn As ADODB.Connection

query = "Команда SQL"

Set cn = New ADODB.Connection
cn.Open (Soedinenie)
Set rs = cn.Execute(query)

rs.Close
Set rs = Nothing
Set cn = Nothing

rs.Close
Set rs = Nothing
Set cn = Nothing


Нужно ли это делаьть, или это только отнимает ресурсы системы - т.е. не лучше один раз открыть соединение, а при выходе из программы - закрыть? И еще, при выходе из системы, соединение автоматически не разрывается? Извини за ламерские вопросы, просто не знаю, где найти на них ответы. А общей представления работы соедининия без этого - у меня нет.
С уважением, Сергей.

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 14.05.2005 (Сб) 22:20

Andrey - попробовал подключиться через DAO, помоему, начинаю доганять. Здесь нужно указывать тип поля. Или я не прав. Если не трудно, пришли параметры подключения через DAO (код в Private Sub Form_Load()).
С уважением, Сергей.

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 14.05.2005 (Сб) 22:41

Андрей, выложи плиз исходник проекта твоего (данной фармы) вместе с гридом (DLL или OCX библиотекой), у меня уже мозги кипят, а результат нулевой. Фильтр так и не работает.
С уважением, Сергей.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 16.05.2005 (Пн) 7:08

sergey-911 писал(а):А для чего узнавать тип поля?

Вряд ли надо пытаться в числовом поле искать строку...

sergey-911 писал(а):Извини за назойливость. Не объяснишь, что значит


Код: Выделить всё
Grid.HoldFields


Это особенность моего Grid-a - у тебя этого нет.

и еще, в каком случае используют DAO? Я читал, что в основном, применяют ADO, поэтому, DAO не изучал.

sergey-911 писал(а):И правильно, ибо DAO отжил свое. Я же писал что делал для старой программы.


sergey-911 писал(а):Нужно ли это делаьть, или это только отнимает ресурсы системы - т.е. не лучше один раз открыть соединение, а при выходе из программы - закрыть?


Да - вполне можно.

sergey-911 писал(а): И еще, при выходе из системы, соединение автоматически не разрывается?


А куда оно денется?
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 16.05.2005 (Пн) 19:45

Андрей спасибо.
Каким гридом ты сейчас пользуешься?
Что значит, куда денется? Я имею ввиду, если в программе изначально установить соединение, а закрывать, при выходе из нее. В случае ошибки в программе, соединение не будет ли "висеть" (оставаться подключенным в памяти машины), ведь соединение "принудительно", не закрыли?
С уважением, Сергей.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 17.05.2005 (Вт) 6:47

sergey-911 писал(а):Каким гридом ты сейчас пользуешься?


Janus GridEx http://www.janusys.com

sergey-911 писал(а):Что значит, куда денется? Я имею ввиду, если в программе изначально установить соединение, а закрывать, при выходе из нее. В случае ошибки в программе, соединение не будет ли "висеть" (оставаться подключенным в памяти машины), ведь соединение "принудительно", не закрыли?


А чего ради останется висеть - объект-то прибъется, значит и соединение закроется...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 17.05.2005 (Вт) 18:32

Andrey, спасибо тебе большое за своевременные, полные, конструктивные ответы. Мегаогромное спасибо...
Не скажешь, как ентот грид сделать полноценно работающим? Я раньше его скачивал (это или демка 30-и дневная, очень урезанная, с постоянной всплывающей рекламой, если не ошибаюсь), пытался найти лекарство, так и не нашел. Кучу сайтов в инете пересмотрел, массу времени провел в поисках, все зря... Поэтому использовал другой грид, от VideoSoft.
С уважением, Сергей.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 18.05.2005 (Ср) 7:05

sergey-911 писал(а):Не скажешь, как ентот грид сделать полноценно работающим?


Могу только посоветовать поискать его на CD. Он встречается.
На сайте лежит триал для которого регистрация просто не предусмотрена.
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 18.05.2005 (Ср) 8:45

sergey-911, если не найдешь, то можешь написать в ЛС.
Lasciate ogni speranza, voi ch'entrate.

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 18.05.2005 (Ср) 18:26

Доброго всем времени суток. Разобрался.Как чувствовал, что на сервере есть такая процедура
sp_columns MyTadle

, которая и выводит всю информацию о полях в таблице.
Спасибо всем! :D
С уважением, Сергей.

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 29.09.2005 (Чт) 20:26

P.S.
Код: Выделить всё
CREATE PROCEDURE [sp_TableColumn]
--Процедура вывда  колонок таблиц, доступных данному пользователю

    @Table [varchar] (100) = NULL      -- Название таблицы

AS
   
   IF @Table is NOT NULL
   BEGIN               -- Вывод всех колонок указанной таблицы, доступных данному пользователю
      SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE FROM information_schema.columns
      WHERE TABLE_NAME IN (@Table) AND TABLE_NAME <> 'dtproperties'
      ORDER BY TABLE_NAME
   END
   ELSE
   BEGIN               -- Вывод всех таблиц и колонок, доступных данному пользователю
      SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE FROM information_schema.columns
      WHERE
      TABLE_NAME IN (SELECT TABLE_NAME FROM information_schema.tables WHERE table_type in ('base table') AND TABLE_NAME <> 'dtproperties')
      OR
      TABLE_NAME IN (SELECT TABLE_NAME FROM information_schema.tables WHERE table_type in ('VIEW'))
      AND TABLE_NAME LIKE 'vw%'
      ORDER BY TABLE_NAME
   END
С уважением, Сергей.

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 29.09.2005 (Чт) 20:27

Или
Код: Выделить всё
CREATE PROCEDURE [sp_Column]
--Процедура вывда  колонок таблиц, доступных данному пользователю

    @Table [varchar] (100) = NULL      -- Название таблицы

AS
   
   IF @Table is NOT NULL
   BEGIN               -- Вывод всех колонок указанной таблицы, доступных данному пользователю
      SELECT TABLE_NAME +'.' + COLUMN_NAME [Column] FROM information_schema.columns
      WHERE TABLE_NAME IN (@Table)  AND TABLE_NAME <> 'dtproperties'
      ORDER BY TABLE_NAME
   END
   ELSE
   BEGIN               -- Вывод всех таблиц и колонок, доступных данному пользователю
      SELECT TABLE_NAME + '.' + COLUMN_NAME AS [Column] FROM information_schema.columns
      WHERE
      TABLE_NAME IN (SELECT TABLE_NAME FROM information_schema.tables WHERE table_type in ('base table') AND TABLE_NAME <> 'dtproperties')
      OR
      TABLE_NAME IN (SELECT TABLE_NAME FROM information_schema.tables WHERE table_type in ('VIEW'))
      AND TABLE_NAME LIKE 'vw%'
      ORDER BY TABLE_NAME
   END
С уважением, Сергей.


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0

    TopList  
cron