Archive

Archive for March 5th, 2010

.NET Framework – Application Development Foundation [Лекция 2]

March 5th, 2010 No comments

1. Лекция. Работа с типами данных в .NET Framework 3.5. 1.1. Необходимость введения типов. Ссылочные и значимые типы. 1.2. Числовые типы и типы с плавающей точкой. Строковые типы. Перечисления. 1.3. Массивы. 1.4. Работа с составными типами. Структуры. 1.5. Подведение итогов. 2. Практикум. Подробнее о мероприятии

Categories: Uncategorized Tags:

Работа на двух экранах – повышение производительности или рассредоточение внимания?

March 5th, 2010 No comments

Недавно на работе мне достался 17-дюймовый монитор, который стоял на моём рабочем столе без дела. Я решил попробовать и подключить его к ноутбуку, и поскольку как основной экран он был маловат, то естественным образом я стал использовать его как расширение рабочего стола. Для начала второй экран показывал красивую фотографию, т.е. выполнял роль большой фоторамки, но постепенно мне удалось адаптировать стиль работы к двум экранам, примерно следующим образом. В качестве основного экрана я использую ноутбук – на нём открыто то, с чем я работаю больше всего – Outlook, веб-браузер (IE8), проводник и иногда Far Commander (да-да, я из того поколения людей, которые застали “командира нортона”, и с тех пор предпочитают пользоваться подобными инструментами для файл-менеджмента). Второй экран повёрнут слегка боком (см. картинку ниже), и он выполняет в первую очередь коммуникационно-вдохновляющую функцию: на нём открыт твиттер (Seesmic for Windows), гаджет с фотографиями, Office Communicator (который после внедрения у нас Enterprise Voice выполняет и функцию телефона – отсюда и почти всегда надетые наушники с микрофоном) и Windows Live Messenger. Помимо коммуникаций, второй экран используется для концентрации локального фокуса внимания. Например, если мне надо сосредоточиться на написании одного письма – оно перетаскивается на второй экран (закрывая собою твиттер). Теперь, даже если меня отвлекают на какие-то срочные дела и я начинаю открывать много окон и папок, всегла легко вернуться к “главному” делу – глаз сам тянется к твиттеру, и находит соответствующее окно. А когда главное дело доделывается и окно закрывается – сразу хочется написать об этом в открывшемся твиттере! Такое неравнозначное использование экранов отчасти вызвано тем, что экраны разного размера, и глаз испытывает некоторый дискомфорт при переходе от одного к другому. В случае, когда используются одинаковые мониторы, можно рассматривать расширенный десктоп просто как большой рабочий стол – в этом случае наверное может сложиться другой стиль работы. Однако поскольку для всех владельцев ноутбуков + внешних мониторов такая ситуация с неравнозначностью экранов будет нормой, мне показалось полезным описать тут свой опыт по эффективному использованию такой конфигурации. Оказывается, не я один в Майкрософт использую такую конфигурацию – вот и Яна Фролова, моя коллега, тоже! А другие используют просто монитор в качестве основного, не используя ноутбучную панель вообще. Друзья, а вы имели опыт работы в многомониторной конфигурации? Поделитесь опытом, как вы используете в этом случае рабочее пространство! Пользователи ноутбуков – как вы думаете, внешний монитор помогает работать более эффективно, или скорее рассеивает внимание? А есть ли кто-то, кто работал с тремя мониторами? А с четырьмя? Буду признателен за ваш опыт – уверен, нам всем есть чему поучиться друг у друга!

Categories: Uncategorized Tags:

Создаем гаджет для Windows 7

March 5th, 2010 No comments

Гаджет – это оригинальное, нестандартное техническое приспособление. Сегодня поговорим, как создать гаджет для Windows 7. В качестве примера реализуем гаджет, который будет отображать последние записи из блогов нашего сообщества. Итак, приступим. Минимальный гаджет должен состоять из двух файлов – gadget.xml (мета информация) и main.html (собственно, гаджет). gadget.xml Вся мета информация о нашем гаджете должна храниться в файле с названием gadget.xml: <?xml version="1.0" encoding="utf-8" ?>
<gadget>
<name>Microsoft User Group Винница</name>
<namespace>msug.vinnitsya.gadget</namespace>
<version>1.0.1</version>
<author name="Microsoft User Group Винница">
<info url="http://msug.vn.ua/" text="Официальный сайт Microsoft User Group Винница" />
<logo src="logo.png" />
</author>
<copyright>&#169; Microsoft User Group Винница</copyright>
<description>Последние сообщения из блогов сайта Microsoft User Group Винница.</description>
<icons>
<icon height="64" width="64" src="logo.png" />
</icons>
<hosts>
<host name="sidebar">
<base type="HTML" apiVersion="1.0.0" src="main.html" />
<permissions>Full</permissions>
<platform minPlatformVersion="1.0" />
<defaultImage src="icon.gif" />
</host>
</hosts>
</gadget> Читать полностью

Categories: Uncategorized Tags:

WCF: немного об интероперабильности

March 5th, 2010 No comments

WCF & WSE 2.0 Организация взаимодействия WCF и сервиса, поддерживающего стандарт WSE 2.0. Ответ простой: использовать WSE 3.0, либо настроить custombinding в WCF. Почему? WCF поддерживает только WS-Security 1.1. WSE 3.0 реализует WS-Security 1.0 и WS-Security 1.1, а WSE 2.0 только WS-Security 1.0. WCF & Java Организация взаимодействия WCF и Java. Ответ: убедитесь, что Action Header (приходящее от Java) не является пустым, либо установите в WCF атрибут ServiceBehavior – AddressFilterMode.

Categories: Uncategorized Tags:

C# Zen Coding уже на F#

March 5th, 2010 No comments

В моем предыдущем посте, где я описал идею CSharpZen, я пообещал две вещи – дописать расширение для Visual Studio 2010, а также записать вебкаст того, как это можно использовать. Но пока я дописывал код для трансформатора, мне снова показалось что код может стать более понятным если его переписать на F#. И понеслось… Почему опять F#? Я [...]

Categories: Uncategorized Tags:

Расширяемость Reporting Services 2008 R2: Введение

March 5th, 2010 No comments

Опубликовал новый вебкаст по интересной теме: Расширяемость Reporting Services 2008 R2: Введение В докладе рассматривается архитектура Reporting Services 2008 R2 с точки зрения расширяемости. Приведены модули расширения, встроенные по умолчанию, а также рассмотрены примеры возможных расширений. Приведены ссылки на ресурсы сторонних производителей расширений для RS. В планах сделать по докладу по каждому пункту, так что принимаются заявки :) , первым делом собираюсь рассмотреть RDC расширение

Categories: Uncategorized Tags:

Прямой доступ к базе данных 1С7.7

March 5th, 2010 No comments

Большая часть российских предприятий для автоматизации бухгалтерского учета и экономических расчетов использует программу 1С. Эта программа предлагает вполне достаточный базовый функционал, но никогда не сможет удовлетворить ВСЕ наши пожелания. Поэтому, если в программе, написанной на C#, научиться напрямую читать данные из баз 1С, то весь недостающий функционал 1С вы сможете сами реализовать в своих программах. В предыдущих трех статьях мы создали 3 класса: MyConnect – позволяющий создать подключение к базе данных (метод OleDbConn(string DataPath)) и скопировать dbf–файл в объект DataTable (метод CopyDataTable(OleDbConnection OleDbConn, string myDoc). См. Microsoft OLE DB Provider for Visual FoxPro
Browse – выводящий на экран объект DataTable в виде таблицы (метод Browse(DataTable tbl)). См. DataGridView
Graph – строящий график из двух заданных полей объекта DataTable (метод Graph(DataTable tblgraph, string X, string Y)). См. Microsoft Chart Controls

Создаем библиотеку классов

Если вы работаете с Microsoft Visual Studio, выберите шаблон – "Пустой проект", укажите название проекта – "Tools" и добавьте в него "Файл с текстом программы". Кроме того, в свойствах проекта поменяйте тип выходных данных на "Библиотека классов". Не забудьте в обозреватель решений добавить ссылки на:

System
System.Data
System.Windows.Forms
System.XML
System.Drawing
System.Windows.Forms.DataVisualization

Все классы и методы я оставил без изменений, кроме метода CopyDataTable(OleDbConnection OleDbConn, string myDoc). В новой версии он стал более универсальным, так как теперь ему передается не название dbf–файла, а сторока SQL – запроса. Измененные строки выделены более ярким цветом:

using System;
using System.Data;
using System.Windows.Forms;
using System.Drawing;
using System.Xml;
using System.Data.OleDb;
using System.Windows.Forms.DataVisualization.Charting;

namespace tools
{
    public class MyConnect
    {
         const string DataProvider = @"vfpoledb.1"; // Провайдер

