[Tutorial] - Reports Based on Record Group

Coloque aqui tutoriais (por enquanto, sobre qualquer assunto relacionado a Oracle) e apostilas.
Post Reply
ricards
Rank: Programador Sênior
Rank: Programador Sênior
Posts: 52
Joined: Sat, 29 Sep 2007 12:59 am
Location: Araraquara-SP
Contact:
Ricardo Neves
Analista e Instrutor Oracle Developer
Java Developer (JPA/JSF/Hibernate/WebServices/EJB)

Reports Based on Record Group

In creating a Record Group-based report The data will be stored in "Types" (records) in procedures in the database.
Advantages of creating a record based on Record Group:
• Reports that have large quantities of information.
• The information is recovered in a procedure, and you must give permissions only to this procedure and not for the tables involved.
• Speed ??in the processing of information, as the process is being loaded in the database.
• Code readability.
• Easy maintenance.
• Gain in Performance.
• Code reduction in visual application.

The following will be presented to the construction of a Record Group report.

1. Create a package that has types and procedures that will return the information for the report:

Select all

 
 
create	or	replace	package	pkg_treinamento	is 
	-- Registro de empregados 
	type	v_rec_produtos	is	record	( 
							cd_produto	       number, 
							nm_produto	       varchar2(500), 
                                                        vl_compra              number, 
                                                        vl_venda               number, 
                                                        qt_produto             number, 
                                                        dt_atualizacao         date, 
                                                        nm_usuario_atualizacao varchar2(50)       
						); 
	type	v_tab_produtos	is	table	of	v_rec_produtos	index	by	binary_integer; 
	-- Procedure responsavel por retorna os empregados em um registro 
	procedure	prc_carrega_produtos	( 
							p_tab_produtos   	in	out	v_tab_produtos, 
							p_mens			in	out	varchar2 
						); 
end	pkg_treinamento; 
/ 
create	or	replace	package	body	pkg_treinamento	is 
	-- Procedure responsavel por carregar os produtos em um registro 
	procedure	prc_carrega_produtos	( 
							p_tab_produtos   	in	out	v_tab_produtos, 
							p_mens			in	out	varchar2 
						)       is 
                -- Cursor que recupera todos os produtos da base 
		cursor	c1	is 
                        select  p.cd_produto, 
                                p.nm_produto, 
                                p.vl_compra, 
                                p.vl_venda, 
                                p.qt_produto, 
                                p.dt_atualizacao, 
                                p.nm_usuario_atualizacao 
                        from    tb_produtos     p; 
 
		v_ind		number	:=	0; 
	begin 
		-- Carrega o registro de produtos 
		for	r1	in	c1	loop 
			v_ind	:=	v_ind	+	1; 
			p_tab_produtos(v_ind).cd_produto	        :=	r1.cd_produto; 
			p_tab_produtos(v_ind).nm_produto	        :=	r1.nm_produto;  
                        p_tab_produtos(v_ind).vl_compra	                :=	r1.vl_compra;  
                        p_tab_produtos(v_ind).vl_venda	                :=	r1.vl_venda; 
                        p_tab_produtos(v_ind).qt_produto	        :=	r1.qt_produto; 
                        p_tab_produtos(v_ind).dt_atualizacao	        :=	r1.dt_atualizacao; 
                        p_tab_produtos(v_ind).nm_usuario_atualizacao	:=	r1.nm_usuario_atualizacao;  
		end	loop; 
	exception 
		when	others	then 
			p_mens	:=	'PKG_TREINAMENTO.PRC_CARREGA_PRODUTOS - Problemas ao executar a rotina. Erro: '	||	sqlerrm; 
	end; 
end	pkg_treinamento; 
/ 
 
2. Create a forms that will be responsible for passing parameters to the report.
3. On the button called the report, responsible for the report of Reports, create the following code:

Select all

 
 
DECLARE 
    -- LISTA DE PARÂMETROS E RECORD GROUPS   
    LISTA_PARAMETROS            		 PARAMLIST; 
		RG_GRUPO_PRODUTO		             RECORDGROUP; 
		-- COLUNAS DO RECORD GROUP DE PRODUTOS 
    CD_PRODUTO                       GROUPCOLUMN; --NUMBER   
    NM_PRODUTO                       GROUPCOLUMN; --VARCHAR2(500)   
    VL_COMPRA                     	 GROUPCOLUMN; --NUMBER 
    VL_VENDA                         GROUPCOLUMN; --NUMBER 
    QT_PRODUTO                       GROUPCOLUMN; --NUMBER 
    DT_ATUALIZACAO                   GROUPCOLUMN; --DATE 
    NM_USUARIO_ATUALIZACAO					 GROUPCOLUMN; --VARCHAR2(50)   
    -- CRIAR UMA VARIÁVEL DO TIPO V_TAB_PRODUTOS (TYPE) 
    V_TAB_PRODUTOS									 PKG_TREINAMENTO.V_TAB_PRODUTOS; 
    V_MENS													 VARCHAR2(300)	:=	NULL; 
