Столкнулся с тем, что надо сделать базу. Первая мысль конечно php+MySQL все, что нужно для счастья, но по условию надо использовать базу Microsoft Access. Долго думал, как забивать данные в базу: 1. Писать программу на чем-нибудь стороннем, например DEPLHI либо 2. воспользоваться стандартными средствами вышеупомянутого MS Access (формы, запросы). Решил остановится на втором варианте.
Долго бился с формами, ибо отказался от услуг Мастера и выбрал конструктор. Первая проблема как считать в "поле со списком" значения из таблицы, причем так, в списке было названия, а в качестве данных индификатор. Решение простое. Просто пишем запрос так как нам надо:
SELECT table.name, table.id FROM table
Получим два столбца. Первый будет в списке. Затем выставляем свойства "после со списком":
Количество столбцов = 1 //сколько будет отображать
Присоединенный столбец =2 //какой столбец будет в качестве данных
Продолжая тему, надо сказать, что свойство Данные у "поле со списком" - это есть ни что иное как указание на поле в таблице откуда данные будут читаться в этот список и куда будут записываться из него. Ну и чтобы здесь не мучиться с выражениями в свойстве "Форма" Источник записей задать таблицу, в которую будет все писаться.
Вторая проблема. Изменение одного списка при изменении второго. Не думал, что так можно однако просто в запросе поля, которое должен изменяться написать условие. Где в качестве параметра указать значение поля, вызвавшего изменение:
SELECT table.name table.id FROM table WHERE table.typeid=[pole1]
И не забываем также в событии После обновления "pole1" написать:Me![pole2].Requery
Пожеланию можно выбрать начальное значение:
Me![pole2]=Me![pole2].itemdata(0)
Проблема номер три. Вставка данных из того же поля предыдущей записи. Поясню. Допустим нам надо сделать буза сотрудников которая будет состоять из отдела и имени сотрудника. В нормальном использовании форм, после каждого добавления сотрудника оба поле на форме будут чистыми. А как бы было приятно, если бы отдел оставался с предыдущего значения, так как в одном отделе у нас трудятся много сотрудников.Однако авторы MS Access придумали замечательные горячие клавиши "CTRL+'(апостроф)", которые выполняют данную функцию, но только для того поля, на котором стоит фокус. А если полем много? Кликать на все? Вот и захотелось это сделать как-то автоматически. Даже нашел в Интернете ответ на этот вопрос (там он 239). Однако ничего подобного. SendKeys не дает нужно результата, если фокус выставлять программно, но если кнуть мышкой то конечно все работает, однако меня такой способ не устраивал.
Думал, думал и решил воспользоваться двумя мудростями "Умный в гору не пойдет - умный гору обойдет" и "Не надо экономить на переменных".
Dim id1 As Integer
Private Sub ПолеСоСписком1_GotFocus()
If Me![ПолеСоСписком1].Text = "" Then Me![ПолеСоСписком1] = id1
End Sub
Private Sub ПолеСоСписком1_LostFocus()
id1 = Me![ПолеСоСписком1]
End Sub
Что я такого сделал? Да все просто. Использовал два события "Потеря фокуса" и "Получение фокуса" при потере фокуса запоминаю в глобальную переменную значение поля и при получении фокуса присваиваю её значение полю, если он пустое. Таким образом для большего количество полей - необходимо много переменных и обработчиков событий. С одной стороны плохо, но с другой стороны все работает отлично.
В итоге я так для себя и не разобрался хорошо MS Access или плохо, но то что узнал о нем много чего хорошего и полезно - это хорошо и полезно. А прогу на DELPHI все равно наверно напишу... ну не красиво пользователю базу в таком виде давать, пусть и с формами...