Герой

Вопрос По Smarteam'y (написание Скриптов)

Доброе время суток.

Вобще перейду сразу к делу:

в Смартиме я сижу уже где-то две недельки... более менее разобрался что и как, перелопатил множество мануалов и хелпов и, о чудо - я почти уже сам написал афигенный(ну по моим меркам афигенный 8)) ) скрипт. Он уже выводит все как надо в вордовский документ и т.п. Но под конец столкнулся с очень неприятной вещью, которая меня просто убивает... Ия не знаю как это описать, в мануалах ничего толкого не нашел, вобщем я в панике... Помогите пожалуйста.

Я должен в вордовский документ вывести поля объектов класса "Purchased part"

Инициализирую все это дело через правой клавишей по компоненте(допустим "Комплекс") и "Операции определенныепользователем"->Мой скрипт

Но проблем в том, что в этом комплексе может быть еще 10 комплексов, а в них, еще 100 сборочных единиц, в которых еще 1000 комплексов и т.п. И в самом конце может быть несколько объектов типа "Purchased part".

Я написал скрипт, который выводит все что нужно, но только если эти "Purchased part'ы" прямо в самом комплексе, по которому я щелкнул(вызвал) свой скрипт, т.е. они - непосредственные "Chidrens" этого объекта. А те чилдрены, которые дольше - я не знаю как их достать, какое условие для QweryDef (Where) написать ит.п.. ВОбщем не могу достать их оттуда, и вывожу либо тока этих "Purchased part" которые непосредственные дети, либо всех "Purchased part" из вообще всего дерева, а мне надо, которые только "ниже по дереву" от компоненты, по которой я щелкнул... Какое условие-то нужно написать, чтобы брались все "дети" от этой компоненты?

Вот нужная часть кода:

Dim ObjFromPar As Object



			Dim SelectedClassId As String



			Dim SelectedObjId As String



			Dim SelectedObj As Object



			Dim NewBehavior As SmApplic.ISmBehavior



			Dim SmQuery As SmApplic.ISmQuery



			Dim SelectedObjChildren As SmApplic.ISmMultiCompositeObjects



			Dim ChildrenCount As Integer



			Dim myQuery As SmApplic.ISmQuery



			Dim myQueryDef As SmApplic.ISmQueryDefinition



			Dim MetaInfo As SmApplic.SmMetaInfo





			Dim CurrentChildClassId As String



			Dim CurrentChildObjId As String



			Dim CurrentChildObj As Object

 



'************************************************************************************************

*****



'Код скрипта



 

			Set SmSession = SCREXT_ObjectForInterface(ApplHndl)



			CONV_RecListToComRecordList FirstPar, ObjFromPar



			If ObjFromPar.ValueAsString("OBJECT_ID", 0) = "" Then																							   'Если скрипт будет запускаться по нажатию кнопки на форме



						CONV_RecListToComRecordList SecondPar, ObjFromPar



			End If



			SelectedClassId$ = ObjFromPar.ValueAsInteger("CLASS_ID", 0)



			SelectedObjId$ = ObjFromPar.ValueAsInteger("OBJECT_ID", 0)



			Set SelectedObj = SmSession.ObjectStore.RetrieveObject(SelectedClassId, SelectedObjId)



			Set MetaInfo = SmSession.MetaInfo



			Set myQuery = SMSession.ObjectStore.NewQuery



			Set myQueryDef = myQuery.QueryDefinition



			Set myQueryDef = Nothing



			Set SelectedObjChildren = SelectedObj.RetrieveChildren(myQueryDef)



			ChildrenCount%=SelectedObjChildren.Count



			If ChildrenCount%<=0 Then																																														'Если нет дочерних компонентов, то скрипт не запускать																																									 



						msgbox SmSession.MetaInfo.SmClass(SelectedClassId$).ExternalName + " " + ObjFromPar.ValueAsString("CN_CODE",0) + " не имеет составляющих компонент"



			Stop



			End If



 



			Set NewBehavior = SmSession.ObjectStore.DefaultBehavior.Clone



			NewBehavior.InvokeScripts = False																																								 'Не вызывать скрипт, пока выполнятся операция



			NewBehavior.ViewObjectAuthorization = voaNotToCheck																										   'Не проверять авторизацию пользователя		



			NewBehavior.CheckAuthorization = false



  



			Set SmQuery = SmSession.ObjectStore.NewQuery



	Set QueryDef = SmQuery.QueryDefinition



			QueryDef.Roles.Add SmSession.MetaInfo.SmClassByName("Items").ClassId, "F"											   



			QueryDef.Roles.Add SmSession.MetaInfo.SmClassByName("Purchased part").ClassId, "S"					 



			QueryDef.Roles.Add SmSession.MetaInfo.SmClassByName("Items Tree").ClassId, "L"



 

			QueryDef.Select.Add "OBJECT_ID", "S", False																																	'Объявляем параметры, которые будем выводить в таблицу



			QueryDef.Select.Add "CN_CODE", "S", False



			QueryDef.Select.Add "CN_NAME", "S", False



			QueryDef.Select.Add "CN_SUPPLIER_DOCUMENT", "S", False



			QueryDef.Select.Add "CN_SUPPLIER", "S", False



			QueryDef.Select.Add "CN_CODE", "F", False																																	  



			QueryDef.Select.Add "CN_NAIMEN", "S", False																																  



			QueryDef.Select.Add "CN_QUANTITY", "L", False



			QueryDef.Select.Add "CN_OBOZN_NA_POSTAVKY", "S", False



			QueryDef.Select.Add "CN_PRIM", "S", False



			QueryDef.Select.Add "CLASS_ID", "S", False



			QueryDef.Select.Add "CN_COMMENT", "S", False



			QueryDef.Where.Add "", "OBJECT_ID", "=", SelectedObj.ObjectId, False, "F"	'Вот только по этому Where - выводяться все Purchased part'ы, непосредственные дети текущего объекта







