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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.11.2013, 01:26   #21
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ну да, вроде бы, всё нормально...
если есть возможность, то попробуйте тип Short заменить на тип "Long Integer" (этот тип обозначается буквой I)

либо написать что-то вроде:
Код:
var t :  Smallint;
.....
t := StrToInt(Edit3.Text);
Query4.ParamByName('ItemID').AsInteger:= t;
t := StrToInt(Edit5.Text);
Query4.ParamByName('ItemCount').AsInteger := t;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 05.11.2013, 01:36   #22
W. Aron
Пользователь
 
Регистрация: 02.11.2011
Сообщений: 25
По умолчанию

Радость-счастье)
Сменил на "Long Integer", как Вы и сказали и вместо AsFloat написал AsInteger.
Все прекрасно работает и по выходу не сбрасывает.
Спасибо большое. Очень выручили)
Теперь буду писать добавление записи в случае когда такого товара нету.
Upd. Проведу проверку Table4.Locate по ID если истина то запрос обновления, иначе добавления.

Последний раз редактировалось W. Aron; 05.11.2013 в 01:55. Причина: Придумал как реализовать добавление.
W. Aron вне форума Ответить с цитированием
Старый 05.11.2013, 02:10   #23
Dozent
Форумчанин
 
Регистрация: 21.05.2008
Сообщений: 495
По умолчанию

эм простите я понимаю что ТС решил проблему, всю тему не прочитал но можно было сделать так,

Код:
	INSERT IGNORE INTO Storage(ItemID, ItemName, ItemCount) VALUES (:id, :name, 0);
	UPDATE `Storage` SET `ItemCount` = `ItemCount` + :Count WHERE ItemID= :id;
Предварительно выставить ключ на ади или на ади и имя, и ни надо никаких проверок писать сначало добавит итем с нулевым количеством если его нет а если есть то проапдейтит
Dozent вне форума Ответить с цитированием
Старый 05.11.2013, 08:22   #24
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Dozent Посмотреть сообщение
эм простите я понимаю что ТС решил проблему,
Код:
	INSERT IGNORE INTO Storage(ItemID, ItemName, ItemCount)
Paradox поддерживает Insert ignore ?! впервые про такое слышу!

а по поводу проверки - вроде бы уже разобрались, не нужна она. Если у Вас есть ID (кстати, Вы при вашем Insert какое ID поставите, откуда новый ID у Вас возьмётся в вашем случае?), то нужно делать Update, если запись нужна новая (ID нет), тогда нужно выполнять Insert. примерно так.



Цитата:
Сообщение от W. Aron Посмотреть сообщение
Upd. Проведу проверку Table4.Locate по ID если истина то запрос обновления, иначе добавления.
Погодите. Я не могу понять простой логики. Откуда у Вас берётся ID для новой записи?! Вы что, доверяете пользователю вводить/редактировать ID ?!! Это категорически противопоказано. Ключевые поля не должны вводится пользователем вручную (и уж тем более, редактироваться!!)!

Последний раз редактировалось Serge_Bliznykov; 05.11.2013 в 08:32.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 05.11.2013, 11:26   #25
W. Aron
Пользователь
 
Регистрация: 02.11.2011
Сообщений: 25
По умолчанию

Цитата:
Погодите. Я не могу понять простой логики. Откуда у Вас берётся ID для новой записи?! Вы что, доверяете пользователю вводить/редактировать ID ?!! Это категорически противопоказано. Ключевые поля не должны вводится пользователем вручную (и уж тем более, редактироваться!!)!
Пока что все выглядит так, как Вы и говорите (но разумеется ключевое не редактируется, а только добавляется).
Цитата:
Если у Вас есть ID, то нужно делать Update, если запись нужна новая (ID нет), тогда нужно выполнять Insert.
Вот поэтому мне и нужна проверка. Так как запросы находятся в разных Query, мне нужен механизм их вызова, которым и выступает Locate-проверка по ID. Выглядит все это вот так.
Код:
procedure TForm1.Button2Click(Sender: TObject);    {ДОБАВЛЕНИЕ ТОВАРА НА СКЛАД}
begin

 if (edit3.text = '') OR (edit4.text = '') OR (edit5.text = '') then
  Begin
   ShowMessage('Введены не все поля');
   Exit;
  end;

   If SearLog1=true then             {Если активен запрос на поиск...}
   Table4.DatabaseName:='Computer';
   DataSource4.DataSet:=Table4;
   Table4.Active:=True;

 if Table4.Locate('ItemID', Edit3.Text, []) then
  Begin

   Table4.Active:=False;
   Table4.DatabaseName:='';
   DataSource4.DataSet:=Query4;

   Query4.close;
   if not Query4.prepared then Query4.prepare;
   Query4.ParamByName('ItemID').AsInteger:=StrToInt(Edit3.Text);
   Query4.ParamByName('ItemCount').AsInteger:=StrToInt(Edit5.Text);
   Query4.ExecSQL;
   ShowMessage('Количество товара на складе успешно обновлено')
  End else

  Begin

   Table4.Active:=False;
   Table4.DatabaseName:='';
   DataSource4.DataSet:=Query5;

   Query5.close;
   if not Query5.prepared then Query5.prepare;
   Query5.ParamByName('ItemID').AsInteger:=StrToInt(Edit3.Text);
   Query5.ParamByName('ItemName').AsString:=Edit4.Text;
   Query5.ParamByName('ItemCount').AsInteger:=StrToInt(Edit5.Text);
   Query5.ExecSQL;
   ShowMessage('Товар успешно добавлен на склад')
  End;

 Table4.DatabaseName:='Computer';
 DataSource4.DataSet:=Table4;
 Table4.Active:=True;
 Edit3.Clear;
 Edit4.Clear;
 Edit5.Clear;
 SearLog1:=false;

end;

Последний раз редактировалось W. Aron; 05.11.2013 в 11:53. Причина: Ошибка при добавлении после поиска (исправил)
W. Aron вне форума Ответить с цитированием
Старый 05.11.2013, 11:38   #26
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

Цитата:
if Table4.Locate('ItemID', Edit3.Text, []) then
дальше можно не смотреть... все выкинуть и переписать
eval вне форума Ответить с цитированием
Старый 05.11.2013, 11:50   #27
W. Aron
Пользователь
 
Регистрация: 02.11.2011
Сообщений: 25
По умолчанию

Цитата:
дальше можно не смотреть... все выкинуть и переписать
То есть Вы знаете более удобный способ вызова запросов из двух разных Query?
Я повторюсь, для меня - это переключатель между запросами добавления к существующему и добавления всей записи. Он либо найдет такой ID (А он не автоинкрементный!!!), а значит вызовет Update, либо нет - а значит вызовет Insert.
Я нашел сайт, где описывается работа с автоинкрементными полями, и если потребуется, то изменю ключевое поле и соответственно код вызова запросов.

Upd. С другой стороны Этот Locate можно сдвинуть только на Insert. То есть пускай выполнится Update, а там есть запись или нет - пофиг. Но если записи нет, то вызвать Insert.

Последний раз редактировалось W. Aron; 05.11.2013 в 12:07. Причина: Как вариант...
W. Aron вне форума Ответить с цитированием
Старый 05.11.2013, 12:04   #28
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

Цитата:
А он не автоинкрементный!!!
это не важно инкрементный он или нет, важно откуда он берется, естественный или сурогатный.
eval вне форума Ответить с цитированием
Старый 05.11.2013, 12:14   #29
W. Aron
Пользователь
 
Регистрация: 02.11.2011
Сообщений: 25
По умолчанию

Пока что он вводится пользователем.
W. Aron вне форума Ответить с цитированием
Старый 05.11.2013, 13:15   #30
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

если эти действия интерактивны, то как правило пользователь сначала пробует найти то что надо отрелактировать. и уж тогда делает вывод о том новые данные или нет, если он заранее знает что их нет то локейт вовсе не нужен.

у вас же что-то происходит а юзер только догадывается, это както не логично и как следствие не юзабельно
eval вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
добавление товара в корзину через ajax moshkin_ura JavaScript, Ajax 8 14.10.2013 13:25
БД склад ZveR999 Microsoft Office Access 0 30.05.2012 15:40
Postgre: функция добавления товара на склад Blondy SQL, базы данных 2 07.01.2012 14:32
что и где нужно прописать чтобы при добавление одежды через форму на Delphi она отображалась в таблице склад студенточка! Помощь студентам 0 14.12.2011 16:35
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04