1 (изменено: ada, 2014-08-05 13:31:02)

Тема: VBS: Проблема с sql запросом.

Здравствуйте!!!
Прошу Вас помочь решить проблему с запросом из VBScript. Заранее благодарю Вас за помощь.

Скрипт выводит следующую ошибку:
http://forum.script-coding.com/misc.php?action=pun_attachment&item=831&download=1&secure_str=32462t9865

Сам код:

+ открыть спойлер

Option Explicit
Dim strPath, fileName, qStr, queryObj, tmp
strPath = "C:\test"
fileName = "test.txt"
qStr = "SELECT LEN(barname) as BarnameLen, * FROM "&fileName&" WHERE LEN(barname)<=20 GROUP BY barname ORDER BY LEN(barname)"
queryObj = QueryTextFile(strPath, qStr)
If IsArray(queryObj) Then
    For Each tmp In queryObj
        WScript.Echo tmp
    Next    
End If

Function QueryTextFile(fileLocation, qString)
    Const adOpenStatic = 3
    Const adLockOptimistic = 3
    Const adCmdText = &H0001
    Dim objConnection, objRecordSet, result
    Set objConnection = CreateObject("ADODB.Connection")
    Set objRecordSet = CreateObject("ADODB.Recordset")
    objConnection.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & fileLocation & ";Extended Properties=""text;;"";"
    objConnection.Open
    objRecordset.Open qString, objConnection, adOpenStatic, adLockOptimistic, adCmdText
    If Not objRecordset.EOF Or Not objRecordset.BOF Then
        QueryTextFile = objRecordSet.GetRows()        
    End If
    Set objRecordset = Nothing
    Set objConnection = Nothing
End Function

schema.ini файл:

+ открыть спойлер

[test.txt]
Format = TabDelimited
ColNameHeader = True
Col1 = shopcode Text
Col2 = grpname Text
Col3 = barcode Text
Col4 = barname Text
Col5 = salesitem Long
Col6 = salesvalue Long

test.txt файл:

+ открыть спойлер

shopcode grpname barcode barname salesitem salesvalue
1 СРЕДСТВА ГИГИЕНЫ 7891418826200 зубная паста 50мл Бережное Отбеливание 1 123
1 СРЕДСТВА ГИГИЕНЫ 7891414900300 зубная паста 50мл Защита от Кариеса 1 123
7 СРЕДСТВА ГИГИЕНЫ 8850633044900 зубная щетка Премьер отбеливания 1 118
5 БЫТОВАЯ ХИМИЯ 5413155692800 средство для посуды 500мл Алоэ 1 187
3 БЫТОВАЯ ХИМИЯ 5413104284100 универсальное средство 400гр порошок Лимон 3 495
4 БЫТОВАЯ ХИМИЯ 5410018384500 универсальное средство 475гр порошок Океан 1 203
2 БЫТОВАЯ ХИМИЯ 5413100858800 универсалное средство 400гр Сосна 1 194
7 СРЕДСТВА ПО УХОДУ ЗА ВОЛОСАМИ 5011161622600 шампунь 250мл Блеск ухаживающий 1 416
3 СРЕДСТВА ПО УХОДУ ЗА ВОЛОСАМИ 5410656075200 шампунь 400мл укрепление и блеск 1 554
5 СРЕДСТВА ПО УХОДУ ЗА ВОЛОСАМИ 5000418417400 шампунь 400мл Гладкий Шелк 2в1 1 778
4 СРЕДСТВА ПО УХОДУ ЗА ВОЛОСАМИ 4015037787800 шампунь 400мл Против перхоти 1 376
5 СРЕДСТВА ГИГИЕНЫ 4010004164100 прокладки Ультра 10шт 1 332
4 СРЕДСТВА ГИГИЕНЫ 4010043754300 прокладки Классик 7шт 1 241
3 СРЕДСТВА ГИГИЕНЫ 4010048183600 ежедневки нормал 20шт 2 284
1 СРЕДСТВА ГИГИЕНЫ 4010048192800 ежедневки нормал 60шт 1 414
1 СРЕДСТВА ГИГИЕНЫ 4010010783500 ежедневки Регуляр 20шт 1 166
1 СРЕДСТВА ГИГИЕНЫ 4010017975700 ежедневки Нормал 60шт 1 440
2 СРЕДСТВА ГИГИЕНЫ 5007489856900 зубная паста 50мл 1 116
2 СРЕДСТВА ГИГИЕНЫ 4603103030400 туалетная бумага 1 307

2

Re: VBS: Проблема с sql запросом.

Скрипт выводит следующую ошибку:

Там же написана причина. Замените «*» на «barname». Получите:

16
туалетная бумага
17
зубная паста 50мл

3

Re: VBS: Проблема с sql запросом.

Спасибо, но мне нужен результат:
BarnameLen   shopcode   broup                           barcode                 barname                     salesitem    salesvalue
17                   2                СРЕДСТВА ГИГИЕНЫ    5007489856900    зубная паста 50мл    1                 116
16                   2                СРЕДСТВА ГИГИЕНЫ    4603103030400    туалетная бумага     1                 307

Соответственно должен быть следующий запрос:


SELECT LEN(barname) as BarnameLen, * FROM test.txt WHERE LEN(barname)<=20 GROUP BY barname ORDER BY BarnameLen

В место "*" можно использовать имена колонок, но это тоже не дает результата.

4

Re: VBS: Проблема с sql запросом.

но мне нужен результат:

Вы не можете при группировке использовать «*» в списке полей. Это раз. Второе: Вы не можете не использовать группировку для полей, указанных в списке. Т.е.:

qStr = "SELECT LEN(barname) as BarnameLen, shopcode, barname, grpname, salesitem, salesvalue FROM " & fileName & " WHERE LEN(barname)<=20 GROUP BY barname, shopcode, grpname, salesitem, salesvalue ORDER BY LEN(barname)"

Возможно, что вместо конкретных полей Вам нужны будут суммы или количества, например:

qStr = "SELECT LEN(barname) as BarnameLen, shopcode, barname, grpname, count(salesitem), sum(salesvalue) FROM " & fileName & " WHERE LEN(barname)<=20 GROUP BY barname, shopcode, grpname, salesitem, salesvalue ORDER BY LEN(barname)"

— я по примеру не могу этого определить.

5

Re: VBS: Проблема с sql запросом.

alexii, спасибо!!!
Скажите пожалуйста, можно ли использовать "SET ENGINEBEHAVIOR 70" в VBS. Так как в VisualFoxPro при использовании этой установки следующий запрос возвращает желаемый результат.


SELECT LEN(barname) as BarnameLen, * FROM test.txt WHERE LEN(barname)<=20 GROUP BY barname ORDER BY BarnameLen


Только там нужно текстовый файл конвертировать в "dbf".
Запрос в VFP:


SET ENGINEBEHAVIOR 70
SELECT LEN(ALLTRIM(barname)) AS BarnameLen, * FROM test WHERE LEN(ALLTRIM(barname)) <= 20 GROUP BY barname ORDER BY BarnameLen

6

Re: VBS: Проблема с sql запросом.

Скажите пожалуйста, можно ли использовать "SET ENGINEBEHAVIOR 70" в VBS.

Дело не в VBScript. Мы используем OLEDB Text Driver. Посему «SET ENGINEBEHAVIOR …», относящееся к FoxPro, неприменимо.

+ ada