(изменено: q41HCxSH0bAz1Reugyc0, 6 сентября 2018 09:31:56)

Тема: SetParameterValueByParCode C#

Добрый день!
Для одних номенклатур параметр задаётся, для других - нет.
Если изменить вручную обозначение номенклатуры NMK1 на любой другой, то параметр задаётся.

    internal static class Program
    {
        private static TCS _fTcs = new TCS();
        private static Tcs_Application _tcsApp;

        public static void Main(string[] args)
        {
            _tcsApp = _fTcs.Login();

            SetParValue("NMK1");

            Console.WriteLine("===========================");

            SetParValue("NMK2");

            _tcsApp = null;
            _fTcs = null;

            GC.Collect();
            GC.WaitForPendingFinalizers();
        }

        private static void SetParValue(string note)
        {
            var nmk = _tcsApp.Nomenclatures[100];

            var r = nmk.Locate["NOTE", note, 0];

            if (!r)
            {
                return;
            }

            var pars = (IParameterValues) nmk.Properties["Parameters"].AsIDispatch;

            var nmkId = nmk.Properties["ID"].AsInteger;

            var nmkClassifTypeRef = nmk.Properties["NMK_CLASSIF_TYPE_REF"].AsInteger;

            Console.WriteLine("NOTE = " + nmk.Properties["NOTE"].AsString);

            Console.WriteLine("NMK_CLASSIF_TYPE_REF = " + nmkClassifTypeRef);

            var r2 = pars.SetParameterValueByParCode["SomeParCode", nmk.Properties["NOTE"].AsString, nmkId, true];

            Console.WriteLine("SetParameterValueByParCode = " + r2);
        }
    }

Вывод в консоль:

NOTE = NMK1
NMK_CLASSIF_TYPE_REF = 100
SetParameterValueByParCode = False
===========================
NOTE = NMK2
NMK_CLASSIF_TYPE_REF = 100
SetParameterValueByParCode = True

Re: SetParameterValueByParCode C#

pars.ShowModal( "Look at me" ) и смотрим что происходит. Видимо нет прав на изменение параметров номенклатуры

а еще лучше и nmk вывести

Re: SetParameterValueByParCode C#

Плюсик есть, значит права есть. И я писал выше, что если изменить обозначение, то работает.

Post's attachments

1.JPG 27.41 Кб, файл не был скачан. 

You don't have the permssions to download the attachments of this post.

Re: SetParameterValueByParCode C#

Номенклатуру выведите. Ну и в этом окне попробуйте этот параметр все таки добавить чтобы убедиться.

Ну и в вашем случае https://help.technologics.ru/7.1/TCSAPI … alue_9.htm будет удобнее.

Re: SetParameterValueByParCode C#

Олег Зырянов пишет:

Номенклатуру выведите. Ну и в этом окне попробуйте этот параметр все таки добавить чтобы убедиться.

Так добавляется. Но пишет, что значение параметра не уникально. Номенклатур с таким значением параметра нет.

Re: SetParameterValueByParCode C#

ну вот и ответ. Сморите где это значение параметра есть. Пересчитайте кеш.

Re: SetParameterValueByParCode C#

Олег Зырянов пишет:

Сморите где это значение параметра есть

Нигде нет.

Олег Зырянов пишет:

Пересчитайте кеш.

Как?

Re: SetParameterValueByParCode C#

SetParameterValueByParCode C#

галочки снять, записать, потом снова установить. Хотя я бы проверил что такое значение параметра есть уже.

Re: SetParameterValueByParCode C#

Олег Зырянов пишет:

Хотя я бы проверил что такое значение параметра есть уже.

Я проверил. Нет такого значения.
В кэше было.

Кэш пересчитал, сейчас параметр записывается.
Получается, что кэш лучше не использовать?

Re: SetParameterValueByParCode C#

Уникальный параметр без кеша не работает.

Проверим, может где у нас что то отработало не правильно.  На такой случай такая операция и предназначена.

Re: SetParameterValueByParCode C#

При перезаписи параметра кэш не обновляется.

        private static TCS _fTcs = new TCS();
        private static Tcs_Application _tcsApp;

        public static void Main(string[] args)
        {
            _tcsApp = _fTcs.Login();

            SetParValue("TEST.395622.594", "ParVal_1");
            SetParValue("TEST.395622.594", "ParVal_2");
            SetParValue("TEST.395622.594", "ParVal_1");


            _tcsApp = null;
            _fTcs = null;

            GC.Collect();
            GC.WaitForPendingFinalizers();
        }
        
        private static void SetParValue(string note, string parvalue)
        {
            Nomenclatures nmk = _tcsApp.Nomenclatures[100];

            nmk.First();

            var r = nmk.Locate["NOTE", note, 0];

            
            try
            {
                (nmk as IAttachedParams).SetParameterValue("SomeParCode", parvalue);
                Console.WriteLine(parvalue + " НЕТ ОШИБКИ");
            }
            catch (Exception e)
            {
                Console.WriteLine(parvalue + " ОШИБКА!");
            }

        }

Вывод в консоль:

ParVal_1 НЕТ ОШИБКИ
ParVal_2 НЕТ ОШИБКИ
ParVal_1 ОШИБКА!

Re: SetParameterValueByParCode C#

Спасибо, изучим проблему обязательно.