mdb - SQL запрос

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
Чудик
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 639
Зарегистрирован: 06.07.2004 (Вт) 12:18
Откуда: г. Егорьевск

mdb - SQL запрос

Сообщение Чудик » 14.05.2005 (Сб) 7:15

Код: Выделить всё
Dim ggg As String

ggg = Replace(Me.txtStockList.Text, ".", "/")

For MyRow = 2 To .MSHFlexGrid1.Rows – 1
rsSQL = "SELECT*FROM Prihod WHERE [Prihod].Data <= #" & ggg & "# And [Prihod].Index='" & .MSHFlexGrid1.TextMatrix(MyRow, 0) & "' order by [Prihod].Data,[Prihod].q;"
Set rs = db.OpenRecordset(rsSQL)

On Error Resume Next
rs.MoveLast
.MSHFlexGrid1.TextMatrix(MyRow, 4) = Format(rs.Fields(2), "# ##0.00")
If CVDbl(.MSHFlexGrid1.TextMatrix(MyRow, 4)) = 0 Then .MSHFlexGrid1.TextMatrix(MyRow, 4) = ""
rs.Close
Next MyRow

В базе данных множество записей по ассортименту продукции за каждый день. Соответственно, иногда, запись за определенный день отсутствует (выходные и т.п.). Так вот если указать в запросе день, за который есть запись необходимого артикуля - все хорошо. Но если указать день, за который по данному артикулю не было произведено ни одной записи - вся выводимая сводная таблица (Grid) выводится пустой. Не пойму почему.
Век живи - век учись!
www.detal-plast.narod.ru

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 14.05.2005 (Сб) 13:45

Что-то ты не то с данными мутишь. Нафига ты тянешь рекордсет, а потом используешь из него только последнюю строку? Не проще ли сразу написать примерно так:
Код: Выделить всё
select top 1 *
from Prihod
where ...
order by Prihod.Data desc, prihod.q desc

Так ты получишь не более одной строки, после чего ты всегда можешь проверить ее существование в рекордсете кучей способов.

А вообще, скорее всего, проблема в On Error Resume Next. Убери его и само все всплывет :).

Чудик
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 639
Зарегистрирован: 06.07.2004 (Вт) 12:18
Откуда: г. Егорьевск

Сообщение Чудик » 14.05.2005 (Сб) 14:06

Без Resume Next я пробовал - выдает ошибку на rs.MoveLast на строке в Grid где-то на 65, т.е. получается записи в рекодсете нет. Но записей полно, проверил даже путем элементарного просмотра БД в ручную. Причем ошибка есть всегда, даже когда указываешь дату, когда была произведена запись артикуля в БД!
Наверное все-таки, что -то как-то не так у меня запрос составлен.
Жаль в данный момент не имею возможности предложенный вариант попробовать - исходник дома оставил!
А зачем в order by такое как desc?
Век живи - век учись!
www.detal-plast.narod.ru

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 14.05.2005 (Сб) 15:17

Это от англ. Descending - убывающий. Сортировка в обратную сторону. В прямую сторону - Ascending, соотв-но ASC, но это сортировка по дефолту, и это указывать необязательно.

Насчет кучи записей в БД - это одно, а в рекордсете они есть? Это две большие разницы, знаешь ли.

По поводу ошибок - ну так проверять надо рекордсет, перед тем как работать с ним! Во-первых, RecordCount, во-вторых, BOF/EOF - если они одновременно True, значит в рекордсете ничего нет. Нельзя же так безответственно индустриальные приложения писать :? ...

Чудик
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 639
Зарегистрирован: 06.07.2004 (Вт) 12:18
Откуда: г. Егорьевск

Сообщение Чудик » 14.05.2005 (Сб) 15:23

Да, но если в БД есть запись, удовлетворяющая условию, почему она не оказывается в рекодсете? Получается, что все-таки криво составлен запрос?
Век живи - век учись!
www.detal-plast.narod.ru

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 14.05.2005 (Сб) 16:39

