SQL-запрос ПОМОГИТЕ ПОЖАЛУЙСТА

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
alammi
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 21
Зарегистрирован: 14.07.2004 (Ср) 11:07

SQL-запрос ПОМОГИТЕ ПОЖАЛУЙСТА

Сообщение alammi » 14.07.2004 (Ср) 11:24

Хлопцы и девчата! Очень нужна помощь свежих голов!! В БД делается SQL-запрос причем в процессе отбора должна учавствовать пользовательская функция. Ответ компилятора (или еще чего-то): "Неопределенная функция такая-то в выражении".
вот пример запроса:
Код: Выделить всё
Data1.DatabaseName = "C:\DIR\db.mdb"
Data1.RecordSource = "Select * from Table1 where (UserFunction (Col1,Col2,1)<=2)"

Функция UserFunction в отдельности работает очень успешно (входные параметры: текст, текст, integer; выходные парметры: integer).
Я из нее уже и модуль и библиотеку делал-не помогает.
Помогите пожалуйста!!!

З.Ы. РАБОТА ГОРИТ!!!

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Сообщение codemaster » 14.07.2004 (Ср) 11:39

Надо пользовать ADODB.command
Последний раз редактировалось codemaster 14.07.2004 (Ср) 11:42, всего редактировалось 1 раз.

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

Сообщение Andrey Fedorov » 14.07.2004 (Ср) 11:42

Оно так и не будет работать. Точнее будет только, если функция находится в модуле Access-a и программа написана в самом Access-e.

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

alammi
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 21
Зарегистрирован: 14.07.2004 (Ср) 11:07

Сообщение alammi » 14.07.2004 (Ср) 11:48

Ладно, расколюсь:) мне нужно осуществить неточный поиск по базе. Для этого Пользуюсь функцией Левенштейна. Вот ее код, только учти: в Vb нет функции поиска минимума, поэтому пришлось самому писать:)
Код: Выделить всё
Function lev(Source As String, Target As String, CaseSensitive As Boolean) As Integer
Dim n As Integer, m As Integer, i As Integer, j As Integer, s As String, Cost As Integer
n = Len(Source)
m = Len(Target)
If m = 0 Then
lev = n
ElseIf n = 0 Then
lev = m
End If

З.Ы. Спасибо за конструктив:D
ReDim Matrix(m + 1, n + 1) As Integer
For i = 0 To n
Matrix(0, i) = i
Next
For i = 0 To m
Matrix(i, 0) = i
Next
For i = 1 To n
s = Mid(Source, i, 1)
For j = 1 To m
  Select Case CaseSensitive
  Case True
   If Mid(Target, j, 1) = s Then Cost = 0 Else Cost = 1
  Case False
   If LCase(Mid(Target, j, 1)) = LCase(s) Then Cost = 0 Else Cost = 1
  End Select
 
  Matrix(j, i) = Minimum((Matrix(j, i - 1) + 1), (Matrix(j - 1, i) + 1), Matrix(j - 1, i - 1) + Cost)
Next
Next
lev = Matrix(m, n)

End Function

Function Minimum(a As Integer, b As Integer, c As Integer) As Integer
Select Case (a < b)
Case True
Select Case (a < c)
Case True
  Minimum = a
Case False
  Minimum = c
End Select
Case False
Select Case (b < c)
Case True
  Minimum = b
Case False
  Minimum = c
End Select
End Select
End Function