'		   QueryDef.Where.Add "", "CLASS_ID", "=", "2533", False, "S"	 ' А вот по этому - вообще все из всей компоненты, ужас.... 2533-КЛАСС_АйДи Purchased Part'a



			QueryDef.OrderBy.Add "CN_CODE", 1, obtAscending, "S"



 

			Dim QueryDefinition1 As SmApplic.ISmQueryDefinition 



			Dim Parents As SmApplic.ISmObjects ' collection of objects 



			SmQuery.RunEx NewBehavior



 



			If SmQuery.QueryResult.RecordCount < 1 Then																																   'Проверяем, есть ли ПИ в данной компоненте



						MsgBox "В данной компоненте не найдено ни одного объекта класса <Purchased part>", ebOKOnly + ebInformation, "Сообщение"



						GoTo ENDD



			End If

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах


ja konechno ne smarteam programmer ..

no esli ubrat' is mnogestwa wsex detalej mnogestwo detalej 1go urovnia to poluchitsia list detalej ot 2go i nige ... ( chisto is matematicheskix soobragenij :) )

ili?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Если это дерево, тогда зачем тебе делать Query?

Попробуй так:


Public Function GetItems(ByVal CurrentHttpContext As HttpContext, ByVal SmObject As SmarTeam.Std.Interop.SmarTeam.SmApplic.ISmObject) As SmarTeam.Std.Interop.SmarTeam.SmApplic.ISmObjects

			Try

				Dim SmartCRMRWH As New SmartCRM.Std.Connection.Helpers.SmartCRMReadWriteConnectionHelper

				Dim SmSession As SmarTeam.Std.Interop.SmarTeam.SmApplic.SmSession = SmartCRMRWH.SmSession(CurrentHttpContext)



				Dim QueryDefinition As SmarTeam.Std.Interop.SmarTeam.SmApplic.ISmQueryDefinition

				Dim Relations As SmarTeam.Std.Interop.SmarTeam.SmApplic.ISmObjects  ' collection of objects

				Dim Roles As SmarTeam.Std.Interop.SmarTeam.SmApplic.ISmQueryRoles ' query roles

				Dim QueryResultAttributes As SmarTeam.Std.Interop.SmarTeam.SmApplic.ISmQueryResultAttributes



				QueryDefinition = SmContact.ObjectStore.NewQueryDefinition()

				QueryResultAttributes = QueryDefinition.Select

				Roles = QueryDefinition.Roles

				Roles.Add(SmSession.MetaInfo.SmClassByName("Class Name").SuperClassId, "S")

				Roles.Add(SmSession.MetaInfo.SmClassByName("Relation Name").ClassId, "L")

				QueryResultAttributes.Add("OBJECT_ID", "S", False)



				Relations = SmContact.RetrieveRelations(QueryDefinition)

				If Relations.Count = 0 Then Return Nothing



				Return Relations

			Catch

				CurrentHttpContext.Response.Write(err.Desciption)

			End Try

			Return Nothing

		End Function

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Представьте дерево:

.......................................А1....................................................А2

.................Б11...........................Б12 ..............................Б21...............................Б22

.......В111..............В112..............В121..............В122..............В211..............В212..............В221............................В222

Г1111 Г1112 Г1121 Г1122 Г1211 Г1212 Г1221 Г1222 Г2111 Г2112 Г2121 Г2122 Г2211 Г2212 Г2221 Г2222

....................................................................................................

....................................................................................................

.

.

И.т.д. то есть...

Пусть каждый из этих элементов содежить хотя бы один объект класса Purchased Part. Так вот, щелкаю я к примеру по Б12 и вызываю мой скрипт.... Я хочю, в Query получить объекты класса Purchased Part из Б12 и из В121, В122 и из Г1211,Г1212,Г1221,Г1222 и т.д. (я выделил жирным..)

Так вот, мой вопрос состоит в том, как в QuerryDefinition описать условие Where чтобы я получал объекты нужного мне класса из выбранного элемента и из элементов, которые ниже его по дереву.... Если это делаеться как-то по другому, буду очень благодарен, если расскажете как... Я просто думаю, что я иду по правильному пути.. Но вот как это сделать - я не знаю.. уже всю голову сломал... И кстати, чтобы все это работало не зависимо от мерности вложений, т.е. так сказать универсально...

Заранее спасибо.

2Green_fx, На написоанное выше - не обращай внимания, я это писал еще до твоего поста, просто инет не работал весь день...

Так вот, я пока еще слету не разобрался, что тут ты написал, но щас я это на работу себе скину и бду там разбираться. Надеюсь, что поможет.. Заранее спасибо.

Изменено пользователем Герой

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу