Список форумов BOSSForum.RU - Форум. БОСС-Кадровик
Независимый форум, посвященный системе БОСС-Кадровик
и всему, что с ней связано
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

Загрузка данных из Excel

 
Начать новую тему   Ответить на тему    Список форумов BOSSForum.RU - Форум. БОСС-Кадровик -> X-язык
Предыдущая тема :: Следующая тема  
Автор Сообщение
sasa



Зарегистрирован: 29.10.2010
Сообщения: 4

СообщениеДобавлено: Пт Окт 29, 2010 14:41    Заголовок сообщения: Загрузка данных из Excel Ответить с цитатой

Подскажите как можно быстро загрузить данные из Excel, для дальнейшего использования в запросе.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
zhenya17



Зарегистрирован: 04.02.2009
Сообщения: 190
Откуда: Кемерово

СообщениеДобавлено: Вт Ноя 23, 2010 19:49    Заголовок сообщения: Ответить с цитатой

Можно загрузить данные в таблицу MSSQL. В MS Enterprise Manager есть функция Import, которая поддерживает импорт в таблицы MSSQL практически из любого источника, в том числе, и из Excel. Так что грузите в таблицу и работайте с ней запросами.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
sasa



Зарегистрирован: 29.10.2010
Сообщения: 4

СообщениеДобавлено: Ср Ноя 24, 2010 15:07    Заголовок сообщения: Ответить с цитатой

Не подойдет.
Нужно написать отчет, который пользователь будет сам запускать.
отчет нужно запустить из БОССа.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
zhenya17



Зарегистрирован: 04.02.2009
Сообщения: 190
Откуда: Кемерово

СообщениеДобавлено: Ср Ноя 24, 2010 19:31    Заголовок сообщения: Ответить с цитатой

Тогда непонятна задача Smile
Что нужно сделать? Чтобы в БОССе была кнопка, по которой бы шло обращение к некоторому Excel-файлу и данные из него нужно загружать в БОСС€ Опишите поподробнее задачу.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
rebel25
Большой шоколадный орден
Большой шоколадный орден


Зарегистрирован: 06.10.2008
Сообщения: 578
Откуда: Москва

СообщениеДобавлено: Пт Ноя 26, 2010 19:37    Заголовок сообщения: Ответить с цитатой

Вот программа, которая заполняет прямые начисления из файла excel. На её основе можно создать программу для закачки чего угодно.
=============================================
-- Зачитка начинается со второй строки файла, струкрура таблицы должна быть "таб №", "ФИО полностью", "Сумма"
-- данные читаются до первого пустого значения в полях "таб №" или "ФИО полностью"
-- Лист Excel должен называться Лист1, имя файла должно быть без пробелов.
-- Необходимо избавиться от скрытых столбцов.
-- Не закачиваются: Уволенные ранее месяца закачки, Работающие одновременно в двух местах с одним табельным номером
-- Не совпавшие по таб. номеру и ФИО
-- Табельный номер д б числом!!!

-- Проверяем откуда запущена процедура
ALIAS :arm_tabel := @@xutil(arm);
If 'arm_tabel' <> 'zrp_menu' then error Запускать программу можно только в модуле Расчет Зарплаты!;


Let :file_name := 'C:\' + '*.xls';
ALIAS :file_name := @@xFile(dlgopen, file_name);

Let (
str := 2; --- с какой строки
er_ = 100;
sum_dob := 0;
dob_ := 0;
sum_prop := 0;
prop_ := 0;
);
if 'file_name' = '' then (
FREE zac, *;
ERROR[\3\7Файл импорта не найден!!!];
);

STABLE @DL
Select 'file_name', 120, month(getdate())-1, year(getdate()),convert(datetime,'@@tyear-@@tmonth-01');
alias _dlgresource={
(0,0,400,350,0);
E,(20,30,112,16,0), 'Путь к файлу',(20,46,352,20,0x10),1;
E,(20,70,112,16,0), 'Вид оплаты',(20,86,352,20,0x4),2,{select code_pay, user_code_pay from typ_Pay where code_pay<500
order by code_pay},0,2,1;
E,(40,120,60,20,0), 'За месяц ',(100,120,60,20,0),3;
E,(250,120,60,20,0),'За год ',(310,120,60,20,0),4;
E,(20,150,150,20,0),'Уволенные после:',(200,150,70,20, 0x100),5;

T,(20,180,350,120,0x0),"
Струкрура таблицы д/б "таб №", "ФИО полностью", "Сумма"
Данные должны начинаться со второй строки (в первой шапка)
Лист Excel должен называться Лист1. Имя файла д/б без пробелов.
Необходимо избавиться от скрытых столбцов и формул.
Таб. номер д/б числом (без зеленого треугольничка в углу)
Данные закачиваются до первой пустой строки
Не закачиваются:
- не совпавшие по таб. номеру или ФИО
- работающие с одинаковым таб. номером
- уволенные ранее месяца закачки
";
};
DIALOG @DL,0x0801, '~Закачка в @@tmonth месяц @@tyear года';