Как я уже сказал, сама по себе функция работает:(

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

Сообщение Andrey Fedorov » 14.07.2004 (Ср) 12:00

Ну что-ж, если функция достаточно сложная то остается только так:

Код: Выделить всё
Dim r As New ADODB.Recordset
r.Open "Select * from Table1", cn, adOpenStatic, adLockOptimistic
Set r.ActiveСonnection = Nothing
Do Until r.EOF
    If UserFunction (Col1,Col2,1)>2 Then r.Delete
    r.MoveNext
Loop


В итоге получим Recordset с нужной выборкой - можно присвоить его твоему Data-контролу (или что у тебя там). Да, код для ADO - под DAO придется несколько переделать...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

alammi
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 21
Зарегистрирован: 14.07.2004 (Ср) 11:07

Сообщение alammi » 14.07.2004 (Ср) 12:20

Слушай, а мне ведь надо так обработать каждую из 15000 записей во 2 по порядку колонке. Как это сделать продолжая предложенный тобой алгоритм? Заранее спасибо!
Спасибо за конструктив!

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

Сообщение Konst_One » 14.07.2004 (Ср) 12:44

через DAO все будет работать, если ты свой модуль с функцией скомпилишь в MDE файл и привяжешь его к своей основной базе, где даные лежат.

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

Сообщение Andrey Fedorov » 14.07.2004 (Ср) 12:47

Слушай, а мне ведь надо так обработать каждую из 15000 записей во 2 по порядку колонке. Как это сделать продолжая предложенный тобой алгоритм? Заранее спасибо!


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

alammi
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 21
Зарегистрирован: 14.07.2004 (Ср) 11:07

Сообщение alammi » 14.07.2004 (Ср) 13:04

Andrey Fedorov писал(а):
Код: Выделить всё
Dim r As New ADODB.Recordset
r.Open "Select * from Table1", cn, adOpenStatic, adLockOptimistic
Set r.ActiveСonnection = Nothing
Do Until r.EOF
    If UserFunction (Col1,Col2,1)>2 Then r.Delete
    r.MoveNext
Loop


В итоге получим Recordset с нужной выборкой - можно присвоить его твоему Data-контролу (или что у тебя там). Да, код для ADO - под DAO придется несколько переделать...

У меня базой управляет элемент Data. Когда пытаюсь добавить твой текст, он говорит, что знать не знает никаких ADODB. А входным аргументом в UserFunction должна быть поочередно каждая из ячеек второго столбца моей таблицы.
Я уже запарился-двое суток сижу :shock:
Спасибо за конструктив!

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

Сообщение Andrey Fedorov » 14.07.2004 (Ср) 13:25

У меня базой управляет элемент Data. Когда пытаюсь добавить твой текст, он говорит, что знать не знает никаких ADODB. А входным аргументом в UserFunction должна быть поочередно каждая из ячеек второго столбца моей таблицы.


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

Samovar
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 111
Зарегистрирован: 23.05.2004 (Вс) 8:13

Сообщение Samovar » 14.07.2004 (Ср) 14:50

Konst_One
Если можно нипиши по подробнее про MDE. Очень интересно!!!
Ученье - свет, неученых - тьма.

alammi
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 21
Зарегистрирован: 14.07.2004 (Ср) 11:07

Леплазорий переехал

Сообщение alammi » 14.07.2004 (Ср) 14:54

Всем желающим помочь, предлагаю посмотреть продолжение темы:
http://bbs.vbstreets.ru/viewtopic.php?t=8769
Благодарен буду даже за молчаливый промотр и... пару-тройку томов коментариев :D
Спасибо за конструктив!

alammi
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 21
Зарегистрирован: 14.07.2004 (Ср) 11:07

Сообщение alammi » 14.07.2004 (Ср) 14:56

Konst_One писал(а):через DAO все будет работать, если ты свой модуль с функцией скомпилишь в MDE файл и привяжешь его к своей основной базе, где даные лежат.


Слушай, а и правда, как это? Можешь объяснить пошагово для сямой восприимчивой части молодежи :lol:
Спасибо за конструктив!

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

Сообщение Konst_One » 14.07.2004 (Ср) 15:52

создаешь пустую базу, добавлешь новый модуль, кидаешь туда свою функцию (обязательно объяви ее PUBLIC)
компилишь модуль и сохраняешь.
закрываешь эту базу
открываешь акцес и говоришь сделать MDE и указываешь только что созданную базу

потом открываешь свою базу, в кторой лежат твои данные в таблицах и в новом модуле линкуешь через референсы свою MDE, только имя проекта другое задай, чтобы не конфликтовало ,
а теперь в этой же базе можешь писать свой запрос , в котром смело используй свою фукнцию

а в проге вешай этот запрос на элемент DATA

alammi
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 21
Зарегистрирован: 14.07.2004 (Ср) 11:07

Сообщение alammi » 14.07.2004 (Ср) 16:00

Konst_One писал(а):создаешь пустую базу, добавлешь новый модуль, кидаешь туда свою функцию (обязательно объяви ее PUBLIC)
компилишь модуль и сохраняешь.
закрываешь эту базу
открываешь акцес и говоришь сделать MDE и указываешь только что созданную базу

потом открываешь свою базу, в кторой лежат твои данные в таблицах и в новом модуле линкуешь через референсы свою MDE, только имя проекта другое задай, чтобы не конфликтовало ,
а теперь в этой же базе можешь писать свой запрос , в котром смело используй свою фукнцию

а в проге вешай этот запрос на элемент DATA
Вцелом-идея офигенная! Неясно только 2 места:
1) как создать в access *.mde базу
2) цитирую "...потом открываешь свою базу, в кторой лежат твои данные в таблицах и в новом модуле линкуешь через референсы свою MDE..."
Объяснишь-я по гроб...
Спасибо за конструктив!

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

