Sub KorrSbDe(TCSActiveModule)
' Перенос номенклатуры из справочника СБ в ДЕ со спецификациями
Dim i
Dim Par
Dim Nom
Dim VerSp
Dim Spec
Dim res
Dim NewParVal
Dim OldParVal
Dim OldNote
Dim NewNote
Dim OldName
Dim NewName
Dim INode
Dim Id_STD
Dim NmkId
Dim VerId
Dim NmkSpec
Dim Nmks
Dim AtPar
Dim pbStr
Dim klass
Dim OldParMat
LogObject.ScriptTimeOut = 0
Const constProgressBarStr = "|||||||||||||||||||||||||||||||| "
pbStr = constProgressBarStr
If TCSApp.NmkClasses.Locate("NOTE", "ДЕ", 0) Then '
Set NMks = TCSApp.Nomenclatures(TCSApp.NmkClasses.Properties("ID").AsInteger)
NMks.UserModuleName = NMks.UniqueUserModuleName
Set AtPar = Nmks
If Not AtPar.IsParamAttached("OBOZSPR_OB") Then AtPar.AttachParams ("OBOZSPR_OB")
If Not AtPar.IsParamAttached("KOD_MAT") Then AtPar.AttachParams ("KOD_MAT")
Do
Id = NMks.ShowModal("Выберите ветку Классификатора, куда складывать номенклатуру")
If Id = 1 Then
INode = NMks.DbTree.Selected.NodeId
Else
Call TCSApp.ShowErrorMessage("Выберите ветку Классификатора")
End If
Loop While Id <> 1
End If
For i = 0 To TCSActiveModule.SelectedRowsCount -1
If TCSActiveModule.GotoSelectedRow(i) Then 'Спозиционир
pbStr = CSDN_DESEAN_Library.ShowProgressBarNote(pbStr,"...Переносим... Осталось: " + cstr(TCSActiveModule.SelectedRowsCount - i) )
OldParVal = ""
OldParMat = ""
Set Par = TCSActiveModule.Properties("Parameters").AsIDispatch
If Not Par.IsEmpty Then
'
Par.UserModuleName = Par.UniqueUserModuleName
If Par.Locate("PAR_CODE","OBOZSPR_OB",0) Then
OldParVal = Par.Properties("PAR_VALUE").AsString
Par.DeleteRecord(False)
End If
If Par.Locate("PAR_CODE","KOD_MAT",0) Then
OldParMat = Par.Properties("PAR_VALUE").AsString
Par.DeleteRecord(False)
End If
Else
OldParVal = ""
OldParMat = ""
End If
Par.Refresh
Call TCSApp.DeleteModuleByUserModuleName(Par.UserModuleName)
Set Par = Nothing
OldNote = TCSActiveModule.Properties("NOTE").AsString
OldName = TCSActiveModule.Properties("NAME").AsString
TCSActiveModule.Edit
TCSActiveModule.Properties("NOTE").Value = OldNote+"Старый"
TCSActiveModule.Properties("NAME").Value = OldName+"Старый"
TCSActiveModule.SaveChanges
' Создадим запись в ДЕ
Nmks.CreateNew
Nmks.Properties("NOTE").Value = OldNote
Nmks.Properties("NAME").Value = OldName
If TCSApp.Mesuriments.Locate("NOTE", "шт", 0) Then
Nmks.Properties("MESUR_ID").Value = TCSApp.Mesuriments.Properties("ID").AsInteger
Else
Nmks.Properties("MESUR_ID").Value = 1
End If
'Ставим ее на наш классификатор
Nmks.Properties("NODE_ID").Value = INode
Nmks.SaveChanges
Id_STD = Nmks.Properties("ID").AsInteger
If OldParVal <> "" Then
Call AtPar.SetParameterValue("OBOZSPR_OB",OldParVal)
End If
If OldParMat <> "" Then
Call AtPar.SetParameterValue("KOD_MAT",OldParMat)
End If
' Если есть спецификации - перенесем
Set VerSpecNmk = TCSApp.NMkSpecificationVersions(TCSActiveModule.Properties("ID").AsInteger)
If Not VerSpecNmk Is Nothing Then
'получили все версии спецификаций
pr=False
VerSpecNmk.UserModuleName = VerSpecNmk.UniqueUserModuleName
VerSpecNmk.First
Do While Not VerSpecNmk.Eof
' Создадим версию спецификации у ДЕ, если надо!
Dim IdNewVer1
Dim ParVer1
Dim dat1
Dim ID_N
Dim NmkSpecVer1
Dim TIP_SPEC
Dim VER_DATA
Dim ParVer
ID_N = Nmks.Properties("ID").AsInteger
dat1 = VerSpecNmk.Properties("NAME").AsString
Set ParVer = VerSpecNmk.Properties("Parameters").AsIDispatch
ParVer.UserModuleName = ParVer.UniqueUserModuleName
If ParVer.Locate("PAR_CODE", "SPEC_TIP", 0) Then
TIP_SPEC = ParVer.Properties("PAR_VALUE").AsString
End If
If ParVer.Locate("PAR_CODE", "DATA_VER", 0) Then
VER_DATA = ParVer.Properties("PAR_VALUE").AsString
End If
Call TCSApp.DeleteModuleByUserModuleName(ParVer.UserModuleName)
' Посмотрим, надо ли создавать версию спецификации
If TIP_SPEC = "Технологическая" Then
Set NmkSpecVer1 = TCSApp.NMkSpecificationVersions(ID_N)
NmkSpecVer1.UserModuleName = NmkSpecVer1.UniqueUserModuleName
IdNewVer1 = NmkSpecVer1.CreateNewVersion(dat1)
' Прицепим параметры версии
Set ParVer1 = NmkSpecVer1.Properties("Parameters").AsIDispatch
ParVer1.UserModuleName = ParVer1.UniqueUserModuleName
res = ParVer1.SetParameterValueByParCode("SPEC_TIP", TIP_SPEC, 0, True)
res = ParVer1.SetParameterValueByParCode("DATA_VER", VER_DATA, 0, True)
Call TCSApp.DeleteModuleByUserModuleName(ParVer1.UserModuleName)
Set NmkSpec1 = TCSApp.NmkSpecification(ID_N, IdNewVer1)
NmkSpec1.UserModuleName = NmkSpec1.UniqueUserModuleName
'****
Set SpecNmk = VerSpecNmk.Properties("NmkSpecification").AsIDispatch
SpecNmk.UserModuleName = SpecNmk.UniqueUserModuleName
If Not SpecNmk.IsEmpty Then
SpecNmk.First
Do While Not SpecNmk.Eof
SpecNmk.CurrentRowSelected = True
SpecNmk.Next
Loop
SpecNmk.ActionList.ActionByName("CopyAction").Execute
NmkSpec1.ActionList.ActionByName("InsertAction").Execute
NmkSpec1.Refresh
SpecNmk.First
Do While Not SpecNmk.Eof
Call SpecNmk.DeleteRecord( False )
'
Loop
SpecNmk.Refresh
Call TCSApp.DeleteModuleByUserModuleName(SpecNmk.UserModuleName)
End If
Call TCSApp.DeleteModuleByUserModuleName(NmkSpec1.UserModuleName)
Pr=True
Else ' если не технологическая
If Not Pr Then
Set NmkSpecVer1 = TCSApp.NMkSpecificationVersions(ID_N)
NmkSpecVer1.UserModuleName = NmkSpecVer1.UniqueUserModuleName
IdNewVer1 = NmkSpecVer1.CreateNewVersion("Импорт(Технологическая)")
' Прицепим параметры версии
Set ParVer1 = NmkSpecVer1.Properties("Parameters").AsIDispatch
ParVer1.UserModuleName = ParVer1.UniqueUserModuleName
res = ParVer1.SetParameterValueByParCode("SPEC_TIP", "Технологическая", 0, True)
res = ParVer1.SetParameterValueByParCode("DATA_VER", VER_DATA, 0, True)
Call TCSApp.DeleteModuleByUserModuleName(ParVer1.UserModuleName)
Set NmkSpec1 = TCSApp.NmkSpecification(ID_N, IdNewVer1)
NmkSpec1.UserModuleName = NmkSpec1.UniqueUserModuleName
'****
Set SpecNmk = VerSpecNmk.Properties("NmkSpecification").AsIDispatch
SpecNmk.UserModuleName = SpecNmk.UniqueUserModuleName
If Not SpecNmk.IsEmpty Then
SpecNmk.First
Do While Not SpecNmk.Eof
SpecNmk.CurrentRowSelected = True
SpecNmk.Next
Loop
SpecNmk.ActionList.ActionByName("CopyAction").Execute
NmkSpec1.ActionList.ActionByName("InsertAction").Execute
NmkSpec1.Refresh
SpecNmk.First
Do While Not SpecNmk.Eof
Call SpecNmk.DeleteRecord( False )
'
Loop
SpecNmk.Refresh
Call TCSApp.DeleteModuleByUserModuleName(SpecNmk.UserModuleName)
End If
Call TCSApp.DeleteModuleByUserModuleName(NmkSpec1.UserModuleName)
Else 'если не надо переносить спец
Set SpecNmk = VerSpecNmk.Properties("NmkSpecification").AsIDispatch
SpecNmk.UserModuleName = SpecNmk.UniqueUserModuleName
If Not SpecNmk.IsEmpty Then
SpecNmk.First
Do While Not SpecNmk.Eof
Call SpecNmk.DeleteRecord( False )
Loop
SpecNmk.Refresh
Call TCSApp.DeleteModuleByUserModuleName(SpecNmk.UserModuleName)
End If
'
End If
End If
VerSpecNmk.Next
Loop
End If
VerSpecNmk.Last
Do While Not VerSpecNmk.IsEmpty
Call VerSpecNmk.DeleteRecord( False )
Loop
Call TCSApp.DeleteModuleByUserModuleName(VerSpecNmk.UserModuleName)
Set VerSpecNmk = Nothing
Call TCSApp.DeleteModuleByUserModuleName(NmkSpecVer1.UserModuleName)
Set NmkSpecVer1 = Nothing
' Перенесли
Set Nom = TCSActiveModule.ChildModules.ModuleByName("WhereUsed_Nomenklature").AsIDispatch
If Not Nom Is Nothing Then
Nom.UserModuleName = Nom.UniqueUserModuleName
Set VerSp = Nom.ChildModules.ModuleByName("WhereUsed_Nomenklature_in_specification").AsIDispatch
If Not VerSp Is Nothing Then 'VerSp
VerSp.UserModuleName = VerSp.UniqueUserModuleName
VerSp.First
Do While Not VerSp.eof
NmkId = VerSp.Properties("NMK_ID").AsInteger
VerId = VerSp.Properties("VER_ID").AsInteger
klass = VerSp.Properties("NMK_CLASSIF_TYPE_NOTE").AsString
Set Spec = VerSp.ChildModules.ModuleByName("FromSpecification").AsIDispatch
If Not Spec Is Nothing Then ' Spec
Spec.UserModuleName = Spec.UniqueUserModuleName
' Запомним количество у текущей позиции
kol = Spec.Properties("SPEC_QUANTITY").AsFloat
' Удаляем текущую позицию
Spec.BeginUpdate
If Spec.AllowDelete Then
Spec.DeleteRecord(False)
End If
Spec.EndUpdate
' Вставляем новую позицию
' Сначала спозиционируемся на нужную версию спецификации
Set NmkSpec = TCSApp.NmkSpecification(NmkId, VerId)
NmkSpec.UserModuleName = NmkSpec.UniqueUserModuleName
If (klass = "СБ_ПОК") Then
klass = "ДЕ_ПОК"
Else
klass="ДЕ"
End If
If TCSApp.NmkClasses.Locate("NOTE", klass, 0) Then
NmkSpec.CreateNew
NmkSpec.Properties("ATTACH").Value = TCSApp.NmkClasses.Properties("ID").AsInteger
NmkSpec.Properties("NMK_ID").Value = Id_STD
NmkSpec.Properties("QUANTITY").Value = kol
NmkSpec.SaveChanges
End If
Call TCSApp.DeleteModuleByUserModuleName(Spec.UserModuleName)
Call TCSApp.DeleteModuleByUserModuleName(NmkSpec.UserModuleName)
End If 'Spec
VerSp.Next
Loop ' VerSp
Call TCSApp.DeleteModuleByUserModuleName(VerSp.UserModuleName)
End If 'VerSp
Call TCSApp.DeleteModuleByUserModuleName(Nom.UserModuleName)
End If 'Nom
End If 'Спозиционир
Next
Call TCSApp.HideProgressMessage
TCSActiveModule.Refresh
End Sub
Работает по выделенным позициям справочника СБ, подлежащим переносу в ДЕ. Здесь специфика такая, что у деталей, являющихся так называемыми комплектами подбора (по сути это фантомы), имеются спецификации. Перенос таких позиций в справочник ДЕ производится со спецификациями. Вам наверно это не надо. Ну и специфические номенклатурные параметры тут присутствуют.