С Новым годом! Форум программистов, компьютерный форум, киберфорум
Microsoft Access
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.91/47: Рейтинг темы: голосов - 47, средняя оценка - 4.91
0 / 0 / 0
Регистрация: 17.01.2020
Сообщений: 18

Автокоррекция значений в одной таблице при добавлении записи в другую

17.01.2020, 14:58. Показов 9435. Ответов 51

Студворк — интернет-сервис помощи студентам
Привет всем.

Основной вопрос вот какой. У меня есть таблица наличия товаров, и таблица продаж.
Хочется сразу после добавления новой продажи, автоматически уменьшать количество товаров в наличии.
При этом я совершенно не понимаю что делать если вдруг, допустим продавец ошибся при заполнении, и заполнил что продал 3 единицы товара, вместо скажем 2, а потом исправит на 2. Получится, что количество в наличии сначала должно уменьшиться на 3, после добавления новой записи, а потом должно будет увеличится на 1, после исправления продавцом. В общем весьма странная логика получается.... Я так понимаю нужен VBA и на евенты куда то хендлеры навешивать.

И второй вопрос, возможно ли принять поля от формы, сформировать из них данные, сгруппировать их как-то и распихать по разным таблицам? Я так понимаю это только VBA возможно? Если да, то может есть пример как это делать?

Использую ms Access 2016.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.01.2020, 14:58
Ответы с готовыми решениями:

Изменение записи в таблице при добавлении записи в другую таблицу
Есть две таблицы TProduct(товары) и TIncoming(приход) с полями "наименование" и "количество". Нужно, чтобы при добавлении строки в...

Автоматическое заполнение одной таблицы при добавлении записи в другую
Здравствуйте! Подскажите,возможно ли в mssql 206 реализовать такую штучку,при добавление записей в одну таблицу,определенные поля...

Ошибка запроса при добавлении записи из одной таблицы в другую
Доброго времени суток! Добавляю записи из одной таблицы в другую через кнопку на форме. ДЛЯ ПОНИМАНИЯ!!! Все завязано на одной таблице...

51
Эксперт MS Access
 Аватар для alvk
7459 / 4592 / 302
Регистрация: 12.08.2011
Сообщений: 14,380
17.01.2020, 15:21
В любом учёте всегда есть поступление и списание, либо вы их храните в одной таблице с разным типом операции (поступление/списание), либо вы храните данные в двух таблицах - поступление и списание. Никакие остатки никогда не хранятся в системах учёта, остатки рассчитываются: приход - расход = остаток.
Это всё независимо от программного продукта, которым вы пользуетесь. Можете вообще пользоваться тетрадкой в клеточку.
0
 Аватар для VinniPuh
9127 / 6127 / 593
Регистрация: 27.03.2013
Сообщений: 19,969
17.01.2020, 15:33
alvk, хотелось бы уточнить некоторую неясность.
А остатки расчитываются прям в таблице или всё-таки в запросе?
0
0 / 0 / 0
Регистрация: 17.01.2020
Сообщений: 18
17.01.2020, 15:45  [ТС]
остатки рассчитываются: приход - расход = остаток.

Боюсь что в случае супермаркета детальная таблица расхода (каждая покупка), будет очень большой, и как результат будут жёсткие тормоза, при попытке найти разницу.

И все-таки, решаема ли задача с корректировкой?
0
 Аватар для VinniPuh
9127 / 6127 / 593
Регистрация: 27.03.2013
Сообщений: 19,969
17.01.2020, 17:14
Лучший ответ Сообщение было отмечено misterx527 как решение

Решение

Цитата Сообщение от VinniPuh Посмотреть сообщение
...А остатки расчитываются прям в таблице или всё-таки в запросе?...
Цитата Сообщение от misterx527 Посмотреть сообщение
...остатки рассчитываются: приход - расход = остаток...
Похоже у вас с терминологией совсем не густо.
Ну да ладно.
Пока Алвик спит и видит первый сон у себя в час ночи, немного подсоблю на примере, а то вы свой то не выложили.
Вот нашел у себя в закромах и сусеках старенький примерчик.
Попробуйте с ним поработать, повводить данные, вникнуть и осознать логику работы БД и почему так делается, а не этак.
А с утра, отдохнувший и выспавшийся Алвик, вам скорее всего, что то посоветует.
Вложения
Тип файла: rar Движение Товара-05.rar (68.4 Кб, 200 просмотров)
0
Эксперт MS Access
 Аватар для alvk
7459 / 4592 / 302
Регистрация: 12.08.2011
Сообщений: 14,380
17.01.2020, 17:24
Цитата Сообщение от VinniPuh Посмотреть сообщение
А остатки расчитываются прям в таблице или всё-таки в запросе?
С чего вдруг неясность? Я конкретно всё написал.
Цитата Сообщение от misterx527 Посмотреть сообщение
и как результат будут жёсткие тормоза, при попытке найти разницу.
Откуда такая уверенность?

Добавлено через 6 минут
Кстати можно хранить остатки в отдельной таблице на начало месяца и в расчётах использовать её. Тогда даже на Celeron 333 тормозить не будет.

Добавлено через 4 минуты
И последний вопрос: кому нужно видеть ежедневно остатки по всем товарам сразу?
0
 Аватар для VinniPuh
9127 / 6127 / 593
Регистрация: 27.03.2013
Сообщений: 19,969
17.01.2020, 17:30
alvk, про запрос с расчетом не было ни слова, вот и предположил, что ты его просто подразумевал как само собой разумеющееся и упоминание в суе про него, не заслуживает внимания, но нам начинающим, обычно нужно что бы раздевали и в рот положили.
И как видимо был прав, ибо ответ ТСа, весьма забавен и про запросы он похоже даже не слышал ни когда.
0
Эксперт MS Access
 Аватар для ltv_1953
17536 / 7288 / 1663
Регистрация: 21.06.2012
Сообщений: 13,957
17.01.2020, 17:41
Расчет запросом остатков всех товаров на миллионе записей около минуты. При таком времени нет гарантий, что рассчитанный остаток будет истинным (записи после расчета могли быть добавлены/удалены/изменены другим пользователем). В реальных системах надежнее хранить остатки в отдельной таблице и использовать функции с использованием SEEK. Пример такой функции здесь Автоматическое изменение количества в одной таблице при выборе позиции из другой таблицы.
0
0 / 0 / 0
Регистрация: 17.01.2020
Сообщений: 18
17.01.2020, 19:30  [ТС]
Цитата Сообщение от VinniPuh Посмотреть сообщение
Похоже у вас с терминологией совсем не густо.
Ну... как бы... это... я ж процетировал...

за движение товара отдельное спасибо, посмотрю.

Цитата Сообщение от VinniPuh Посмотреть сообщение
И как видимо был прав, ибо ответ ТСа, весьма забавен и про запросы он похоже даже не слышал ни когда.
Почему забавен? Я слышал про запросы. Просто мне казалось правильным каждый раз поправлять сравнительно небольшую таблицу с ассортиментом каждый раз, чем пересчитывать разность прихода и расхода один раз в сутки. Я думал, о том, что может быть по другому организовать БД нужно, но 1) я не знаю как это сделать правильно 2) всё-таки интересно как можно сделать ввод и коррекцию полей более гибкой.

Цитата Сообщение от alvk Посмотреть сообщение
Откуда такая уверенность?
Я так полагаю что зависит от количества продаж. Я неправ?
Представьте, что вы идёте в супермаркет. Покупаете молоко, хлеб, яйца, мороженное, минеральную воду, жвачку.
Каждая из этих позиций - это запись в таблице покупок. Поэтому только на одного человека было потрачено 6 записей в таблице. Пусть в магазине 4 кассы и среднее время обслуживания клиентов 1 мин. Допустим работает магазин с 8 до 20:00. Итого имеем 6*4кассы*60мин*12часов = 17280 записей в день. это около полумиллиона в месяц. Это по очень грубым прикидкам. Может это и не беда. Не знаю. Поэтому я здесь

Цитата Сообщение от alvk Посмотреть сообщение
И последний вопрос: кому нужно видеть ежедневно остатки по всем товарам сразу?
я предполагал, что тот кто в магазе, отвечает за поставку товаров, должен в начале каждого следующего дня проверять чего в магазине не достаёт и заказывать товар. Как то так. А зачем ещё нужно знать про остатки?

Цитата Сообщение от ltv_1953 Посмотреть сообщение
Расчет запросом остатков всех товаров на миллионе записей около минуты. При таком времени нет гарантий, что рассчитанный остаток будет истинным
Да, я тоже думал над этим, но в супермаркете это наверное не сильно принципиально. Примерные данные нужны с утра, чтобы сделать заказ недостающего товара. Однако для интернет магазина это весьма актуально. Чтобы показывать пользователю сколько того или иного товара осталось и не допустить заказа товара, который кончился.

Цитата Сообщение от alvk Посмотреть сообщение
Кстати можно хранить остатки в отдельной таблице на начало месяца и в расчётах использовать её. Тогда даже на Celeron 333 тормозить не будет.
Вот здесь поподробнее, как это? То есть будет некий запрос, который мы будем запускать один раз в месяц и он будут выполнять пересчет и создание таблицы? Или как?

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

Добавлено через 8 минут
Цитата Сообщение от ltv_1953 Посмотреть сообщение
Пример такой функции здесь Автоматическое изменение количества в одной таблице при выборе позиции из другой таблицы.
Не подскажете на какое событие и каким образом повесить этот VBA скрипт?
0
Эксперт MS Access
 Аватар для alvk
7459 / 4592 / 302
Регистрация: 12.08.2011
Сообщений: 14,380
18.01.2020, 05:41
Цитата Сообщение от misterx527 Посмотреть сообщение
я предполагал, что тот кто в магазе, отвечает за поставку товаров, должен в начале каждого следующего дня проверять чего в магазине не достаёт и заказывать товар. Как то так. А зачем ещё нужно знать про остатки?
Прочтите ещё раз мой вопрос, я не спрашивал про остатки, я спрашивал что? Вот на это и ответьте.

кому нужно видеть ежедневно остатки по всем товарам сразу?

Я считаю, что таких людей в природе нет, пусть один-два, ну страница хотя бы, но чтобы тысячи!

Цитата Сообщение от misterx527 Посмотреть сообщение
проект некоммерческий, это мой курсовой
Тогда вообще можно не заморачиваться таблицей. Делайте расчёт в запросе.

Цитата Сообщение от ltv_1953 Посмотреть сообщение
Расчет запросом остатков всех товаров на миллионе записей около минуты. При таком времени нет гарантий, что рассчитанный остаток будет истинным
В начале каждого дня до открытия или в конце после закрытия. Продаж нет, а значит результат истинный.
Если речь идёт о крупном супермаркете, то у него явно не тарантайка из 1999 года, а полноценный сервер, расчёт несольких миллионов записей = 4 секунды.
0
0 / 0 / 0
Регистрация: 17.01.2020
Сообщений: 18
18.01.2020, 09:04  [ТС]
Цитата Сообщение от alvk Посмотреть сообщение
Прочтите ещё раз мой вопрос, я не спрашивал про остатки, я спрашивал что? Вот на это и ответьте.
кому нужно видеть ежедневно остатки по всем товарам сразу?
Отвечаю ещё раз: тому кто отвечает за поставку товаров в магазин.
0
Эксперт MS Access
 Аватар для alvk
7459 / 4592 / 302
Регистрация: 12.08.2011
Сообщений: 14,380
18.01.2020, 11:58
Цитата Сообщение от misterx527 Посмотреть сообщение
Отвечаю ещё раз: тому кто отвечает за поставку товаров в магазин.
А я уже сказал, что таких людей не существует:
Цитата Сообщение от alvk Посмотреть сообщение
таких людей в природе нет, пусть один-два, ну страница хотя бы, но чтобы тысячи!
Компьютер только может с таким справиться или искусственный интеллект. Человек тысячи товаров смотреть одновременно не может!
0
0 / 0 / 0
Регистрация: 17.01.2020
Сообщений: 18
18.01.2020, 12:37  [ТС]
Цитата Сообщение от alvk Посмотреть сообщение
Компьютер только может с таким справиться или искусственный интеллект. Человек тысячи товаров смотреть одновременно не может!
Зачем тысячи? Пусть аксесс обрабатывает тысячные списки всех товаров и выдаёт десятки тех которых нет в наличии. А с парой десятков человек думаю справится.
0
Модератор
Эксперт MS Access
6231 / 2909 / 707
Регистрация: 12.06.2016
Сообщений: 7,839
18.01.2020, 13:20
Лучший ответ Сообщение было отмечено misterx527 как решение

Решение

Цитата Сообщение от misterx527 Посмотреть сообщение
При этом я совершенно не понимаю что делать если вдруг, допустим продавец ошибся при заполнении, и заполнил что продал 3 единицы товара, вместо скажем 2, а потом исправит на 2.
Получится, что количество в наличии сначала должно уменьшиться на 3, после добавления новой записи,
а потом должно будет увеличится на 1, после исправления продавцом.
В общем весьма странная логика получается
Одним действием можно - просто прибавить разницу между старым значением и новым.
Эта разница может быть и отрицательной.
Имена здесь русские, чтобы долго не объяснять.
Visual Basic
1
2
3
4
5
Private Sub СколькоПродано_AfterUpdate()
 If Nz(СколькоПродано.OldValue) <> Nz(СколькоПродано) Then
  Остаток = Остаток + (Nz(СколькоПродано) - Nz(СколькоПродано.OldValue))
 End If
End Sub
0
 Аватар для VinniPuh
9127 / 6127 / 593
Регистрация: 27.03.2013
Сообщений: 19,969
18.01.2020, 13:28
misterx527, пока вы не пересилите себя и не начнёте делать реальную БД, а будете только теории всякие с предположениями строить, то так и не сможете понять, как это делается, ибо тут нужно кроме мозга и ручками поработать.
Скоро вторая страница пойдет, а воз и ныне там.
1
Эксперт MS Access
 Аватар для Eugene-LS
12058 / 5843 / 1492
Регистрация: 05.10.2016
Сообщений: 16,432
18.01.2020, 13:39
Цитата Сообщение от misterx527 Посмотреть сообщение
При этом я совершенно не понимаю что делать если вдруг, допустим продавец ошибся при заполнении, и заполнил что продал 3 единицы товара, вместо скажем 2, а потом исправит на 2.
Простой, надёжный, быстрый и проверенный вариант в 2 формы:
01. Форма просмотра документа продажи (поступления) - Далее "ФП".
02. Форма редакции документа продажи (поступления)- Далее "ФР".
... дальше так:
При переходе ФР -> ФП производим списание содержимого документа со склада ....
При открытии ФР - возвращаем товар всё содержимое на склад - как будто документа и не было.
Всё.
... и никакой путаницы.
0
Эксперт MS Access
 Аватар для alvk
7459 / 4592 / 302
Регистрация: 12.08.2011
Сообщений: 14,380
18.01.2020, 14:46
Цитата Сообщение от misterx527 Посмотреть сообщение
А с парой десятков человек думаю справится.
Вот именно и тут начинаются варианты. Во всяком случае ваше мнимое торможение уже в топке.
0
0 / 0 / 0
Регистрация: 17.01.2020
Сообщений: 18
21.01.2020, 05:15  [ТС]
Спасибо всем, все получилось. Сделал через запрос как разность прихода и расхода. Спасибо, Пух, за пример базы, помогла.

Цитата Сообщение от Capi Посмотреть сообщение
Одним действием можно - просто прибавить разницу между старым значением и новым.
Спасибо за тот вариант про который я спрашивал. Я же правильно понимаю, что AfterUpdate привязываются только к элементам формы, но к таблицам привязать нельзя?

Цитата Сообщение от Eugene-LS Посмотреть сообщение
При открытии ФР - возвращаем товар всё содержимое на склад - как будто документа и не было.
Вот здесь не очень понял. То есть в режиме редактирования, данные не попадают в таблицы, а хранятся только в элементах формы. А записываются данные в таблицы во время того как переходим в режим просмотра. И делаем это только один раз, не позволяя редактировать записи после того как они были выгружены в таблицу. Или иными словами не позволяем открыть форму редактирования после того как была открыта форма просмотра. Так?

Цитата Сообщение от VinniPuh Посмотреть сообщение
пока вы не пересилите себя и не начнёте делать реальную БД
Так я и начал, после чего и появились вопросы.

Добавлено через 5 минут
Цитата Сообщение от alvk Посмотреть сообщение
Вот именно и тут начинаются варианты. Во всяком случае ваше мнимое торможение уже в топке
"Моё мнимое торможение" возникает не от того сколько записей в результате, а от того сколько записей в уменьшаемом и вычитаемом (в терминах разности двух чисел: приход(уменьшаемое)-расход(вычитаемое)=остаток(разность))
0
Мы один, давай на "ты"
3836 / 1382 / 343
Регистрация: 16.06.2016
Сообщений: 3,273
21.01.2020, 06:16
Лучший ответ Сообщение было отмечено misterx527 как решение

Решение

Цитата Сообщение от misterx527 Посмотреть сообщение
Я же правильно понимаю, что AfterUpdate привязываются только к элементам формы, но к таблицам привязать нельзя?
Познакомься с макросами данных.
0
Эксперт MS Access
 Аватар для alvk
7459 / 4592 / 302
Регистрация: 12.08.2011
Сообщений: 14,380
21.01.2020, 06:19
Цитата Сообщение от misterx527 Посмотреть сообщение
а от того сколько записей в уменьшаемом и вычитаемом (в терминах разности двух чисел: приход(уменьшаемое)-расход(вычитаемое)=остаток(разность))
Где это?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.01.2020, 06:19
Помогаю со студенческими работами здесь

MS Sql: при добавлении новой записи, информация из первой записи в таблице исчезает
Ошибка заключается в том, что при добавлении новой записи(через программу), информация из первой записи в таблице исчезает. При добавлении...

Как из одной формы перенести данные в другую форму при добавлении?
Привет, народ! Так вопрос. Есть таблица с пользователями. Есть две формы. В одной выпадающий список с пользователями и кнопка...

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

При добавлении новой записи, обновлять данные в другой таблице
Привет всем! в джанге новичок, никак не допру как решить простейшую задачу: class Tovar(models.Model): nam =...

Как при добавлении данных перенести значение поля из одной формы в другую?
Привет, народ!!! Проблема в следующем. Есть одна форма в которой есть кнопка добавить запись и поле с именем. При нажатии на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru