Rambler's Top100
Форум: MS ACCESSVBVBA MS OfficeMS SQL server
Новые сообщения: 0000

Форум: MS ACCESS

Вопросы связанные с MS ACCESS

Обновить визитку
Участники «Online»
Все участники

 
 

Доброго времени суток, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: рекурсия
 
 автор: час   (26.12.2009 в 13:58)   личное сообщение
 
 


Public Function FUN_TO_CHILDREN(STR_NUMBER_CARD As String) As Integer
' применим Find для открытого рекордсета
'(параметры уточнить там  даже есть направление поиска)
Dim rst As ADODB.Recordset

Dim Id_ As String
Dim Id_Go As String
Set rst = New ADODB.Recordset

Id_ = STR_NUMBER_CARD & "," ' это строка в ней содержатся закладки для перехода - в конце зпт чтоб не морочить голову на проверку когда остается только родитель
GLB_GROUP_TURN = 0 ' или что нужно

rst.Open "CLIENT_CARDS_TBL", GLB_CONNECTION, adOpenKeyset, adLockOptimistic
'FUN_TO_CHILDREN (STR_NUMBER_CARD)

rst.Find "PARENT_CARD = '" & STR_NUMBER_CARD & "'"
' пошли по детям
Do While rst.EOF = False
' сделали свое нужное
  GLB_VAL_COUNT = GLB_VAL_COUNT + 1
    GLB_GROUP_TURN = GLB_GROUP_TURN + (rst("GROUP_ACCOUNT"))
    STR_NUMBER_CARD = rst("NUMBER_CARD")
'    If GLB_VAL_COUNT >= 2000 Then Exit Do

  Debug.Print GLB_VAL_COUNT 'rst("NUMBER_CARD") & "  " & FUN_PERSONAL_TURN(rst("NUMBER_CARD"))
' добавили закладку дитяти
    Id_ = rst.Bookmark & "," & Id_
' запустили с ним функцию
'rst.Close
'Set rst = Nothing
    FUN_TO_CHILDREN (STR_NUMBER_CARD)
' по завершении ф-ции перешли на позицию дитяти с где был останов
    rst.Bookmark = Val(Mid(Id_, 1, InStr(Id_, ",") - 1))
' удалили ID дитяти который уже найден для этого папика
    Id_ = Mid(Id_, InStr(Id_, ",") + 1)
' получаем ID папика для которого нужно искать дальше
    Id_Go = Mid(Id_, 1, InStr(Id_, ",") - 1)
    rst.Find "CLIENT_CARDS_TBL.ID= '" & Id_Go & "'"
Loop
End Function



где то после 200 цикла мы стопоримся и выдаём - что слишком дофига наоткрывали рекордсетов........

  Ответить  
 
 автор: Lukas   (26.12.2009 в 14:04)   личное сообщение
 
 


автор: Lukas (18.12.2009 в 15:35)

Наверное не стоит открывать рекордсет в каждом вызове рекурсивной функции.
Этак можно упереться в "потолок", при большом количестве поколений.
Используйте один раз открытый рекордсет и закладки.

  Ответить  
 
 автор: Силblч   (26.12.2009 в 14:17)   личное сообщение
 
 

не наверное, а точно! :) bd можно передавать в качестве параметра
мало того, вложенность рекурсий тоже ограничена :)

  Ответить  
 
 автор: час   (26.12.2009 в 14:19)   личное сообщение
 
 

Тогда,
рекордсет надо глобальный - вне функции создавать???

Public rst_Card As ADODB.Recordset

Set rst_Card = New ADODB.Recordset

rst_Card.Open "SELECT CLIENT_CARDS_TBL.* " _
& " From CLIENT_CARDS_TBL ", GLB_CONNECTION, adOpenKeyset, adLockOptimistic

  Ответить  
 
 автор: час   (26.12.2009 в 14:25)   личное сообщение
 
 

мало того, вложенность рекурсий тоже ограничена :)



Вы мну пугаете - Силыч.

Как же мне пройтись по всем веткам дерева и собрать информацию о каждом фрукте - не напрягая дерева???
закладок - зарубок не напасёшся........

  Ответить  
 
 автор: час   (26.12.2009 в 15:14)   личное сообщение
 
 

Дааааааааааа - не выходит каменный цветок

Public Function FUN_TO_CHILDREN(STR_NUMBER_CARD As String) As Integer
Id_ = STR_NUMBER_CARD & "," ' это строка в ней содержатся закладки для перехода - в конце зпт чтоб не морочить голову на проверку когда остается только родитель
FUN_CHILDREN (STR_NUMBER_CARD)
End Function

' пока ясно

Public Function FUN_CHILDREN(STR_NUMBER_CARD As String) As Integer
' применим Find для открытого рекордсета (параметры уточнить там  даже есть направление поиска)

rst_Card.Find "PARENT_CARD = '" & STR_NUMBER_CARD & "'"
' пошли по детям
Do While rst_Card.EOF = False
' сделали свое нужное
    GLB_GROUP_TURN = GLB_GROUP_TURN + rst_Card("GROUP_ACCOUNT")
    STR_NUMBER_CARD = rst_Card("NUMBER_CARD") ' (rst("GROUP_ACCOUNT"))
    GLB_VAL_COUNT = GLB_VAL_COUNT + 1
    
    If GLB_VAL_COUNT >= 5000 Then
    Debug.Print GLB_VAL_COUNT
    Exit Do
     End If
' добавили закладку дитяти
    Id_ = rst_Card.Bookmark & "," & Id_
' запустили с ним функцию
    FUN_TO_CHILDREN (STR_NUMBER_CARD)
' по завершении ф-ции перешли на позицию дитяти с где был останов
    rst_Card.Bookmark = Val(Mid(Id_, 1, InStr(Id_, ",") - 1))
' удалили ID дитяти который уже найден для этого папика
    Id_ = Mid(Id_, InStr(Id_, ",") + 1)
' получаем ID папика для которого нужно искать дальше
    Id_Go = Mid(Id_, 1, InStr(Id_, ",") - 1)
    rst_Card.Find "CLIENT_CARDS_TBL.ID= '" & Id_Go & "'"
Loop
End Function
    


2286 - предел - даллее вне стэкового пространства...

  Ответить  
 
 автор: час   (26.12.2009 в 16:09)   личное сообщение
17 Кб.
 
 

Помогите с продвижением

  Ответить  
 
 автор: Lukas   (26.12.2009 в 16:18)   личное сообщение
 
 


rst_Card.Open "SELECT CLIENT_CARDS_TBL.* " _
& " From CLIENT_CARDS_TBL ", GLB_CONNECTION, adOpenKeyset, adLockOptimistic


1. А зачем рекордсету рекурсивной функции весь набор полей (22 шт.) таблицы?

  Ответить  
 
 автор: Гоблин   (26.12.2009 в 16:24)   личное сообщение
 
 

Блин. Вот открыл я его. Нажал кнопарь. Он выдал что всего карт 6 и далее ошибка. В поле ничего нет. Все. Каких карт? Игра в карты что ли? Чего должно быть-то.

  Ответить  
 
 автор: час   (26.12.2009 в 17:06)   личное сообщение
 
 

Эх гоблин - кабы игра в карты - вопросов бы было меньше..........

а ошибка потому, что никак дальше не про двинусь я

  Ответить  
 
 автор: Lukas   (26.12.2009 в 16:32)   личное сообщение
 
 


Маркс_11:30:06_124.3095_26.12.2009__Петров Вася


2. Какое-то "необычное" значение PK, да с длиной поля 250.

Ой, да там все текстовые по 250, даже DATE_OF_BIRTH и PASPORT_SERIES.

  Ответить  
 
 автор: час   (26.12.2009 в 16:59)   личное сообщение
 
 

Lukas, Это же пример просто по умолчанию всё......

  Ответить  
 
 автор: час   (26.12.2009 в 17:05)   личное сообщение
17 Кб.
 
 

вот запрос попроще

  Ответить  
 
 автор: Lukas   (26.12.2009 в 17:50)   личное сообщение
17 Кб.
 
 

Поскольку, что там твоя рекурсия делает, я не понял, то, для примера, добавил в таблицу поле
WithChildren, куда сохраняю значения NUMBER_CARD карты и NUMBER_CARD-ы всех ее деток:

  Ответить  
 
 автор: Гоблин   (26.12.2009 в 18:02)   личное сообщение
 
 

Блин. Чую себя дебилом среди профессоров. Но если даже Лукас не понял, то я пас.
Пойду за елочкой.

  Ответить  
 
 автор: час   (26.12.2009 в 18:41)   личное сообщение
 
 

Спасибо Lukas ?
ты фсё переделал,
но поле маловато
если количество членов перевалит за 255 чилдренов .........


вот думаю динамо массив создать......

какие то закладки только странные получаютч - 517, 513 --- чё это за закладки

теория:
Создать массив
идя по рекурсии - заполнить массив, увеличивая счётчик массива
а потом как то надо вернутся.........

  Ответить  
 
 автор: час   (26.12.2009 в 18:50)   личное сообщение
 
 




'Описываем массив для хранения закладок.
Dim varRecord() As Variant

Private Sub Кнопка0_Click()
Dim STR_NUMBER_CARD As String
' начнём с первой карты
STR_NUMBER_CARD = "1"
Set rst_Card = New ADODB.Recordset
' откроем все карты
rst_Card.Open "SELECT CLIENT_CARDS_TBL.NUMBER_CARD, CLIENT_CARDS_TBL.PARENT_CARD, CLIENT_CARDS_TBL.GROUP_ACCOUNT  FROM CLIENT_CARDS_TBL ORDER BY NUMBER_CARD DESC", CurrentProject.Connection, adOpenKeyset, adLockOptimistic
' Изменяем верхнюю границу размерности массива до значения свойства RecordCount.
ReDim varRecord(0 To rst_Card.RecordCount - 1)
'все карты
MsgBox " Всего карт" & rst_Card.RecordCount - 1
' начнём подсчёты
FUN_TO_CHILDREN (STR_NUMBER_CARD) ' пойдём с первой карты

End Sub



Public Function FUN_TO_CHILDREN(STR_NUMBER_CARD As String) As Integer
FUN_CHILDREN (STR_NUMBER_CARD)
End Function



Public Function FUN_CHILDREN(STR_NUMBER_CARD As String) As Integer
Dim intI As Long ' счётчик массива
intI = 0 ' счётчик массива

' применим Find для открытого рекордсета (параметры уточнить там  даже есть направление поиска)
'отфильтруем детей
rst_Card.Filter = "PARENT_CARD = '" & STR_NUMBER_CARD & "'"
Debug.Print rst_Card.RecordCount & "  Дитя "
' пошли по детям
 If rst_Card.RecordCount <> 0 Then
    Do While rst_Card.EOF = False
    ' сделали свое нужное
        GLB_GROUP_TURN = GLB_GROUP_TURN + rst_Card("GROUP_ACCOUNT")
     ' присвоили переменной новое значение номера карты
        STR_NUMBER_CARD = rst_Card("NUMBER_CARD") ' (rst("GROUP_ACCOUNT"))
        Debug.Print "  Дитё " & rst_Card("NUMBER_CARD")
    
       ' пополняем массив закладками.
        varRecord(intI) = rst_Card.Bookmark ' добавили закладку дитяти
        ' Увеличивает счетчик.
        intI = intI + 1
    ' запустили с ним функцию
        FUN_TO_CHILDREN (STR_NUMBER_CARD)

    Loop
Else
' что делать если детей больше нет.........????

    ' отключим фильтр
       ' rst_Card.Filter = adFilterNone
       ' intI = intI - 1
      '  Id_Go = varRecord(0)
       ' rst_Card.Bookmark = Id_Go
 
 End If

End Function

    Loop


  Ответить  
 
 автор: час   (26.12.2009 в 18:58)   личное сообщение
 
 

Даже лучше номера карт в массив сувать.......
' пополняем массив закладками.
varRecord(intI) = rst_Card("NUMBER_CARD") ' добавили номер карты дитяти

=====================
херня...........
чё потом с этим массивом робить блин

  Ответить  
 
 автор: ShadowOfSun   (27.12.2009 в 02:25)   личное сообщение
 
 

А чем тебе SQL не угодил?
простой запрос

SELECT *
FROM CLIENT_CARDS_TBL
WHERE ID_CARDS LIKE 'Код папочки%';

по моему решает твою проблему

  Ответить  
 
 автор: час   (27.12.2009 в 10:46)   личное сообщение
 
 

извините не решает
Вы всей проблемы не прочувствовали
==============================================
1 Имеется таблица древовидной структуры.
2 Определившись с начальным пунктом поиском - выбираем начало движения по дереву - это может быть любой из узлов (произвольно).
3 Необходимо собрать все сведения по полю MONTH_TURN, проссумировав имеющиеся там значения всех веток идущих от выбранного изначально узла.
=========================================================
Для наглядности начинаем с первой карточки - карта №1 и продвигаемся по всем узлам и веткам этой "цепи".

  Ответить  
 
 автор: ShadowOfSun   (27.12.2009 в 12:00)   личное сообщение
 
 

НЕТ это ты меня не понял.

привожу пример для ветки
Маркс_12:45:38_116.3475_


SELECT Sum(CLIENT_CARDS_TBL.MONTH_TURN) AS [Sum-MONTH_TURN]
FROM CLIENT_CARDS_TBL
WHERE (((IIf(Mid$([ID_CARDS],1,Len("Маркс_12:45:38_116.3475_"))="Маркс_12:45:38_116.3475_" And Len([ID_CARDS])>Len("Маркс_12:45:38_116.3475_"),1,0))=1));



это пример не включает ветку, от которой ищем

сделай запрос - вставь код и замени на другую ветку - поймешь

  Ответить  
 
 автор: час   (27.12.2009 в 15:09)   личное сообщение
 
 

ShadowOfSun - огромное спасибо,
но Вы опять не въехали........
Маркс_12:45:38_116.3475_ - это просто идентификатор записи.
Самое главное из показателей - это номер карты ......
номер карты родителя тоже немаловажно.......
а ID_CARDS - это просто идентификатор....

  Ответить  
 
 автор: Lukas   (27.12.2009 в 13:43)   личное сообщение
17 Кб.
 
 


автор: Lukas (18.12.2009 в 19:02)

Кстати:
Если в запросе добавить поле суммы, то вместо собирания строки ключей, можно просто считать суммы...


Вот интересно, я это для кого писал 9 дней назад?
Для Деда Мороза?
Так ему это и нафик не нужно!

Всего то делов - заточить мой пример под свою задачу:

Public Function AmountWithChildren(IDItem As String, Optional rst As ADODB.Recordset) As Currency
    Dim varBmk As Variant
    If rst Is Nothing Then
        Set rst = New ADODB.Recordset
        rst.Open "SELECT NUMBER_CARD, PARENT_CARD, MONTH_TURN FROM CLIENT_CARDS_TBL ORDER BY NUMBER_CARD", CurrentProject.Connection, adOpenKeyset, adLockOptimistic
        rst.Find "NUMBER_CARD='" & IDItem & "'"
            If Not rst.EOF And Not rst.BOF Then
                AmountWithChildren = rst.Collect(2) + AmountWithChildren(rst.Collect(0), rst)
            End If
        rst.Close
        Set rst = Nothing
    Else
        rst.MoveFirst
        Do Until rst.EOF
            rst.Find "PARENT_CARD='" & IDItem & "'"
            If Not rst.EOF And Not rst.BOF Then
                varBmk = rst.Bookmark
                AmountWithChildren = AmountWithChildren + rst.Collect(2) + AmountWithChildren(rst.Collect(0), rst)
                rst.Bookmark = varBmk
                rst.MoveNext
            End If
        Loop
    End If
