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

Показаны сообщения с ярлыком Полезное. Показать все сообщения
Показаны сообщения с ярлыком Полезное. Показать все сообщения

пятница, 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;
        }

понедельник, 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>

вторник, 17 июля 2012 г.

Изменяем TabControl через XAML

Занялся изменением внешнего стиля TabControl. Хотелось сделать угловатые закладки как в Expression Blend 4(в самой программе) или как в Google Chrome. Есть некоторые НЕДОРАБОТКИ, но всё вполне функционирует.  Единственное неудобство - GRID в TabItem автоматичесски подстраивается под содержимое. Для начала поискал пару примеров, в общем вот что получилось.
Всё запихиваем в <Windows.Resurces>


<Style TargetType="{x:Type TabItem}">
            <Setter Property="SnapsToDevicePixels" Value="true"/>
            <Setter Property="OverridesDefaultStyle" Value="true"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type TabItem}">
                        <Grid Margin="0,0,-12,0">
                            <!--Самостоятельная проба создать вкладки-->
                            <Border Name="Border" Background="Transparent" BorderBrush="Transparent"
                                    BorderThickness="1,1,1,1" CornerRadius="6,6,0,0" />
                            <Path Name="Blablabla" Data="M0.5,3.5 C0.5,1.8431458 1.8431458,0.5 3.5,0.5 L46.5,0.5 C48.156854,0.5 75.082788,25.5 70.333333,25.5 65.583878,25.5 0.75000088,25.249498 0.5,25.583056 0.24999912,25.916615 0.5,10.944442 0.5,3.5 z" 
              Fill="Black" HorizontalAlignment="Left" Height="26.089" Stretch="Fill" Stroke="White" 
              VerticalAlignment="Bottom"  Width="110"/>
                            <ContentPresenter x:Name="ContentSite" TextElement.Foreground="White" ContentSource="Header" VerticalAlignment="Center"
                                              HorizontalAlignment="Center" Margin="0,0,18,0"/>
                        </Grid>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsSelected" Value="true">
                                <Setter TargetName="Border" Property="Background" Value="Orange" />
                                <Setter Property="Panel.ZIndex" Value="100" />
                            </Trigger>
                            <Trigger Property="IsSelected" Value="false">
                                <Setter TargetName="ContentSite" Property="TextElement.Foreground" Value="White"/>
                                <Setter TargetName="Border" Property="Background" Value="Transparent"/>

                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>

воскресенье, 20 мая 2012 г.

Перемешивание списка

Иногда бывает нужно перемешать(отсортировать) определённый список или массив данных в случайном порядке.
Вот один вариант решения данной задачи:

    class Randoming
    {
        public static void MixList<t>(IList<t> list) 
        {
            Random r = new Random();
            //Создаем сортируемый список и набиваем в него значения из 
            //целевого списка. Тип SortedList устроен так, что при добавлении 
            //нового элемента, он (элемент) помещается не в конец списка 
            //элементов, а между ними, обеспечивая моментальную автоматическую 
            //сортировку списка
            SortedList<int, t> mixedList = new SortedList<int, t>();
            //заполняем список
            foreach (t item in list)
                mixedList.Add(r.Next(), item);

            list.Clear();
            for (int i = 0; i < mixedList.Count; i++)
            {
                list.Add(mixedList.Values[i]);
            }  
        }
    }
        
static void Main(string[] args)
        {
            Console.WriteLine("Сейчас будет рандомная сортировка");
            List<string> myList = new List<string>();
            //List<string> result = new List<string>();
            for (int i = 0; i < 50; i++)
                myList.Add(i.ToString());
            Randoming.MixList(myList);
            foreach(var ml in myList)
            {
                //result.Add(ml);
                Console.WriteLine(ml);
            }
            //Console.WriteLine(result);
            Console.ReadLine();
        }

Получаем исходный код страницы

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

        private void button1_Click(object sender, EventArgs e)
        {
            //Программа достаёт исходный код страницы
            //создаём строку url,в которой будем указывать адресс сайта
            string url = urlTextBox.Text;
            //Создаём объект , который будет выполнять запрос к URI(идентификатор ресурса)
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            //GetResponse - возвращает ответ на интернет-запрос
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            //Реализуем считывание символов из потока байтов в определенной кодировке.
            //GetResponseStream -  возвращает поток данных из  интернет-ресурса
            StreamReader sr = new StreamReader(response.GetResponseStream());
            //Читаем поток от начала до конца
            richTextBox1.Text = sr.ReadToEnd();
            //закрываем поток
            sr.Close();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            //очишаем поле
            richTextBox1.Clear();
        }

пятница, 4 мая 2012 г.

Получение информации о ПК

Собрал несколько исходных кодов для получения информации о ПК в консольном приложении.
В коде присутствует System.Management. Чтобы его добавить нужно пройти в Solution Explorer, найти там в списке своей программы References, нажать правой кнопкой мыши ->Add->выбрать NET и найти там  System.Management.
В общем сами коды:

Список всех активных процессов в системе

ManagementObjectSearcher searcher =
        new ManagementObjectSearcher("root\\CIMV2",
           "Select Name, CommandLine From Win32_Process");

            foreach (ManagementObject instance in searcher.Get())
            {
                Console.WriteLine("{0}", instance["Name"]);
            }
            Console.Write("Press any key to continue . . . ");
            Console.ReadKey();

воскресенье, 29 апреля 2012 г.

Про System.IO.Path

Класс .NET System.IO.Path имеет множество статических методов для работы с файлами и путями, которые должны облегчить жизнь)


// Объединяет компоненты имени и пути в один путь
string fullPath = Path.Combine(workingDirectory, fileName);

//если у вас есть полное имя файла, содержащее путь,
string fullPath = "c:\\Downloads\\output\\t0.html";
 
// возвращает "c:\"
string pathPart = Path.GetPathRoot(fullPath);
 
// возвращает "t0.html"
string filePart = Path.GetFileName(fullPath);
 
// возвращает ".html"
string extPart = Path.GetExtension(fullPath);
 
// возвращает "c:\downloads\output"
string dirPart = Path.GetDirectoryName(fullPath);

Генератор паролей на основе RNGCryptoServiceProvider

Увидел в одном блоге, интересный пример генератора паролей. Мне лично такие варианты ещё не попадались. Вот  решил его разместить у себя в блоге.
На форму нужно кинуть Label, 2 TextBox'a, 1 Buttom. Размещаем в любом порядке, а дальше код.


private void button1_Click(object sender, EventArgs e)
        {
            if (Convert.ToInt32(textBox1.Text) < 35)
            {
                try
                {
                    //try говорит о ошибке в определённом куске, чтобы её отловить
                    // Вызов функции или выполнение каких-то иных
                    // действий, которые могут генерировать исключение
                    textBox2.Clear();
                    byte[] temp = Generator.RollDice(Convert.ToInt32(textBox1.Text));
                    for (int i = 0; i < temp.Length; i++)
                    {
                        textBox2.Text += (char)temp[i];
                    }
                }
                catch (Exception ex)
                {
                    //catch - выводит сообщение о ошибке возникшей в try
                    // Сюда управление передается в случае, когда в блоке
                    // try сгенерировано исключение — в самом ли блоке, в
                    // функции, которая в нем вызывается, в функции,
                    // которая вызывается функцией, вызванной в try-блоке
                    // и так далее — словом, где угодно. Объект Exception
                    // описывает ошибку
                    MessageBox.Show(ex.Message);
                }
            }
            else
                MessageBox.Show("Введите число меньше 35!!!");
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //по умолчанию в текстбоксе будет стоять значение 16
            textBox1.Text = "16";
        }

Подключение новой формы

Нашёл в инете пример как подключить новую (вторую форму или третью и тд.). Нужно, когда программа подразумевает несколько окон (форм).
P.s. Я понимаю, что это  можно прочесть на MSDN, но проще иметь такие вещи под рукой, а не искать. (у меня лично трудности с поиском на MSDN)


private void button1_Click(object sender, EventArgs e)
{
 Form2 f2 = new Form2(); // создаем
 f2.ShowDialog(); // показываем
}

среда, 25 апреля 2012 г.

Класс Stopwatch

Stopwatch() - предоставляет набор методов и средств, которые можно использовать для точного измерения затраченного времени. На http://msdn.microsoft.com/ предоставляется вот такой вариант. С помощью этого кода можно определить время работы какого-либо приложения. Если его прописать в это приложение (программу).

Stopwatch stopWatch = new Stopwatch();
        stopWatch.Start();
        Thread.Sleep(10000);
        stopWatch.Stop();
        TimeSpan ts = stopWatch.Elapsed;

        
        string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
            ts.Hours, ts.Minutes, ts.Seconds,
            ts.Milliseconds / 10);
        Console.WriteLine("RunTime " + elapsedTime);

P.s. В Windows Forms не работает, когда паралельно используется Timer.




Складывание значений переменной

Задача: есть переменная, в которой есть несколько цифр (например - 78654433), их нужно сложить вместе.
Сначала разбиваем переменную на чары, а потом их складываем в массив и суммируем)


public static void Main()
    {
        int source = 78654433;
 
        char[] sourceChars = source.ToString().ToCharArray();
 
        List<int> nums = new List<int>();
 
        foreach (char s in sourceChars)
        {
            nums.Add(Convert.ToInt32(s.ToString()));
        }
 
        int result = nums.Sum();
 
        Console.WriteLine(result.ToString());
 
        Console.ReadKey();
    }

вторник, 24 апреля 2012 г.

Повторяющаяся цифра

Программа показывает цифру из введённой стркоки, которая появлялась чаще.


