Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Случайный выбор записи из БД, Delphi 7 
:(
    Опции темы
Ganoci
Дата 27.2.2010, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 78
Регистрация: 8.2.2008

Репутация: нет
Всего: нет



Есть небольшая БД на Delphi 7 (точнее Delphi + Microsoft Office Access {без комментариев})

В общем базу вроде бы соединил с Дельфёй.
Но мне нужно что бы теперь при нажатии на кнопку случайным образом из БД выбиралась запись и высвечивалась, скажем где-нибудь рядом с кнопкой.

Можно ли это сделать?  smile 
Помогите пожалуйста!  smile 

Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  Delphi.rar 19,51 Kb
PM MAIL   Вверх
Frees
Дата 27.2.2010, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 23
Всего: 54



Код

Table1.Active := true;
Table1.RecNo := Random(Table1.RecordCount);
Label1.Caption := Table1.FieldByName('поле1').AsString;


Это сообщение отредактировал(а) Frees - 27.2.2010, 22:02


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
Ganoci
Дата 28.2.2010, 09:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 78
Регистрация: 8.2.2008

Репутация: нет
Всего: нет



Может быть у меня что-то в коде не так?
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, DB, DBTables, StdCtrls, Grids, DBGrids, ExtCtrls, DBCtrls,
  OleServer, ExcelXP, Buttons, ADODB, ComCtrls, XPMan, Registry, ShellAPI,
  MMSystem, IniFiles, DBGridEh, EhLibADO, DBGridEhImpExp, PrnDbgeh;

type
  TForm1 = class(TForm)
    ADOConnection1: TADOConnection;
    DataSource1: TDataSource;
    ADOTable1: TADOTable;
    DBGridEh1: TDBGridEh;
    BitBtn1: TBitBtn;
    XPManifest1: TXPManifest;
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    DBText1: TDBText;
    procedure N1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure N2Click(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses spravka;

{$R *.dfm}

procedure TForm1.N1Click(Sender: TObject);
begin
Close ();
end;

procedure TForm1.FormCreate(Sender: TObject);
var
i: Integer;
begin
DataSource1.DataSet := ADOTable1;
ADOTable1.Active := True;
for i:=0 to DBGridEh1.Columns.Count-1 do begin
DBGridEh1.Columns[i].Title.TitleButton := TRUE;
end;
DBGridEh1.OptionsEh := DBGridEh1.OptionsEh + [dghAutoSortMarking];
DBGridEh1.OptionsEh := DBGridEh1.OptionsEh + [dghMultiSortMarking];
end;


procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
if(MessageBox(0,'Вы действительно хотите выйти?','Подтверждение',mb_YesNo)=idYes) then
        begin
        CanClose:=True;
         Form2.Close;
       end
        else
        begin
          CanClose:=False;
        end
end;

procedure TForm1.N2Click(Sender: TObject);
begin
Form2.show;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
ADOTable1.Active := true;
ADOTable1.RecNo := Random(ADOTable1.RecordCount);
DBText1.Caption := ADOTable1.FieldByName('поле1').AsString;
end;

end.


Но компиляция-то происходит, вот только при нажатии на кнопку вылетает вот такая ошибка

Присоединённый файл ( Кол-во скачиваний: 13 )
Присоединённый файл  0.jpg 95,98 Kb
PM MAIL   Вверх
Данкинг
Дата 28.2.2010, 11:13 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 35
Всего: 130



Во-первых, инициировать генератор случайных чисел следует оператором randomize (я обычно ставлю его на FormCreate). Во-вторых, если я не ошибаюсь, random может возвращать и 0. А такой строки в таблице быть, разумеется, не может.


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Ganoci
Дата 28.2.2010, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 78
Регистрация: 8.2.2008

Репутация: нет
Всего: нет



Цитата(Данкинг @ 28.2.2010,  11:13)
Во-первых, инициировать генератор случайных чисел следует оператором randomize (я обычно ставлю его на FormCreate). Во-вторых, если я не ошибаюсь, random может возвращать и 0. А такой строки в таблице быть, разумеется, не может.

Честно говоря, я не совсем понял, что делать?  :(

Во-первых, как все же правильно записать процедуру?
Во-вторых, где?
В-третьих, если я всю генерацию запишу в FormCreate, то что же мне прописывать в процедуре кнопки (BitBtn1Click)?

И еще в "поле1", если оно нужно, что можно написать?

Подскажите, пожалуйста.... )))


Это сообщение отредактировал(а) Ganoci - 28.2.2010, 11:32
PM MAIL   Вверх
Данкинг
Дата 28.2.2010, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 35
Всего: 130



Цитата(Ganoci @  28.2.2010,  11:31 Найти цитируемый пост)
Во-первых, как все же правильно записать процедуру?

"Включаем" генератор случайных чисел при загрузке программы:
Код

procedure TForm1.FormCreate(Sender: TObject);
begin
 randomize;
end;


Цитата(Ganoci @  28.2.2010,  11:31 Найти цитируемый пост)
И еще в "поле1", если оно нужно, что можно написать?

Какое поле?


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Ganoci
Дата 28.2.2010, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 78
Регистрация: 8.2.2008

Репутация: нет
Всего: нет



Цитата(Данкинг @ 28.2.2010,  11:48)
Цитата(Ganoci @  28.2.2010,  11:31 Найти цитируемый пост)
Во-первых, как все же правильно записать процедуру?

"Включаем" генератор случайных чисел при загрузке программы:
Код

procedure TForm1.FormCreate(Sender: TObject);
begin
 randomize;
end;


Цитата(Ganoci @  28.2.2010,  11:31 Найти цитируемый пост)
И еще в "поле1", если оно нужно, что можно написать?

Какое поле?

Ну что-то не так работает. И не пойму что.

Вот последний вариант программы.

Подсобите пожалуйста.  smile 

Цель-то у меня простая.
Есть 2 поля id - счетчик и Film - текст.
Мне нужно чтобы, после того как я запущу программу и до посинения буду нажимать единственную кнопку у меня в поле DBText1 случайным образом отображались значения поля film (ну или хотя бы id).
А сейчас у мну после 2-х нажатий ошибка вылетает. пробовал прописывать оба поля.

Это сообщение отредактировал(а) Ganoci - 28.2.2010, 12:09

Присоединённый файл ( Кол-во скачиваний: 8 )
Присоединённый файл  Delphi.rar 19,92 Kb
PM MAIL   Вверх
Данкинг
Дата 28.2.2010, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 35
Всего: 130



[Fatal Error] Unit1.pas(9): File not found: 'DBGridEhImpExp.dcu'
 smile

Добавлено через 7 минут и 15 секунд
Убрал - заработало. В общем, я вот так сделал:
Код

procedure TForm1.BitBtn1Click(Sender: TObject);
var r:integer;
begin
r:=Random(ADOTable1.RecordCount+1);
if r=0 then r:=1;
if r>ADOTable1.RecordCount+1 then r:=ADOTable1.RecordCount;
ADOTable1.RecNo := r;
DBText1.Caption := ADOTable1.FieldByName('id').AsString;
end;



--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Ganoci
Дата 28.2.2010, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 78
Регистрация: 8.2.2008

Репутация: нет
Всего: нет



Цитата(Данкинг @ 28.2.2010,  12:49)
[Fatal Error] Unit1.pas(9): File not found: 'DBGridEhImpExp.dcu'
 smile

А, ну да я же еще библиотеку EhLib подключил, чтоб несколько фич добавить.
Но в примере старался заменить все копоменты на стандартные (ведь это непринципиально в этом моменте), а  еще в одном месте забыл:

можно оставить вот так:

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, DB, DBTables, StdCtrls, Grids, DBGrids, ExtCtrls, DBCtrls,
  OleServer, ExcelXP, Buttons, ADODB, ComCtrls, XPMan, Registry, ShellAPI,
  MMSystem, IniFiles, PrnDbgeh;


Но вообще, если чес, я вроде бы решил вопрос (файл).

Правда, может ошибаюсь, но пока работает как надо.

поэтому говорю всем спасибо за помощь.  smile 
А если вдруг где заметили ошибку, то не стесняйтесь - сообщайте.  smile

Добавлено @ 13:02
Цитата(Данкинг @ 28.2.2010,  12:49)
[Fatal Error] Unit1.pas(9): File not found: 'DBGridEhImpExp.dcu'
 smile

Добавлено @ 12:56
Убрал - заработало. В общем, я вот так сделал:
Код

procedure TForm1.BitBtn1Click(Sender: TObject);
var r:integer;
begin
r:=Random(ADOTable1.RecordCount+1);
if r=0 then r:=1;
if r>ADOTable1.RecordCount+1 then r:=ADOTable1.RecordCount;
ADOTable1.RecNo := r;
DBText1.Caption := ADOTable1.FieldByName('id').AsString;
end;

Глянем и этот вариант реализации. smile
Спасибо!

Это сообщение отредактировал(а) Ganoci - 28.2.2010, 13:03

Присоединённый файл ( Кол-во скачиваний: 11 )
Присоединённый файл  Delphi.rar 20,62 Kb
PM MAIL   Вверх
Данкинг
Дата 28.2.2010, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 35
Всего: 130



Цитата(Ganoci @  28.2.2010,  13:01 Найти цитируемый пост)
Глянем и этот вариант реализации.

У меня этот вариант работает нормально, и все 4 строки таблицы рандомно выбираются. smile 


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
RibSlicer
Дата 18.6.2013, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 18.6.2013

Репутация: нет
Всего: нет



Схожа проблема, делаю так вроде рандомно выводит, но повторяет бывает записи. Как сделать без повтора?
Код

var r:integer;
begin
r:=Random(ADOTable1.RecordCount+1);
if r=0 then r:=1;
if r>ADOTable1.RecordCount+1 then r:=ADOTable1.RecordCount;
ADOTable1.RecNo := r;
Edit1.Text := ADOTable1.FieldByName('Вопрос').AsString;
end;

PM MAIL   Вверх
Vas
Дата 19.6.2013, 06:54 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 830
Регистрация: 29.6.2005
Где: Stavropol region

Репутация: 23
Всего: 28



А может проще запросом, вот гугль подсказал
Код

SELECT TOP 5 * FROM [tableName] ORDER BY rnd(INT(NOW*id)-NOW*id)


Добавлено через 36 секунд
И вот еще
Код

SELECT top 1 questionID from questions ORDER BY rnd(questionID)



--------------------
И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0589 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.