Чудик писал(а):Да, но если в БД есть запись, удовлетворяющая условию, почему она не оказывается в рекодсете? Получается, что все-таки криво составлен запрос?


Похоже. Как миниум дата должна быть а американском формате. Ты текст получшвшегося запроса в отладчике посмотри. Из нашего в американский дата простой заменой точек на / не переводится...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Чудик
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 639
Зарегистрирован: 06.07.2004 (Вт) 12:18
Откуда: г. Егорьевск

Сообщение Чудик » 15.05.2005 (Вс) 21:07

В отладчике дата типа "15/05/2005", но тем не менне мне кажется, что именно из-за датты такая ерунда, так как код:
Код: Выделить всё
        For MyRow = 2 To .MSHFlexGrid1.Rows - 1
            rsSQL = "SELECT * FROM Prihod WHERE [Prihod].Index='" & .MSHFlexGrid1.TextMatrix(MyRow, 0) & "' order by [Prihod].Data, [Prihod].q;"
            Set rs = db.OpenRecordset(rsSQL)

            If rs.RecordCount = 0 Then .MSHFlexGrid1.TextMatrix(MyRow, 7) = "+++++++++++++++": GoTo 1
           
            rs.MoveLast
            Do While Not rs.BOF
                MyDate = .txtStockList.Text
                If rs.Fields(0) <= MyDate Then
                    .MSHFlexGrid1.TextMatrix(MyRow, 4) = Format(rs.Fields(2), "# ##0.00")
                    If CVDbl(.MSHFlexGrid1.TextMatrix(MyRow, 4)) = 0 Then .MSHFlexGrid1.TextMatrix(MyRow, 4) = ""
                    Exit Do
                End If
                rs.MovePrevious
            Loop
1:
            rs.Close
        Next MyRow

Работает нормально! но не хотелось бы отбор выносить за пределы SQL запроса.
Век живи - век учись!
www.detal-plast.narod.ru

Sedge
Alternative Choice
Alternative Choice
Аватара пользователя
 
Сообщения: 1049
Зарегистрирован: 16.05.2002 (Чт) 18:23
Откуда: Somewhere-In-The-Net

Сообщение Sedge » 15.05.2005 (Вс) 21:45

Покажи, что у тебя возвращает Debug.Print rsSQL.
И ту запись, которая удовлетворяет условию, но не входит - тоже покажи...
И структуру таблицы до кучи...

Чудик
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 639
Зарегистрирован: 06.07.2004 (Вт) 12:18
Откуда: г. Егорьевск

Сообщение Чудик » 15.05.2005 (Вс) 22:13

Debug возвращает:
SELECT*FROM Prihod WHERE [Prihod].Data <= #15/05/2005# And [Prihod].Index='01-PAL-20MB-001' order by [Prihod].Data,[Prihod].q;

Структура таблицы:
Data (Дата/Время)
Index (Текстовый)
Stock (Числовой)
Prihod (Числовой)
q (Счетчик)

Ну а записей, удовлетворяющих условию много.
Другими словами 02.04.2005 записей нет, 01.04.2005 записи вносились.
Делаю запрос по дате 02.04.2005 - как результат, пусто, в рекодсет не попадает ни одна запись.
Век живи - век учись!
www.detal-plast.narod.ru

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 16.05.2005 (Пн) 2:36

Чудик писал(а):Делаю запрос по дате 02.04.2005 - как результат, пусто, в рекодсет не попадает ни одна запись.

Глянь в базе, там есть записи с таким индексом, но на момент 4 февраля этого года?

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 16.05.2005 (Пн) 6:55

Чудик писал(а):В отладчике дата типа "15/05/2005"


Дата должна быть в американском формате, т.е 5/15/2005
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Чудик
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 639
Зарегистрирован: 06.07.2004 (Вт) 12:18
Откуда: г. Егорьевск

Сообщение Чудик » 16.05.2005 (Пн) 7:15

Код: Выделить всё
SELECT*FROM Prihod WHERE [Prihod].Data <= #15/05/2005# And [Prihod].Index='01-PAL-20MB-001' order by [Prihod].Data,[Prihod].q;

Разве здесь дата не в американском формате?
Глянь в базе, там есть записи с таким индексом, но на момент 4 февраля этого года?

А почему именно 4 февраля? БД ведется только с середины марта, так что нет. Но записей с таким (и другим) индексом полно и до и после указываемой даты!
К стати в ходе наблюдений было замечено, что иногда данные не выдаются и при запросе за день, когда записи производятся как обычно.

Я выкинул два куска кода: первый не работает, другой работает. Отличие только в том, что дата либо в запросе, либо в самом коде, в условии. Может все-таки фишка в дате?
Последний раз редактировалось Чудик 16.05.2005 (Пн) 7:30, всего редактировалось 1 раз.
Век живи - век учись!
www.detal-plast.narod.ru

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 16.05.2005 (Пн) 7:24

Нет, должно быть mm/dd/yyyy, а у тебя dd/mm/yyyy.
Lasciate ogni speranza, voi ch'entrate.

Чудик
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 639
Зарегистрирован: 06.07.2004 (Вт) 12:18
Откуда: г. Егорьевск

Сообщение Чудик » 16.05.2005 (Пн) 8:39

Да-а-а-а-а! :?
Столько шума, а все из-за даты! Изменил формат даты, проверил за каждый день запрос, все чик-чирик.
Благодарю за участие!
Век живи - век учись!
www.detal-plast.narod.ru

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 16.05.2005 (Пн) 8:42

(ворчливо) Сколько раз говорил уже, параметрические запросы рулят...
Lasciate ogni speranza, voi ch'entrate.

Чудик
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 639
Зарегистрирован: 06.07.2004 (Вт) 12:18
Откуда: г. Егорьевск

Сообщение Чудик » 16.05.2005 (Пн) 8:46

параметрические запросы

Не понял ...
Век живи - век учись!
www.detal-plast.narod.ru

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 16.05.2005 (Пн) 9:06

Посмотри справку по ADO.Command.
Lasciate ogni speranza, voi ch'entrate.

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Сообщение codemaster » 16.05.2005 (Пн) 11:30

Чудик писал(а):[code]:SELECT*FROM Prihod[code]



Никогда так не пиши запросы.
Это очень плохая привычка ...... :wink: :wink:
//<-
Mit freundlichen Grüßen
//->

Чудик
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 639
Зарегистрирован: 06.07.2004 (Вт) 12:18
Откуда: г. Егорьевск

Сообщение Чудик » 16.05.2005 (Пн) 11:41

Alibek, про ADO.Command найти не могу в инете, адрес MSDN не помню (была ссылка в избранном, но после того как покапались наши администраторы на на моем компе, все куда-то поисчезало). Кинь сылку, до дома не втрепеж.
Сodemaster, та хачешь сказать, что нужно конкретизировать типа SELECT TOP 1 * ?
Век живи - век учись!
www.detal-plast.narod.ru

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 16.05.2005 (Пн) 12:09

Он наверное имеет ввиду, что пробелы надо ставить.
Поищи на форуме по словам Dim cmd As ADODB.Command, я пример уже давал.
Lasciate ogni speranza, voi ch'entrate.

Чудик
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 639
Зарегистрирован: 06.07.2004 (Вт) 12:18
Откуда: г. Егорьевск

Сообщение Чудик » 16.05.2005 (Пн) 13:38

Ура-а-а-а-а-а! Нашел! (после часового поиска). Познавательно, есть над чем задуматься.
А что насчет пробелов? На практике вроде и так и так работает.
Век живи - век учись!
www.detal-plast.narod.ru

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 16.05.2005 (Пн) 13:47

На практике может и не работать. Да и читать такой "поток сознания" сложно будет, лучше оформлять его читабельным образом.

Вот как читаться будет куда лучше.

