Форум программистов, компьютерный форум, киберфорум
Microsoft Access
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.85/41: Рейтинг темы: голосов - 41, средняя оценка - 4.85
0 / 0 / 0
Регистрация: 24.08.2010
Сообщений: 44

Выбор случайной записи

24.08.2010, 13:41. Показов 8734. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как в форме отображать записи из таблицы, выбранные случайным образом, а не попорядку. Где, в каком месте прописывается код?
Помогите!!!!!!!!!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.08.2010, 13:41
Ответы с готовыми решениями:

Выборка случайной записи
Помогите с SQL запросом на удаление ненужной записи. DELETE * FROM WHERE ID NOT IN ( SELECT First(ID) FROM GROUP BY , )...

Обработка запроса: выбор случайной фамилии
Есть три таблицы "Фамилия", "Имя" и "Отчество" в которых находятся данные в 3 столбцах ("Номер",...

выборка случайной записи
Как вывести одну случайную запись из столбца name? select name from tabl1 Заранее спасибо

21
 Аватар для palva
4278 / 2970 / 693
Регистрация: 08.06.2007
Сообщений: 9,930
Записей в блоге: 5
24.08.2010, 14:23
А что такое 'случайным образом'? Разве 'попорядку' это не случайным образом? Ведь выдача по порядку тоже может случиться. С другой стороны, на компьютере ничего не бывает случайным образом. Настоящая случайность - только в квантовой механике, да в воспаленном воображении.
0
0 / 0 / 0
Регистрация: 24.08.2010
Сообщений: 44
24.08.2010, 14:40  [ТС]
случайным образом - это, например: 100,3,214,5,24, т.е. вопросы отображаются не по порядку, а в разброс
0
5 / 5 / 0
Регистрация: 19.03.2009
Сообщений: 743
24.08.2010, 15:54
Добавить к таблице поле. Заполнить его псевдослучайными числами (см.HELP по Randomize и Rnd). При выводе в форму отсортировать по этому полю.
0
 Аватар для palva
4278 / 2970 / 693
Регистрация: 08.06.2007
Сообщений: 9,930
Записей в блоге: 5
24.08.2010, 16:05
Тогда вас должен устроить датчик случайных чисел. Попробуйте перетасовать записи. Я приведу пример программы, а вы сможете приспособить ее к своему случаю. Программа на vbs, но будет работать и на VBA
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
dim a(10)
' Здесь мы поместим исходные неслучайный числа
for i = 0 to 10
  a(i)=i
next
' Теперь здесь последовательные числа от 0 до 10
dim b(10)
' А здесь будут перетасованные числа (записи)
randomize
for i = 0 to 10 ' На каждом шаге заполняем i-й элемент массива b
  do while true   ' делаем пока не выбрали
    j = int(rnd*11) ' целое случайное число от 0 до 10
    if a(j) <> -1 ' then если запись еще не выбрана
      b(i) = a(j) ' то выберем ее
      a(j) = -1   ' пометим, что она выбрана
      exit do     ' и закончим выбор
    end if
    ' если не выбрали, то повторяем до бесконечности
  loop
next
' печатаем случайный результат
for i = 0 to 10
  msgbox b(i)
next
0
 Аватар для palva
4278 / 2970 / 693
Регистрация: 08.06.2007
Сообщений: 9,930
Записей в блоге: 5
24.08.2010, 16:13
2 BorisL Элегантый способ, только приходится писать в базу данных
0
5 / 5 / 0
Регистрация: 19.03.2009
Сообщений: 743
24.08.2010, 16:42
На всякий случай уточняю. Заполнение поля нужно выполнять в Событии Открытие(Open) формы (или еще раньше ;-). Можно, конечно, использовать и служебную таблицу с двумя полями: псевдослучайное число(заполняется Вами) и первичный ключ таблицы с вопросами. В общем вариантов много. Удачи
0
 Аватар для palva
4278 / 2970 / 693
Регистрация: 08.06.2007
Сообщений: 9,930
Записей в блоге: 5
24.08.2010, 17:41
Это очень странно, но у меня работает такой каверзный запрос

SELECT id FROM prices ORDER BY rnd(id)

(Access 2000)

rnd без параметра тоже работает, но случайность результата плохая, возможно в этом случае rnd вычисляется один раз как независящий от полей записи.
0
0 / 0 / 0
Регистрация: 24.08.2010
Сообщений: 44
25.08.2010, 11:36  [ТС]
Спасибо всем, кто откликнулся на мою проблему. Обязательно попробую
0
0 / 0 / 0
Регистрация: 24.08.2010
Сообщений: 44
25.08.2010, 16:57  [ТС]
palva, я попробовала и у меня получился вывод чисел в разброс, но они отображаются в отдельном окне, а мне надо, чтоб вопросы в моей форме таким же образом отображались
0
 Аватар для palva
4278 / 2970 / 693
Регистрация: 08.06.2007
Сообщений: 9,930
Записей в блоге: 5
25.08.2010, 17:23
С отображением я швах. С базами Access работаю только из скриптов.
0
0 / 0 / 0
Регистрация: 20.06.2009
Сообщений: 56
30.08.2010, 10:14
2 palva: ИМХУ функция RND без параметра возвращает значение типа Double(т.к. инициализируется системным таймером), т.е. поле тоже должно иметь тип Double, а если у поля тип - целое, тогда нужно передавать в ф-цию диапазон в виде целого числа, иначе можно вообще получить в данном поле одно и то же число(т.е. сортировка по данному полю теряет смысл).

СК! 73!
0
 Аватар для palva
4278 / 2970 / 693
Регистрация: 08.06.2007
Сообщений: 9,930
Записей в блоге: 5
30.08.2010, 12:12
Я заглянул в документацию по Rnd, там написано, что функция возвращает Single. Если задан положительный параметр, то возвращается очередное случайное число. Если параметр не задан, то то же самое. О каком поле вы говорите я не понял. После ORDER BY у меня стоит выражение. Логичнее было бы поставить Rnd без параметров, но тогда обращение к Rnd происходит один раз, по-видимому SQL процессор считает, что раз выражение не зависит от полей записи, то оно будет одно и то же для всех записей. Поэтому мне пришлось поставить параметр. Поскольку в моем случае параметр - положительное число, то это не повлияло на характер работы Rnd, зато вычисление выражения происходит для каждой записи заново. Наверно можно было бы использовать другое подходящее поле, например если имеется pole VARCHAR, которое нигде не равно NULL, то можно было бы написать выражение так:

Rnd(Len(pole)+1)

Наверно перед работой полезно вызвать Randomize, но я не знаю, как это сделать. Randomize в начале работы скрипта никакого влияния на результат не оказывает. По видимому SQL-процессор имеет свой собственный датчик. Если бы Randomize было не процедурой, а функцией, ее можно было бы как-то вызвать внутри SQL предложения. К счастью можно вызвать Rnd с отрицательным параметром и, тем самым, рандомизировать SQLевский датчик. На его вход надо подать результаты работы датчика бейсиковского. У меня такой вариант сработал (Access 2000), то есть сначала я делаю Randomize (в бейсике), а потом формирую SQL-предложение следующим образом:
Code
1
'SELECT id, rnd(-' & Int(rnd*1000000) & ') FROM prices ORDER BY rnd(Len(name)+1)'
Лишнюю колонку, которая содержит одно и то же число, я не использую. Такой скрипт выводит записи каждый раз в разном порядке.
0
0 / 0 / 0
Регистрация: 20.06.2009
Сообщений: 56
30.08.2010, 13:29
Значит я попутал с Пасовским Рнд, сорри.
А насчет Randomize в запросе...
Как насчет того чтобы вызывать его из запроса через ф-цию?
Типа:
Visual Basic
1
2
3
4
5
6
7
8
Function MyRnd()
Static flg As Bollean
 
    If flg Then Exit Function
    Randomize
    flg=True
 
End Function
А эту функцию уже вызывать из запроса.
Статическая переменная flg служит для того чтобы 'рандомизация' происходила только один раз, только надо проверить, сброситься флаг после того как запрос отработает или нет.

СК! 73!
0
 Аватар для palva
4278 / 2970 / 693
Регистрация: 08.06.2007
Сообщений: 9,930
Записей в блоге: 5
30.08.2010, 13:55
А разве можно вызывать функцию бейсика из запроса? Ведь Rnd это функция стандартная для SQL Access, поэтому запрос работает. Даже если можно было бы обратиться к функции из запроса, рандомизировался бы бейсиковский датчик, а не SQLевский. А что мы будем делать, если запрос вызывается из языка си через ODBC? Не будет же запрос в процессе выполнения обращаться к сишной функции.
0
0 / 0 / 0
Регистрация: 20.06.2009
Сообщений: 56
31.08.2010, 10:33
В Акцессе можно вызывать Васиковские ф-ции(см. через 'Построитель выражений'). Но в вышеприведенном коде из запроса вызывается пользовательская ф-ция, а уже она вызывает Рандомизе, именно потому что оная является процедурой и напрямую вызвать ее из запроса не получиться. Как там обстоят дела у 'чистого' SQL-а и Си я ХЗ, т.к. не копенгаген, в достаточной мере, но здесь обсуждался данный вопрос применительно к эхотагу. ИМХУ.

СК! 73!
0
 Аватар для palva
4278 / 2970 / 693
Регистрация: 08.06.2007
Сообщений: 9,930
Записей в блоге: 5
31.08.2010, 10:46
У меня это не заработало. А мои общие соображения это лишь попытка объяснить (себе) почему не заработало. Если у вас это работает, напишите, как выглядит ваш скрипт.
0
0 / 0 / 0
Регистрация: 20.06.2009
Сообщений: 56
31.08.2010, 13:23
Таблица1 состоит из одного поля [CodID].
Вот SQL-строка запроса: 'SELECT Таблица1.CodID, MyRnd() AS Expr FROM Таблица1 ORDER BY Rnd([CodID]);'

Вот функция описаная в модуле:
Visual Basic
1
2
3
Public Function MyRnd()
   Randomize
End Function
Все работает. Только что проверил. Заодно выяснил, что статическая переменная лишняя и даже вредная, т.к. функция вызывается все равно всего один раз при вызове запроса и оная переменная теряет смысл.

СК! 73!
0
 Аватар для palva
4278 / 2970 / 693
Регистрация: 08.06.2007
Сообщений: 9,930
Записей в блоге: 5
31.08.2010, 14:53
Наверно у меня не работает из за того, что я запускаю это как VBScript
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
function fff()
  fff="asd"
end function
 
SET cn = CreateObject("ADODB.Connection")
SET rs = CreateObject("ADODB.Recordset")
cn.Open("DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=DB2000.MDB")
rs.Open "SELECT id, fff() FROM prices ORDER BY rnd(Len(name)+1)", cn
rs.save "ttt.xml", 1
set rs = Nothing
cn.Close
set cn = Nothing
Говорит, [Microsoft][ODBC Microsoft Acess Driver] Undefined function 'fff' in expression

то же самое сообщает Microsoft JET Database Engine

Получается, что у большого бейсика с SQL более плотный контакт.

Теперь другой скользкий вопрос, выведет ли ваш скрипт записи в разном порядке, если его запустить два раза? То есть, при выполнении Randomize который из двух датчиков рандомизируется?
0
0 / 0 / 0
Регистрация: 20.06.2009
Сообщений: 56
31.08.2010, 15:44
function fff()
^^^^^^^^
Функцию нужно явно объявить как Public, т.е. прописать
Public function fff(), без этого и у меня ругался. Попробуйте, может так заработает. А что касается различности вывода... Запустил запрос несколько раз подряд - именно так и происходит, т.е. порядок вывода разный.

СК! 73!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
31.08.2010, 15:44
Помогаю со студенческими работами здесь

Выбор случайной папки
Подскажите кто-нибудь, нужно, допустим, на диске D выбрать из списка папок случайную, чтобы позже в ней создать какие-либо файлы,...

Выбор случайной строки
Я создаю 3-4 стринга с значениями, как сделать так что бы в текстовом поле они выводились рандомно?

Выбор случайной картинки
Здравствуйте! Надо сделать так, чтобы из списка с названиями картинок, которые есть на форме, выбрались 4 случайным образом (не повторяясь)...

Выбор случайной клавиши
Добрый день. Пишу игру на С++ с помощью SFML. Хочу сделать так, чтобы программа выдавала пользователю случайную кнопку из определённых...

ListView: добавление записи, выбор записи, удаление записи
на форме есть три текст бокса: textbox1(имя), textbox2(фамилия), textbox3(отчество), textbox4(выбранное) кнопка Button1(добавить),...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru