Forms , вывод в Excel, как решить эту проблему?

НаташаXX
Дата: 04.12.2007 11:30:25
есть выборка по определенному условию, и данные все время меняются (ПРимер: ввод периода даты). В Excel выводиться вот такая табличка...
Наименование объекта Срочность ошибки 23 24(даты) Итого
ats74_aMsgErr Несрочная 3 15 Сумма (3+15)
ats74_aMsgErr Полусрочная 3 16 Сумма (3+16)
ats74_aMsgErr Срочная 509 14
ats74_bMsgErr Срочная 4 181
скажите с чего начать?
вот сама процедура ввывода
declare
objExcelApp OLE2.OBJ_TYPE ;
objArgList OLE2.LIST_TYPE ;
ArgList OLE2.LIST_TYPE;
workbooks OLE2.OBJ_TYPE :=NULL;
workbook OLE2.OBJ_TYPE :=NULL;
worksheets OLE2.OBJ_TYPE :=NULL;
worksheet OLE2.OBJ_TYPE :=NULL;
cell OLE2.OBJ_TYPE :=NULL;
bold OLE2.OBJ_TYPE;
Italic OLE2.OBJ_TYPE;
font OLE2.OBJ_TYPE;
inter OLE2.OBJ_TYPE;
border OLE2.OBJ_TYPE;
idCursor EXEC_SQL.CURSTYPE;
idCursor1 EXEC_SQL.CURSTYPE;
idCursor2 EXEC_SQL.CURSTYPE;
idCursor3 EXEC_SQL.CURSTYPE;
idCursor4 EXEC_SQL.CURSTYPE;
vSQLStr VARCHAR2(500):='';
vSQLStr1 VARCHAR2(500):='';
vSQLStr2 VARCHAR2(500):='';
vSQLStr3 VARCHAR2(500):='';
vSQLStr4 VARCHAR2(500):='';
iIgnore PLS_INTEGER:=0;
iIgnore1 PLS_INTEGER:=0;
iIgnore2 PLS_INTEGER:=0;
iIgnore3 PLS_INTEGER:=0;
iIgnore4 PLS_INTEGER:=0;
iROWS PLS_INTEGER:=0;
iROWS1 PLS_INTEGER:=0;
iROWS2 PLS_INTEGER:=0;
iROWS3 PLS_INTEGER:=0;
nloc_sum_amnt number(20):=0;
N varchar2(20):='';
E varchar2(20):='';
kol number(20):=0;
l_DAT varchar(10):=to_char(SYSDATE,'DD');
l_DAT2 varchar(10):=to_char(SYSDATE,'MM');
lp_dat varchar(10):=to_char(SYSDATE,'DD');
lp_dat2 varchar(10):=to_char(SYSDATE,'MM');
nloc_VLS_E_D varchar2(20):='';
nloc_VLS_E_D1 varchar2(255):='';
nloc_VLS_E_D2 varchar2(20):='';
nloc_VLS_E_D3 varchar2(20):='';
nloc_VLS_E_D4 varchar2(20):='';
l_ID_CAT varchar2(20):='';
l_INC_CR varchar2(10):='';

l_VALIDAT_N date:=SYSDATE;
l_VALIDAT_K date:=SYSDATE;
i number(5):=0;
j number(5):=0;
nloc_sum_itog number(20):=0;
l_GOROD varchar2(255):='';

BEGIN
l_GOROD:='Екатеринбург';
l_INC_CR:=:Блок59.ATS4;
l_VALIDAT_N:=:Блок59.datastart4;
l_VALIDAT_K:=:Блок59.dataend4;
lp_dat:=l_VALIDAT_N;


i:=1;
j:=1;
--Инициализация
objExcelApp := OLE2.CREATE_OBJ('Excel.APPLICATION');

--Вскрытие Excel-a
ole2.set_property(objExcelApp, 'Visible', TRUE );

--Инициализация книги------------------------------
workbooks := OLE2.GET_OBJ_PROPERTY(objExcelApp, 'Workbooks');
workbook := OLE2.GET_OBJ_PROPERTY(workbooks, 'Add');

--Создать новый лист--------------------------------
worksheets := OLE2.GET_OBJ_PROPERTY(workbook, 'Worksheets');
worksheet := OLE2.GET_OBJ_PROPERTY(worksheets, 'Add');

ArgList:=OLE2.CREATE_ARGLIST;
OLE2.ADD_ARG(ArgList, 1);
OLE2.ADD_ARG(ArgList, 1);
cell:=OLE2.get_OBJ_property(worksheet, 'cells', ArgList);
OLE2.Invoke(cell,'select');
OLE2.DESTROY_ARGLIST(ArgList);

--Переименовать лист----------------------------
OLE2.set_property(worksheet, 'Name', 'Отчет № 4');

j:=3;
--Выделить ячейку--------------------------------
OLE2.RELEASE_OBJ(cell);
ArgList:=OLE2.CREATE_ARGLIST;
OLE2.ADD_ARG(ArgList, i);
OLE2.ADD_ARG(ArgList, j);
cell:=OLE2.get_OBJ_property(worksheet, 'cells', ArgList);
OLE2.Invoke(cell,'select');
OLE2.DESTROY_ARGLIST(ArgList);
--Заполнить ячейку--------------------------------
-- OLE2.set_property( cell, 'Value', ' Количество аварийных сообщений по каждой АСТ за месяц' );

i:=i+1;
j:=1;
--Выделить ячейку--------------------------------
OLE2.RELEASE_OBJ(cell);
ArgList:=OLE2.CREATE_ARGLIST;
OLE2.ADD_ARG(ArgList, i);
OLE2.ADD_ARG(ArgList, j);
cell:=OLE2.get_OBJ_property(worksheet, 'cells', ArgList);
OLE2.Invoke(cell,'select');
OLE2.DESTROY_ARGLIST(ArgList);
--Заполнить ячейку--------------------------------
OLE2.set_property( cell, 'Value', 'Дата печати: '||to_char( l_VALIDAT_N, 'dd.mm.yyyy hh24:mi:ss'));

j:=j+2;
--Выделить ячейку--------------------------------
OLE2.RELEASE_OBJ(cell);
ArgList:=OLE2.CREATE_ARGLIST;
OLE2.ADD_ARG(ArgList, i);
OLE2.ADD_ARG(ArgList, j);
cell:=OLE2.get_OBJ_property(worksheet, 'cells', ArgList);
OLE2.Invoke(cell,'select');
OLE2.DESTROY_ARGLIST(ArgList);
--Заполнить ячейку--------------------------------
OLE2.set_property( cell, 'Value', l_GOROD );

i:=i+1;
j:=j-1;

--Выделить ячейку--------------------------------
OLE2.RELEASE_OBJ(cell);
ArgList:=OLE2.CREATE_ARGLIST;
OLE2.ADD_ARG(ArgList, i);
OLE2.ADD_ARG(ArgList, j);
cell:=OLE2.get_OBJ_property(worksheet, 'cells', ArgList);
OLE2.Invoke(cell,'select');
OLE2.DESTROY_ARGLIST(ArgList);

i:=i+1;
j:=1;

--Выделить ячейку--------------------------------
OLE2.RELEASE_OBJ(cell);
ArgList:=OLE2.CREATE_ARGLIST;
OLE2.ADD_ARG(ArgList, i);
OLE2.ADD_ARG(ArgList, j);
cell:=OLE2.get_OBJ_property(worksheet, 'cells', ArgList);
OLE2.Invoke(cell,'select');
OLE2.DESTROY_ARGLIST(ArgList);

--Заполнить ячейку--------------------------------
OLE2.set_property( cell, 'Value', 'Количество аварийных сообщений по '||l_INC_CR ||' АСТ за период ' ||to_char(l_VALIDAT_N, 'dd.mm.yyyy hh24:mi:ss') || ' по ' || to_char(l_VALIDAT_K, 'dd.mm.yyyy hh24:mi:ss'));

i:=i+1;
j:=1;
--Выделить ячейки--------------------------------
OLE2.RELEASE_OBJ(cell);
ArgList:=OLE2.CREATE_ARGLIST;
OLE2.ADD_ARG(ArgList, 'A'||3);
OLE2.ADD_ARG(ArgList, 'C'||i);
cell:=OLE2.get_OBJ_property(worksheet, 'range', ArgList);
OLE2.DESTROY_ARGLIST(ArgList);
OLE2.Invoke(cell,'select');

--Установить ширину столбца------------------------
OLE2.set_property(cell, 'ColumnWidth', 22);

--Установить жирный шрифт-----------------------
bold := OLE2.get_OBJ_property(cell, 'Font');
OLE2.set_property(bold, 'Bold', TRUE);
OLE2.RELEASE_OBJ(bold);
--Установить курсив-----------------------------
Italic := OLE2.get_OBJ_property(cell, 'Font');
OLE2.set_property(Italic, 'Italic', TRUE);
OLE2.RELEASE_OBJ(Italic);

--Установить размер шрифта-----------------------
font := OLE2.get_OBJ_property(cell, 'Font');
OLE2.set_property(font, 'Size', 14);
OLE2.RELEASE_OBJ(font);

--Установить цвет шрифта-----------------------
font := OLE2.get_OBJ_property(cell, 'Font');
OLE2.set_property(font, 'ColorIndex', 32);
OLE2.RELEASE_OBJ(font);

i:=i+1;
j:=1;
--Выделить ячейку--------------------------------
OLE2.RELEASE_OBJ(cell);
ArgList:=OLE2.CREATE_ARGLIST;
OLE2.ADD_ARG(ArgList, i);
OLE2.ADD_ARG(ArgList, j);
cell:=OLE2.get_OBJ_property(worksheet, 'cells', ArgList);
OLE2.Invoke(cell,'select');
OLE2.DESTROY_ARGLIST(ArgList);
--Заполнить ячейку--------------------------------
OLE2.set_property( cell, 'Value', 'Наименование объекта' );
--Установить жирный шрифт-----------------------
bold := OLE2.get_OBJ_property(cell, 'Font');
OLE2.set_property(bold, 'Bold', TRUE);
OLE2.RELEASE_OBJ(bold);
border := OLE2.get_OBJ_property(cell, 'Borders');
OLE2.set_property(border, 'ColorIndex', 1);
OLE2.set_property(border, 'Bold', TRUE);
OLE2.RELEASE_OBJ(border);
j:=j+1;
--Выделить ячейку--------------------------------
OLE2.RELEASE_OBJ(cell);
ArgList:=OLE2.CREATE_ARGLIST;
OLE2.ADD_ARG(ArgList, i);
OLE2.ADD_ARG(ArgList, j);
cell:=OLE2.get_OBJ_property(worksheet, 'cells', ArgList);
OLE2.Invoke(cell,'select');
OLE2.DESTROY_ARGLIST(ArgList);
--Заполнить ячейку--------------------------------
OLE2.set_property( cell, 'Value', 'Срочность ошибки' );
--Установить жирный шрифт-----------------------
bold := OLE2.get_OBJ_property(cell, 'Font');
OLE2.set_property(bold, 'Bold', TRUE);
OLE2.RELEASE_OBJ(bold);
border := OLE2.get_OBJ_property(cell, 'Borders');
OLE2.set_property(border, 'ColorIndex', 1);
OLE2.set_property(border, 'Bold', TRUE);
OLE2.RELEASE_OBJ(border);
j:=3;

begin

vSQLStr:='select t1.naim, err_num, count(t1.err_num) as kol1, to_char(t1.datat_start,''DD'') as D1
from av_signal74_norm t1
where t1.err_naim= :lp_INC_CR
and t1.datat_start >=:lp_VALIDAT_N
and t1.datat_end <=:lp_VALIDAT_K
group by t1.naim, t1.err_num, to_char(t1.datat_start,''DD'')order by t1.naim';

idCursor2:=EXEC_SQL.Open_Cursor;
vSQLStr1:='select distinct d1 from ('||vSQLStr||') order by d1';


EXEC_SQL.Parse(idCursor2,vSQLStr1,exec_sql.V7);

EXEC_SQL.Bind_Variable(idCursor2,':lp_VALIDAT_N', l_VALIDAT_N);
EXEC_SQL.Bind_Variable(idCursor2,':lp_VALIDAT_K', l_VALIDAT_K);
EXEC_SQL.Bind_Variable(idCursor2,':lp_INC_CR', l_INC_CR );

EXEC_SQL.Define_Column(idCursor2, 1, l_DAT, 3);

iIgnore2:=EXEC_SQL.Execute(idCursor2);

WHILE (EXEC_SQL.Fetch_Rows(idCursor2)>0) LOOP

EXEC_SQL.Column_Value(idCursor2, 1, l_DAT);

iRows:=iRows+1;


--Выделить ячейку--------------------------------
OLE2.RELEASE_OBJ(cell);
ArgList:=OLE2.CREATE_ARGLIST;
OLE2.ADD_ARG(ArgList, i);
OLE2.ADD_ARG(ArgList, j);
cell:=OLE2.get_OBJ_property(worksheet, 'cells', ArgList);
OLE2.Invoke(cell,'select');
OLE2.DESTROY_ARGLIST(ArgList);
--Заполнить ячейку--------------------------------
OLE2.set_property( cell, 'Value', l_DAT);
OLE2.set_property(cell, 'HorizontalAlignment', 'xlLeft');
border := OLE2.get_OBJ_property(cell, 'Borders');
OLE2.set_property(border, 'ColorIndex', 1);
OLE2.set_property(border, 'Bold', TRUE);
OLE2.RELEASE_OBJ(border);
bold := OLE2.get_OBJ_property(cell, 'Font');
OLE2.set_property(bold, 'Bold', TRUE);
OLE2.RELEASE_OBJ(bold);

