Вопрос по запросу к БД

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Алексей К.
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 419
Зарегистрирован: 12.05.2004 (Ср) 9:41
Откуда: Ульяновск

Вопрос по запросу к БД

Сообщение Алексей К. » 21.02.2005 (Пн) 14:27

Код: Выделить всё
запрос = "SELECT * FROM файлы where папка=" + """" + старое_имя + """" + ";"
Set rs = db.OpenRecordset(запрос) 'запрос по папке
записей = rs.RecordCount
Do Until rs.EOF
    записей = rs.RecordCount
    rs.Edit
    rs.Fields("папка") = новое_имя
    rs.Update
    rs.MoveNext
Loop

Выполняю запрос по условию, я точно знаю что записей отбирается больше чем 1. почему когда делаю точку останова на строках:
записей = rs.RecordCount
Только после того как цикл два раза пройдет - переменная "записей" показывает правильное кол-во записей. А сначала показывает - значение 1. Почему так?

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 21.02.2005 (Пн) 14:37

нужен клиентский курсор:

Код: Выделить всё
rs.CursorLocation = adUseClient

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 21.02.2005 (Пн) 14:38

извини, я думал у тебя ADO, а ты с DAO работаешь.
вот это тебе поможет:

Код: Выделить всё
rs.MoveLast
rs.MoveFirst

debug.Print rs.RecorCount

Алексей К.
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 419
Зарегистрирован: 12.05.2004 (Ср) 9:41
Откуда: Ульяновск

Сообщение Алексей К. » 21.02.2005 (Пн) 14:42

Оно самое! Спасибочки

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

Сообщение alibek » 21.02.2005 (Пн) 14:46

Либо открывай курсор, как Dynaset, тогда не надо будет репозиционировать курсор.
Lasciate ogni speranza, voi ch'entrate.

Алексей К.
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 419
Зарегистрирован: 12.05.2004 (Ср) 9:41
Откуда: Ульяновск

Сообщение Алексей К. » 21.02.2005 (Пн) 15:09

Возник попутный вопрос. Таблица "Каталоги". Поля "Имя", "Ключ" -уникальный .
Помогите с текстом запроса: Показать список "имен" которые встречаются в поле "имя" более чем 1 раз (парные). Этот код вроде должен работать на mysql. Написал запрос в аце, но при его запуске запрашиваются почемуто для ввода значения полей "имя" и "ключ".
Код: Выделить всё
SELECT каталоги.имя, каталоги.ключ
FROM каталоги AS A, каталоги AS B
WHERE A.имя=B.имя And A.ключ<>B.ключ;

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

Сообщение alibek » 21.02.2005 (Пн) 15:11

Значит "ключ" это не имя поля, а его Caption. Смотри в конструкторе, как поле называется.
Для отбора неуникальных имен советую использовать GROUP BY (с предложением HAVING).
Lasciate ogni speranza, voi ch'entrate.

Алексей К.
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 419
Зарегистрирован: 12.05.2004 (Ср) 9:41
Откуда: Ульяновск

Сообщение Алексей К. » 21.02.2005 (Пн) 15:28

"ключ" имя поля точно. Может в аце не проходят такие дела как (создаю два обьекта)?
FROM каталоги AS A, каталоги AS B
Можно пример кода под ац для твоего варианта (group by&having)

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

Сообщение alibek » 21.02.2005 (Пн) 15:35

Код: Выделить всё
select count(*)
from каталоги as A
where ...
group by [A].[имя]
having count(*) > 1
Lasciate ogni speranza, voi ch'entrate.

Алексей К.
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 419
Зарегистрирован: 12.05.2004 (Ср) 9:41
Откуда: Ульяновск

Сообщение Алексей К. » 21.02.2005 (Пн) 15:36

Догнал сам. Короче получилось таким способом:
Код: Выделить всё
SELECT DISTINCT *
FROM каталоги AS A, каталоги AS B
WHERE A.имя=B.имя And A.ключ<>B.ключ;

А первый вариант получается неправильный.
Код: Выделить всё
SELECT каталоги.имя, каталоги.ключ
FROM каталоги AS A, каталоги AS B
WHERE A.имя=B.имя And A.ключ<>B.ключ;

Хотя имена полей правильные, в конструкторе смотрел.

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

Сообщение Andrey Fedorov » 21.02.2005 (Пн) 15:43

alibek писал(а):Значит "ключ" это не имя поля, а его Caption. Смотри в конструкторе, как поле называется.
Для отбора неуникальных имен советую использовать GROUP BY (с предложением HAVING).


Вроде в Access-e имена с буклвкой "ч" надо заключать в квадратные скобки. То есть запрос должен выглядеть примерно так:

Код: Выделить всё
SELECT имя, COUNT(*) AS КолВо
FROM каталоги
GROUP BY имя
HAVING COUNT(*)>1


А вообще, в Access-e при нажатии на конпочку "Создать" окна базы данных есть возможность создать подобный запрос - можно и им воспользоваться, на крайний случай...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

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

Сообщение Andrey Fedorov » 21.02.2005 (Пн) 15:45

Хм. в моем ответе нет слова с ключ, поэтому и квадратные скобки не понадобились ;)
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Алексей К.
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 419
Зарегистрирован: 12.05.2004 (Ср) 9:41
Откуда: Ульяновск

Сообщение Алексей К. » 22.02.2005 (Вт) 7:27

А чтобы неправильный код заработал нужно всего-то поправить:
SELECT каталоги.имя, каталоги.ключ
на
SELECT А.имя, А.ключ

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

Сообщение Andrey Fedorov » 22.02.2005 (Вт) 8:00

Алексей К. писал(а):А чтобы неправильный код заработал нужно всего-то поправить:
SELECT каталоги.имя, каталоги.ключ
на
SELECT А.имя, А.ключ


Но от этого сам запрос менее кривым не станет...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Алексей К.
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 419
Зарегистрирован: 12.05.2004 (Ср) 9:41
Откуда: Ульяновск

Сообщение Алексей К. » 22.02.2005 (Вт) 11:45

Но от этого сам запрос менее кривым не станет...

В каком смысле???


Вернуться в Visual Basic 1–6

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

Сейчас этот форум просматривают: Majestic-12 [Bot] и гости: 76

    TopList