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

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

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

Beliarдобавить поле с нумерациейМожно. Подробно описано в FAQ... проще всего делается с помощью пользовательской функции.
...
Рейтинг: 0 / 0
10.04.2018, 08:11
    #39627735
Beliar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Номера записей в таблице/запроса в SQL-коде
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
10.04.2018, 08:56
    #39627748
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Номера записей в таблице/запроса в SQL-коде
BeliarУ этой счетчик растет при каждом обращении к запросу (т.е. при обновлении данных)
Конечно. Вы же небось инициализируете функцию в подзапросе? а Аксесс не идиот и понимает, что функция дтерминированная, и это получается константное выражение - вот и не дёргает её при пересчёте.
...
Рейтинг: 0 / 0
10.04.2018, 13:18
    #39627904
Beliar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Номера записей в таблице/запроса в SQL-коде
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
10.04.2018, 14:26
    #39627945
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Номера записей в таблице/запроса в SQL-коде
Beliarзначения из num пропадаютНе понял фразы...
...
Рейтинг: 0 / 0
10.04.2018, 14:35
    #39627952
Beliar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Номера записей в таблице/запроса в SQL-коде
AkinaBeliarзначения из num пропадаютНе понял фразы...
поле num пустое для всех записей
...
Рейтинг: 0 / 0
10.04.2018, 14:45
    #39627961
Beliar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Номера записей в таблице/запроса в SQL-коде
Сваял свою функцию:
Код: 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
10.04.2018, 14:47
    #39627962
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Номера записей в таблице/запроса в SQL-коде
Beliarполе num пустое для всех записей
ни фига не понял... всё нормально передаётся по цепочке.
...
Рейтинг: 0 / 0
10.04.2018, 15:36
    #39627992
MaratIsk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Номера записей в таблице/запроса в SQL-коде
BeliarВсем доброго дня! В таблицах и рекордсетах есть нумерация записей (в табличном режиме отображается внизу с кнопками перехода). Можно ли с этими номерами работать в SQL-коде, в частности, в качестве условия отбора? Например есть запрос, назовем Query1, для простоты такой: SELECT F1 FROM Table1. Необходимо разбить на 2 запроса: в 1м записи с 1 по 15, во 2м - с 16 по 30, в 3м - все остальные, начиная с 31. Или, может, как-то добавить поле с нумерацией, но не в источнике Table1, а в самом запросе Query1?

сначала задай себе вопрос - а что я буду делать с этими номерами строк?! :)
...
Рейтинг: 0 / 0
11.04.2018, 07:05
    #39628209
Beliar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Номера записей в таблице/запроса в SQL-коде
Akina,
Да, я проверил, в таком простом случае, проблем нет. Но у меня вместо таблицы - запрос с группировкой данных. Для проверки сваял простой пример (во вложении)
...
Рейтинг: 0 / 0
11.04.2018, 07:08
    #39628211
Beliar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Номера записей в таблице/запроса в SQL-коде
MaratIsk
сначала задай себе вопрос - а что я буду делать с этими номерами строк?! :)
сказано было Beliar... в частности, в качестве условия отбора...
и в дальнейшем, долго объяснять, но эти номера будут использоваться, причем с типом Long
...
Рейтинг: 0 / 0
11.04.2018, 07:50
    #39628217
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Номера записей в таблице/запроса в SQL-коде
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
11.04.2018, 08:26
    #39628225
Beliar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Номера записей в таблице/запроса в SQL-коде
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
11.04.2018, 13:53
    #39628381
Beliar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Номера записей в таблице/запроса в SQL-коде
Нет, все-таки вариант
Код: 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
11.04.2018, 15:10
    #39628454
sdku
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Номера записей в таблице/запроса в SQL-коде
Beliarсказано было Beliar... в частности, в качестве условия отбора...и в дальнейшем, долго объяснять, но эти номера будут использоваться, причем с типом LongВы ответили,что будете использовать эти номера(а чем хуже ID в качестве условий отбора)Зачем??? Создается рекордсет на запросе(где уже все отобрано) и решается конечная задача(без всякой промежуточной нумерации)
...
Рейтинг: 0 / 0
11.04.2018, 17:11
    #39628618
sdku
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Номера записей в таблице/запроса в SQL-коде
Код: 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
12.04.2018, 10:29
    #39628902
Beliar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Номера записей в таблице/запроса в SQL-коде
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
12.04.2018, 12:26
    #39628999
sdku
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Номера записей в таблице/запроса в SQL-коде
Beliar,
создайте вр.таблицу=вашей таблице+поле "группа",заполните его рекордсетом (для каждой группы записей какими либо значениями и при создании отчета используйте таблицу как источник а поле "группа" для группировки (если что-то не ясно покажите более-ли менее реальную таблицу а самое главное поясните 15 первых, с16 по 30 и больше 30 это при сортировке по какому признаку (ведь в таблице НЕТ какого-либо порядка записей)
...
Рейтинг: 0 / 0
12.04.2018, 13:05
    #39629056
Beliar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Номера записей в таблице/запроса в SQL-коде
sdku,
В том-то и дело, что не хочется долбаться с таблицей "временного хранения". Каждый раз долбать все записи и по-новой записывать... Сами исходные данные тоже из временной таблицы... Ну, еще был бы объем данных огромен или с накоплением, я бы, конечно, поработал бы с табличкой, тогда и помощь не понадобилась.
sdkuа самое главное поясните 15 первых, с16 по 30 и больше 30 это при сортировке по какому признаку (ведь в таблице НЕТ какого-либо порядка записей)
Нет никакой разницы в каком порядке будут нумероваться, номера нужны для деления на три выборки, и далее для их "склейки" в качестве столбцов таблички в отчете. У второго и третьего запроса num2 приводится к идентичности с num из первого запроса как раз для JOIN. Да впрочем, порядок записей не меняется, как было при добавлении в исходную таблицу отсортировано по алфавиту, так и остается. Но, повторюсь, это не существенно.
...
Рейтинг: 0 / 0
12.04.2018, 13:09
    #39629061
Beliar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Номера записей в таблице/запроса в SQL-коде
Вообще, задача решена, тему можно закрыть. Хотя я хотел бы проверить последний предложенный Вами вариант и обсудить ньюансы, если будут. Просто уже ради опыта.
...
Рейтинг: 0 / 0
12.04.2018, 13:43
    #39629100
sdku
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Номера записей в таблице/запроса в SQL-коде
Код: 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
12.04.2018, 15:19
    #39629229
Joss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Номера записей в таблице/запроса в SQL-коде
Меня заинтересовала вот эта фраза
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
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Номера записей в таблице/запроса в SQL-коде / 23 сообщений из 23, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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