Сообщение Konst_One » 14.07.2004 (Ср) 16:15

меню Сервис\Служебные программы\Создать MDE базу
и указываешь mdb-шку , где ты модуль со своей функцией сделал

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

Сообщение Andrey Fedorov » 14.07.2004 (Ср) 16:17

Что MDE, что MDB - на компьютере с программой должен будет присутствовать Access (или его рантайм версия), которая будет выполнять вашу функцию. Что не есть хорошо для программы на VB6.
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

alammi
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 21
Зарегистрирован: 14.07.2004 (Ср) 11:07

Сообщение alammi » 14.07.2004 (Ср) 16:42

Konst_One писал(а):меню Сервис\Служебные программы\Создать MDE базу
и указываешь mdb-шку , где ты модуль со своей функцией сделал


Та же болезнь: не знаю никакой UserFunction и все тут! :evil:
Спасибо за конструктив!

MOV
Постоялец
Постоялец
 
Сообщения: 414
Зарегистрирован: 13.03.2004 (Сб) 15:13
Откуда: Санкт-Петербург

Сообщение MOV » 14.07.2004 (Ср) 17:30

Та же болезнь: не знаю никакой UserFunction и все тут!

да тяжеловато 8)

На счет:
2) Ребятки я же сказал, только отличие на 1, максимум 2 буквы, а то что это за нечеткий поиск: Задал слово "412", а получил "12423412344122345345". Не-е-е- так не пойдет


Можно ведь и так сделать:

SELECT GOODS.NAME
FROM GOODS
WHERE [NAME] Like "*ТЕКСТ*" AND Len([NAME])<=7
WITH OWNERACCESS OPTION;


Только вместо 7 (это я к примеру, написал) разрываешь запрос и ставишь свою длину, например len(text1.text)+2)

alammi
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 21
Зарегистрирован: 14.07.2004 (Ср) 11:07

Сообщение alammi » 14.07.2004 (Ср) 17:35

Слушай а что это такое?

WITH OWNERACCESS OPTION


Идею понял, попробую. Огр.Спсбо.
Спасибо за конструктив!

MOV
Постоялец
Постоялец
 
Сообщения: 414
Зарегистрирован: 13.03.2004 (Сб) 15:13
Откуда: Санкт-Петербург

Сообщение MOV » 14.07.2004 (Ср) 17:41

Слушай а что это такое?

А х. его з. :shock:
access в конструкторе ко всем запросам у меня такую бодягу приписывает :D . Переводить, думаю тебе не надо, а как на самом деле это работает не знаю. и вообще этот хвост можно убрать - ничего страшного не должно быть (я всегда этот рудимент отрезаю, чтобы код не захломлял, но в access я юзаю локальные базы, может здесь это не принципиально, а вот если по сети, то надо смотреть 8))

alammi
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 21
Зарегистрирован: 14.07.2004 (Ср) 11:07

Сообщение alammi » 14.07.2004 (Ср) 17:44

З.Ы. Я тут вспомнил: ты же не учитываешь поиск на вхождение (я по-просту не сказал о нем :D ) Ведь если надо найти то, что в Word'е обозначается снятой галочкой искать слово целиком. Тут-то полная п-па!
Спасибо за конструктив!

MOV
Постоялец
Постоялец
 
