Добавление нового товара во время заполнения заказа

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

Обычно список подстановки для поля ProductIDне разрешает такого рода создание но­вого товара на лету. Если попытаться ввести название несуществующего товара, вы получи­те строгую отповедь от программы Access. Но добавление новых элементов в список на ходу — распространенный метод программирования в Access и специальное событие разработано, чтобы помочь вам в этом: Отсутствие в списке(On Not In List).

Если ввести несуществующий товар и применить событие Отсутствие в списке(On Not

In List), программа Access начнет с кода обработки события. Можно создать элемент списка, вывести сообщение или исправить проблему до того, как Access выразит недовольство.

У события Отсутствие в списке(On Not In List) два параметра: NewData и Response. NewData — это данные, которые набираются в поле списка и которых еще нет в списке. Response — это значение, предоставляемое для того, чтобы сообщить программе Access о том, как решать проблему.

Далее приведен базовый скелет подпрограммы, создаваемой Access, если выбрана обра­ботка события Отсутствие в списке(On Not In List) для поля с именем ProductID:

Private Sub ProductID_NotInList(NewData As String, Response As Integer) End Sub

Когда возникает событие Отсутствие в списке(On Not In List), прежде всего, нужно спросить пользователей, работающих с формой, означает ли это — желание ввести несуще­ствующий товар. Выполнить этот шаг можно с помощью знакомой функции MsgBox, ис­пользуемой необычным образом. Сначала нужно сообщить программе Access о необходимо­сти создать окно сообщения с двумя кнопками: Да (Yes) и Нет(No). Затем нужно суметь перехватить возвращаемое функцией MsgBox значение, чтобы определить, какая кнопка была нажата:

Dim ButtonClicked

ButtonClicked = MsgBox("Do you want to add a new product?", vbYesNo)

В данном коде создается переменная ButtonClicked и затем отображается сообщение. Когда пользователь закрывает окно сообщения (щелкнув мышью кнопку Да или Нет), Vis­ual Basic помещает в переменную ButtonClicked число, которое сообщает вам о том, что произошло. Число равно 6, если была нажата кнопка Да, и 7, если была нажата кнопка Нет. Но вместо того, чтобы обрабатывать непосредственно числа и увеличивать риск ошибки, можно воспользоваться полезными константами vbYes (которая равна 6) и vbNo (которая равна 7).

Далее приведен до некоторой степени законченный код обработчика события Отсутст­вие в списке(On Not In List). Он выводит на экран сообщение, запрашивающее о необходи­мости добавления нового элемента в список (рис. 17.12), и затем отменяет редактирование списка, если пользователь, работающий с формой, нажал кнопку Нет:

Private Sub ProductID_NotInList(NewData As String, Response As Integer) ' Отображает сообщение Да/Нет и получает результат

Dim ButtonClicked

ButtonClicked = MsgBox("Do you want to add a new product for " & _

NewData & "?", vbYesNo)

' Visual Basic предоставляет удобные константы vbYes и vbNo,

' которые можно использовать для определения нажатой кнопки

If ButtonClicked = vbNo Then

' Отмена редактирования

ProductID.Undo

' Сообщает Access о запрете вывода сообщения об ошибке.

' Вы уже обработали ее

Response = acDataErrContinue

Else

' (Поместите сюда код для добавления нового товара в список)

End If End Sub

 
  Добавление нового товара во время заполнения заказа - student2.ru

Рис. 17.12. Картофель в шоколадной глазури — в данный момент не предлагается в списке продуктов. Если его ввести и нажать клавишу <Enter>, программный код запросит подтверждение для добавления этого продукта в список

Далее предлагается код, добавляющий новый товар. В этом примере кода нет смысла са­мостоятельно включать товар полностью — в конце концов, для этого товара нужно предос-|тавить дополнительную информацию (например, цену или категорию), прежде чем считать [его допустимым. Вместо этого нужно отобразить другую форму для добавления товаров. Ключом решения может стать метод DoCmd. OpenForm:

' Попросите Access не беспокоиться, поскольку вы сами добавите

‘ пропущенный товар Response = acDataErrAdded

' Откройте форму AddProduct с тремя дополнительными аргументами

DoCmd.OpenForm "AddProduct", , , , , acDialog, NewData

Два аргумента, используемые в методе OpenForm, особенно важны.

■ acDialog открывает форму в диалоговом режиме, т. е. программа Access задерживает вызов кода в ProductID_NotInList до тех пор, пока форма AddProductзакрыта. Этот шаг важен, поскольку после завершения процесса добавления вам понадобится выполнить дополнительный код для обновления формы PlaceOrder.

 
  Добавление нового товара во время заполнения заказа - student2.ru

NewData принимает вновь введенные данные и присваивает их свойству AddProduct.OpenArgs. В этом случае форма AddProductможет извлечь их, когда запустится, и самостоятельно откорректировать.

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

Private Sub Form_0pen(Cancel As Integer)

ProductName = Form.OpenArgs

End Sub

На рис. 17.13 показано, как выглядит эта форма.

Рис. 17.13.Форма AddProductпозволяет ввести остальные данные для нового товара, который вы хотите создать. Обратите внимание на то, что форма открывается как всплывающая, и программа Access автоматически считает, что вы вставляете новую запись (а не просматриваете имеющиеся товары). Access действует таким образом, поскольку в свойствах формы Всплывающее окно (Pop Up)и Ввод данных(Data Entry) задано значение Да

После того как вся информация о товаре введена, можно закрыть форму AddProduct.В этот момент в процедуре ProductID_NotInList выполняется немного дополнительного кода. Он расположен сразу после оператора DoCmd. OpenForm. Его задача — обновить новый элемент заказа, чтобы использовать товар, который вы только что ввели:

' Отмена редактирования, поскольку нужно обновить список

' прежде, чем вы сможете выбрать новый товар ProductID.Undo

' Обновление списка ProductlD.Requery

' Теперь ищется ProductID для вновь введенного товара с помощью DLookup

Product ID = DLookup (“ID”, "Products", "ProductName='" & NewData & '"")

Примечание

Этот код выполняется, даже если вы отменили вставку нового товара, нажав клавишу <Esc> в форме AddProduct.В этом случае функция DLookup не сможет ничего найти, поэтому вернет Null (пустое значение) в поле ProductlD.В результате вы получите знакомое предупреж­дающее сообщение программы Access, извещающее о том, что выбранного вами товара нет в списке.

Еще одно уточнение. Когда возникает событие Отсутствие в списке(On Not In List), со­бытие Изменение(On Change) уже произошло. Таким образом, вы уже упустили возмож­ность выполнить код, применявшийся ранее для вставки соответствующей цены в поле Priceсписка элементов заказа.

К счастью, эту проблему можно решить довольно легко. Нужно добавить еще одну стро­ку кода, которая заставит программу Access двигаться дальше, и снова выполнить обработ­чик события (процедуру ProductID_Change): Product ID_Change

Для того чтобы увидеть полный программный код к этому примеру, обратитесь к БД Boutique Fudge в примерах к данной главе.

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