powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Проблема с запросом через Microsoft Jet engine
3 сообщений из 3, страница 1 из 1
Проблема с запросом через Microsoft Jet engine
    #36154871
Volder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
никак не могу разобраться в чем причина следующей проблемы:

Есть Excel 2007 файл (в принципе в 2003 офисе - та же проблема присутствует) - файл креплю.
на первом Листе - настроечная таблица:

nummaskword170601%150____дисконт270601%150____

в поле mask - маска счета, где % - любая последовательность символов, _ - любой один символ (все как в ANSI SQL).

Колонка word - это дополнительный признак, в котором указывается слово, которое должно быть в наименовании счета.

На втором листе input - сами входные данные:

acc_numberacc_name70601810000001503333Дисконт по Ленинградской области

для простоты взял один счет.

Что нужно - для каждого счета - выбрать первую встретившуюся маску, причем если указано слово - оно должно присутствовать в наименовании счета (case-insensitive).

Для этого создаю в макросе соединение через Microsoft Jet Engine - и обращаюсь к данным листов как к табилицам через [наименование_листа$]:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
Sub setAccProperties()

'delete all data from result and temp tabs
Sheets("result").Select
Cells.Select
Selection.Delete

Sheets("temp").Select
Cells.Select
Selection.Delete

Dim cn As ADODB.Connection
Set cn = New ADODB.Connection
Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
Dim qTable As QueryTable

Dim current_file As String
current_file = ThisWorkbook.Name

'establish MS Jet connection to current file
With cn
    .Provider = "Microsoft.Jet.OLEDB.4.0;"
    .ConnectionString = "Data Source = " & current_file & ";" & _
    "Extended Properties=Excel 8.0;"
    .Open
End With

'select for each account the first matching mask
Set rs = cn.Execute("select i.acc_number, min(m.num) as min_num " & _
                                                "from [masks$] m, [input$] i " & _
                                               "where i.acc_number like m.mask " & _
                                               "and (i.acc_name like '%' & m.word & '%') " & _
                                               "group by i.acc_number")

'insert result of the intermediate query to temp sheet
Sheets("temp").Select
Set qTable = Sheets("temp").QueryTables.Add(rs, Range("A1"))
qTable.Refresh

cn.Close

'establish MS Jet connection to current file again
With cn
    .Provider = "Microsoft.Jet.OLEDB.4.0;"
    .ConnectionString = "Data Source = " & current_file & ";" & _
    "Extended Properties=Excel 8.0;"
    .Open
End With

'select all accounts with additional data taken from mask settings
Set rs = cn.Execute("select * from [masks$] m, [input$] i, [temp$] t " & _
                      "where i.acc_number = t.acc_number and m.num = t.min_num")


'insert result of the query to result sheet
Sheets("result").Select
Set qTable = Sheets("result").QueryTables.Add(rs, Range("A1"))
qTable.Refresh


Set rs = Nothing

cn.Close

End Sub


проблема в том, что запросы (особенно первый) - работает корректно только один раз:

Когда я открываю заново Excel и запускаю макрос - то возвращается резульат:

nummaskwordi.acc_numberacc_namet.acc_numbermin_num170601%150____дисконт70601810000001503333Дисконт по Ленинградской области706018100000015033331
то есть то, что нужно. Слово Дисконт встречается в наименовании - поэтому подхватилась первая маска, где указано слово "дисконт".

Но если тут же запустить макрос еще раз - результат другой:

nummaskwordi.acc_numberacc_namet.acc_numbermin_num270601%150____70601810000001503333Дисконт по Ленинградской области706018100000015033332

то есть уже почему-то по слову "дисконт" поиск не сработал.

Причем если закрыть файл в Excel - открыть его заново и запустить макрос - то работает некорректно.

Но вот если полностью закрыть приложение Excel - потом запустить Excel, открыть файл и запустить макрос - то первый раз запрос отрабатывает корректно - потом опять не хочет.

Никак не пойму, почему такая избирательность (((
...
Рейтинг: 0 / 0
Проблема с запросом через Microsoft Jet engine
    #36156465
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну если честно, то у мнея сразу выводится записчь с id 2
проблема в этом условии
Код: plaintext
(i.acc_name like '%' & m.word & '%')

решение, либо в маске писать в полном соответствии, либо приводить через Upper или Lower к одному виду

I Have Nine Lives You Have One Only
THINK!
...
Рейтинг: 0 / 0
Проблема с запросом через Microsoft Jet engine
    #36156796
Volder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
HandKotну если честно, то у мнея сразу выводится записчь с id 2
Вот это-то и странно. Если бы все время одинаково работала - я бы и не спрашивал.
А у меня первый раз (именно сразу после открытия Excel) подхватывает ее.
А дальше ни в какую.

На самом деле, хоть и читал, что MS JET case-insensitive - видимо или не там читал, или хреново реализовано.

Тоже смотрел в сторону lower upper - только такие функции не поддерживаются.
Немного волос повырвал пока нашел, что надо использовать lcase :)

В общем переделал так - работает стабильно, но осадок остался:
Код: plaintext
and (m.word is null or instr(lcase(i.acc_name), m.word) >  0 )

спасибо
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Проблема с запросом через Microsoft Jet engine
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]