Код: Выделить всё
SELECT *
FROM Prihod
WHERE 1=1
  AND [Prihod].Data <= #15/05/2005#
  AND [Prihod].Index='01-PAL-20MB-001'
ORDER BY [Prihod].Data,[Prihod].q;
Lasciate ogni speranza, voi ch'entrate.

Чудик
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 639
Зарегистрирован: 06.07.2004 (Вт) 12:18
Откуда: г. Егорьевск

Сообщение Чудик » 16.05.2005 (Пн) 14:04

Да, в самом деле ... Постараюсь этого придерживаться.
Век живи - век учись!
www.detal-plast.narod.ru

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Сообщение codemaster » 16.05.2005 (Пн) 14:11

Чудик писал(а):Сodemaster, та хачешь сказать, что нужно конкретизировать типа SELECT TOP 1 * ?




Код: Выделить всё
select *

как и
Код: Выделить всё
select table1.*

это почти 100% плоxo. Это мина замедленного действия которую ты подкладываеш если не себе, то своему преемнику(пользователю). Особенно если дизайн таблицы постоянно меняется.

верно будет следующее
Код: Выделить всё

select table1.column2, table2.column2 where table1.column1 = table2.column1
или

select a.column2, b.column2 from table1 a, table2 b where a.column1 = b.column1
//<-
Mit freundlichen Grüßen
//->

Чудик
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 639
Зарегистрирован: 06.07.2004 (Вт) 12:18
Откуда: г. Егорьевск

Сообщение Чудик » 16.05.2005 (Пн) 14:15

Т.е. лучше конкретизировать запрос? А чем плох Select *? Не понял, в чем мина?
Век живи - век учись!
www.detal-plast.narod.ru

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Сообщение codemaster » 16.05.2005 (Пн) 14:21

Чудик писал(а):Т.е. лучше конкретизировать запрос? А чем плох Select *? Не понял, в чем мина?


попробуй удали (добавь) столбец в своей бд при SELECT *
осознание придет само собой :wink:
//<-
Mit freundlichen Grüßen
//->

Чудик
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 639
Зарегистрирован: 06.07.2004 (Вт) 12:18
Откуда: г. Егорьевск

Сообщение Чудик » 16.05.2005 (Пн) 14:32

Если ты имеешь в виду возможные проблемы при работе с rs.fields, то понятно. До сих пор я просто добавлял столбцы справа скраю. Но при возникновении необходимости удаления одного из них, (долгая пауза), да ... Надо обязательно это принять во внимание.
Век живи - век учись!
www.detal-plast.narod.ru

Чудик
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 639
Зарегистрирован: 06.07.2004 (Вт) 12:18
Откуда: г. Егорьевск

Сообщение Чудик » 16.05.2005 (Пн) 19:12

Alibek,
у меня запрос такой:
Код: Выделить всё
        prSQL = "SELECT * From Prihod WHERE [Prihod].Data <= #" & MyDate & "# And [Prihod].Index='" & .TextMatrix(MyRow, 1) & "'order by [Prihod].Data;"

но стоит мне перенести все, что после *, тут же select * закрывается кавычками и перенесенная часть запроса не распознается как запрос.
При переносе части со словом where выдает вообще синтаксическую ошибку. Как же добиваться наглядности в таких условиях?
Век живи - век учись!
www.detal-plast.narod.ru

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 16.05.2005 (Пн) 22:21

Код: Выделить всё
prSQL = "SELECT * From Prihod " & _
"WHERE [Prihod].Data <= #" & MyDate & _
"# And [Prihod].Index='" & .TextMatrix(MyRow, 1) & _
"'order by [Prihod].Data;"

Чудик
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 639
Зарегистрирован: 06.07.2004 (Вт) 12:18
Откуда: г. Егорьевск

Сообщение Чудик » 17.05.2005 (Вт) 6:58

Ага, все-таки традиционный перенос.
Век живи - век учись!
www.detal-plast.narod.ru

След.

Вернуться в Базы данных

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

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

    TopList