Тема: Перепутали классы

Добрый день.

Вбивая данные по составу изделия и тех. процессам,
мы немного накосячили.
Детали отнесли к классу сборочных единиц.

Пожалуйста подскажите, существует ли простой и не трудоемкий способ
перенести введенные нами позиции номенклатуры из СБ в ДЕ.

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

Re: Перепутали классы

Здравствуйте!  к сожалению встроенного нет.
Скрипты может и писал кто уже, можно конечно просто использовать пасте копи для переноса информации (СП, ТП во всяком случае).

Re: Перепутали классы

Спасибо за ответ.

Re: Перепутали классы

С переносом не так все просто, ведь ваши детали, попавшие в справочник СБ, скорее всего используются в различных спецификациях и там тоже надо сделать замены. Мы сталкивались с такой проблемой на одном из предприятий. Проблема возникла в результате заливки в TecnologiCS данных из АСУП-ной базы предприятия поскольку не всегда возможно было однозначно определить класс заливаемой ДСЕ. Могу выложить скрипт, который это делает, другой вопрос, что его надо будет подкрутить, возможно, под вашу специфику.

Re: Перепутали классы

Выложите пожалуйста, если не трудно.
Попробуем применить.

Re: Перепутали классы

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

Работает по выделенным позициям справочника СБ, подлежащим переносу в ДЕ. Здесь специфика такая, что у деталей, являющихся так называемыми комплектами подбора (по сути это фантомы), имеются спецификации. Перенос таких позиций в справочник ДЕ производится со спецификациями. Вам наверно это не надо. Ну и специфические номенклатурные параметры тут присутствуют.

Re: Перепутали классы

Спасибо еще раз.