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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.05.2011, 11:36   #1
neonex
Пользователь
 
Регистрация: 06.05.2011
Сообщений: 15
По умолчанию БД(Аccess)+SQL+DELPHI

Здравствуйте уважаемые гуру. Имеется проблемка в которой требуется совет. Есть программа работающая с БД(Аccess), в БД вносятся данные, такие как номер ячейки, время начала использования (hh:mm), время окончания использования, состояние ячейки(занята/пустая/блокирована). Блокировка идет после окончания времени. Всё завязано на ADO. Теперь суть проблемы: как лучше реализовать проверку истечения времени и последующую блокировку ячейки.

В принципе логически догадываюсь что надо использовать таймер+( GetLocalTime или TimeToStr(Now) ). Но чегото все до кучи собрать немогу. Заранее спасибо за советы и помощь.
neonex вне форума Ответить с цитированием
Старый 19.05.2011, 13:02   #2
neonex
Пользователь
 
Регистрация: 06.05.2011
Сообщений: 15
По умолчанию

Всё также нуждаюсь в помощи или совете.
neonex вне форума Ответить с цитированием
Старый 19.05.2011, 13:49   #3
Азамат Казанчев
Форумчанин
 
Регистрация: 25.04.2011
Сообщений: 110
По умолчанию

можно поставит таймер и в обработчике события описать проверку оставшегося времени, т.е. пусть таймер скажем с интервалом в 1 сек каждый раз считывает значение ячейки с оставшимся временм и проверяет равно ли он нулю(или чему тебе надо), реализовать данный алгоритм не так сложно, так что удачи
Азамат Казанчев вне форума Ответить с цитированием
Старый 19.05.2011, 16:18   #4
neonex
Пользователь
 
Регистрация: 06.05.2011
Сообщений: 15
По умолчанию

Спасибо за совет. Но если в таблице больше 1й строки?.. в общем чтобы не дай бог не подумали что я жду только готового решения: влаживаю свой проект. Основная проблема состоит по истечению времени в базе где стоит поле "занят" поставить "блокирован". Посмотрите пожалуйста, а то я чтото совсем умираю изза этой мелочи..
Вложения
Тип файла: rar data+block.rar (323.5 Кб, 14 просмотров)

Последний раз редактировалось neonex; 19.05.2011 в 16:27.
neonex вне форума Ответить с цитированием
Старый 20.05.2011, 13:55   #5
neonex
Пользователь
 
Регистрация: 06.05.2011
Сообщений: 15
По умолчанию

Проблема решена, спасибо Gulik. Решение тут Раздел БД в Delphi
neonex вне форума Ответить с цитированием
Старый 20.05.2011, 14:04   #6
Азамат Казанчев
Форумчанин
 
Регистрация: 25.04.2011
Сообщений: 110
По умолчанию

вопрос, у тебя все строки в конце будут заблокированы?
если так можно поставаить фильтрацию на поле время окончания по возрастанию, также у ado есть функции adoquery1.first(переход к первой строке), adoquery1.last(переход к последней строке), adoquery1.next(переход на след строку) - используя их можно в цикле выполнять проверку времени(по алгоритму который я выше описал)

P.S - функции на делфи
Азамат Казанчев вне форума Ответить с цитированием
Старый 20.05.2011, 14:39   #7
neonex
Пользователь
 
Регистрация: 06.05.2011
Сообщений: 15
По умолчанию

2 Азамат Казанчев решение было в этом
Код:
   if not ADOQuery4.IsEmpty then begin // <- если таблица не пустая тогда
      while not ADOQuery4.Eof do begin    // цикл до конка таблицы
            ADOQuery4.Edit ;    // режим редактирования
            ADOQuery4.FieldByName('time_b').AsString := '' ;  // Очищаем время
            ADOQuery4.FieldByName('time_e').AsString := '' ;  // Очищаем время
            ADOQuery4.FieldByName('in_use').AsString := 'Блокирован' ;   // устанавливаем значение БЛОКИРОВАН
            ADOQuery4.Next ;  // Переход к следующей записи
      end ;
neonex вне форума Ответить с цитированием
Старый 20.05.2011, 14:51   #8
Азамат Казанчев
Форумчанин
 
Регистрация: 25.04.2011
Сообщений: 110
По умолчанию

Цитата:
Цитата:
Блокировка идет после окончания времени.
и где это проверяется в этом цикле?
хотя если у тебя все получается, то хорошо
Азамат Казанчев вне форума Ответить с цитированием
Старый 20.05.2011, 16:06   #9
neonex
Пользователь
 
Регистрация: 06.05.2011
Сообщений: 15
По умолчанию

2 Азамат Казанчев это всего лишь часть кода для таймера. Вся программа работает как надо, полный код от Gulik:

Код:
type
  TForm1 = class(TForm)
    DBGrid1: TDBGrid;
    DataSource1: TDataSource;
    ADOConnection1: TADOConnection;
    ADOQuery1: TADOQuery;
    Panel1: TPanel;
    Button2: TButton;
    Button3: TButton;
    DBGrid2: TDBGrid;
    DBGrid3: TDBGrid;
    Timer1: TTimer;
    DataSource2: TDataSource;
    ADOQuery2: TADOQuery;
    DataSource3: TDataSource;
    ADOQuery3: TADOQuery;
    ADOQuery4: TADOQuery;
    Button1: TButton;
    DateTimePicker1: TDateTimePicker;
    Label2: TLabel;
    Label3: TLabel;
    Panel2: TPanel;
    Label1: TLabel;
    procedure Timer1Timer(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);
begin
   Label1.Caption := TimeToStr(Now) ;  // Присваиваем Label1 значение текущего времени
   //////////////////////////////
   ADOQuery4.Close ;   // Закрыввем таблицу
   ADOQuery4.SQL.Clear ; // Очищаем SQL запрос
   ADOQuery4.SQL.Add('SELECT * FROM razd WHERE (in_use="Занят") AND (time_e = ''' + TimeToStr(Now) + ''')') ; 
   // ^   
   // Блокировка идет после окончания времени. Запрашиваются занятые ящики  и где время окончания "прям щас"
   ADOQuery4.Open ;    // Открываем таблицу
   if not ADOQuery4.IsEmpty then begin // <- если таблица не пустая тогда
      while not ADOQuery4.Eof do begin    // цикл до конка таблицы
            ADOQuery4.Edit ;    // режим редактирования
            ADOQuery4.FieldByName('time_b').AsString := '' ;  // Очищаем время
            ADOQuery4.FieldByName('time_e').AsString := '' ;  // Очищаем время
            ADOQuery4.FieldByName('in_use').AsString := 'Блокирован' ;   // устанавливаем значение БЛОКИРОВАН
            ADOQuery4.Next ;  // Переход к следующей записи
      end ;
      ADOQuery1.Close ;        //
      ADOQuery2.Close ;       //
      ADOQuery3.Close ;      //   Обновляем данные
      ADOQuery1.Open ;      //\     в таблицах
      ADOQuery2.Open ;     // \\
      ADOQuery3.Open ;    //   \\
   end ;
   //////////////////////////////
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
   ADOQuery1.Edit;        // режим редактирования
   ADOQuery1.FieldByName('time_b').AsString := TimeToStr(Now) ;    // выставляем текущее время
   ADOQuery1.FieldByName('time_e').AsString := TimeToStr(Now + DateTimePicker1.Time) ;   // выставляем текущее время + время установленное в DateTimePicker1
   ADOQuery1.FieldByName('in_use').AsString := 'Занят' ;  // устанавливаем значение ЗАНЯТ
   ADOQuery1.Post ;        // Сохраняем данные
   ADOQuery1.Close ;        //
   ADOQuery2.Close ;       //
   ADOQuery3.Close ;      //   Обновляем данные
   ADOQuery1.Open ;      //\     в таблицах
   ADOQuery2.Open ;     // \\
   ADOQuery3.Open ;    //   \\
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
   if ADOQuery2.IsEmpty then begin  // <- если таблица пустая тогда
      Application.MessageBox('Пустое поле!', 'Предупреждение', MB_ICONWARNING) ; // ShowMessage('пустое поле!');  // выводим сообщение
   end
   else begin  // иначе
      ADOQuery2.Edit ;    // режим редактирования
      ADOQuery2.FieldByName('time_b').AsString := '' ;  // Очищаем время
      ADOQuery2.FieldByName('time_e').AsString := '' ;  // Очищаем время
      ADOQuery2.FieldByName('in_use').AsString := 'Свободен' ;   // устанавливаем значение СВОБОДЕН
      ADOQuery2.Post ;     // Сохраняем данные
      ADOQuery1.Close ;        //
      ADOQuery2.Close ;       //
      ADOQuery3.Close ;      //   Обновляем данные
      ADOQuery1.Open ;      //\     в таблицах
      ADOQuery2.Open ;     // \\
      ADOQuery3.Open ;    //   \\
   end ;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   if ADOQuery3.IsEmpty then begin  // <- если таблица пустая тогда
      Application.MessageBox('Пустое поле!', 'Предупреждение', MB_ICONWARNING) ; // ShowMessage('пустое поле!');  // выводим сообщение
   end
   else begin  // иначе
      ADOQuery3.Edit ;    // режим редактирования
      ADOQuery3.FieldByName('time_b').AsString := '' ;  // Очищаем время
      ADOQuery3.FieldByName('time_e').AsString := '' ;  // Очищаем время
      ADOQuery3.FieldByName('in_use').AsString := 'Свободен' ;   // устанавливаем значение СВОБОДЕН
      ADOQuery3.Post ;     // Сохраняем данные
      ADOQuery1.Close ;        //
      ADOQuery2.Close ;       //
      ADOQuery3.Close ;      //   Обновляем данные
      ADOQuery1.Open ;      //\     в таблицах
      ADOQuery2.Open ;     // \\
      ADOQuery3.Open ;    //   \\
   end ;
end;

end.

Последний раз редактировалось neonex; 20.05.2011 в 16:10.
neonex вне форума Ответить с цитированием
Старый 20.05.2011, 16:13   #10
Азамат Казанчев
Форумчанин
 
Регистрация: 25.04.2011
Сообщений: 110
По умолчанию

все понятно, вопросов нет
Азамат Казанчев вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание таблиц для Аccess Galina200875 Microsoft Office Access 4 11.04.2011 22:11
Создание новых таблиц в MS SQL SERVERE через SQL запрос в Delphi S_Yevgeniy Помощь студентам 1 27.10.2009 06:26
Перехід даних із Аccess в Exel Рома1715 Microsoft Office Excel 3 07.10.2009 23:42
MS SQL + Delphi Mihey32 БД в Delphi 10 17.10.2007 17:45