BEGIN 
		-- VERIFICA SE EXISTE UM RECORD GROUP PRODUTO JÁ CRIADO	 
		RG_GRUPO_PRODUTO	:= FIND_GROUP('PRODUTO'); 
		-- SE EXISTIR EXCLUI O RECORD GROUP 
  	IF NOT ID_NULL(RG_GRUPO_PRODUTO) THEN 
 	   	DELETE_GROUP(RG_GRUPO_PRODUTO); 
  	END IF; 
  	-- CRIA UM RECORD GROUP PRODUTO 
    RG_GRUPO_PRODUTO 	   	     :=	CREATE_GROUP('PRODUTO', GLOBAL_SCOPE); 
  	-- CRIA AS COLUNAS DO RECORD GROUP PRODUTO SEMPRE COM O MESMO NOME DAS COLUNAS DO TYPE 
  	CD_PRODUTO                 := ADD_GROUP_COLUMN(RG_GRUPO_PRODUTO, 'CD_PRODUTO'                ,  NUMBER_COLUMN  , 10 ); 
  	NM_PRODUTO                 := ADD_GROUP_COLUMN(RG_GRUPO_PRODUTO, 'NM_PRODUTO'                ,  CHAR_COLUMN    , 500); 
  	VL_COMPRA                  := ADD_GROUP_COLUMN(RG_GRUPO_PRODUTO, 'VL_COMPRA'            		 ,  NUMBER_COLUMN  , 20 ); 
		VL_VENDA              		 := ADD_GROUP_COLUMN(RG_GRUPO_PRODUTO, 'VL_VENDA'               	 ,  NUMBER_COLUMN  , 20 );	 
		QT_PRODUTO                 := ADD_GROUP_COLUMN(RG_GRUPO_PRODUTO, 'QT_PRODUTO'                ,  NUMBER_COLUMN  , 10 ); 
		DT_ATUALIZACAO             := ADD_GROUP_COLUMN(RG_GRUPO_PRODUTO, 'DT_ATUALIZACAO'            ,  DATE_COLUMN    , 20 ); 
		NM_USUARIO_ATUALIZACAO     := ADD_GROUP_COLUMN(RG_GRUPO_PRODUTO, 'NM_USUARIO_ATUALIZACAO'    ,  CHAR_COLUMN    , 50 ); 
		-- CARREGA AS INFORMAÇÕES DA PROCEDURE PARA O RECORD GROUP 
    PKG_TREINAMENTO.PRC_CARREGA_PRODUTOS	( 
    																				P_TAB_PRODUTOS	=>	V_TAB_PRODUTOS, 
    																				P_MENS					=>	V_MENS	 
    																			); 
    -- CASO DER ERRO NA PRODCEDURE EXIBE A MENSAGEM 
    IF	V_MENS	IS	NOT	NULL	THEN 
    		MESSAGE(V_MENS); 
    		MESSAGE(V_MENS); 
    		RAISE	FORM_TRIGGER_FAILURE; 
    END	IF; 
    -- LE O TYPE DE PRODUTOS 
    FOR V_IND IN NVL(V_TAB_PRODUTOS.FIRST,1) .. NVL(V_TAB_PRODUTOS.LAST,0) LOOP 
    	  -- A CADA ITERAÇÃO ADICIONA UMA LINHA NO RECORD GROUPO DE PRODUTOS 
				ADD_GROUP_ROW        (RG_GRUPO_PRODUTO      , V_IND); 
        -- ADICIONA AS COLUNAS NA LINHA CRIADA CONFORME O TIPO DE DADOS 
				SET_GROUP_NUMBER_CELL(CD_PRODUTO               , V_IND,	V_TAB_PRODUTOS(V_IND).CD_PRODUTO                     );		 
				SET_GROUP_CHAR_CELL  (NM_PRODUTO               , V_IND,	V_TAB_PRODUTOS(V_IND).NM_PRODUTO                     ); 
				SET_GROUP_NUMBER_CELL(VL_COMPRA                , V_IND,	V_TAB_PRODUTOS(V_IND).VL_COMPRA                      ); 
				SET_GROUP_NUMBER_CELL(VL_VENDA                 , V_IND,	V_TAB_PRODUTOS(V_IND).VL_VENDA                       ); 
				SET_GROUP_NUMBER_CELL(QT_PRODUTO               , V_IND,	V_TAB_PRODUTOS(V_IND).QT_PRODUTO                     ); 
				SET_GROUP_DATE_CELL  (DT_ATUALIZACAO           , V_IND,	V_TAB_PRODUTOS(V_IND).DT_ATUALIZACAO                 );		 
				SET_GROUP_CHAR_CELL  (NM_USUARIO_ATUALIZACAO   , V_IND,	V_TAB_PRODUTOS(V_IND).NM_USUARIO_ATUALIZACAO         ); 
				-- 
    END LOOP; 
    -- CRIAR LISTA DE PARAMETROS PARA O REPORT 
    LISTA_PARAMETROS := GET_PARAMETER_LIST('TMPDATA'); 
    -- 
    IF NOT ID_NULL(LISTA_PARAMETROS) THEN 
        DESTROY_PARAMETER_LIST(LISTA_PARAMETROS); 
    END IF;	 
    -- 
    LISTA_PARAMETROS := CREATE_PARAMETER_LIST('TMPDATA'); 
    -- 
    ADD_PARAMETER(LISTA_PARAMETROS, 'PARAMFORM' , TEXT_PARAMETER, 'NO');        
    -- REFERENCIA O RECORD GROUP PRODUTO A Q_1 - QUERY DO REPORT	          
		ADD_PARAMETER(LISTA_PARAMETROS, 'Q_1'         , DATA_PARAMETER, 'PRODUTO'); 
		-- CHAMA O RELATORIO 
		RUN_PRODUCT(REPORTS, 'C:\Documents and Settings\Administrador\Desktop\RELATORIO.REP', SYNCHRONOUS, RUNTIME, FILESYSTEM, LISTA_PARAMETROS, NULL); 
		-- 
		DESTROY_PARAMETER_LIST(LISTA_PARAMETROS); 
		--     
