13 sep 2010

cfc Genera Select dínamico

Coldfusion es un lenguaje de programación de páginas web, está desarrollado por Adobe. Me he metido un poco a programar bajo coldfusion y me he topado con muchas ventajas, a continuación describo un cfc (coldfusion component) que me paso un compañero de trabajo, es muy útil para poder programar de manera rápida y efectiva parte de un formulario.
Si en nuestro formulario tenemos inputs de tipo select y estos los llenamos con catálogos que tenemos en una base de datos, podremos hacer uso de esta función sin necesidad de hacer otra cosa mas que invocarla y como es un componente dinámico, podemos configurarlo dependiendo de que parámetros le enviemos.




<!---NOTA: Silos querys son complejos (en el select hay case o condiciones CREAR UNA VISTA--->
<cfcomponent displayname="Generar Select" hint="Crea un cfselect a partir de una tabla y dos campos" output="true">
<cffunction name="crearSelect" displayname="Init" hint="Constructor" access="public" output="true" returntype="any">
<!---
Recibo la tabla,los campos que se incluiran en el display del select y la expresion de filtro opcional.
Hago un query con los campos pasados.
Concateno los campos del query.
Despliego el cfselect. --->
<cfargument name="tabla" required="true" hint="Tabla sobre la que se crea el cfselect" displayname="Tabla" type="string" />
<cfargument name="campos" required="true" hint="La lista de campos a concatenar" displayname="Campos" type="string" />
<cfargument name="nombre" required="false" hint="El nombre que tendra el select" displayname="Nombre" type="string" />
<cfargument name="valor" required="true" hint="El campo que llenara el valor del select" displayname="Valor" type="string" />
<cfargument name="desplegar" required="false" hint="El campo que se desplegara en el select" displayname="Desplegar" type="string" />
<cfargument name="filtro" required="false" hint="La expresion de filtro para el query" displayname="Filtro" type="string" />
<cfargument name="ordenar" required="false" hint="Ordenar" displayname="ordenar" type="string" />
<cfargument name="onChangeScript" required="false" hint="El script que se usara en el evento onchage" displayname="OnChange Script" type="string" default="" />
<cfargument name="estilo" required="false" displayname="Estilo" type="string" default="" />
<cfargument name="agregarBlanco" required="false" displayname="Agregar Blanco" hint="Determina si agrega un registro en blanco al query" default="true" />
<cfargument name="seleccionado" required="false" displayname="Seleccionado" hint="Determina la opcion seleccionada" default=""/>
<cfargument name="listaFiltrado" required="false" displayname="Lista de Filtrado" hint="Es una lista que incluye los codigos a excluir">
<cfargument name="soloLectura" required="false" default="false" displayname="Solo lectura" hint="Determina si el control es de solo lectura" />
<cfargument name="distinct" required="false" default="false" displayname="Distinct" hint="Booleano que si es verdadero se agrega la clausula distinct a la expresion de consulta" />
<cfargument name="textoSeleccione" required="false" default="Seleccione..." displayname="Texto Seleccione" hint="Si se pasa sustituye el texto Seleccione... de la opcion en blanco" />
<cfargument name="dSource" required="false" default="#application.basedatos#" type="string" displayname="Data source" />

<cfset var qCampos = "" />
<cfset var expresion = "" />
<cfset var i = "" />
<cfset var j = 1 />
<cfif ListLen(arguments.campos) EQ 1>
<cfset expresion = arguments.campos & " AS elcampo" />
<cfelse>
<cfloop list="#arguments.campos#" index="i">
<cfset "campo#j#" = i />
<cfset j = j + 1 />
</cfloop>
</cfif>
<cfquery datasource="#arguments.dSource#" name="qCampos">
SELECT <cfif arguments.distinct EQ true>DISTINCT</cfif> #arguments.campos#
FROM #arguments.tabla#
WHERE 0 = 0
<cfif IsDefined('arguments.listaFiltrado') AND arguments.listaFiltrado NEQ ''>
AND #arguments.valor# NOT IN(#PreserveSingleQuotes(arguments.listaFiltrado)#)
</cfif>
<cfif IsDefined('arguments.filtro') AND arguments.filtro NEQ ''>
AND #URLDecode(PreserveSingleQuotes(arguments.filtro))#
</cfif>
<cfif IsDefined('arguments.ordenar') AND arguments.ordenar NEQ ''>
ORDER BY #arguments.ordenar#
</cfif>
</cfquery>
<cfif agregarBlanco EQ true>
<cfset temp = QueryAddRow(qCampos,1) />
<cfset j = 1 />
<cfloop list="#arguments.campos#" index="i">
<cfif j EQ 1>
<cfset temp = QuerySetCell(qCampos,i,arguments.textoSeleccione) />
<cfset j = j + 1 />
<cfelse>
<cfset temp = QuerySetCell(qCampos,i,'') />
<cfset j = j + 1 />
</cfif>
</cfloop>

</cfif>
<!--- ---------------------------------- --->
<select name="#arguments.nombre#" onchange="#arguments.onChangeScript#" class="#arguments.estilo#" id="#arguments.nombre#" <cfif arguments.soloLectura EQ true>disabled</cfif>>
<cfoutput query="qCampos">
<cfif IsDefined('arguments.desplegar')>
<cfset expresionDisplay = Evaluate('qCampos.#arguments.desplegar#') />
<cfelseif ListLen(arguments.campos) EQ 1>
<cfset expresionDisplay = Evaluate('qCampos.#arguments.campos#') />
<cfelse>
<cfset expresionDisplay = Evaluate('qCampos.#campo1#') & " - " & Evaluate('qCampos.#campo2#') />
</cfif>
<cfset expresionValor = "qCampos."&arguments.valor>
<cfif expresionDisplay NEQ ''>
<option value="#Evaluate(expresionValor)#" <cfif Evaluate(expresionValor) EQ arguments.seleccionado>selected</cfif>>#expresionDisplay#</option>
</cfif>
</cfoutput>
</select>

<cfreturn />
</cffunction>
</cfcomponent>

No hay comentarios.: