Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.05.2018, 13:57   #1
Kvesti
Новичок
Джуниор
 
Регистрация: 21.05.2018
Сообщений: 1
По умолчанию Поиск в цыкле

Я уже 2 недели пытаюсь сделать поиск. У меня есть 3 таблицы две главные одна дочерняя. Первая называется "Книги", вторая "Читатели". И третья дочернея таблица Книги на руках. Так вот смысл в том что я придумал кнопку статус при нажатие на неё ведётся поиск в цыкле по таблице "книги на руках" у всех читателей. Поиск ведётся по определёному номеру книги. Этот номер индивидуальный, не повторяющийся. Результат таков если он нашёл книгу он мне выдаёт форму на которой написано книга сейчас занята. Или если не нашёл то выдаёт сообщение что книга свободна. (Код ниже ). Но по сути он проверяет только первую запись. Находит или нет но выдаёт правильный результат. А вот дальше, например вторая запись. Поиск вообще не проходит. Цыкл втупую его игнорит. И идёт дальше. Хотя вторая книга записана. Вообщем перепробовал я while do, repeat. Сейчас остановился на цыкле for to do. Помогите пожалуйста. Я не крутой программист. Объясните пожалуйста доходчиво. Почему не работает. Если что я работаю на Red studio 2010.

Код.
Код:
var
a,b,c,d:integer;
begin
d:=bd.chitateli.RecordCount;
a:=bd.Knigi.FieldByName('nomer_knigi').AsInteger;
bd.chitateli.First;
bd.Knigi_Na_Pykax.First;
for c:= 1 to d do
begin
if bd.Knigi_Na_Pykax.RecordCount>0 then
begin
if bd.Knigi_Na_Pykax.Locate('nomer_knigi',a,[loPartialKey])=true then
begin
b:=a;
if b=a then
break;
end;
end;
if  bd.Knigi_Na_Pykax.RecordCount=0  then
chitateli.Next;
end;

if a=b then 
begin
status.Label1.Caption:='Книга сечас находится у читателя' ;
status.bitbtn2.Enabled:=false;
status.button1.Enabled:=true;
status.label2.enabled:=true;
end
else
if a<>b then//bd.Knigi.FieldByName('status').AsBoolean=true
begin
status.Label1.Caption:='Книга сечас свободна';
status.bitbtn2.Enabled:=true;

status.button1.Enabled:=false;
status.label2.enabled:=false;
end;
status.show;

end;
_____
Код программы нужно выделять (форматировать) тегами [CODE] (читать FAQ)
Модератор

Последний раз редактировалось Serge_Bliznykov; 21.05.2018 в 15:25.
Kvesti вне форума Ответить с цитированием
Старый 21.05.2018, 15:34   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

во-первых, научитесь форматировать код.
хотя бы так:
Код:
var
  a, b, c, d: integer;
begin
  d := bd.chitateli.RecordCount;
  a := bd.Knigi.FieldByName('nomer_knigi').AsInteger;
  bd.chitateli.First;
  bd.Knigi_Na_Pykax.First;
  for c := 1 to d do
  begin
    if bd.Knigi_Na_Pykax.RecordCount > 0 then
    begin
      if bd.Knigi_Na_Pykax.Locate('nomer_knigi', a, [loPartialKey]) = true then
      begin
        b := a;
        if b = a then
          break;
      end;
    end;
    if bd.Knigi_Na_Pykax.RecordCount = 0 then
      chitateli.Next;
  end;

  if a = b then
  begin
    status.Label1.Caption := 'Книга сечас находится у читателя';
    status.bitbtn2.Enabled := false;
    status.button1.Enabled := true;
    status.label2.enabled := true;
  end
  else
    if a <> b then //bd.Knigi.FieldByName('status').AsBoolean=true
    begin
      status.Label1.Caption := 'Книга сечас свободна';
      status.bitbtn2.Enabled := true;

      status.button1.Enabled := false;
      status.label2.enabled := false;
    end;
  status.show;

end;
во-вторых,
Цитата:
Сообщение от Kvesti Посмотреть сообщение
Так вот смысл в том что я придумал кнопку статус при нажатие на неё ведётся поиск в цыкле по таблице "книги на руках" у всех читателей.
Ужасно Вы придумали. Никаких циклов не нужно, достаточно сделать ОДИН запрос и получить результат.

в-третьих, допустим, Вы хотите написать плохой код с циклом.
но так Вы же определитесь, по какой таблице Вы делаете цикл и что меняется в цикле.
Цитата:
Сообщение от Kvesti Посмотреть сообщение
Цыкл втупую его игнорит. И идёт дальше. Хотя вторая книга записана. Вообщем перепробовал я while do, repeat. Сейчас остановился на цыкле for to do.
Вот, допустим, делаете цикл

Код:
bd.chitateli.First;
цикл от 1 записи до bd.chitateli.RecordCount do
   поиск в таблице bd.Knigi_Na_Pykax по номеру книги в a
   chitateli.Next;
конец цикла
ну и зачем Вы перебираете читателей в цикле, если сами читатели в данном цикле вообще никак не задействованы?!!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 21.05.2018, 15:35   #3
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

1. все что нужно сделать чтобы проверить ОДНУ книгу
Код:
var
  a,b,c,d:integer;
  x: boolean;
begin
  a:=bd.Knigi.FieldByName('nomer_knigi').AsInteger; // какую книгу будем проверять
//  bd.chitateli.First;
  bd.Knigi_Na_Pykax.First;
  x:=bd.Knigi_Na_Pykax.Locate('nomer_knigi',a,[loPartialKey]);//проверим и запомним факта выдачи

// отображение ЗАПОМНЕННОГО (x:=...) статуса книги
  status.Label1.Caption:=IIF(x, 'Книга сечас находится у читателя', 'Книга сечас свободна');
  status.bitbtn2.Enabled:=not( x);
  status.button1.Enabled:=(x);
  status.label2.enabled:=(x);

  status.show;

end;
вы НЕ перебираете книги
2. демо перебора книг в цикле while (рекомендованный для БД)
Код:
while not bd.Knigi.EOF do begin
  s:=bd.Knigi.FieldByName('nomer_knigi').AsString;
  ShowMessage(s);//просто покажем номер книги
  bd.Knigi.Next;
end;
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 21.05.2018, 16:59   #4
mihаli4
никакой
Пользователь
 
Аватар для mihаli4
 
Регистрация: 21.05.2018
Сообщений: 35
По умолчанию

Человек, не знающий и не уважающий собственный родной язык, пишущий безграмотно на родном языке, никогда не станет хорошим программистом...
mihаli4 вне форума Ответить с цитированием
Старый 21.05.2018, 17:10   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от mihаli4 Посмотреть сообщение
Человек, не знающий и не уважающий собственный родной язык, пишущий безграмотно на родном языке, никогда не станет хорошим программистом...
во-первых, это утверждение спорно.
а во-вторых, откуда Вы знаете, насколько автор темы знает свой родной язык?
Он не из РФ пишет, есть большая вероятность, что для него русский - не родной.
в третьих, давайте не будем флудить.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
пауза в цыкле Pein95 Общие вопросы Delphi 23 12.06.2011 00:11
замена слов в цыкле sergeiqwe PHP 3 08.06.2010 00:18
повторяет значение в цыкле while sergeiqwe PHP 2 07.05.2010 15:11
caption в цыкле nikleb Общие вопросы Delphi 3 18.04.2008 15:23