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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.01.2012, 16:44   #1
TuxoH
Новичок
Джуниор
 
Регистрация: 08.01.2012
Сообщений: 4
По умолчанию Ввод данных в БД через Edit

Надо написать программу на Delphi по расчету лизинга и занесении результатов в базу + БД клиентов и связь этих БД.

Форма ввода и расчета выглядит так:

Пытался использовать для ввода DBEdit, но он как будто дохлый, ни на что не реагировал.
Тогда решил использовать простой Edit. Весь ввод данных и расчеты привязал к одной кнопке.
Код такой:

procedure TForm2.Button1Click(Sender: TObject);
begin

table1.Insert;

table1BalansStoimost.Value:=StrToIn t(Edit1.Text);
table1UslugyLizingodatelja.value:=S trToInt(Edit2.Text);
table1SrokEkspluatacii.Value:=StrTo Int(Edit3.Text);
table1SrokDogovora.value:=StrToInt( Edit4.Text);
table1StavkaKredita.value:=StrToInt (Edit5.Text);
table1KomissijaLizingodatelja.value :=StrToInt(Edit6.Text);
table1NDS.value:=StrToInt(Edit7.Tex t);

if table1BalansStoimost.Value<1 then form4.showmodal else if table1UslugyLizingodatelja.value<0 then form4.showmodal else if table1SrokEkspluatacii.Value<1 then form4.showmodal else if table1SrokDogovora.value<1 then form4.showmodal else if table1SrokDogovora.value>10 then form4.showmodal else if table1StavkaKredita.value<1 then form4.showmodal else if table1KomissijaLizingodatelja.value <1 then form4.showmodal else if table1NDS.value<1 then form4.showmodal else
begin

table1AO1.value:=table1BalansStoimo st.Value/table1SrokEkspluatacii.Value;
table1PKR1.value:=(table1BalansStoi most.Value+table1BalansStoimost.Val ue-table1AO1.value)*table1StavkaKredit a.value/100;
table1KO1.value:=table1PKR1.value*1 00/table1StavkaKredita.value*table1Kom issijaLizingodatelja.value/100;
table1UL1.Value:=table1UslugyLizing odatelja.value;
table1V1.Value:=table1AO1.value+tab le1PKR1.value+table1KO1.value+table 1UL1.Value;
table1NDS1.Value:=table1V1.value*ta ble1NDS.Value/100;
table1I1.Value:=table1V1.Value+tabl e1NDS1.Value;

(Дальше идут аналогичные расчеты для последующих лет договора)

Проблема только в том, что, судя по всему, не производятся расчеты.
Кнопка "Рассчитать" нажимается без ошибок, но DBEditы (те что справа) пусты. При нажатии кнопки "Сохранить" вылетает ошибка "EDBEngine error with message 'Key violation'"

Я ничего не понимаю...
TuxoH вне форума Ответить с цитированием
Старый 08.01.2012, 18:25   #2
Mad_Cat
Made In USSR!
Старожил
 
Аватар для Mad_Cat
 
Регистрация: 01.09.2010
Сообщений: 3,657
По умолчанию

А вместо 100500 edit-ов справа СтрингГрид не проще использовать

Цитата:
Я ничего не понимаю...
Аналогично!!! Отформатируйте Код и вставьте с тегами
"...В жизни я встречал друзей и врагов.В жизни много всего перевидал.Солнце тело мое жгло, ветер волосы трепал,но я смысла жизни так и не узнал..."
(c) Юрий Клинских aka "Хой"
Mad_Cat вне форума Ответить с цитированием
Старый 08.01.2012, 18:56   #3
TuxoH
Новичок
Джуниор
 
Регистрация: 08.01.2012
Сообщений: 4
По умолчанию

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

Я исправил немного прогу. Убрал простые эдиты, вместо них вернул ДБЕдиты. теперь программа обращается к DataSource не на своей форме, а на Datasource на форме DataModule. Странно, но только в этом случае DBEdit активизируется. В общем, теперь все нормально вводится в DBEditы слева.
Код кнопки "Рассчитать":

procedure TForm2.Button1Click(Sender: TObject);
begin

//Проверка на правильность ввода
if datamodule3.table1BalansStoimost.Va lue<1 then form4.showmodal else if datamodule3.table1UslugyLizingodate lja.value<0 then form4.showmodal else if datamodule3.table1SrokEkspluatacii. Value<1 then form4.showmodal else if datamodule3.table1SrokDogovora.valu e<1 then form4.showmodal else if datamodule3.table1SrokDogovora.valu e>10 then form4.showmodal else if datamodule3.table1StavkaKredita.val ue<1 then form4.showmodal else if datamodule3.table1KomissijaLizingod atelja.value<1 then form4.showmodal else if datamodule3.table1NDS.value<1 then form4.showmodal else
begin

//Активирую таблицу
datamodule3.table1.Insert;

//Рассчет по формулам на первый год
datamodule3.table1AO1.value:=datamo dule3.table1BalansStoimost.Value/datamodule3.table1SrokEkspluatacii. Value; {Вот тут возникает ошибка "invalid floating point operation"}
datamodule3.table1PKR1.value:=(data module3.table1BalansStoimost.Value+ datamodule3.table1BalansStoimost.Va lue-datamodule3.table1AO1.value)*datamo dule3.table1StavkaKredita.value/100;
datamodule3.table1KO1.value:=datamo dule3.table1PKR1.value*100/datamodule3.table1StavkaKredita.val ue*datamodule3.table1KomissijaLizin godatelja.value/100;
datamodule3.table1UL1.Value:=datamo dule3.table1UslugyLizingodatelja.va lue;
datamodule3.table1V1.Value:=datamod ule3.table1AO1.value+datamodule3.ta ble1PKR1.value+datamodule3.table1KO 1.value+datamodule3.table1UL1.Value ;
datamodule3.table1NDS1.Value:=datam odule3.table1V1.value*datamodule3.t able1NDS.Value/100;
datamodule3.table1I1.Value:=datamod ule3.table1V1.Value+datamodule3.tab le1NDS1.Value;

//Рассчет на второй год. Все просто. Если рассчитывается лишь на 1 год, все значения для 2+ года равны нулю.
if datamodule3.table1SrokDogovora.valu e<2 then datamodule3.table1AO2.value:=0 else
datamodule3.table1AO2.value:=datamo dule3.table1AO1.value;
if datamodule3.table1SrokDogovora.valu e<2 then datamodule3.table1PKR2.Value:=0 else
datamodule3.table1PKR2.Value:=((dat amodule3.table1BalansStoimost.Value-datamodule3.table1AO1.value)+(datam odule3.table1BalansStoimost.Value-datamodule3.table1AO1.value-datamodule3.table1AO2.value))*datam odule3.table1StavkaKredita.value/100;
if datamodule3.table1SrokDogovora.valu e<2 then datamodule3.table1KO2.value:=0 else
datamodule3.table1KO2.value:=datamo dule3.table1PKR2.value*100/datamodule3.table1StavkaKredita.val ue*datamodule3.table1KomissijaLizin godatelja.value/100;
if datamodule3.table1SrokDogovora.valu e<2 then datamodule3.table1UL2.value:=0 else
datamodule3.table1UL2.Value:=datamo dule3.table1UslugyLizingodatelja.va lue;
if datamodule3.table1SrokDogovora.valu e<2 then datamodule3.table1V2.Value:=0 else
datamodule3.table1V2.Value:=datamod ule3.table1AO2.value+datamodule3.ta ble1PKR2.value+datamodule3.table1KO 2.value+datamodule3.table1UL2.Value ;
if datamodule3.table1SrokDogovora.valu e<2 then datamodule3.table1NDS2.Value:=0 else
datamodule3.table1NDS2.Value:=datam odule3.table1V2.value*datamodule3.t able1NDS.Value/100;
if datamodule3.table1SrokDogovora.valu e<2 then datamodule3.table1I2.Value:=0 else
datamodule3.table1I2.Value:=datamod ule3.table1V2.Value+datamodule3.tab le1NDS2.Value;

Ошибку 'Кеy violation' исправил, перестроив таблицу БД. Там была ошибка.

Не могу понять причину ошибки "invalid floating point operation". Деления на ноль нет, это точно. Типы данных, участвующих в расчетах, в таблице указаны как Number.

Последний раз редактировалось TuxoH; 08.01.2012 в 18:59.
TuxoH вне форума Ответить с цитированием
Старый 08.01.2012, 19:09   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Деления на ноль нет, это точно
На основании чего такая уверенность? В отладке смотрели значение знаменателя в той операции деления?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 08.01.2012, 19:13   #5
TuxoH
Новичок
Джуниор
 
Регистрация: 08.01.2012
Сообщений: 4
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
На основании чего такая уверенность?
Деление идет на datamodule3.table1SrokEkspluatacii. Value. Я его ввожу через DBEdit, программа его принимает.

Добавление:
Направив указатель на "value" любой записи, вижу "datamodule3.table1любоеполе.va lue = 0"
Интересно...

Добавление:
Убрал строку "datamodule3.table1.Insert;"
Но добавил навигатор. Если начать "+" и потом уже кнопку расчета, то все в порядке. Можно, конечно, добавить кнопку типа "готовность к расчету", но по-моему немного глупо...

Последний раз редактировалось TuxoH; 08.01.2012 в 19:23.
TuxoH вне форума Ответить с цитированием
Старый 08.01.2012, 19:24   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А чего интересного? Insert в таблицу сделали и ожидаете, что по щучьему велению там данные появятся
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 08.01.2012, 19:31   #7
TuxoH
Новичок
Джуниор
 
Регистрация: 08.01.2012
Сообщений: 4
По умолчанию

Ну Insert же это создание новой записи. Еще пустой... вернуться к обычным Edit. Или все-таки сделать кнопку.
TuxoH вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ввод данных через форму hamlook Microsoft Office Excel 9 24.03.2013 17:11
ввод данных через форму kelt-222 Microsoft Office Excel 28 20.09.2011 23:58
Ввод данных через DBGrid postaveche БД в Delphi 6 19.12.2010 15:48
ввод данных через форму brans Microsoft Office Excel 16 22.10.2010 18:32