Показать сообщение отдельно
  #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.
З.Ы. Дам любую дополнительную инфу, простите, если не учел все сразу.
Ответить с цитированием