End Function

  Ответить  
 
 автор: час   (27.12.2009 в 15:15)   личное сообщение
80 Кб.
 
 

Огромное спасибо Lukas
MONTH_TURN - и есть суммируемое поле
==================================
А ваще ты знаешь - наткнулся на статью
и до нас проблему решали.

Запросом из этой таблицы создать новую из двух полей

  Ответить  
 
 автор: час   (27.12.2009 в 15:20)   личное сообщение
 
 

Огромное спасибо Lukas ,
но попробуй задать карточке №1 родителя 1
зациклив рекурсию - её надолго не хватит.......
она переполнит стэк вызовов и остановится.........

  Ответить  
 
 автор: Lukas   (27.12.2009 в 19:10)   личное сообщение
 
 


...но попробуй задать карточке №1 родителя 1...


То есть дите родило само себя?
Я, признаться, такую ситуацию с трудом себе представляю.

  Ответить  
 
 автор: Denis V.   (27.12.2009 в 16:15)   личное сообщение
 
 

Когда только начинал строить своё приложение с использованием дерева, то тоже ввёл вспомогательную таблицу только для некоторых типов элементов, т.е. таблица должна была бы быть меньше, чем если бы она велась для всех элементов. Какое-то время даже радовался ускорению некоторых запросов. Но потом мне надоело поддерживать эту таблицу: при мало-мальском изменении через какое-то время я уже про неё забывал, и сталкивался с ошибками. Хорошо, что веду типа дневника разработки, где пишу что и когда я решил изменить... Да и мои данные предполагают на начальном этапе довольно динамичное перемещение по иерархии (даже пачками), которое при наличие вспомогательной таблицы оказалось затратным для обновления двух таблиц (хотя, может быть, надо было поработать над эффективностью обновления данных...). В общем, я отказался от вспомогательной таблицы.

  Ответить  
 
 автор: час   (27.12.2009 в 16:36)   личное сообщение
 
 

а как тада теперь выходишь из ситуяйции когда ноадо прощупать все ветки от корня до всех ответвлений......

  Ответить  
 
 автор: час   (27.12.2009 в 16:43)   личное сообщение
 
 

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

перед новым использованием очищать таблицу от данных
и заполнять поновой идя от первого заданного номера карты."вниз" по дереву по веткам.........

тока пока не знаю как запросами создавать такую таблицу записями , которых ещё нет.....

Ясно что создаваемая таблица будет содержать поля как в описаной вспомогателной таблице в вордрвском документе, но вот реализация стопориться моим мозгом......

  Ответить  
 
 автор: Гоблин   (27.12.2009 в 17:28)   личное сообщение
 
 

Программеры, вас бредовые идеи дилетантов не интересуют? Вот одна из них. Дерево - набор папок и файлов в них. На винте они все где-то учтены в некотором разделе. (FAT например) А что если позаимствовать информацию из него?
Не. Наверно это хреновая идея. Потому говорю, что дерево для меня нечто заоблачное. Может вы придумаете нечто простое в алгоритме построения.

  Ответить  
 
 автор: Denis V.   (27.12.2009 в 17:36)   личное сообщение
 
 

Отдельная таблица - не надо. Можно просто использовать "отвязанный" набор записей (ADO).
Реализация... да мой мозг тоже тормозит уже третью неделю (холода, наверное, сказываются).

  Ответить  
 
 автор: Denis V.   (27.12.2009 в 17:32)   личное сообщение
 
 

Пройти всё дерево для меня легче-лёгкого, т.к. в этом случае ничего проходить не надо, достаточно одного запроса на всю таблицу элементнов. У меня структура дерева в виде двух таблиц: таблица элементов и таблица связей.

  Ответить  
 
 автор: час   (27.12.2009 в 17:39)   личное сообщение
 
 

положите сюда пример таких таблиц -я полюбопытствую.........

  Ответить  
 
 автор: Denis V.   (27.12.2009 в 18:06)   личное сообщение
 
 

Элементарно же, таблица элементов:
Tops
ID - primary key
Name - name property
... - other attributes
Таблица связей:
Links
ID - primary key
Child - foreign key to Tops
Parent - parent id from Tops.

  Ответить  
 
 автор: час   (27.12.2009 в 18:43)   личное сообщение
 
 

связь по полю???

  Ответить  
 
 автор: час   (27.12.2009 в 19:55)   личное сообщение
 
 

Я, признаться, такую ситуацию с трудом себе представляю.
    



Я тоже это для длителиности проверки длительности рекурсии

  Ответить  
 
 автор: Lukas   (27.12.2009 в 20:45)   личное сообщение
 
 

Ааа.
У меня ругнулся после 20000 вызова. (я выводил через 100 в дебагер).
Думаешь такого количества рассчитываемых деток будет недостаточно?

  Ответить  
 
 автор: час   (27.12.2009 в 20:54)   личное сообщение
 
 

Класс!!!
Да это показатель!!!!!!!!
Но потолок имеется - это не то, извините..

  Ответить  
 
 автор: час   (27.12.2009 в 21:58)   личное сообщение
25 Кб.
 
 

Ты знаешь..... я другим способом попробовал - вот посмотри....

  Ответить  
 
 автор: час   (27.12.2009 в 22:01)   личное сообщение
 
 

таблица пухнет на глазах, хотя запросы становятся проще........
фильтронул по нужной карте в родителях и вот они фсе дети
блиннннннннн ....... фигня
если бы такую таблицу строить по мере необходимости ..........
тада ба красота, а так пропадёт табличка и звиздец..........



У меня ругнулся после 20000 вызова


20000 = это чего ??
плодов,
узлов,
веток,....

  Ответить  
 
 автор: час   (27.12.2009 в 22:40)   личное сообщение
 
 

Блиннннн - точно!
Надо попробовать создавать такую вспомогалку по мере необходимости - только вот пока не знаю как......
Кстати вот добрый человек ССЫлочку дал

http://am.rusimport.ru/MSAccess/topic.aspx?ID=321

  Ответить  
 
 автор: kot_k_k   (28.12.2009 в 10:01)   личное сообщение
20 Кб.
 
 

раз у вас потолки низкие и стеки узкие - мы пойдем другим путем.

вот посмотри твой пример переделал ф-ци с дополнительной таблой
1. нет стеков
2. открыто одновременно только 2-рекордсета
3. нет рекурсии (скрыли ее)
4. извини в ADO не знаю как правильно написать Delete * ..... поэтому прикрутил DAO - шоб не морочить.

  Ответить  
 
 автор: час   (28.12.2009 в 10:02)   личное сообщение
 
 

Спасибо - изучаю ...........

==========================
прекрасный пример, чудесный, ....
НОВОГОДНИЙ подарок блин.........
Как раз то , что..........
Это вот прямо оно, с доп таблой для хранения временного значения


Ну ты прям Котттт

  Ответить  
 
 автор: час   (28.12.2009 в 11:31)   личное сообщение
 
 

Не ну надо же........

  Ответить  
 
 автор: час   (28.12.2009 в 11:32)   личное сообщение
 
 

Конечно в коде ещё разобраться
, но сам фактттттттттт

  Ответить  
 
 автор: kot_k_k   (28.12.2009 в 11:48)   личное сообщение
 
 

шо там разбираться

сделалли первый раз - внесли деток в доптаблу.
получили кол-во деток.
по ней прошлись добавляя в конец всех найденный деток (из основной),
дошли до конца цикла -
удалили всех перебранных (остались неперебранные новые детки)
опять открыли таблу

и так пока вновь открытая табла не будет пуста - все дети кончились!!!

конструкция Do While EOF=FALSE с переоткрытием таблы внутри самого цикла и дает нам эхфект рекурсии.

  Ответить  
 
 автор: час   (28.12.2009 в 11:50)   личное сообщение
25 Кб.
 
 

Дааааааа

пока тока вот это не понял
как
удалили всех перебранных (остались неперебранные новые детки)

  Ответить  
 
 автор: kot_k_k   (28.12.2009 в 11:57)   личное сообщение
 
 


    Set rst_Test = dbs.OpenRecordset("select * from t1 order by kod")
    Do While rst_Test.EOF = False
        rst_Test.MoveLast
вот туту делаем метку - последняя запись в табле на текущий момент
        Kod_MAX = rst_Test!kod

        rst_Test.MoveFirst
        Kol_ = rst_Test.RecordCount
        For i = 1 To Kol_
            rst_Card.Filter = "PARENT_CARD = '" & rst_Test!NUMBER_CARD & "'"
            Do While rst_Card.EOF = False
                ' сделали свое нужное
                GLB_VAL_COUNT = GLB_VAL_COUNT + 1
                GLB_GROUP_TURN = GLB_GROUP_TURN + rst_Card("MONTH_TURN")
                ' присвоили переменной новое значение номера карты
                STR_NUMBER_CARD = rst_Card("NUMBER_CARD") ' (rst("GROUP_ACCOUNT"))
                Id_ = rst_Test.Bookmark
                With rst_Test
                    .AddNew
                    ' добавили закладку дитяти
                    ' во временную таблу
вот вновь создаваемые имееют код больший от Kod_MAX 
                    !NUMBER_CARD = rst_Card!NUMBER_CARD
                    .Update
                End With
                rst_Test.Bookmark = Id_
                rst_Card.MoveNext
            Loop
            rst_Test.MoveNext
        Next
        ' удаляем использованных предков, да уж
вот тут удаляем из таблы ВСЕ записи - которые имеют меньший код - т.е. сделаные в преддыдущем цикле
        dbs.Execute ("delete * from t1 where kod<=" & Kod_MAX)        
        ' открываем таблу в ней только новые дети!!!!!!!
        Set rst_Test = dbs.OpenRecordset("select * from t1 order by kod")
    Loop

  Ответить  
 
 автор: час   (28.12.2009 в 12:11)   личное сообщение
 
 

Понятно!!!!!
СЛУХАЙ
а этот счётчик он не переполнится???????
может кажный раз программно создавать новую таблу со счётчиком с 1

  Ответить  
 
 автор: kot_k_k   (29.12.2009 в 08:59)   личное сообщение
 
 

счётчик это Аксом создаваемая вещь - уж если он накроется то знач есть ограничение, где-то видел функцию установки его в 1 или вообще в конкретное число.

например - при сжимании базы если пустая табла то счетчик сбрасывается.

  Ответить  
 
 автор: kot_k_k   (29.12.2009 в 09:20)   личное сообщение
 
 

вот нарыл (пример табла tmp_naimen, счетчик - Kod, был счетчик - 7 358 255, стал - 1)


Public Function Clear_Count()
Dim dbs As DAO.Database
Dim op As DAO.Recordset

Set dbs = CurrentDb
Str_ = "alter table tmp_naimen alter column Kod counter(1,1)"
dbs.Execute ("delete * from tmp_naimen")
dbs.Execute (Str_)
End Function


counter(1000,1) - выставляет счетчик в 1000, че знач второй параметр -

п.с. работает только начиная с 2000-го на ХР прокатило, ну да это ж 2002, а 2002>2000

  Ответить  
 
 автор: час   (29.12.2009 в 22:06)   личное сообщение
 
 

Да спасибо !!!!!!

  Ответить  
HiProg.com - Технологии программирования
Rambler's Top100 TopList