int[] mas = new int[10];
            string s = Console.ReadLine();
            for (int i = 0; i < s.Length; i++)
            {
                if (s[i] >= '0' & s[i] <= '9')
                {
                    int n = Int32.Parse(s[i].ToString());
                    mas[n]++;
                }
            }
            int max = 0;
            int no = 0;
            for (int i = 0; i < 10; i++)
                if (mas[i] > max)
                {
                    no = i;
                    max = mas[i];
                }
            Console.WriteLine("Макс часто встречается: " + no);
            Console.ReadKey();

Пояснение к строкам
int n = Int32.Parse(s[i].ToString());
mas[n]++;

в N ложится число
В массиве с индексом N увеличивается значение на 1

Вот как - то так! 

воскресенье, 22 апреля 2012 г.

Регулярные выражения в C# часть 3

Проверка имени файла и его расширение

^(([A-Za-z]:)|(\\{2}\w+)\$?)(\\(\w[\w].*))+  
    (.psd|.png|.tif|.bmp|.gif|.jpg|.jpeg)$  


^(([A-Za-z]:)|(\\{2}\w+)\$?)(.*)+  
    (.psd|.png|.tif|.bmp|.gif|.jpg|.jpeg)$ 

Проверка url

^(http|https)\://[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}  
    (:[a-zA-Z0-9]*)?/?([a-zA-Z0-9\-\._\?\,\'/\\\+&%\$#\=~])*$  

или

http(s)?://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?  


Проверка емэйла



[.\\-_a-z0-9]+@([a-z0-9][\\-a-z0-9]+\\.)+[a-z]{2,6}
или
^['\\w_-]+(\\.['\\w_-]+)*@['\\w_-]+(\\.['\\w_-]+)*\\.[a-zA-Z]{2,6}$  
или
\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*


Регулярные выражения в C# часть 2

Продолжение темы. Пара дополнений + пара примеров.

Классы пространства имен System.Text.RegularExpressions

Capture - Представляет результаты из отдельной записи части выраже-
ния. Capture представляет одну подстроку для отдельной успешной записи.

CaptureCollection - Представляет последовательность подстрок записи.

CaptureCollection возвращает набор записей, сделанных одной группой записи.

Group - Group представляет результаты отдельной группы записи.
Группа записи может записать ноль, одну или более строк в одно совпадение из-за кванторов, таким образом Group предоставляет коллекцию объектов Capture.

GroupCollection - Представляет коллекцию групп записи. GroupCollection возвращает набор групп записи в одном совпадении.

Match - Представляет результаты из отдельного совпадения регулярного выражения.

MatchCollection - Представляет набор успешных совпадений, обнаруженных путем итеративного применения шаблона регулярного выражения к входной строке.

Regex - Представляет постоянное регулярное выражение.

RegexCompilationInfo - Представляет сведения о регулярном выражении, используемые для компиляции регулярного выражения в отдельную сборку.

RegexRunner - Класс RegexRunner является базовым классом для скомпилированных регулярных выражений.

RegexRunnerFactory - Создает класс RegexRunner для скомпилированного регулярного выражения.


Регулярные выражения в C# часть 1

Регулярные выражения предоставляют мощный, гибкий и эффективный метод обработки текста. Обширные возможности сопоставления шаблонов, предоставляемые регулярными выражениями, позволяют быстро анализировать большие объемы текста, отыскивая в них определенные символьные шаблоны, проверять текст на соответствие определенным заранее шаблонам (например, формату адреса электронной почты), извлекать, изменять, заменять или удалять подстроки текста, а также добавлять извлеченные строки в коллекцию для формирования отчетов.
Ну это выписка с http://msdn.microsoft.com/ru-ru/library/hs600312.aspx.
Цель данного поста - записать для себя памятку по регулярным выражениям в C#. Постараться найти и записать примеры реализации регулярных выражений + объяснение, что они делают.

четверг, 19 апреля 2012 г.

Шаблон проектирования

На одном сайте нашёл вот такой интересный проект. На примере Макдональдса показывается как нужно конструировать программу.
На таких примерах и стараюсь нацчиться программировать)))
Цитата с того сайта.
А теперь, чтобы лучше понять суть паттерна Builder, рассмотрим практический пример, в котором вы будете собирать объект HappyMeal — знаменитый детский набор, предлагаемый в сети закусочных McDonald’s. В первом случае вы соберете бюджетный вариант HappyMeal (маленькая порция пепси-колы, гамбургер, картошка и игрушка), а во втором — BigHappyMeal (гамбургер вы замените на бигмак и увеличите порцию напитка).
И сам код программы:

class HappyMeal
 
  {
 
    // содержит информацию о  составе HappyMeal
 
    ArrayList parts = new ArrayList();
 
    // Добавляете информацию  о новой составной части
 
    public void Add(string part)
 
    {
 
      parts.Add(part);
 
    }
 
    // Выводите информацию о  всем наборе
 
    public void Show()
 
    {
 
      Console.WriteLine(" Happy Meal Parts ——-");
 
      foreach (string part in parts)
 
      Console.WriteLine (part);
 
    }
 
  }