Conheça também: Onmasters . Ofertas . Divulgue! . Vai.la . Geraboleto . Baixa.la . Assista.la . Joga.la
» Início » Programação » ColdFusion » Construindo Tabelas Através De Queries -->
 
Avaliação: | Publicado em: 06/11/2006
Construindo Tabelas Através De Queries
Landjunior Passos Desenvolvedor de sistemas desktop e soluções web, atua na área de Sistemas Internos Gerencias junto a Getnet – Tecnologia em Captura e Processamento de Dados. Ministrou cursos na área de desenvolvimento web e atuou como Designer Gráfico.


E aí galera do Plugmasters? Tudo beleza? Depois das Dicas de Coldfusion, vamos colocar a mão na massa e trabalhar com queries, lista de dados e uma pincelada de expressões regulares. Vamos lá!!!

Título: Construindo Tabelas Através De Queries
Softwares: Coldfusion 6, Dreamweaver 7
Som: Matisyahu - King Without A Crown

Freqüentemente se faz necessário a geração de relatórios ou apresentação de dados tabulares, onde em sua maioria acabamos montando as informações "no braço", ou seja, realizamos as consultas SQL e iniciamos o loop da query, construindo a tabela linha a linha. Essa rotina pode ser otimizada através de uma função que execute a ação de transcrever os dados carregados em forma de tabela.


Pensando Na Função

1 - A função receberá uma query ou instrução SQL como fonte de dados da tabela.
2 - A rotina deve prever a trocar dos nomes das colunas, a fim de facilitar a compreensão das informações apresentadas.
3 - A tabela poderá receber um identificador e/ou classe.


Ponderações

1 - Por default a lista das colunas de uma query é apresentada em ordem alfabética e por isso, será necessário definirmos a ordem de apresentação das mesmas.
2 - Para tornar a função mais flexível, possibilitando a reutilização de queries, devemos considerar que nem todas as colunas serão exibidas.


A Função buildTable

1  <cffunction name="buildTable" access="public" output="true" returntype="any">
2     
<!--- Argumentos utilizados pela função --->
3      <cfargument name="query" type="any"  required="yes">
4      <cfargument name="columns" type="string" required="no" default="">
5   
6     
<!--- Caso não seja do tipo query, tenta executa como instrução SQL --->
7      <cfif not isQuery(query)>
8          <cfquery datasource="appWeb" dbtype="odbc" name="selQuery
">
9               #replace(query, "''", "'", "ALL")#
10       
</cfquery>
11        <cfset query = selQuery>
12    </cfif>
13  
14   
 <!--- Seta as variaveis necessárias para montar a tabela de dados --->
15    <cfset lColumns   = trim(ucase(query.columnList))>
16    <cfset columns    = iif(trim(columns) eq "", "lColumns", "columns")>
17    <cfset sTitleColumns = "">  
18    <cfset sCellColumns  = "">
19    
20   
<!--- Executa o Loop de Validação e Organização das Colunas da Tabela --->
21    <cfloop index="i" list="#columns#" delimiters=",">
22       <cfset sColumn = ucase(trim(REReplace(i, "\[.*\]", "", "ALL")))>
23       <cfif listFind(lColumns,sColumn)>
24           <cfset sCellColumns = sCellColumns & "<td>##" & sColumn & "##</td>"
>
25           <cfset sLabel            = REReplace(i, "(.*\[)|(\].*)", "", "ALL")
>
26           <cfset sTitleColumns = sTitleColumns &"<th>"& iif(trim(sLabel) eq "","sColumn","sLabel") &"</th>"
>
27      
</cfif>
28    </cfloop>
29  
30   
<!--- Monta a Tabela com Base nas Colunas validadas --->
31    <table cellpadding="0" cellspacing="0">
32        #sTitleColumns#
33        <cfloop query="query
">
34            <tr>#evaluate(de(sCellColumns))#</tr>
35        </cfloop>
36    </table>
37 
</cffunction>


Linha 3:
Declaração do argumento que receberá uma query ou string com instruções SQL.
Linha 4: Argumento que receberá uma lista delimitada por virgulas (,) com os nomes das colunas que serão exibidas, onde a ordem da lista corresponde à ordem das colunas da tabela. O alias das colunas deve ser inserido entre colchetes ao lado da identificação da mesma.

Exemplo:
 columns = "cd_produto[Código], ds_produto[Produto],vl_venda[Preço]"


Linha 7 a 12: Caso o argumento não seja uma query, interpreta-o como instrução SQL e tenta carregar as informações do banco de dados. Este mecanismo possibilita a geração da informação de forma sucinta, além de permitir a reutilização de queries, traduzindo, podemos realizar a query previamente ou apenas passar o select que a função se encarregará do resto.

Exemplo:
 query = sel_dados
 ou
 query = "select cd_produto, ds_produto, vl_venda from PRODUTO"


Linha 15: Através do comando columnList, setamos em forma de lista de dados os nomes das colunas que compõem a query.
 
Exemplo:
 CD_PRODUTO,DS_PRODUTO,VL_VENDA


Linha 16: Caso o argumento columns não seja informado na execução da função, o mesmo receberá a identificação de todas as colunas da query.
Linha 17: Set da variável que receberá as descrições das colunas das tabelas.

Exemplo:
 Para columns = "cd_produto[Código], ds_produto[Produto],vl_venda[Preço]"
 sTitleColumns = "<th>Código</th><th>Produto</th><th>Preço</th>"


Linha 18: Set da variável que receberá a concatenação das células da tabela.

Exemplo:
 Para columns  = "cd_produto[Código], ds_produto[Produto],vl_venda[Preço]"
 sCellColumns = "<td>#cd_produto#</td><td>#ds_produto#</td><td>#vl_venda#</td>"


Linha 21 à 28: Percorre a lista columns validando se o item atual corresponde a coluna da query, além de setar o alias cada coluna válida.
Linha 22: Remove a descrição da coluna, deixando apenas a referencia SQL da query.

Exemplo:
 cd_produto[Código] => CD_PRODUTO
 ds_produto[Produto] => DS_PRODUTO
 vl_venda[Preço]  => VL_VENDA


Linha 23: Verifica se sColumn existe na lista de colunas da query.

Exemplo:
 lColumns = CD_PRODUTO,DS_PRODUTO,VL_VENDA
 sColumn  = CD_PRODUTO


Linha 25: Remove a referencia SQL da coluna, deixando apenas o alias correspondente.

Exemplo:
 cd_produto[Código] => Código
 ds_produto[Produto] => Produto
 vl_venda[Preço]  => Preço


Linha 31 a 36: Inicia a construção da tabela, considerando que:

1 - sTitleColumns possui a string HTML dos títulos das colunas da tabela.
2 - sCellColumns possui a string HTML das células e variáveis coldfusion que compõe a linha da tabela.


Utilizando a Função

Os exemplos a seguir mostram como a função pode ser utilizada para realizar a geração de tabela de dados.
 
Exemplo 1:
 Você deseja exibir a lista dos produtos e seus respectivos preços de vendas.

<!--- Construção da Tabela do Exemplo 1 --->
<cfoutput>
   #buildTable("select ds_produto, vl_venda from PRODUTO", "ds_produto[Produto],vl_venda[Preço]")#
</cfoutput>


Exemplo 2:
 Você já possui uma query com as informações dos produtos que serão exibidos e deseja montar uma tabela exibindo apenas o código e nome do produto.

<!--- Select das informações dos PRODUTOS (Exemplo 2) --->
<cfquery datasource="appWeb" dbtype="odbc" name="selProdutos">
   select  cd_produto,
              ds_produto,
              cd_fornecedor,
              vl_compra,
              vl_venda,
              cd_estoque
   from     PRODUTO
</cfquery>

<!--- Construção da Tabela do Exemplo 2 --->
<cfoutput>
   #buildTable(selProdutos, "cd_produto[Código],ds_produto[Produto]")#
</cfoutput>


Bem pessoal, vou finalizando por aqui  e espero que tenham gostado. Vale reforçar que este é um exemplo simples e que obviamente para atender a demanda do dia a dia deve ser incrementado. Até a próxima!!!

Arquivos anexos ao artigo
Artigos relacionados

Muito legal mesmo!!! As vezes acabamos complicando as coisas, e não é por aí!!!!Espero mais artigos sobre esse assunto.
Muito bom o artigo, tanto é que estou implementando umas funções WEB no meu trabalho e estou me baseando nesses exemplos.
Cara, grande sacada esse artigo! Você poderia criar uma sequencia de artigos relacionados ao assunto... Assim a gente teria uma mini biblioteca!