Поиск по этому блогу

пятница, 18 марта 2016 г.

DocsVision 4.5 - Алгоритм поиска в каком подразделении находится сотрудник

Столкнулся с задачей, как определить, в каком подразделении числится сотрудник в DocsVision.
Поиски по форумам особого результата не дали. Немного полазил по DVExplorer и подумал. В итоге алгоритм не очень сложный. Но придется по ходу работы учитывать разные нюансы. Например пользователей может быть два с одинаковым полем данных. Тогда нужно осуществлять поиск по уникальному полю.


среда, 9 марта 2016 г.

DocsVision 4,5 - Изменяем значение в справочнике сотрудников

На этот раз задача посложнее.
Нужно в DocsVision изменить значение в справочнике сотрудников в секции сотрудник.
Менять буду по принципу, если значение не равно нужному мне, то меняем.
Меня интересует поле - Тип маршрутизации - RoutingType.
В DocsVision есть простой способ для подобных действий. Это механизм FindRows. Он принимает xml запрос, по которому ищет соответствия. Им и буду пользоваться.\
P.S.  Запрос можно усложнять, делая выборку по нескольким условиям.


DocsVision 4,5 - изменение фактической даты чего - либо

Давно не наполнял свой блог новыми знаниями. Было лень и было много работы.
В данный период моей жизни я работаю с DocsVision. Пишу скрипты для бизнес - процессов.
Данная запись - шпаргалка. Чтобы не забыть как делалось.
Суть такова - нужно изменить в основной части карточки бизнес - процесса поле "фактическая дата загрузки". Поле может называться и по другому. Главное чтобы оно находилось на вкладке Основное(Основная) в карточке.

воскресенье, 9 ноября 2014 г.

Шифрование строки и расшифровка

Шифруем строку по ключу. Нужно передать строку  и ключ(с помощью которого будем шифровать в метод EncryptText), чтобы зашифровать. Чтобы расшифровать - передаем зашифрованное сообщение и ключ в метод DecryptText.

public static byte[] AES_Encrypt(byte[] bytesToBeEncrypted, byte[] passwordBytes)
        {
            byte[] encryptedBytes = null;

            // Set your salt here, change it to meet your flavor:
            // The salt bytes must be at least 8 bytes.
            byte[] saltBytes = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };

            using (MemoryStream ms = new MemoryStream())
            {
                using (RijndaelManaged AES = new RijndaelManaged())
                {
                    AES.KeySize = 256;
                    AES.BlockSize = 128;

                    var key = new Rfc2898DeriveBytes(passwordBytes, saltBytes, 1000);
                    AES.Key = key.GetBytes(AES.KeySize / 8);
                    AES.IV = key.GetBytes(AES.BlockSize / 8);

                    AES.Mode = CipherMode.CBC;

                    using (var cs = new CryptoStream(ms, AES.CreateEncryptor(), CryptoStreamMode.Write))
                    {
                        cs.Write(bytesToBeEncrypted, 0, bytesToBeEncrypted.Length);
                        cs.Close();
                    }
                    encryptedBytes = ms.ToArray();
                }
            }

            return encryptedBytes;
        }

        public static byte[] AES_Decrypt(byte[] bytesToBeDecrypted, byte[] passwordBytes)
        {
            byte[] decryptedBytes = null;

            // Set your salt here, change it to meet your flavor:
            // The salt bytes must be at least 8 bytes.
            byte[] saltBytes = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };

            using (MemoryStream ms = new MemoryStream())
            {
                using (RijndaelManaged AES = new RijndaelManaged())
                {
                    AES.KeySize = 256;
                    AES.BlockSize = 128;

                    var key = new Rfc2898DeriveBytes(passwordBytes, saltBytes, 1000);
                    AES.Key = key.GetBytes(AES.KeySize / 8);
                    AES.IV = key.GetBytes(AES.BlockSize / 8);

                    AES.Mode = CipherMode.CBC;

                    using (var cs = new CryptoStream(ms, AES.CreateDecryptor(), CryptoStreamMode.Write))
                    {
                        cs.Write(bytesToBeDecrypted, 0, bytesToBeDecrypted.Length);
                        cs.Close();
                    }
                    decryptedBytes = ms.ToArray();
                }
            }

            return decryptedBytes;
        }

        public static string EncryptText(string input, string password)
        {
            // Get the bytes of the string
            byte[] bytesToBeEncrypted = Encoding.UTF8.GetBytes(input);
            byte[] passwordBytes = Encoding.UTF8.GetBytes(password);

            // Hash the password with SHA256
            passwordBytes = SHA256.Create().ComputeHash(passwordBytes);

            byte[] bytesEncrypted = AES_Encrypt(bytesToBeEncrypted, passwordBytes);

            string result = Convert.ToBase64String(bytesEncrypted);

            return result;
        }

        public static string DecryptText(string input, string password)
        {
            // Get the bytes of the string
            byte[] bytesToBeDecrypted = Convert.FromBase64String(input);
            byte[] passwordBytes = Encoding.UTF8.GetBytes(password);
            passwordBytes = SHA256.Create().ComputeHash(passwordBytes);

            byte[] bytesDecrypted = AES_Decrypt(bytesToBeDecrypted, passwordBytes);

            string result = Encoding.UTF8.GetString(bytesDecrypted);

            return result;
        }

Набор полезных JS скриптов

