powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Перечисление в поле запроса данных через запятую.
17 сообщений из 17, страница 1 из 1
Перечисление в поле запроса данных через запятую.
    #32391113
Benzin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблица Договоры связана с табл.Счета. Один договор может иметь несколько счетов.
Как сделать, чтобы в запросе все счета перечислялись в одном поле через запятую, т.е. один договор занимал бы одну строку?
...
Рейтинг: 0 / 0
Перечисление в поле запроса данных через запятую.
    #32391126
Alex112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Первое, что пришло в голову:

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

Недостаток - может подтормаживать.
...
Рейтинг: 0 / 0
Перечисление в поле запроса данных через запятую.
    #32391132
incold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для ADP

http://www.sql.ru/faq/faq_topic.aspx?fid=130

Для MDB
только с использованием функций VBA
...
Рейтинг: 0 / 0
Перечисление в поле запроса данных через запятую.
    #32391133
Hummer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут пример по совету, который дали выше...
...
Рейтинг: 0 / 0
Перечисление в поле запроса данных через запятую.
    #32391136
Hummer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 incold
Быстрый олень:)
...
Рейтинг: 0 / 0
Перечисление в поле запроса данных через запятую.
    #32391158
Benzin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вариант для mdb...
Cоздать функцию в модуле, а как обратиться к ней из запроса?
Я имею ввиду как ей передать аргументы(номера счетов)?
...
Рейтинг: 0 / 0
Перечисление в поле запроса данных через запятую.
    #32391165
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
выражение1:МояФункция(ИМяКлючевогоПоляТаблицы)
...
Рейтинг: 0 / 0
Перечисление в поле запроса данных через запятую.
    #32391215
Хам трамвайный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dim rst As ADODB.Recordset
Set rst = New ADODB.Recordset
rst.Open "SELECT DISTINCT Клиент FROM Клиенты ORDER BY Клиент;", СurrentProject.Connection
ПеременнаяString = rst.GetString(adClipString, , ";", ";")
rst.Close
...
Рейтинг: 0 / 0
Перечисление в поле запроса данных через запятую.
    #32391282
Benzin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 ХТ:
может это и работает, но у меня А97, к сожалению...:(
Значит придется из одного rst выбирать КодДоговора, а потом как фильтр использовать это для другого Rst, который со Счетами?
...
Рейтинг: 0 / 0
Перечисление в поле запроса данных через запятую.
    #32391337
П.М.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Попробуй до и после переменной в запросе ставить одинарные ковычки:

"начало запроса....'" & твоя_переменная_в_перечислением_номеров_ счетов & "'...конец запроса"
...
Рейтинг: 0 / 0
Перечисление в поле запроса данных через запятую.
    #32391491
Benzin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А переменную-то как "собрать"?
...
Рейтинг: 0 / 0
Перечисление в поле запроса данных через запятую.
    #32391509
Фотография AlexJuice
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Примерно так:

Код: plaintext
1.
2.
3.
Function FullString(strFld As String)
Static strTemp As String
FullString = strTemp &  ", "  & strFld
End Function
...
Рейтинг: 0 / 0
Перечисление в поле запроса данных через запятую.
    #32391511
Фотография AlexJuice
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, так не пойдет...
Надо так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Function AllNums(lngIdDogovor As Long) As String
Dim rst As Recordset, mdb As Database, strNums As String
Set mdb = CurrentDb
Set rst = mdb.OpenRecordset( "SELECT num FROM MyTab WHERE IdDog = "  & lngIdDog
Do While Not rst.EOF
   strNums = strNums & rst!num
Loop
AllNums = strNums
rst.Close
Set rst = Nothing
Set mdb = Nothing
...
Рейтинг: 0 / 0
Перечисление в поле запроса данных через запятую.
    #32391513
Фотография AlexJuice
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и как всегда, стормозил на
rst.MoveNext

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Function AllNums(lngIdDog As Long) As String
Dim rst As Recordset, mdb As Database, strNums As String
Set mdb = CurrentDb
Set rst = mdb.OpenRecordset( "SELECT num FROM MyTab WHERE IdDog = "  & lngIdDog
Do While Not rst.EOF
   strNums = strNums &  ", "  & rst!num
   rst.MoveNext
Loop
AllNums = strNums
rst.Close
Set rst = Nothing
Set mdb = Nothing
...
Рейтинг: 0 / 0
Перечисление в поле запроса данных через запятую.
    #32391979
Benzin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну а у меня так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Function qq(NumDog As String) As String
Dim rst As Recordset, rstFlt As Recordset
qq =  ""
Set rst = CurrentDb.OpenRecordset(" Запрос1 ")
rst.Filter = " [NDog] = '" & NumDog & "' "
Set rstFlt = rst.OpenRecordset
If rstFlt.RecordCount > 0  Then
    rstFlt.MoveFirst
    Do While Not rstFlt.EOF
         qq = qq & rstFlt!№_счет & ", "
         rstFlt.MoveNext
    Loop
 qq = Left(qq, Len(qq) -  2 )
End If

"Запрос1" это набор данных: один столбец -Договор, второй - №_счета.
Ну а вообще - тормозит все это довольно сильно...
...
Рейтинг: 0 / 0
Перечисление в поле запроса данных через запятую.
    #32392083
Фотография AlexJuice
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Set rstFlt = rst.OpenRecordset
Зачем это? Для каждого договора каждый раз отбираются все записи, а потом накладывается фильтр. На фига, если можно ограничиться нужным номером?
И второй раз открывать рекордсет на основе уже существующего тоже не надо

If rstFlt.RecordCount > 0 Then
rstFlt.MoveFirst
Это лишнее. Рекордсет сам встает на первую запись, если она есть. Поэтому можно перейти сразу к следующей строке, где заменить While Not -> Until (это я сначала писал через While / Wend)
...
Рейтинг: 0 / 0
Перечисление в поле запроса данных через запятую.
    #32392134
П.М.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как собрать переменную?

Была у меня такая задача: на форме есть листбокс, где перечисленны группы товаров, листбокс причем позволяет выбирать несколько строк одновременно.
Надо было составить отчет, в который входили бы только товары из выбранных групп. Вот как это решил:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Private Sub кнПрайс_Click()
Dim varI 'fltrПрайс - глобальная переменная

On Error Resume Next
For Each varI In Me.спТип.ItemsSelected  'перебор по выделенным группам товара в листбоксе

fltrПрайс = fltrПрайс &  "', '"  & Me.спТип.ItemData(varI)
Next varI
If fltrПрайс <>  "" Then
   fltrПрайс = Right(fltrПрайс, Len(fltrПрайс) - 3 ) & "'"    'обрезание лишних кавычек

   DoCmd.OpenReport  "оПрайс" , acViewPreview 'открытие отчета, где условие отбора записей и есть переменная fltrПрайс

Else
   MsgBox  "Выберите как минимум один тип" 
End If
End Sub


Задача усложнялась еще тем, что группы товара могли содержать пробелы и запятые, поэтому так много кавычек.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Перечисление в поле запроса данных через запятую.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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