Заполнение формы

lev951

Подскажите начинающему. В форме нужно автоматически заполнить два поля, данные находятся в другой форме. Т.е мне нужно открыть вторую форму, поместить курсор в нужное поле, запомнить данные в этом поле и в следующем, и, при щелчке на нужном поле в первой форме заполнить это и следующее поле данными из второй формы. Т.е в первой форме нужно заполнить поля Наим_детали и №_в_каталоге этой же детали. Эти данные находятся в аналогичных полях однои из записей второй формы. Макросы не позволяют это сделать, а в VB я пока не разобрался, а нужно срочно! Можно, конечно скопировать и вставить, но это не удобно, да и теряются все прелести автоматизации процесса :)). Заранее благодарен.
5 ответов

lev951

1. Можно создать поля Наим_детали и №_в_каталоге в первой форме как поля со списком, а в качестве данных в списке указать поля из второй таблицы или запрос.2. Если тебе надо чтоб это автоматически происходило то у тебя должна быть связь между этими двумя таблицами, т.е. в первой таблице у тебя должен быть первичный ключ из второй таблицы (связь 1:М). Также у тебя должно быть одно поле в форме в котором ты должен указать первичный ключ из второй таблицы и на основе этого первичного ключа ты автоматически заполняешь поля Наим_детали и №_в_каталоге через VB. Создаешь процедуру обработки события “Изменение” или “После обновления” поля в форме где вводишь первичный ключ и пишешь:Dim db As DAO.Database, rst As DAO.Recordset' Установка указателя на текущую базу данныхSet db = CurrentDb' Открывается набор записей для таблицыSet rst = qd.OpenRecordset(“SELECT Наим_детали(либо соответствующие имя), №_в_каталоге(либо соответствующие имя) FROM указываешь имя второй таблицы WHERE (((Указываешь имя поля первичного ключа второй таблицы)) = ” & Me.Имя поля в первой форме где указал этот первичный ключ(имя поля на которое ты пишешь это событие), dbOpenDynaset)‘ Присваиваешь значения полямMe. Наим_детали(либо соответствующие имя) = rst! Наим_детали(либо соответствующие имя)Me. №_в_каталоге(либо соответствующие имя) = rst! №_в_каталоге(либо соответствующие имя)rst.CloseSet rst = NothingSet db = NothingМожет показаться сложным но это не так, думаю разберешься..P.S.Удачи…


lev951

Большое спасибо за участие. Но, как мне кажется, задача немного другая. Мне нужно автоматически заполнить два поля в форме (заказ) значениями, выбранными из одной из записей другой формы. Вторая форма это каталог деталей, в записях которой есть поля Наим_детали и №_в_каталоге, и там этих записей много, это запчасти данного оборудования. Т.е. я открываю каталог (форму), щёлкаю в нужном поле, где-то данные этого поля и следующего запоминаюся, потом закрываю каталог (форму) и щелкаю в нужном поле формы (заказ) и запомненные значения вносятся в это поле и следующее (Наим_детали и №_в_каталоге). Прошу извинить за назойливость!


lev951

Еще вариант:Основан он на том, что из модуля VBA одной формы доступно практически все, что есть в любой другой форме.Это есть процедура события "при щелчке на нужном поле (Наим_детали) в первой форме"
Private Sub Наим_детали_Click
If IsLoaded("ИмяФормы2") Then
 Me!Наим_детали = Forms("ИмяФормы2")!Наим_детали 
 Me!№_в_каталоге = Forms("ИмяФормы2")!№_в_каталоге
 Me.Dirty = False
End if
end sub
Функцию IsLoaded поищи по форуму


lev951

lev951 Немного не с той стороны ты подходишь к манипуляции данными, как мне кажетсяВ той схеме, которую ты привел, нужно манипулировать не "Наим_детали" и "№_в_каталоге", а кодом товара (в твоем случае - запчасти) или, по другому, первичным ключом товара в таблице справочника товаров (каталог).В таблице заказов должен быт этот код товара, а "Наим_детали" и "№_в_каталоге" не должен быть - это стандартная схема.И при выборе товара в каталоге нужно вставить код выбранного товара в таблицу заказов и лучше всего это делать не через манипуляцию с формой, а писать напрямую в таблицы. Хотя и через формы тоже можно.


lev951

1.Создаешь новый или используешь существующий модуль в Access (раздел модули) и в разделе описания переменных (после предложения Option Compare Database) пишешь следующее:•Public Naim_Detal(можешь указать своё вместо Naim_Detal) As String, Number_Katalog(можешь указать своё вместо Number_Katalog) As String (все в одной строчке)•Сохраняешь2.Открываешь форму каталог в режиме конструктора.3.Выделяешь элемент управления поле «Наим_детали».4.В окне свойства выбираешь вкладку «События», и устанавливаешь значения события «Получение фокуса» в процедуру обработки события и щелкаешь на кнопке с тремя точками напротив этого события.5.Открывается редактор VB и в окне редактора появится:Private Sub ….(здесь будет указано имя процедуры и ёе параметры если они есть)…Пишешь здесьNaim_Detal(или свое если указал другое) = Me.Наим_детали…End Sub6.Повторяешь пункты 3 – 5 но уже вместо поля «Наим_детали» указываешь поле «№_в_каталоге» а в VBPrivate Sub ….(здесь будет указано имя процедуры и ёе параметры если они есть)…Пишешь здесьNumber_Katalog (или свое если указал другое) = Me.[№_в_каталоге]…End Sub7.Открываешь форму Заказы в режиме конструктора.8.Повторяешь пункты 3-5 для одноименных полей и в VB указываешь•Для «Наим_детали»Me. Наим_детали = Naim_Detal(или свое если указал другое)•Для «№_в_каталоге»Me.[№_в_каталоге] = Number_Katalog (или свое если указал другое)9.Компилируешь код Debug -> Compile …10.Проверяй работуУчти что если ты в форме каталог будешь переходить от одной записи к другой значения сохранятся только той записи которую ты выбрал последней «Наим_детали» тоже самое и для «№_в_каталоге»P.S.Мой тебе совет добавь в форме каталог после поля «№_в_каталоге» кнопку и выбери обработку события на «нажатие кнопки» и м в VB укажи:Private Sub ….(здесь будет указано имя процедуры и ёе параметры если они есть)…Пишешь здесьNaim_Detal(или свое если указал другое) = Me.Наим_деталиNumber_Katalog (или свое если указал другое) = Me.[№_в_каталоге]…End SubТоже самое для формы заказы и в VB укажи…Private Sub ….(здесь будет указано имя процедуры и ёе параметры если они есть)…Пишешь здесьMe. Наим_детали = Naim_Detal(или свое если указал другое)Me.[№_в_каталоге] = Number_Katalog (или свое если указал другое)…End SubТак будет намного интересней…Оба варианта должны работать, если все сделаешь правильно…