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

Помогите запихать запрос в excell
На страницу 1, 2  След.
 
Начать новую тему   Ответить на тему    Список форумов BOSSForum.RU - Форум. БОСС-Кадровик -> X-язык
Предыдущая тема :: Следующая тема  
Автор Сообщение
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
Сообщения: 578
Откуда: Москва

СообщениеДобавлено: Пн Авг 16, 2010 14:22    Заголовок сообщения: Ответить с цитатой

Если вопрос актуален напишите куда слать программу. Она запускается из произвольных отчетов и выводит селект в эксель без использования шаблона. При желании можно дорисовать шапку и др.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Vitaly
Большой шоколадный орден
Большой шоколадный орден


Зарегистрирован: 29.07.2008
Сообщения: 281
Откуда: Санкт-Петербург

СообщениеДобавлено: Пн Авг 16, 2010 15:30    Заголовок сообщения: Ответить с цитатой

rebel25 писал(а):
Если вопрос актуален напишите куда слать программу. Она запускается из произвольных отчетов и выводит селект в эксель без использования шаблона. При желании можно дорисовать шапку и др.


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


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

СообщениеДобавлено: Вт Авг 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 *;
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
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

Никак не получается заполнить таблицу инфой из запроса.

Посмотрел на приведенные примеры...мало что понял Unknown

Во первых что бросилось в глаза, так это разные способы вызова Excel
Тут возникло пара вопросов:
1. В чем их отличие и преимущества?
2. Есть ли какой-то набор обязательных команд для вызова екселя и его последующего закрытия?
3. Попытался поискать описание команды AutoSet...наверно плохо ищу

Былобы здорово, еслиб в примере №2 были комментарии к каждой строке Embarassed


Далее попробовал воспользоваться вторым примером (он поменьше и вроде попроще для освоения)

Как я понял итоги запроса записываются в 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"
Непонятно как выделение ячеек влияет на весь процесс


Unknown
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
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 писал(а):
Странно, у меня мое работает:


Опаньки
У меня тоже прошло.
Клиента босса у себя перезапустил и отработало.


Большущее спасибо Good
Пойду дальше до ума доводить


Поправлюсь
Дело не в перезагрузке

Вредным оказался этот фрагмент
Код:
--Вывод запроса на экран
BROWSER @selppl;


Как доходило до него, исполнение приостанавливалось, пока не закроешь выпавший список Excel не появлялся.
Закоментировал строчку и нормуль.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов BOSSForum.RU - Форум. БОСС-Кадровик -> X-язык Часовой пояс: GMT + 4
На страницу 1, 2  След.
Страница 1 из 2

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


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