Сообщения: 414
Зарегистрирован: 13.03.2004 (Сб) 15:13
Откуда: Санкт-Петербург

Сообщение MOV » 14.07.2004 (Ср) 17:52

если надо найти то, что в Word'е обозначается снятой галочкой искать слово целиком


Не понял. Напиши пример. Типа что есть в наличии и что при этом должен выдать запрос?

Думаю еще не все потеряно SQL+VB-СИЛА! :D

alammi
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 21
Зарегистрирован: 14.07.2004 (Ср) 11:07

Сообщение alammi » 14.07.2004 (Ср) 17:57

Ситуация такова: есть 2 вида поиска
1) ячейка=запрос
2) часть_ячейки=запрос
плюс ко всему если предположим в ячейке есть слово "кокс", а запрос был "кос", то несмотря на расстояние_редактирования=1, твоя формула не сработает! :cry:
Спасибо за конструктив!

MOV
Постоялец
Постоялец
 
Сообщения: 414
Зарегистрирован: 13.03.2004 (Сб) 15:13
Откуда: Санкт-Петербург

Сообщение MOV » 14.07.2004 (Ср) 18:07

Мда... Не встречал ни одной базы с такими изврщенным поиском, поэтому на счет того чтобы запрос выводил, например, КОКС, если на входе КОС :shock: пока затрудняюсь пойду подумаю.
Скажи где, например, может пригодиться такой поиск? :shock:
Если у тебе надо учеть сразу оба варианта используй в запросе IIF, только вот по последнему варианту КОС>КОКС пойду подумаю. :shock: :? 8)

alammi
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 21
Зарегистрирован: 14.07.2004 (Ср) 11:07

Сообщение alammi » 14.07.2004 (Ср) 18:09

Где это может пригодиться-не знаю, т.к. цель программы для меня - секрет. Будем думать :salut:
Спасибо за конструктив!

MOV
Постоялец
Постоялец
 
Сообщения: 414
Зарегистрирован: 13.03.2004 (Сб) 15:13
Откуда: Санкт-Петербург

Сообщение MOV » 14.07.2004 (Ср) 18:36

ЕЕЕСТЬ!!! :D
Лови. У меня работает.
Например если на входе КОС, а в таблице есть КОКС, то он поймает. А вот насчет наприемр поймать СОК - нет. Но если тебе нужно и такой вариант - советую вые@ать заказчиков в задницу! :D и послать куда подальше. извращенцы! :D

SELECT NAME
FROM GOODS
WHERE (((NAME) Like "*К*О*С*") AND ((Len([NAME]))<=4));


Думаю, "*К*О*С*", ты сможешь сам сдеалть из КОС и вставить в запрос.

Если тебе надо использовать оба варианта, можно все сделать в одном запросе с помощью Iif или разбей на два запроса в зависимости от переключателя слово целиком или нет.

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

Сообщение alibek » 15.07.2004 (Чт) 10:07

Неправильный это подход.
Тут средствами одного SQL не обойтись, нужны Stored-процедуры (или пользовательские функции). Т.е. надо либо писать программу на MS Access, либо переходить на более профессиональные СУБД.
Lasciate ogni speranza, voi ch'entrate.

MOV
Постоялец
Постоялец
 
Сообщения: 414
Зарегистрирован: 13.03.2004 (Сб) 15:13
Откуда: Санкт-Петербург

Сообщение MOV » 15.07.2004 (Чт) 12:05

alammi, думаю, ты знаешь чем плохо е@аться на красной площади да? (советами зае@ут). :D
alibek Согласен - что этот вопрос (именно "нечеткий" поиск) в самой исходной базе access делается легко и надежно и не надо ничего навешивать сбоку, но ведь, как понял, не дают ему базу, сволочи :D. Возможно они сами не имеют к ней доступ поэтому и собираются прогу свою замутить :shock: :D (шутка).

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Сообщение codemaster » 15.07.2004 (Чт) 12:34

MOV Ты хоть почитал бы что такое "нечеткий" поиск перед тем как писать. :wink: :wink: :wink:

След.

Вернуться в Visual Basic 1–6

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

Сейчас этот форум просматривают: PetalBot и гости: 14

    TopList