Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS Access > Не получается правильно вычесть сумму


Автор: videolamer 9.7.2011, 13:40
Здравствуйте, я новичок в Access, можно сказать полный ноль. Создаю простенькую базу учета, назовем это базой денежных чеков. Работает она так, заношу в таблицу "чеки" номера чеков и их номинал, например чек 123 номинал 200 у.е, чек 124 номинал  200 у.е и чек 125 номинал 200 у.е Это база чеков. Далее Иванову оплачено с чека  123, 50 у.е, а Сидорову с чека 125, 100 у.е. Заношу эти данные в таблицу клиенты. 
Загвоздка в том, что при отчете у меня происходит полная неразбериха со списанием с чеков. Это ошибка в запросе, который я создал. Но ума не приложу как это исправить. Т.е. если с чека номиналом 200 списать 200, то в отчете получается ноль, как и положено, но если списать 50, а потом списать ещё 50, то в отчете вместо 100, получается 150. Вторая проблема в том как создать запрос чтоб можно было посмотреть сколько осталось на определенном чеке сумма...
 Помогите пожалуйста, разобраться.

Автор: Akina 9.7.2011, 22:04
Читаем http://forum.vingrad.ru/forum/topic-260944.html

Автор: videolamer 11.7.2011, 10:14
Akina, Извиняюсь, вроде исправил.

Автор: Akina 11.7.2011, 10:55
Для того, чтобы правильно посчитать остатки, необходимо построить ДВА запроса.
Первый должен по таблице клиентов (кстати, у вас там опечатка в названии таблицы) посчитать сумму, списанную по каждому чеку:
Код

SELECT Клиетны.[код чека], Sum(Клиетны.сумма) AS [Списано]
FROM Клиетны
GROUP BY Клиетны.[код чека];

Назовём его, скажем, Списание.
Вот теперь можно получить и остатки по чекам:
Код

SELECT Чеки.[код чека], Чеки.[номер чека], Чеки.номинал, Списание.Списано, [номинал]-[Списано] AS Остаток
FROM Чеки 
INNER JOIN Списание 
ON Чеки.Код = Списание.[код чека];

Логично будет назвать его Остатки.
Вот теперь на его основе можно строить итоговый отчёт.
Можно, конечно, собрать эти два запроса в один - но в рамках одной БД это не имеет смысла.

Автор: videolamer 11.7.2011, 11:51
Akina, Спасибо большое. Вроде поправил, но получается опять беспорядок. 

Автор: videolamer 11.7.2011, 14:18
Я извиняюсь всё поправил. Отчет по чекам получается как положено! Спасибо вам!

Автор: Akina 11.7.2011, 14:44
Кстати. 
Эти запросы обладают одним недостатком - не будут выведены чеки, по которым не было списаний. Чтобы они были выведены, надо слегка изменить второй запрос:
Код

SELECT Чеки.[код чека], Чеки.[номер чека], Чеки.номинал, NZ(Списание.Списано;0), [номинал]-NZ([Списано];0) AS Остаток
FROM Чеки 
LEFT JOIN Списание 
ON Чеки.Код = Списание.[код чека];


Автор: videolamer 11.7.2011, 15:58
Да, Вы правы. Действительно чеки с которых не было списаний не отражаются в отчете. К сожалению я не смог сообразить как изменить отчет в соответствии с  Вашим кодом, в отличие от первых двух. Не могли бы вы поправить мой файл? Заранее благодарю!

Автор: Akina 11.7.2011, 18:40
Просто замените текст запроса.

Автор: videolamer 12.7.2011, 10:47
Я немного изменил названия в запросах, добавил одно поле и исправил ошибки в названии таблиц. Меняю текст запроса на Ваш код в соответствии со своими названиями, но теперь при изменении кода вылетает ошибка синтаксиса в выражении NZ. Как плохо, когда нет рядом друга-гуру по аксесс. Трудно заниматься самообучением.

Автор: Akina 12.7.2011, 13:02
Цитата(videolamer @  12.7.2011,  11:47 Найти цитируемый пост)
вылетает ошибка синтаксиса в выражении NZ

Ну уж не поленитесь почитать справку по синтаксису функции, а?

Автор: videolamer 12.7.2011, 14:29
да я бы почитал, мне не лень, но Вы думаете я понимаю о чем идет речь в справке? 

Цитата

<Message> in query expression <expression>. (Error 3075) 

The expression you typed is not valid for the reason indicated in the message. Make sure you have typed field names and punctuation correctly, and then try the operation again.

Вот такой код пытаюсь вставить.

Код

SELECT Списание.[код чека], Списание.[номер чека], Списание.номинал, NZ(Списание.погашено;0), [номинал]-NZ( [погашено];0 ) AS остаток
FROM Списание;

 Вот такую ошибку получаю: Ошибка синтаксиса в выражении запроса 'NZ(Списание.погашено;0)'

Автор: Akina 12.7.2011, 20:53
Цитата(Akina @  12.7.2011,  14:02 Найти цитируемый пост)
не поленитесь почитать справку по синтаксису функции

на всякий случай скажу, что имеется в виду функция NZ()

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)