check in документа

Программирование для SmarTeam.

check in документа

Сообщение Linc » 20 янв 2012 05:00

Добрый день! подскажите пожалуйста в чем ошибка? Может кто сталкивался? делаю сохранение документа в смартим, потом его же надо зачикинить. код:

Set SmSessionUtil = SmSession.GetService("SmUtil.SmSessionUtil")

Dim ExcelObj2 As ISmObject
Set ExcelObj2 = Nothing
If Dir(SmSession.Config.HomeDirectory & "\Bin\" + "ApproveCard.xls") <> "" Then
FileCopy SmSession.Config.HomeDirectory & "\Bin\" + "ApproveCard.xls", SmSession.Config.HomeDirectory & "\Work\" + "ApproveCard.xls"
End If
Set ExcelObj2 = SmSession.ObjectStore.NewObject(ClassifierClass.ClassId)
Set TargetIdSequence = SmSession.ObjectStore.Sequences.ItemByAttribute(ClassifierClass.Attributes(TargetID))
ExcelObj2.AddAllAttributes
ExcelObj2.FillDefaults
ExcelObj2.Value(TargetID) = TargetIdSequence.IncrementValue(TargetIdSequence.GetCurrentValue, True)

Dim str As String
ExcelObj2.Data.ValueAsString("CN_PART_NUMBER") = "КП "
ExcelObj2.Data.ValueAsString("TDM_DESCRIPTION") = "КП "
ExcelObj2.Data.ValueAsString("FILE_NAME") = "Card" + ExcelObj2.Data.ValueAsString("TDM_ID") + ".xls"
ExcelObj2.Data.ValueAsString("DIRECTORY") = Sess.Config.HomeDirectory & "\Work\"
ExcelObj2.Data.ValueAsString("FILE_TYPE") = "7"
ExcelObj2.Insert 'Ex YesToAllBehaviour

str = ExcelObj2.Data.ValueAsString("TDM_ID")
MsgBox str

' для чек ин------------------
Dim Operation As SmApplic.ISmOperation 'performed operation object
Dim Metainfo As SmApplic.SmMetaInfo 'metainfo object for smClasses
Dim SessionUtil As SmUtil.SmSessionUtil 'main SmarTeam service object
Dim TaskRecord As SmRecList.SmRecord 'task record for operation - for SmartScript
Dim OperName As String 'operation name
Dim ClassId As Integer 'class Id of WorkObject
Dim InvokeScripts As Boolean 'invoke scripts on operation
Dim Result5 As Long 'result of operation

' Get service object
Set SessionUtil = SmSession.GetService("SmUtil.SmSessionUtil")
InvokeScripts = True

OperName = "Check In" '"Check In"
Set TaskRecord = New SmRecList.SmRecord

TaskRecord.AddHeader "NM_LFCYC_CHECKIN_MODE", 2, sdtSmallInt ' "CHECKININ_MODE", 2, sdtSmallInt
TaskRecord.ValueAsSmallInt("NM_LFCYC_CHECKIN_MODE") = 1 'LFCYC_WORKREV
Set Metainfo = SmSession.Metainfo
Dim Query As ISmQuery
Set Query = SmSession.ObjectStore.NewQuery
Query.QueryDefinition.Roles.Add ClassifierClass.ClassId, "F"
Query.QueryDefinition.Select.Add "TDM_ID", "F", False
Query.QueryDefinition.Where.Add "", "TDM_ID", "=", "DOC-1840", False, "F"
Query.Run
Dim rootobj As ISmObject
If Query.QueryResult.RecordCount <> 0 Then
Set ExcelObj2 = SmSession.ObjectStore.ObjectFromData(Query.QueryResult.GetRecord(0), True).Clone
MsgBox "Родительский объект ЕСТЬ!"
Else
MsgBox "Родительский объект отсутствует"
End If
ClassId = ClassifierClass.ClassId
'If Not (RootObject Is Nothing) Then
'Get operation object depending on specific SmClass and operation name
Set Operation = Metainfo.OperationsForClass(ClassId, False).ItemById(6) ' ItemById(6)
MsgBox Operation.ExternalName
'Check if operation allowed for object
If SessionUtil.OperationAllowedOnObject(ExcelObj2, Operation, False) = True Then
'Perform operation on object using SmSessionUtil method
Beep
Result5 = SessionUtil.CheckIn(ExcelObj2, TaskRecord, False)
End If
'End If
Linc
Новичок
Новичок
 
Сообщения: 15
Зарегистрирован: 16 апр 2010 05:04

Re: check in документа

Сообщение Linc » 20 янв 2012 05:02

ошибка вылетает на этой строчке:

Result5 = SessionUtil.CheckIn(ExcelObj2, TaskRecord, False)
Вложения
Безымянный.JPG
Безымянный.JPG (11.49 КБ) Просмотров: 18903
Linc
Новичок
Новичок
 
Сообщения: 15
Зарегистрирован: 16 апр 2010 05:04

Re: check in документа

Сообщение Smike » 22 янв 2012 20:14

You need to define Operation ID, Object ID and Class ID in the Task Record in addition to what you already have there.
Smike
Новичок
Новичок
 
Сообщения: 32
Зарегистрирован: 24 май 2008 22:13

Re: check in документа

Сообщение Linc » 03 фев 2012 06:20

Из API :

The TaskRecord argument can contain following fields:

NM_REVISION Revision assigned to the object
NM_FILE_NAME Name of the file to be copied to the vault
NM_DIRECTORY Location of the file in the vault
NM_EFFECTIVE_FROM Starting effective date
NM_EFFECTIVE_UNTIL Final effective date
NM_LFCYC_CHECKIN_MODE Can be:
LFCYC_WorkRev -- CheckIn/Approve with the working revision
LFCYC_PrevRev -- CheckIn/Approve with the previous revision
LFCYC_UserRev -- CheckIn/Approve with the user-defined revision

NM_PHASE Phase assigned to the new revision
NM_DSC_NOTES Notes on operation
NM_LOGICAL_LINK_COPY Whether previous version's logical links should be copied. Can be:
LCS_No -- Do not copy
LCS_Yes -- Copy
LCS_Dialog -- Show 'Copy Link' screen

NM_TSK_KEEP_LOCAL_COPY Whether to keep a read-only copy of the file located in the working directory for the object currently being checked in or released.
NM_TSK_KEEP_CHECKEDOUT Whether to keep the file checked out for modifications after performing the Check In or Release operation


В таскрекорд не заносятся данные об Operationid, clasid...
Linc
Новичок
Новичок
 
Сообщения: 15
Зарегистрирован: 16 апр 2010 05:04

Re: check in документа

Сообщение Геройчиковый » 04 фев 2012 14:41

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

SessionUtil = (SmUtil.SmSessionUtil)Session.GetService("SmUtil.SmSessionUtil");
SmRecord TaskRecord = new SmRecord();
TaskRecord.AddHeader("NM_FILE_NAME", 128, SmDataTypesEnum.sdtChar);
TaskRecord.set_ValueAsString("NM_FILE_NAME", Object4CheckIn.get_Value("FILE_NAME").ToString());
TaskRecord.AddHeader("NM_LFCYC_CHECKIN_MODE", 2, SmDataTypesEnum.sdtSmallInt);
TaskRecord.set_ValueAsSmallInt("NM_LFCYC_CHECKIN_MODE", 0); //LFCYC_WorkRev = 0
TaskRecord = null; //we should use null, coz if we dont - there will be error
ResultCode = SessionUtil.CheckIn(Object4CheckIn, TaskRecord, false);

попробуйте.
Будь у героев время подумать - героизма не было бы вовсе...
Все люди, занятые истинно важным делом, всегда просты, потому что не имеют времени придумывать лишнее. (Лев Николаевич Толстой)
Делай, что можешь, с тем, что имеешь, там, где ты есть. (Теодор Рузвельт)
Аватара пользователя
Геройчиковый
Участник
Участник
 
Сообщения: 170
Зарегистрирован: 25 сен 2007 08:52
Откуда: Балашиха

Re: check in документа

Сообщение Linc » 06 фев 2012 05:38

Спасибо огромное! действительно когда зануляешь таскрекорд все проходит нормально.. Теперь буду знать что возможны такие подвохи. Код этот мне еще много раз пригодится. Спасибо всем, кто проявил интерес к вопросу и давал советы!)))
Linc
Новичок
Новичок
 
Сообщения: 15
Зарегистрирован: 16 апр 2010 05:04

Re: check in документа

Сообщение Геройчиковый » 09 фев 2012 01:24

Пожалуйста! Рад, что хоть кому-то это ещё пригодилось 8)
Только в таком "воркэраунде" есть существенный минус, что тогда все настройки чекина будут идти как в системе по умолчанию. То есть, например, если стоит в настройках - удалять файл, после чекина, а вы вот хотите его оставить - то тут уже так не получится. Ибо это как раз в таскрекорде и задаётся.
Но тем не менее, хоть какой-то чекин есть 8)
Хотя попробуйте релизы 20 или 21, вдруг там исправили это. я-то просто сейчас уже не на смартиме сижу, и проверить не могу, но та новая компания, которая сейчас поддерживает СТ вносит довольно-таки суещественные, полезные изменения.
Вот как-то так...
Будь у героев время подумать - героизма не было бы вовсе...
Все люди, занятые истинно важным делом, всегда просты, потому что не имеют времени придумывать лишнее. (Лев Николаевич Толстой)
Делай, что можешь, с тем, что имеешь, там, где ты есть. (Теодор Рузвельт)
Аватара пользователя
Геройчиковый
Участник
Участник
 
Сообщения: 170
Зарегистрирован: 25 сен 2007 08:52
Откуда: Балашиха

Re: check in документа

Сообщение Artem » 21 июл 2015 19:46

2012....археологи в работе
Smike » 22 янв 2012 21:14
You need to define Operation ID, Object ID and Class ID in the Task Record in addition to what you already have there.

В ообщем, зрячий да увидит©! Иии там "пасиб" сквозь года))
all work:
Код: Выделить всё
Type t = Type.GetTypeFromProgID("SmRecList.SmRecord");// (object)TaskRecord;
object o = Activator.CreateInstance(t);                     
SmRecList.SmRecord O=(SmRecList.SmRecord)o;
O.SetNullValues();
O.AddHeader("CLASS_ID", 2, SmDataTypesEnum.sdtSmallInt);
O.AddHeader("OBJECT_ID", 2, SmDataTypesEnum.sdtSmallInt);
O.AddHeader("OPERATION_ID", 2, SmDataTypesEnum.sdtSmallInt);
O.AddHeader("NM_LFCYC_CHECKIN_MODE", 2, SmDataTypesEnum.sdtSmallInt);
O.set_ValueAsSmallInt("CLASS_ID", nn.ClassId);
O.set_ValueAsSmallInt("OBJECT_ID", (short)nn.ObjectId);
O.set_ValueAsSmallInt("OPERATION_ID", Operation.Id);   
O.set_ValueAsSmallInt("NM_LFCYC_CHECKIN_MODE",0);
animae scrinium servitus
Аватара пользователя
Artem
Активный участник
Активный участник
 
Сообщения: 387
Зарегистрирован: 14 сен 2007 07:14


Вернуться в Программирование

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

cron