Construindo Tabelas Através De QueriesE 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!!!