Excel VBA с SQL: строка не возвращается, если указано условие Where - PullRequest
0 голосов
/ 19 декабря 2018

Здесь ниже фрагмент моих кодов.

Это команда SQL:

   vSQL = "SELECT OLIN.fk_cCUST as CustomerKey, Sum(nOLINselTota) AS ResultSumV "
   vSQL = vSQL & " FROM (OLIN Inner Join TYOR on OLIN.fk_cTYOR = TYOR.cTYOR) INNER Join MTYP On TYOR.fk_cMTYP = MTYP.cMTYP "
   vSQL = vSQL & " Where OLIN.fk_cOHEAkey Like 'T180*' "
   vSQL = vSQL & " GROUP BY OLIN.fk_cCUST "
   vSQL = vSQL & ";"

Где находится база данных:

   vDataSRC = "C:\_projCuTOPs\bdd\GSF_dataWHouse.accdb"

Переменная, содержащаястроковое соединение с БД:

   vArrSRC = "OLEDB;Provider=Microsoft.ACE.OLEDB.12.0;Password="""";User ID=Admin;"
   vArrSRC = vArrSRC & "Data Source= " & vDataSRC & ";"
   vArrSRC = vArrSRC & "Mode=Share Deny Write;Extended Properties="""";Jet OLEDB:System database="""";Jet OLEDB:Registry Path="""";Jet OLEDB:Database Password="""";"
   vArrSRC = vArrSRC & "Jet OLEDB:Engine Type=6;Jet OLEDB:Database Locking Mode=0;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;"
   vArrSRC = vArrSRC & "Jet OLEDB:New Database Password="""";Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don't Copy Locale on Compact=False;"
   vArrSRC = vArrSRC & "Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False;Jet OLEDB:Support Complex Data=False;Jet OLEDB:Bypass UserInfo Validation=False;"
   vArrSRC = vArrSRC & "Jet OLEDB:Limited DB Caching=False;Jet OLEDB:Bypass ChoiceField Validation=False"

WrkSheet для результата:

  ActiveWorkbook.Sheets.Add After:=Worksheets(Worksheets.Count)
  ActiveWorkbook.Sheets(Worksheets.Count).Name = "RawDatas"

Эта команда Добавление QueryTable в качестве ListObject возвращает вхождение ZERO из-за условия Where, тогда как SQL в порядке.

Если пункт Where удален, он работает, но мне нужно добавить ограничения на строки.

With ActiveSheet.ListObjects.Add(SourceType:=xlSrcExternal, Source:=vArrSRC, Destination:=Range("$A$1")).QueryTable
  '>>
  .CommandType = xlCmdSql
  .CommandText = vSQL
  .RowNumbers = False
  .FillAdjacentFormulas = False
  .PreserveFormatting = True
  .RefreshOnFileOpen = False
  .BackgroundQuery = True
  .RefreshStyle = xlInsertDeleteCells
  .SavePassword = False
  .SaveData = True
  .AdjustColumnWidth = True
  .RefreshPeriod = 0
  .PreserveColumnInfo = True
  '**
  .SourceDataFile = vDataSRC
  '**
  .ListObject.DisplayName = "tbl_SQL_SumTYOR"
  .Refresh BackgroundQuery:=False
  '>>
End With

Что не так?Мне абсолютно необходимо использовать пункт Где.

1 Ответ

0 голосов
/ 19 декабря 2018

Подстановочный знак LIKE ведет себя по-разному при выполнении запросов между графическим интерфейсом MS Access (внешний интерфейс) и любым подключением ODBC / OLDEB к MS Access (внутренний интерфейс).См. Различия между ANSI-89 и ANSI-92 в Документах MSDN .

Для соединений ODBC / OLEDB, как в Excel, для LIKE требуется подстановочный знак ANSI-92 с %:

vSQL = vSQL & " Where OLIN.fk_cOHEAkey Like 'T180%' "

В качестве альтернативы для совместимости используйте ALIKE (ANSI-Like) в GUI и ODBC / OLEDB:

vSQL = vSQL & " Where OLIN.fk_cOHEAkey ALike 'T180%' "

Еще лучше, сохранитезапрос в MS Access (который более эффективен, поскольку движок кэширует статистику и лучший план выполнения):

SELECT OLIN.fk_cCUST as CustomerKey, 
       SUM(nOLINselTota) AS ResultSumV
FROM (OLIN INNER JOIN TYOR ON OLIN.fk_cTYOR = TYOR.cTYOR) 
INNER Join MTYP On TYOR.fk_cMTYP = MTYP.cMTYP
WHERE OLIN.fk_cOHEAkey LIKE 'T180*'
GROUP BY OLIN.fk_cCUST

Затем укажите его имя в Excel (избегая конкатенации VBA):

vSQL = "SELECT * FROM mySavedQuery"
...