profile="http://gmpg.org/xfn/11"> Creando una aplicación de números aleatorios de forma fácil en ColdFusion — AUGE - Adobe User Group Ecuador beta 0.1

AUGE - Adobe User Group Ecuador beta 0.1

Adobe User Group Ecuador

AUGE - Adobe User Group Ecuador  beta 0.1

Creando una aplicación de números aleatorios de forma fácil en ColdFusion

September 4, 2010 · 4 Comments

El pasado 28 de Agosto mientras realizábamos el sorteo para repartir los regalos que Video2Brain, Adobe y TechSmith nos habían dado para entregar ese día a los asistentes del BarCamp Santa Elena, ocurrió lo que a nosotros en AUGE nos ha ocurrido cada vez que deseamos hacer un sorteo usando Random.org, fue un fail total.

Random.org todas las veces que lo he visto ser usado y que lo hemos usado, tiene la falencia de que o los números se repiten, o la aleatoriedad parece muy lineal, ese día se me ocurrió que sería una buena forma de mostrar lo fácil y poderoso que es ColdFusion escribiendo unas líneas de código para emular lo que ofrece Random.org, pero agregando ciertas funciones para evitar que por ejemplo un mismo número se repitiera.

Este un ejemplo muy básico, que sin duda puede ser mejorado, se le puede agregar mucha funcionalidad, se puede usar AJAX para evitar las recargas de página, pero en vista de mantener la simplicidad, lo deje así.

¿Cómo funciona?

Básicamente un usuario ingresa su e-mail que puede ser cambiado por el nombre o eliminado también, un numero desde y un número hasta que son los que dictaran el rango en que un número aleatorio será escogido.

Una vez ingresados estos datos correctamente, se crea una sesión de ColdFusion que almacenará ciertos datos temporales hasta que el usuario escoja empezar otra selección, o cierre el navegador, o pasen 30 minutos, lo primero de esto que suceda y el proceso volverá a empezar. Una vez que se crea la sesión, se escoge un numero aleatoriamente, este número es validado contra un registro en la Base de Datos usando Stored Procedures, si no es encontrado se lo muestra en pantalla, sino se vuelve a escoger otro número se vuelve a verificar y así el proceso continua hasta que un número que no haya aparecido antes sea escogido por RandRange.


Adicionalmente para demostrar otra característica realmente útil de ColdFusion, la creación de PDFs, agregue un botón para imprimir la lista de números ganadores si así se desea.

Y otro botón para empezar otro “sorteo”.

 

Código

Este es el código.

Random.cfm

Este archivo es el que crea la mini aplicación de números aleatorios.

    <!--- Defino mi DataSource y ajusto valores predeterminados para las variables de la aplicación --->
    <cfset dS="miDNS">
    <cfparam name="URL.q" default="">
    <cfparam name="FORM.email" type="any" default="" />
    <cfparam name="FORM.desde" type="numeric" default=0 />
    <cfparam name="FORM.hasta" type="numeric" default=0 />
    
    
    <!--- Si se pasa el parámetro new, borrar la sesión para comenzar una nueva sesión de números aleatorios --->
    <cfif URL.q EQ "new">
        <cfset structDelete(session,'myRandNumber')>
    </cfif>
    
    <!--- Si se paso un email o si ya existe una sesión en progreso --->
    <cfif FORM.email NEQ "" or IsDefined ("session.myRandNumber")>
        
        <!--- Si no está definida una sesión la primera vez crearla. --->
        <cfif not IsDefined("session.myRandNumber")>
            
            <cfset session.myRandNumber=StructNew()>
            <cfset session.myRandNumber.desde=FORM.desde>
            <cfset session.myRandNumber.hasta=FORM.hasta>
            <cfset session.myRandNumber.email=FORM.email> 
            <cfset session.myRandNumber.GUID=#CreateUUID()#>
            <cfset session.myRandNumber.diferencia=session.myRandNumber.hasta-session.myRandNumber.desde>
            <cfset session.myRandNumber.counter=0>
            
            
        </cfif>
         
        <!--- dummyVar me servirá para saber cuando salir del bucle que revisa si un número ya ha salido antes. --->
        <cfset dummyVar=0 />
        
        <!--- El número aleatorio que saldrá en pantalla. --->
        <cfset myRandomNumber=0>
        
        
        <!--- Esta pregunta me permite saber si ya he alcanzado el número máximo de iteraciones en el rango dado. --->
        <cfif session.myRandNumber.counter GT session.myRandNumber.diferencia>
                <cfset dummyVar=2 />
         </cfif>
        
        <cfloop condition="dummyVar EQ 0">
        
            <!--- RandRange escoge un número aleatorio dentro de un rango pasado. --->
            <cfset myRandomNumber=RandRange(session.myRandNumber.desde,session.myRandNumber.hasta) />
            
            
            <!--- Llamada a un procedimiento almacenado que verifica que el número aleatorio no haya salido previamente--->
            <cfstoredproc procedure="readRandomNumber" datasource="#dS#" >
            
                <cfprocparam cfsqltype="cf_sql_varchar" value="#session.myRandNumber.GUID#" />                
                <cfprocparam cfsqltype="cf_sql_double" value="#myRandomNumber#" />
                
                <cfprocresult name="mySpResult">
                
            </cfstoredproc>
            
            
            <!--- Si no se encontro el número salir de bucle, caso contrario seguir iterando.--->
            <cfif (mySpResult.recordCount EQ 0)>
                <cfset dummyVar=1 />
                <cfset session.myRandNumber.counter += 1 >
            </cfif>
        </cfloop>
        
        
        <!--- SP para listar los números escogidos anteriormente. --->
        <cfstoredproc procedure="readRandomNumberByCFID" datasource="#dS#">
        
            <cfprocparam cfsqltype="cf_sql_varchar" value="#session.myRandNumber.GUID#" />                
            <cfprocparam cfsqltype="cf_sql_double" value="#myRandomNumber#" />
            
            <cfprocresult name="mySpReadAll" />
            
        </cfstoredproc>
        
        
        <!--- Ingresar el número a BD si no existe en la sesión actual. --->
         <cfif dummyVar EQ 1>        
        
            <cfstoredproc procedure="writeRandomNumber" datasource="#dS#">
            
                <cfprocparam cfsqltype="cf_sql_varchar" value="#session.myRandNumber.GUID#" />                
                <cfprocparam cfsqltype="cf_sql_numeric" value="#myRandomNumber#" />
                
            </cfstoredproc>
            
        <cfelse>
            
            <!--- Se ha alcanzado el limite de posibles iteraciones en la serie. --->
            <h3>Se ha alcanzado el m&aacute;ximo n&uacute;mero de posibilidades</h3>
        
        </cfif>
        
        <!--- Muestra en pantalla los datos ingresado y el último número aleatorio de ser el caso. --->
        <cfoutput>
            <strong>Email: </strong>
            #session.myRandNumber.email# <br />
            <strong>Desde: </strong>
            #session.myRandNumber.desde# <br />
            <strong>Hasta: </strong>
            #session.myRandNumber.hasta# <br />
            <cfif dummyVar NEQ 2>
                <strong>Ganador: </strong> 
                #myRandomNumber#
            </cfif>
            <br />
            <br />
        </cfoutput>
        
        <!--- Si se presiona este boton se creará un archivo PDF con los números aleatorios que se han seleccionado de la serie. --->
        <cfform action="print.cfm" name="myRandomForm">
            <cfinput type="submit" value="Imprimir resultados" name="print"  />
        </cfform>
        
        <!--- Para seleccionar otro número--->
        <cfform action="#cgi.SCRIPT_NAME##cgi.PATH_INFO#" name="myRandomForm">
            <cfinput type="submit" value="Volver a sortear" name="submitAgain"  />
        </cfform>
  
        <!--- Para cerrar la sesión actual --->
        <cfform action="#cgi.SCRIPT_NAME##cgi.PATH_INFO#?q=new">
            <cfinput type="submit" name="submitNew" value="Nuevo sorteo">
         </cfform>
         
         <!--- Muestra los números que hayan sido escogidos previamente --->   
         <br />
        Ganadores previos: <br />
        <cfoutput query="mySpReadAll">
            #numero# <br />
        </cfoutput>
        
    <cfelse>
        
        <!--- Crear el formulario para el ingreso de los datos --->
        <cfform action="#cgi.SCRIPT_NAME##cgi.PATH_INFO#" format="html">
            E-mail:
            <cfinput type="text" label="E-mail:" 
            name="email" 
            required="true" 
            title="email"
            validate="email"
            message="Debe ingresar un e-mail valido:"
            validateat="onserver,onsubmit"
            width="150"/>
            <br>
            Desde:
            <cfinput type="text" label="Desde" name="desde"
            validate="integer"
            validateat="onsubmit,onserver"
            required="true"
            title="desde"
            message="Debe ingresar un valor desde numerico"
            width="100" />
            <br>
            Hasta:
            <cfinput type="text" label="Hasta" name="hasta"
            validate="integer"
            required="true"
            title="hasta"
            validateat="onsubmit,onserver"
            message="Debe ingresar un valor hasta numerico"
            width="100" />
            <br>
            <cfinput type="submit" name="submit" value="## aleatorio" />
        </cfform>
     </cfif>
    
  

Print.cfm

Este archivo es el que se encarga de crear el PDF.



<cfset dS="miDSN">

<!--- Recupera el listado de números escodigos --->
<cfstoredproc procedure="readRandomNumberByCFID" datasource="#ds#">
        
    <cfprocparam cfsqltype="cf_sql_varchar" value="#session.myRandNumber.GUID#" />                
    <cfprocparam cfsqltype="cf_sql_double" value="0" />
    
    <cfprocresult name="mySpReadAll" />
    
</cfstoredproc>


<!--- Crea el PDF --->
<cfdocument format="pdf">
    <a href="http://auge.ec">
     <h2>Adobe User Group Ecuador</h2></a>
    <h3>Listado de n&uacute;meros ganadores:</h3>
    <p>
     <cfoutput query="mySpReadAll">
        #numero#<br>
     </cfoutput>
    </p>
     <a href="http://auge.ec">
     <img src="http://auge.ec/skins/auge/assets/images/header-bg.jpg" /></a>
</cfdocument>


Application.cfc

Y el archivo Application.cfc que define parámetros generales de la aplicación.



<!--
Archivo: Application.cfc (El componente "Application")
Creado por: Michael Borbor (mabs@auge.ec)
Proposito: Definir constantes y ajustes generales para la aplicación.
-->

<cfcomponent output="no">

    <cfset this.name="RandomMejorado">
    
    <cfset this.sessionTimeOut="#createTimeSpan(0,0,30,0)#" >
    
    <cfset this.sessionManagement="true" />
        

</cfcomponent>



Si desean pueden descargarse el código aquí.

 

Bookmark and Share

Tags: ColdFusion

4 responses so far ↓

  • 1 Irvin // Nov 18, 2012 at 6:28 PM

    que buen ejemplo pero quiisiera probar el el programa y el link de descarga esta deshabilitado podrian reactivarlo para ver como funciona el programa? muchas gracias
  • 2 Michael Borbor // Nov 18, 2012 at 7:15 PM

    Es fácil re-crear la aplicación si copias el código fuente en una misma carpeta, y creas los archivos usando los nombres de archivos sugeridos.
  • 3 Irvin // Nov 18, 2012 at 8:14 PM

    si esq recien estoy aprendiendo a usar el coldfusion y ya hice lo q me dijiste pero necesito crear un servidor para correr la aplicacion pero no se como hacerlo he buscado en internet pero no logro hacer q funcione
  • 4 Michael Borbor // Nov 18, 2012 at 8:25 PM

    Ah pues es sencillo, solo necesitar descargar ColdFusion, luego instalarlo, y al momento de instalarlo configurarlo para que use su servidor de aplicaciones web incorporado. Luego navegar hasta la carpeta wwwroot y dentro de esta crear una carpeta donde incluyas los archivos mencionados en el ejemplo. Y luego navegar hasta la url de la aplicación si usas los valores por defecto esta sería http://localhost:8500/tudirectorio/tuarchivo.cfm

Leave a Comment

Leave this field empty: