С Новым годом! Форум программистов, компьютерный форум, киберфорум
Microsoft Access
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.52/25: Рейтинг темы: голосов - 25, средняя оценка - 4.52
0 / 0 / 0
Регистрация: 21.03.2013
Сообщений: 7
1

Проверка остатков и вывод ошибки

21.03.2013, 13:06. Показов 4501. Ответов 25
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день, я уверена, что подобные вопросы уже были, но не знаю, как правильно ввести запрос, не могу найти нужную информацию.
Задача: не продать товара больше, чем есть на складе. При вводе большего количества - вывести ошибку и отменить сохранение записи в таблицу.
Возможно, механизм учета движения товара не очень правильный-украла его на каком-то форуме. БД прилагаю. Если есть подобные решения прошу не ругаться, а приложить ссылочку
Вложения
Тип файла: 7z 123.7z (301.0 Кб, 55 просмотров)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.03.2013, 13:06
Ответы с готовыми решениями:

Проектирование реляционной БД и ее нормализация. Проверка на ошибки.
Доброго времени, господа. Задача стоит так. Надо спроектировать БД и привести ее к 3НФ (задача...

Запрос. Проверка полей таблицы на ошибки
Ребята, помогите кто сможет. Задача значит в следующем: есть таблица ФІЗИЧНІ ОСОБИ (Физические...

Проверка данных списка и вывод ошибки
Здравствуйте! Хотелось бы узнать,как мне выводить сообщение если выбран ошибочный ответ?

Меню.Ввод-вывод.Проверка на ошибки ввода
Здравствуйте, помогите переделать программу без go to при чтении ввода scanf /*Задача: Напишите...

25
Модератор
Эксперт MS Access
12106 / 4966 / 791
Регистрация: 07.08.2010
Сообщений: 14,589
Записей в блоге: 4
21.03.2013, 13:58 2
не очень правильный-украла позаимствовала идею его на каком-то форуме

остат=dsum(поступление......)-dsum(продажа...........)
и сравнивать набитое значение с трафаретом
не помню точный синтаксис скобок
1
0 / 0 / 0
Регистрация: 21.03.2013
Сообщений: 7
22.03.2013, 00:02  [ТС] 3
Цитата Сообщение от shanemac51 Посмотреть сообщение

остат=dsum(поступление......)-dsum(продажа...........)
и сравнивать набитое значение с трафаретом
не помню точный синтаксис скобок
Спасибо, но я немножечко дилетант в этом деле.. а, что, куда?
0
0 / 0 / 0
Регистрация: 21.03.2013
Сообщений: 7
23.03.2013, 14:43  [ТС] 4
+++
0
Эксперт MS Access
17536 / 7288 / 1663
Регистрация: 21.06.2012
Сообщений: 13,957
23.03.2013, 15:24 5
Добавьте в форму "подчиненная форма Продажа_Товар" процедуру обработки события
Visual Basic
1
2
3
4
5
6
7
8
9
Private Sub Ïðîäàæà_Òîâàð_Êîëè÷åñòâî_BeforeUpdate(Cancel As Integer)
    If Me.Ïðîäàæà_Òîâàð_Êîëè÷åñòâî > Nz(DLookup("Êîëè÷åñòâî", "Äâèæåíèå òîâàðîâ", "Àðòèêóë_òîâ Like " & Me.Àðòèêóë_òîâ), 0) Then
        Call MsgBox("Ââåäåííîå êîëè÷åñòâî áîëüøå îñòàòêà." _
               & vbCr & "Ââîä îòìåíåí." _
            , vbOKOnly + vbExclamation, Me.Caption)
        Me.Ïðîäàæà_Òîâàð_Êîëè÷åñòâî.Undo
        Cancel = True
    End If
End Sub
1
0 / 0 / 0
Регистрация: 21.03.2013
Сообщений: 7
23.03.2013, 20:56  [ТС] 6
ltv_1953, спасибо, но так он выдает ошибку даже если количество меньше, чем остаток на складе, может я что-то не так сделала?
0
Эксперт MS Access
17536 / 7288 / 1663
Регистрация: 21.06.2012
Сообщений: 13,957
23.03.2013, 21:43 7
Да, он проверял не тот запрос. Мои извинения. Поставьте такой код, там еще добавлена проверка не только на ввод нового расхода, но и изменения количества (точнее, его увеличения).
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Private Sub Продажа_Товар_Количество_BeforeUpdate(Cancel As Integer)
    If Me.NewRecord And (Me.Продажа_Товар_Количество > Nz(DLookup("[Sum-Количество]", "Товар остатки", "Артикул_тов=" & "'" & Me.Артикул_тов & "'"), 0)) Then
        Call MsgBox("Введенное количество больше остатка." _
               & vbCr & "Ввод отменен." _
            , vbOKOnly + vbExclamation, Me.Caption)
        Me.Продажа_Товар_Количество.Undo
        Cancel = True
    ElseIf ((Me.Продажа_Товар_Количество - Me.Продажа_Товар_Количество.OldValue) > Nz(DLookup("[Sum-Количество]", "Товар остатки", "Артикул_тов=" & "'" & Me.Артикул_тов & "'"), 0)) Then
        Call MsgBox("При таком увеличении количества остаток станет отрицательным." _
               & vbCr & "Ввод отменен." _
            , vbOKOnly + vbExclamation, Me.Caption)
        Me.Продажа_Товар_Количество.Undo
    End If
End Sub
1
0 / 0 / 0
Регистрация: 21.03.2013
Сообщений: 7
24.03.2013, 16:59  [ТС] 8
ltv_1953, при увеличении расхода он выдавал ошибку, но число не менялось.
Добавила в конце второго условия Cancel = True, мало ли, кому понадобится.
Все получилось, благодарю!
0
Эксперт MS Access
17536 / 7288 / 1663
Регистрация: 21.06.2012
Сообщений: 13,957
24.03.2013, 17:07 9
Ну и хорошо. Только имейте ввиду - эта схема только для одного пользователя.
0
0 / 0 / 0
Регистрация: 21.03.2013
Сообщений: 7
25.03.2013, 11:04  [ТС] 10
ltv_1953, ну, мне это подходит
А чем будет отличаться, если много пользователей. Можно на словах просто, для общего развития
0
Эксперт MS Access
17536 / 7288 / 1663
Регистрация: 21.06.2012
Сообщений: 13,957
25.03.2013, 11:24 11
Может случится так, что два пользователя "одновременно" забирают 10 штук из остатка 10 штук. В момент проверки их записи еще не сохранена, поэтому в запросе они оба видят 10 штук, оба забирают и когда записи их сохранятся, получится остаток -10 штук.
1
0 / 0 / 0
Регистрация: 21.03.2013
Сообщений: 7
01.04.2013, 13:32  [ТС] 12
ltv_1953, ясно,спасибо
0
1 / 1 / 1
Регистрация: 11.11.2013
Сообщений: 103
08.12.2013, 16:39 13
ltv_1953, можете расшифровать свой код?
надо сделать чтоб количество Расходов материалов в месяц не превышало количество, которое есть на складе Практика.rar
0
1 / 1 / 1
Регистрация: 11.11.2013
Сообщений: 103
08.12.2013, 16:53 14
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Private Sub Расход_количество_BeforeUpdate(Cancel As Integer)
    If Me.NewRecord And (Me.Расход_количество > Nz(DLookup("[Остаток]", "Ost_Pr_", "Материал=" & "'" & Me.material & "'"), 0)) Then
        Call MsgBox("Введенное количество больше остатка." _
               & vbCr & "Ввод отменен." _
            , vbOKOnly + vbExclamation, Me.Caption)
        Me.Расход_количество.Undo
        Cancel = True
    ElseIf ((Me.Расход_количество - Me.Расход_количество.OldValue) > Nz(DLookup("[Остаток]", "Ost_Pr_", "Материал=" & "'" & Me.material & "'"), 0)) Then
        Call MsgBox("При таком увеличении количества остаток станет отрицательным." _
               & vbCr & "Воод отменен." _
            , vbOKOnly + vbExclamation, Me.Caption)
        Me.Расход_количество.Undo
    End If
End Sub
0
Эксперт MS Access
17536 / 7288 / 1663
Регистрация: 21.06.2012
Сообщений: 13,957
08.12.2013, 17:02 15
Цитата Сообщение от vitek944 Посмотреть сообщение
надо сделать чтоб количество Расходов материалов в месяц не превышало количество, которое есть на складе
Не так, нужно чтобы при любом Расходе наличие не становилось отрицательным. Месяц здесь не при чем. Делаете запрос, который считает текущие остатки. А потом процедуру, в форме Расходов, которая не позволяет расходовать товар в минус. В приведенной процедуре нужно заменить в DLookup запрос на свой и поля свои указать везде. Все. Запрос не тот, который есть, нужно другой сделать, без дат - который определяет текущий остаток. И о втором Cancel = True не забудьте.
0
1 / 1 / 1
Регистрация: 11.11.2013
Сообщений: 103
09.12.2013, 18:40 16
ltv_1953,
Запрос OSt_Pr_ считает остатки
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Private Sub count_rash_BeforeUpdate(Cancel As Integer)
     If Me.NewRecord And (Me.count_rash > Nz(DLookup("[Sum-count_rash]", "Îñòàòîê", "id_mater_rash=" & "'" & Me.id_mater_rash & "'"), 0)) Then
     Call MsgBox("Ââåäåííîå êîëè÷åñòâî áîëüøå îñòàòêà." _
        & vbCr & "Ââîä îòìåíåí." _
        , vbOKOnly + vbExclamation, Me.Caption)
        Me.count_rash.Undo
        Cancel = True
        ElseIf ((Me.count_rash - Me.count_rash.OldValue) > Nz(DLookup("[Sum-count_rash]", "Îñòàòîê", "id_mater_rash=" & "'" & Me.id_mater_rash & "'"), 0)) Then
            Call MsgBox("Ïðè òàêîì óâåëè÷åíèè êîëè÷åñòâà îñòàòîê ñòàíåò îòðèöàòåëüíûì." _
                & vbCr & "Ââîä îòìåíåí." _
                , vbOKOnly + vbExclamation, Me.Caption)
            Me.count_rash.Undo
            Cancel = True
        End If
      
End Sub
пробовал и такой вариант кода, не то, в DLookup поля заменил, наверно что-то перепутал с полями, подскажите, я с этими кодами ни разу не сталкивался

Добавлено через 22 часа 55 минут
ltv_1953,
Расскажите синтаксис этой строки :
If Me.Продажа_Товар_Количество > Nz(DLookup("Количество", "Движение товаров", "Артикул_тов Like " & Me.Артикул_тов), 0) Then

Добавлено через 1 час 0 минут
Цитата Сообщение от ltv_1953 Посмотреть сообщение
Запрос не тот, который есть, нужно другой сделать, без дат - который определяет текущий остаток.
Создал новый запрос Остаток, в который считает количество без дат, в нём поля: id_mater_ (Групповая операция: группировка) и Sum-count_ (Групповая операция: Sum)
интересует такой вопрос - Откуда взято название Продажа_Товар_Количество и везде где оно встречается:
Private Sub Продажа_Товар_Количество_BeforeUpdate

Добавлено через 1 час 29 минут
Народ, помогите с такой проблемой
написал код на проверку
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Private Sub count_rash_BeforeUpdate(Cancel As Integer)
     If Me.NewRecord And (Me.count_rash > Nz(DLookup("[Sum-count_rash]", "Остаток", "id_mater_rash=" & "'" & Me.id_mater_rash & "'"), 0)) Then
     Call MsgBox("Введенное количество больше остатка." _
        & vbCr & "Ввод отменен." _
        , vbOKOnly + vbExclamation, Me.Caption)
        Me.count_rash.Undo
        Cancel = True
        ElseIf ((Me.count_rash - Me.count_rash.OldValue) > Nz(DLookup("[Sum-count_rash]", "Остаток", "id_mater_rash=" & "'" & Me.id_mater_rash & "'"), 0)) Then
            Call MsgBox("При таком увеличении количества остаток станет отрицательным." _
                & vbCr & "Ввод отменен." _
                , vbOKOnly + vbExclamation, Me.Caption)
            Me.count_rash.Undo
        End If
      
End Sub
Но при вводе данных выдаёт ошибку:
Run-time error '2471'
Введенное в качестве параметра запроса выражение вызывает ошибку: [Sum-count_rash]
0
Эксперт MS Access
17536 / 7288 / 1663
Регистрация: 21.06.2012
Сообщений: 13,957
09.12.2013, 18:55 17
Если база старая. то
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Private Sub count_rash_BeforeUpdate(Cancel As Integer)
     If Me.NewRecord And (Me.count_rash > Nz(DLookup("[Sum-count_rash]", "Остаток", "id_mater_rash=" & Me.id_mater_rash), 0)) Then
     Call MsgBox("Введенное количество больше остатка." _
        & vbCr & "Ввод отменен." _
        , vbOKOnly + vbExclamation, Me.Caption)
        Me.count_rash.Undo
        Cancel = True
        ElseIf ((Me.count_rash - Me.count_rash.OldValue) > Nz(DLookup("[Sum-count_rash]", "Остаток", "id_mater_rash=" & Me.id_mater_rash), 0)) Then
            Call MsgBox("При таком увеличении количества остаток станет отрицательным." _
                & vbCr & "Ввод отменен." _
                , vbOKOnly + vbExclamation, Me.Caption)
            Me.count_rash.Undo
            Cancel = True
        End If      
End Sub
Одиночные кавычки были нужны в исходном варианте для условия по текстовому полю, а у Вас целое.
1
1 / 1 / 1
Регистрация: 11.11.2013
Сообщений: 103
09.12.2013, 19:48 18
всё равно ругается на Sum-count_rash, кавычки убрал
бд переделывал, вот последняя:
бд.rar
0
Эксперт MS Access
26818 / 14497 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
09.12.2013, 20:21 19
vitek944, вы своих запросов не знаете . Поле в запросе Остаток называется [Sum-count_], а не [Sum-count_rash]. Исправьте
1
1 / 1 / 1
Регистрация: 11.11.2013
Сообщений: 103
10.12.2013, 14:02 20
Цитата Сообщение от mobile Посмотреть сообщение
vitek944, вы своих запросов не знаете . Поле в запросе Остаток называется [Sum-count_], а не [Sum-count_rash]. Исправьте
не поверите, пробовал и так - менялось текст ошибки и ничего не изменялось))

Добавлено через 4 минуты
о, заработала всего-то надо было: взять ране сохраненную базу, заново прописать код, и таки да, изменить [Sum-count_rash] на [Sum-count_], глючный access
спасибо за помощь

Добавлено через 47 минут
Всё было бы хорошо если не следующее:
Удалил все расходы, т.к. много отрицательных значений, добавил парочку, Например:
приход по коду 2345540 составил 3 ед, расход 1, т.е. Остаток = 2. Далее запускаю Форму Расход, ввожу код и ввожу количество начиная с начало 1, 2 и тд.. по идеи на 3 уже должно сработать условие и выдать ошибку, но ничего подобного.. срабатывает условие аж на количестве =11, так проверял на нескольких материалах.

Кто-то знает как это "называется" и что с ним делать?

Добавлено через 15 часов 52 минуты
Даже если количество материала скажем 15, то всё равно при вводе больше 11 выдаёт ошибку

Добавлено через 37 минут
думал может в DLookup поменять в условии id_mater_rash на id_mater_ потому что у меня в запросе Остаток именно так называется поле, но в этом случае выдаёт ошибку при вводе: Method or data member not found
0
10.12.2013, 14:02
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.12.2013, 14:02
Помогаю со студенческими работами здесь

Проверка наличия на складе остатков товара
Документ отгрузка товаров: делаю проверку наличия на складе остатков товара, если нет товара...

Остаток -> Резерв. Проверка остатков в регистре накоплений
Доброго времени суток! Есть форма документа и два поля ввода прикрепленных к реквизитам Бумага,...

вывод остатков
есть две таблицы таблица со счетами клиентов id id_c счет дата открытия ...

Вывод остатков в номенклатуре по местам хранения
День добрый. 1С 8.2 Делаю конфигурацию по аналогии готовой, в 1с практически не шарю, не...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Счётчик на базе сумматоров + регистров и генератора сигналов согласования.
Hrethgir 07.01.2025
Создан с целью проверки скорости асинхронной логики: ранее описанного сумматора и предополагаемых fast регистров. Регистры созданы на базе ранее описанного, предполагаемого fast триггера. То-есть. . .
Как перейти с Options API на Composition API в Vue.js
BasicMan 06.01.2025
Почему переход на Composition API актуален В мире современной веб-разработки фреймворк Vue. js продолжает эволюционировать, предлагая разработчикам все более совершенные инструменты для создания. . .
Архитектура современных процессоров
inter-admin 06.01.2025
Процессор (центральный процессор, ЦП) является основным вычислительным устройством компьютера, которое выполняет обработку данных и управляет работой всех остальных компонентов системы. Архитектура. . .
История создания реляционной модели баз данных, правила Кодда
Programming 06.01.2025
Предпосылки создания реляционной модели В конце 1960-х годов компьютерная индустрия столкнулась с серьезными проблемами в области управления данными. Существовавшие на тот момент модели данных -. . .
Полезные поделки на Arduino, которые можно сделать самому
raxper 06.01.2025
Arduino как платформа для творчества Arduino представляет собой удивительную платформу для технического творчества, которая открывает безграничные возможности для создания уникальных проектов. Эта. . .
Подборка решений задач на Python
IT_Exp 06.01.2025
Целью данной подборки является предоставление возможности ознакомиться с различными задачами и их решениями на Python, что может быть полезно как для начинающих, так и для опытных программистов. . . .
С чего начать программировать микроконтроллер­­ы
raxper 06.01.2025
Введение в мир микроконтроллеров Микроконтроллеры стали неотъемлемой частью современного мира, окружая нас повсюду: от простых бытовых приборов до сложных промышленных систем. Эти маленькие. . .
Из чего собрать игровой компьютер
inter-admin 06.01.2025
Сборка игрового компьютера требует особого внимания к выбору комплектующих и их совместимости. Правильно собранный игровой ПК не только обеспечивает комфортный геймплей в современных играх, но и. . .
Обновление сайта www.historian.b­y
Reglage 05.01.2025
Обещал подвести итоги 2024 года для сайта. Однако начну с того, что изменилось за неделю. Добавил краткий урок по последовательности действий при анализе вредоносных файлов и значительно улучшил урок. . .
Как использовать GraphQL в C# с HotChocolate
Programming 05.01.2025
GraphQL — это современный подход к разработке API, который позволяет клиентам запрашивать только те данные, которые им необходимы. Это делает взаимодействие с API более гибким и эффективным по. . .
Модель полного двоичного сумматора с помощью логических операций (python)
AlexSky-coder 04.01.2025
def binSum(x:list, y:list): s=^y] p=x and y for i in range(1,len(x)): s. append((x^y)^p) p=(x and y)or(p and (x or y)) return s x=list() y=list()
Это мы не проходили, это нам не задавали...(аси­­­­­­­­­­­­­­­­­­­­­­­­­­х­р­о­н­­н­­­ы­­й счётчик с управляющим сигналом зад
Hrethgir 04.01.2025
Асинхронный счётчик на сумматорах (шестиразрядный по числу диодов на плате, но наверное разрядов будет больше - восемь или шестнадцать, а диоды на старшие), так как триггеры прошли тестирование и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru