Добавление нового товара во время заполнения заказа
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 и затем отображается сообщение. Когда пользователь закрывает окно сообщения (щелкнув мышью кнопку Да или Нет), Visual 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
Рис. 17.12. Картофель в шоколадной глазури — в данный момент не предлагается в списке продуктов. Если его ввести и нажать клавишу <Enter>, программный код запросит подтверждение для добавления этого продукта в список
Далее предлагается код, добавляющий новый товар. В этом примере кода нет смысла самостоятельно включать товар полностью — в конце концов, для этого товара нужно предос-|тавить дополнительную информацию (например, цену или категорию), прежде чем считать [его допустимым. Вместо этого нужно отобразить другую форму для добавления товаров. Ключом решения может стать метод DoCmd. OpenForm:
' Попросите Access не беспокоиться, поскольку вы сами добавите
‘ пропущенный товар Response = acDataErrAdded
' Откройте форму AddProduct с тремя дополнительными аргументами
DoCmd.OpenForm "AddProduct", , , , , acDialog, NewData
Два аргумента, используемые в методе OpenForm, особенно важны.
■ acDialog открывает форму в диалоговом режиме, т. е. программа Access задерживает вызов кода в ProductID_NotInList до тех пор, пока форма AddProductзакрыта. Этот шаг важен, поскольку после завершения процесса добавления вам понадобится выполнить дополнительный код для обновления формы PlaceOrder.
■
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 в примерах к данной главе.