powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Добавление из поля со списком
16 сообщений из 16, страница 1 из 1
Добавление из поля со списком
    #32238322
Нужна помощь

К примеру: есть две таблицы:
Категории (id int auto_increment primary key, name char (50))
Товары (id int auto_increment primary key, name char (50), category_id int)

С Access'ом только начал работать. Таблицы создавать не проблема, формы - для несвязаных таблиц - тоже :) Но вот со связанными таблицами - проблема.

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

Как это можно сделать в Access, что для этого нужно использовать (Мастер связи таблиц или VBA) ?

С уважением, Каримбаев Тимур
...
Рейтинг: 0 / 0
Добавление из поля со списком
    #32238323
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
А вот как раз очень похожий вопрос:\r
\r
/topic/44314
...
Рейтинг: 0 / 0
Добавление из поля со списком
    #32238334
Спасибо, вопрос похож, но мне надо немного другое, а я в Access - чайник, поэтому не могу связать эти две темы.

Вот мой вопрос:
Есть две таблицы (описаны выше)

Есть форма, в которой есть поле со списком - это поле связано с таблицей Категории (причем видимый столбец таблицы в списке - "название", а присоединенный "id"). Я хочу сделать так, чтобы в поле со списком можно было выбрать существующий (проблем нет), а можно и вписать новый - при этом мне выдается сообщение, о том что такого значения в списке нет. Можно при NotInList добавлять значение в таблицу Категории - тогда все нормально, но я хочу чтобы новое значение просто осталось в списке (не добавляясь в таблицу), а добавлялось только потом (например при нажатии на кнопку).

Если сформулировать вопрос короче: поле со списком связано с таблицей, причем установлено свойство "Ограничить списком" (снять его нельзя), надо: если вбито значение которого нет в списке - просто погасить ошибку, не добавляя значение в таблицу.

С уважением Каримбаев Тимур
...
Рейтинг: 0 / 0
Добавление из поля со списком
    #32238348
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Да, задача действительно другая. Мне кажется, что это невозможно. Если список сидит на таблице, то он не может показывать еще и те значения, которых в таблице нет. Если я ошибаюсь, пусть старшие товарищи меня поправят...
...
Рейтинг: 0 / 0
Добавление из поля со списком
    #32238351
Тогда вопрос другой:
(Я ведь почти не работал с Access и VBA)

Можно ли содержание списка заполнять самому ?
Как это делать ?
Т.е. я смогу сделать запрос к таблице, выбрать оттуда все, что мне надо, а вот вставить это в список на форме не смогу (у меня почему-то нет хелпа по VBA, а желательно сделать сегодня-завтра). Как заполнить список, который будет показывать одно поле (название), а в качестве значения - другое (id) ?

Как я понимаю: если получится это сделать при Form Load, можно будет выполнить все остальное

P.S.:Спасибо за участие :)
...
Рейтинг: 0 / 0
Добавление из поля со списком
    #32238352
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Ну, допустим, так:

RowSourceType = ValueList
ColumnCount = 2

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

RowSource = "1,One,2,Two,3,Three"

(т.е. строка примерно такого типа, и это можно делать как раз на Load или Open)

(хотя в качестве разделителя может понадобиться не запятая, а точка с запятой, в зависимости от настроек Windows)

P.S. Не за что. :^)
...
Рейтинг: 0 / 0
Добавление из поля со списком
    #32238353
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
И вот как эту строку можно соорудить:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Dim s As String

s= ""
With CurrentDb
    With .OpenRecordset(" название таблицы или запроса ", dbOpenDynaset, dbReadOnly)
        Do Until .EOF
            If s > "  " Then s = s & " , "
            s = s & CStr(!MyCodeField) & " ," & !MyTextField
            .MoveNext
        Loop
        .Close
    End With
End With
...
Рейтинг: 0 / 0
Добавление из поля со списком
    #32238356
Спасибо огромное, все вроде получается !!!

Правда формировать строку этим кодом не удается, он почему-то выдает на эту строку
Код: plaintext
1.
With .OpenRecordset( "Категории" , dbOpenDynaset, dbReadOnly)

Invalid Argument, но это не главное, в крайнем случае сделаю через ADODB, у меня это как-то получалось

Главное было - избавиться от ошибки списка. Кстати по ходу дела я полностью сформировал вопрос :) Если пользователь ввел строку, которой нет в списке - она должна была добавиться в этот список, но если он её исправил - она должна была исправиться.

Я делаю так, если я неправ - поправьте меня pls:

Ввожу глобальную переменную bool new_category = false
если она true - значит новая строка добавлена в список, потом, если строка меняется, я её заменяю на помененную (удаляю старую, добавляю новую) - позиция определяется одназначно, т.к. я добавляю на место index=0 :)

если пользователь добавил строку которой нет в списке
вызывается NotInList, в нем я пишу:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Private Sub Список_NotInList(NewData As String, Response As Integer)
    If (new_category) Then
        Me.Список.RemoveItem ( 0 )
    End If
    Me.Список.AddItem  "0 ;" & NewData,  0 
    new_category = True
    Response = acDataErrAdded
End Sub
...
Рейтинг: 0 / 0
Добавление из поля со списком
    #32238361
Фотография Alexander G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Invalid Argument - это из-за отсутствия ссылки на DAO, я написал тебе об этом в hiprog.com.
Долго соображал насчет RemoveItem
, потом только вспомнил, что он появился в Access 2002.
...
Рейтинг: 0 / 0
Добавление из поля со списком
    #32238373
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
2 Тимур Каримбаев:

У этого алгоритма есть один серьезный недочет. Что будет, если юзер сначала добавит две строчки в список, а только потом нажмет на кнопку добавить их в таблицу? Под какими кодами они будут сидеть в списке?
...
Рейтинг: 0 / 0
Добавление из поля со списком
    #32238386
2 Владимир Саныч:

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

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

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
    Dim insert_sql As String
    category_id = Me.Список.Value
    
    If (new_category) Then
        Dim category_insert_sql As String
        Me.Список.SetFocus
        category_insert_sql =  "INSERT INTO Категории (Название) VALUES ('" & Me.Список.Text & "');" 
        CurrentDb.Execute category_insert_sql
        getAddedCategoryId
        category_id = category_added_id
    End If
    
    insert_sql =  "INSERT INTO Товары (КатегорияID, Название, Цена) VALUES "  & _
                  "("  & category_id &  ", '" & Me.ПолеНазвание & "', '" & Me.ПолеЦена & "');" 
    CurrentDb.Execute insert_sql


У этого алгоритма оказался другой существенный недостаток :)
Если юзер вбивает значение, несуществующее в списке, а потом выбирает существующее - VB решает, что долже добавить это значение еще раз :)
Это я исправил

Спасибо !
...
Рейтинг: 0 / 0
Добавление из поля со списком
    #32238395
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Мне кажется, что этот топик (и его автора) можно взять как образец для подражания для всех "начинающих".
...
Рейтинг: 0 / 0
Добавление из поля со списком
    #32238397
Nick987
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
"Если сформулировать вопрос короче: поле со списком связано с таблицей, причем установлено свойство "Ограничить списком" (снять его нельзя), надо: если вбито значение которого нет в списке - просто погасить ошибку, не добавляя значение в таблицу."

Можно так: Если вбито значение, которого нет в списке, то запоминаем его, гасим ошибку, скрываем поле со списком, делаем видимым другое (служебное) поле, в которое и вносим вбитое значение. Далее, если нужно вернуться к полю со списком, то напр. по ESC возвращаем все на место.
...
Рейтинг: 0 / 0
Добавление из поля со списком
    #32238399
Всем большое спасибо,
2 Владимир Саныч - особенно

Базу дописал (маленькая база, думал сделать за день, но почти не работал с Access и VBA, да и хелп по VBA не установлен поэтому столкнулся с маленькими, но вредными проблемами и затянулось на 2 ночи). Пойду показывать :)

Спасибо форуму и участникам!
...
Рейтинг: 0 / 0
Добавление из поля со списком
    #32238402
Фотография Alexander G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скорость, с которой он въехал, меня поражает, хоть у него есть опыт с SQL.
...
Рейтинг: 0 / 0
Добавление из поля со списком
    #32238403
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Все, что нужно, - это голова на плечах и уверенность в себе. А не то что некоторые - "я чайник, вы мне должны помочь".
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Добавление из поля со списком
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]