ASP+Access Union не работает

Программирование на Active Server Pages и VBScript.
ANB
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 21.10.2005 (Пт) 1:17

ASP+Access Union не работает

Сообщение ANB » 21.10.2005 (Пт) 1:41

Есть база данных на Access b страница на ASP.
Есть желание вывести запрос из базы в виде таблицы на странице.
При выполнении запроса вида SELECT [Field] FROM [Table] все работает отлично, но при выполнении запроса вида SELECT [Field1] FROM [Table] UNION SELECT [Field2] FROM [Table] на странице отображается пустая страница. (Сам запрос написан прямо в Access и в нем выполняется без проблем).
Текст реализации на ASP:
Set Connection = Server.CreateObject("ADODB.Connection")
Connection.Open "MyBase"
strSQL = "SELECT * FROM TA_Prob"
Set AccessTab = Connection.Execute(strSQL)
While Not AccessTab.EOF
.....
AccessTab.MoveNext
Wend

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 21.10.2005 (Пт) 13:04

Для начала код ошибки в студию
Код: Выделить всё
On Error Resume Next
Set AccessTab = Connection.Execute(strSQL)
If (Err) Then
    Response.Write Err.Number & ": " & Err.Description
    Response.End
End If
On Error GoTo 0

ANB
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 21.10.2005 (Пт) 1:17

Сообщение ANB » 21.10.2005 (Пт) 17:21

Вставил проверку, ошибки нет, просто выдает пустой набор, хатя при открытии этого запроса в Access все открывается. Если в Access убираю из запроса UNION тоже все работает.

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 22.10.2005 (Сб) 11:06

Т.е. ошибок нет, коннеция нормально открылась и EOF = True? Вот этот TA_Prob - это хто? Сохранённый запрос? Попробуй просто вызвать саму таблицу без условий. Если не получится, то, видимо, проблема с коннекцией. Может провайдера или ещё чего указать надобно.

ANB
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 21.10.2005 (Пт) 1:17

Сообщение ANB » 22.10.2005 (Сб) 20:21

Проблема судя по всему или в ADO или в самом Accesse.
Судите сами:
Есть два запроса (привожу дословный текст запросов):
1)Пробный TA_Prob:
SELECT u1.TraffName AS FullName, Sum(c1.Sent) AS ISent1, Sum(c1.Received) AS IRec1, 0 AS DSent1, 0 AS DRec1, 0 AS KSent1, 0 AS KRec1
FROM all_connections AS c1, users_data AS u1
WHERE (((c1.RecDate) Like '??/10/2005'))
and (c1.UserName=u1.UName) and (u1.Vid=1)
GROUP BY u1.TraffName;
2)Нужный мне TraffAll:
SELECT u1.TraffName AS FullName, Sum(c1.Sent) AS ISent1, Sum(c1.Received) AS IRec1, 0 AS DSent1, 0 AS DRec1, 0 AS KSent1, 0 AS KRec1
FROM all_connections AS c1, users_data AS u1
WHERE (((c1.RecDate) Like '??/10/2005'))
and (c1.UserName=u1.UName) and (u1.Vid=1)
GROUP BY u1.TraffName
UNION SELECT u2.TraffName AS FullName, 0 AS ISent1, 0 AS IRec1, Sum(c2.Sent) AS DSent1, Sum(c2.Received) AS DRec1, 0 AS KSent1, 0 AS KRec1
FROM all_connections AS c2, users_data AS u2
WHERE (((c2.RecDate) Like '??/10/2005'))
and (c2.UserName=u2.UName) and (u2.Vid=2)
GROUP BY u2.TraffName
UNION SELECT u3.TraffName AS FullName, 0 AS ISent1, 0 AS IRec1, 0 AS DSent1, 0 AS DRec1, Sum(c3.Sent) AS KSent1, Sum(c3.Received) AS KRec1
FROM all_connections AS c3, users_data AS u3
WHERE (((c3.RecDate) Like '??/10/2005'))
and (c3.UserName=u3.UName) and (u3.Vid=3)
GROUP BY u3.TraffName;
Есть третий, который выбирает данные из одного из этих (собственно к нему и идет обращение из ASP) Traff_All:
SELECT FullName, Sum(ISent1) AS ISent, Sum(IRec1) AS IRec, Sum(DSent1) AS DSent, Sum(DRec1) AS DRec, Sum(KSent1) AS KSent, Sum(KRec1) AS KRec
FROM TA_Prob
GROUP BY FullName;
В самом Accesse все отлично работает при обращении как к TA_Prob, так и к TraffAll.
А вот при обращении из ASP скрипта, если идет обращение к TA_Prob - то список выдается, а если в запросе Traff_All поменять на обращение к TraffAll (в самом запросе Accessa поменять), то выдается пустой список.
Я не представляю, какая может быть ошибка в скрипте, если он все-таки работает с запросом без UNIONа.
Я предполагаю что ошибка все-таки или в том, как ADO обращается к UNION запросам Accessa, или в самом Accesse (установлен Access 97).
А может устаревшая версия ADO или Accessa (и как это проверить).

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 23.10.2005 (Вс) 11:52

