Rambler's Top100
Форум: MS ACCESSVBVBA MS OfficeMS SQL server
Новые сообщения: 0000

Форум: MS ACCESS

Вопросы связанные с MS ACCESS

Обновить визитку
Участники «Online»
Все участники

 
 

Доброго времени суток, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Поле со списком
 
 автор: Lvm   (04.08.2010 в 11:05)   личное сообщение
 
 

В леточной форме одно из полей сделано как поле со списком. Данные (ControlSource) - одно из полей источника формы, источник строк(RowSource) - запрос. Т.о. при выборе значения из списка оно заносится в поле источника формы.
Задача: как заблокировать изменение данных при выборе значения из списка?

  Ответить  
 
 автор: osmor   (04.08.2010 в 11:13)   личное сообщение
 
 

не совсем понял, но наверное сделать этот список свободным, т.е. очистить свойство ControlSource

  Ответить  
 
 автор: Lvm   (04.08.2010 в 11:17)   личное сообщение
 
 

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

  Ответить  
 
 автор: snipe   (04.08.2010 в 11:26)   личное сообщение
 
 

Сделать поле со списком свободным
Данные будут отображаться - ведь источник строк - запрос

при выборе данных в полеСоСписком возникнет событие После обновления
на это событие повешать код
который будет проверять какое-то поле на наличие инфы
если ее (инфы) там нет то присваивать значение
а если есть то не присваивать значение

(вот только к чему все так сложно)

  Ответить  
 
 автор: Lvm   (04.08.2010 в 11:38)   личное сообщение
 
 

Источник строк(RowSource) определяет содержимое выпадающего списка - из чего выбирать, а ControlSource - это источник данных - определяет что отображает данный контрол по умолчанию. Конечно, логично, что при выборе из списка значение заносится в поле данных.
Проблема в том что у меня источник формы - запрос, и вносить данные непосредственно в это поле нельзя. По событию OnChange у меня работает код, который меняет идентификатор в таблице, и тогда запрос в форме отображает все правильно.
Остается заблокировать штатную функцию контрола.

  Ответить  
 
 автор: kot_k_k   (04.08.2010 в 11:33)   личное сообщение
 
 

если правильно понял - то мона юзер подсунуть не значение поля (которое он может менять) а например выражение = Trim(ПОЛЕ)
т.е.
если запрос
SELECT Naimen.Kod_N, Naimen.Naimen FROM Naimen;

переделать в
SELECT Naimen.Kod_N, Trim([naimen]) AS Выражение1 FROM Naimen;

то юзер будеть видеть тоже сомоё но менять - болт

  Ответить  
 
 автор: kot_k_k   (04.08.2010 в 11:36)   личное сообщение
 
 

хотя если полесосписком - длинное и большое кол-во запсией визуально лучше написать форму в которой можно и фильтровать и проч. и в этой форме выбирать нужное значение и передевать в главную.

п.с. форму для выбора лучше открыть в окне диалога.

  Ответить  
 
 автор: Lvm   (04.08.2010 в 11:51)   личное сообщение
 
 

Менять-то значение поля можно и нужно, только надо проверять, не вводится ли уже существующее значение. ПолеСоСписком для этого идеально подходит (автоподстановка). А если введено существующее значение, тогда надо не вводить новое, а изменить идентификатор.

  Ответить  
 
 автор: kot_k_k   (04.08.2010 в 13:04)   личное сообщение
 
 


Задача: как заблокировать изменение данных при выборе значения из списка?




Менять-то значение поля можно и нужно, только надо проверять, не вводится ли уже существующее значение. ПолеСоСписком для этого идеально подходит (автоподстановка). А если введено существующее значение, тогда надо не вводить новое, а изменить идентификатор.



теперь ваще не понял. чего добиваемся - можно конкретным примером, так скорее поймем в чем проблема. может не в поле и не списке.

  Ответить  
 
 автор: Lvm   (04.08.2010 в 14:18)   личное сообщение
 
 

Да нет, вопрос то простой.
Я хочу чтобы ПолеСоСписком выполняло двойную задачу: отображало данные формы и позволяло выбирать значения из списка. Оно так и делает, если в ControlSource прописать имя поля данных а в RowSource - источник для списка.
Вот только когда в ПолеСоСписком выбирается значение, то оно автоматически записывается в поле данных, которое прописано в ControlSource.
А мне этого не надо.
На событии AfterUpdate повешен код, который и выполняет все, что нужно.

Как нибудь события изменения ПоляСоСписком перехватывать?
Пробовал DoCmd.CancelEvent - не помогает.

  Ответить  
 
 автор: kot_k_k   (05.08.2010 в 09:00)   личное сообщение
 
 

зачем так сложно и запутано, посмотри соседний топ "Выбор товара" там оsmor дал ссылку на хороший пример ввода данных из справочника.

п.с. если ПолеСоСписком - просто поле в ленточной форме (не поле таблы) - оно будет меняться в каждой строке формы, после каждого изменения - юзеров удар хватит.

  Ответить  
 
 автор: Lvm   (05.08.2010 в 09:29)   личное сообщение
 
 


оно будет меняться в каждой строке формы, после каждого изменения