IF @DL:2 = '' then (FREE zac,*; DESTROY @DL; ERROR[\3Не указан вид оплаты];);
IF @DL:3 < 1 OR @DL:3 > 12 then (FREE zac,*; DESTROY @DL; ERROR[\3Неверно указан месяц];);
IF @DL:4 < 2008 OR @DL:4 > 2099 then (FREE zac,*; DESTROY @DL; ERROR[\3Неверно указан год];);

LET path_ = @DL:1;
LET vo_ = @DL:2;
Let pm_ = @DL:3;
LET py_ = @DL:4;
let du_ = @DL:5;
DESTROY @DL;

IF @@xFile(exists file_name) = 0 THEN (
return \3\7Не найден файл для загрузки!!!;
FREE path_, *;
error;
);
SELECT object_id('tempdb..#import_PR') INTO :id_;
IF id_ != 0 THEN DROP TABLE #import_PR;
FREE id_;
CREATE TABLE #import_PR (
Num_Tab int NULL,
Name varchar (100) NULL,
summ float NULL,
reason varchar(150) NULL,
pId int NULL
);
execute{
BEGIN TRANSACTION tran1;
vb
{
Dim xlApp, curSH
Set xlApp = GetObject ("","Excel.Application")
xlApp.visible = 0
xlApp.WindowState = 2

};
ProcLocal vb.Open_Doc {(path);
xlApp.Workbooks.Open (path)
xlApp.ActiveWorkbook.Worksheets("Лист1").Activate
xlApp.WindowState = 2
};
ProcLocal vb.Close_Doc {();
xlApp.Workbooks.Close
xlApp.Quit
};
ProcLocal vb.Get_Cell {(n_cell var n_tab, fio, summ, er);
DIM er
er = 100

n_tab = xlApp.ActiveWorkbook.ActiveSheet.cells(n_cell, 1).value
if StrComp(Trim(n_tab), "", 1) < 1 or isempty(n_tab) then er = -100
fio = xlApp.ActiveWorkbook.ActiveSheet.cells(n_cell, 2).value
if StrComp(Trim(fio), "", 1) < 1 or isempty(fio) then er = -100
summ = xlApp.ActiveWorkbook.ActiveSheet.cells(n_cell, 3).value };

vb.Open_Doc(file_name);
CON .. Идет Загрузка;

WHILE 1=1 THEN {
vb.Get_Cell(str var :n_tab_, :fio_, :summ_, :er_);
IF (er_ < 0) THEN GOTO _end;
CON ... fio_[''];

SELECT count(*) INTO :cnt_ FROM PEOPLE P , Card C
WHERE P.Auto_Card = C.Auto_Card
AND C.Name + ' ' + Name_i + ' ' + Name_o = fio_[''] AND P.id_firm = @@id_firm
AND CAST(P.Num_Tab as int) = n_tab_[']
AND P.out_date >= du_[''] --'@@4-@@5-01'
;
--return cnt_, n_tab_, fio_, summ_, er_;
IF cnt_ = 1 THEN {

SELECT ISNULL(P.pId,0) INTO :pid_ FROM PEOPLE P , Card C
WHERE P.Auto_Card = C.Auto_Card
AND C.Name + ' ' + Name_i + ' ' + Name_o = fio_[''] AND P.id_firm = @@id_firm
AND P.out_date >= du_[''] --'@@4-@@5-01'
AND CAST(P.Num_Tab as int) = n_tab_['];

INSERT INTO tabel (
pId, Code_pay, D_FROM, D_TO, cmonth, mdate, uname,
tMonth, tYear, [Percent], summa
)
SELECT pid_, vo_, '1900-01-01', '1900-01-01', @@4*12+@@5, GetDate(), suser_sname(),
pm_, py_, 0, summ_
FROM z_types;
LET dob_ += 1;

let sum_dob := sum_dob + summ_;
} ELSE {
SELECT ISNULL(P.pId,0) INTO :pid_ FROM PEOPLE P , Card C
WHERE P.Auto_Card = C.Auto_Card
AND C.Name + ' ' + Name_i + ' ' + Name_o = fio_[''] AND P.id_firm = @@id_firm
AND P.out_date < du_[''] --'@@4-@@5-01'
AND CAST(P.Num_Tab as int) = n_tab_['];
IF pid_ > 0 THEN (
INSERT INTO #import_PR (num_tab, Name, reason, summ)
VALUES (n_tab_['], fio_[''], 'Уволен ранее месяца закачки', summ_);
);
IF cnt_ = 0 and pid_ = 0 THEN (
INSERT INTO #import_PR (num_tab, Name, reason, summ)
VALUES (n_tab_['], fio_[''], 'Не правильное ФИО или № ', summ_);
);
IF cnt_ > 1 THEN (
INSERT INTO #import_PR (num_tab, Name, reason, summ)
VALUES (n_tab_['], fio_[''], 'Более 1 раза в БД ', summ_);
);
Let sum_prop := sum_prop + summ_;
Let prop_ += 1;
};
LET str += 1;
FREE n_tab_, fio_, summ_;
LET er_ = 100;
};
_end:
CON;

vb.Close_Doc();
vb.free;

SELECT left(getdate(),19) INTO date_;

PREVIEW Protokol;
Preview([\b\tabПротокол загрузки вида оплат vo_ \b0]);
Preview([
Дата: date_

Принятая сумма: sum_dob[%9.2f] Приято строк: dob_
Пропущенная сумма: sum_prop[%9.2f] Пропущено строк: prop_
]);
Preview([
\b\tabОшибки при загрузке:\b0
+-----+-----------------------------------+---------------------------+---------+
|Таб.№| Фамилия И.О. | Причина | Сумма |
+-----+-----------------------------------+---------------------------+---------+]);

SCAN @SH_P SELECT Num_tab, Name, Reason, summ FROM #import_PR ORDER BY Name,Reason
Execute {
Preview([|@SH_P:1[%-5s]|@SH_P:2[%-35s]|@SH_P:3[%-27s]|@SH_P:4[%9.2f]|]);
};
Preview([+-----+-----------------------------------+---------------------------+---------+]);
SHOW;
PREVIEW;

MSG \3Завершить загрузку?\7\7\7;
IF _result != 12 THEN GOTO END__;
COMMIT tran1;
return \3Загрузка завершена;

}exception {
rollback tran1;
};

END__:
FREE path_, *;
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
sasa



Зарегистрирован: 29.10.2010
Сообщения: 4

СообщениеДобавлено: Вт Дек 28, 2010 17:15    Заголовок сообщения: Ответить с цитатой

rebel25 спасибо за ответ, похожих вариантов закачки у меня много.
Но при такой организации загрузки остается проблема по скорости.
Опишу цель задачи - нужно открыть несколько excel файлов, сравнить между собой эти файлы (например на наличие одинаковых записей в разных файлах), сделать определенные сравнения с базой в БОССе, и выдать список записей которые не прошли проверку.
проблема следующая, файл с 50 000 строчек с 10 полями открывается порядка 30 - 60 мин., таких файлов за год накапливает пока до 10, и что бы их сотруднику закачать для дальнейшей проверки нужно потратить весь день.
нужен запрос типа :
SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0',
'Excel 8.0;Database==d:\book1.xls', Лист1$) – зачитывает данные за 2 сек.
данный запрос работает, только если зайти на сервер под sql паролем и иметь соответствующие права.
или очень интересный код написан для сохранения запроса в excel http://bossforum.ru/forum/viewtopic.php?t=176, может есть что то подобное для считывание данных с excel файла.

Необходимо увеличить скорость работы программы.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
rebel25
Большой шоколадный орден
Большой шоколадный орден


Зарегистрирован: 06.10.2008
Сообщения: 578
Откуда: Москва

СообщениеДобавлено: Вт Дек 28, 2010 18:03    Заголовок сообщения: Ответить с цитатой

Предлагаю использовать dtsx и вызывать его из произвольных отчетов любым пользователем. Это работает быстро и одновременно по нескольким таблицам. Дальше в отчете же можно сравнивать, выводить результат и т д
....................................
--кладем в таблицу путь к файлу, указанный в диалоге
delete TABEL_PATH where uname = suser_sname();
insert TABEL_PATH(path) select '_i_path';
--загружаем дтс пакетом
local _s;
local _su;
select suser_sname() into :_su;

if suser_sname() like 'domen\%' then
{
Let _s := 'dtsrun.exe /S server_ip /E /N dtsx_name '; --win login
}
else --sql login
{
Let _s := 'dtsrun.exe /S server_ip /U _su /P @@xutil(pwd) /N dtsx_name_SQL /A s1:8=@@xutil(pwd) /A s2:8=_su ';
};
ERROROFF;
system _s, wait;
ERRORON;
..........................................
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов BOSSForum.RU - Форум. БОСС-Кадровик -> X-язык Часовой пояс: GMT + 4
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Pоwerеd by рhpВB © 2001, 2005 рhpВB Grouр
Русская поддержка phрВB
Rambler's Top100 Рейтинг@Mail.ru Список форумов BOSSForum.RU