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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.11.2013, 23:02   #1
W. Aron
Пользователь
 
Регистрация: 02.11.2011
Сообщений: 25
По умолчанию Добавление товара на склад

Добрый вечер.
Задача такая: Имеется таблица (БД Paradox) storage с тремя полями - ItemID, ItemName, Count. И соответственно 3 Edit-а, где ввожу ID, название товара и его количество.
По нажатию на кнопку "Добавить" должен активироваться SQL-запрос на добавление указанного товара. Если этот товар есть на складе, то прибавить количество, указанное в Edit-е, иначе добавить товар на склад.
Использую Query, в св-ве SQL пишу вот этот запрос:
Код:
if exists (select * from storage where ItemName like :Itemname)
Begin
   Update storage
   Set Count = Count + :Count
   Where ItemName like :ItemName
End
Else Begin
   Insert Into storage (ItemID, ItemName, Count)
   Values (:ItemID, :ItemName, :Count)
End
Кнопка выглядит вот так:
Код:
procedure TForm1.Button2Click(Sender: TObject);
begin

 If SearLog2=false then
 Table4.Active:=False;
 Table4.DatabaseName:='';
 DataSource1.DataSet:=Query4;

 Query4.close;
 if not Query4.prepared then Query4.prepare;
 if (edit3.text<>'') AND(edit4.text <> '') AND (edit5.text<>'') then
 Begin
 Query4.ParamByName('ItemID').AsString := edit3.text;
 Query4.ParamByName('ItemName').AsString := edit4.text;
 Query4.ParamByName('Count').AsString := edit5.text;
 End else
 Begin
 ShowMessage('Введены не все данные');
 Exit;
 end;
 Query4.ExecSQL;
 Searlog2:=true;
end;
И вроде все верно, но при установке в Query Active в True возникает ошибка: Invalid use of keyword. Token: if Line Number:1
В чем может быть проблема и как ее исправить?
W. Aron вне форума Ответить с цитированием
Старый 03.11.2013, 23:23   #2
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,022
По умолчанию

в том что вы попутали северный берег южного моря с южным берегом северного моря..

откуда в LocalSQL взялись все эти выкрутасы с ифом и экзистом?
eval вне форума Ответить с цитированием
Старый 03.11.2013, 23:27   #3
W. Aron
Пользователь
 
Регистрация: 02.11.2011
Сообщений: 25
По умолчанию

Ну учитывая, что я в этом не разбираюсь...
И как тогда оформить это в запрос?
W. Aron вне форума Ответить с цитированием
Старый 04.11.2013, 00:29   #4
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,022
По умолчанию

делайте 3 запроса
eval вне форума Ответить с цитированием
Старый 04.11.2013, 00:41   #5
W. Aron
Пользователь
 
Регистрация: 02.11.2011
Сообщений: 25
По умолчанию

А можно поподробней пожалуйста?
Хотя бы на словах.
W. Aron вне форума Ответить с цитированием
Старый 04.11.2013, 12:19   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

1-й запрос:
Код:
select count(*) as cntA from storage where ItemName like :Itemname
потом в коде проверяете, чему равно cntA (QueryCheck.FieldByName('cntA').AsI nteger)
если равно нулю (значит, записей нет) и выполняете запрос вставки:
Код:
Insert Into storage (ItemID, ItemName, Count)
   Values (:ItemID, :ItemName, :Count)
иначе, если cntA не равно нулю (кстати, подумайте, что будет, если в таблице будет несколько записей с одинаковым ItemName )
тогда выполняете запрос на обновление данных:
Код:
Update storage
   Set Count = Count + :Count
   Where ItemName like :ItemName
теперь стало немножко понятнее?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 04.11.2013, 14:48   #7
W. Aron
Пользователь
 
Регистрация: 02.11.2011
Сообщений: 25
По умолчанию

Ну вроде немного понял...
Долго мучился, что значит "as cntA". Хех, просто выполнил запрос и стало понятно))
Отвечая на Ваш вопрос о одинаковых записях ItemName, могу сказать, что в таком случае на мой взгляд надо добавить проверку и по ItemID (ID точно будут у записей разные). Но я решил не усложнять себе проблему и сделать поиск только по имени.
Хотя в этом случае там только надо сделать вот так, да?
Код:
select count(*) as cntA from storage where (ItemName like :Itemname) And (ItemId like :Itemid)
Думаю сейчас это последний вопрос, после чего буду писать код добавления.

Каким образом можно добавить в Query несколько запросов, и использовать при этом и Table и один DBGrid?
Пробовал через Query.SQL.Add но ничего не выходило. И в итоге построил запросы в другой таблице на двух компонентах Query(1-поиск клиента, 2-удаление) и логике (логика переключала DataSource.DataSet между таблицей и двумя Query).

Последний раз редактировалось W. Aron; 04.11.2013 в 14:58.
W. Aron вне форума Ответить с цитированием
Старый 04.11.2013, 20:36   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Хотя в этом случае там только надо сделать вот так, да?
Код:
select count(*) as cntA from storage where (ItemName like :Itemname) And (ItemId like :Itemid)
так. стопе.
Откуда у Вас взялся ItemID ?!
У Вас что, есть значение КЛЮЧЕВОГО поля?!!
Тогда вообще непонятно, что Вы городите.
Ибо.
первое. Если у Вас есть уникальный ключик, то зачем Вам проверка?! У Вас УЖЕ есть ключ нужной записи, зачем её ещё раз искать?!

второе. о каком Insert может идти речь, если у Вас есть ключевое поле? Insert в вашем случае не может быть!

ну и третье.
ключевое поле однозначно определяет нужную запись (на то оно и ключевое).
поэтому никаких ItemName like не нужно. ну и ключевое поле тоже без LIKE пишите - это (в общем случае) более эффективно:
Код:
   Update storage
   Set Count = Count + :Count
   Where ItemId = :Itemid

Цитата:
Каким образом можно добавить в Query несколько запросов, и использовать при этом и Table и один DBGrid?
никак. в одном Query в каждый конкретный момент может быть только один запрос.

Последний раз редактировалось Serge_Bliznykov; 04.11.2013 в 20:38.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 04.11.2013, 21:35   #9
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,022
По умолчанию

Цитата:
Но я решил не усложнять себе проблему и сделать поиск только по имени.
если привести аналогию то у вас получилось так, что: вам надо доставить посылку Иванову Ивану Ивановичу, и у вас есть точный адрес его, но вы посыльному не дали адрес а только имя и сказали побыстрому доставить, ну и вот он уже 3 неделю доставить не может.
eval вне форума Ответить с цитированием
Старый 04.11.2013, 23:02   #10
W. Aron
Пользователь
 
Регистрация: 02.11.2011
Сообщений: 25
По умолчанию

Цитата:
Откуда у Вас взялся ItemID ?!
У Вас что, есть значение КЛЮЧЕВОГО поля?!!
Да, у меня есть ключевое поле, правда я не сделал его автоинкрементным(если это существенно). В этом случае Insert тоже не нужен? Как тогда добавить товар если такого нет на складе?
Кстати попробовал запрос Update. Почему-то жалуется на Count. Что забавнее всего - если Select'ом по очереди выдергивать столбцы, то только на нем выскакивает ошибка "Invalid use of keyword. Token: from".Попробую изменить название столбца... правда не знаю поможет ли...
Upd. Помогло.

Последний раз редактировалось W. Aron; 04.11.2013 в 23:05.
W. Aron вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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