Управление выполнением заказов

Теперь, когда процесс размещения заказов отлажен, можно уделить внимание дальнейшим действиям.

В БД Boutique Fudge у каждой записи в таблице Ordersесть поле OrderStatus(состояние заказа), отслеживающее его состояние или статус. У вновь созданных заказов статус New (новый). На складе сотрудники хранилища ищут заказы со статусом New (новый) и выбирают один из них для обработки. В этот момент они изменяют статус заказа на In Progress (выполняющийся в данный момент), поэтому никто больше в это же время не попытается его доставить. Наконец, когда заказ укомплектован, его статус меняется на Shipped (отправлен) и затем в поле ShipDateзаписывается точное время отправки.

 
  Управление выполнением заказов - student2.ru

Логически эта модель вполне осмыслена. Но немного трудно применять к ней обычные таблицы и формы. Для того чтобы следовать этому технологическому процессу, работники склада должны несколько раз изменять статус в записи заказа, помнить о необходимости зафиксировать дату отправки и при этом не изменять другие данные о заказе. Если они про­пустят какой-нибудь этап — скажем, никогда не переведут статус заказа в In Progress (выполняющийся в данный момент) — вполне возможно, что кто-то из сотрудников попы­тается выполнить тот же самый заказ.

Решением может быть создание формы ShipOrders,которая проведет работников склада через все нужные этапы. Вначале эта форма отображает список заказов с минимальной ин­формацией (рис. 17.14).

Рис. 17.14.Список заказов отсортирован, так что самые старые заказы (которые следует обработать первыми) появляются в верхней части списка. Свойство Блокировка(Locked) для всех полей задано со значением Да, поэтому никто не сможет изменить никакие данные. Рядом с каждым заказом расположена кнопка Process(обработка), которая начинает процесс выполнения заказа (в форму можно добавить фильтр, позволяющий отображать только заказы с определенными статусами)

Когда кто-либо щелкает мышью кнопку Process(обработка), должны выполняться не­сколько действий. Далее приводится последовательный разбор программного кода, пооче­редно, один фрагмент за другим.

Сначала ваш код должен обновить запись. Этот шаг помогает определить, не начал ли кто-то еще выполнять данный заказ на другом компьютере:

Private Sub ProcessOrder_Click()

Form.Refresh

Далее необходимо проверить статус записи. Если у нее статус не New, значит, она не го­дится для обработки:

' StatusID для статуса New равен 2

If StatusID о 2 Then

MsgBox "This order is not available."

В противном случае нужно изменить статус на In Progress (выполняющийся в данный момент) и сразу сохранить запись, чтобы никто другой не пытался выполнить этот заказ:

Else

' StatusID для статуса In Progress равен 3

StatusID = 3

' Сохранение изменения

DoCmd.RunCommand acCmdSaveRecord

Примечание

В подобной ситуации крайне важно сохранить запись (с помощью метода DoCmd. RunCommand, как показано в примере). В противном случае запись заказа останется в режиме редактирования и новый статус не сохранится в БД. Другие работники могут начать выполнять его, поскольку у них нет возможности узнать о том, что вы изменили статус этого заказа.

Теперь самое время запустить форму ReviewOrderDetails,которая выводит предназна­ченное только для чтения представление всех компонентов заказа (рис. 17.15). Форма от­крывается в диалоговом режиме, который блокирует открытие формы ShipOrdersдо тех пор, пока не завершится процесс выполнения заказа:

DoCmd.OpenForm "ReviewOrderDetails", , , _

"OrderID =" & ID, , acDialog End If

End Function

Форма ReviewOrderDetailsпредоставляет сотрудникам склада два варианта для выбора. Если они щелкают мышью кнопку Ship(доставить), программа Access изменяет статус за­каза на Shipped (отправлен) и процесс завершается.

Private Sub Ship_Click( ) ' Эта форма закрывается DoCmd.Close

' Обратный переход к форме ShipOrders DoCmd.OpenForm "ShipOrders"

' Обновление заказа

' StatusID для статуса Shipped равен 4 Forms ("ShipOrders").StatusID = 4 DoCmd.RunCommand acCmdSaveRecord

End Sub

 
  Управление выполнением заказов - student2.ru

Рис. 17.15.В форму ReviewOrderDetailsне нужно включать подробности, касающиеся цены товара. Она разработана просто для того, чтобы представить наиболее эффективным способом работникам склада нужную им информацию. Форма ReviewOrderDetailsприменяет запрос с объединением для получения некоторых связанных данных, например, поля PartNumberиз таблицы Products

В свойствах Кнопка оконногоменю (Control Box) и Кнопка закрытия(Close Button) формы ReviewOrderDetailsустановлено значение Нет. В этом случае работники склада ни при каких обстоятельствах не могут закрыть это окно без щелчка мышью кнопки Ship (доставить) или Cancel(отмена). (Если не применять такой подход, придется писать до­полнительный код, который переустанавливает статус заказа, когда кто-нибудь щелкнет мышью пиктограмму х в правом верхнем углу окна, чтобы закрыть форму ReviewOrder­Details.)

Подсказка

В этом месте кода удобно применить метод DoCmd. OpenReport для вывода на печать отче­та, создающего транспортную наклейку со списком всех товаров, включенных в заказ.

Если же сотрудники щелкнут мышью кнопку Cancel(возможно, они выяснили, что на складе нет нужного количества товара), применяется аналогичный программный код для возврата заказу статуса New (новый):

Private Sub Cancel_Click()

' Закрытие этой формы DoCmd.Close

' Возврат к форме ShipOrder DoCmd.OpenForm "ShipOrders"

' Обновление заказа

Forms("ShipOrders").StatusID = 2

DoCmd.RunCoiranand acCmdSaveRecord End Sub

Эта часть завершает программный код, необходимый для координации обработки заказа. Как и формы, которые вы изучали в части IV, формы данного примера извлекают всю ин­формацию из таблиц вашей БД. Но в отличие от примеров, приведенных в части IV, они используют код для автоматического выполнения некоторой работы. Это отличие превра­щает ваши формы из простых средств ввода данных в Супероснащенные средства автомати­зации технологического процесса.

Подсказка

Можно создать специальное значение статуса для заказов, которые пытались выполнить, но не смогли (например, On Hold (незавершенный) или Waiting For Stock (ожидающий пополнения запаса)). В этом случае сотрудники склада будут знать о том, что не следует пытаться выпол­нять эти заказы. Если вы решили применить этот шаг, убедитесь, что код в процедуре ProcessOrder_Click исправлен, и можно обрабатывать заказы с указанным статусом.

Наши рекомендации