Личная страничка 

Facebook Twitter Gplus RSS
Home Творчество Разработки Выгрузка данных в MS-Project
formats

Выгрузка данных в MS-Project

У многих есть вариации на тему учета рабочего времени (своего или своих подчиненных) в различных конфигурациях. И почти ничто не предоставляет таких возможностей управления задачами внутри проекта, как MS-Project. Так давайте совместим все это.

И не статья это совсем, а просто маленькое описание недавнего опыта, которым захотелось поделиться.

Пошаговой инструкции со скриншотами тоже не ждите. Думаю, что разберетесь и так 🙂

Запись данных: 

  • 1. Создаем в MS-SQL базу со следующей структурой (можно также все это сделать и в MS-Excel, обозвав листы по именам таблиц и задав заголовки колонок, соответсвенно именам полей):

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Таблица_назначений]’) AND type in (N’U’))
BEGIN
CREATE TABLE [dbo].[Таблица_назначений](
 [Название задачи] [nvarchar](100) NOT NULL,
 [Название ресурса] [nvarchar](100) NOT NULL,
 [% завершения по трудозатратам] [int] NOT NULL,
 [Трудозатраты] [nvarchar](50) NOT NULL,
 [Единицы] [nvarchar](50) NULL,
 [UIDЗадачи] [nchar](36) NOT NULL,
 [UIDРесурса] [nchar](36) NOT NULL
) ON [PRIMARY]
END
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Таблица_ресурсов]’) AND type in (N’U’))
BEGIN
CREATE TABLE [dbo].[Таблица_ресурсов](
 [Ид] [int] NOT NULL,
 [Название] [nvarchar](100) NOT NULL,
 [Краткое название] [nvarchar](30) NOT NULL,
 [Тип] [nvarchar](50) NULL,
 [Единицы измерения материалов] [nvarchar](50) NULL,
 [Группа] [nvarchar](50) NULL,
 [Адрес электронной почты] [nvarchar](50) NULL,
 [Учетная запись Windows] [nvarchar](50) NULL,
 [Макс единиц] [float] NOT NULL,
 [Стандартная ставка] [float] NOT NULL,
 [Затраты на использование] [float] NULL,
 [Заметки] [nvarchar](max) NULL,
 [UID] [nchar](36) NOT NULL,
 CONSTRAINT [PK_Таблица_ресурсов] PRIMARY KEY CLUSTERED
(
 [UID] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
END
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Таблица_задач]’) AND type in (N’U’))
BEGIN
CREATE TABLE [dbo].[Таблица_задач](
 [Ид] [int] NOT NULL,
 [Название] [nvarchar](100) NOT NULL,
 [Длительность] [nvarchar](50) NULL,
 [Начало] [datetime] NOT NULL,
 [Окончание] [datetime] NULL,
 [Предшественники] [int] NULL,
 [Уровень структуры] [int] NOT NULL,
 [Заметки] [nvarchar](max) NULL,
 [UID] [nchar](36) NOT NULL,
 CONSTRAINT [PK_Таблица_задач] PRIMARY KEY CLUSTERED
(
 [UID] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
END
GO

IF NOT EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[dbo].[Таблица_задач]’) AND name = N’IX_Таблица_задач’)
CREATE NONCLUSTERED INDEX [IX_Таблица_задач] ON [dbo].[Таблица_задач]
(
 [Ид] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[ВыполненныеЗадачи]’))
EXEC dbo.sp_executesql @statement = N’CREATE VIEW [dbo].[ВыполненныеЗадачи]
AS
SELECT     TOP (100) PERCENT dbo.Таблица_назначений.[Название задачи], dbo.Таблица_назначений.[Название ресурса],
                      dbo.Таблица_задач.ДатаВыполнено, CAST(dbo.Таблица_назначений.Трудозатраты AS numeric(10, 2)) AS Трудозатраты,
                      dbo.Таблица_задач.УчтеноВРасчетах, dbo.Таблица_задач.ДатаОплаты
FROM         dbo.Таблица_назначений INNER JOIN
                      dbo.Таблица_задач ON dbo.Таблица_назначений.[Название задачи] = dbo.Таблица_задач.Название
WHERE     (dbo.Таблица_назначений.[% завершения по трудозатратам] = 1)
ORDER BY dbo.Таблица_назначений.[Название задачи]


GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[InsertAsg]’) AND type in (N’P’, N’PC’))
BEGIN
EXEC dbo.sp_executesql @statement = N’

  • 2. В 1С пишем примерно следующий код (для Excel переписать :-)):

// попытка найти настройку коннекта к базе аудита и подключения к ней
//
// Возвращаемое значение:
//   Булево   — результат успешности подключения
//
Функция Инициализация(ИмяСервера, Пользователь, Пароль, ИмяБазы) Экспорт
 
 Соединение = Новый COMОбъект(«ADODB.Connection»);
 
 СтрокаКоннекта = «driver={SQL Server};server=»+ИмяСервера+»;uid=»+Пользователь+»;pwd=»+Пароль+»;Database=»+ИмяБазы;
 Соединение.ConnectionTimeOut=20;
 Соединение.CursorLocation=3;
 Соединение.CommandTimeout = 16000;
 Попытка                                            
  Соединение.Open(СтрокаКоннекта);
 Исключение
  #Если Клиент Тогда
      Сообщить(«Невозможно установить соединение с базой ТЗ!», СтатусСообщения.Важное);
  #КонецЕсли 
  
  Соединение  = Неопределено;
  ИмяБазы   = «»;
  ИмяСервера  = «»;
  Пользователь = «»;
  Пароль   = «»;
  Возврат Ложь;
 КонецПопытки;
 
 Возврат Истина;
КонецФункции

// Запись в аудит действий пользователя
//
// Параметры
//  Ссылка  — Ссылка на документ
// Возвращаемое значение:
//   Булево   — результат успешности записи
//
Функция ЗаписатьТЗ(Ссылка, СтрокаСообщений) Экспорт
  
 ВремяВыполнения = ?(Ссылка.Выполнено, Ссылка.ВремяЧасыЗатрачено, Ссылка.ВремяЧасыПланируемое);
 ДатаНачала = Ссылка.ДатаНачалаРаботПлан;
 Если НЕ ЗначениеЗаполнено(ДатаНачала) Тогда
  Возврат Ложь;
 КонецЕсли; 
 
 Соединение.Execute(«exec InsertJob ‘» + СокрЛП(Ссылка.Номер) + «:» + СокрЛП(Ссылка.Наименование) + «‘, ‘»
           + СокрЛП(ВремяВыполнения) + «ч’, ‘»
           + Формат(ДатаНачала, «ДФ=’yyyyMMdd HH:mm:ss'») + «‘, «
           + «null, null, 1, ‘»
           + СтрокаСообщений + «‘, ‘»
           + СокрЛП(Ссылка.УникальныйИдентификатор()) + «‘»;
           
 Соединение.Execute(«exec InsertRes ‘» + СокрЛП(Ссылка.Исполнитель) + «‘, », ‘Трудовой’, null, null, ‘»
           + Ссылка.Исполнитель.Email.АдресЭлектроннойПочты + «‘, null, 1, 0, 0, », ‘»
           + СокрЛП(Ссылка.Исполнитель.УникальныйИдентификатор()) + «‘»);
 
 Соединение.Execute(«exec InsertAsg ‘» + СокрЛП(Ссылка.Номер) + «:» + СокрЛП(Ссылка.Наименование) + «‘, ‘»
           + СокрЛП(Ссылка.Исполнитель) + «‘, » +
           + ?(Ссылка.Выполнено, «100», «0») + «, «
           + СтрЗаменить(СокрЛП(ВремяВыполнения), «,», «.») + «, 1, ‘»
           + СокрЛП(Ссылка.УникальныйИдентификатор()) + «‘, ‘»
           + СокрЛП(Исполнитель.УникальныйИдентификатор()) + «‘»);
  
 #КонецЕсли
КонецФункции

Чтение

1. В MS-Project при открытии файла выбираем источник ODBC (MS-SQL или Excel)

2. При первом чтении создаем новую схему. При последующих можно использовать существующую.

Схема сгенерится в принципе сама, т.к. имена таблиц и полей полностью соответствуют проджектовским. Надо только нажимать все время «далее»

Вот, собственно, и все.

Удачи.

 З.Ы. Структуру документа тоже не приводил, можно привести к любой своей.

 
© Вахрин Андрей Викторович
credit