首先,我不仅仅是SO的新手,但我对任何类型的网络编程都是全新的,所以全新的,感谢您的帮助和耐心!所以,之前没有使用过HTML,ColdFusion,SQL,SQL Server等的经验,所以我在过去两周内学到了很多东西。
我正在尝试在ColdFusion中创建3个动态相关下拉菜单(三个相关选择),最终最终在另一个.CFM页面中打开一个地图。下拉列表从SQL Server中的一个表填充。 我已经做了很多研究(这里有SO和其他地方),我有一个主要工作的方法,但它有一个问题,我很乐意帮助弄清楚为什么有一件事不起作用。我正在使用.CFC查询数据库中每个下拉菜单的信息,我正在尝试使每个依赖于前一个,然后在.CFM我使用“绑定”。这是我的CFC和CFM代码:
CFC(名为GettingData):
<cfcomponent displayname="GetStuff" hint="Getting data on cruises from database">
<!---GET ARRAY OF TRIBUTARIES--->
<cffunction name="getData" access="remote" returntype="query" hint="Get data for first select">
<!---define variables--->
<cfset var data="tributary">
<!---Run the query for tributaries--->
<cfquery name="data" datasource="mydatasource">
SELECT distinct Tributary
FROM df_cruises
ORDER BY Tributary
</cfquery>
<!---and return it--->
<cfreturn data>
</cffunction>
<!---Get DATES by tributary--->
<cffunction name="getDates" access="remote" returntype="query"
hint="Get cruise dates by tributary for select dropdown">
<cfargument name="Tributary" type="any" required="no">
<!---Define variables--->
<cfset var data="CruiseDate">
<!---Run query to get Date Data--->
<cfquery name="data" datasource="mydatasource">
SELECT *, CruiseDate AS date <!---this gets date to display correctly in dropdown--->
FROM df_cruises
WHERE Tributary='#ARGUMENTS.Tributary#'<!---single quotes for SQL Server--->
ORDER BY CruiseDate desc
</cfquery>
<!---And return it--->
<cfreturn data>
</cffunction>
<!---getting the html file based on the cruisedate selection--->
<cffunction name="getmapname" access="remote" returntype="query"
hint="Get html file by tributary and cruisedate for dropdown select">
<cfargument name="Tributary" type="any" required="no">
<cfargument name="mapfile" type="any" required="no">
<!---Define variables--->
<cfset var data="">
<cfset var data="">
<!---Get file html Data--->
<cfquery name="data" datasource="mydatasource">
SELECT CruiseDate, Tributary, File_html
FROM df_cruises
WHERE CruiseDate='#ARGUMENTS.mapfile#'AND Tributary='#ARGUMENTS.Tributary#'AND File_html<>'notsampled'
</cfquery>
<!---And return it--->
<cfreturn data>
</cffunction>
</cfcomponent>
CFM(名为DropdownDisplay):
<cfparam name="url.File_html" default = '2'>
<cfform name="CruiseChoose" action="mapdisplayv3.cfm" method="post">
<table align="center" bgcolor="orange">
<tr>
<th colspan="2">
<font size="+1">First Select a Water Body, Then Choose Cruise Date</font>
</th>
</tr>
<tr>
<td>
<br/>
Tributary/Water Body:<br />
<cfselect name="Tributary"
bind="cfc:GettingData.getData()"
display="Tributary"
value="Tributary"
bindonload="true"
multiple="no"
size="6" />
</td>
<td>
<br />
Cruise Dates:<br />
<cfselect name="CruiseDate"
bind="cfc:GettingData.getDates({Tributary})"
bindonload="false"
type="link"
display="date"
value="CruiseDate"
multiple="no"
size="6"/>
</td>
<td>
<br>
Map Links:<br />
<cfselect name="link"
bind="cfc:GettingData.getmapname({CruiseDate},{Tributary})"
bindonload="false"
type="any"
display="File_html"
value="File_html"
multiple="no"
size="3"/>
</td>
</tr>
<tr>
<td colspan="2" align="center">
<br />
</form>
<!--- submit button --->
<cfoutput> <input type="submit" name="submit" value="View Selected Maps" alt="View Map Selection Button"><br></cfoutput>
<!--- Reset button. --->
<input name="reset" type="reset" value="Clear Selections" alt="Clear Selections Button">
</td>
</tr>
</table>
</cfform>
</html>
第一个下拉列表是提取支流列表,当选择“支流”时,第二个下拉列表会在采样时正确填充“CruiseDates”列表。第三个下拉列表应该填充表格中的“File_html”,这将成为在另一个CFM上打开数据图像映射的链接。 (这不是我的最终目标,这就是我的宝贝 - 踩到我的路上。)
我遇到的问题是,第三个下拉列表似乎没有依赖于第一个下拉选择(支流),因此当选择CruiseDate时,其中两个支流恰好在同一天被采样File_html名称显示在第三个下拉列表中(屏幕截图): 在CFC中,在“getmapname”函数中,我尝试使用2个参数(我在网上某处看到过),以便我可以重用参数(以及cfargument name =&#34; mapfile&#34;)以便在上一个查询中,我可以执行以下操作:
<cfquery name="data" datasource="mydatasource">
SELECT CruiseDate, Tributary, File_html
FROM df_cruises
WHERE CruiseDate='#ARGUMENTS.mapfile#' AND Tributary='#ARGUMENTS.Tributary#'
AND File_html<>'notsampled'
</cfquery>
这不起作用。当我有2个参数时,我得到错误,它似乎只允许1.
这是第三个下拉列表的屏幕截图,显示尽管&#39; Back River&#39;如果被选中,它会为同一日期采样的2条支流拉取File_html:
我也开始研究javascript版本,但我也坚持这一点,因为这是如此接近我继续研究这个方法。但是,如果使用这种方法不可能做三重相关的选择,我将不得不继续前进!
任何帮助都会非常精彩,谢谢! -B (对不起,很长的帖子,只是想彻底)
答案 0 :(得分:2)
感谢大家的帮助和耐心,我得到了2个参数,第3个下拉列表现在只返回它应该的数据(即它正确地绑定到第一个和第二次下拉)。谢谢! 以下是有效的新代码:
CFC:
<cfcomponent displayname="GetStuff" hint="Getting data on cruises from database">
<!---GET ARRAY OF TRIBUTARIES--->
<cffunction name="getData" access="remote" returntype="query" hint="Get data for first select">
<!---define variables--->
<cfset var data="tributary">
<!---Run the query for tributaries--->
<cfquery name="data" datasource="mydatasource">
SELECT distinct Tributary
FROM df_cruises
ORDER BY Tributary
</cfquery>
<!---and return it--->
<cfreturn data>
</cffunction>
<!---Get DATES by tributary--->
<cffunction name="getDates" access="remote" returntype="query" >
<cfargument name="Tributary" type="any" required="no">
<!---Define variables--->
<cfset var data="CruiseDate">
<!---Run query to get Date Data--->
<cfquery name="data" datasource="mydatasource">
SELECT *, CruiseDate AS date
FROM df_cruises
WHERE Tributary=
<cfqueryparam cfsqltype='cf_sql_varchar' value='#ARGUMENTS.Tributary#'>
ORDER BY CruiseDate desc
</cfquery>
<!---And return it--->
<cfreturn data>
</cffunction>
<!---getting the html file based on the CruiseDate selection--->
<cffunction name="getmapname" access="remote" returntype="query" >
<cfargument name="mapfile" type="any" required="no" default="">
<cfargument name="Tributary" type="any" required="no" default="">
<!---Define variables--->
<cfset var data="">
<!---Get file html Data--->
<cfquery name="data" datasource="mydatasource">
SELECT CruiseDate, Tributary, File_html
FROM df_cruises
WHERE CruiseDate=<cfqueryparam cfsqltype='cf_sql_date' value='#ARGUMENTS.mapfile#'> AND Tributary=<cfqueryparam cfsqltype='cf_sql_varchar' value='#ARGUMENTS.Tributary#'> AND File_html<><cfqueryparam cfsqltype="cf_sql_varchar" value='notsampled'>
</cfquery>
<!---And return it--->
<cfreturn data>
</cffunction>
</cfcomponent>
CFM:
<cfparam name="url.File_html" default = '2'>
<cfform name="CruiseChoose" action="mapdisplayv3.cfm" method="post">
<table align="center" bgcolor="orange">
<tr>
<th colspan="2">
<font size="+1">First Select a Water Body, Then Choose Cruise Date</font>
</th>
</tr>
<tr>
<td>
<br />
Tributary/Water Body:<br />
<cfselect name="Tributary"
bind="cfc:GettingData.getData()"
display="Tributary"
value="Tributary"
bindonload="true"
multiple="no"
size="6" />
</td>
<td>
<br />
Cruise Dates:<br />
<cfselect name="CruiseDate"
bind="cfc:GettingData.getDates({Tributary})"
bindonload="false"
type="link"
display="date"
value="CruiseDate"
multiple="no"
size="6"/>
</td>
<td>
<br>
Map Links:<br />
<cfselect name="link"
bind="cfc:GettingData.getmapname({CruiseDate}, {Tributary})"
bindonload="false"
type="any"
display="File_html"
value="File_html"
multiple="no"
size="3"/>
</td>
</tr>
<tr>
<td colspan="2" align="center">
<br />
</form>
<!--- submit button --->
<cfoutput> <input type="submit" name="submit" value="View Selected Maps" alt="View Map Selection Button"><br></cfoutput>
<!--- Reset button. --->
<input name="reset" type="reset" value="Clear Selections" alt="Clear Selections Button">
</td>
</tr>
</table>
</cfform>
</html>
答案 1 :(得分:1)
从第二次选择的查询开始。
SELECT *, CruiseDate AS date <!---this gets date to display correctly in dropdown--->
FROM df_cruises
WHERE Tributary='#ARGUMENTS.Tributary#'<!---single quotes for SQL Server--->
ORDER BY CruiseDate desc
我将假设表df_cruises有一个名为cruiseID的数字PK。将查询更改为:
SELECT cruiseId
, CruiseDate AS date <!---this gets date to display correctly in dropdown--->
FROM df_cruises
WHERE Tributary= cfqueryparam cfsqltype="cf_sql_varchar" value="#ARGUMENTS.Tributary#">
ORDER BY CruiseDate desc
第3次选择的绑定将类似于:
bind="cfc:UsingBook.getmapname({cruiseId})"
您的最终查询是:
SELECT CruiseDate, Tributary, File_html
FROM df_cruises
WHERE cruiseID = cfqueryparam cfsqltype="cf_sql_integer"
value="#ARGUMENTS.cruiseID#>
AND File_html<>'notsampled'
请注意对变量使用查询参数。