Мир объектов Excel 2000

         

Сохранение реквизитов


Как я говорил ранее, иногда информация создается при формировании документа и тогда крайне желательно, чтобы она тут же была занесена в базу данных. Эта ситуация достаточно естественно появляется при работе с нашим документом. Действительно, представьте, что появился новый заказчик, о котором нет сведений в базе данных. Тогда данные о нем, - его реквизиты естественно придется вручную занести в соответствующие поля документа. Инструментальная кнопка "Сохранить" поможет перенести эту информацию в базу данных.

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

Private Sub CommandButton2_Click() 'Сохранить реквизиты заказчика CreateNewCustomer End Sub

Процедура CreateNewCustomer, решающая задачу имеет вид:

Public Sub CreateNewCustomer() 'добавление записи в базу данных Dim recExist As Boolean Dim curField As Range Dim txtField As String, txtTel As String, txtMail As String Cmd1.CommandText = "Select * From [Заказчики]" Set curField = Range("D19") 'Поле с названием организации txtField = curField.Text 'Открытие обновляемого объекта Recordset With Rst1 If Rst1.State = adStateOpen Then Rst1.Close .Open Source:=Cmd1, CursorType:=adOpenDynamic, _ LockType:=adLockOptimistic

recExist = False .MoveFirst Do While Not .EOF 'Проверка существования записи If LCase(!Название) = LCase(txtField) Then recExist = True .MoveNext Loop If Not recExist Then .AddNew !Название = txtField txtField = curField.Offset(1).Text !Адрес = txtField txtField = curField.Offset(2).Text Call Parsing(txtField, txtTel, txtMail) !Телефон = txtTel !Email = txtMail 'Запрос значений недостающих полей AddingFields.Show .Update Else MsgBox ("В базе данных уже существует" _ & " организация с таким названием!") End If End With End Sub

На три момента хочу обратить внимание:

  • При добавлении записей в базу данных приходится иметь дело с обновляемым набором записей, который открывается методом Open, а не создается, как это было ранее, при выполнении метода Execute объекта Command. Подробнее об этом я писал в предыдущих главах, посвященных объектам ADO.
  • Наш пример сконструирован так, что он позволяет продемонстрировать некоторые побочные проблемы, возникающие при передаче данных из документа в базу данных. В частности, информация о телефоне и электронном адресе записана в одном поле бланка документа. Поэтому, прежде чем она попадет в соответствующие поля записи базы данных, необходим разбор соответствующей строки. В нашем случае разбор прост, и осуществляет его вызываемая процедура Parsing. Приведу текст этой процедуры:


    Public Sub Parsing( Field As String, Tel As String, Mail As String) 'разбор поля бланка, содержащего телефон и EMail организации Dim Ind1 As Integer Ind1 = InStr(5, Field, "Email") Tel = Mid(Field, 5, Ind1 - 5) Mail = Right(Field, Len(Field) - Ind1 - 5) End Sub
  • Еще одна часто возникающая проблема состоит в том, что запись базы данных может содержать больше информации, чем задается в полях документа. В этом случае целесообразно запросить всю необходимую информацию. Я демонстрирую этот подход на примере полей "Город" и "Директор", которые есть в базе данных, но не вынесены в раздел реквизитов нашего документа. Заметьте, с этой целью, прежде чем обновить запись, вызывается специальная форма, которой я дал имя AddingFields, и которая содержит текстовые поля для занесения необходимой информации. Вот как выглядит эта форма в процессе работы:



Рис. 7.6.  Форма AddingFields, позволяющая добавить сведения о полях базы данных

При нажатии кнопки "OK" формы AddingFields текст из полей формы переносится в поля записи, после чего форма закрывается:

Private Sub CommandButton1_Click() 'Добавление полей "Город" и "Директор" в запись Rst1!Город = Me.TextBox1.Text Rst1!Директор = Me.TextBox2.Text Me.Hide End Sub

После закрытия формы управление возвращается в процедуру CreateNewCustomer, где и выполняется оператор Update, добавляющий полностью сформированную запись в таблицу "Заказчики" нашей базы данных.


Содержание раздела