Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 02.06.2014, 08:36
MicZoR MicZoR вне форума
Прохожий
 
Регистрация: 02.06.2014
Сообщения: 2
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Повторная запись в БД MS SQL

Доброго времени суток! Ребят, если не сложно, подскажите пожалуйста... По срабатыванию датчика в БД должно писаться время, все бы ничего, но 1-я проблема - почему-то записи иногда дублируются (в первой таблице). А вторая - не всегда срабатывает условие i=1, причем только в процедуре DSR, CTS отрабатывается на ура.
Код:
procedure TForm1.FormCreate(Sender: TObject);
begin
ComPort1.Open;
i:=0;
q:=0;
Sleep(15000);
ADOConnection1.Connected:=true;
end;

procedure TForm1.ComPort1DSRChange(Sender: TObject; OnOff: Boolean);
begin
if OnOff=true then
begin
  Edit1.Text:='on';
  Timer1.Enabled:=false;
  if i=1 then
    begin
        try
          ADOQuery1.Close;
          ADOQuery1.Open;
          ADOQuery1.Edit;
          ADOQuery1.FieldByName('Stop').AsDateTime:=now();
          ADOQuery1.Post;
        except
          ADOConnection1.Close;
        end;
          try
            ADOQuery3.Close;
            ADOQuery3.Open;
            ADOQuery3.Insert;
            ADOQuery3.FieldByName('Time').AsDateTime:=now();
            ADOQuery3.FieldByName('Shop').AsInteger:=1;
            ADOQuery3.FieldByName('Unit').AsInteger:=1;
            ADOQuery3.FieldByName('Shift').AsInteger:=1;
            ADOQuery3.FieldByName('Brigade').AsInteger:=1;
            ADOQuery3.Post;
          except
            ADOConnection1.Close;
          end;
     end;
    if i=0 then
    begin
          try
            ADOQuery3.Close;
            ADOQuery3.Open;
            ADOQuery3.Insert;
            ADOQuery3.FieldByName('Time').AsDateTime:=now();
            ADOQuery3.FieldByName('Shop').AsInteger:=1;
            ADOQuery3.FieldByName('Unit').AsInteger:=1;
            ADOQuery3.FieldByName('Shift').AsInteger:=1;
            ADOQuery3.FieldByName('Brigade').AsInteger:=1;
            ADOQuery3.Post;
          except
            ADOConnection1.Close;
          end;
    end;
end
else
  begin
    Edit1.Text:='off';
    Timer1.Enabled:=true;
    i:=0;
  end;
end;



procedure TForm1.Timer1Timer(Sender: TObject);
begin
try
  ADOQuery2.Close;
  ADOQuery2.Open;
  ADOQuery2.Insert;
  ADOQuery2.FieldByName('Start').AsDateTime:=now()-5/24/60;  //5min-
  ADOQuery2.FieldByName('Shop').AsInteger:=1;
  ADOQuery2.FieldByName('Unit').AsInteger:=1;
  ADOQuery2.Post;            //интервал таймера, длительность, означающая начало простоя.
except
  ADOConnection1.Close;
end;
i:=1;
Timer1.Enabled:=false;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
ComPort1.Close;
ADOConnection1.Close;
end;

procedure TForm1.ComPort1CTSChange(Sender: TObject; OnOff: Boolean);
begin
if OnOff=true then
begin
  Edit2.Text:='on';
  Timer2.Enabled:=false;
  if q=1 then
    begin
        try
          ADOQuery4.Close;
          ADOQuery4.Open;
          ADOQuery4.Edit;
          ADOQuery4.FieldByName('Stop').AsDateTime:=now();
          ADOQuery4.Post;
        except
          ADOConnection1.Close;
        end;
        ADOQuery3.SQL.Add('SELECT * from Ready');
          try
            ADOQuery3.Close;
            ADOQuery3.Open;
            ADOQuery3.Insert;
            ADOQuery3.FieldByName('Time').AsDateTime:=now();
            ADOQuery3.FieldByName('Shop').AsInteger:=1;
            ADOQuery3.FieldByName('Unit').AsInteger:=2;
            ADOQuery3.FieldByName('Shift').AsInteger:=1;
            ADOQuery3.FieldByName('Brigade').AsInteger:=1;
            ADOQuery3.Post;
          except
            ADOConnection1.Close;
          end;
     end;
    if q=0 then
    begin
          try
            ADOQuery3.Close;
            ADOQuery3.Open;
            ADOQuery3.Insert;
            ADOQuery3.FieldByName('Time').AsDateTime:=now();
            ADOQuery3.FieldByName('Shop').AsInteger:=1;
            ADOQuery3.FieldByName('Unit').AsInteger:=2;
            ADOQuery3.FieldByName('Shift').AsInteger:=1;
            ADOQuery3.FieldByName('Brigade').AsInteger:=1;
            ADOQuery3.Post;
          except
            ADOConnection1.Close;
          end;
    end;
end
else
  begin
    Edit2.Text:='off';
    Timer2.Enabled:=true;
    q:=0;
  end;
end;

procedure TForm1.Timer2Timer(Sender: TObject);
begin
try
  ADOQuery2.Close;
  ADOQuery2.Open;
  ADOQuery2.Insert;
  ADOQuery2.FieldByName('Start').AsDateTime:=now()-5/24/60;  //5 min-интервал
  ADOQuery2.FieldByName('Shop').AsInteger:=1;
  ADOQuery2.FieldByName('Unit').AsInteger:=2;
  ADOQuery2.Post;                      // таймера, длительность, означающая начало простоя.
except
  ADOConnection1.Close;
end;
q:=1;
Timer2.Enabled:=false;
end;

procedure TForm1.Timer3Timer(Sender: TObject);
begin
if TimeToStr(now) = '19:00:00' then
begin
  if i=0 then
    begin
      try
        ADOQuery1.Close;
        ADOQuery1.Open;
        ADOQuery1.Edit;
        ADOQuery1.FieldByName('Stop').AsDateTime:=now();
        ADOQuery1.Post;
      except
        ADOConnection1.Close;
      end;
    Timer1.Enabled:=true;
    end;
    if q=0 then
    begin
      try
        ADOQuery4.Close;
        ADOQuery4.Open;
        ADOQuery4.Edit;
        ADOQuery4.FieldByName('Stop').AsDateTime:=now();
        ADOQuery4.Post;
      except
        ADOConnection1.Close;
      end;
    Timer1.Enabled:=true;
    end;

end;
end;
end.
З.Ы. Дам любую дополнительную инфу, простите, если не учел все сразу.
Ответить с цитированием
  #2  
Старый 02.06.2014, 09:25
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от MicZoR
По срабатыванию датчика в БД должно писаться время, все бы ничего, но 1-я проблема - почему-то записи иногда дублируются (в первой таблице).
В какой первой таблице? В ADOQuery1? Что-то я не вижу чтобы в приведённом исходнике в эту таблицу добавлялись хоть какие-то записи.
Цитата:
Сообщение от MicZoR
А вторая - не всегда срабатывает условие i=1, причем только в процедуре DSR, CTS отрабатывается на ура.
Условие i=1 может не срабатывать только в том случае если переменная i не будет равна единице.
Ответить с цитированием
  #3  
Старый 02.06.2014, 18:34
MicZoR MicZoR вне форума
Прохожий
 
Регистрация: 02.06.2014
Сообщения: 2
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Нет, прошу прощения, что не разъяснил. Запись в первую таблицу (готовые изделия) - это все, что связано с
Код:
ADOQuery3.FieldByName('Time').AsDateTime:=now();
ADOQuery3.FieldByName('Shop').AsInteger:=1;
ADOQuery3.FieldByName('Unit').AsInteger:=1;
ADOQuery3.FieldByName('Shift').AsInteger:=1;
ADOQuery3.FieldByName('Brigade').AsInteger:=1;
и т.д.
Все, что связано с
Код:
ADOQuery1.Close;
ADOQuery1.Open;
ADOQuery1.Edit;
ADOQuery1.FieldByName('Stop').AsDateTime:=now();
ADOQuery1.Post;
- это вторая таблица (простОи)
Ответить с цитированием
  #4  
Старый 04.06.2014, 08:18
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Давайте ка структуру таблиц в студию. И какой запрос к какой из них обращается.
Есть у меня стойкое подозрение, что для таблиц просто не созданы главные ключи.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 01:20.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter