Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.09.2011, 15:47   #1
VaskoPavel
Пользователь
 
Регистрация: 21.07.2011
Сообщений: 13
Злость Расcчеты в DBGrid-e

Не могу выполнить операцию деления в DBGride. Если написать такой код то все ОК,
popravka:=(Table2Ostatoknanachmes.V alue+(Table2Pologenodeneg.Value-Table2Ostatoknakonmes.Value))/905
а если вместо 905 поставить допустим Table3nds.Value или переменную, то получается ошибка.
Изображения
Тип файла: jpg error.jpg (109.1 Кб, 145 просмотров)
VaskoPavel вне форума Ответить с цитированием
Старый 05.09.2011, 15:58   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Причем здесь эта строка и та ошибка, что у вас показана? StrToFloat пытается преобразовать строку в real, а в самой строке данные которые нельзя преобразовать в такой формат. Пустая строка не преобразуется в том числе, возможно у вас точка десятичная введена, а ожидается запятая (или наоборот) или вообще буква введена. Используйте try ... except. Table3nds.Value - возможно тип не подходящий или NULL
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 05.09.2011 в 16:01.
Аватар вне форума Ответить с цитированием
Старый 05.09.2011, 16:21   #3
VaskoPavel
Пользователь
 
Регистрация: 21.07.2011
Сообщений: 13
По умолчанию

Ок. Убрал всю эту хрень с StrToFloat оставил так:
popravka:=(Table2Ostatoknanachmes.V alue+(Table2Pologenodeneg.Value-Table2Ostatoknakonmes.Value))/Table3NDS.Value;
Один хрен ошибка. Тип данных в DB Desktop по полю NDS ставил Namber.
Может Таблица 2 и Таблица 3 должны быть соединены как-то? Что-то я запутался.
Изображения
Тип файла: jpg error1.JPG (8.9 Кб, 104 просмотров)
VaskoPavel вне форума Ответить с цитированием
Старый 05.09.2011, 17:25   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А по сообщению не видно, что деление на 0
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 05.09.2011, 18:02   #5
VaskoPavel
Пользователь
 
Регистрация: 21.07.2011
Сообщений: 13
По умолчанию

Вставил значения в таблицу 3 - все равно не считает. Такая же ошибка. Получается не видит эти значения программа? А если добавлю еще одно поле допустим НДС в табл. 2 и заполню его, то программа запускается без проблем. Нужно использовать таблицу подстановки или что-то другое может? Не подскажете
VaskoPavel вне форума Ответить с цитированием
Старый 05.09.2011, 18:03   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Аватар абсолютно прав.
я бы вообще такой вариант предложил:
Код:
var S : string;
   DValue : extended;
.....

  S := Table3NDS.Value;
  if DecimalSeparator = '.' then
     DValue := StrToFloatDef(StringReplace(S, ',' , DecimalSeparator, [rfIgnoreCase, rfReplaceAll]),0)
  else
     DValue := StrToFloatDef(StringReplace(S, '.' , DecimalSeparator, [rfIgnoreCase, rfReplaceAll]),0);
  if DValue<>0 then
      popravka:=(Table2Ostatoknanachmes.V alue+(Table2Pologenodeneg.Value-Table2Ostatoknakonmes.Value))/DValue
  else 
      popravka:= 0; {или чему равна поправка, если НДС проставлен нулевой...}
Serge_Bliznykov вне форума Ответить с цитированием
Старый 06.09.2011, 10:37   #7
VaskoPavel
Пользователь
 
Регистрация: 21.07.2011
Сообщений: 13
По умолчанию

Написал код
Код:
procedure TForm1.Table2CalcFields(DataSet: TDataSet);
var
S : string;
DValue : extended;

begin
Table2Pzamesposchet.Value:= Table2Pnakonec.Value - Table2Pnanach.Value; // по счетчику

S :=FloatToStr(Table3Tarif.Value);
if DecimalSeparator = '.' then
DValue := StrToFloatDef(StringReplace(S, ',' , DecimalSeparator, [rfIgnoreCase, rfReplaceAll]),0)
else
DValue := StrToFloatDef(StringReplace(S, '.' , DecimalSeparator, [rfIgnoreCase, rfReplaceAll]),0);
if DValue<>0 then
Table2Pzamespoden.Value:=Round((Table2Ostatoknanachmes.Value+(Table2Pologenodeneg.Value-Table2Ostatoknakonmes.Value))/DValue) // по деньгам
else
MessageDlg('Тариф равен нулю. Введите другое значение!',mtError,[mbOk],0); {или чему равна поправка, если НДС проставлен нулевой...}

end;
Сразу по нажатии на компиляцию выдает мою ошибку "Тариф равен нулю. Введите другое значение!" Нажму Ок и прога стартует но не считает правильно. Попробую объяснить все сначала. Есть три таблицы: 1) firma; 2) mesto; 3) tarif. Таблицы фирма и место связаны между собой один ко многим. Таблица тариф не связана не с кем. Но значения из этой таблицы используются для расчета цены и т.д. и т.п. в таблице 2.


________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.
Изображения
Тип файла: jpg 11.jpg (70.6 Кб, 141 просмотров)
Тип файла: jpg 22.jpg (33.6 Кб, 121 просмотров)

Последний раз редактировалось Serge_Bliznykov; 06.09.2011 в 14:50.
VaskoPavel вне форума Ответить с цитированием
Старый 06.09.2011, 14:53   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

да ну, я думал, что изначально у Вас в Table3Tarif.Value находится ТЕКСТОВОЕ значение, которое не может быть нормально обработано функцией StrToFloat, т.к. вместо десятичной запятой стоит точка (или наоборот) - такие вещи бывают, когда тип поля выбран (ошибочно) как текстовый и таблица заполняется на компьютерах с разными региональными установками.

в Вашем же случае достаточно так:
Код:
procedure TForm1.Table2CalcFields(DataSet: TDataSet);
begin
if Table3Tarif.Value<>0 then
  Table2Pzamespoden.Value:=Round((Table2Ostatoknanachmes.Value+(Table2Pologenodeneg.Value-Table2Ostatoknakonmes.Value))/Table3Tarif.Value) // по деньгам
else
  Table2Pzamesposchet.Value:= Table2Pnakonec.Value - Table2Pnanach.Value; // по счетчику

end;
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
связь одной dbgrid c другой dbgrid anabenne БД в Delphi 3 17.10.2011 10:15
Возможно DBgrid в DBgrid zidane007_06 БД в Delphi 2 14.05.2011 00:35
Перемещение даннах из dbgrid в dbgrid Hobbit_88 БД в Delphi 7 10.06.2009 13:33
перенос данных из DBGrid в DBGrid KingSize БД в Delphi 17 24.04.2009 09:30