Ошибка использования функц. REPLACE через JET

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
3ton
Новичок
Новичок
 
Сообщения: 48
Зарегистрирован: 07.05.2004 (Пт) 10:56
Откуда: Kaliningrad

Ошибка использования функц. REPLACE через JET

Сообщение 3ton » 03.12.2004 (Пт) 11:32

Код: Выделить всё
Dim connDB As New ADODB.Connection
Dim rs1 As New ADODB.Recordset
sql = "select replace('asdasdasd','a','ZZ') as sss from allTovar"
connDB.Provider = "Microsoft.Jet.OLEDB.4.0;"
connDB.Open "c:\db1.mdb", "admin", ""
rs1.Open sql, connDB, adOpenKeyset, adLockOptimistic


Ругается на ошибку синтаксиса в replace('asdasdasd','a','ZZ')

С кавычками - та-же тема. Может кто с таким сталкивался.

P.S. При конструкции replace('asdasdasd';'a';'ZZ') - JET ругается на отсутствующую функцию replace.
Жить - хорошо! А хорошо жить - еще лучше!!!
Удачи! Шурик.

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

Сообщение alibek » 03.12.2004 (Пт) 11:36

А кто тебе сказал, что в ADO есть функция Replace?
Lasciate ogni speranza, voi ch'entrate.

3ton
Новичок
Новичок
 
Сообщения: 48
Зарегистрирован: 07.05.2004 (Пт) 10:56
Откуда: Kaliningrad

Сообщение 3ton » 03.12.2004 (Пт) 12:02

alibek писал(а):А кто тебе сказал, что в ADO есть функция Replace?


Если - бы ее не было, тогда, я так понимаю, JET ругнулся на отсутствующую функцию, а не на ошибку синтаксиса. (ИМХО)

P.S. Если ее нет, тогда как (чем) можно ее заменить?
Жить - хорошо! А хорошо жить - еще лучше!!!
Удачи! Шурик.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 03.12.2004 (Пт) 14:55

Ну, если она там есть, то смею предположить, что у неё два аргумента - что заменять и на что заменять... А где - это, понятно, в каждой записи :) А ограничение в where прописывается...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

3ton
Новичок
Новичок
 
Сообщения: 48
Зарегистрирован: 07.05.2004 (Пт) 10:56
Откуда: Kaliningrad

Сообщение 3ton » 03.12.2004 (Пт) 16:08

[quote="GSerg"]Ну, если она там есть, то смею предположить, что у неё два аргумента - что заменять и на что заменять... [quote]

Жаль, но не пашет... :(

Может есть альтернатива? Как убрать из строки ненужные символы?
Жить - хорошо! А хорошо жить - еще лучше!!!
Удачи! Шурик.

Leon_
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 333
Зарегистрирован: 19.05.2004 (Ср) 16:31
Откуда: Moscow

Сообщение Leon_ » 03.12.2004 (Пт) 16:13

Добавлю и свои пять копеек..
Язык SQL ядра Microsoft® Jet поддерживает синтаксис скалярных функций, определенный стандартом ODBC:
Функции преобразования строк
ASCII LENGTH RTRIM
CHAR LOCATE SPACE
CONCAT LTRIM SUBSTRING
LCASE RIGHT UCASE
LEFT

Функции преобразования чисел
ABS FLOOR SIN
ATAN LOG SQRT
CEILING POWER TAN
COS RAND MOD
EXP SIGN

Функции даты и времени
CURDATE DAYOFYEAR MONTH
CURTIME YEAR WEEK
NOW HOUR QUARTER
DAYOFMONTH MINUTE MONTHNAME
DAYOFWEEK SECOND DAYNAME

Приложение Access или просто база MDB и клиент на VB?

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

Сообщение Konst_One » 03.12.2004 (Пт) 16:17

можно на DAO, тогда и REPLACE пойдет

3ton
Новичок
Новичок
 
Сообщения: 48
Зарегистрирован: 07.05.2004 (Пт) 10:56
Откуда: Kaliningrad

Сообщение 3ton » 03.12.2004 (Пт) 16:27

Leon_ писал(а):Приложение Access или просто база MDB и клиент на VB?


база MDB и клиент на VB
Жить - хорошо! А хорошо жить - еще лучше!!!
Удачи! Шурик.

Leon_
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 333
Зарегистрирован: 19.05.2004 (Ср) 16:31
Откуда: Moscow

Сообщение Leon_ » 03.12.2004 (Пт) 16:32

Модешь в базе (не на клиенте -- в базе) создать запрос свой, с этим --
"select replace('asdasdasd','a','ZZ') as sss from allTovar"

А из клиента уже вызывать запрос по имени :roll:

3ton
Новичок
Новичок
 
Сообщения: 48
Зарегистрирован: 07.05.2004 (Пт) 10:56
Откуда: Kaliningrad

Сообщение 3ton » 03.12.2004 (Пт) 16:32

Konst_One писал(а):можно на DAO, тогда и REPLACE пойдет


Попробую, может действительно, что и выйдет :?
Жить - хорошо! А хорошо жить - еще лучше!!!
Удачи! Шурик.

Leon_
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 333
Зарегистрирован: 19.05.2004 (Ср) 16:31
Откуда: Moscow

Сообщение Leon_ » 03.12.2004 (Пт) 16:43

Konst_One писал(а):можно на DAO, тогда и REPLACE пойдет

:!: С этим утверждением не согласен. Ни DAO, ни ADO сами никаких функций над данными не реализуют. Всего лишь передают инструкции провайдеру БД. Если в JET нет REPLACE, то как к нему не обращайся -- DAO или ADO, эта функция не появится.

to 3ton: если вдруг получится, сообщи сюда, мне будет стыдно :wink:

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

Сообщение Konst_One » 03.12.2004 (Пт) 17:08

внутри самой базы MDB в запросе можно указывать любую функцию VBA - все работают. Этот запрос потом можно использовать через DAO

Leon_
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 333
Зарегистрирован: 19.05.2004 (Ср) 16:31
Откуда: Moscow

Сообщение Leon_ » 03.12.2004 (Пт) 17:13

Да, это так. Функции VBA вроде как "родные" для Access. Поэтому Replace работает, равно как и функции, реализованные пользователем.
Вот и я советую написать нужный запрос в базе, а потом уже вызывать его из клиента.

3ton
Новичок
Новичок
 
Сообщения: 48
Зарегистрирован: 07.05.2004 (Пт) 10:56
Откуда: Kaliningrad

Сообщение 3ton » 03.12.2004 (Пт) 17:37

Leon_ писал(а):Да, это так. Функции VBA вроде как "родные" для Access. Поэтому Replace работает, равно как и функции, реализованные пользователем.
Вот и я советую написать нужный запрос в базе, а потом уже вызывать его из клиента.


Создаю в MDB запрос с replace
далее его вызаваю, ... упс...,
Ошибочная инструкция SQL, ожидалось Select, Insert, и т.д.....

Пытался обойти, но там тоже мины :D
Жить - хорошо! А хорошо жить - еще лучше!!!
Удачи! Шурик.

Leon_
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 333
Зарегистрирован: 19.05.2004 (Ср) 16:31
Откуда: Moscow

Сообщение Leon_ » 03.12.2004 (Пт) 17:43

Код: Выделить всё
SELECT Replace([Country],'Finland','Rusland') AS Country1
FROM aaa

Проверь синтаксис! В MDB работает запрос?

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

Сообщение Konst_One » 03.12.2004 (Пт) 17:45

Код: Выделить всё
select Replace(Field1,'a','XXX') as Account from Table1


Проверено - работает.
Поле Field1 - текстовое(50 символов) в табличке Table1

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

Сообщение alibek » 03.12.2004 (Пт) 17:46

Я конечно давненько не работал с Access, но помоему VBA-шные функции в запросах работают только в том случае, когда эти запросы исполняются из среды Access. У него свои особые отношения с Jet, поэтому он их позволяет применять. Но когда запросы выполняются через ADO/DAO, то никакой самодеятельности не допускается.

P.S. Проверить как всегда не на чем, но думается мне, что это так.
Lasciate ogni speranza, voi ch'entrate.

3ton
Новичок
Новичок
 
Сообщения: 48
Зарегистрирован: 07.05.2004 (Пт) 10:56
Откуда: Kaliningrad

Сообщение 3ton » 03.12.2004 (Пт) 17:47

Leon_ писал(а):
Код: Выделить всё
SELECT Replace([Country],'Finland','Rusland') AS Country1
FROM aaa

Проверь синтаксис! В MDB работает запрос?


[code]SELECT replace([code]," ","") AS sss FROM AllTovar;[/code]

В акцессе все пучком, через JET - грабли
Жить - хорошо! А хорошо жить - еще лучше!!!
Удачи! Шурик.

Leon_
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 333
Зарегистрирован: 19.05.2004 (Ср) 16:31
Откуда: Moscow

Сообщение Leon_ » 03.12.2004 (Пт) 17:51

Покажи код, как ты вызываешь запрос Access в VB?

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

Сообщение alibek » 03.12.2004 (Пт) 17:53

З.Ы. Вопрос на засыпку. Никто не задавался вопросом, как Access умудряется отображать прогресс-бар в ходе выполнения запроса?
Lasciate ogni speranza, voi ch'entrate.

Leon_
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 333
Зарегистрирован: 19.05.2004 (Ср) 16:31
Откуда: Moscow

Сообщение Leon_ » 03.12.2004 (Пт) 17:55

OFF: задавался.. :-? Черт его знает...

3ton
Новичок
Новичок
 
Сообщения: 48
Зарегистрирован: 07.05.2004 (Пт) 10:56
Откуда: Kaliningrad

Сообщение 3ton » 03.12.2004 (Пт) 17:56

Leon_ писал(а):Покажи код, как ты вызываешь запрос Access в VB?


Код: Выделить всё
conndb.Open pathMDB, "admin", ""
  rst.Open "test", conndb, adOpenKeyset, adLockOptimistic


2 Alibek - Сорри пока небыло особенной необходимости над этим ломать голову.
Жить - хорошо! А хорошо жить - еще лучше!!!
Удачи! Шурик.

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

Сообщение alibek » 03.12.2004 (Пт) 18:03

Вот и брат говорит, что сила в деньгах. А она в ньютонах! :)
Я думаю, что либо в Jet есть недокументированные фишки, которые использует Access, либо у Access свой собственный Jet.
Lasciate ogni speranza, voi ch'entrate.

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

Сообщение Konst_One » 03.12.2004 (Пт) 18:03

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

работают только функции типа DATE(), FORMAT(), INSTR() и тп

придется извращаться с функциями INSTR, LEFT, RIGHT

3ton
Новичок
Новичок
 
Сообщения: 48
Зарегистрирован: 07.05.2004 (Пт) 10:56
Откуда: Kaliningrad

Сообщение 3ton » 03.12.2004 (Пт) 18:04

Код: Выделить всё
Dim dba As New DAO.DBEngine
Dim dbb As DAO.Database
Dim rss As DAO.Recordset
Set dbb = dba.OpenDatabase("c:\temp\db1.mdb")
Set rss = dbb.OpenRecordset("test")


Тоже ругается на неизвестную функцию replace :?
Жить - хорошо! А хорошо жить - еще лучше!!!
Удачи! Шурик.

3ton
Новичок
Новичок
 
Сообщения: 48
Зарегистрирован: 07.05.2004 (Пт) 10:56
Откуда: Kaliningrad

Сообщение 3ton » 03.12.2004 (Пт) 18:11

Неужели никак нельзя динамически заменить определенные символы полей на другие. Я сомневаюсь, что никто с такой необходимостью не сталкивался.
Жить - хорошо! А хорошо жить - еще лучше!!!
Удачи! Шурик.

Leon_
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 333
Зарегистрирован: 19.05.2004 (Ср) 16:31
Откуда: Moscow

Сообщение Leon_ » 03.12.2004 (Пт) 18:24

Ну что можно посоветовать -- пиши через ADO инструкции:
.Field("..") = Replace(.Field(".."), "asd", "sf")
.MoveNext
.Update
Коряво, согласен.

3ton
Новичок
Новичок
 
Сообщения: 48
Зарегистрирован: 07.05.2004 (Пт) 10:56
Откуда: Kaliningrad

Сообщение 3ton » 03.12.2004 (Пт) 18:48

Leon_ писал(а):Ну что можно посоветовать -- пиши через ADO инструкции:
.Field("..") = Replace(.Field(".."), "asd", "sf")
.MoveNext
.Update
Коряво, согласен.


Функция replace в моем случае играет роль динамически-создаваемого индекса (убирает все ненужные символы, для разных запросов различные) и данные поля сравниваются, опять-же в запросе с ранее подготовленным ключиком, собс-но далее фильтруются по этому критерию (при помощи where).

Например частный случай: есть строки 334-456 34 ; 334 45634 ; 33445634В - в таблице и они имеют одинаковую смысловую нагрузку, но формат их написания различен. Мне надо написать запрос, который выдернет эти все три записи при вводе пользователя любого из этих значений.
Жить - хорошо! А хорошо жить - еще лучше!!!
Удачи! Шурик.

3ton
Новичок
Новичок
 
Сообщения: 48
Зарегистрирован: 07.05.2004 (Пт) 10:56
Откуда: Kaliningrad

Сообщение 3ton » 03.12.2004 (Пт) 18:51

P.S. Базу изменять у меня привелегий нет (вообще это не приемлимо)
Жить - хорошо! А хорошо жить - еще лучше!!!
Удачи! Шурик.

3ton
Новичок
Новичок
 
Сообщения: 48
Зарегистрирован: 07.05.2004 (Пт) 10:56
Откуда: Kaliningrad

Сообщение 3ton » 03.12.2004 (Пт) 18:58

Есть идея :wink: , может есть возможность открыть таблицу акцесса из под какого-нибудь другого провайдера (например как открыть таблицу DBF или XLS из JET), собс-но где провайдер поддерживает функцию replace или аналогичную (Я точно знаю, что провайдер Visual FoxPro эту функцию через ADO поддерживает, но только там она называется strtran, вот только я не знаю как из фоксового провайдера открыть таблицу из mdb)
Жить - хорошо! А хорошо жить - еще лучше!!!
Удачи! Шурик.

След.

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

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

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

    TopList