idCursor1:=EXEC_SQL.Open_Cursor;

-- j:=j+1;

vSQLStr2:='select naim, err_num, sum(decode(d1,:lp_dat,kol1,0)) as kol from ('||vSQLStr||') group by naim, err_num order by naim,err_num' ;

EXEC_SQL.Parse(idCursor1,vSQLStr2,exec_sql.V7);

EXEC_SQL.Bind_Variable(idCursor1,':lp_dat', l_DAT);
EXEC_SQL.Bind_Variable(idCursor1,':lp_VALIDAT_N', l_VALIDAT_N);
EXEC_SQL.Bind_Variable(idCursor1,':lp_VALIDAT_K', l_VALIDAT_K);
EXEC_SQL.Bind_Variable(idCursor1,':lp_INC_CR', l_INC_CR );

EXEC_SQL.Define_Column(idCursor1, 1, nloc_VLS_E_D, 15);
EXEC_SQL.Define_Column(idCursor1, 2, nloc_VLS_E_D2,15);
EXEC_SQL.Define_Column(idCursor1, 3, nloc_VLS_E_D3,7);


iIgnore1:=EXEC_SQL.Execute(idCursor1);

WHILE (EXEC_SQL.Fetch_Rows(idCursor1)>0) LOOP

EXEC_SQL.Column_Value(idCursor1, 1, nloc_VLS_E_D);
EXEC_SQL.Column_Value(idCursor1, 2, nloc_VLS_E_D2);
EXEC_SQL.Column_Value(idCursor1, 3, nloc_VLS_E_D3);


iRows1:=iRows1+1;
i:=i+1;
--Выделить ячейку--------------------------------
OLE2.RELEASE_OBJ(cell);
ArgList:=OLE2.CREATE_ARGLIST;
OLE2.ADD_ARG(ArgList, i);
OLE2.ADD_ARG(ArgList, 1);
cell:=OLE2.get_OBJ_property(worksheet, 'cells', ArgList);
OLE2.Invoke(cell,'select');
OLE2.DESTROY_ARGLIST(ArgList);
--Заполнить ячейку--------------------------------
OLE2.set_property( cell, 'Value', nloc_VLS_E_D);

border := OLE2.get_OBJ_property(cell, 'Borders');
OLE2.set_property(border, 'ColorIndex', 1);
OLE2.RELEASE_OBJ(border);
--Выделить ячейку--------------------------------
OLE2.RELEASE_OBJ(cell);
ArgList:=OLE2.CREATE_ARGLIST;
OLE2.ADD_ARG(ArgList, i);
OLE2.ADD_ARG(ArgList, 2);
cell:=OLE2.get_OBJ_property(worksheet, 'cells', ArgList);
OLE2.Invoke(cell,'select');
OLE2.DESTROY_ARGLIST(ArgList);

--Заполнить ячейку--------------------------------
OLE2.set_property( cell, 'Value', nloc_VLS_E_D2 );

border := OLE2.get_OBJ_property(cell, 'Borders');
OLE2.set_property(border, 'ColorIndex', 1);
OLE2.RELEASE_OBJ(border);
--Выделить ячейку--------------------------------
OLE2.RELEASE_OBJ(cell);
ArgList:=OLE2.CREATE_ARGLIST;
OLE2.ADD_ARG(ArgList, i);
OLE2.ADD_ARG(ArgList, j);
cell:=OLE2.get_OBJ_property(worksheet, 'cells', ArgList);
OLE2.Invoke(cell,'select');
OLE2.DESTROY_ARGLIST(ArgList);

--Заполнить ячейку--------------------------------
OLE2.set_property( cell, 'Value', nloc_VLS_E_D3 );

border := OLE2.get_OBJ_property(cell, 'Borders');
OLE2.set_property(border, 'ColorIndex', 1);
OLE2.RELEASE_OBJ(border);

end loop;
EXEC_SQL.Close_Cursor (idCursor1);
j:=j+1;
i:=6;
END LOOP;
EXEC_SQL.Close_Cursor (idCursor2);

