Модераторы: 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   Вверх
Страницы: (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.0540 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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