This CF Function is getting a timeout error. It's executed in a page that has more stuff going on. Is there a more efficient way to rewrite this function?
<cffunction name="GetTheSerialNumber" access="remote" returnformat="plain" returntype="string" output="no">
<cfargument name="term" required="yes" />
<cfsetting requesttimeout="20"/>
<cfif NOT IsDefined("session.LoggedIn")>
<cfabort />
</cfif>
<cfquery name="GetSerialNumber" datasource="#application.datasource#">
SELECT [serialNum]
,MissionAsset.MissionAssetID
,MissionAssetDescription
,ESN.EfracusSerialNumberID
FROM MissionAsset
LEFT JOIN EfracusSerialNumber ESN ON MissionAsset.MissionAssetID = ESN.MissionAssetID
WHERE MissionAsset.isActive = <cfqueryparam value="1" cfsqltype="cf_sql_bit">
AND serialNum LIKE <cfqueryparam value="%#arguments.term#%" cfsqltype="cf_sql_varchar">
AND MissionAssetStatusID IN (2,3,4,5,6)
ORDER BY serialNum
</cfquery>
<cfset stcReturn = '['>
<cfloop query="GetSerialNumber">
<cfset stcReturn &= '{"label":"#GetSerialNumber.serialNum#", "value":"#GetSerialNumber.serialNum#", "missionAssetID": "#GetSerialNumber.MissionAssetID#", "missionAssetDescription": "#GetSerialNumber.MissionAssetDescription#", "ID" : "#GetSerialNumber.EfracusSerialNumberID#"}'>
<cfif GetSerialNumber.CurrentRow NEQ GetSerialNumber.RecordCount>
<cfset stcReturn &= ",">
<cfelse>
<cfset stcReturn &= "]">
</cfif>
</cfloop>
<cfreturn stcReturn>
</cffunction>
Update: I took some of the suggestions below and optimized the function without having to change any of the front end. This is what we have now. Thanks!
<cffunction name="GetTheSerialNumber" access="remote" returnformat="plain" returntype="string" output="no">
<cfargument name="term" required="yes">
<cfsetting requesttimeout="20"/>
<cfif NOT IsDefined("session.LoggedIn")>
<cfabort />
</cfif>
<cfquery name="GetSerialNumber" datasource="#application.datasource#">
SELECT [serialNum] as LabelValue, MissionAsset.MissionAssetID as MAID, MissionAssetDescription as MAD, ESN.EfracusSerialNumberID as ESNID
FROM MissionAsset
LEFT JOIN EfracusSerialNumber ESN ON MissionAsset.MissionAssetID = ESN.MissionAssetID
WHERE MissionAsset.isActive = <cfqueryparam cfsqltype="cf_sql_bit" value="1">
AND serialNum LIKE <cfqueryparam cfsqltype="cf_sql_varchar" value="%#arguments.term#%">
AND MissionAssetStatusID IN (2,3,4,5,6)
ORDER BY LabelValue
</cfquery>
<cfset stcReturn = '['>
<cfloop query="GetSerialNumber" >
<cfset stcReturn &= '{"label":"#LabelValue#", "value":"#LabelValue#", "missionAssetID": "#MAID#", "missionAssetDescription": "#MAD#", "ID" : "#ESNID#"}'>
<cfif GetSerialNumber.CurrentRow NEQ GetSerialNumber.RecordCount>
<cfset stcReturn &= ",">
</cfif>
</cfloop>
<cfset stcReturn &= ']'>
<cfreturn stcReturn>
</cffunction>