powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Номера записей в таблице/запроса в SQL-коде
23 сообщений из 23, страница 1 из 1
Номера записей в таблице/запроса в SQL-коде
    #39627724
Beliar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем доброго дня! В таблицах и рекордсетах есть нумерация записей (в табличном режиме отображается внизу с кнопками перехода). Можно ли с этими номерами работать в SQL-коде, в частности, в качестве условия отбора? Например есть запрос, назовем Query1, для простоты такой: SELECT F1 FROM Table1. Необходимо разбить на 2 запроса: в 1м записи с 1 по 15, во 2м - с 16 по 30, в 3м - все остальные, начиная с 31. Или, может, как-то добавить поле с нумерацией, но не в источнике Table1, а в самом запросе Query1?
...
Рейтинг: 0 / 0
Номера записей в таблице/запроса в SQL-коде
    #39627729
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BeliarВ таблицах и рекордсетах есть нумерация записей (в табличном режиме отображается внизу с кнопками перехода).Эти номера "проставляются" средством отображения и НЕ являются свойством набора записей или отдельной записи.

BeliarМожно ли с этими номерами работать в SQL-коде, в частности, в качестве условия отбора?Соответственно нет.

BeliarНапример есть запрос, назовем Query1, для простоты такой: SELECT F1 FROM Table1. Необходимо разбить на 2 запроса: в 1м записи с 1 по 15, во 2м - с 16 по 30, в 3м - все остальные, начиная с 31.Такое несложно делается соответствующей сортировкой и отбором заданной части набора. Для выбора "из серединки" используется двухуровневый отбор с подзапросом с сортировкой в обратном порядке.

Beliarдобавить поле с нумерациейМожно. Подробно описано в FAQ... проще всего делается с помощью пользовательской функции.
...
Рейтинг: 0 / 0
Номера записей в таблице/запроса в SQL-коде
    #39627735
Beliar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,
В общем, я ожидал такой ответ :-) С функциями дело не очень обстоит, все с дефектами. Вот например:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
Public Function Numeration(Optional var) As Long
    Static n As Long
    If IsMissing(var) Then
        n = 0
    Else
        n = n + 1
    End If
    Numeration = n
End Function


У этой счетчик растет при каждом обращении к запросу (т.е. при обновлении данных). Для смеха: границу окна запроса дергаешь - за несколько секунд от таких действий нумерация становиться шести-семизначной.
...
Рейтинг: 0 / 0
Номера записей в таблице/запроса в SQL-коде
    #39627748
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BeliarУ этой счетчик растет при каждом обращении к запросу (т.е. при обновлении данных)
Конечно. Вы же небось инициализируете функцию в подзапросе? а Аксесс не идиот и понимает, что функция дтерминированная, и это получается константное выражение - вот и не дёргает её при пересчёте.
...
Рейтинг: 0 / 0
Номера записей в таблице/запроса в SQL-коде
    #39627904
Beliar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AkinaBeliarУ этой счетчик растет при каждом обращении к запросу (т.е. при обновлении данных)
Конечно. Вы же небось инициализируете функцию в подзапросе? а Аксесс не идиот и понимает, что функция дтерминированная, и это получается константное выражение - вот и не дёргает её при пересчёте.
Да не, в самом запросе... да ладно. Вот еще вариант: Запрос в виде
Код: plsql
1.
SELECT (SELECT Sum(1) FROM Table1 p WHERE p.F1<=p1.F1) AS num, p1.F1 AS F1 FROM Table1 AS p1;


Учитывая, что данные в F1 в моем случае уникальны, то срабатывает, как надо: нумерация при запуске запроса начинается с 1. Но при использовании данных в следующем запросе, где на поле num налагается условие, значения из num пропадают, хотя условия соблюдаются, и выборка правильная получается. А мне бы сохранить присвоенные номера. Подскажите еще способы нумерации.
...
Рейтинг: 0 / 0
Номера записей в таблице/запроса в SQL-коде
    #39627945
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Beliarзначения из num пропадаютНе понял фразы...
...
Рейтинг: 0 / 0
Номера записей в таблице/запроса в SQL-коде
    #39627952
Beliar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AkinaBeliarзначения из num пропадаютНе понял фразы...
поле num пустое для всех записей
...
Рейтинг: 0 / 0
Номера записей в таблице/запроса в SQL-коде
    #39627961
Beliar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сваял свою функцию:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
Public Function Numeration(Optional var, Optional i As Integer) As Long
    Static n As Long
    If n < i Then
       n = n + 1
    Else
        n = 1
    End If
    Numeration = n
End Function


где в качестве аргумента i в самом запросе подставляю (SELECT Count(Table1.F1) AS [Count-F1] FROM Query1;)
Проблема та же: меняются номера, хоть и в пределах количества записей рекордсета
...
Рейтинг: 0 / 0
Номера записей в таблице/запроса в SQL-коде
    #39627962
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Beliarполе num пустое для всех записей
ни фига не понял... всё нормально передаётся по цепочке.
...
Рейтинг: 0 / 0
Номера записей в таблице/запроса в SQL-коде
    #39627992
MaratIsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BeliarВсем доброго дня! В таблицах и рекордсетах есть нумерация записей (в табличном режиме отображается внизу с кнопками перехода). Можно ли с этими номерами работать в SQL-коде, в частности, в качестве условия отбора? Например есть запрос, назовем Query1, для простоты такой: SELECT F1 FROM Table1. Необходимо разбить на 2 запроса: в 1м записи с 1 по 15, во 2м - с 16 по 30, в 3м - все остальные, начиная с 31. Или, может, как-то добавить поле с нумерацией, но не в источнике Table1, а в самом запросе Query1?

сначала задай себе вопрос - а что я буду делать с этими номерами строк?! :)
...
Рейтинг: 0 / 0
Номера записей в таблице/запроса в SQL-коде
    #39628209
Beliar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,
Да, я проверил, в таком простом случае, проблем нет. Но у меня вместо таблицы - запрос с группировкой данных. Для проверки сваял простой пример (во вложении)
...
Рейтинг: 0 / 0
Номера записей в таблице/запроса в SQL-коде
    #39628211
Beliar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MaratIsk
сначала задай себе вопрос - а что я буду делать с этими номерами строк?! :)
сказано было Beliar... в частности, в качестве условия отбора...
и в дальнейшем, долго объяснять, но эти номера будут использоваться, причем с типом Long
...
Рейтинг: 0 / 0
Номера записей в таблице/запроса в SQL-коде
    #39628217
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Beliarу меня вместо таблицы - запрос с группировкой данных.
Код: sql
1.
2.
3.
4.
SELECT Query3.F1, Query3.[Count-F1], MAX(Query3.num) AS num
FROM Query3
GROUP BY Query3.F1, Query3.[Count-F1]
HAVING MAX(Query3.num)>2;
...
Рейтинг: 0 / 0
Номера записей в таблице/запроса в SQL-коде
    #39628225
Beliar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AkinaBeliarу меня вместо таблицы - запрос с группировкой данных.
Код: sql
1.
2.
3.
4.
SELECT Query3.F1, Query3.[Count-F1], MAX(Query3.num) AS num
FROM Query3
GROUP BY Query3.F1, Query3.[Count-F1]
HAVING MAX(Query3.num)>2;


Ну, в общем-то, работает И я нарыл еще один способ, описано так:
Код: plsql
1.
2.
3.
SELECT DCount("f", "t","f<=" & CStr(f)), f
FROM t
ORDER BY f;


поскольку DCount возвращает стринговые значения, т.е. в дальнейшем в условие отбора "between 1 and 10" входят только значения "1" и "10", то на нашем примере
Код: plsql
1.
2.
3.
SELECT Val(DCount("F1", "Table1","F1<='" & CStr(F1) & "'")), F1
FROM Table1
ORDER BY F1;


тоже все как надо получается, и по-моему весьма проще. Не могу сказать насчет производительность, при моих объемах не важно.
...
Рейтинг: 0 / 0
Номера записей в таблице/запроса в SQL-коде
    #39628381
Beliar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нет, все-таки вариант
Код: sql
1.
SELECT (SELECT Sum(1) FROM Table1 p WHERE p.F1<=p1.F1) AS num, p1.F1 AS F1 FROM Table1 AS p1;

намного шустрее.
...
Рейтинг: 0 / 0
Номера записей в таблице/запроса в SQL-коде
    #39628454
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Beliarсказано было Beliar... в частности, в качестве условия отбора...и в дальнейшем, долго объяснять, но эти номера будут использоваться, причем с типом LongВы ответили,что будете использовать эти номера(а чем хуже ID в качестве условий отбора)Зачем??? Создается рекордсет на запросе(где уже все отобрано) и решается конечная задача(без всякой промежуточной нумерации)
...
Рейтинг: 0 / 0
Номера записей в таблице/запроса в SQL-коде
    #39628618
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Sub my()
Dim rs As Recordset, i
Set rs = CurrentDb.OpenRecordset("запрос1") 'или инструкция SQL
i = 1
Do Until rs.EOF
If i <= 15 Then 
'действия для первых 15
ElseIf i >15 And i <= 30 Then 
'действия для c 16 по 30
ElseIf i >30 Then 
'действия для больше 30
End If
 i = i + 1
rs.MoveNext
Loop
End Sub
...
Рейтинг: 0 / 0
Номера записей в таблице/запроса в SQL-коде
    #39628902
