The following CFC implements a simple employee phone directory lookup application. The user sends an message containing some part of the name to be looked up (a space requests all names). The onIncomingMessage response depends on the number matches.
The following listing shows the CFC code:
<cfcomponent> <cffunction name="onIncomingMessage"> <cfargument name="CFEvent" type="struct" required="YES"> <!--- Remove any extra white space from the message. ---> <cfset message =Trim(arguments.CFEvent.data.MESSAGE)> <!--- If the message is numeric, a previous search probably returned a list of names. Get the name to search for from the name list stored in the Session scope. ---> <cfif isNumeric(message)> <cfscript> if (structKeyExists(session.users, val(message))) { message = session.users[val(message)]; } </cfscript> </cfif> <!--- Search the database for the requested name. ---> <cfquery name="employees" datasource="cfdocexamples"> select FirstName, LastName, Department, Phone from Employees where 0 = 0 <!--- A space indicates the user entered a first and last name. ---> <cfif listlen(message, " ") eq 2> and FirstName like '#listFirst(message, " ")#%' and LastName like '#listlast(message, " ")#%' <!--- No space: the user entered a first or a last name. ---> <cfelse> and (FirstName like '#listFirst(message, " ")#%' or LastName like '#listFirst(message, " ")#%') </cfif> </cfquery> <!--- Generate andreturn the message.---> <cfscript> returnVal = structNew(); returnVal.command = "submit"; returnVal.sourceAddress = arguments.CFEVENT.gatewayid; returnVal.destAddress = arguments.CFEVENT.originatorid; //No records were found. if (employees.recordCount eq 0) { returnVal.shortMessage = "No records found for '#message#'"; } //One record was found. else if (employees.recordCount eq 1) { // Whitespace in the message text results in bad formatting, // so the source cannot be indented. returnVal.shortMessage = "Requested information: #employees.firstName# #employees.lastName# #employees.Department# #employees.Phone#"; } //Multiple possibilities were found. else if (employees.recordCount gt 1) { //If more than ten were found, return only the first ten. if (employees.recordCount gt 10) { returnVal.shortMessage = "First 10 of #employees.recordCount# records"; }else{ returnVal.shortMessage = "Records found: #employees.recordCount#"; } // The session.users structure contains the found names. // The record key is a number that is also returned in front of the // name in the message. session.users = structNew(); for(i=1; i lte min(10, employees.recordCount); i=i+1) { // These two lines are formatted to prevent extra white space. returnVal.shortMessage = returnVal.shortMessage & " #i# - #employees.firstName[i]# #employees.lastName[i]#"; // The following two lines must be a single line in the source session.users[i]="#employees.firstName[i]# #employees.lastName[i]#"; } } return returnVal; </cfscript> </cffunction> </cfcomponent>