Ничего подобного.
ПолеСоСписком в ленточной форме исправно отображает данные. При выборе из выпадающего списка новое значение записывается в ControlSource.
Проблема лишь в том, что мне не надо, чтоб записывалось.

  Ответить  
 
 автор: kot_k_k   (05.08.2010 в 09:39)   личное сообщение
 
 

сорь, да это если в него сохранять данные, а не ControlSource.

  Ответить  
 
 автор: Lvm   (05.08.2010 в 10:44)   личное сообщение
 
 


если в него сохранять данные, а не ControlSource



Неправильно выразился. В смысле сохраняется в поле, которое указано в ControlSource.

В принципе, из положения я вышел.
Данные отображаю в обычном поле, а ПолеСоСписком засунул в примечание формы.
Это, конечно немного не то, но ладно...

  Ответить  
 
 автор: kot_k_k   (05.08.2010 в 11:39)   личное сообщение
 
 

вопрос - а насколько большой объем данных в запросе (кол-во записей) и насколько длиное поле???

  Ответить  
 
 автор: Lvm   (05.08.2010 в 11:54)   личное сообщение
 
 

Маленький объём - пара сотен записей, поле - 50.
А, какая разница?

  Ответить  
 
 автор: kot_k_k   (05.08.2010 в 13:10)   личное сообщение
 
 

полесосписком - хорошо (если у тебя что-то такое кг, тн., л., м., п.м.), но нужно подумать как юзеры будут вводит лапками, насколько это удобно, если различие в названии будет в самом конце записи.
типа:

лист 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 символов может быть мало.

  Ответить  
 
 автор: Lvm   (05.08.2010 в 14:07)   личное сообщение
 
 

Смысл всей затеи был в том, что данные не просто вводятся.
Если значение новое, то оно должно добавляться в таблицу.
Если выбрано существующее, то в этой записи нужно изменить поле идентификатора.

Что дает применение поля со списком.

1. Данные отображаются и правятся в одном месте.
2. Для исправления существующих данных просто правим их в поле.
3. В случае ввода нового значения (в запросе могут отображаться пустые поля) ПолеСоСписком осуществляет автоподстановку. Дальше работает код. Если введено новое значение то оно записывается в таблицу. Если введено одно из существующих, то в таблице меняется поле идентификатора, и обновляются данные формы.

А ПолеСоСписком каждый раз пытается занести данные напрямую, и само собой, получает от аксесса:
"Изменения не были внесены из-за повторяющихся значений в индексе..."

  Ответить  
 
 автор: kot_k_k   (05.08.2010 в 14:32)   личное сообщение
 
 

если можно (и есть желание продолжать) напиши пример что делаем конкретно типа - "Таблица названий, таблица Приход, выбираем название, суем его код в приход и т.д." бо смысл действий не понятен.


Если введено новое значение то оно записывается в таблицу.



не совсем понятно - источник как правило это справочник чего-либо - значит мы должны занести новое значение в справочник (источник записей) а потом его код занести в нашу форму (какуюто таблицу),

а вот


Если введено одно из существующих, то в таблице меняется поле идентификатора, и обновляются данные формы.



не понять - что значит идентификатор??? у вас в таблице - поле идентификатор с разными значения - которое соответствует одному и тому-же названию


А ПолеСоСписком каждый раз пытается занести данные напрямую, и само собой, получает от аксесса:
"Изменения не были внесены из-за повторяющихся значений в индексе..."



судя по всему стоит проверка на уникальность, но если это поле содержит список (перечень Товара например) то оно и не должно быть уникальным.

как то странно все это. пример нужон.

  Ответить  
 
 автор: Lvm   (06.08.2010 в 11:38)   личное сообщение
 
 

Да, незачем в структуру базы углубляться.
Вопрос, собственно, был по контролу как таковому.
В ПолеСоСписком, ControlSource указывает поле, содержимое которого будет отображаться в контроле, изменяться, добавляться - т.е. функции простого поля. А RowSource указывает источник для выпадающего списка. ControlSource и RowSource - независимы друг от друга. Для RowSource можно взять значения из совершенно другой таблицы, а можно из того-же самого поля. При выборе из списка, выбранное значение записывается в поле, прописанное в ControlSource.
Это стандартный функционал для ПоляСоСписком - создаётся мастером.
Вопрос в том чтобы заблокировать запись в поле ControlSource.
Если это совсем никак нереализуемо - буду искать другие решения...

Если не будет влом...

  Ответить  
 
 автор: snipe   (06.08.2010 в 11:48)   личное сообщение
13 Кб.
 
 

У меня пока больше вопросов чем ответов
1. если передача данных в таблу(запрос) будет блокироваться то в каком случае данные должны передаваться в таблицу (запрос)
2. должен ли быть заблокирован сам комбобокс (разрешено ли делать какой-либо выбор)

может вот так ==>>

  Ответить  
 
 автор: Lvm   (06.08.2010 в 12:47)   личное сообщение
 
 


то в каком случае данные должны передаваться в таблицу (запрос)


В случае AfterUpdate.
Код эту проблему обрабатывает.


должен ли быть заблокирован сам комбобокс


Нет.
Вся функциональность комбобокса должна остаться... За исключением собственно ЗАПИСИ.

  Ответить  
HiProg.com - Технологии программирования
Rambler's Top100 TopList