|
|
|
| В леточной форме одно из полей сделано как поле со списком. Данные (ControlSource) - одно из полей источника формы, источник строк(RowSource) - запрос. Т.о. при выборе значения из списка оно заносится в поле источника формы.
Задача: как заблокировать изменение данных при выборе значения из списка? | |
|
| |
|
|
|
| не совсем понял, но наверное сделать этот список свободным, т.е. очистить свойство ControlSource | |
|
| |
|
|
|
| Тогда он не будет отображать данные из источника формы.
Надо чтобы данные отображались, и можно было выбирать значения из списка. | |
|
| |
|
|
|
| Сделать поле со списком свободным
Данные будут отображаться - ведь источник строк - запрос
при выборе данных в полеСоСписком возникнет событие После обновления
на это событие повешать код
который будет проверять какое-то поле на наличие инфы
если ее (инфы) там нет то присваивать значение
а если есть то не присваивать значение
(вот только к чему все так сложно) | |
|
| |
|
|
|
| Источник строк(RowSource) определяет содержимое выпадающего списка - из чего выбирать, а ControlSource - это источник данных - определяет что отображает данный контрол по умолчанию. Конечно, логично, что при выборе из списка значение заносится в поле данных.
Проблема в том что у меня источник формы - запрос, и вносить данные непосредственно в это поле нельзя. По событию OnChange у меня работает код, который меняет идентификатор в таблице, и тогда запрос в форме отображает все правильно.
Остается заблокировать штатную функцию контрола. | |
|
| |
|
|
|
| если правильно понял - то мона юзер подсунуть не значение поля (которое он может менять) а например выражение = Trim(ПОЛЕ)
т.е.
если запрос
SELECT Naimen.Kod_N, Naimen.Naimen FROM Naimen;
переделать в
SELECT Naimen.Kod_N, Trim([naimen]) AS Выражение1 FROM Naimen;
то юзер будеть видеть тоже сомоё но менять - болт | |
|
| |
|
|
|
| хотя если полесосписком - длинное и большое кол-во запсией визуально лучше написать форму в которой можно и фильтровать и проч. и в этой форме выбирать нужное значение и передевать в главную.
п.с. форму для выбора лучше открыть в окне диалога. | |
|
| |
|
|
|
| Менять-то значение поля можно и нужно, только надо проверять, не вводится ли уже существующее значение. ПолеСоСписком для этого идеально подходит (автоподстановка). А если введено существующее значение, тогда надо не вводить новое, а изменить идентификатор. | |
|
| |
|
|
|
|
Задача: как заблокировать изменение данных при выборе значения из списка?
|
Менять-то значение поля можно и нужно, только надо проверять, не вводится ли уже существующее значение. ПолеСоСписком для этого идеально подходит (автоподстановка). А если введено существующее значение, тогда надо не вводить новое, а изменить идентификатор.
|
теперь ваще не понял. чего добиваемся - можно конкретным примером, так скорее поймем в чем проблема. может не в поле и не списке. | |
|
| |
|
|
|
| Да нет, вопрос то простой.
Я хочу чтобы ПолеСоСписком выполняло двойную задачу: отображало данные формы и позволяло выбирать значения из списка. Оно так и делает, если в ControlSource прописать имя поля данных а в RowSource - источник для списка.
Вот только когда в ПолеСоСписком выбирается значение, то оно автоматически записывается в поле данных, которое прописано в ControlSource.
А мне этого не надо.
На событии AfterUpdate повешен код, который и выполняет все, что нужно.
Как нибудь события изменения ПоляСоСписком перехватывать?
Пробовал DoCmd.CancelEvent - не помогает. | |
|
| |
|
|
|
|
|
оно будет меняться в каждой строке формы, после каждого изменения
|
Ничего подобного.
ПолеСоСписком в ленточной форме исправно отображает данные. При выборе из выпадающего списка новое значение записывается в ControlSource.
Проблема лишь в том, что мне не надо, чтоб записывалось. | |
|
| |
|
|
|
| сорь, да это если в него сохранять данные, а не ControlSource. | |
|
| |
|
|
|
|
если в него сохранять данные, а не ControlSource
|
Неправильно выразился. В смысле сохраняется в поле, которое указано в ControlSource.
В принципе, из положения я вышел.
Данные отображаю в обычном поле, а ПолеСоСписком засунул в примечание формы.
Это, конечно немного не то, но ладно... | |
|
| |
|
|
|
| вопрос - а насколько большой объем данных в запросе (кол-во записей) и насколько длиное поле??? | |
|
| |
|
|
|
| Маленький объём - пара сотен записей, поле - 50.
А, какая разница? | |
|
| |
|
|
|
| полесосписком - хорошо (если у тебя что-то такое кг, тн., л., м., п.м.), но нужно подумать как юзеры будут вводит лапками, насколько это удобно, если различие в названии будет в самом конце записи.
типа:
лист 8 мм. ст. 20 ТУ 14-160-490-04
лист 8 мм. ст. 20 ТУ 14-160-490-04 х/к
лист 8 мм. ст. 20 ТУ 14-160-490-04 г/к
лист 8 мм. ст. 20 ТУ 14-160-490-05
лист 8 мм. ст. 20 ТУ 14-160-190-04
если ширина списка на форме не все 50 символов, да и 50 символов может быть мало. | |
|
| |
|
|
|
| Смысл всей затеи был в том, что данные не просто вводятся.
Если значение новое, то оно должно добавляться в таблицу.
Если выбрано существующее, то в этой записи нужно изменить поле идентификатора.
Что дает применение поля со списком.
1. Данные отображаются и правятся в одном месте.
2. Для исправления существующих данных просто правим их в поле.
3. В случае ввода нового значения (в запросе могут отображаться пустые поля) ПолеСоСписком осуществляет автоподстановку. Дальше работает код. Если введено новое значение то оно записывается в таблицу. Если введено одно из существующих, то в таблице меняется поле идентификатора, и обновляются данные формы.
А ПолеСоСписком каждый раз пытается занести данные напрямую, и само собой, получает от аксесса:
"Изменения не были внесены из-за повторяющихся значений в индексе..." | |
|
| |
|
|
|
| если можно (и есть желание продолжать) напиши пример что делаем конкретно типа - "Таблица названий, таблица Приход, выбираем название, суем его код в приход и т.д." бо смысл действий не понятен.
Если введено новое значение то оно записывается в таблицу.
|
не совсем понятно - источник как правило это справочник чего-либо - значит мы должны занести новое значение в справочник (источник записей) а потом его код занести в нашу форму (какуюто таблицу),
а вот
Если введено одно из существующих, то в таблице меняется поле идентификатора, и обновляются данные формы.
|
не понять - что значит идентификатор??? у вас в таблице - поле идентификатор с разными значения - которое соответствует одному и тому-же названию
А ПолеСоСписком каждый раз пытается занести данные напрямую, и само собой, получает от аксесса:
"Изменения не были внесены из-за повторяющихся значений в индексе..."
|
судя по всему стоит проверка на уникальность, но если это поле содержит список (перечень Товара например) то оно и не должно быть уникальным.
как то странно все это. пример нужон. | |
|
| |
|
|
|
| Да, незачем в структуру базы углубляться.
Вопрос, собственно, был по контролу как таковому.
В ПолеСоСписком, ControlSource указывает поле, содержимое которого будет отображаться в контроле, изменяться, добавляться - т.е. функции простого поля. А RowSource указывает источник для выпадающего списка. ControlSource и RowSource - независимы друг от друга. Для RowSource можно взять значения из совершенно другой таблицы, а можно из того-же самого поля. При выборе из списка, выбранное значение записывается в поле, прописанное в ControlSource.
Это стандартный функционал для ПоляСоСписком - создаётся мастером.
Вопрос в том чтобы заблокировать запись в поле ControlSource.
Если это совсем никак нереализуемо - буду искать другие решения...
Если не будет влом... | |
|
| |
|
13 Кб. |
|
| У меня пока больше вопросов чем ответов
1. если передача данных в таблу(запрос) будет блокироваться то в каком случае данные должны передаваться в таблицу (запрос)
2. должен ли быть заблокирован сам комбобокс (разрешено ли делать какой-либо выбор)
может вот так ==>> | |
|
| |
|
|
|
|
то в каком случае данные должны передаваться в таблицу (запрос)
|
В случае AfterUpdate.
Код эту проблему обрабатывает.
должен ли быть заблокирован сам комбобокс
|
Нет.
Вся функциональность комбобокса должна остаться... За исключением собственно ЗАПИСИ. | |
|
| |