Честно говоря, с разбега никаких ошибок вроде бы нет, т.е. должно работать. Не знаю как 97, а 2000 спокойно обрабатывает UNION'ы. Тем более, что в самом Access'е всё работает. Единственное, как мне кажется, тонкое место в запросах это LIKE на дату. В каком формате хранится дата? Строка или DateTime? Может стоит попробовать искать как Month() и Year(), т.к. дата, как правило, представлена в американском формате, т.е. первым идёт месяц, а потом день? Хотя, если первый запрос возвращает набор данных, то и второй тоже должен находить их по тем же условиям. По крайней мере для первого мембера в связке UNION'ов. Странно.

Я не знаю в чём проблема, но могу рассказать как бы я попытался её решить. Поэтапно усложняя код искал бы где собака порылась. Для начала строим простейший запрос с одним полем без условий (или с простейшим условием с заведомо непустым результатом) и без объединений.
Код: Выделить всё
SELECT UName From users_data WHERE Vid = 333

Далее объединяем этот запрос сам с собой.
Код: Выделить всё
SELECT UName From users_data WHERE Vid = 333

UNION

SELECT UName From users_data WHERE Vid = 333

По идее должно выдать то же самое. Если нет, то alles kaputt :(, в противоположном случае делаем вывод, что UNION'ы работают и проблема в чём-то другом. Ввести в экперимент поле с типом DateTime и т.д.

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

Сообщение GSerg » 23.10.2005 (Вс) 12:25

Дык это...

В ADO вместо ? юзается _.
А вместо * - %.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 23.10.2005 (Вс) 12:41

GSerg писал(а):Дык это...

В ADO вместо ? юзается _.
А вместо * - %.

Дык запрос-то, во-первых, сохранённый, во-вторых, вариант без UNION'ов, но с ?? возвращает чего-то там. Хотя, ХЗ :roll:, может и в этом вся трабла.

ANB
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 21.10.2005 (Пт) 1:17

Сообщение ANB » 23.10.2005 (Вс) 14:08

Поле RecDate - текстовое.
Не поверите, но факт.
Попробовал убрать из условия LIKE, все заработало.
Потом попробовал заменить "??" на "__", из ASP все заработало, зато в самом Accesse запрос возвращает пустую выборку.
Судя по всему, ADO как-то проверяет и транслирует синтаксис Accessa (хотя мне и трудно такое представить), иначе почему в Accesse приходится опираться на синтаксис ADO.
Вдвойне непонятно, почему без UNION запрос проходит, а с ним - нет, ведь это СОХРАНЕННЫЕ ЗАПРОСЫ самого Accessa.
Всем большое спасибо, в принципе проблема решена, остальное дело техники.

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

Сообщение GSerg » 23.10.2005 (Вс) 22:18

Да, замени на на Right$(c3.RecDate,7) = '10/2005'...
Но почему так, действительно...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас


Вернуться в ASP и VBScript

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

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

    TopList