Страница 1 из 1

check in документа

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

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

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

СообщениеДобавлено: 20 янв 2012 05:02
Linc
ошибка вылетает на этой строчке:

Result5 = SessionUtil.CheckIn(ExcelObj2, TaskRecord, False)

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

СообщениеДобавлено: 22 янв 2012 20:14
Smike
You need to define Operation ID, Object ID and Class ID in the Task Record in addition to what you already have there.

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

СообщениеДобавлено: 03 фев 2012 06:20
Linc
Из 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...

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);

попробуйте.

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

СообщениеДобавлено: 06 фев 2012 05:38
Linc
Спасибо огромное! действительно когда зануляешь таскрекорд все проходит нормально.. Теперь буду знать что возможны такие подвохи. Код этот мне еще много раз пригодится. Спасибо всем, кто проявил интерес к вопросу и давал советы!)))

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

СообщениеДобавлено: 09 фев 2012 01:24
Геройчиковый
Пожалуйста! Рад, что хоть кому-то это ещё пригодилось 8)
Только в таком "воркэраунде" есть существенный минус, что тогда все настройки чекина будут идти как в системе по умолчанию. То есть, например, если стоит в настройках - удалять файл, после чекина, а вы вот хотите его оставить - то тут уже так не получится. Ибо это как раз в таскрекорде и задаётся.
Но тем не менее, хоть какой-то чекин есть 8)
Хотя попробуйте релизы 20 или 21, вдруг там исправили это. я-то просто сейчас уже не на смартиме сижу, и проверить не могу, но та новая компания, которая сейчас поддерживает СТ вносит довольно-таки суещественные, полезные изменения.
Вот как-то так...

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

СообщениеДобавлено: 21 июл 2015 19:46
Artem
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);