Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ADOQuery и if then else 
V
    Опции темы
rus777
Дата 13.11.2012, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Добрый день,форумчане!У многих здесь опыт в разы больше моего. Прошу совета. Поделитесь пожалуйста знаниями.

Код

if ... then begin
 ADOQuery1.Close;
 ADOQuery1.SQL.Clear;
 ADOQuery1.SQL.Add('select * from "client.dbf"');
 ADOQuery1.SQL.Add('where sot_client='''+Result+'''');
 ADOQuery1.SQL.Add('and sost="1"');
 ADOQuery1.Open;
 ct:=adoquery1.FieldByName('cltime').AsVariant;

 cts := StrToDateTime(''+ct+''); //время из таблицы .....если запрос не вернет ни одной строки,то и времени соотвественно НЕТ
 dt:=StrToDateTime(DateTimeToStr(Now)); //текущее время
 btw:=MinutesBetween(cts, dt);//разница времени в минутах

 if (ADOQuery1.RecordCount>0) and
 (ComboBox2.Text>(IntToStr(btw))) then //если условие верно
 begin
   Memo1.Lines.Add(adoquery1.FieldByName('sot_client').AsString); //результат выводим в memo
   Memo1.Lines.Add(IntToStr(btw));
     exit
     end // если запись найдена следующие запросы не выполняются
 else
  begin // если запись не найдена следующие запросы выполняются



Выдает ошибку: invalid variant type conversion

Это сообщение отредактировал(а) rus777 - 13.11.2012, 13:49
PM   Вверх
superVad
Дата 13.11.2012, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 735
Регистрация: 6.4.2006
Где: Черкассы, Украина

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



rus777, укажи в какой строке ошибка. Покажи секцию Var - ну что бы понять какого типа у тебя переменные.

Код

 ADOQuery1.Open;
 ct:=ADOQuery1.FieldByName('cltime').AsVariant;
Обращайся к полям - после того как проверишь - вернул ли что то запрос.

Чем не устраивает такая конструкция?
Код

btw := MinutesBetween(ADOQuery1.FieldByName('cltime').AsDateTime, Now);
Зачем все эти пляски со строками?

Код

ComboBox2.Text>IntToStr(btw)
Ну и про это ты уже знаешь - сравнивать числа как строки - не правильно. Надо их сравнивать как числа.

Это сообщение отредактировал(а) superVad - 13.11.2012, 14:53
PM MAIL   Вверх
rus777
Дата 13.11.2012, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



var BytesWritten: DWORD;
  ct,s: string;
  btw,i: Integer;
  Result: string;
  cts,dt : TDateTime;

cts := StrToDateTime(''+ct+''); //время из таблицы .....если запрос не вернет ни одной строки,то и времени соотвественно НЕТ
PM   Вверх
superVad
Дата 13.11.2012, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 735
Регистрация: 6.4.2006
Где: Черкассы, Украина

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



rus777, 
Код

cts := StrToDateTime(''+ct+'');
Зачем кавычки?
И что в ct?

И почему?
Код

ct:=adoquery1.FieldByName('cltime').AsVariant;

А не?
Код

ct:=adoquery1.FieldByName('cltime').AsString;

Или вообще:
Код

cts := ADOQuery1.FieldByName('cltime').AsDateTime;


Это сообщение отредактировал(а) superVad - 13.11.2012, 15:34
PM MAIL   Вверх
rus777
Дата 13.11.2012, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



ct-дата и время в таблице-строковое

Вывожу из таблицы запросом,конвертирую,сравниваю

Добавлено @ 16:18
Да,забыл....таблички dbf
Если
Код

ct:=adoquery1.FieldByName('cltime').AsString;


Тогда другая ошибка:is not a valid date and time

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


Новичок



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

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



Проблема возникает только тогда,когда там нет записи с искомыми требованиями
PM   Вверх
superVad
Дата 13.11.2012, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 735
Регистрация: 6.4.2006
Где: Черкассы, Украина

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



Цитата(rus777 @  13.11.2012,  15:32 Найти цитируемый пост)
Проблема возникает только тогда,когда там нет записи с искомыми требованиями

Ну так проверяй же - вернул ли что то запрос.
Код

  if ADOQuery1.RecordCount > 0 then...

PM MAIL   Вверх
rus777
Дата 13.11.2012, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



superVad, в том то и дело, что проверка есть, а ошибка все равно выходит....Я же еще не совсем спекся...))) Ошибка выходит,когда запрос ничего не возвращает

Это сообщение отредактировал(а) rus777 - 13.11.2012, 18:23
PM   Вверх
rus777
Дата 13.11.2012, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Нашел на другом форуме:" таким приколом я сталкивался в FastReport, но принцип тот же. Пустое значение неможет преобразоватся к заданому типу.Данная ошибка тянется из VCL, необходимо просмотреть место приведение типа и поправить(я так решал, может и не прав smile ) Всетаки по моему это баг."
Как теперь быть....Хожу вокруг  да около....Всяко придется идти к той же цели другим путем..
PM   Вверх
superVad
Дата 13.11.2012, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 735
Регистрация: 6.4.2006
Где: Черкассы, Украина

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



rus777, какую дату ты хочешь получить из пустой строки?
PM MAIL   Вверх
rus777
Дата 14.11.2012, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



В виду
Цитата

Нашел на другом форуме:"С таким приколом я сталкивался в FastReport, но принцип тот же. Пустое значение неможет преобразоватся к заданому типу.Данная ошибка тянется из VCL, необходимо просмотреть место приведение типа и поправить(я так решал, может и не прав  ) Всетаки по моему это баг."


Вопрос решен таким образом
Код

 ADOQuery1.Close;
 ADOQuery1.SQL.Clear;
 ADOQuery1.SQL.Add('select * from "client.dbf"');
 ADOQuery1.SQL.Add('where sot_client='''+Result+'''');
 ADOQuery1.Open;
 if (ADOQuery1.RecordCount>0) and
 (ComboBox2.Text>(IntToStr(MinutesBetween(StrToDateTime(adoquery1.FieldByName('cltime').AsString),Now))))
 then
 begin
   Memo1.Lines.Add(adoquery1.FieldByName('sot_client').AsString);
   Memo1.Lines.Add(IntToStr(btw));
   end
 else begin


Так работает без проблем....Обкатано-проверено

Добавлено через 2 минуты и 24 секунды
При поиске решения проблемы с пустым значением неоднократно натыкался на аналогичные ситуации у других людей....Видимо это все-таки баг.
PM   Вверх
superVad
Дата 14.11.2012, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 735
Регистрация: 6.4.2006
Где: Черкассы, Украина

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



rus777, из хелпа:
Description

Call StrToDateTime to parse a string that specifies a date and time value. If S does not contain a valid date, StrToDateTime raises an EConvertError exception. 

The S parameter must use the current locale’s date/time format. In the US, this is commonly MM/DD/YY HH:MM:SS format. Specifying AM or PM as part of the time is optional, as are the seconds. Use 24-hour time (7:45 PM is entered as 19:45, for example) if AM or PM is not specified. 

Year values between 0 and 99 are converted using the TwoDigitYearCenturyWindow. This value is stored either in a global variable (first form) or as a field in the FormatSettings parameter (second form) See "Currency and Date-Time Formatting Variables" for more information. 

The first form of StrToDateTime is not thread-safe, because it uses localization information contained in global variables. The second form of StrToDateTime, which is thread-safe, refers to localization information contained in the FormatSettings parameter. Before calling the thread-safe form of StrToDateTime, you must populate FormatSettings with localization information. To populate FormatSettings with a set of default locale values, call GetLocaleFormatSettings.


Такое ощущение, что ты сам с собой в этой ветке общаешься...

PM MAIL   Вверх
rus777
Дата 24.11.2012, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Уважаемые помогите! Запарился...
Я уже как только не пробовал...мешает все тот же баг Борланда описанный во многих источниках.
Код

procedure ...............
var BytesWritten: DWORD;
  r,s: string;
  d: array[1..1500] of Char;
  BytesRead: DWORD;
  i: Integer;
  Result: string;
  ct: string;
begin
  s := 'at+clcc';
  s := s + #13 + #10;
  WriteFile(ComFile, s[1], Length(s), BytesWritten, nil); //…и посылаем их телефону
  Result := '';
if not ReadFile(ComFile, d, SizeOf(d), BytesRead, nil)
then
begin
      MessageDlg('Ошибка чтения!', mtError, [mbOK], 0); 
        exit;
    end;

  s := '';
  for i := 1 to BytesRead do s:=s+d[I];
  Delete(s,1,pos('+7',s)-1);
  Delete(s,13,255);
  Result :=s;

if pos('+7',s) <>0
then
begin


  s := 'AT+CHUP';
  s := s + #13 + #10;
  WriteFile(ComFile, s[1], Length(s), BytesWritten, nil);

  Query2.Close;
  Query2.SQL.Clear;
  Query2.SQL.Add('select sot_driver from "driver.dbf"');
  Query2.SQL.Add('where sost=''1''');
  Query2.SQL.Add('and root=''1''');
  Query2.Open;
  Query1.Close;
  Query1.SQL.Clear;
  Query1.SQL.Add('select * from "client.dbf"');
  Query1.SQL.Add('where sot_client='''+Result+'''');
  Query1.SQL.Add('and cltime=(select MAX(cltime) from "client.dbf")');
  Query1.Open;
  ct:= Query1.FieldByName('cltime').AsVariant;  //БЫВАЕТ,ЧТО В ТАБЛИЦЕ НЕТ НИ ОДНОЙ ЗАПИСИ
if (Query1.RecordCount>0) and (Query2.RecordCount>0) and
   ((ComboBox2.Text>(IntToStr(MinutesBetween(StrToDateTime(ct), Now)))) //БЫВАЕТ,ЧТО В ТАБЛИЦЕ НЕТ НИ ОДНОЙ ЗАПИСИ
then
begin
  Query3.Close;
  Query3.SQL.Clear;
  Query3.SQL.Text:='INSERT INTO ''client.dbf'' (sot_client,cltime,sost) VALUES (:Result , :tm, ''1'')';
  Query3.ParamByName('tm').Value:= DateTimeToStr(Now);
  Query3.ParamByName('Result').Value:= Result;
  Query3.ExecSQL;
  Memo1.Lines.Add('Принят--->' +Result+'--->'+DateTimeToStr(Now)); //Выводим ответ от телефона в Memo
  end
  else
if Query2.RecordCount=0
then
begin
   Memo1.Lines.Add('***Блокирован  '+Result+' - нет водителей');
if (Query1.RecordCount>0) and
   (ComboBox2.Text>(IntToStr(MinutesBetween(StrToDateTime(ct), Now)))) //БЫВАЕТ,ЧТО В ТАБЛИЦЕ НЕТ НИ ОДНОЙ ЗАПИСИ
and
   (Query2.RecordCount>0)
then
begin
   r:=(IntToStr(MinutesBetween(StrToDateTime(ct), Now)));
   Memo1.Lines.Add('***Блокирован  '+Query1.FieldByName('sot_client').AsVariant+' прошло '+r+' мин');
    end;
   end;
  end;
 end;
end.

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

Это сообщение отредактировал(а) rus777 - 25.11.2012, 07:15
PM   Вверх
Данкинг
Дата 24.11.2012, 21:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


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

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



Что там за приравнивание ещё до открытия запроса? 
Код

ct:= Query1.FieldByName('cltime').AsVariant;
Query1.Open;

И ошибка на какой строке: после выполнения запросов, что ли?


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


Новичок



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

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



Уже похоже загнался,т.к. по всякому уже пытался формировать(сам зациклился), но проблема возникает именно тогда,когда в таблице пусто по DateTime
PM   Вверх
Данкинг
Дата 24.11.2012, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


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

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



Цитата(rus777 @  24.11.2012,  22:39 Найти цитируемый пост)
но проблема возникает именно тогда,когда в таблице пусто по DateTime 

Покажи конкретную строку, на которой вылезает ошибка.


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


Опытный
**


Профиль
Группа: Участник
Сообщений: 735
Регистрация: 6.4.2006
Где: Черкассы, Украина

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



Цитата(rus777 @  24.11.2012,  20:14 Найти цитируемый пост)
Я уже как только не пробовал...мешает все тот же баг Борланда описанный во многих источниках.

А что за баг то?
PM MAIL   Вверх
rus777
Дата 25.11.2012, 07:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Если запрос ничего не вернул, т.е. если к примеру таблица пуста, то получаем ошибку с невозможностью преобразовать дату... Если данные присутствую,тогда все работает...Проблема с построением кода
PM   Вверх
Данкинг
Дата 25.11.2012, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


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

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



А, ну а зачем в одном условии проверять сразу и число возвращённых записей, и это CT? Переделай так (я суть передам, а под свой код уже сам подгонишь):

Код

if (Query1.RecordCount>0) and (Query2.RecordCount>0)  then
 begin
  if   (ComboBox2.Text>(IntToStr(MinutesBetween(StrToDateTime(ct), Now)))) then
   begin
     ...
   end;

  end;



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


Опытный
**


Профиль
Группа: Участник
Сообщений: 735
Регистрация: 6.4.2006
Где: Черкассы, Украина

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



Цитата(Данкинг @  25.11.2012,  09:27 Найти цитируемый пост)
А, ну а зачем в одном условии проверять сразу и число возвращённых записей, и это CT? Переделай так (я суть передам, а под свой код уже сам подгонишь):

Условие там нормальное. Проблема в том, что ct берется из Query1 ДО проверки на количество вернувшихся записей.
PM MAIL   Вверх
rus777
Дата 25.11.2012, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Переделываю...Выглядит так:
Код

procedure ......................
var BytesWritten: DWORD;
  r,s: string;
  d: array[1..1500] of Char;
  BytesRead: DWORD;
  i: Integer;
  Result: string;
  ct: string;
begin
  s := 'at+clcc';
  s := s + #13 + #10;
  WriteFile(ComFile, s[1], Length(s), BytesWritten, nil); //…и посылаем их телефону
  Result := '';
if not ReadFile(ComFile, d, SizeOf(d), BytesRead, nil)
then
begin
      MessageDlg('Ошибка чтения!', mtError, [mbOK], 0);
        exit;
    end;

  s := '';
  for i := 1 to BytesRead do s:=s+d[I];
  Delete(s,1,pos('+7',s)-1);
  Delete(s,13,255);
  Result :=s;

if pos('+7',s) <>0
then
begin
  s := 'AT+CHUP';
  s := s + #13 + #10;
  WriteFile(ComFile, s[1], Length(s), BytesWritten, nil);

  Query2.Close;
  Query2.SQL.Clear;
  Query2.SQL.Add('select sot_driver from "driver.dbf"');
  Query2.SQL.Add('where sost=''1''');
  Query2.SQL.Add('and root=''1''');
  Query2.Open;
  Query1.Close;
  Query1.SQL.Clear;
  Query1.SQL.Add('select * from "client.dbf"');
  Query1.SQL.Add('where sot_client='''+Result+'''');
  Query1.SQL.Add('and cltime=(select MAX(cltime) from "client.dbf")');
  Query1.Open;
if (Query1.RecordCount>0) and (Query2.RecordCount>0) and
   ((ComboBox2.Text<(IntToStr(MinutesBetween(StrToDateTime(ct), Now)))))
then
begin
  Query3.Close;
  Query3.SQL.Clear;
  Query3.SQL.Text:='INSERT INTO ''client.dbf'' (sot_client,cltime,sost) VALUES (:Result , :tm, ''1'')';
  Query3.ParamByName('tm').Value:= DateTimeToStr(Now);
  Query3.ParamByName('Result').Value:= Result;
  Query3.ExecSQL;
  Memo1.Lines.Add('Принят--->' +Result+'--->'+DateTimeToStr(Now)); //Выводим ответ от телефона в Memo
  end;
if (Query1.RecordCount=0) and (Query2.RecordCount>0)
then
begin
  Query3.Close;
  Query3.SQL.Clear;
  Query3.SQL.Text:='INSERT INTO ''client.dbf'' (sot_client,cltime,sost) VALUES (:Result , :tm, ''1'')';
  Query3.ParamByName('tm').Value:= DateTimeToStr(Now);
  Query3.ParamByName('Result').Value:= Result;
  Query3.ExecSQL;
  Memo1.Lines.Add('Принят--->' +Result+'--->'+DateTimeToStr(Now)); //Выводим ответ от телефона в Memo
  end
  else
if Query2.RecordCount=0
then
begin
   Memo1.Lines.Add('***Блокирован  '+Result+' - нет водителей');
   end;
if (Query1.RecordCount>0) and (Query2.RecordCount>0) and                     ///Ошибка именно в данной конструкции  
   (ComboBox2.Text>(IntToStr(MinutesBetween(StrToDateTime(Query1.FieldByName('cltime').AsString), Now))))     
then                                                                                                                                                                              
begin                                                                                                                                                                          
   r:=(IntToStr(MinutesBetween(StrToDateTime(Query1.FieldByName('cltime').AsString), Now)));                             
   Memo1.Lines.Add('***Блокирован  '+Query1.FieldByName('sot_client').AsVariant+' прошло '+r+' мин');              
   end;                                                                                                                                                                        
  end;
 end;
end.

Ошибка: "is not a valid date and time" в последней конструкции. Все остальное работает. Теперь то что не так? Если есть соображения подскажите пожалуйста...

Это сообщение отредактировал(а) rus777 - 25.11.2012, 12:10
PM   Вверх
Данкинг
Дата 25.11.2012, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


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

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



Query1 и Query2 открываются на строках 39 и 45, а ошибка вылезает на строке 75 при сравнении числа выбранных записей в этих запросах? Ничего не путаешь?

Цитата(superVad @  25.11.2012,  12:51 Найти цитируемый пост)
Проблема в том, что ct берется из Query1 ДО 

И чем же тогда условие нормальное? smile 


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


Новичок



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

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



Снова подправил:
Код

procedure .....................
var BytesWritten: DWORD;
  r,s: string;
  d: array[1..1500] of Char;
  BytesRead: DWORD;
  i: Integer;
  Result: string;
  ct: string;
begin
  s := 'at+clcc';
  s := s + #13 + #10;
  WriteFile(ComFile, s[1], Length(s), BytesWritten, nil); //…и посылаем их телефону
  Result := '';
if not ReadFile(ComFile, d, SizeOf(d), BytesRead, nil)
then
begin
      MessageDlg('Ошибка чтения!', mtError, [mbOK], 0);
        exit;
    end;

  s := '';
  for i := 1 to BytesRead do s:=s+d[I];
  Delete(s,1,pos('+7',s)-1);
  Delete(s,13,255);
  Result :=s;

if pos('+7',s) <>0
then
begin
  s := 'AT+CHUP';
  s := s + #13 + #10;
  WriteFile(ComFile, s[1], Length(s), BytesWritten, nil);

  Query2.Close;
  Query2.SQL.Clear;
  Query2.SQL.Add('select sot_driver from "driver.dbf"');
  Query2.SQL.Add('where sost=''1''');
  Query2.SQL.Add('and root=''1''');
  Query2.Open;
  Query1.Close;
  Query1.SQL.Clear;
  Query1.SQL.Add('select * from "client.dbf"');
  Query1.SQL.Add('where sot_client='''+Result+'''');
  Query1.SQL.Add('and cltime=(select MAX(cltime) from "client.dbf")');
  Query1.Open;
if ((Query1.RecordCount>0) and (Query2.RecordCount>0)) and
   (ComboBox2.Text<(IntToStr(MinutesBetween(StrToDateTime(Query1.FieldByName('cltime').AsString), Now)))) //срабатывает эта конструкция,
then     //когда ComboBox(постоянно 15)< MinutesBetween (достигает 2 )  сразу срабатывает                            
begin
r:=(IntToStr(MinutesBetween(StrToDateTime(Query1.FieldByName('cltime').AsString), Now)));
  Query3.Close;
  Query3.SQL.Clear;
  Query3.SQL.Text:='INSERT INTO ''client.dbf'' (sot_client,cltime,sost) VALUES (:Result , :tm, ''1'')';
  Query3.ParamByName('tm').Value:= DateTimeToStr(Now);
  Query3.ParamByName('Result').Value:= Result;
  Query3.ExecSQL;
  Memo1.Lines.Add('Принят--->' +Result+'--->'+DateTimeToStr(Now)+'-'+r); //Выводим ответ от телефона в Memo
  end;
if (Query1.RecordCount=0) and (Query2.RecordCount>0)
then
begin
  Query3.Close;
  Query3.SQL.Clear;
  Query3.SQL.Text:='INSERT INTO ''client.dbf'' (sot_client,cltime,sost) VALUES (:Result , :tm, ''1'')';
  Query3.ParamByName('tm').Value:= DateTimeToStr(Now);
  Query3.ParamByName('Result').Value:= Result;
  Query3.ExecSQL;
  Memo1.Lines.Add('Принят-->' +Result+'-->'+DateTimeToStr(Now)); //Выводим ответ от телефона в Memo
  end
  else
if (Query1.RecordCount>0) and (Query2.RecordCount>0) and
   (ComboBox2.Text>(IntToStr(MinutesBetween(StrToDateTime(Query1.FieldByName('cltime').AsString), Now))))
then
begin
   r:=(IntToStr(MinutesBetween(StrToDateTime(Query1.FieldByName('cltime').AsString), Now)));
   Memo1.Lines.Add('***Блокирован  '+Query1.FieldByName('sot_client').AsVariant+' прошло '+r+' мин');
end;
if Query2.RecordCount=0
then
begin
   Memo1.Lines.Add('***Блокирован  '+Result+' - нет водителей');
   end;
  end;
 end;
end.

Некорректно считает разницу. Первая конструкция не должна срабатывать пока MinutesBetween не станет больше 15...До 2 минут срабатывает третья(блокирует),но по достижении разницы в две минуты срабатывает первая....

Это сообщение отредактировал(а) rus777 - 25.11.2012, 13:07
PM   Вверх
Данкинг
Дата 25.11.2012, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


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

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



Ты там пытаешься текст с текстом сравнить (if текст1 < текст2).


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


Новичок



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

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



Да,но так работало и без проблем. Как все перетряхнул,начались проблемы...Именно принцип сравнения я не менял
Имеешь ввиду сделать так:
Код

(StrToInt(ComboBox2.Text)>(MinutesBetween(StrToDateTime(Query1.FieldByName('cltime').AsString), Now)))
???


Это сообщение отредактировал(а) rus777 - 25.11.2012, 13:49
PM   Вверх
superVad
Дата 25.11.2012, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 735
Регистрация: 6.4.2006
Где: Черкассы, Украина

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



Цитата(Данкинг @  25.11.2012,  11:34 Найти цитируемый пост)
И чем же тогда условие нормальное?

Условие действительно должно отработать без ошибок. Про до - я погорячился, там же поверка.
PM MAIL   Вверх
Данкинг
Дата 25.11.2012, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


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

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



Да, т.к. сравнивать можно только числа, разумеется.

Добавлено через 2 минуты
Цитата(superVad @  25.11.2012,  15:45 Найти цитируемый пост)
Условие действительно должно отработать без ошибок. 

Ну, видимо, глюк драйвера БД при попытке "ничто" сконвертить в строку.


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


Опытный
**


Профиль
Группа: Участник
Сообщений: 735
Регистрация: 6.4.2006
Где: Черкассы, Украина

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



Цитата(Данкинг @  25.11.2012,  13:45 Найти цитируемый пост)
Ну, видимо, глюк драйвера БД при попытке "ничто" сконвертить в строку.

Вроде как, если какое то из двух первых сфейлит то до третьего не дойдет же.
PM MAIL   Вверх
rus777
Дата 25.11.2012, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Ребята,вот в таком виде отрабатывает все условия....только при таком раскладе возникает другая ситуация:
после того как по таймеру выполнится данный код несколько раз, перестает отрабатывать...и в memo, и в табличке ничего не меняется,хотя на входящий звонок реакция есть-звонок сбрасывается...Да...и еще приложение в диспетчере задач потребляемая память с каждым выполнением данного кода увеличевается smile 
Код

procedure TForm1.TTimer1(Sender: TObject);
var BytesWritten: DWORD;
  r,s: string;
  d: array[1..1500] of Char;
  BytesRead: DWORD;
  i: Integer;
  Result: string;
begin
  s := 'at+clcc';
  s := s + #13 + #10;
  WriteFile(ComFile, s[1], Length(s), BytesWritten, nil); //…и посылаем их телефону
  Result := '';
if not ReadFile(ComFile, d, SizeOf(d), BytesRead, nil)
then
begin
      MessageDlg('Ошибка чтения!', mtError, [mbOK], 0);
        exit;
    end;

  s := '';
  for i := 1 to BytesRead do s:=s+d[I];
  Delete(s,1,pos('+7',s)-1);
  Delete(s,13,255);
  Result :=s;

if pos('+7',s) <>0
then
begin
  s := 'AT+CHUP';
  s := s + #13 + #10;
  WriteFile(ComFile, s[1], Length(s), BytesWritten, nil);
  timer1.Enabled:=false;
  Query2.Close;
  Query2.SQL.Clear;
  Query2.SQL.Add('select sot_driver from "driver.dbf"');
  Query2.SQL.Add('where sost=''1''');
  Query2.SQL.Add('and root=''1''');
  Query2.Open;
  Query1.Close;
  Query1.SQL.Clear;
  Query1.SQL.Add('select * from "client.dbf"');
  Query1.SQL.Add('where sot_client='''+Result+'''');
  Query1.SQL.Add('and cltime=(select MAX(cltime) from "client.dbf")');
  Query1.Open;
if (Query1.RecordCount>0) and (Query2.RecordCount>0) and
   (StrToInt(ComboBox2.Text)<(MinutesBetween(StrToDateTime(Query1.FieldByName('cltime').AsString), Now)))
then
begin
r:=(IntToStr(MinutesBetween(StrToDateTime(Query1.FieldByName('cltime').AsString), Now)));
  Query3.Close;
  Query3.SQL.Clear;
  Query3.SQL.Text:='INSERT INTO ''client.dbf'' (sot_client,cltime,sost) VALUES (:Result , :tm, ''1'')';
  Query3.ParamByName('tm').Value:= DateTimeToStr(Now);
  Query3.ParamByName('Result').Value:= Result;
  Query3.ExecSQL;
  Memo1.Lines.Add('Принят--->' +Result+'--->'+DateTimeToStr(Now)+'-'+r); //Выводим ответ от телефона в Memo
  end;
if (Query1.RecordCount=0) and (Query2.RecordCount>0)
then
begin
  Query3.Close;
  Query3.SQL.Clear;
  Query3.SQL.Text:='INSERT INTO ''client.dbf'' (sot_client,cltime,sost) VALUES (:Result , :tm, ''1'')';
  Query3.ParamByName('tm').Value:= DateTimeToStr(Now);
  Query3.ParamByName('Result').Value:= Result;
  Query3.ExecSQL;
  Memo1.Lines.Add('Принят-->' +Result+'-->'+DateTimeToStr(Now)); //Выводим ответ от телефона в Memo
  end
  else
if (Query1.RecordCount>0) and (Query2.RecordCount>0) and
   (StrToInt(ComboBox2.Text)>(MinutesBetween(StrToDateTime(Query1.FieldByName('cltime').AsString), Now)))
then
begin
   r:=(IntToStr(MinutesBetween(StrToDateTime(Query1.FieldByName('cltime').AsString), Now)));
   Memo1.Lines.Add('***Блокирован  '+Query1.FieldByName('sot_client').AsVariant+' прошло '+r+' мин');
end;
if Query2.RecordCount=0
then
begin
   Memo1.Lines.Add('***Блокирован  '+Result+' - нет водителей');
   end;
  end;
  PurgeComm(ComFile, PURGE_RXCLEAR or PURGE_TXCLEAR);
  timer1.Enabled:=true;
 end;

Память жрет...что-то опять не так...3-4 звонка и код перестает работать.......Странно все работало и пропускало любое количество  smile 

Это сообщение отредактировал(а) rus777 - 25.11.2012, 16:07
PM   Вверх
rus777
Дата 25.11.2012, 19:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Разобрался, все работает
Код

procedure TForm1.TTimer1(Sender: TObject);
var BytesWritten: DWORD;
  r,s: string;
  d: array[1..1500] of Char;
  BytesRead: DWORD;
  i: Integer;
  Result: string;
begin
  s := 'at+clcc';
  s := s + #13 + #10;
  WriteFile(ComFile, s[1], Length(s), BytesWritten, nil); //…и посылаем их телефону
  Result := '';
if not ReadFile(ComFile, d, SizeOf(d), BytesRead, nil)
then
begin
      MessageDlg('Ошибка чтения!', mtError, [mbOK], 0);
        exit;
    end;

  s := '';
  for i := 1 to BytesRead do s:=s+d[I];
  Delete(s,1,pos('+7',s)-1);
  Delete(s,13,255);
  Result :=s;

if pos('+7',s) <>0
then
begin
  s := 'AT+CHUP';
  s := s + #13 + #10;
  WriteFile(ComFile, s[1], Length(s), BytesWritten, nil);
  //timer1.Enabled:=false;
  Query2.Close;
  Query2.SQL.Clear;
  Query2.SQL.Add('select sot_driver from "driver.dbf"');
  Query2.SQL.Add('where sost=''1''');
  Query2.SQL.Add('and root=''1''');
  Query2.Open;
    Query1.Close;
    Query1.SQL.Clear;
    Query1.SQL.Add('select * from "client.dbf"');
    Query1.SQL.Add('where sot_client='''+Result+'''');
    Query1.SQL.Add('order by cltime desc');
    Query1.Open;
if (Query1.RecordCount>0) and (Query2.RecordCount>0) and
   (StrToInt(ComboBox2.Text)<(MinutesBetween(StrToDateTime(Query1.FieldByName('cltime').AsString), Now)))
then
begin
r:=(IntToStr(MinutesBetween(StrToDateTime(Query1.FieldByName('cltime').AsString), Now)));
  Query3.Close;
  Query3.SQL.Clear;
  Query3.SQL.Text:='INSERT INTO ''client.dbf'' (sot_client,cltime,sost) VALUES (:Result , :tm, ''1'')';
  Query3.ParamByName('tm').Value:= DateTimeToStr(Now);
  Query3.ParamByName('Result').Value:= Result;
  Query3.ExecSQL;
  Memo1.Lines.Add('Принят--->' +Result+'--->'+DateTimeToStr(Now)+'-'+r); //Выводим ответ от телефона в Memo
  end;
if (Query1.RecordCount=0) and (Query2.RecordCount>0)
then
begin
  Query3.Close;
  Query3.SQL.Clear;
  Query3.SQL.Text:='INSERT INTO ''client.dbf'' (sot_client,cltime,sost) VALUES (:Result , :tm, ''1'')';
  Query3.ParamByName('tm').Value:= DateTimeToStr(Now);
  Query3.ParamByName('Result').Value:= Result;
  Query3.ExecSQL;
  Memo1.Lines.Add('Принят-->' +Result+'-->'+DateTimeToStr(Now)); //Выводим ответ от телефона в Memo
  end
  else
if (Query1.RecordCount>0) and (Query2.RecordCount>0) and
   (StrToInt(ComboBox2.Text)>(MinutesBetween(StrToDateTime(Query1.FieldByName('cltime').AsString), Now)))
then
begin
   r:=(IntToStr(MinutesBetween(StrToDateTime(Query1.FieldByName('cltime').AsString), Now)));
   Memo1.Lines.Add('***Блокирован  '+Query1.FieldByName('sot_client').AsVariant+' прошло '+r+' мин');
end;
if Query2.RecordCount=0
then
begin
   Memo1.Lines.Add('***Блокирован  '+Result+' - нет водителей');
   end;
  end;
  if not PurgeComm(ComFile, PURGE_TXCLEAR or PURGE_RXCLEAR) then
 raise Exception.Create('Error purging port');
 end;

 smile  Всем большое спасибо за участие!
PM   Вверх
Данкинг
Дата 25.11.2012, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


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

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



Цитата(superVad @  25.11.2012,  16:00 Найти цитируемый пост)
Вроде как, если какое то из двух первых сфейлит то до третьего не дойдет же. 

Т.е. если в условии с .and. какое-то условие не выполняется, то проверка условия прекращается? По-моему, нет, должны все .and. провериться.


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


Опытный
**


Профиль
Группа: Участник
Сообщений: 735
Регистрация: 6.4.2006
Где: Черкассы, Украина

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



Цитата(Данкинг @  25.11.2012,  19:42 Найти цитируемый пост)
Т.е. если в условии с .and. какое-то условие не выполняется, то проверка условия прекращается? По-моему, нет, должны все .and. провериться.

Да - прекращается.
PM MAIL   Вверх
lomaster
Дата 25.11.2012, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



От настроек компилятора зависит - флаг Complete boolen eval (если правильно помню).
PM   Вверх
rus777
  Дата 26.11.2012, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Да,именно так
PM   Вверх
superVad
Дата 26.11.2012, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 735
Регистрация: 6.4.2006
Где: Черкассы, Украина

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



Цитата(lomaster @  25.11.2012,  22:23 Найти цитируемый пост)
От настроек компилятора зависит - флаг Complete boolen eval (если правильно помню).

Действительно. Но по умолчанию она выключена. В моих прогах если ее включить то какой то ужас будет...
PM MAIL   Вверх
rus777
Дата 26.11.2012, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



superVad,а в чем именно это выражается?
PM   Вверх
superVad
Дата 26.11.2012, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 735
Регистрация: 6.4.2006
Где: Черкассы, Украина

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



Цитата(rus777 @  26.11.2012,  16:13 Найти цитируемый пост)
superVad,а в чем именно это выражается?

Ну вот первое, что приходит в голову. При удалении из таблиц, почти везде (в справочниках и т.д.) у меня такая конструкция:
Код

  if check_ds_for_del_and_sel(DataSet) and
     ShowQuestion('Вы точно хотите удалить?')
  then
  try
    DataSet.Delete;
  except
    ...
  end;

check_ds_for_del_and_sel проверяет существует ли набор данных, открыт ли он, есть ли там записи и выдает предупреждение если это не так.
И если эту опцию включить, то вопрос про удаление будет задаваться даже если check_ds_for_del_and_sel вернул ложь и выдал предупреждение перед этим.

А вообще я много где такое использую.
PM MAIL   Вверх
rus777
Дата 27.11.2012, 09:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Понял. В общем то да, все правильно. Ужас-мягко сказано))))

Это сообщение отредактировал(а) rus777 - 27.11.2012, 09:10
PM   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

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

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

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


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

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


 




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


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

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