Независимый форум, посвященный системе БОСС-Кадровик и всему, что с ней связано
|
|
Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Dimich1978
Зарегистрирован: 18.05.2010 Сообщения: 69
|
Добавлено: Пт Июл 09, 2010 14:24 Заголовок сообщения: Помогите запихать запрос в excell |
|
|
был отчет , он выгружался в ворд, теперь надо переписать чтобы открывался в excell . Примерчик можно как вывести отчет в excell.
Просто пробую как в ворд, что-то нифига не получается, выдает ошибку невозможно получить CLSID Active X сервера. выложите пример пож-та. |
|
Вернуться к началу |
|
 |
Dimich1978
Зарегистрирован: 18.05.2010 Сообщения: 69
|
Добавлено: Пн Июл 12, 2010 16:56 Заголовок сообщения: |
|
|
ну и ненужно ничего выкладывать. подрубился через ADO все вывел, можно и не через него, но это уже вторая серия. |
|
Вернуться к началу |
|
 |
rebel25 Большой шоколадный орден

Зарегистрирован: 06.10.2008 Сообщения: 580 Откуда: Москва
|
Добавлено: Пн Авг 16, 2010 14:22 Заголовок сообщения: |
|
|
Если вопрос актуален напишите куда слать программу. Она запускается из произвольных отчетов и выводит селект в эксель без использования шаблона. При желании можно дорисовать шапку и др. |
|
Вернуться к началу |
|
 |
Vitaly Большой шоколадный орден

Зарегистрирован: 29.07.2008 Сообщения: 281 Откуда: Санкт-Петербург
|
Добавлено: Пн Авг 16, 2010 15:30 Заголовок сообщения: |
|
|
rebel25 писал(а): | Если вопрос актуален напишите куда слать программу. Она запускается из произвольных отчетов и выводит селект в эксель без использования шаблона. При желании можно дорисовать шапку и др. |
А выложите тут, интересно посмотреть |
|
Вернуться к началу |
|
 |
rebel25 Большой шоколадный орден

Зарегистрирован: 06.10.2008 Сообщения: 580 Откуда: Москва
|
Добавлено: Вт Авг 17, 2010 13:05 Заголовок сообщения: |
|
|
Селект может иметь любое количество полей - ниже ничего править не нужно. В итоге получаем табличку с красивой шапкой и при желании можно вставить чтото еще.
Таблица из которой берем данные должна быть в текущей базе.
Local {_strQry; _Title; _Title1;};
Select short_name
into :Struct_name_
from setup where id_firm = 1;
Let {
_Title = @@firm_name;
};
Let {
_Title1 = Struct_name_[''] + ' Период:' +'_dateask_month[м]' + ' _dateask_year';
};
Alias _strQry := select
"Подразделение" = str1
,"ПФ(страх)" = s1
,"ПФ(накоп)" = s2
,"ПФ(всего)" = s4
,"ФСС" = s5
,"ТФОМС" = s6
,"ФФОМС" = s7
,"Травматизм" = s8
,"НДФЛ" = nd
from user_zrp_rep
;
-- Параметры коннекта
Free _dsn,_db,_uid,_pwd,_is_ntuser,_ConnStr;
Local{_dsn;_db;_uid;_pwd;_is_ntuser;_ConnStr;};
Let _dsn = '@@xUtil{DSN}';
select db_name() into :_db;
select suser_sname() into :_uid;
Let _Pwd = '@@xUtil{pwd}';
select Count(*)
into :_is_ntuser
from master.dbo.syslogins
where loginname = suser_sname()
and (isntname =1 OR isntgroup = 1 OR isntuser = 1);
if _is_ntuser['] > 0 then
{Let _ConnStr := 'ODBC;DSN=' + _dsn[''] + ';UID=' + _uid[''] + ';PWD=;Database=' + _db[''];}
else {Let _ConnStr := 'ODBC;DSN=' + _dsn[''] + ';UID=' + _uid[''] + '; PWD=' + _pwd[''] + ';Database=' + _db['']};
Free _dsn,_db,_uid,_pwd,_is_ntuser;
-- Выгрузка данных
VB.FREE;
VB{
Dim ConnStr
Dim strQry
Dim TitleTxt
Dim TitleTxt1
Dim Flag
};
Let VB.ConnStr := _ConnStr[""];
Let VB.strQry := _strQry[""];
Let VB.TitleTxt := _Title[""];
Let VB.TitleTxt1 := _Title1[""];
Alias VB.Flag == 0;
VB {
Flag = 0
Dim cc
Dim lc
Dim Excel
Dim Sh
Set Excel = CreateObject("Excel.Application")
Excel.Visible = True
Excel.Workbooks.Add
Set Sh = Excel.ActiveSheet
Sh.PageSetup.Orientation = 2
Sh.PageSetup.Zoom = False
Sh.PageSetup.FitToPagesWide = 1
Sh.PageSetup.FitToPagesTall = 1
Sh.PageSetup.CenterHorizontally = True
With Sh.QueryTables.Add(ConnStr, Sh.Range("A3"))
.Name = "ExportData"
.CommandText = strQry
.FieldNames = True
.RowNumbers = false
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = False
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.EnableEditing = False
.PreserveColumnInfo = True
.Refresh
End With
cc = Sh.UsedRange.Columns.Count
While cc = 0
cc = Sh.UsedRange.Columns.Count
Wend
if Sh.UsedRange.Rows.Count > 1 then
Sh.UsedRange.Select
Excel.Selection.Borders(5).LineStyle = -4142
Excel.Selection.Borders(6).LineStyle = -4142
With Excel.Selection.Borders(7)
.LineStyle = 1
.Weight = 2
.ColorIndex = -4105
End With
With Excel.Selection.Borders(8)
.LineStyle = 1
.Weight = 2
.ColorIndex = -4105
End With
With Excel.Selection.Borders(9)
.LineStyle = 1
.Weight = 2
.ColorIndex = -4105
End With
With Excel.Selection.Borders(10)
.LineStyle = 1
.Weight = 2
.ColorIndex = -4105
End With
With Excel.Selection.Borders(11)
.LineStyle = 1
.Weight = 2
.ColorIndex = -4105
End With
With Excel.Selection.Borders(12)
.LineStyle = 1
.Weight = 2
.ColorIndex = -4105
End With
End If 'if Sh.UsedRange.Rows.Count
cc = Sh.UsedRange.Columns.Count
Sh.Range(Sh.Cells(3, 1), Sh.Cells(3, cc)).Select
With Excel.Selection.Interior
.ColorIndex = 15
.Pattern = 1
End With
With Excel.Selection
.HorizontalAlignment = -4108
.VerticalAlignment = -4160
.WrapText = True
.Orientation = 0
.AddIndent = False
.ShrinkToFit = False
.MergeCells = False
End With
Excel.Selection.WrapText = True
Excel.Selection.ColumnWidth = 10
Excel.Columns("A:A").ColumnWidth = 40
Excel.Columns("B:B").ColumnWidth = 14
Excel.Columns("C:C").ColumnWidth = 14
Excel.Columns("D:D").ColumnWidth = 14
Excel.Columns("E:G").ColumnWidth = 14
Excel.Columns("H:H").ColumnWidth = 14
Excel.Columns("I:I").ColumnWidth = 14
Excel.Columns("E:H").WrapText = True
Excel.Columns("A:H").VerticalAlignment = -4160
Sh.Range("A1").Value = TitleTxt
Sh.Range("A1").Select
'Sh.Range(Sh.Cells(1, 1), Sh.Cells(1, cc)).Select
Excel.Selection.Font.Bold = True
Excel.Selection.Font.Size = Excel.Selection.Font.Size
Sh.Range("A2").Value = TitleTxt1
Sh.Range("A2").Select
Excel.Selection.Font.Bold = True
Excel.Selection.Font.Size = Excel.Selection.Font.Size
Sh.Range(Sh.Cells(4, 3), Sh.Cells(99, 9)).Select
Excel.Selection.NumberFormat = "#,##0.00"
Sh.Range("A2").Select
Flag = 1
};--VB
EndFn:
VB.FREE;
free *; |
|
Вернуться к началу |
|
 |
Dimich1978
Зарегистрирован: 18.05.2010 Сообщения: 69
|
Добавлено: Ср Авг 18, 2010 11:48 Заголовок сообщения: |
|
|
Хороший пример. |
|
Вернуться к началу |
|
 |
Kauffman
Зарегистрирован: 27.10.2010 Сообщения: 1
|
Добавлено: Ср Окт 27, 2010 18:14 Заголовок сообщения: |
|
|
Мне нравится следующий пример.
Можно использовать готовый шаблон для выгрузки.
Цитата: | local Query_ as string;
ADODB.Connection as AutoCon;
ADODB.Recordset as AutoSet;
ADODB.Recordset as AutoSet2;
AutoCon.Open('@@xUtil{dsq}');
AutoSet.CursorLocation = 2;
CON Формирование отчета "Список работников"...;
let Query_='SELECT full_name FROM card c JOIN people p (nolock) ON p.auto_card = c.auto_card WHERE p.id_firm = ' + @@id_firm[''];
AutoSet.Open(:Query_, :AutoCon, 3, 1, 1);
execute xOCX {Excel.Application as Excel};
local vb.Record=&AutoSet;
local vb.Excel=&Excel;
vb
{
Excel.ScreenUpdating = 0
Excel.EnableEvents = 0
Dim WorkBook
Set WorkBook=Excel.Workbooks.Add()
WorkBook.Worksheets(1).Cells(1,1) = "ФИО"
WorkBook.Worksheets(1).Cells(2,1).CopyFromRecordset Record
WorkBook.Worksheets(1).Rows(1).RowHeight = 30
WorkBook.Worksheets(1).Columns(1).ColumnWidth = 25
Excel.ScreenUpdating = 1
Excel.EnableEvents = 1
};
AutoSet.Close;
CON;
execute xOCX{
Excel.Visible=True;
};
execute xOcxFree(AutoSet);
execute xOcxFree(Excel);
execute xOcxFree(AutoCon);
|
|
|
Вернуться к началу |
|
 |
Denis
Зарегистрирован: 01.06.2011 Сообщения: 39
|
Добавлено: Ср Янв 25, 2012 12:06 Заголовок сообщения: |
|
|
Всем добрый день.
Пытаюсь сварганить отчетик в Excel'e
Никак не получается заполнить таблицу инфой из запроса.
Посмотрел на приведенные примеры...мало что понял
Во первых что бросилось в глаза, так это разные способы вызова Excel
Тут возникло пара вопросов:
1. В чем их отличие и преимущества?
2. Есть ли какой-то набор обязательных команд для вызова екселя и его последующего закрытия?
3. Попытался поискать описание команды AutoSet...наверно плохо ищу
Былобы здорово, еслиб в примере №2 были комментарии к каждой строке
Далее попробовал воспользоваться вторым примером (он поменьше и вроде попроще для освоения)
Как я понял итоги запроса записываются в Query_ , далее идет вывод в табличку.
Решил подставить свой подготовленный запрос после Let Query_ ... не получилось
В общем нужна помощь, хочу разобраться как правильно создавать отчеты.
Вот мои наброски
Суть задачи - сформировать отчет о количестве уволенных сотрудников за период по подразделениям.
Код: | --Формирование диалогового окна
STABLE @XName SELECT getdate(),getdate(), 0, 1 ;
alias _dlgresource={
(0,0,480,180,0);
E,(20,32,100,20,0x28),"С даты:",(150,32,70,20,0x100),1;
E,(20,62,100,20,0x28),"По дату:",(150,62,70,20,0x100),2,{'2900-01-01'};
e,(20,90,100,20, 0x28),"Подразделение:",(150,90,300,20,0x4),3,{hrvw_structs_firm_look},0,2,1;
C,(20,120,236,36,0x20),"~",(150,120,200,20,0x0050),4,{Учесть входящие},"";
};
DIALOG @XName,,'~Количество уволенных работников';
if _Result <> 10 then {
DESTROY @XName;
error;
}; -- отказ -> выход
--Записываем в переменные значения, выбранные в диалоговом окне
Let _d1 := @XName:1 as date;
Let _d2 := @XName:2 as date;
Let _code_struct :=@XName:3;
--записываем в _str_ строку, для дальнейшего использования при выборке (для какого подразделения формировать отчет)
if _code_struct =0 then {
alias _str_:= str.struct_code!=0;
}
else {
--учитываем состояние checkbox "Учесть входящие"
if @xName:4 = 1 then
alias _str_:= str.struct_code in (select struct_code from tree where struct_parent = _code_struct )
else
alias _str_:= str.struct_code = _code_struct;
};
--формируем табилцу
STABLE @selppl select str.Struct_root,struct_name, str.Struct_Code,c_people.Cc from structs str
INNER JOIN
(select ppl.struct_code, COUNT (*) as Cc
from people ppl
where ppl.out_date>=_d1 and ppl.out_date<=_d2
group by ppl.struct_code) as c_people on str.Struct_Code=c_people.Struct_Code
where _str_
order by str.Struct_root, str.Struct_Code;
--Вывод запроса на экран
BROWSER @selppl;
--Перенос таблицы в Excel
execute xocxfree{*};
Excel.Application as Excel;
vb {
Dim sheet1
Set sheet1 = GetObject("", "Excel.sheet")
sheet1.sheets(1).Range("B2:C10").Select
};
Let _aa=1;
SCAN
10
Execute {
Excel.ActiveWorkbook.sheets(1).cells(_aa,1) = @selppl:struct_name;
let _aa+=1;
};
execute xOCX {
Excel.Visible=True;
};
execute xOcxFree(Excel);
|
Приведенный запрос работает не до конца. Открывается книга Excel и 10 строк заполняются одним и тем же значением, которое в запросе будет первым.
Вдобавок меня смущает следующий момент
Вот фрагмент кода
Код: | --Перенос таблицы в Excel
execute xocxfree{*};
Excel.Application as Excel;
vb {
Dim sheet1
Set sheet1 = GetObject("", "Excel.sheet")
sheet1.sheets(1).Range("B2:C10").Select
}; |
Если убрать строку sheet1.sheets(1).Range("B2:C10").Select , то при формировании выдается ошибка "Предварительно не определен ActiveX"
Непонятно как выделение ячеек влияет на весь процесс
 |
|
Вернуться к началу |
|
 |
Mike Большой шоколадный орден

Зарегистрирован: 07.04.2011 Сообщения: 255
|
Добавлено: Ср Янв 25, 2012 12:50 Заголовок сообщения: |
|
|
Определим ВБшные переменные vbppl и vbaa
Код: |
-- Выводим в эксель
scan @selppl execute { alias {vb.vbppl = @selppl:1};
vb{
Excel.ActiveWorkbook.sheets(1).cells(vbaa,1) = vbppl;
vbaa = vbaa + 1 };
}; |
Яп вот так как нить нопейсал. |
|
Вернуться к началу |
|
 |
Denis
Зарегистрирован: 01.06.2011 Сообщения: 39
|
Добавлено: Ср Янв 25, 2012 15:09 Заголовок сообщения: |
|
|
Я правильно понял?
Так должно выглядеть?
Код: | --Вывод запроса на экран
BROWSER @selppl;
--Перенос таблицы в Excel
execute xocxfree{*};
Excel.Application as Excel;
vb {
Dim sheet1
Set sheet1 = GetObject("", "Excel.sheet")
sheet1.sheets(1).Range("B2:C10").Select
};
-- Выводим в эксель
scan @selppl execute { alias {vb.vbppl = @selppl:1};
vb{
Excel.ActiveWorkbook.sheets(1).cells(vbaa,1) = vbppl;
vbaa = vbaa + 1 };
};
execute xOCX {
Excel.Visible=True;
};
execute xOcxFree(Excel);
|
В этом случае ничего в ексель не добавляется. Появляется пустой лист.
Если же явно вписать количество циклов (вместо scan @selppl например scan 5) , то ругается и пишет:
Предполагается наличие окончания инструкции
Excel.ActiveWorkbook.sheets(1).cells(vbaa,1) |
|
Вернуться к началу |
|
 |
Mike Большой шоколадный орден

Зарегистрирован: 07.04.2011 Сообщения: 255
|
Добавлено: Ср Янв 25, 2012 15:24 Заголовок сообщения: |
|
|
Код: | --Формирование диалогового окна
STABLE @XName SELECT getdate(),getdate(), 0, 1 ;
alias _dlgresource={
(0,0,480,180,0);
E,(20,32,100,20,0x28),"С даты:",(150,32,70,20,0x100),1;
E,(20,62,100,20,0x28),"По дату:",(150,62,70,20,0x100),2,{'2900-01-01'};
e,(20,90,100,20, 0x28),"Подразделение:",(150,90,300,20,0x4),3,{hrvw_structs_firm_look},0,2,1;
C,(20,120,236,36,0x20),"~",(150,120,200,20,0x0050),4,{Учесть входящие},"";
};
DIALOG @XName,,'~Количество уволенных работников';
if _Result <> 10 then {
DESTROY @XName;
error;
}; -- отказ -> выход
--Записываем в переменные значения, выбранные в диалоговом окне
Let _d1 := @XName:1 as date;
Let _d2 := @XName:2 as date;
Let _code_struct :=@XName:3;
--записываем в _str_ строку, для дальнейшего использования при выборке (для какого подразделения формировать отчет)
if _code_struct =0 then {
alias _str_:= str.struct_code!=0;
}
else {
--учитываем состояние checkbox "Учесть входящие"
if @xName:4 = 1 then
alias _str_:= str.struct_code in (select struct_code from tree where struct_parent = _code_struct )
else
alias _str_:= str.struct_code = _code_struct;
};
--формируем табилцу
STABLE @selppl select str.Struct_root,struct_name, str.Struct_Code,c_people.Cc from structs str
INNER JOIN
(select ppl.struct_code, COUNT (*) as Cc
from people ppl
where ppl.out_date>=_d1 and ppl.out_date<=_d2
group by ppl.struct_code) as c_people on str.Struct_Code=c_people.Struct_Code
where _str_
order by str.Struct_root, str.Struct_Code;
--Вывод запроса на экран
BROWSER @selppl;
--Создаем документ эксель
vb{
Set Excel = CreateObject("Excel.Application")
Excel.Workbooks.Add
Excel.Visible=True
Excel.WindowState =2
Dim vbaa 'Счетчик
Dim vbppl 'Сотрудник
vbaa = 1 'Первая строка
};
--Заполняем эксель
scan @selppl execute { alias {vb.vbppl = @selppl:2};
vb{
Excel.ActiveSheet.Cells(vbaa,1).Value = vbppl
vbaa = vbaa + 1 };
};
Free *;
Destroy @xName;
execute xOCXfree(*);
msg [\3\7Операция завершена] 3, 0x01; |
Попробуйте как то так.
У себя не запускал, писал сразу в сообщении, так что нужно еще повнимательнее проверить на синтаксические ошибки |
|
Вернуться к началу |
|
 |
Николай
Зарегистрирован: 04.10.2010 Сообщения: 22 Откуда: Ростов-на-Дону
|
Добавлено: Ср Янв 25, 2012 15:51 Заголовок сообщения: |
|
|
Самая простая выгрузка:
-- перекинем запрос в excel
msg 2201,@$LV0 ;
-- закроем браузер
msg 29,@$LV0 ;
Если нужно что-то добавлять или корректировать, тогда нужно:
--запустим Excel
execute xOCXfree(*);
execute xOCX
{ excel.Application as excel;
excel.Visible=True;
};
---Переименуем первую колонку
excel.Cells(1,1)='№ п/п'; |
|
Вернуться к началу |
|
 |
Denis
Зарегистрирован: 01.06.2011 Сообщения: 39
|
Добавлено: Ср Янв 25, 2012 16:13 Заголовок сообщения: |
|
|
Mike писал(а): | Попробуйте как то так.
У себя не запускал, писал сразу в сообщении, так что нужно еще повнимательнее проверить на синтаксические ошибки |
Попробовал. Ошибок не выдал. Выдал пустой лист ексель.
Указал явным образом количество повторений для Scan., например 100 Получил лист ексель с записями в количестве 100шт. и все 100 ячеек заполнены одной и тойже инфой, которая была на первой позиции в запросе.
Может я тут не правильно начал действовать STABLE @selppl select ... ?
Николай писал(а): | -- перекинем запрос в excel
msg 2201,@$LV0 ;
-- закроем браузер
msg 29,@$LV0 ; |
а куда это добавлять?
и где тут видно из какого запроса выводятся данные? |
|
Вернуться к началу |
|
 |
Mike Большой шоколадный орден

Зарегистрирован: 07.04.2011 Сообщения: 255
|
Добавлено: Ср Янв 25, 2012 16:34 Заголовок сообщения: |
|
|
Странно, у меня мое работает:
 |
|
Вернуться к началу |
|
 |
Denis
Зарегистрирован: 01.06.2011 Сообщения: 39
|
Добавлено: Ср Янв 25, 2012 16:44 Заголовок сообщения: |
|
|
Mike писал(а): | Странно, у меня мое работает: |
Опаньки
У меня тоже прошло.
Клиента босса у себя перезапустил и отработало.
Большущее спасибо
Пойду дальше до ума доводить
Поправлюсь
Дело не в перезагрузке
Вредным оказался этот фрагмент
Код: | --Вывод запроса на экран
BROWSER @selppl; |
Как доходило до него, исполнение приостанавливалось, пока не закроешь выпавший список Excel не появлялся.
Закоментировал строчку и нормуль. |
|
Вернуться к началу |
|
 |
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|