Логика запроса на нумерацию строк.

Kvasnikov
Дата: 26.02.2008 16:37:16
Не могу разобраться с логикой запроса, который нумерует строчки

SELECT DISTINCT Numeration(NAME) AS Num, MyQuery.NAME
FROM MyQuery
WHERE (((Numeration())=0));

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

Каким образом он обнуляет «n» и почему, если убрать «WHERE (((Numeration())=0));», то в каждом новом запросе нумерация продолжается от предыдущего запроса.

Объясните, плиз, по шагам, как для маленьких. Спасибо.
Polev
Дата: 26.02.2008 16:45:35
Kvasnikov
Не могу разобраться с логикой запроса, который нумерует строчки

SELECT DISTINCT Numeration(NAME) AS Num, MyQuery.NAME
FROM MyQuery
WHERE (((Numeration())=0));

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

Каким образом он обнуляет «n» и почему, если убрать «WHERE (((Numeration())=0));», то в каждом новом запросе нумерация продолжается от предыдущего запроса.

Объясните, плиз, по шагам, как для маленьких. Спасибо.

Сначала вычисляется условие WHERE (((Numeration())=0));
При обращение к функции Numeration с пустым аргументом переменной n присваивается значение 0
Далее поочередно каждая строка обращается к этой функции с непустым аргументом.
И n при каждом обращении увеличивается на 1.
Владимир Саныч
Дата: 26.02.2008 16:45:50
Если убрать обнуление, то обнулять не будет... Логично.

Посмотрите в приведенной Вами функции, что она делает, когда к ней обращаются без параметра. Она делает n = 0.

Осталось только добавить, что WHERE выполняется раньше, чем остальные части запроса.
TungusXan
Дата: 26.02.2008 16:47:01
SELECT DISTINCT Numeration(NAME) AS Num 'вызов собсно процедуры чтоб номер был рез запроса
, MyQuery.NAME
FROM MyQuery
WHERE (((Numeration())=0));для пустого имени(дорлжно вроде послединим быть) обнуляем счётчик

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
Вроде так!:)
TungusXan
Дата: 26.02.2008 16:48:19
С обнулением промахнулся:( Но расписал подробнее:)
Kvasnikov
Дата: 26.02.2008 17:26:50
Большое спасибо.
Думал, что запрос для каждой строчки выполняется заново, не знал, что WHERE выполняется только раз в начале.

Только мне не совсем понятно, как он может выполнятся только один раз. Допустим, есть таблица сотрудников и надо выбрать всех с именем «Дима»

SELECT Workers.Name FROM Workers WHERE Workers.Name=”Дима”

Я так понимаю, что запрос должен пройтись по всей таблице и в каждом проверить поле Name, то есть WHERE должно выполнятся столько раз, сколько записей в таблице.
Владимир Саныч
Дата: 26.02.2008 17:30:41
Из WHERE выполняется в самом начале то, что можно. Например, если там написано "Ди" & "ма", то один раз будет вычислено, что вместе получается "Дима", а потом, конечно, каждая строчка будет сравниваться с этим значением. А в Вашем примере вообще поля в условие не входят, значит оно полностью может быть вычислено заранее.
Kvasnikov
Дата: 26.02.2008 17:41:30
Извините за дубль, хотел еще раз сказать Спасибо.
Модератор: Дубль удален.
Владимир Саныч
Дата: 26.02.2008 18:25:21
Кстати, не только в WHERE, но и в списке полей если есть выражение, которое не включает в себя поля, то оно будет вычислено один раз. Поэтому в Вашем же примере второе обращение к Numeration идет с параметром, чтобы функция выполнялась каждый раз. Заметьте, что сам параметр внутри функции не используется.