Перейти к публикации

Вопрос По 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, На написоанное выше - не обращай внимания, я это писал еще до твоего поста, просто инет не работал весь день...

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

Изменено пользователем Герой
Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

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

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

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

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




  • Сообщения

    • boomeeeer
      Не помню чтобы у меня такое спрашивали при регистрации.
    • Snake 60
      @eljer0n  Откройте макрос SaveDRW.swp редактором VBA Найдите вот эти строки: Поменяйте выделенную цифру на нужную вам 3 или 4 - это количество символов которое останется от имени конфигурации. PS При сохранении в PDF тоже ругается на неправильное название чертежа, т.к. тоже обрезает название конфигурации до двух знаков, там тоже надо править при желании...
    • eljer0n
      @malvi.dp в общем порядок следующий (на каждое исполнение свой чертеж и позиция в спецификации):   Для исполнения с 2мя знаками. 1. Есть деталь с именем формата ХХ-01.01-01 (последнее -01 это исполнение) 2. В Мпроп детали назначается исполнение из конфигурации (как у вас на картинке). Отображается корректно 3. Создается чертеж по модели, исполнение в основной надписи чертежа детали отображается корректно. 4. Сохраняется через SaveDRW с корректным именем. 5. В спецификации сборки все отображается корректно.     Для исполнения с 3мя знаками. 1. Есть деталь с именем формата ХХ-01.01-011 (последнее -011 это исполнение) 2. В Мпроп детали назначается исполнение из конфигурации. Отображается корректно 3. Создается чертеж по модели, исполнение в основной надписи чертежа детали отображается корректно. 4. Сохраняется через SaveDRW с некорректным именем, а именно - с обрезанным до двух знаков исполнением (-01). 5. В спецификации сборки шифр отображается (внезапно! может какой глюк был: у солида или у меня ) корректно, как и у вас на рисунке.     Выходит, загвоздка все-таки только в сохранялке чертежа.
    • gudstartup
      да информация о решенной проблеме очень важна так что будем ждать хороших новостей!
    • mrVladimir
      @gudstartup Спасибо Вам за помощь. Теперь дело в приобретении платы. Как что-то получится (сперва приобрести, потом поставить) обязательно отпишусь.
    • gudstartup
      а как вы taxid фирмы нашли?
    • gudstartup
      все что я написал в цитате выше по теме полная фигня в связи с вновь приобретённой информацией. можно менять любые компоненты в пределах серии чпу если только не меняете по или записываете oprminf но  всегда могут быть нюансы  @mrVladimir все должно получиться извините за то что выдал непроверенную информацию за мнение типа знающего эксперта оказывается я 
    • malvi.dp
      Какое у детали имя файла и как формируете Обозначение и Наименование? Вы каждое исполнение сохраняете в новый чертеж? Или это групповой чертеж? Если групповой-то имя конфигурации в нем быть не должно. Стоит ли галочка "Исполнение" "Из конфигурации"? На сколько мне не изменяет память макрос сохраняет файл чертежа с тем же именем что и файл модели в папке модели. В спецификации все правильно отображается, даже если знаков исполнений больше трех  
    • gudstartup
      и главная деталь чтобы на системе была remote option system а именно файл oprminf.000 c сертификатами и были ли проблемы с ними после замены компонентов.
    • boomeeeer
      с него родимого
×
×
  • Создать...