ahmed yousif Ответов: 1

Как я могу построить этот запрос обновления SQL server ? ! ! ! пожалуйста, помогите мне


Дорогие все
я сталкиваюсь с трудностями при построении одного запроса обновления sql
у меня есть одна таблица(stock_table), содержащая три столбца следующим образом (item_id,box, loose)
item_id, char(5)
box, smallint ==> представляет собой количество запасов для item_id (полная коробка)
loose, smallint ==> представляют собой количество запасов для item_id (loose), например item_id - это медицина
--------------------------------------
другая таблица-это таблица продаж,содержащая также ту же коробку, свободные столбцы
--------------------------------------
предположим, что у меня есть запас от одного товара следующим образом
item_id = 10000
коробка = 3 (одна коробка содержит три полоски, каждая полоска 10 таблеток, то есть: 3x10)
свободные = 0
--------------------------------------
мой вопрос таков:
если я продал только свободную одну полосу, то оставшийся запас должен быть (коробка = 2, свободная = 20)
как я могу этого достичь ????
К вашему сведению, я использую sql database + visual basic windows application
Спасибо и с уважением

Что я уже пробовал:

через хранимую процедуру:
обновление dbo.stock_table
= бокс-сет бокс - @б,
свободный = свободная - @с
где item_id = @a (@b,@c ==> - проданные количества)

однако это работает,
оставшиеся количества ia не верны

1 Ответов

Рейтинг:
2

OriginalGriff

Я не могу отделаться от мысли, что вы идете по этому неверному пути: схема, которую вы описываете, работает только в том случае, если все продукты поставляются в коробках из трех полосок по 10 предметов - а в реальном мире это обычно не так. Лекарства, например, часто выпускаются в виде полосок по семь, десять, четырнадцать, двадцать восемь или тридцать одна, и упаковываются в две, три или четыре полосы в зависимости от "нормального" количества доз в день.

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

Я бы посоветовал вам переосмыслить это и включить уровни запасов полос и коробок, а также количество полос и коробок "содержит" :

item_id = 10000
description = "Something shiny"
BoxContains = 3
StripContains = 10
BoxCnt = 3
StripCnt = 0
А затем напишите свой SP, чтобы принять "общее количество проданных" и использовать эти цифры для обновления базы данных.

В конечном счете, это будет намного меньше проблем ...


ahmed yousif

Дорогой originalgriff,
спасибо за ваш ответ
я попробовал другой код следующим образом
теперь у меня есть три стола
all_medicines ==> содержит все медицинские данные
medicine_stock ==> инвентаризация лекарств
таблицы продаж ==> значения параметров
==========================================
создать ДБО тез.Докл.test_update
@a char(5),
@b smallint,
@c smallint
как
Обновление dbo.medicine_stock
Бокс-сет = medicine_stock.коробка - @б,
свободный = футляр
Когда loose > 0, то loose - @c
Когда loose = 0, то (box * all_medicines.box_content) - @c / all_medicines.box_content
Когда loose = 0, то all_medicines.box_content - @c
КОНЕЦ
От dbo.all_medicines
Внутреннее соединение dbo.medicine_stock
На dbo.all_medicines.medicine_id = dbo.medicine_stock.medicine_id
где dbo.medicine_id = @a;
-----------------------записка-------------------------------
столбец box_content из таблицы all_medicines представляет количество таблеток в коробке
этот код не работает
что же мне делать ??
заранее спасибо

OriginalGriff

"Это не работает", вероятно, самый бесполезный отчет о проблеме, который мы получаем - и мы получаем его много. Она ничего не говорит нам о том, что происходит или когда это происходит.
Итак, расскажите нам, что он делает, чего вы не ожидали, или не делает, что вы сделали.
Расскажите нам, что вы сделали, чтобы это произошло.
Сообщайте нам о любых сообщениях об ошибках.

Расскажите нам, что вы сделали, чтобы попытаться выяснить, почему - что отладчик показал вам, что происходит?

MadMyche

Внимательно посмотрите на ваше заявление о случае; у вас есть то же самое условие дважды:

loose = CASE
  WHEN loose>0 THEN loose - @c
  WHEN loose=0 THEN (box*all_medicines.box_content)- @c/all_medicines.box_content
  WHEN loose=0 THEN all_medicines.box_content - @c
END

ahmed yousif

после выполнения запроса он возвращает "0 затронутых строк", что означает, что ничего не изменилось в Столбцах запаса (нет никаких сообщений об ошибках)
то, что IAM ожидал,
* если я продал 1 полную коробку + 0 полосок==> только колонка коробки уменьшится на 1 ничего не случится с колонкой полосок
------------------------------------------------
* если бы я продал только 10 таблеток(одну полоску)==здесь есть две вероятности:

1 - если колонка полосок уже содержит запас из этого пункта, например, 10 таблеток
затем столбиковые полоски должны уменьшиться на 10 таблеток (Столбиковая коробка остается такой же, как есть)

2 - если колонка полос имеет 0 запаса для этого товара,например, у меня есть 3 коробки : 0 свободных
и я продал только 10 таблеток(одна полоска) теперь я хочу, чтобы запас был [2 коробки: 20 свободно]
----------------------------------записка-----------------------------------------
я заранее определил общее количество таблеток в каждой коробке (то есть: коробка из 30 таблеток,50 таблеток,....)
надеюсь, я объяснил свою проблему

OriginalGriff

И что это значит?
Почему запрос на обновление не влияет ни на какие строки?

Если вы подумаете об этом, то это очевидно: потому что нет никаких строк для изменения - предложение WHERE или JOIN не вернули никаких строк.
Поэтому посмотрите на значения, используйте SSMS для изменения обновления до SELECT и посмотрите, что именно возвращается - нет совпадающих строк, нечего обновлять.
У нас нет доступа к вашей базе данных, чтобы попробовать это!

ahmed yousif

как я могу загрузить свою базу данных sql??

OriginalGriff

Ты не можешь, и я не хочу этого!

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