OLE2.RELEASE_OBJ(cell);
ArgList:=OLE2.CREATE_ARGLIST;
OLE2.ADD_ARG(ArgList, 6);
OLE2.ADD_ARG(ArgList, j);
cell:=OLE2.get_OBJ_property(worksheet, 'cells', ArgList);
OLE2.Invoke(cell,'select');
OLE2.DESTROY_ARGLIST(ArgList);
--Заполнить ячейку--------------------------------
OLE2.set_property( cell, 'Value', 'Всего' );
--Установить жирный шрифт-----------------------
bold:= OLE2.get_OBJ_property(cell, 'Font');
OLE2.set_property(bold, 'Bold', TRUE);
OLE2.RELEASE_OBJ(bold);
border := OLE2.get_OBJ_property(cell, 'Borders');
OLE2.set_property(border, 'ColorIndex', 1);
OLE2.set_property(border, 'Bold', TRUE);
OLE2.RELEASE_OBJ(border);
OLE2.set_property(cell, 'HorizontalAlignment', 'xlLeft');
_мод
Дата: 04.12.2007 13:13:48
автор
скажите с чего начать?

1.все что вы написали - в корзину
алгоритм такой:
1. рисуем шаблон в екселе
2. используем dde из формсов
3. открываем шаблон
4 заполняем его данными
5 закрываем, сохраняем
6 все
OraDen
Дата: 04.12.2007 13:16:51
А в чем проблема то?
НаташаXX
Дата: 04.12.2007 13:27:21
проблема в подсчете итогов в конце вывода данных.....
НаташаXX
Дата: 04.12.2007 13:32:50
_мод
автор
скажите с чего начать?

1.все что вы написали - в корзину
алгоритм такой:
1. рисуем шаблон в екселе
2. используем dde из формсов
3. открываем шаблон
4 заполняем его данными
5 закрываем, сохраняем
6 все


Пример можно посмотреть?
_мод
Дата: 04.12.2007 14:16:07
-- получить путь к excel.exe можно так
app:=ole2.create_obj('excel.application');
tmps:=upper(ole2.get_char_property(app,'path')||'\'||'excel.exe');
-- вызвать ексель можно без файла
tmp:=dde.app_begin(tmps,dde.app_mode_minimized);
ce_ss:=dde.initiate('excel','system');
-- открыть файл шаблона
dde.execute(ce_ss,'[open("xxx.xls",0,true)]',1000); 
- в ячейку а1 поместить текст
dde.poke(ce_ss,'R1C1','Hello !',dde.cf_text,1000);
НаташаXX
Дата: 04.12.2007 14:20:38
А может в курсе как в Excel подсчитать сумму, при моем выводе данных... Может знаешь, что сделать? Плиз...
pan159
Дата: 04.12.2007 14:46:19
Формулу в ячейку запишите.
НаташаXX
Дата: 04.12.2007 14:48:05
я не знаю в какой ячейке будет хрониться результат, так как количество колонок таблицы постоянно меняются...
pan159
Дата: 04.12.2007 14:52:11
Пример:
for i in stock_view_purchasing(:stock_filter.reg) loop
Excel.CurValue('A',' '||i.linde_number);
Excel.CurValue('B',i.part_name);
Excel.CurValue('C',i.part_type);
Excel.CurValue('D',i.stock_location);
Excel.CurValue('E',i.supplier);
Excel.CurValue('F',i.order_number);
Excel.CurValue('G',' '||i.truck_type);
Excel.CurValue('H',i.supplier_invoice_number);
Excel.CurValue('I',to_char(i.delivery_date,'DD/MM/YYYY'));
Excel.CurValue('J',to_char(i.quantity));
Excel.CurValue('K',to_char(i.net_unit_price,'9999999.9999'));
Excel.CurValue('L','='||'J'||to_char(Excel.TRow)||'*'||'K'||to_char(Excel.TRow));
Excel.CurValue('M',to_char(i.DDP_unit_cost,'9999999.9999'));
Excel.CurValue('N','='||'J'||to_char(Excel.TRow)||'*'||'M'||to_char(Excel.TRow));
Excel.CurValue('O',i.comments);
Excel.Enter; k := k + 1;
end loop;
if k > 0 then
Excel.CurValue('L','=СУММ(L7:L'||to_char(Excel.TRow - 1)||')');
Excel.CurValue('N','=СУММ(N7:N'||to_char(Excel.TRow - 1)||')');
Excel.Value('N3','=N'||to_char(Excel.TRow));
end if;