Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft Access Новый топик    Ответить
 повторы при случайном отборе  [new]
Kvitok
Member

Откуда:
Сообщений: 50
Здравствуйте все. Не сочтите за труд - подумать.
Была задача: отобрать N записей из набора По результатам случайного отбора. В каждой записи есть поле сумма. Отбор продолжается до тех пор, пока сумма отобранных элементов не достигнет определенной величины. Так как отбор случайный, несколько раз попадаются одни и те же строки. А мне нужно, чтобы нужная сумма получалась из не повторяющихся элементов. Я написал проверку на повторение, но что-то не учел - то есть при нахождении повтора счетчик количества повторов увеличивается, а значение записи в таблицу все-равно заносится. Вот код: (не получается красиво вставить, но
суть от названий не меняется)
Dim rst5 As Recordset 'îòêðûâàåì òàáëèöó
'Ìîíåòàðíàÿ_âûáîðêà_èòîã"
Set rst5 = CreateObject("ADODB.Recordset")
rst5.Open "Ìîíåòàðíàÿ_Âûáîðêà_èòîã", svyaz, adOpenDynamic, adLockOptimistic
rst5.MoveFirst
Do While Not rst5.EOF

If rst5("ÂèäÄîêóìåíòà") = rst2("ÂèäÄîêóìåíòà") Then
If rst5("ÄàòàÄîêóìåíòà") = rst2("ÄàòàÄîêóìåíòà") Then
If rst5("ÍîìåðÄîêóìåíòà") = rst2("ÍîìåðÄîêóìåíòà") Then
If rst5("ÑóììàÐóáëè") = rst2("ÑóììàÐóáëè") Then
If rst5("Ñ÷åòÄåáåò") = rst2("Ñ÷åòÄåáåò") Then
If rst5("Ñ÷åòÊðåäèò") = rst2("Ñ÷åòÊðåäèò") Then
xxxxx = xxxxx + 1 (счетчик повторов)
'MsgBox xxxxx
GoTo errrst5
End If
End If
End If
End If
End If
End If
rst5.MoveNext
Loop

rst5.AddNew
rst5("ÂèäÄîêóìåíòà") = rst2("ÂèäÄîêóìåíòà")
rst5("ÍîìåðÄîêóìåíòà") = rst2("ÍîìåðÄîêóìåíòà")
rst5.Save
aaaaa = aaaaa + Abs(rst2("ÑóììàÐóáëè"))
errrst5:
aaaaa = aaaaa

rst5.Close
Set rst5 = Nothing

Loop

Вроде бы я пропускаю присваивание значений в новую строку или нет?

Сам уже не вижу.
16 ноя 05, 21:30    [2076490]     Ответить | Цитировать Сообщить модератору
 Re: повторы при случайном отборе  [new]
Владимир Саныч
Member

Откуда: Израиль (причем это 1 человек, а не 2 => прошу на ты)
Сообщений: 40414
Я попытался расшифровать эту программу.

стоим не двигаясь на какой-то записи рекордсета 2
идем по рекордсету 5
ищем первую запись, совпадающую с данной записью рекордсета 2 по 6 полям
как только нашли, выходим из цикла
если не нашли, заносим последнюю запись из рекордсета 2 в рекордсет 5 и учитываем ее сумму
16 ноя 05, 21:40    [2076506]     Ответить | Цитировать Сообщить модератору
 Re: повторы при случайном отборе  [new]
Kvitok
Member

Откуда:
Сообщений: 50
Именно так (предполагается, что так)... комп независимо от того, что есть указание на выход из цикла запись из рекордсета2 заносит в рекордсет5. Вот в этом и есть загвоздка. Бывает, что один документ попадает в выборку 3-5 раз, причем не подряд.
Может есть другой способ?
17 ноя 05, 12:53    [2078501]     Ответить | Цитировать Сообщить модератору
 Re: повторы при случайном отборе  [new]
Kvitok
Member

Откуда:
Сообщений: 50
Кстати, почему код копируется иероглифами?
17 ноя 05, 12:59    [2078543]     Ответить | Цитировать Сообщить модератору
 Re: повторы при случайном отборе  [new]
Звереныш
Guest
А что нам показывает пошаговый проход программы?
17 ноя 05, 13:09    [2078599]     Ответить | Цитировать Сообщить модератору
 Re: повторы при случайном отборе  [new]
Владимир Саныч
Member

Откуда: Израиль (причем это 1 человек, а не 2 => прошу на ты)
Сообщений: 40414
Kvitok
комп независимо от того, что есть указание на выход из цикла запись из рекордсета2 заносит в рекордсет5.

Ну, а если отладкой заняться? Типа, на какую строчку он переходит, когда, почему... Я бы и сам занялся, но сижу далековато.

Kvitok
Кстати, почему код копируется иероглифами?

Знаю один способ - перед копированием переключиться на Ru.
17 ноя 05, 13:10    [2078607]     Ответить | Цитировать Сообщить модератору
 Re: повторы при случайном отборе  [new]
Kvitok
Member

Откуда:
Сообщений: 50
1. Пошаговый проход программы делал следующим образом: вставал на последнюю шестую проверку if - then нажимал Ctrl+F8 (потому-что перед этим еще дополна всего); затем смотрел через local содержимое полей в записях; затем нажимаю F8 перехожу на errrst5; затем снова F8 - переходит на errrst5: - то есть все как положено... затем выхожу из пошаговой проверки и смотрю рекордсет5 - там последней стоит та самая запись, которая только что определилась как повтор...
2. Как и почему и куда переходит - вроде все понятно
3. В следующий раз попобробую переключаться на Ru
Может попытаться сперва отладить только эту процедуру (вне основного кода, кстати я его почти в последнем варианте в прошлом вопросе выставлял - вдруг будет интересно), а то циклы в циклах ... хотя рекордсет5 раньше не открывался.
17 ноя 05, 13:24    [2078665]     Ответить | Цитировать Сообщить модератору
 Re: повторы при случайном отборе  [new]
Alexus12
Member

Откуда:
Сообщений: 2868
создаем в таблице с исходными данными поле Random
даем по нему уникальный индекс
перед выборкой набиваем в него результат RND()*10..000
- получаем случайный ключ

опираясь на него, можешь получать отбор без повторений
17 ноя 05, 13:33    [2078707]     Ответить | Цитировать Сообщить модератору
 Re: повторы при случайном отборе  [new]
Kvitok
Member

Откуда:
Сообщений: 50
Согласен. У меня тоже отбор случайного числа без повторения, но есть такое понятие - "Монетарная выборка" (это когда за элемент выборки берется рубль, а не документ, а в составе одного документа этих самых рублей много) и поэтому даже попадая на другой рубль я попадаю на тот же самый документ. Поэтому не все случайные числа меня устраивают.
17 ноя 05, 14:23    [2079069]     Ответить | Цитировать Сообщить модератору
 Re: повторы при случайном отборе  [new]
Kvitok
Member

Откуда:
Сообщений: 50
Попробовал ту же схему отсева на маленькой (пробной) базе - все работает... В рабочей базе визуально повторы остаются. А если поле = is null, оно считается равным полю в другой записи? Может поэтому записи не воспринимаются как одинаковые?
17 ноя 05, 15:18    [2079515]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft Access Ответить