         // Создать OleDbConnection
         public OleDbConnection OleDbConn(string DataPath)
         {
             // Для того, чтобы создать OLE – соединение с локальной базой данных,
             // необходимо указать 2 параметра – провайдера и путь к базе данных.
             // Для наглядности я воспользовался построителем строк подключения –
             // OleDbConnectionStringBuilder.
             OleDbConnectionStringBuilder bldr = new OleDbConnectionStringBuilder();
             bldr.DataSource = DataPath; // Указываем путь
             bldr.Provider = DataProvider; // Указываем провайдера
             // Создаем подключение к источнику данных
             OleDbConnection myConn = new OleDbConnection(bldr.ConnectionString);
             return myConn;
         }

         // Прочитать dbf-файл в DataTable
         public DataTable CopyDataTable(OleDbConnection OleDbConn, string mySQL)
         {
             // Класс, необходимый для задания оператора SQL и источника данных
             OleDbCommand cmd = new OleDbCommand();
             cmd.CommandText = @mySQL; // Задаем оператор SQL
             cmd.Connection = OleDbConn; // Задаем источник данных

             // Объект OleDbDataAdapter выполняет функцию моста между DataTable и источником данных.
             OleDbDataAdapter da = new OleDbDataAdapter();
             da.SelectCommand = cmd;

             DataTable tbl = new DataTable();
             // Обеспечивает он такой мост с помощью метода Fill.
             da.Fill(tbl);
             return tbl;
         }
    }

    public class Browse : Form
    {
         internal protected DataGridView dataGridView;

         public Browse(DataTable tbl)
         {
             // Browse форма – свойства
             Text = "Viewer2";
             // Задаем размер клиентской области формы
             ClientSize = new Size(700, 400);
             // Располагаем форму в центре экрана
             StartPosition = FormStartPosition.CenterScreen;

             // Browse форма – методы
             Resize += new EventHandler(BrowseResize);

             // dataGridView – свойства
             dataGridView = new DataGridView();
             dataGridView.Parent = this;
             // Задаем размер таблицы относительно клиентской области формы
             dataGridView.Height = ClientSize.Height – 20;
             dataGridView.Width = ClientSize.Width – 20;
             // Задаем положение таблицы относительно левого верхнего угла формы
             dataGridView.Left = 10;
             dataGridView.Top = 10;

             // указываем источник данных
             dataGridView.DataSource = tbl;

             // Подбираем в цикле ширину всех колонок
             foreach (DataColumn col in tbl.Columns)
                 dataGridView.Columns[col.Caption].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
         }

         // Реакция формы на изменение размера
         void BrowseResize(object sender, EventArgs e)
         {
             // Подгоняем размер таблицы под клиентскую область формы
             dataGridView.Height = ClientSize.Height – 20;
             dataGridView.Width = ClientSize.Width – 20;
         }
    }

    public class Graph : Form
    {
         public Graph(DataTable tblgraph, string X, string Y)
         {
             // Главная форма – свойства
             Text = "Graph1";
             ClientSize = new Size(700, 400);

             // MicrosoftChart – свойства
             Chart myChart = new Chart();
             myChart.Parent = this;
             myChart.Left = 10;
             myChart.Top = 10;
             myChart.Width = (ClientSize.Width – 20);
             myChart.Height = (ClientSize.Height – 20);
             myChart.DataSource = tblgraph;

             // Фон
             myChart.BackColor = Color.MistyRose;
             myChart.BackGradientStyle = GradientStyle.DiagonalLeft;

             // Оформление границ
             myChart.BorderSkin.SkinStyle = BorderSkinStyle.Sunken;
             myChart.BorderSkin.PageColor = this.BackColor;

             // Область в которой будет построен график
             ChartArea myChartArea = new ChartArea();
             myChartArea.Name = "myChartArea";
             myChart.ChartAreas.Add(myChartArea);

             // Линии сетки
             myChartArea.AxisX.MajorGrid.LineColor = SystemColors.ControlLight;
             myChartArea.AxisY.MajorGrid.LineColor = SystemColors.ControlLight;

             // График
             Series mySeries1 = new Series();
             mySeries1.ChartType = SeriesChartType.Spline;
             mySeries1.ChartArea = "myChartArea";
             mySeries1.XValueMember = X;
             mySeries1.YValueMembers = Y;
             myChart.Series.Add(mySeries1);
         }
    }
}

Постройте решение ("Build Solution") и проверьте в папке …\bin\Debug\ наличие файла Tools.dll. Библиотека готова, и мы можем приступить к работе с базой 1С7.7. Она существует в 2-х вариантах: локальная и SQL версии. Весь изложенный материал применим к обеим из них, разница лишь в методе подключения к базе данных. Например, для подключения к SQL базе можно вместо метода – OleDbConn(string DataPath) использовать следующий метод:

         public SqlConnection SqlConn(string DataPath)
         {
             SqlConnectionStringBuilder bldr = new SqlConnectionStringBuilder ();
             bldr.DataSource = @".\SQLEXPRESS";
             bldr.InitialCatalog = DataPath;
             bldr.IntegratedSecurity = true;
             bldr.ConnectTimeout = 30;
             bldr.UserInstance = true;
             SqlConnection myConn = new SqlConnection(bldr.ConnectionString);
             return myConn;
         }

В локальной версии база данных 1С7.7 состоит из совокупности файлов формата Dbase. Информация о назначении и структуре каждого файла указана в файле – 1Cv7.dd. Обычно он находится там же, где и база данных. Как это выглядит, разберем на примере документа – "Расходная накладная". Необходимую нам информацию я выделил более ярким цветом, мои пояснения – зеленым цветом:

Видно, что хранение информации организовано по канонам СУБД: Если у документа есть табличная часть, то она хранится в отдельном файле (dh294.dbf – заголовочная часть документа, dt294.dbf – табличная часть документа).
Вместо названий товаров и контрагентов в файле хранятся только коды, а сами названия – отдельно в справочниках.
Поэтому нам еще потребуется информация из трех справочников: Журналы (1sjourn.dbf) – только здесь хранятся номера и даты всех документов 1С,
Справочник контрагентов (sc133.dbf) – отсюда возьмем названия клиентов,
Справочник номенклатуры (sc156.dbf) – здесь названия всей номенклатуры товаров и услуг.

Всю необходимую информацию для написания SQL запроса к базе данных 1С7.7 мы собрали. Формируем документ "Расходная накладная":

SELECT _1sjourn.docno, _1sjourn.date, sc133.descr AS Client, "sc156.descr AS Good,
       dt294.sp284 AS Number, dt294.sp285 AS Price, dt294.sp286 AS Summa,
       dt294.sp287 AS NDS, dt294.sp290 AS Total
  FROM dh294
   INNER JOIN 1sjourn _1sjourn ON dh294.iddoc = _1sjourn.iddoc
   INNER JOIN sc133 ON dh294.sp277 = sc133.id
   INNER JOIN dt294 ON dh294.iddoc = dt294.iddoc
   INNER JOIN sc156 ON dt294.sp283 = sc156.id

Теперь перейдем к созданию исполняемой программы. Если вы работаете с Microsoft Visual Studio, выберите шаблон – "Пустой проект", укажите название проекта – "1С77" и добавьте в него "Файл с текстом программы". Кроме того, в свойствах проекта поменяйте тип выходных данных на "Приложение Windows".

Используем Browse для просмотра документов – "Расходная накладная"

В обозревателе решений указываем ссылки на:

System
System.Data
System.Windows.Forms
System.XML

И, кроме того, надо добавить ссылку на нашу библиотеку – Tools. Разница лишь в том, что в окне "Добавить ссылку" надо вместо вкладки ".NET" выбрать вкладку "Обзор" и найти Tools.dll. Ниже приведен листинг программы:

using System;
using System.Data;
using System.Data.OleDb;
using tools;

namespace _1C77
{
    public class SQL1C
    {
         // Документу из 1С приводим в соответствие SQL запрос
         public string SQL1C77(string NameDoc)
         {
             string StringSQL = "SELECT * FROM " + NameDoc;
             switch (NameDoc)
             {
                 case "РасходнаяНакладная":
                     StringSQL = "SELECT _1sjourn.docno, _1sjourn.date, sc133.descr AS Client, " +
                     "sc156.descr AS Good, dt294.sp284 AS Number, dt294.sp285 AS Price, " +
                     "dt294.sp286 AS Summa, dt294.sp287 AS NDS, dt294.sp290 AS Total FROM dh294 " +
                     "INNER JOIN 1sjourn _1sjourn ON dh294.iddoc = _1sjourn.iddoc " +
                     "INNER JOIN sc133 ON dh294.sp277 = sc133.id " +
                     "INNER JOIN dt294 ON dh294.iddoc = dt294.iddoc " +
                     "INNER JOIN sc156 ON dt294.sp283 = sc156.id";
                     break;
             }
             return StringSQL;
         }
    }

    class _1C77
     {
         public static void Main()
         {
             MyConnect mycon = new MyConnect();
             // Создаем соединение с базой данных
             OleDbConnection OleDbCon = mycon.OleDbConn(@"C:\Program Files\1Cv77\1SBDemo\");
             // Открываем его
             OleDbCon.Open();

             SQL1C mySQL1C = new SQL1C();
             // Выбираем SQL запрос для Расходной накладной
             string SQL1C1 = mySQL1C.SQL1C77("РасходнаяНакладная");
             // Указывая соединение с базой данных и строку SQL, получем объект DataTable
             DataTable Doc1C1 = mycon.CopyDataTable(OleDbCon, SQL1C1);

             // Создаем объект browse
             Browse browse = new Browse(Doc1C1);
             // и выводим его на экран
             browse.ShowDialog();

             // Закрываем соединение
             OleDbCon.Close();
         }
    }
}

Принцип, думаю понятен и теперь вы сами сможете организовать запрос к любому документу в базе 1С7.7. В заключение лишь хочу привести еще один пример, во-первых, использования созданной нами библиотеки (класс Graph), а, во-вторых, открытия другого документа 1С – "Платежного поручения":

Строим график, используя данные документов – "Платежное поручение"

using System;
using System.Data;
using System.Data.OleDb;
using tools;

namespace _1C77
{
    public class SQL1C
    {
         // Документу из 1С приводим в соответствие SQL запрос
         public string SQL1C77(string NameDoc)
         {
             string StringSQL = "SELECT * FROM " + NameDoc;
             switch (NameDoc)
             {
                 case "РасходнаяНакладная":
                     StringSQL = "SELECT _1sjourn.docno, _1sjourn.date, sc133.descr AS Client, " +
                     "sc156.descr AS Good, dt294.sp284 AS Number, dt294.sp285 AS Price, " +
                     "dt294.sp286 AS Summa, dt294.sp287 AS NDS, dt294.sp290 AS Total FROM dh294 " +
                     "INNER JOIN 1sjourn _1sjourn ON dh294.iddoc = _1sjourn.iddoc " +
                     "INNER JOIN sc133 ON dh294.sp277 = sc133.id " +
                     "INNER JOIN dt294 ON dh294.iddoc = dt294.iddoc " +
                     "INNER JOIN sc156 ON dt294.sp283 = sc156.id";
                     break;
                 case "ПлатежноеПоручение":
                     StringSQL = "SELECT _1sjourn.docno, _1sjourn.date, sc133.descr AS Client, " +
                     "dh12070.sp12059 AS Summa, dh12070.sp12061 AS NDS FROM dh12070 " +
                     "INNER JOIN 1sjourn _1sjourn ON dh12070.iddoc = _1sjourn.iddoc " +
                     "INNER JOIN sc133 ON dh12070.sp12058 = sc133.id";
                     break;
             }
             return StringSQL;
         }
    }

    class _1C77
    {
         public static void Main()
         {
             MyConnect mycon = new MyConnect();
             // Создаем соединение с базой данных
             OleDbConnection OleDbCon = mycon.OleDbConn(@"C:\Program Files\1Cv77\1SBDemo\");
             // Открываем его
             OleDbCon.Open();

             SQL1C mySQL1C = new SQL1C();
             // Выбираем SQL запрос для Платежного поручения
             string SQL1C2 = mySQL1C.SQL1C77("ПлатежноеПоручение");
             // Указывая соединение с базой данных и строку SQL, получем объект DataTable
             DataTable Doc1C2 = mycon.CopyDataTable(OleDbCon, SQL1C2);

             // Создаем объект graph
             Graph graph = new Graph(Doc1C2, "date", "summa");
             // и выводим его на экран
             graph.ShowDialog();

             // Закрываем соединение
             OleDbCon.Close();
         }
    }
}

В этой статье вы научились получать данные из базы данных 1С7.7, посмотрели их в DataGridView и построили на основе этих данных график. Для полного комплекта не хватает только еще научиться: сохранять данные на диск,

выводить их в отчет и на печать

В следующей статье разберем универсальный метод сохранения объекта DataTable в dbf-файл.

www.virtualexpert.ru

Categories: Uncategorized Tags:

Первая встреча Microsoft .NET User Group в Таганроге!

March 5th, 2010 No comments

Подробнее о мероприятии

Categories: Uncategorized Tags: