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

Форум: MS ACCESS

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

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

 
 

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

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

тема: ADO Find
 
 автор: час   (17.12.2009 в 10:09)   личное сообщение
 
 

Public Function FUN_TO_FILL_TREE_VIEW(STR_NUMBER_CARD As String) As Integer
' Пробег по детям Подсчёт доходов
'CLIENT_CARDS_TBL NUMBER_CARD PARENT_CARD

Dim rst As ADODB.Recordset
Dim VAL_COUNT As Integer ' количество карт

Set rst = New ADODB.Recordset
VAL_COUNT = 0
GLB_GROUP_ACCOUNT = 0

On Error GoTo C_LOSE

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

If rst.RecordCount = 0 Then GoTo C_LOSE

Debug.Print STR_NUMBER_CARD
rst.MoveLast
rst.MoveFirst

Do Until rst.EOF
rst.MoveLast
rst.MoveFirst
rst.Find "PARENT_CARD = '" & STR_NUMBER_CARD & "'"
как тут проверить - что Find ничего не нашёл???????????????
STR_NUMBER_CARD = rst("NUMBER_CARD")
VAL_COUNT = VAL_COUNT + 1
GLB_GROUP_ACCOUNT = GLB_GROUP_ACCOUNT + rst("PERSONAL_ACCOUNT")
Loop

C_LOSE:
FUN_TO_FILL_TREE_VIEW = VAL_COUNT

rst.Close
Set rst = Nothing


End Function

  Ответить  
 
 автор: АлексейЕ   (17.12.2009 в 10:54)   личное сообщение
 
 

Если FIND ничего не нашел, то текущая запись выйдет за пределы рекордсета и его свойство .EOF вернет значение True

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

Спасибо!!!
Проверяем на EOF и аля улю..........

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


Do Until rst.EOF
rst.MoveLast
rst.MoveFirst
rst.Find "PARENT_CARD = '" & STR_NUMBER_CARD & "'"
Loop


убрал присвоение - цикл не понял - посл.зап, первая - найти, посл.-первая - нашли тоже

и почему не открыть rst с условием

SrtSQL="SELECT CLIENT_CARDS_TBL.* From CLIENT_CARDS_TBL Where PARENT_CARD ='" & STR_NUMBER_CARD & "'"

rst.Open SrtSQL, GLB_CONNECTION, adOpenKeyset, adLockOptimistic
и искатьничего не нужно все записи по условию - перебрал - проссумировал

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



А у этих детей ещё дети а у тех - свои....
Нада всех проссумировать....
и по еолличеству и по суммам++++++

А не только первый эшелон..... как Вы предлагаете...

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

у меня нечто похожее (только там время выполнения родителей пересчитать) получилось с рекурсией разобраться

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

вот попробуй


Do Until rst.EOF
STR_NUMBER_CARD = rst("NUMBER_CARD")
VAL_COUNT = VAL_COUNT + 1
GLB_GROUP_ACCOUNT = GLB_GROUP_ACCOUNT + rst("PERSONAL_ACCOUNT")
'вот можно так вставить в цикл
SrtSQL="SELECT CLIENT_CARDS_TBL.* From CLIENT_CARDS_TBL Where PARENT_CARD ='" & rst!STR_NUMBER_CARD & "'"

rst_1.Open SrtSQL, GLB_CONNECTION, adOpenKeyset, adLockOptimistic
If rst_1.RecordCount > 0 Then FUN_TO_FILL_TREE_VIEW  rst_1!STR_NUMBER_CARD [/b]
Loop

вот только
STR_NUMBER_CARD, VAL_COUNT , GLB_GROUP_ACCOUNT нужно сделать глобальными.
STR_NUMBER_CARD - возможно даже глобальным массивом или строкой

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

Даа , Спасибо!!!
У мну с рекурсией нету коннекта.
Она 'живёт своей жизнью ,- я своей...
Никак не встретимся = чтобы поговорить подушам, выпить
чашечку горилки........
Потому изголился вот так.........

  Ответить  
 
 автор: kot_k_k   (17.12.2009 в 14:31)   личное сообщение
 
 

должно получится, проверь

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

Даааа рекурсия нужна...
ноя никак её не догоняю....

блин........

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

блиннннн а есть простой пример рекурсивной функции - что ба для тупых????

вот нашёл, но

Function Fact(n As Integer)
If n < 1 Then
Fact = 1
Else
Fact = Fact(n - 1) * n
End If
End Function

=================================
Function Fac(STR_NUMBER_CARD )
Dim rst As ADODB.Recordset
Set rst = New ADODB.Recordset

rst.Open "SELECT CLIENT_CARDS_TBL.* " _
& " From CLIENT_CARDS_TBL " _
& " Where (((CLIENT_CARDS_TBL.PARENT_CARD) = '" & STR_NUMBER_CARD & "')), GLB_CONNECTION, adOpenKeyset, adLockOptimistic"
If rst.RecordCount = 0 Then GoTo C_LOSE

Do Until rst.EOF



rst.MoveNext
Loop


C_LOSE:
rst.Close
Set rst = Nothing

End Function

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

нет

берём первую карту
делаем запрос её детей
бежим по детям
берём первого - считываем данные
ЗАПУСКАЕМ НАШУ ЖЕ ФУНКЦИЮ НО С КОДОМ ДИТЯТИ
' т.о. функция_Главная (ФГ) ждет пока не пройдет весь процесс по этому детю
' запускаются ФГ1-ФГ2-........-ФГN - пока дети не кончатся у этого дитя
' после окончания последный функции по детю закроются все N вызванных функций и продолжится процесс дальше
берём N- ого - считываем данные
Дошли до конца

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

Function Fac(STR_NUMBER_CARD )
Dim rst As ADODB.Recordset
Set rst = New ADODB.Recordset

GLB_GROUP_TURN =0#

rst.Open "SELECT CLIENT_CARDS_TBL.* " _
& " From CLIENT_CARDS_TBL " _
& " Where (((CLIENT_CARDS_TBL.PARENT_CARD) = '" & STR_NUMBER_CARD & "')), GLB_CONNECTION, adOpenKeyset, adLockOptimistic"

If rst.RecordCount <>0 Then
rst.MoveLast
rst.MoveFirst


' берём первого, считываем данные его доходов с помощью FUN_PERSONAL_TURN
GLB_GROUP_TURN = GLB_GROUP_TURN + FUN_PERSONAL_TURN(rst("NUMBER_CARD"))

STR_NUMBER_CARD = rst("NUMBER_CARD")
Fac(STR_NUMBER_CARD )
Else


end if

rst.Close
Set rst = Nothing

End Function

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

а цикл по детям где, так мы берем только первого дитя и все!!!!


Function Fac(STR_NUMBER_CARD )
Dim rst As ADODB.Recordset
Set rst = New ADODB.Recordset

GLB_GROUP_TURN =0#

rst.Open "SELECT CLIENT_CARDS_TBL.* " _
& " From CLIENT_CARDS_TBL " _
& " Where (((CLIENT_CARDS_TBL.PARENT_CARD) = '" & STR_NUMBER_CARD & "')), GLB_CONNECTION, adOpenKeyset, adLockOptimistic"
do while rst.eof=false
          ' берём первого, считываем данные его доходов с помощью FUN_PERSONAL_TURN
            GLB_GROUP_TURN = GLB_GROUP_TURN + FUN_PERSONAL_TURN()
            STR_NUMBER_CARD = ( rst("NUMBER_CARD")
            Fac(STR_NUMBER_CARD )
            rst.movenext
loop
rst.Close
Set rst = Nothing
End Function

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


GLB_GROUP_TURN =0#


вот это не понятно (что знач 0# - я могу чего-то не знать) это кажется будет обнулять ее при каждом вызове , нужно в процедуре которая вызывает пересчет написать,

Public GLB_GROUP_TURN as Variant
Function Fac_Global()
       GLB_GROUP_TURN=0
       Fac (STR_NUMBER_CARD )
end Function Fac

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

Дааа это будет обнулять
это надо убрать -
а обнулять бум перед вызовом этой функции...

Function Fac(STR_NUMBER_CARD )
Dim rst As ADODB.Recordset
Set rst = New ADODB.Recordset

rst.Open "SELECT CLIENT_CARDS_TBL.* " _
& " From CLIENT_CARDS_TBL " _
& " Where (((CLIENT_CARDS_TBL.PARENT_CARD) = '" & STR_NUMBER_CARD & "')), GLB_CONNECTION, adOpenKeyset, adLockOptimistic"
do while rst.eof=false
          ' берём первого, считываем данные его доходов с помощью FUN_PERSONAL_TURN
            GLB_GROUP_TURN = GLB_GROUP_TURN + FUN_PERSONAL_TURN()
            STR_NUMBER_CARD = ( rst("NUMBER_CARD")
            Fac(STR_NUMBER_CARD )
            rst.movenext
loop


rst.Close
Set rst = Nothing
End Function


а как же теперь других детей самой верхней самого первой карты
или я опять не догнал????

Ваще то вроде никого не обделили....
Но я сомневаюся
Ей час ещё код по изучаю в мозге........

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

да и еще


If rst.RecordCount <>0 Then
rst.MoveLast
rst.MoveFirst



для чего движение по базе?

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

так говорят 100% выход на первую запись
хотя я тоже думаю достаточно moveFirst

- предохраняюся

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

да выходишь на кол-во записей, но это нигде не используется в данном случае достаточно просто цикл с условем

Do While EOF=False 
Loop 

даже если нет записей не будет никакой ошибки просто цикл сразу закончится.
и еще нужно сначала
MoveLast
MoveFist
RecordCount
только так получим полное значение.

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

а вдруг - сразу EOF ? и звиздец
или мы где то окажемся в центре Recordset _a

так что презик на свечку - не помешает
сказала монашка

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


Function Fac(STR_NUMBER_CARD )
Dim rst As ADODB.Recordset
Set rst = New ADODB.Recordset

rst.Open "SELECT CLIENT_CARDS_TBL.* " _
& " From CLIENT_CARDS_TBL " _
& " Where (((CLIENT_CARDS_TBL.PARENT_CARD) = '" & STR_NUMBER_CARD & "')), GLB_CONNECTION, adOpenKeyset, adLockOptimistic"
do while rst.eof=false
          ' берём первого, считываем данные его доходов с помощью FUN_PERSONAL_TURN
            GLB_GROUP_TURN = GLB_GROUP_TURN + FUN_PERSONAL_TURN()
            STR_NUMBER_CARD = ( rst("NUMBER_CARD")
            Fac(STR_NUMBER_CARD ) ' бежим по всем детям пока не кончатся, по детям детей , по их детям
             
            rst.movenext ' берём следующего
loop


rst.Close
Set rst = Nothing
End Function




А как только дети кончатся
и цикл кончиться, а мы ещё верхний цикл не добегали.......
Кот_т_т -- чё та не то..........

Мы каждый раз берём следующего и следующего,
а тех что ранее - мы не пробегаем = не уделяем им должного внимания - как Вы считаете........
Лезим вглубь по одной ветке.....
А надо поразветвлениям шарить........

Здаётся мне тута ещё один цикл нужен

  Ответить  
 
 автор: kot_k_k   (18.12.2009 в 12:01)   личное сообщение
 
 

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


Если созданный объект Recordset содержит записи, то текущей записью становится первая запись. Если записи в объекте отсутствуют, свойство RecordCount получает значение 0, а свойства BOF и EOF значение True


справичник

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

Справочник - конешна врать не будет - на то он и .........

А может вот так надо

Public Function FUN_TO_CHILDREN(STR_NUMBER_CARD As String) As Integer

Dim rst As ADODB.Recordset
Set rst = New ADODB.Recordset

rst.Open "SELECT CLIENT_CARDS_TBL.* " _
& " From CLIENT_CARDS_TBL " _
& " Where (((CLIENT_CARDS_TBL.PARENT_CARD) = '" & STR_NUMBER_CARD & "')), GLB_CONNECTION, adOpenKeyset, adLockOptimistic"

rst.MoveFirst

Do While rst.EOF = False

            GLB_GROUP_TURN = GLB_GROUP_TURN + FUN_PERSONAL_TURN( rst("NUMBER_CARD"))
            STR_NUMBER_CARD = rst("NUMBER_CARD")

            rst.MoveNext
Loop

rst.MoveFirst

Do While rst.EOF = False

            GLB_GROUP_TURN = GLB_GROUP_TURN + FUN_PERSONAL_TURN( rst("NUMBER_CARD"))
            STR_NUMBER_CARD = rst("NUMBER_CARD")
            Fac (STR_NUMBER_CARD)
            rst.MoveNext
Loop

rst.Close
Set rst = Nothing
End Function



  Ответить  
 
 автор: kot_k_k   (18.12.2009 в 12:13)   личное сообщение
 
 

Час от Часу не легче

зачем первый цикл - он же увеличит на значение детей - все вычисляемые показатели
второй цикл делает то же самое, только + внуки (дети детей)

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

Звиняюсь за бесталковость
у мну в башке мы теряем часть родственников в самом первом вызове рекурсии..........
то есть лезем дальше и дальше, а первый запрос остаётся не обработанным, да и дальнейшие...
мв только первого берём дитя и смотрим его детей...
А второго , третьего - мы не проверяем.........

  Ответить  
 
 автор: kot_k_k   (18.12.2009 в 12:31)   личное сообщение
 
 

поехали:

Функция1 (Ф1)
1-й дите
обработали
вызвали ф-цию с дитем
Ф1 останов
        Ф2 (пример 3-дитя у него у 2-го есть еще 2 шт.)
              1-й дите
              2-й дите
               вызвали ф-цию с дитем
              Ф2 останов
                          Ф3
                                1-й дите
                                2-й дите
                           Ф3-конец
               Ф2 продолжили
               3-й дите
        Ф2 конец
Ф1 продожили
2-й дите
.....
N-ый дите
Ф1 конец

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

Ты Вы уверен

  Ответить  
 
 автор: kot_k_k   (18.12.2009 в 12:41)   личное сообщение
 
 

крест на пузе желтой краской, бля буду бэ в натуре волкодав

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

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

  Ответить  
 
 автор: kot_k_k   (18.12.2009 в 12:49)   личное сообщение
 
 

что знач до последнего и вылетаем
код на базу

  Ответить  
 
 автор: час   (18.12.2009 в 13:04)   личное сообщение
 
 



Public Function FUN_TO_CHILDREN(STR_NUMBER_CARD As String) As Integer

Dim rst As ADODB.Recordset
Set rst = New ADODB.Recordset

rst.Open "SELECT CLIENT_CARDS_TBL.* " _
& " From CLIENT_CARDS_TBL " _
& " Where (((CLIENT_CARDS_TBL.PARENT_CARD) = '" & STR_NUMBER_CARD & "'))", GLB_CONNECTION, adOpenKeyset, adLockOptimistic
rst.MoveLast
rst.MoveFirst

Do While rst.EOF = False

            GLB_GROUP_TURN = GLB_GROUP_TURN + FUN_PERSONAL_TURN(rst("NUMBER_CARD"))
            STR_NUMBER_CARD = rst("NUMBER_CARD")
            FUN_TO_CHILDREN (STR_NUMBER_CARD)
            rst.MoveNext
Loop


rst.Close
Set rst = Nothing
End Function

  Ответить  
 
 автор: час   (18.12.2009 в 13:07)   личное сообщение
 
 

Виноват - свечка с презиком подвела

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

отож!
а я ж тобі казав

rst.MoveLast 
rst.MoveFirst 

навіщо

и долши не до последнего, а до первого у дитя у которого нет детей.

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

я це мови не поняв
Я це мовi не знав
ты гутарь по москалёву
я це буду понимати

Скильки я годин побачiл, а такi вот не встре...

о

скільки годин в день Вам потрібно спати???

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

ответ - днём не спят

  Ответить  
 
 автор: kot_k_k   (18.12.2009 в 13:21)   личное сообщение
 
 


Public Function FUN_TO_CHILDREN(STR_NUMBER_CARD As String) As Integer 

Dim rst As ADODB.Recordset 
Set rst = New ADODB.Recordset 

rst.Open "SELECT CLIENT_CARDS_TBL.* " _ 
& " From CLIENT_CARDS_TBL " _ 
& " Where (((CLIENT_CARDS_TBL.PARENT_CARD) = '" & STR_NUMBER_CARD & "'))", GLB_CONNECTION, adOpenKeyset, adLockOptimistic 
rst.MoveLast 
rst.MoveFirst 

Do While rst.EOF = False 

            GLB_GROUP_TURN = GLB_GROUP_TURN + FUN_PERSONAL_TURN(rst("NUMBER_CARD")) 
            STR_NUMBER_CARD = rst("NUMBER_CARD") 

' возможно это уменьшит время выполнения - хотя спорный вариант
' нужно запустить с 2-мя вариантами на большом количестве и посмотреть

             rst_1.Open "SELECT CLIENT_CARDS_TBL.* " _ 
& " From CLIENT_CARDS_TBL " _ 
& " Where (((CLIENT_CARDS_TBL.PARENT_CARD) = '" & STR_NUMBER_CARD & "'))", GLB_CONNECTION, adOpenKeyset, adLockOptimistic 
           if rst_1.eof=false then  FUN_TO_CHILDREN (STR_NUMBER_CARD) 


            rst.MoveNext 
Loop 


rst.Close 
Set rst = Nothing 
End Function 


но кажется ускорит

  Ответить  
 
 автор: час   (18.12.2009 в 13:53)   личное сообщение
 
 

сразу проверка на наличие записей - и если нет, то и не \делать рекурсию

  Ответить  
 
 автор: kot_k_k   (18.12.2009 в 14:01)   личное сообщение
 
 

да.
но тут нужно смотреть если гарантировано есть внуки хотябы во 60%-70% то наверное это увеличит время

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

Спасибо!!!

нчну новую ветку

  Ответить  
 
 автор: kot_k_k   (18.12.2009 в 14:28)   личное сообщение
 
 

а это мне кажется точно ускорит (если есть смысл в усорении? когда 2-3 уродня детей, а не 10-100ни - то конечно эсть)


Public Function FUN_TO_CHILDREN(STR_NUMBER_CARD As String) As Integer  

Dim rst As ADODB.Recordset  
Set rst = New ADODB.Recordset  

Str_Num=STR_NUMBER_CARD

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

rst.FindFirst  "CLIENT_CARDS_TBL.PARENT_CARD = '" & Str_Num & "'"


Do While NoMatch= False  
              
             GLB_GROUP_TURN = GLB_GROUP_TURN + FUN_PERSONAL_TURN(rst("NUMBER_CARD"))  
            STR_NUMBER_CARD = rst("NUMBER_CARD")  

             Id_Go=rst.Bookmark
             rst.FindFirst  "CLIENT_CARDS_TBL.PARENT_CARD = '" & Str_Num & "'"
             if NoMatch= False  then  FUN_TO_CHILDREN (STR_NUMBER_CARD)  
             rst.rst.Bookmark=Id_Go
             rst.FindNext  "CLIENT_CARDS_TBL.PARENT_CARD) = '" & Str_Num & "'" 

Loop  
rst.Close  
Set rst = Nothing  
End Function  

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

закладка на то мес_то, где были

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

Id_Go as string ?

и ещё мне код сказал , что у ADO - нет метода rst.FindFirst

- опять розыгрыш

  Ответить  
 
 автор: kot_k_k   (18.12.2009 в 16:04)   личное сообщение
 
 

у ADO есть метод Find - но в ADO если чесно я не силен, а английский - только после одки нормально шпрехаю.
ХЭЛП


Searches a Recordset for the row that satisfies the specified criteria. Optionally, the direction of the search, starting row, and offset from the starting row may be specified. If the criteria is met, the current row position is set on the found record; otherwise, the position is set to the end (or start) of the Recordset.

Syntax

Find (Criteria, SkipRows, SearchDirection, Start)

  Ответить  
 
 автор: Lukas   (18.12.2009 в 15:35)   личное сообщение
 
 

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

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

а собери пожалуйста из того , что на экране = как это должно выглядеть в функции

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

Давай я лучше свой пример покажу:
Здесь функция обновляет значения поля WithChildren (Text(255)), в котором собираются
IDItem (Long, Counter) записей через запятую (Свой +детки) , для каждой записи таблицы.
То есть, если детей нет, то только свой IDItem, если есть, то свой IDItem и IDItem-ы деток, внуков, правнуков и т.д. через запятую.
В поле IDParent (Long) - значение IDItem родителя.

Далее запросом с IN () можно будет считать суммы.
Вызывать без параметров, так: Call FillWithChildren() или просто: FillWithChildren

Должен признаться, я не специалист по деревьям и по ADO.
Возможно есть более простые решения.


Public Function FillWithChildren(Optional IDItem As Long = 0, Optional rst As ADODB.Recordset, Optional Children As String)
    Dim varBmk As Variant
    If rst Is Nothing Then
        Set rst = New ADODB.Recordset
        rst.Open "SELECT IDItem, IDParent, WithChildren FROM tblComBar ORDER BY IDItem DESC", CurrentProject.Connection, adOpenKeyset, adLockOptimistic
        Do Until rst.EOF '"обNullим" поле "WithChildren"
            rst(2) = Null
            rst.Update
            rst.MoveNext
        Loop
        rst.MoveFirst
        Do Until rst.EOF
            If Not rst.EOF And Not rst.BOF Then
                varBmk = rst.Bookmark
                Children = ""
                If IsNull(rst.Collect(2)) Then ' Только если заранее "обNullили" поле "WithChildren" всех строк.
                    FillWithChildren rst.Collect(0), rst, Children
                Else
                    Children = rst.Collect(2)
                End If
                rst.Bookmark = varBmk
'Debug.Print rst.Collect(0) & Children
                rst(2) = rst.Collect(0) & Children
                rst.Update
                rst.MoveNext
            End If
        Loop
        rst.Close
        Set rst = Nothing
    Else
        rst.MoveFirst
        Do Until rst.EOF
            rst.Find "IDParent=" & IDItem
            If Not rst.EOF And Not rst.BOF Then
                If IsNull(rst.Collect(2)) Then
                    varBmk = rst.Bookmark
                    Children = Children & "," & rst.Collect(0)
                    FillWithChildren rst.Collect(0), rst, Children
                    rst.Bookmark = varBmk
                Else
                    Children = Children & "," & rst.Collect(2)
                End If
                rst.MoveNext
            End If
        Loop
    End If
End Function

  Ответить  
 
 автор: kot_k_k   (18.12.2009 в 17:02)   личное сообщение
 
 

вот метод Find както описан
http://www.visual.2000.ru/develop/ms-vb/cp9907-2/msado1-2.htm

вот с одним RecordSet


Public Id_ As Variant, GLB_GROUP_TURN As Variant, rst As ADODB.Recordset

Public Function FUN(STR_NUMBER_CARD As String) As Integer
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.Close
Set rst = Nothing
End Function


' пока ясно

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

rst.Find "CLIENT_CARDS_TBL.PARENT_CARD = '" & STR_NUMBER_CARD & "'"
' пошли по детям
Do While rst.EOF = False
    GLB_GROUP_TURN = GLB_GROUP_TURN + FUN_PERSONAL_TURN(rst("NUMBER_CARD"))
    STR_NUMBER_CARD = rst("NUMBER_CARD")

' сделали свое нужное
' добавили закладку дитяти
    Id_ = rst.Bookmark & "," & Id_
' запустили с ним функцию
    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

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

там написано
пять методов поиска объектов DAO в один метод Find;

тока как он тада работает
===========================================

Круто Вы запузырили..........

Без пузурька ХР разберёшььь

  Ответить  
 
 автор: kot_k_k   (18.12.2009 в 21:53)   личное сообщение
 
 

я не крут в DAO а тем более в ADO , но - различие в операторе - в DAO было Find... в ADO стало FInd + строка поиска, направление поиска, относительное смещеноие от текущей строки .

7 раз прочитай - один раз запомни - 8 раз сделай лапками - понимание к табэ приййдет

отошла третья ступень.
полет нормальный 21:03

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

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

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

всё продолжаешь грузить...........

  Ответить  
 
 автор: alecks_lp   (18.12.2009 в 22:41)   личное сообщение
 
 

1. Если интерес к методу ADO Find не пропал, то примерно так:

        rs_child.Find "parent_id=" & lngID, , adSearchForward, adBookmarkFirst

            Do Until rs_child.EOF '
'                ...если что-то нашли то... что-то делаете с этим, затем двигаетесь на запись вперед и   продолжаете поиск
                rs_child.Find "parent_id=" & lngID, 1, adSearchForward, adBookmarkCurrent
            Loop


Если количество итераций известно, то работать Find с дитя -родитель вполне приемлемо

  Ответить  
 
 автор: kot_k_k   (18.12.2009 в 23:05)   личное сообщение
 
 

все наши проблемы в том что кто-то знает что-то о DAO, кто-то о ADO еще есть SQL и VB в их вариациях, но никто (даже сами производители) не знают полностью, исчЁ раз повторю ПОЛНОСТЬЮ ни одного из выше названного произведения.

хотя я не удивляюсь


"для того чтобы остаться на месте - нужно бежать,
для того чтобы продвинуться на шаг впред - нужно бежать в два раза быстрее"
Л. Кэролл.



Вот это было у нас в методичке по прогрмаммированию на С++ в место эпиграфа.
хотя скорее это эпитафия.

п.с. отошла 4-я ступень - крик души.
п.п.с. как я люблю Клиппер

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

аааааааааааа вот они для чего эти константы property

adSearchForward
Спасибо!!!!!!!!!!

Нет количес тво заранее не известно!!!!!!!!!

  Ответить  
 
 автор: Гоблин   (19.12.2009 в 19:43)   личное сообщение
 
 

Люди, я нихрена не понял из того что тут написано. Но вопрос такой, это по созданию дерева в ветках которого таблицы и запросы базы?
Прошу громко не смеяться.

  Ответить  
 
 автор: Lukas   (19.12.2009 в 20:00)   личное сообщение
20 Кб.
 
 

Здесь нет.
Но:
Можно рассматривать объекты сервера/базы и объекты объектов как дерево
объектов, например как в SQL Server Management Studio:

  Ответить  
 
 автор: Гоблин   (19.12.2009 в 22:31)   личное сообщение
 
 

Круто. Видимо дерево - это то, что мне не расшифровать.

  Ответить  
 
 автор: kot_k_k   (20.12.2009 в 00:00)   личное сообщение
 
 

блин - 4-е сутки одни ....
это приме дерева с дитями и рекурсией.
я устал пиво жрать, пальы по клаве не попадают
оно должно рабатать, вашу мать, ну может почти, пише 1-й руко

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