Сюда входят:
1 использование jquery элемента blockUI
2 проверка полей телефона и поля суммы
3 работа с cookie

Footer в ASP NET

В тег form добавляем div, в котором есть ещё один div с пометкой class="mainWindow"( margin: 0 auto; width: 1024px;  height: 768px;),  а в него div с class="footer"(float: left; width: 1024px; height: 25px;).
ContentPlaceHolder помещаем в div с class="workPlace"(float: left;width: 1024px; height: 610px;)


пятница, 12 июля 2013 г.

Поиск файла по всем дискам

Поиск файла по всем дискам и директориям.



static void Main(string[] args)
        {
            foreach (DriveInfo drive in DriveInfo.GetDrives())
            {
                FindFiles(drive.RootDirectory.ToString(), "notepad++.exe");
            }
            Console.Out.WriteLine("Press any key");
            Console.ReadKey();
        }

        public static void FindInDir(DirectoryInfo dir, string pattern, bool recursive)
        {
            Task.Factory.StartNew(() =>
            {
                try
                {
                    foreach (FileInfo file in dir.GetFiles(pattern))
                    {
                        Console.Out.WriteLine(file.FullName);
                    }
                }
                catch (UnauthorizedAccessException)
                {
                }

                if (recursive)
                {
                    DirectoryInfo[] subdir = dir.GetDirectories();
                    int i;
                    int l = subdir.Length;
                    for (i = 1; i < l; i++)
                    {
                        try
                        {
                            FindInDir(subdir[i], pattern, recursive);
                        }
                        catch (UnauthorizedAccessException)
                        {
                            Console.Out.WriteLine("Отказано в доступе " + subdir[i].Name);
                        }
                    }
                }
            });
        }
        public static void FindFiles(string dir, string pattern)
        {
            Task.Factory.StartNew(() =>
            {
                FindInDir(new DirectoryInfo(dir), pattern, true);
            });
        }
    }

понедельник, 25 марта 2013 г.

Сравнение строк без учета регистра

Заметка.
Два способа сравнить строки без учета регистра букв.
Первый через регулярные выражения, а второй через свойство OrdinalIgnoreCase у IndexOf.


Regexp reg = new Regexp("что ищешь", RegexOptions.IgnoreCase)
Match n = new.Match(string)


if(stringToTest.IndexOf("myvalue", StringComparison.OrdinalIgnoreCase) >= 0)
{
   //строки совпали
}
else
{
   //строки не совпали
}

среда, 21 ноября 2012 г.

WPF Бегущая строка

Новая задача - сделать бегущую строку в WPF приложении. Делается очень просто через XAML.
Значения From и To задаются исходя из размера окна программы + длина текста(в 2 раза больше окна).


Canvas x:Name="Canvas" Background="Transparent" Height="25"
                VerticalAlignment="Top">
            <TextBlock Margin="0,7,0,0" VerticalAlignment="Bottom" FontSize="15"  FontWeight="Bold" Foreground="#555"
                       Text="Тестовый текст" Canvas.Right="0">
                <TextBlock.Triggers>
                    <EventTrigger RoutedEvent="TextBlock.Loaded">
                        <EventTrigger.Actions>
                            <BeginStoryboard>
                                <Storyboard>
                                    <DoubleAnimation Storyboard.TargetProperty="(Canvas.Left)" From="1300" To="-750" 
                                                     Duration="0:0:15" RepeatBehavior="Forever"/>
                                </Storyboard>
                            </BeginStoryboard>
                        </EventTrigger.Actions>
                    </EventTrigger>
                </TextBlock.Triggers>
            </TextBlock>
        </Canvas>

среда, 3 октября 2012 г.

WPF file explorer часть 2

В продолжение создания файлового менеджера на WPF. Сегодня решил немного улучшить программу  и добавил несколько функций:

  • открытие выделенного файла в списке
  • копирование выделенного файла в списке (копирование из одной папки в другую)
  • удаление выделенного файла в списке (удаление файла из папки)
  • выделение всех файлов в списке


Открытие


private void Open_selectItem(object sender, RoutedEventArgs e)
        {
            FileInfo filinf = listBox1.SelectedItem as FileInfo;
            try 
            {
                System.Diagnostics.Process p = new System.Diagnostics.Process();
                p.StartInfo.FileName = filinf.FullName;
                p.Start();
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }

воскресенье, 23 сентября 2012 г.

WPF file explorer


Был долго занят с работой, поэтому ничего нового не публиковал. Вот появилось время, решил написать про файловый менеджер.
Задачи:
просмотр дисков и папок компьютера
показывание файлов, находящихся на диске или в папке.
В общем идея такая, чтобы рядом с именем диска была стрелочка, которая разворачивает вниз список папок, а рядом, во втором окне, показывались файлы.
Делал на WPF. Добавляем 1 treeview и 1 listview(пробовал с listBox, но там глюк с отображением содержимого папок), затем пишем такой код.



public MainWindow()
        {
            InitializeComponent();
            TreeViewDrivers();
        }
void TreeViewDrivers() 
        {
            foreach (DriveInfo drive in DriveInfo.GetDrives())
            {
                TreeViewItem item = new TreeViewItem();
                item.Tag = drive;
                item.Header = drive.ToString();
                item.Items.Add("*");
                //trw_Products.Items.Add(item);
                treeView1.Items.Add(item);

                item.Expanded += new RoutedEventHandler(item_DirExpanded);
            }
        }