18c0693f

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


Теперь, когда заказ полностью сформирован, его следует сохранить в базе данных. Командная кнопка "Сохранить заказ" уже 'горит', и пользователю остается ее только нажать. Но прежде чем приводить программный код, стоит несколько слов сказать о том, как хранятся заказы в базе данных.

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

С программной точки зрения никаких особых новых проблем при передаче данных из полей документа в таблицы базы данных не возникает. Объекты ADO достаточно просто позволяют создать обновляемый набор записей, примеры этому уже приводились. Тем не менее, полагаю, есть смысл посмотреть на код обработчика события, возникающего при нажатии командной кнопки "Сохранить заказ". Вот он:

Private Sub SaveOrder_Click() 'Сохранение заказа OrderSave End Sub

Рассмотрим код процедуры, выполняющей основную работу:

Public Sub OrderSave() 'Сохранение заказа Dim myDate As Object Dim myCombo As ComboBox Dim curField As Range, curField1 As Range Dim i As Integer Dim BCount As Boolean BCount = True Set curField = Range("A34:D34") Set curField1 = Range("F34") With ThisWorkbook.Worksheets(1).OLEObjects Set myDate = .Item("AccountDate").Object Set myCombo = .Item("ListOfTeam").Object End With 'Проверка заполнения полей "Количество" i = 0 Do While (Not IsEmpty(curField.Offset(i))) BCount = BCount And Not IsEmpty(curField1.Offset(i)) i = i + 1 Loop If BCount Then 'Заполнены поля "Количество" 'Добавление записи в таблицу "Заказы" Cmd1.CommandText = "Select * From [Заказы]" With Rst1 If .State = adStateOpen Then .Close .Open Source:=Cmd1, CursorType:=adOpenDynamic, _ LockType:=adLockOptimistic .AddNew !Заказчик = Range("D19").Text !Сотрудник = myCombo.Text !ДатаЗаказа = myDate.Caption !Стоимость = Range("K46") .Update OrderCode = !КодЗаказа


End With 'Добавление нескольких записей в таблицу "Заказано" Cmd1.CommandText = "Select * From [Заказано]" With Rst1 If .State = adStateOpen Then .Close .Open Source:=Cmd1, CursorType:=adOpenDynamic, _ LockType:=adLockOptimistic ' Цикл по строкам таблицы заказов i = 0 Set curField = Range("A34") Set curField1 = Range("F34") Do While (Not IsEmpty(curField.Offset(i))) .AddNew !КодЗаказа = OrderCode !НазваниеКниги = curField.Offset(i) !Количество = curField1.Offset(i) !Стоимость = curField1.Offset(i, 5) .Update i = i + 1 Loop End With 'Выключить кнопку "Сохранить Заказ" With ThisWorkbook.Worksheets(1).OLEObjects .Item("SaveOrder").Object.Enabled = False 'Поле NDS сделать невидимым .Item("NDS").Visible = False .Item("LabelNDS").Visible = False End With 'Номер заказа становится номером счета Range("F16") = OrderCode Else MsgBox ("Задайте значения в полях Количество!") End If End Sub

Приведу комментарии к тексту процедуры:






Все публикации раздела