(Создаем формы для учета расхода продуктов на складе)
На этом уроке мы поговорим о создании форм расхода продуктов на складе. Учет расхода также как и учет прихода будет состоять из трех форм. В первой форме будем выводить номер накладной расхода, дату расхода и сумму расхода по накладной.
Во второй форме будем выводить список продуктов выбранных для расхода с количеством, ценой и на какую сумму.
Ну и в третьей форме мы будем производить выбор продуктов для учета расхода.
Как вы видите, первые две формы учета расхода практически не отличаются от первых двух форм учета прихода за одним исключением из второй формы учета расхода убрано поле поставщик. Поэтому и создание этих форм чисто технически не отличается от создания форм прихода. Я например создал первые две формы простым копированием содержимого из форм прихода. Затем переименовал названия компонентов (точнее заменил слово prihod в rashod_doc, а слово storage в rashod) и подключил одноименные таблицы. А затем написал процедуры обработки форм расхода аналогичные процедурам обработки форм прихода. Поэтому если вы разобрались с написанием форм прихода на предыдущих уроках, у вас не должно возникнуть проблем и с созданием первых двух форм расхода. А вот по созданию формы выбора продуктов расхода я немного поясню.
Данная форма содержит:
Фильтр по категории продуктов, который активируется по событию OnClick на компоненте CheckBox и выбору категории из выпадающего списка DBLookupComboBox, подключенного к справочнику категория продуктов;
Таблицу DBgrid подключенную к запросу ADOQuery_ostatki_copy (который является копией запроса ADOQuery_ostatki). В нее выводятся список остатков продуктов на складе;
Пять полей DBEdit подключенных к таблице rashod. При двойном клике на поле DBGridа данные из DBGrida (Продукт, единица измерения, средняя цена автоматически заносятся в соответствующие поля, курсор устанавливается в поле количество). При нажатии кнопки ОК, данные заносятся в таблицу rashod базы данных после прохождения проверки корректности заполненных полей. При попытке ввести количество продуктов больше чем есть на складе, вызывается предупреждение. В случае отмены данные не сохраняются.
Кроме того я добавил выделение зеленым цветом нулевых и красным цветом отрицательных остатков.
Так как это у нас уроки по базе данных, я предлагаю создать вам все три формы для учета расхода самостоятельно. Но вы всегда можете скачать готовый исходник к уроку и использовать его как шпаргалку. Если возникнут вопросы по созданию форм для данного урока, задавайте на форуме, попробую помочь.
Добрый день, подскажите пожалуйста, при попытке сохранить введенные данные выдает ошибку "Не удается найти строку для обновления. Некоторые значения могли быть изменены со времени ее последнего чтения". Такую ошибку выдает и при заполнении прихода и при заполнении расхода. С чем это может быть связано?
Не зная как у вас происходит заполнение прихода и расхода сложно вам что-то сказать. Но одна из причин, это отсутствие ключевых полей в таблицах, хотя есть и другие причины.)))
Доброго времени суток. Я собрали все уроки до конца без проблем! После запуска программку пункт расходной дадут ошибка Cannot perform this operation on a closed dataset как можно исправит эту ошибками??
Здравствуйте! Подскажите пожалуйста, что значат эти ошибки при запуске программы появляется окно с тестом Project storage.exe raised exception class EAccessViolation with message 'Access violation at address 004FDD67 in module 'storage. exe'. Read of address 00000000' После нажатия кнопки continue появляется другое окно с текстом Access violation at address 004FDD67 in module 'storage. exe'. Read of address 00000000. При нажатие слова ок . Программа запускается все добавляет, правда выделения цветом нет.
Это ошибка доступа к памяти, возникать может из-за чего угодно, например при обращении к не инициализированной переменной значение которой равно Null. В каждом конкретном случае нужно разбираться отдельно. Но в любом случае нужно в начале определить какая строка кода или процедура ее вызывает.)))
1. Запускайте программу в пошаговом режиме по клавише F7. Далее жмете F7 до тех пор пока не вылетит ошибка. Ваша задача отследить стоку, когда это произойдет. 2. Если умеете пользоваться отладчиком, то создайте в процедурах где по вашему предположению вылетает эта ошибка точки останова, ну и снова смотрите на какой строке вылетит ошибка. 3. Используйте комментирование кода. Были случае когда приходилось за комментировать целый модуль, а затем последовательно снимал комментарии включая в модуль по одной процедуре, каждый раз запуская программу и проверяя на наличие ошибки доступа к памяти.
Да и совет на будущее, если у вас есть работающая часть программы, то прежде чем вносить изменения, добавлять новые формы и т.д. создавайте копию программы, всегда можно будет откатиться назад.)))
Да, если вы остановились на этом уроке, то "ошибка доступа к памяти" здесь чаще всего возникает из-за неправильно написанных SQL запросах.))))
И еще, не могли бы вы подсказать пожалуйста где можно посмотреть как организовать поиск по БД по 5 Edit, чтобы после поиска информация отображалась в TDBGrid. Спасибо
В принципе здесь вариантов не так уж и много: 1. Если вы используете компонент AdoTable то фильтрация организуется с помощью свойства Filter, в это поле записывается условие для фильтрации. В дополнение к нему можно использовать событие OnFilterRecord у этого компонента. 2. Это использование SQL запросов с параметрами и компонента AdoQuery, способ может и сложнее, но после того как разберетесь с SQL запросами все станет на много проще и яснее и на создание БД будите смотреть другими глазами.))) Вот ссылки по фильтрации: http://articles.org.ru/cn/showdetail.php?cid=8806 http://delphiworld.narod.ru/base/search_and_filter.html ну а по SQL запросам информации в интернете море.)))
почему у меня ругается на "=sysutils.Date;"???????
[DCC Error] select_tov.pas(101): E2003 Undeclared identifier: 'sysutils' [DCC Error] select_tov.pas(101): E2014 Statement expected, but expression of type 'Variant' found [DCC Fatal Error] F2063 Could not compile used unit 'select_tov.pas'
прописывал, не получилось((( в USES прописано было System.SysUtils, заменил "=sysutils.Date; " на "System.SysUtils.Date" и заработало. Спасибо за отзыв!!!
Если под фильтрацией вы понимаете поиск по названию продукта, то нужно использовать запрос с параметром для поиска или фильтр у таблицы расход. Если под фильтрацией понимается фильтр по категории товара, то здесь можно тоже использовать фильтр у таблицы расход или создать еще один DBGrid, подключить к нему таблицу категорий, а таблицу категорий связать с таблицей расход по полю категория.)))))))))
Извените, забыл у вас спросить, подскажите пожалуйста у меня в событии procedure TForm_select_prod_rashod.FormActivate(Sender: TObject); в строчке dm.ADOQuery_ostatki_copy.Locate('product_name',dbedit1.Text, [loCaseInsensitive, loPartialKey] ) ; на [loCaseInsensitive, loPartialKey] ) выдает ошибку [DCC Error] select_prod_rashod.pas(130): E2003 Undeclared identifier: 'loCaseInsensitive', если убрать эту строчку то все работает вроде в нормально, но в исходниках она работате, будте любезны))))
Странно, эти ключи встречаются не первый раз в данной программе (например в модулях со справочниками продуктов, единиц измерения и т.д.) если это там у вас работает, то и здесь должно работать. Единственное, что могу посоветовать посмотреть прописан ли у вас в Uses модуль DB.)))))))))))
Почему когда я нажимаю кнопку ОК на последней форме "Выбор продуктов" (там где идёт расход товара), у меня появляется ошибка : "невозможно добавление или изменение записи. Для обеспечения целостности данных необходимо наличие связанной записи в таблице "склад" ???
По вашему описанию трудно сказать в чем заключается ваша ошибка. Нужно смотреть сам код программы и конкретно какая строка вызывает данную ошибку. Кроме того непонятно, что за таблица "склад" и какое отношение она имеет к расходу?
Можно чуть подробнее рассказать как это делать: "Пять полей DBEdit подключенных к таблице rashod. При двойном клике на поле DBGridа данные из DBGrida (Продукт, единица измерения, средняя цена автоматически заносятся в соответствующие поля, курсор устанавливается в поле количество)."
в исходниках у этих полей вижу прописаны только DataField и пусто DataSource - как же они подключены к таблице?
у меня эти поля оказываются никуда не подключены и не редактируются и при двойном клике на поле DBGridа всё вылетает...