Тема: Назначение одинакового параметра на группу номенклатуры

Здравствуйте. Очень часто (например, для отчётов) нужно отнести номенклатуру  к какой-нибудь группе.  Мне удобнее всего сделать это назначив номенклатурной позиции соответствующий параметр. Повторять такие действия для каждой позиции неудобно, даже если просто копировать параметр. Можно ли как-то назначить одинаковый параметр на группу позиций за 1 раз?

Re: Назначение одинакового параметра на группу номенклатуры

Здравствуйте!

Через АПИ это решается без проблем.

Например создайте вот такой макрос в номенклатурном справочнике

Sub FormMacro_SetupNMkParam(TCSActiveModule)
  If TCSActiveModule.SelectedRowsCount=0 Then 
    Call TCSApp.ShowMessageBox( "", "Выделите позиции номенктатуры, которой вы хотите назначить параметр")
    Exit Sub
  End If
  If TCSApp.Parameters.RunModuleForSelect( "Выберите параметр для назначение выделнным позициям номенклатуры", False ) Then
      Dim Val      
      Val = TCSApp.InputBox( "Задайте значение параметра " & TCSApp.Parameters.Properties( "NAME" ).AsString, "Значение", "" )
      If Val<>"" Then 
        For i = 0 To TCSActiveModule.SelectedRowsCount-1 
          If TCSActiveModule.GotoSelectedRow( i ) Then
             Call TCSActiveModule.SetParameterValue(  TCSApp.Parameters.Properties( "PAR_CODE" ).AsString, Val )
          End If          
        Next
      End If
  End If
End Sub

Вы так же можете выделить требуемую номенклатуру в номенклатурном справочнике, выбрать команду "Параметры номенклатуры" (построение списка параметров лучше отменить, хотя с небольшим объемом данных это не проблема)

Выберите схему поиска, присоедините параметры и разрешите редактировать параметры в сетке

И далее в гриде достаточно удобно можно редактировать параметры (используя клавиши перемещения, F2, Ctrl+Ins, Shift+Ins).

Re: Назначение одинакового параметра на группу номенклатуры

А этот скрипт работает для любого типа параметров? Например, параметры "ссылка на номенклатуру" и "Выбор из списка" в гриде  (2-ой способ) редактировать нельзя....
По поводу второго способа... Если отменить построение списка параметров, то и присоединить их и, соответственно, править их я не могу.... А присоединить схему поиска в режиме параметров номенклатуры, вообще невозможно, там можно только просмотреть карточку номенклатуры и всё.... Или я что-то не так поняла?

Re: Назначение одинакового параметра на группу номенклатуры

А этот скрипт работает для любого типа параметров? Например, параметры "ссылка на номенклатуру" и "Выбор из списка" в гриде  (2-ой способ) редактировать нельзя....

Да, для ссылки на номенклатуру не работает :(. Но вот подправленный примерчик и для ссылок.


Sub FormMacro_SetupNMkParam(TCSActiveModule)
  If TCSActiveModule.SelectedRowsCount=0 Then 
    Call TCSApp.ShowMessageBox( "", "Выделите позиции номенктатуры, которой вы хотите назначить параметр")
    Exit Sub
  End If
  If TCSApp.Parameters.RunModuleForSelect( "Выберите параметр для назначение выделнным позициям номенклатуры", False ) Then            
      ParCode =  TCSApp.Parameters.Properties( "PAR_CODE" ).AsString
      If TCSApp.Parameters.Properties("PAR_TYPE").AsString="R"  Then 
        Set NMks = TCSApp.Nomenclatures( TCSApp.Parameters.Properties("NMK_ATTACH_ID").AsString )
        If Nmks.RunModuleForSelect( "Выберите ссылку на справочник", False ) Then
           Dim NmkRef
           NmkRef = Nmks.Properties("ID").AsInteger
           For i = 0 To TCSActiveModule.SelectedRowsCount-1 
              If TCSActiveModule.GotoSelectedRow( i ) Then
               Set NMkParams = TCSActiveModule.Properties( "Parameters").AsIDispatch
               res = NMkParams.SetParameterValueByParCode( ParCode, "", NmkRef, True )
               If Not Res Then  Call TCSApp.ShowMessageBox( "", "Не могу установить значенеи для номенклатуры " & TCSActiveModule.Properties("NOTE").AsString & " " & TCSActiveModule.Properties("NAME").AsString)
              End If
           Next       
        Else 
          Call TCSApp.ShowMessageBox( "", "Не выбрана ссылка на справочник")
          Exit Sub
        End If
      Else      
        Dim Val
        Val = TCSApp.InputBox( "Задайте значение параметра " & TCSApp.Parameters.Properties( "NAME" ).AsString, "Значение", "" )
        If Val<>"" Then 
          For i = 0 To TCSActiveModule.SelectedRowsCount-1 
            If TCSActiveModule.GotoSelectedRow( i ) Then
               Call TCSActiveModule.SetParameterValue(  ParCode, Val )
            End If          
          Next
        End If
      End If
  End If
End Sub

По поводу второго способа... Если отменить построение списка параметров, то и присоединить их и, соответственно, править их я не могу.... А присоединить схему поиска в режиме параметров номенклатуры, вообще невозможно, там можно только просмотреть карточку номенклатуры и всё.... Или я что-то не так поняла?

Можно.  щелкните правой клавишей мыши  по панели Список доступных параметров. там можно выбрать схему поиска. Да если база не огромная - это излише конечно (я же не знаю сколько у вас данных)

Re: Назначение одинакового параметра на группу номенклатуры

Спасибо! :) Скрипт поправила.  Ссылки добавляет замечательно! :) Списочный параметр тоже добавляет....  Но получается, что я их могу произвольные набрать... Т.е. совсем не из заданного списка значений (при ручном вводе всегда существует возможность опечатки) И программа "проглатывает" это.  Можно этого как-то избежать? Со схемами поиска тоже разобралась. Всё работает!

Re: Назначение одинакового параметра на группу номенклатуры

Да там еще много можно дорабатывать и украшать.

У нас в редакторе скриптов есть замечательная кнопочка - TCS API Explorer. В ней можно очень хорошо исследовать TechnologiCS API.

Внизу код со списочными параметрами

Sub FormMacro_SetupNMkParam(TCSActiveModule)
  If TCSActiveModule.SelectedRowsCount=0 Then 
    Call TCSApp.ShowMessageBox( "", "Выделите позиции номенктатуры, которой вы хотите назначить параметр")
    Exit Sub
  End If
  If TCSApp.Parameters.RunModuleForSelect( "Выберите параметр для назначение выделнным позициям номенклатуры", False ) Then            
      ParCode =  TCSApp.Parameters.Properties( "PAR_CODE" ).AsString
      If TCSApp.Parameters.Properties("PAR_TYPE").AsString="R"  Then 
        Set NMks = TCSApp.Nomenclatures( TCSApp.Parameters.Properties("NMK_ATTACH_ID").AsString )
        If Nmks.RunModuleForSelect( "Выберите ссылку на справочник", False ) Then
           Dim NmkRef
           NmkRef = Nmks.Properties("ID").AsInteger
           For i = 0 To TCSActiveModule.SelectedRowsCount-1 
              If TCSActiveModule.GotoSelectedRow( i ) Then
               Set NMkParams = TCSActiveModule.Properties( "Parameters").AsIDispatch
               res = NMkParams.SetParameterValueByParCode( ParCode, "", NmkRef, True )
               If Not Res Then  Call TCSApp.ShowMessageBox( "", "Не могу установить значенеи для номенклатуры " & TCSActiveModule.Properties("NOTE").AsString & " " & TCSActiveModule.Properties("NAME").AsString)
              End If
           Next       
        Else 
          Call TCSApp.ShowMessageBox( "", "Не выбрана ссылка на справочник")
          Exit Sub
        End If
      Else      
        Dim Val
        If TCSApp.Parameters.Properties("PAR_TYPE").AsString="S"  Then 
           Set ParList = TCSApp.Parameters.Properties("ParListValues").AsIDispatch
           If  ParList.RunModuleForSelect( "Выберите значение параметра из списка", False ) Then
             Val = ParList.Properties("LIST_VALUE").AsString
           Else
             Call TCSApp.ShowMessageBox( "", "Не выбрано значение")
             Exit Sub
           End If 
        Else
           Val = TCSApp.InputBox( "Задайте значение параметра " & TCSApp.Parameters.Properties( "NAME" ).AsString, "Значение", "" )
        End If
        If Val<>"" Then 
          For i = 0 To TCSActiveModule.SelectedRowsCount-1 
            If TCSActiveModule.GotoSelectedRow( i ) Then
               Call TCSActiveModule.SetParameterValue(  ParCode, Val )
            End If          
          Next
        Else
             Call TCSApp.ShowMessageBox( "", "Значение не задано")
             Exit Sub        
        End If
      End If
  End If
End Sub

Re: Назначение одинакового параметра на группу номенклатуры

Спасибо.

У нас в редакторе скриптов есть замечательная кнопочка - TCS API Explorer. В ней можно очень хорошо исследовать TechnologiCS API.

Это всё понятно. Только самостоятельно разобраться не получается.  :( Ловчее что-то делать по аналогии, если есть работающий код, и ты точно знаешь, что он делает. Т.к. имею довольно смутное представление о программировании (не приходилось как-то по жизни раньше сталкиваться), то и приходится выбирать такие методы работы.

Re: Назначение одинакового параметра на группу номенклатуры

Сегодня возникла проблема. При построении списка параметров номенклатуры, по команде Параметры номенклатуры, вываливается такая ошибка: SQL Server Error: ORDER BY items must appear in the select list if SELECT DISTINCT is specified Хотя, ещё вчера всё было ОК. А если присоединить карточку в этом режиме, то когда пытаешься применить все используемые на ней параметры, вываливается след ошибка: Слишком много параметров! Уменьшите их количество! (Параметров на карточке всего 5) И вчера всё цеплялось нормально! С чем может быть связана эта ошибка?

Re: Назначение одинакового параметра на группу номенклатуры

SQL Server Error: ORDER BY items must appear in the select list if SELECT DISTINCT is specified

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

Слишком много параметров! Уменьшите их количество!

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

Re: Назначение одинакового параметра на группу номенклатуры

Действительно, после снятия сортировки эта проблема исчезла:)