2016-12-12 5 views
1
  • У меня есть форма (Заказов) и второстепенная форма в нем (Purchase Order Details). Главная форма содержит Количество в (текстовое поле) PO, Поставщик (комбо-бокс), Сотрудник (комбо-бокс), Статус (комбо-бокс), который содержит 2 записи (New и Done) и дата коробка (когда создано ПО). Под форму (техническое описание) содержится Продукт (combo-box), Количество и a Цена Поле.MS Access VBA Запись в таблицу из формы

  • Что я хочу сделать, это добавить кнопку на основной форме, которая будет делать дальше.

  • Когда кнопка нажата, код VBA должен быть выполнен и делать следующее. Примите данные из Основной формы (номер заказа, статуса и даты) и под форму (продукт, количество и цена) и поместите все это в таблицу (StockMovements).

мне удалось сделать это с помощью следующего кода:

Private Sub cmdOrder_Click() 
Dim strSQL As String 

    strSQL = "INSERT INTO StockMovement (ID_Product, Status, Quantity, ID_PurchaseOrder) VALUES (" & _ 
       Me.frmPurchaseOrderDetails_Subform.Form!comboboxProduct & ", '" & _ 
       Me!txtStatus & "', " & _ 
       Me.frmPurchaseOrderDetails_Subform.Form!txtQuantity & ", " & _ 
       Me!txtID_PurchaseOrder & ");" 
    DoCmd.RunSQL strSQL 
    Me.Requery 

End Sub 

Однако, есть 2 проблемы:

  1. Как вы можете видеть, я не добавить поле даты, потому что я получаю ошибка, не могу вспомнить, какой из них был точно, но я думаю, 2075;
  2. Код работает без даты, но только добавляет один Продукт в таблицу , первую. И в Заказе на покупку обычно больше , чем один продукт.

Потому что я совершенно новый в VBA, прошу вас обращаться со мной как с новичком и объяснить более подробно, если это возможно. (Исправлен код, забыл изменить язык. Я имею в виду, что я вставил неправильный, теперь его правый, но все еще не работает):

Спасибо!

ответ

0

1) Если у вас есть проблема только с одним конкретным полем, я бы проверил, что особенного с этим. Вероятно, ввод форматируется как строка и поле как дата/время. В этом случае попробуйте использовать функцию CDate() - Function. Я мог себе представить, что в конечном итоге проблема может решить проблему.

Dim datDate as Date 

datDate = CDate(Me!txtDate.Value) 

2) Что ваш код вставляет только одну строку, является абсолютно правильной. Помните, что, например, Me! TxtStatus.Value - это текстовое поле, содержащее только одну единицу данных. Строки данных сохраняются в таблице и в зависимости от выбранной вами строки с основной формой (= одна строка) соответствующее значение отображается в текстовом поле.

INSERT INTO table (field1,field2) VALUES (value1,value2) 

INSERT INTO Вставляет одну строку при каждом ее выполнении. Поэтому SQL в коде, который вы упомянули, нужно повторить. Вы можете сделать это с помощью циклов.

Dim strSQL As String 

strSQL = "" 

For Each Item In Group 
    strSQL = strSQL & "INSERT INTO table (field1,field2) VALUES (value1,value2)" 
Next 

На мой взгляд, копирование данных таким образом абсолютно раздражает VBA. Вам нужно создавать наборы записей, изменять их и объединять. Я постараюсь решить как можно больше с помощью Access Non-VBA-Solutions.

Мой вопрос к вам: Вы подумали о том, чтобы связать форму (и подформу) непосредственно со столом (ами)?

+0

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

+0

'код Private Sub cmdOrder_Click() Dim strSQL As String strSQL = "" для каждого элемента в группе strSQL = strSQL и "INSERT INTO StockMovement (ID_Product, состояние, количество, ID_PurchaseOrder) VALUES (" & Me.frmPurchaseOrderDetails_Subform .FORM! comboboxProduct &»," & Me! txtStatus & ", "& Me.PurchaseOrderDetails_Subform.Form! txtQuantity &", "& Me! txtID_PurchaseOrder & ");" Следующая DoCmd.RunSQL strSQL Me.Requery End Sub code' Я получаю ошибку времени выполнения «13», несоответствие типа. Когда я иду на отладку, ma kes «Для каждого элемента в группе» желтый. –

0

Дату можно вставить таким образом:

"INSERT INTO StockMovement ([DateField]) " & _ 
"VALUES (#" & Format(Me!DateField.Value, "yyyy\/mm\/dd") & "#)" 

Тем не менее, ваш код будет вставить одну запись только. Чтобы вставить несколько записей, вам нужно выбрать запрос или - гораздо быстрее - используйте DAO, чтобы открыть целевую таблицу в качестве набора записей, а затем, в качестве источника, сформируйте RecordsetClone вашей подформы и скопируйте записи в целевую таблицу по один.

+0

Вещь у меня есть 0 опыта в VBA:/ Возможно, у вас есть пример для этого? Что касается даты, я решил оставить ее и установить значение по умолчанию в таблице = Now() в таблице, поэтому она всегда ставит дату, когда запись была добавлена ​​в таблицу. –

+0

У меня нет такого кода прямо под рукой, извините. Не сложно, хотя и не «умный». Используйте '= Date()', а не '= Now()', если вы хотите записать дату без какого-либо времени. – Gustav

+0

Хорошо спасибо, попробуем исследовать DAO. –

Смежные вопросы