Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Есть ли антипод функции Target() ? / 6 сообщений из 6, страница 1 из 1
04.06.2007, 21:11
    #34573548
VFP7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли антипод функции Target() ?
Нужен "анти-Target()", т.е. возможность узнать, является ли данная таблица в данный момент дочерней по отношению к какой-либо другой таблице? Если не считать возможности логического анализа результата работы функции Display Status to file ...
...
Рейтинг: 0 / 0
05.06.2007, 15:09
    #34575303
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли антипод функции Target() ?
Насколько я знаю, прямой функции нет. Как вариант, можно попробовать связку: AUSED()+SET("RELATION"). Т.е. перебор всех открытых рабочих областей и поиск ссылки на нужную рабочую область.
...
Рейтинг: 0 / 0
05.06.2007, 21:32
    #34576309
VFP7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли антипод функции Target() ?
Спасибо, ВладимирМ!
Как это я проморгал такую полезную вещь - AUSED() ?
До сих пор не сообразю :)
Спасибо.
...
Рейтинг: 0 / 0
11.06.2007, 20:23
    #34588792
Игорь2004
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли антипод функции Target() ?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
Function AntiTarget()
   Lparameters tcTableAlias, tlReturnWorkArea
   ** Author: Igor Nikiforov   2007 - 06 - 11 
   ** Returns the alias of a table that is the parent table for a relation as specified in the INTO clause of SET RELATION.
   ** tcTableAlias Returns the alias of the parent table in another work area.
   ** nWorkArea specifies a work area number and tcTableAlias specifies a table alias.
   ** By default, the alias of the parent table from the current work area is returned
   ** if you don't specify the work area or alias.
   ** If tlReturnWorkArea Is .T. returns the number of WorkArea else returns the Alias of parent table
   Do Case
      Case Type("tcTableAlias") = "N"
         tcTableAlias = Alias(tcTableAlias)
      Case  Type("tcTableAlias") = "C"
         tcTableAlias = Alltrim(tcTableAlias)
         If Used(tcTableAlias)
            tcTableAlias = Alias(tcTableAlias)
         Else
            Return Iif(tlReturnWorkArea, - 1 , Null)  && No table is open in Work Area specified by the tcTableAlias
         Endif
      Otherwise
         tcTableAlias = Alias()
   Endcase
   If Empty(tcTableAlias) .Or. .Not.Used(tcTableAlias)
      Return Iif(tlReturnWorkArea, - 1 , Null)  && No table is open in Work Area specified by the tcTableAlias
   Endif
   Local lnI, lnJ, lcTarget
   Local Array laUsed( 1 )
   If .Not.Empty(Aused(laUsed))
      For lnI =  1  To Alen(laUsed,  1 )
         lnJ =  1 
         lcTarget = Target(lnJ, laUsed(lnI,  1 ))
         Do While .Not.Empty(lcTarget)
            If lcTarget == tcTableAlias
               Return Iif(tlReturnWorkArea, laUsed(lnI,  2 ), Alias(laUsed(lnI,  2 )))
            Endif
            lnJ = lnJ +  1 
            lcTarget = Target(lnJ, laUsed(lnI,  1 ))
         Enddo
      Endfor
   Endif
   Return Iif(tlReturnWorkArea,  0 , "") && No parent table

example

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
Open Database (Home( 2 ) + 'Data\testdata')
Use In Select("products")
Use In Select("alcustomer")
Use In Select("customer")
Use In Select("employee")
Use In Select("orders")
Use In Select("orditems")

Use customer Alias alcustomer  In  0  Order cust_id  && Opens Customer table
Use employee In  0  Order emp_id  && Opens Customer table
Use orders In   0  Order order_id  && Opens Customer table
Use products In   0 
Use orditems In   0  Order product_id
Select products
Set Relation To product_id  Into orditems
Select orders
Set Relation To emp_id Into employee
Set Relation To cust_id Into alcustomer  Additive
? " Target(1) ", Target( 1 )
? " Target(2) ", Target( 2 )
? " AntiTarget([orders]) ", AntiTarget()
? " AntiTarget([employee]) ", AntiTarget([employee])
? " AntiTarget([customer]) ", AntiTarget([customer])
? " AntiTarget([ ALCUSTOMER ]) ", AntiTarget([ ALCUSTOMER ])
? " AntiTarget([products]) ", AntiTarget([products])
Select orditems
? " AntiTarget([orditems]) ", AntiTarget()
? " AntiTarget([Null]) ", AntiTarget(Null)
For lnI =  1  To  6 
   ? " AntiTarget("+Alltrim(Str(lnI ))+") ", AntiTarget(lnI)
Endfor
...
Рейтинг: 0 / 0
12.06.2007, 21:56
    #34590304
VFP7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли антипод функции Target() ?
To Игорь2004:
Хорошее решение! И - работает безукоризненно. Короче - то, что надо. Всем рекомендую обратить внимание - весьма полезная функция. Уверен, что многим может пригодится.
Спасибо, Игорь2004 !
...
Рейтинг: 0 / 0
13.06.2007, 00:49
    #34590421
Игорь2004
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли антипод функции Target() ?
Je vous en prie
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Есть ли антипод функции Target() ? / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]