2. Модуль ввода данных. Включает формы ввода и алгоритм передачи данных в БД. Передача данных осуществляется методом DAO который в свою очередь основан на технологии ODBC. Для работы метода необходимо указать полный путь к БД, и таблицу с которой предстоит работать.
3. Расчётный модуль. Содержит алгоритмы решения MRP системы, расчёта стоимости запасов и подготовки иной информации для отчётов.
4. Модуль подготовки и вывода отчётов. Для подготовки отчётов используется встроенный в VisualBasic редактор отчётов и MSWord. Для корректной работы редактора отчётов используется метод доступа к БД ADO основан на технологии ODBC. Работа этого метода не требует жёсткой привязки к БД, необходимо указать название соединения и провайдера.
По указанным в пункте 3.1 мотивам для разработки БД был выбран MSAccess. Все таблицы БД можно разбить по функциональным признакам на несколько групп:
1. Таблицы ввода данных. Здесь записана первичная информация, использующаяся для расчётов. К данной категории относятся таблицы:
· «ПродукцияПоставщиков»
· «Предприятие»
· «Конфигурация»
· «Запас»
2. Таблицы хранения информации промежуточных расчетов. Для упрощения алгоритма программного кода приходилось наиболее сложные расчёты разбивать на смысловые части, именно их результаты и хранятся в данных таблицах. К данной категории относятся таблица:
· «ПроизводственныйПлан»
3. Таблицы накопления отчётной информации. Таблицы в которых хранятся результаты расчётов. Кроме того эти результаты используются и для составления отчётов. К данной категории относятся таблицы:
· «ПланЗакупок»
· «ПланПроизводства»
· «СтоимостьЗапаса»
· «Заказ комплектующих»
4. Таблицы служебной информации. Служат для идентификации информации, и обеспечении смысловой связи между таблицами. К данной категории относятся таблицы:
· «КодировкаBOM»
· «ДиаграммаBOM»
Стоит пояснить, что указанные в схеме данных связи несут лишь смысловую нагрузку. Так как все манипуляции с БД осуществляются по средствам программного кода. Схема данных представлена на рисунке 3.1.
Рис3.1 Схема данных
При разработки интерфейса ПО, была применена технология MDI, что позволяет эффективно работать в приложениях со множеством форм. При применении данной технологии одна форма проекта становится контейнером для всех остальных. Что даёт возможность работать со всеми формами проекта, как с группой, кроме того использование MDI интерфейса увеличивает производительность и гибкость всей программы.
Доступ к функциям программы осуществляется через контекстное меню родительской формы, либо через выбор соответствующей вкладки на «Главной форме» проекта (рис 3.2).
Рис 3.2 Главная форма
Перед началом работы с программой необходимо ввести путь к папке в которую установлена база данных.
Для ввода информации используются формы: «Предприятие», «Поставщики», «Конфигурация», «Закупки», «Добавить заказ». Все они имеют похожий принцип действия:
1. При загрузке формы, она связывается с БД и происходит первичное заполнение компонентов формы
2. Пользователь меняет или добавляет информацию, которая скапливается в компоненте формы MSFlexGride
3. Происходит запись или замена информации в БД.
Наиболее интересная форма в этой группе это форма «Закупки». Внешний вид представлен на рис 3.3
Рис 3.3 форма «Закупки»
После вызова этой формы происходит автоматическое заполнение компонентов «Группа наименований» и «Выбор поставщика» информацией из базы данных.
Листинг 3.1
Загрузка формы «Закупки»
Private Sub Form_Load()Dim base As DatabaseDim nabor As RecordsetDim Pt As StringDim i As IntegerPt = Form2.Label1.Caption & "Base.mdb"Form5.Width = 7455Form5.Height = 6045Set base = OpenDatabase(Pt)Set nabor = base.OpenRecordset("КодировкаBOM", dbOpenTable)For i = 1 To nabor.RecordCountCombo2.AddItem nabor.Fields(1)nabor.MoveNextNext inabor.CloseSet nabor = base.OpenRecordset("Поставщик", dbOpenTable)Combo1.AddItem "нет"For i = 1 To nabor.RecordCountCombo1.AddItem nabor.Fields(0)nabor.MoveNextNext inabor.Closebase.CloseForm5.MSFlexGrid1.Row = 0Form5.MSFlexGrid1.Col = 0Form5.MSFlexGrid1.Text = "КодBOM"Form5.MSFlexGrid1.Col = 1Form5.MSFlexGrid1.Text = "Наименование"Form5.MSFlexGrid1.Col = 2Form5.MSFlexGrid1.Text = "Количество"Form5.MSFlexGrid1.Col = 3Form5.MSFlexGrid1.Text = "Цена"Form5.MSFlexGrid1.Col = 4Form5.MSFlexGrid1.Text = "Дата"Form5.MSFlexGrid1.ColWidth(1) = 3000End Sub |
Затем после выбора группы наименований и поставщика происходит заполнение компонента «Наименование», причём если поставщик не выбран происходит отбор самой дешёвой комплектующей этой группы.
Листинг 3.2
Подбор наименований
Private Sub Command5_Click()Dim base As DatabaseDim nabor As RecordsetDim Pt As StringDim i As IntegerCombo3.ClearLabel6.Caption = "Подобранно"Pt = Form2.Label1.Caption & "Base.mdb"Set base = OpenDatabase(Pt)Set nabor = base.OpenRecordset("КодировкаBOM", dbOpenTable)For i = 1 To nabor.RecordCountIf Combo2.Text = nabor.Fields(1) Then Kod = nabor.Fields(0)nabor.MoveNextNext inabor.CloseSet nabor = base.OpenRecordset("ПродукцияПоставщиков", dbOpenTable)If Combo1.Text = "" Or Combo1.Text = "нет" ThenFor i = 1 To nabor.RecordCountIf Kod = nabor.Fields(1) Then Combo3.AddItem nabor.Fields(2)nabor.MoveNextNext iElseFor i = 1 To nabor.RecordCountIf Kod = nabor.Fields(1) And nabor.Fields(0) = Combo1.Text Then Combo3.AddItem nabor.Fields(2)nabor.MoveNextNext iEnd IfEnd Sub |
После ввода количества и даты заказ можно переслать в компонент MSFlexGride.
Листинг 3.3
Механизм накопления информации
Private Sub Command1_Click()Dim base As DatabaseDim nabor As RecordsetDim Pt As StringDim i As IntegerDim MinPrise As IntegerPt = Form2.Label1.Caption & "Base.mdb"Set base = OpenDatabase(Pt)Set nabor = base.OpenRecordset("ПродукцияПоставщиков", dbOpenTable)Form5.MSFlexGrid1.Rows = Form5.MSFlexGrid1.Rows + 1Form5.MSFlexGrid1.Row = Form5.MSFlexGrid1.Rows - 1If Combo1.Text = "" Or Combo1.Text = "нет" ThenForm5.MSFlexGrid1.Col = 0Form5.MSFlexGrid1.Text = KodForm5.MSFlexGrid1.Col = 1Form5.MSFlexGrid1.Text = Combo3.TextForm5.MSFlexGrid1.Col = 2Form5.MSFlexGrid1.Text = Text1.TextForm5.MSFlexGrid1.Col = 4Form5.MSFlexGrid1.Text = Text2.TextMinPrise = 9900For i = 1 To nabor.RecordCountIf nabor.Fields(2) = Combo3.Text And nabor.Fields(3) < MinPrise ThenMinPrise = nabor.Fields(3)End Ifnabor.MoveNextNext iForm5.MSFlexGrid1.Col = 3Form5.MSFlexGrid1.Text = MinPriseElseForm5.MSFlexGrid1.Col = 0Form5.MSFlexGrid1.Text = KodForm5.MSFlexGrid1.Col = 1Form5.MSFlexGrid1.Text = Combo3.TextForm5.MSFlexGrid1.Col = 2Form5.MSFlexGrid1.Text = Text1.TextForm5.MSFlexGrid1.Col = 4Form5.MSFlexGrid1.Text = Text2.TextFor i = 1 To nabor.RecordCountIf nabor.Fields(2) = Combo3.Text ThenForm5.MSFlexGrid1.Col = 3Form5.MSFlexGrid1.Text = nabor.Fields(3)End Ifnabor.MoveNextNext iEnd IfEnd Sub |
После нажатия кнопки «Занести в БД» происходит запись информации в базу данных.
Листинг 3.4
Запись информации в БД
Private Sub Command3_Click()Dim base As DatabaseDim nabor As RecordsetDim Pt As StringDim i As IntegerPt = Form2.Label1.Caption & "Base.mdb"Set base = OpenDatabase(Pt)Set nabor = base.OpenRecordset("Запас", dbOpenTable)For i = 1 To Form5.MSFlexGrid1.Rows - 1Form5.MSFlexGrid1.Row = inabor.AddNewForm5.MSFlexGrid1.Col = 0nabor.Fields(0) = Form5.MSFlexGrid1.TextForm5.MSFlexGrid1.Col = 1nabor.Fields(1) = Form5.MSFlexGrid1.TextForm5.MSFlexGrid1.Col = 2nabor.Fields(2) = Form5.MSFlexGrid1.TextForm5.MSFlexGrid1.Col = 3nabor.Fields(3) = Form5.MSFlexGrid1.TextForm5.MSFlexGrid1.Col = 4nabor.Fields(4) = Form5.MSFlexGrid1.Textnabor.UpdateNext iMsgBox "Данные успешно занесены в БД", , "Сообщение"End Sub |
Основная задача MRP модуля – сформировать план закупки комплектующих. Для этого план заказов разбивается на подневной план производства с учётом производственных мощностей и продолжительности производственного цикла.
Листинг 3.5
Формирование подневного плана производства
Private Sub Command15_Click()Dim base As DatabaseDim nabor As RecordsetDim rezalt As RecordsetDim prmo As RecordsetDim Pt As StringDim i, sam, kol, koldney As IntegerDim dat, prdat As DatePt = Form2.Label1.Caption & "Base.mdb"Set base = OpenDatabase(Pt)Set nabor = base.OpenRecordset("ПроизводственныйПлан", dbOpenTable)Set rezalt = base.OpenRecordset("ПланПроизводства", dbOpenTable)Set prmo = base.OpenRecordset("Предприятие", dbOpenTable)If rezalt.RecordCount > 0 Thenrezalt.MoveFirstFor i = 1 To rezalt.RecordCountrezalt.Deleterezalt.MoveNextNext iEnd Ifsam = 0For i = 1 To nabor.RecordCountsam = sam + nabor.Fields(2)nabor.MoveNextNext iprmo.MoveFirstkoldney = Round(sam / prmo.Fields(4))nabor.MoveFirstFor i = 1 To nabor.RecordCountdat = nabor.Fields(3)kol = nabor.Fields(2)Do While kol > 0rezalt.AddNewrezalt.Fields(0) = nabor.Fields(0)rezalt.Fields(1) = nabor.Fields(1)If kol > prmo.Fields(4) Thenrezalt.Fields(2) = prmo.Fields(4)Elserezalt.Fields(2) = kolEnd IfIf dat < prdat Then dat = prdat + prmo.Fields(5)rezalt.Fields(3) = datdat = dat + prmo.Fields(5)prdat = rezalt.Fields(3)kol = kol - prmo.Fields(4)rezalt.UpdateLoopnabor.MoveNextNext iWith Form2.MSFlexGrid2.Cols = 4.ColWidth(0) = 1000.ColWidth(1) = 1500.ColWidth(2) = 1000.ColWidth(3) = 1000.Row = 0.Col = 0.Text = "Код заказа".Col = 1.Text = "Конфигурация".Col = 2.Text = "Количество".Col = 3.Text = "Дата".Rows = rezalt.RecordCount + 1rezalt.MoveFirstFor i = 1 To .Rows - 1.Row = i.Col = 0.Text = rezalt.Fields(0).Col = 1.Text = rezalt.Fields(1).Col = 2.Text = rezalt.Fields(2).Col = 3.Text = rezalt.Fields(3)rezalt.MoveNextNext iEnd WithEnd Sub |
Следующим этапом станет определение точки заказа комплектующих. Для этого в цикле нарастающим итогом рассчитывается стоимость хранения партии комплектующих, если в како-то итерации сума на хранение превышает издержки на перевозку это и будет временной точкой заказа комплектующих.
Листинг 3.6
Определение времени заказа комплектующих
Private Sub Command6_Click()Dim base As DatabaseDim nabor As RecordsetDim Sthran As RecordsetDim Vrdost As RecordsetDim rez As RecordsetDim Pt As StringDim i, j As IntegerDim dat As DateDim sam As DoubleDim kol As IntegerPt = Form2.Label1.Caption & "Base.mdb"Set base = OpenDatabase(Pt)Set nabor = base.OpenRecordset("ПланПроизводства", dbOpenTable)Set Sthran = base.OpenRecordset("КодировкаBOM", dbOpenTable)Set Vrdost = base.OpenRecordset("Поставщик", dbOpenTable)Set rez = base.OpenRecordset("ПланЗакупок", dbOpenTable)If rez.RecordCount > 0 ThenFor i = 1 To rez.RecordCountrez.Deleterez.MoveNextNext iEnd Ifsam = 0kol = 0nabor.MoveFirstFor i = 1 To nabor.RecordCountdat = nabor.Fields(3) - Vrdost.Fields(4)Sthran.MoveFirstFor j = 1 To Sthran.RecordCountsam = sam * (nabor.Fields(3) - dat) + Sthran.Fields(3) * nabor.Fields(2)Sthran.MoveNextNext jkol = kol + nabor.Fields(2)If sam > Vrdost.Fields(3) Thenrez.AddNewrez.Fields(1) = kolsam = 0kol = 0rez.UpdateEnd Ifnabor.MoveNextNext iDim samzak, sampr As Integernabor.MoveFirstFor i = 1 To nabor.RecordCountsampr = sampr + nabor.Fields(2)nabor.MoveNextNext irez.MoveFirstFor i = 1 To rez.RecordCountsamzak = samzak + rez.Fields(1)rez.MoveNextNext iIf sampr > samzak Thenrez.AddNewrez.Fields(1) = sampr - samzakrez.UpdateEnd Ifkol = 0rez.MoveFirstnabor.MoveFirstFor i = 1 To rez.RecordCountrez.Editrez.Fields(2) = nabor.Fields(3) - Vrdost.Fields(4)Do While rez.Fields(1) > kolkol = kol + nabor.Fields(2)nabor.MoveNextLoopkol = 0rez.Updaterez.MoveNextNext iWith Form2.MSFlexGrid2.Cols = 2.Row = 0.Col = 0.ColWidth(0) = 2000.ColWidth(1) = 1500.Text = "Количество комплектов".Col = 1.Text = "Дата заказа".Rows = rez.RecordCount + 1rez.MoveFirstFor i = 1 To .Rows - 1.Row = i.Col = 0.Text = rez.Fields(1).Col = 1.Text = rez.Fields(2)rez.MoveNextNext iEnd WithEnd Sub |
Заключительным этапом MRP цикла является формирование графика закупок комплектующих, который включает наименование, количество и дату заказа.