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

Форум: MS ACCESS

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

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

 
 

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

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

тема: Помогите по MSDataShape
 
 автор: kot_k_k   (18.08.2009 в 16:26)   личное сообщение
 
 

Объясните, кто может, как двигаться по вот такой вещи и как добратьсядо полей таблицы Sklad

rst.Open "SHAPE {select * from naimen} " & _
"APPEND ({select * from sklad} " & "RELATE naimen TO kod_n)", con

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

как-то так:

sOrd.Open "SHAPE {SELECT ord_no,cust_name FROM ord_mstr} AS Order APPEND ({SELECT ord_no, item_no FROM ord_details} AS
OrderDet RELATE ord_no TO ord_no)", cn, adOpenStatic

If rsOrd.RecordCount > 0 Then
     rsOrd.MoveFirst
         While Not rsOrd.EOF
                'display field values from Master Table i.e., ord_mstr
                 MsgBox "Order No from Master = " & rsOrd.Fields("ord_no")
                 MsgBox "Customer Name from Master = " & rsOrd.Fields("cust_name")
                 'child records will be stored inside Master Recordset itself
                 'i.e., ord_details records will be stored inside ord_mstr recordset
                 'OrderDet Recordset object will be stored inside rsOrd Recordset
                 'we dont have to open a seperate recordset for fetching order_details table
                 Set rsOrdDet = rsOrd.Fields("OrderDet").Value
                       If rsOrdDet.RecordCount > 0 Then
                             rsOrdDet.MoveFirst
                             While Not rsOrdDet.EOF
                                       MsgBox "Order No from Detail = " & rsOrdDet.Fields("ord_no")
                                       MsgBox "Item No from Detail = " & rsOrdDet.Fields("item_no")
                                       rsOrdDet.MoveNext
                              Wend
                       End If
                  rsOrd.MoveNext
            Wend
Set cn = Nothing
Set rsOrd = Nothing
Set rsOrdDet = Nothing
End If

и вот это

http://support.microsoft.com/default.aspx?scid=http%3A%2F%2Fsupport.microsoft.com%2Fsupport%2Fkb%2Farticles%2FQ189%2F6%2F57.ASP&NoWebContent=1
http://support.microsoft.com/kb/q191744/

  Ответить  
 
 автор: osmor   (18.08.2009 в 17:31)   личное сообщение
 
 

вот еще
http://support.microsoft.com/kb/185425

  Ответить  
 
 автор: kot_k_k   (19.08.2009 в 10:27)   личное сообщение
 
 

Спасибо дошло.
а чем, принципиально, такая конструкция (SHAPE) отличается от вот такой?

set rsOrd=dbs.Openrecordset("SELECT ord_no,cust_name FROM ord_mstr")
Set rsOrdDet = dbs.Openrecordset("SELECT ord_no, item_no FROM ord_details WHERE ord_no=") & rsOrd!ord_no

если каждый раз все равно открывать

Set rsOrdDet = rsOrd.Fields("OrderDet").Value

или оно происходит быстрее???

  Ответить  
 
 автор: osmor   (19.08.2009 в 10:52)   личное сообщение
 
 

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

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

Разобрался:
Взял пример Номенклатура (8000 записей) и Склад (26000 записей)
Сделал 4 вида переборки

Set op = dbs.OpenRecordset("select * from naimen order by kod_n")
Set Skl = dbs.OpenRecordset("select * from sklad order by naimen")
op.MoveLast
op.MoveFirst
Kol_ = op.RecordCount

For i = 1 To Kol_

1-й

Skl.FindFirst ("naimen=" & op!Kod_N)
Do While Skl.NoMatch = False
kol_0 = kol_0 + 1
Skl.FindNext ("naimen=" & op!Kod_N)
Loop

2-й

If Skl.EOF = False Then
Do While Skl.EOF = False
Do While Skl!Naimen = op!Kod_N
kol_0 = kol_0 + 1
Loop
Skl.MoveNext
Loop
End If

3-й

Set Skl = dbs.OpenRecordset("select * from sklad where naimen=" & op!Kod_N)
Do While Skl.EOF = False
kol_0 = kol_0 + 1
Skl.MoveNext
Loop

op.MoveNext
Next

и 4-й - использование SHAPE

Получил:

вар 1 - 11-12 секунд Findfist, FindNext
вар 2 - 1 секунда логика проверок
вар 3 - 8 секунд OpenRecordset с Where
вар 4 - 1 секунда Shape

Так что есть большое укорение и отсутствует головняк с логикой как во 2-м варианте.
Хотя от Shape тоже требует каждый раз

Set rsOrdDet = rsOrd.Fields("sklad").Value

у него получается мгновенно.
Я думал у Shape есть автоматический переход в подчиненной записи при перемещении на новую в Главной, но
Set rsOrdDet = rsOrd.Fields("sklad").Value
тоже не плохо и быстро!!!

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