EXCEPTION 
		WHEN	FORM_TRIGGER_FAILURE	THEN 
					RAISE;    	 
		WHEN	OTHERS THEN 
		    	MESSAGE('Erro ao gerar o relatório. Erro: ' || SQLERRM); 
		    	MESSAGE('Erro ao gerar o relatório. Erro: ' || SQLERRM); 
		    	RAISE FORM_TRIGGER_FAILURE;    	 
END; 
 
4. In Reports Create a Query by attending the name of the columns, which must be identical to the name, type and size of the Type columns.
5. Query name should also be the same as used in Forms. (Q_1).
6. In the Reports Query a SELECT should be done in the dual table according to the rules below:
• For Char speakers, Varchar, Varchar2 Spaces or letters should be placed as the column size. Ex: VARCHAR2 (5) select ‘ ’ <COLUNA_TYPE> from dual
or select ‘AAAAA’ <COLUNA_TYPE> from dual
• For columns of the Number type, the number 0 shall be placed select 0 <COLUNA_TYPE> from dual
• For Date columns, the SYSDATE statement must be placed. select SYSDATE <COLUNA_TYPE> from dual

7. The query of the report is as follows:

Select all

 
 
SELECT	0		CD_PRODUTO, 
	'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
	AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
	AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
	AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
	AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'	NM_PRODUTO, 
	0		VL_VENDA, 
	0		VL_COMPRA, 
	0		QT_PRODUTO, 
	SYSDATE	DT_ATUALIZACAO, 
	'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'	NM_USUARIO_ATUALIZACAO 
FROM 	DUAL 
 
8. Ready now just make the appropriate adjustments in the report as usual (breaks, formulás, etc.).

doubts

r.nevesbraga@gmail.com
Diego_Mello
Rank: DBA Júnior
Rank: DBA Júnior
Posts: 229
Joined: Fri, 05 Sep 2008 2:59 pm
Location: Igrejinha - RS
Diego Mello
Igrejinha - RS
www.twitter.com/diegolmello

Speak, Ricards! Blza?
Face, just a tip ... more! : P

Instead of using:

Select all

 
select ‘AAAAA’ <COLUNA_TYPE> from dual  
Use:

Select all

 
SELECT RPAD(' ', 5) < coluna_type > 
  FROM dual 
More Easy to understand if you have a field of many characters. : D
Renan Orati
Rank: Analista Júnior
Rank: Analista Júnior
Posts: 90
Joined: Thu, 23 Aug 2007 3:40 pm
Location: São José do Rio Preto - SP

Good morning to all,

Is it possible to use the record of Record_Group to Reports in 10G version?!
I am trying and is returning the following error:
REP-53053: Invalid arguments for function call
VLW!
Post Reply
  • Information
  • Who is online

    Users browsing this forum: No registered users and 11 guests