8 / 8 / 0
Регистрация: 12.03.2012
Сообщений: 35
1

Запись в один столбец таблицы из разных полей формы.

12.04.2012, 22:10. Показов 3530. Ответов 18
Метки нет (Все метки)

Доброго времени суток. Уважаемые господа, в очередной раз обращаюсь к вам за помощью. Пользователи БД подбрасывают задачки, а решить их начинающему не всегда под силу. Подскажите если не трудно, имеется ли возможность из трех полей формы сохранять информацию в одно поле таблицы в разных строках. То есть на форме поля со списком П1, П2, П3. В таблице "товар" столбец "наименование". Требуется сделать так, чтобы при выборе в каждом поле формы данные сохранялись в таблицу с добавлением новой строки (и уникального кода (поле счетчик)), но в самой форме как минимум до ее закрытия отображались изначально выбранные значения. Например: П1 - светильник точечный, П2 - светильник хромированный, П3 - светильник бронзовый. А в таблиц все эти наименования в одном столбце и имеют уникальный код. Такое вообще возможно? Заранее благодарю!
ps. Да забыл написать. Пытался сделать действие на событие в поле со списком
SQL
1
DoCmd.GoToRecord , , acNewRec
, но, естественно, изменяются данные во всех полях формы на введенное в последнее.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.04.2012, 22:10
Ответы с готовыми решениями:

Добавление нескольких полей в один столбец таблицы
Добрый день. Помогите пожалуйста знающие люди. У меня на форме есть несколько полей, по нажатии на...

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

Выбрать данные из таблицы и заменить один столбец с id значениями из другой таблицы
Есть таблица A: A.ID | A.B_ID и таблица B: B.ID | B.TEXT где A.B_ID -> B.ID является...

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

18
Нарушитель
Эксперт MS Access
7266 / 4468 / 288
Регистрация: 12.08.2011
Сообщений: 13,503
13.04.2012, 04:48 2
Лучше один раз увидеть, чем сто раз услышать. (с) Народная мудрость.
0
8 / 8 / 0
Регистрация: 12.03.2012
Сообщений: 35
13.04.2012, 16:42  [ТС] 3
Попытался так решить свою проблему: создал свободную форму с полями П1, П2, П3 и т.д., потом построил несколько (по количеству полей в форме) запросов на добавление в таблицу, закинул их все в один макрос, установил его запуск на событие нажатие кнопки. Вобщем то все работает, но... Хочется, чтоб это делалось одним запросом, и еще не предупреждало пользователя о добавлении записей в таблицу (ему этого знать необязятельно, а то будет пугаться ). А загвоздка в том, что когда строю запрос, не знаю, какую команду (функцию) нужно прописать, чтоб в таблице добавлялась строка автоматом после введения данных из каждого поля. Вот такой код в запросе у меня:
SQL
1
2
INSERT INTO светильники ( naimenov, id_zakazchik, id_ofis)
SELECT Forms!светильники!ПолеСоСписком13 AS Выражение1, Forms!светильники!Поле3 AS Выражение2, Forms!светильники!Поле1 AS Выражение3,     ???????      Forms!светильники!ПолеСоСписком15 AS Выражение1, Forms!светильники!Поле3 AS Выражение2, Forms!светильники!Поле1 AS Выражение3;
Вот там, где знаки вопроса, наверное нужно добавить команду (выражение, функцию), а какую - я не знаю. Не пинайте сильно, если глупость спрашиваю. Подскажите, гуру, можно ли что-то сделать или пациент безнадежен?
0
3541 / 1115 / 94
Регистрация: 13.03.2011
Сообщений: 1,513
13.04.2012, 18:33 4
Цитата Сообщение от diverbs Посмотреть сообщение
... закинул их все в один макрос, установил его запуск на событие нажатие кнопки.
Предположим, что пользователь заполнил все три поля и нажал кнопку, но потом спохватился, заметив, что одно из данных внесено неправильно, подправил и снова нажал кнопку. Итог: две пары записей в таблице дублируются + одна ошибочная + одна нормальная.
Цитата Сообщение от diverbs Посмотреть сообщение
Хочется, чтоб это делалось одним запросом
Это можно сделать, но нужно ли?
Цитата Сообщение от diverbs Посмотреть сообщение
... и еще не предупреждало пользователя о добавлении записей в таблицу
Используйте не DoCmd.RunSQL, а CurrentDb.Execute
Цитата Сообщение от diverbs Посмотреть сообщение
... не знаю, какую команду (функцию) нужно прописать, чтоб в таблице добавлялась строка автоматом после введения данных из каждого поля.
Дублирование и ошибочные записи в таблице также обеспечены.

Если правильно понял задачу, то совет такой.
Сделайте вы ленточную форму, источником данных которой будет ваша таблица. В конструкторе установите значение "Да" у ее свойства "Ввод данных". При открытии формы существующие записи таблицы не будут отображаться. И пускай пользователь вводит сколько ему вздумается записей и корректирует их, как его душеньке угодно. И никаких кнопок, никаких запросов.
2
8 / 8 / 0
Регистрация: 12.03.2012
Сообщений: 35
13.04.2012, 19:00  [ТС] 5
Что касается дублирования записей - предусмотрено. На форме Флажок, галка в который проставляется при нажатии на кнопку запуска макроса и устанавливается запрет на повторное занесение данных.
По поводу ленточной формы - попробую. Поясню, для чего мне нужно, чтобы данные в форме оставались неизменными до ее закрытия. Просто из нее они (данные) публикуются в Ворд через ссылки на закладки (в приложение к договору).
Спасибо, что откликнулись, спасибо за подсказки. Думаю, что ваши советы мне пригодятся.
0
3541 / 1115 / 94
Регистрация: 13.03.2011
Сообщений: 1,513
13.04.2012, 19:06 6
Цитата Сообщение от diverbs Посмотреть сообщение
Что касается дублирования записей - предусмотрено. На форме Флажок, галка в который проставляется при нажатии на кнопку запуска макроса и устанавливается запрет на повторное занесение данных.
А если допущена ошибка и ее необходимо исправить?
0
8 / 8 / 0
Регистрация: 12.03.2012
Сообщений: 35
13.04.2012, 21:58  [ТС] 7
Цитата Сообщение от minob Посмотреть сообщение
А если допущена ошибка и ее необходимо исправить?
Честно говоря не задумывался. Нужно предусмотреть корректировку.

Добавлено через 1 час 43 минуты
Господа, мне кто нибудь подскажет, что нужно прописать в запросе, чтобы в таблицу добавлялась новая строка? Или это невозможно?
0
3541 / 1115 / 94
Регистрация: 13.03.2011
Сообщений: 1,513
13.04.2012, 23:00 8
Цитата Сообщение от diverbs
Хочется, чтоб это делалось одним запросом, и еще не предупреждало пользователя о добавлении записей в таблицу
Пробуйте так:
Visual Basic
1
2
3
4
5
6
7
8
9
10
  Dim sq$
  sq = "INSERT INTO светильники ( naimenov, id_zakazchik, id_ofis) " & _
       "SELECT f1, f2, f3 FROM " & _
       "(SELECT Top 1 Forms!светильники!ПолеСоСписком13 AS f1, Forms!светильники!Поле3 AS f2, Forms!светильники!Поле1 AS f3 FROM MSysObjects " & _
       "UNION ALL SELECT Top 1 Forms!светильники!ПолеСоСписком15, Forms!светильники!Поле3, Forms!светильники!Поле1 FROM MSysObjects " & _
       ...
        )"
  DoCmd.SetWarnings False
  DoCmd.RunSQL sq
  DoCmd.SetWarnings True
1
andrey_ba
13.04.2012, 23:10
  #9

Не по теме:

советуешь

Цитата Сообщение от minob Посмотреть сообщение
Используйте не DoCmd.RunSQL, а CurrentDb.Execute
, а пишешь
Цитата Сообщение от minob Посмотреть сообщение
DoCmd.RunSQL sq
:)

0
3541 / 1115 / 94
Регистрация: 13.03.2011
Сообщений: 1,513
13.04.2012, 23:38 10
Цитата Сообщение от andrey_ba Посмотреть сообщение
советуешь , а пишешь
Если бы были известны типы полей таблицы, то тогда не помещал бы внутрь запроса ссылки на поля формы, а поместил бы значения полей формы, например, вместо
Visual Basic
1
"... SELECT Top 1 Forms!светильники!ПолеСоСписком13 AS f1, Forms!светильники!Поле3 AS f2 ,..."
записал бы
Visual Basic
1
"... SELECT Top 1 '" & Forms!светильники!ПолеСоСписком13 & "' AS f1, " & Forms!светильники!Поле3 " & AS f2, " & ..."
Вот тогда и Execute прокатит.
2
Нарушитель
Эксперт MS Access
7266 / 4468 / 288
Регистрация: 12.08.2011
Сообщений: 13,503
14.04.2012, 01:40 11
Цитата Сообщение от minob Посмотреть сообщение
Если бы были известны типы полей таблицы
Хитрый
0
8 / 8 / 0
Регистрация: 12.03.2012
Сообщений: 35
15.04.2012, 01:06  [ТС] 12
Уважаемые господа, подскажите, какая ошибка в синтаксисе?
Visual Basic
1
2
3
4
5
6
7
8
9
10
Dim sq$
sq = "INSERT INTO svetilnik_obem ( id_ofis, id_ofis_sviaz, id_zakazchik, inaimenov, kolich, summa_opt, summa_rozn, raschet_zakryt, data_zakaza )"&_
         "SELECT f1, f2, f3, f4, f5, FROM " & _
         "(SELECT Top 1 Forms!Светильники!Поле1 AS f1, Forms!Светильники!Поле58 AS f2, Forms!Светильники!Поле3 AS f3, Forms!Светильники!ПолеСоСписком13 AS f4, Forms!Светильники!Поле358 AS f5 FROM MSysObjects " &_
         "UNION ALL SELECT Top 1 Forms!Светильники!Поле1, Forms!Светильники!Поле58, Forms!Светильники!Поле3, Forms!Светильники!ПолеСоСписком14, Forms!Светильники!Поле359 FROM MSysObjects " &_
         "UNION ALL SELECT Top 1 Forms!Светильники!Поле1, Forms!Светильники!Поле58, Forms!Светильники!Поле3, Forms!Светильники!ПолеСоСписком15, Forms!Светильники!Поле360 FROM MSysObjects " &_
         "UNION ALL SELECT Top 1 Forms!Светильники!Поле1, Forms!Светильники!Поле58, Forms!Светильники!Поле3, Forms!Светильники!ПолеСоСписком16, Forms!Светильники!Поле361 FROM MSysObjects "  )"
DoCmd.SetWarnings False
DoCmd.RunSQL sq
DoCmd.SetWarnings True
VB ругается на закрывающую скобку в конце седьмой строки и кавычки. Если их убираю, то при выполнении программы Акс пишет: "ошибка в синтаксисе FROM". В чем мой косяк?
0
3541 / 1115 / 94
Регистрация: 13.03.2011
Сообщений: 1,513
15.04.2012, 10:49 13
Цитата Сообщение от diverbs Посмотреть сообщение
В чем мой косяк?
1. Строки 2, 4, 5, 6
... редактор модулей поддерживает символ продолжения программной строки, позволяющий разбивать одну логическую программную строку на несколько физических строк. Символ продолжения программной строки образуется из пробела с последующим символом подчеркивания ( _)
2. В конце 2-й строки перед и после кавычек вставьте по пробелу. Не обделите пробелом и знак подчеркивания (см. п.1).
3. Уберите запятую после f5 в 3-ей строке.
4. Уберите кавычки перед закрывающейся скобкой в 7-ой строке, да и пробелы там никчему.
5. Почему нет соответствия между количеством полей мсточника и приемника?

Возможно, что-то еще упустил.

Добавлено через 3 часа 3 минуты
diverbs, в данной задаче, чтобы было меньше мороки, лучше использовать рекордсет.
Кроме того, элементам управления нужно давать осмысленные имена, чтобы по прошествию некоторого времени не гадать: "а что у меня находится в Поле358?". В коде ниже заменено: Поле1 - id_ofis, Поле58 - id_ofis_sviaz, Поле3 - id_zakazchik, ПолеСоСписком13/14/15/16 - inaimenov1/2/3/4, Поле358/359/360/361 - kolich1/2/3/4.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Dim i&
With CurrentDb.OpenRecordset("svetilnik_obem", dbOpenDynaset)
  For i = 1 To 4
    .AddNew
    !id_ofis = Me!id_ofis 
    !id_ofis_sviaz = Me!id_ofis_sviaz
    !id_zakazchik = Me!id_zakazchik 
    !inaimenov = Me("inaimenov" & i) 
    !kolich = Me("kolich" & i) 
    .Update
  Next
End With
1
8 / 8 / 0
Регистрация: 12.03.2012
Сообщений: 35
15.04.2012, 12:18  [ТС] 14
Цитата Сообщение от minob Посмотреть сообщение
1. Строки 2, 4, 5, 6
2. В конце 2-й строки перед и после кавычек вставьте по пробелу. Не обделите пробелом и знак подчеркивания (см. п.1).
3. Уберите запятую после f5 в 3-ей строке.
4. Уберите кавычки перед закрывающейся скобкой в 7-ой строке, да и пробелы там никчему.
5. Почему нет соответствия между количеством полей мсточника и приемника?
...
Спасибо за помощь. С пробелами у меня было все в порядке. Это при копировании из VB почему то они пропали. Вся проблема была в кавычках перед скобкой в конце седьмой строки. Несоответствие было потому, что часть текста для уменьшения объема сообщения я убирал. Не все лишнее убрал. Сейчас все работает. Позже попробую еще предложенный вами вариант (сегодня все же праздник). Еще раз огромное спасибо!!!
0
8 / 8 / 0
Регистрация: 12.03.2012
Сообщений: 35
16.04.2012, 23:35  [ТС] 15
Цитата Сообщение от minob Посмотреть сообщение
... diverbs, в данной задаче, чтобы было меньше мороки, лучше использовать рекордсет.

Попробывал использоывать рекордсет:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Option Compare Database
Dim i&
With CurrentDb.OpenRecordset("svetilnik_obem", dbOpenDynaset)
  For i = 1 To 10
    .AddNew
    !id_ofis = Me!id_ofis
    !id_ofis_sviaz = Me!id_ofis_sviaz
    !id_zakazchik = Me!id_zakazchik
    !inaimenov = Me("naimen" & i)
    !kolich = Me("kolich" & i)
    !summa_opt = Me("opt" & i)
    !summa_rozn = Me("rozn" & i)
    !raschet_zakryt = Me!Флажок44
    .Update
  Next
End With
VB выделяет третью строку и выдает сообщение "invalid outside procedure". Что не так? И еще такой вопрос: а можно ли в этой процедуре поставить условие, ну что-то типа:
Visual Basic
1
2
If (Me.inaimenov <> "-") Then
!inaimenov = Me("naimen" & i)
То есть, чтобы если поле содержит прочерк, то эта запись в таблицу не вносится. Я, естественно, поковыряюсь, поэксперементирую, но проблемы с синтаксисом.... Если можете что-то подсказать - заранее благодарю!
0
3541 / 1115 / 94
Регистрация: 13.03.2011
Сообщений: 1,513
17.04.2012, 00:13 16
Цитата Сообщение от diverbs Посмотреть сообщение
Попробывал использоывать рекордсет
Да, праздники многим на пользу не пошли
Мной представлен код, который вы можете поместить в любую процедуру или функцию, толи это будет процедура обработки некоего события, толи пользовательская прцедура. Я же ведь заранее не могу предугадать, где вам понадобится данный код.

По вопросу о прочерке. Оператор If (Me.inaimenov <> "-") Then поместите перед .AddNew, а конец End If после .Update. Кстати, как у вас всетаки называется поле формы, inaimenov или naimen+индекс, или это разные поля?
0
8 / 8 / 0
Регистрация: 12.03.2012
Сообщений: 35
17.04.2012, 12:16  [ТС] 17
Цитата Сообщение от minob Посмотреть сообщение
Да, праздники многим на пользу не пошли
Вы думаете без праздников я бы лучше ращобрался? Поставил на событие нажатия кнопки. Сейчас все работает... кроме условия сохранения в таблицу.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
If (Forms![Светильники]!Флажок44 = False) Then
Dim i&
With CurrentDb.OpenRecordset("svetilnik_obem", dbOpenDynaset)
  For i = 1 To 10
  If (Me.inaimenov <> "-") Then
    .AddNew
    !id_ofis = Me!id_ofis
    !id_ofis_sviaz = Me!id_ofis_sviaz
    !id_zakazchik = Me!id_zakazchik
    !inaimenov = Me("naimen" & i)
    !kolich = Me("kolich" & i)
    !summa_opt = Me("opt" & i)
    !summa_rozn = Me("rozn" & i)
    !raschet_zakryt = Me!Ôëàæîê44
    .Update
    End If
  Next
End With
End If
Ну я попробую пошаманить. Еще раз огромное Вам спасибо!

Добавлено через 11 часов 23 минуты
Е-мое! Вчера уже выключил комп, закурил перед сном сигарету и понял где моя ошибка! Дошло, что в условии вместо имени поля на форме я писал имя поля таблицы Наверное это и называется "смотришь в книгу, видишь фигу". Теперь подправил, все работает, огромное спасибо за помощь!
0
3541 / 1115 / 94
Регистрация: 13.03.2011
Сообщений: 1,513
17.04.2012, 12:43 18
Цитата Сообщение от diverbs Посмотреть сообщение
Дошло, что в условии вместо имени поля на форме я писал имя поля таблицы
В предыдущем моем сообщении (последнее предложение), я вам намекал о возможном несоответствии.

P.S. Все таки, наверное, тяжело отказаться от привычки давать бессмысленные имена элементам управления (Флажок44).
0
8 / 8 / 0
Регистрация: 12.03.2012
Сообщений: 35
17.04.2012, 18:43  [ТС] 19
Цитата Сообщение от minob Посмотреть сообщение
В предыдущем моем сообщении (последнее предложение), я вам намекал о возможном несоответствии.
Ага, именно это и навело меня на обнаружение ошибки. только почему то уже после выключения компа (замедленные рефлексы после праздника )

Цитата Сообщение от minob Посмотреть сообщение
P.S. Все таки, наверное, тяжело отказаться от привычки давать бессмысленные имена элементам управления (Флажок44).
И это утверждение верно. Хотя сам себя за это ругаю, но... Буду исправляться.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.04.2012, 18:43
Помогаю со студенческими работами здесь

Один связанный столбец в двух BDGRID на разных формах
Помогите. Есть главная форма с 2 кнопками. Кнопка 1 - таблица 1, на ней DBGRID с одной таблицей....

Отчет из разных полей формы
Доброго времени суток, форумчане! Помогите ламеру разобраться с формированием отчета. В форме в...

Сбор в один столбец запроса данных из столбцов 2-х разных таблиц.
Добрый день. Сразу оговорюсь - изменить базу данных не вариант, так как она уже есть и заполнена...

Вывод полей таблицы на разных языках
Привет Всем! Есть таблица с полями: 1. id_product 2. language_id - идентификатор национального...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru