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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.08.2011, 23:35   #1
Asblue
Пользователь
 
Аватар для Asblue
 
Регистрация: 21.10.2010
Сообщений: 78
Лампочка Запрос на обновление строки в таблице

Здравствуйте!
Есть 2 таблицы:
prihod ([N], [Наименование], [Цена], [Количество]) и
tovar ([Id товара], [Наименование], [Цена], [Количество], [N])

"Приход товара" заполняем товаром и записи переносятся в "Базу товара".
Если придёт товар с таким же наименованием и ценой, который уже есть в Базе товара, нужно, чтобы прибавлялось только количество.
(Например Стол за 1000 р. уже есть - 2 шт., пришло ещё 3, значит надо, чтоб в базу не добавилась новая запись, а в количестве Стола стало 5).
Помогите с запросом. Пыталась что-то написать, но получается подобная муть...

Код:
IF (INSERT INTO tovar ([Наименование],[Цена]) SELECT ([Наименование],[Цена]) FROM prihod 
WHERE tovar.[Наименование]=prihod.[Наименование] AND tovar.[Цена]=prihod.[Цена])
BEGIN
UPDATE tovar
SET [Количество].........
WHERE tovar.[Наименование]=prihod.[Наименование] AND tovar.[Цена]=prihod.[Цена]
............


Т.е. иначе говоря, если
prihod.[Наименование]=tovar.[Наименование] и
prihod.[Цена]=tovar.[Цена],
надо чтобы запись в таблицу tovar не добавлялась, а только изменялось поле [Количество]:
tovar.[Количество]=tovar.[Количество]+prihod.[Количество]
Asblue вне форума Ответить с цитированием
Старый 05.08.2011, 09:49   #2
Gulik
Холост/Не замужем
Форумчанин
 
Аватар для Gulik
 
Регистрация: 13.11.2007
Сообщений: 283
По умолчанию

Записи в таблицу ПРИХОД тебе в любом случае нужно добавлять (так будет удобнее), а отображать уже все эти записи можно при помощи группировки

Код:
SELECT
  [Наименование],
  [Цена],
  Sum([Количество]) as SKol
FROM
  prihod
GROUP BY
  [Наименование],
  [Цена],
  [Количество]
Gulik вне форума Ответить с цитированием
Старый 05.08.2011, 10:56   #3
Asblue
Пользователь
 
Аватар для Asblue
 
Регистрация: 21.10.2010
Сообщений: 78
По умолчанию

Спасибо
Но задача состоит не в этом.
Есть 2 ТАБЛИЦЫ: prihod и tovar.
Добавление строк в приход происходит обычным запросом
Код:
SELECT * FROM prihod
или
Код:
SELECT N, Наименование, Цена, Количество FROM prihod
Нужно в таблицу tovar добавлять данные из таблицы prihod, а именно Наименование, Цена, Количество.
Если записи, которые мы хотим добавить из prihod в tovar уже есть, а именно
prihod.[Наименование]=tovar.[Наименование] и prihod.[Цена]=tovar.[Цена]
(это всё уже было описано выше), то тогда в таблицу tovar не добавляем новую запись, а только добавляем количество.
Так это всё должно выглядеть:

Эту запись хотим добавить в таблицу tovar:

prihod
|_Наименование_|_Цена_|_Количество_ |
|__Табуретка___|_2000_|______7_____ |


Но в таблице tovar уже есть Табуретка за 2000 р., но только 3 шт.
tovar
| Табуретка | 2000 | 7 |

Значит после добавления записи из prihod в tovar, запись в таблице tovar должна выглядеть так:
tovar
| Табуретка | 2000 | 10 |
, т.е. к количеству в tovar приплюсуется количество из prihod.

А запрос обычной вставки из prihod в tovar такой:
Код:
INSERT INTO tovar ([Наименование], [Цена], [Количество]) SELECT [Наименование], [Цена], [Количество] FROM prihod
Вот надо, чтобы, если поля [Наименование] и [Цена] обоих таблиц равны, то изменялось (добавлялось/обновлялось) только [Количество].

Последний раз редактировалось Stilet; 05.08.2011 в 20:54.
Asblue вне форума Ответить с цитированием
Старый 05.08.2011, 11:13   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Если ваша СУБД поддерживает триггера, то в триггере на вставку в Prihod это можно спокойно реализовать. Можно через пользовательскую процедуру (опять же, если поддерживается) реализовать вставку в Prihod и соответствуюзее обновление Tovar. Иначе решайте программно
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 05.08.2011, 12:16   #5
KAMENYKA
Пользователь
 
Аватар для KAMENYKA
 
Регистрация: 06.12.2007
Сообщений: 87
По умолчанию

Код:
DECLARE @Col INT

IF EXISTS(SELECT * FROM tovar 
                        INNER JOIN prihod ON prihod.[Наименование]=tovar.[Наименование] AND prihod.[Цена]=tovar.[Цена]) BEGIN

	SET @Col = SELECT TOP(1) [Коллисчество] FROM prihod WHERE prihod.[Наименование] = значение AND prihod.[Цена]= значение
	UPDATE tovar SET [Колличество] = [Колличество] + @Col WHERE tovar.[Наименование] = значение AND tovar.[Цена]= значение 

END ELSE BEGIN
	--Обычный Insert
END
Писал тут могут быть синтаксические ошибки. На будущее милая девушка называйте поля латинскими буквами(можно даже транслитом), во первых это удобнее не надо переключаться постоянно между языками при написании запроса + избавляет от квадратных скобок, а также в будущем при написании сложных проектов могут возникнуть большие трудности с названием полей на русском! Удачи в начинания будут вопросы пишете!

P.S Полностью согласен с высказыванием Gulik так делать лучше и правильней, так как если вам нужны будут сложные отчеты могут возникнуть трудности, но дело ваше!
KAMENYKA вне форума Ответить с цитированием
Старый 05.08.2011, 15:04   #6
Gulik
Холост/Не замужем
Форумчанин
 
Аватар для Gulik
 
Регистрация: 13.11.2007
Сообщений: 283
По умолчанию

Вот накидал тебе пример...

Скачать
Gulik вне форума Ответить с цитированием
Старый 05.08.2011, 20:48   #7
Asblue
Пользователь
 
Аватар для Asblue
 
Регистрация: 21.10.2010
Сообщений: 78
По умолчанию

KAMENYKA, спасибо большое )) Согласна, что удобней писать латинскими буквами, но преподаватель просит русские...
Gulik, ооо, спасибо за пример! ))
Всем спасибо!

KAMENYKA, вот в этих строках, там где слово "значение", так и должно быть или там вписать какое-то значение?
Код:
SET @Col = SELECT TOP(1) [Количество] FROM prihod WHERE prihod.[Наименование] = значение AND prihod.[Цена]= значение
	UPDATE tovar SET [Количество] = [Количество] + @Col WHERE tovar.[Наименование] = значение AND tovar.[Цена]= значение
Если там нужно написать какие-то конкретные данные, то запрос будет работать ограничено лишь для этих данных... или я не понимаю О_о
И ещё на первой строке из этих двух выдает ошибку:
Incorrect syntax near the keyword 'SELECT'.

Последний раз редактировалось Stilet; 06.08.2011 в 11:21.
Asblue вне форума Ответить с цитированием
Старый 06.08.2011, 11:22   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

TOP(1) замени на просто TOP 1

P.S. СУБД нужно указывать.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 07.08.2011, 00:56   #9
Asblue
Пользователь
 
Аватар для Asblue
 
Регистрация: 21.10.2010
Сообщений: 78
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
TOP(1) замени на просто TOP 1

P.S. СУБД нужно указывать.
Дело не в TOP 1...
СУБД - MS SQL Server
Asblue вне форума Ответить с цитированием
Старый 07.08.2011, 01:27   #10
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

1. SELECT TOP 1 @Col=[Количество] FROM prihod WHERE prihod.[Наименование] = значение AND prihod.[Цена]= значение
2. значение из вставляемой записи прихода

ADD - вариант для вставки, проще пожалуй не придумать
Код:
DECLARE @Col INT,
        @Cena int,
        @Naim varchar
SET @Col=5   -- количество
SET @Cena=15 -- цена - скорее всего у вас не int, а numeric(9,2) или нечто в этом роде
SET @Naim='Тра-ля-ля' -- наименование

INSERT INTO prihod ([Наименование],[Цена],[Количество]) VALUES (@Naim,@Cena,@Col)
IF EXISTS(SELECT * FROM tovar WHERE [Наименование]=@Naim AND [Цена]=@Cena)
  UPDATE tovar SET [Количество]=[Количество]+@Col WHERE [Наименование]=@Naim AND [Цена]=@Cena
ELSE
  INSERT INTO tovar ([Наименование],[Цена],[Количество]) VALUES (@Naim,@Cena,@Col)
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 07.08.2011 в 12:11.
Аватар вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
автоматическое обновление таблице через запрос sql eda Microsoft Office Excel 8 19.04.2011 12:47
Обновление записей в таблице ua3pno Microsoft Office Access 4 20.02.2011 19:56
запрос на обновление!!!!! Andel 013 Microsoft Office Access 2 23.12.2010 23:06
Обновление данных в сводной таблице Tolikv Microsoft Office Excel 13 11.06.2010 14:54
Обновление данных в основной таблице из выделенных ячеек дополнительной semjenion Microsoft Office Excel 6 09.04.2010 17:52