Beliar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sdku,
Здесь Вы анализируете объявленную в этой же процедуре i и предлагаете действие для каждой отдельной записи рекорсета, ну например дополнительному полю присваивать значение, скажем, того же i. Теоретически может получится нумерация, я обязательно проверю. Но даже если получится, неудобство в том, что полученный рекордсет нужно куда-то "всунуть", раз уж делаем это в VBA. У меня задача разделить выборку Query:
Код: sql
1.
SELECT F, num FROM Query

на три, скажем части:
Query1:
Код: sql
1.
SELECT F, num FROM Query HAVING (num<=30)


Query2:
Код: sql
1.
SELECT F, num, [num]-30 AS num2 FROM Query HAVING (num Between 31 and 60)


Query3:
Код: sql
1.
SELECT F, num, [num]-60 AS num2 FROM Query HAVING (num >= 61

)
Ну а затем
Код: sql
1.
2.
SELECT Query1.F as F1, Query2.F as F2, Query3.F as F3 FROM (Query1 LEFT JOIN Query2 ON Query1.num=Query2.num2)_
LEFT JOIN Query3 ON Query1.num ON Query1.num=Query3.num2


И этот рекордсет будет источником данных для отчета. Соединение "слева", потому что число записей варьируется от 1 до 90, а в отчете юзер должен видеть табличку 3х30.
...
Рейтинг: 0 / 0
Номера записей в таблице/запроса в SQL-коде
    #39628999
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Beliar,
создайте вр.таблицу=вашей таблице+поле "группа",заполните его рекордсетом (для каждой группы записей какими либо значениями и при создании отчета используйте таблицу как источник а поле "группа" для группировки (если что-то не ясно покажите более-ли менее реальную таблицу а самое главное поясните 15 первых, с16 по 30 и больше 30 это при сортировке по какому признаку (ведь в таблице НЕТ какого-либо порядка записей)
...
Рейтинг: 0 / 0
Номера записей в таблице/запроса в SQL-коде
    #39629056
Beliar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sdku,
В том-то и дело, что не хочется долбаться с таблицей "временного хранения". Каждый раз долбать все записи и по-новой записывать... Сами исходные данные тоже из временной таблицы... Ну, еще был бы объем данных огромен или с накоплением, я бы, конечно, поработал бы с табличкой, тогда и помощь не понадобилась.
sdkuа самое главное поясните 15 первых, с16 по 30 и больше 30 это при сортировке по какому признаку (ведь в таблице НЕТ какого-либо порядка записей)
Нет никакой разницы в каком порядке будут нумероваться, номера нужны для деления на три выборки, и далее для их "склейки" в качестве столбцов таблички в отчете. У второго и третьего запроса num2 приводится к идентичности с num из первого запроса как раз для JOIN. Да впрочем, порядок записей не меняется, как было при добавлении в исходную таблицу отсортировано по алфавиту, так и остается. Но, повторюсь, это не существенно.
...
Рейтинг: 0 / 0
Номера записей в таблице/запроса в SQL-коде
    #39629061
Beliar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вообще, задача решена, тему можно закрыть. Хотя я хотел бы проверить последний предложенный Вами вариант и обсудить ньюансы, если будут. Просто уже ради опыта.
...
Рейтинг: 0 / 0
Номера записей в таблице/запроса в SQL-коде
    #39629100
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Sub my()
Dim rs As Recordset, i, str1, str2, str3
Set rs = CurrentDb.OpenRecordset("таблица") 'или инструкция SQL
i = 1
Do Until rs.EOF
If i <= 15 Then
str1 = str1 & "," & rs!полеДляСклейки
ElseIf i > 15 And i <= 30 Then
str2 = str2 & "," & rs!полеДляСклейки
ElseIf i > 30 And i < 45 Then
str3 = str3 & "," & rs!полеДляСклейки
End If
 i = i + 1
rs.MoveNext
Loop
Debug.Print Mid(str1, 2)
Debug.Print Mid(str2, 2)
Debug.Print Mid(str3, 2)
End Sub
...
Рейтинг: 0 / 0
Номера записей в таблице/запроса в SQL-коде
    #39629229
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Меня заинтересовала вот эта фраза
Beliar...
поскольку DCount возвращает стринговые значения, т.е. в дальнейшем в условие отбора "between 1 and 10" входят только значения "1" и "10", то на нашем примере
Код: vbnet
1.
2.
3.
SELECT Val(DCount("F1", "Table1","F1<='" & CStr(F1) & "'")), F1
FROM Table1
ORDER BY F1;


Это же эпохальное открытие!!! Неужели никто не объяснил человеку, что Dcount всегда (!!!) возвращает числовые значения!

Функцию DCount можно использовать для определения числа записей в указанном наборе записей (подмножестве). Она доступна в модулях Visual Basic для приложений (VBA), макросах, выражениях запросов и вычисляемых элементах управления.

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


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