![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Здравствуйте!
В замороченном проекте с кучей кода и окон в одном месте постоянно выскакивает "Could not convert variant of type (Null) into type (Double)". (Небольшая ремарка - конечно это само по себе бред полный, тк Null это "пусто" и при переделке "пусто" в любой формат хоть строки, хоть числа, чего угодно всё равно должно получиться "пусто", ну да ладно, оставим это на совести разработчиков Delphi.) Проблема том, что в месте где возникает ошибка происходит подряд целая цепь событий: создание окна, загрузка данных, выбор данных, создание другого окна, передача параметров, обновление данных БД, формирование отчёты FastReport. Много всего и куча данных - понять что где глючит не зная места и данных невозможно. Пробовал ставить BreakPoints, запускать в режиме Trace To Next Source Lines, жать break когда выскакивает ошибка, итд - без толку, ошибка просто появляется и откуда берётся непонятно! (Понятно лишь, что при нажатии на кнопку, но там такое кол-во сразу выполняется процедур и данных, что ого-го.) Если ли какой-то способ заставить Delphi чётко указать на строку кода, в которой возникает ошибка и желательно отобразить переменную и данные в удобоваримом виде которые вызывают ошибку? PS Попутно вопрос по датам - если при вводе Дата не указана, то может ли она везде (Delphi,Firebird,FastReport) быть null? или null в контексте Даты вызывает ошибку? Как тогда передавать "дата не указана", чтобы в БД сохранилось как null? Последний раз редактировалось delphicoding, 28.07.2011 в 13:49. |
|
#2
|
|||
|
|||
|
Может быть как - нибудь и можно, но я в подобных случаях пользуюсь дедовским методом.
Подозрительный код методически "окружаю" вот такими сообщениями Код:
ShowMessage('Точка 1 Входим');
.......
.......
.......
ShowMessage('Удачно вышли');По поводу 2 вопроса. Не уверен, но попробуй проверить, допускает ли поле базы данных сохранение значения Null. |
|
#3
|
|||
|
|||
|
БД допускает. Но Delphi вот Дату как null что-то не очень воспринимает... или может FastReport ? Но кто-то из них явно не понимает var D:Tdate; D:=null;..
Как таки передавать Date пустую ??? |
|
#4
|
|||
|
|||
|
А null точно можно использовать? Помоему всю жизнь nil использовали в борланде.
|
|
#5
|
|||
|
|||
|
Да в этом долбанном борланде чё тольк оне используют и nil и null и if =null и IsNull итд итп... бардак полнейший!
![]() |
|
#6
|
|||
|
|||
|
На этот вопрос к сожалению ответа не знаю.
Найди строку, в которой возникает ошибка. Возможно тогда всё и разрешится. У меня так было. Удачи. |
|
#7
|
||||
|
||||
|
Цитата:
TDateTime = type Double; естественно вещественый тип не может иметь пустое значение, в отличии от типа Variant. Null это функция, которая возвращает пустое значение типа Variant: Код:
unit Variants; function Null: Variant; begin _VarNull(TVarData(Result)); end; при работе с датой в БД рекомендую такой подход: Код:
var
d: TDateTime;
begin
if not Table1.FieldByName('date1').IsNull then
begin
d:=Table1.FieldByName('date1').AsDateTime; // получение значения даты, если поле заполнено
Table1.FieldByName('date1').Clear; // очищаем значение поля
end;
end;nil используется с указателями. |
|
#8
|
|||
|
|||
|
Цитата:
То есть в Delphi не предусмотрено вообще пустая дата?! То есть нельзя оставить поле для ввода даты пустым и присвоить это некой переменной ?! |
|
#9
|
||||
|
||||
|
Цитата:
Цитата:
Цитата:
|
|
#10
|
|||
|
|||
|
Цитата:
Цитата:
============================================ Придумал как можно проверить, тольк оне знаю как это реализовать... вопрос размуеется тупой - есть юнит DataModule, то есть без формы, в нём много чего происходит, а на выходе должен быть заполнен Datasource данными. Как можно из этого DataModule при помощи чистого кода создать нечто вроде текстового окна с кнопкой ОК/Закрыть и залить в это окно или некий графический объект все данные из Datasource (или Dataset) - чтобы наконец таки проверить все значения... |
|
#11
|
|||
|
|||
|
После долгих ковыряний выяснилось, что в программе всё нормально. Баг либо в процедуре БД, либо при передаче параметров из программы в процедуру БД. Процедура явно работает, тк возвращает названия полей таблицы, но результат работы - пуст.
Пользуюсь IBExpert, можно в нём как-то посмотреть запросы/ответы к/из процедурам БД из рабочей программы? Как вообще можно узнать какие точно данные получила БД? |
|
#12
|
||||
|
||||
|
Цитата:
![]() |
|
#13
|
||||
|
||||
|
Цитата:
|
|
#14
|
||||
|
||||
|
Ну тогда уж с просто логики...
[/sarcasm] |
|
#15
|
|||
|
|||
|
Ну это совсем смешной вопрос для дебилоф.
Вы тут все типа умные программеры же, ага, вот тебе ответ: [ У нас есть оперативная память - непрерывный блок байт. Система выделила нам под переменную типа Integer 4 байта из этого блока. Как ты предлагаешь "ничего не хранить" в них? ] := [ Это типа вопрос - чем же подтереть жопу, когда начал дристать посреди красной площади? ] В 17 лет уже иметь восьмилетний стаж программирования, знать 4 языка... Это что-то значит А у меня лучшая выпускная работа года в городе Москве, написана на QB. Это что-то значит? Последний раз редактировалось delphicoding, 29.07.2011 в 19:17. |