Первый же день - проблема. Описываю:
Требуется получить список таблиц в БД (*.mdb)
Есть опциональный список допустимых паттернов и исключительных паттернов (т.е. sPattern = "ware%;ch%", sExPattern = "msys%;tmp%")
- Код: Выделить всё
- If Len(sPattern) > 0 Then sCriteria = "(TABLE_NAME like '" & Join(Split(sPattern, ";"), "' or TABLE_NAME like '") & "')"
 If Len(sExPattern) > 0 Then sCriteria = sCriteria & IIf(Len(sCriteria) > 0, " and ", "") & "(TABLE_NAME not like '" & Join(Split(sExPattern, ";"), "' and TABLE_NAME not like '") & "')"
 Set rs = cn.OpenSchema(adSchemaTables)
 rs.Filter = sCriteria
Вываливается в ошибку, что аргумент не того типа, вне допустимого диапазона или конфликтует хз с кем
После некоторого количества кругов, описанных вокруг костра с бубном в руках, пришел к следующему:
не работает конструкция NOT LIKE. Т.е. в простейшем приближении
rs.Filter = "TABLE_NAME like 'ware%'" - работает
rs.Filter = "TABLE_NAME not like 'ware%'" - не работает
rs.Filter = "not (TABLE_NAME like 'ware%')" - не работает
В чем косяк?!!
Текст функции:
- Код: Выделить всё
- Function ADOTableList(sBase As String, v, Optional sPattern As String, Optional sExPattern _
 As String, Optional cn As ADODB.Connection, Optional sConnStr As String = cConnStr, _
 Optional sErr As String) As Boolean
 Dim bCN As Boolean, sCriteria As String, s As String
 On Error GoTo er
 
 If Not ADOOpen(sBase, sConnStr, cn, bCN, sErr) Then Err.Raise clERROR, , sErr
 
 If Len(sPattern) > 0 Then sCriteria = "(TABLE_NAME like '" & Join(Split(sPattern, ";"), "' or TABLE_NAME like '") & "')"
 If Len(sExPattern) > 0 Then sCriteria = sCriteria & IIf(Len(sCriteria) > 0, " and ", "") & _
 "(TABLE_NAME not like '" & Join(Split(sExPattern, ";"), "' and TABLE_NAME not like '") & "')"
 With cn.OpenSchema(adSchemaTables)
 .Filter = sCriteria
 If Not .EOF Then
 Do Until .EOF
 s = s & Null2Str(!TABLE_NAME) & vbLf
 .MoveNext
 Loop
 v = Split(left$(s, Len(s) - 1), vbLf)
 End If
 .Close
 End With
 ADOTableList = True
 GoTo ok
 
 er:
 sErr = Err.Description
 ok:
 If bCN Then cn.Close: Set cn = Nothing
 End Function




