Создание списка выбора внутри цикла - PullRequest
1 голос
/ 02 июля 2010

Как вы НЕ используете запрос запросов внутри цикла, чтобы решить проблему создания списка выбора для каждой строки?

В этом примере у каждого клиента есть список действий, уникальных для этогоcustomer:

<cfquery name="qryAction" datasource="myDataSource">
SELECT ActionID,CustID,ActionName FROM AvailableActions
</cfquery>
<cfquery name="qryOrderHeader" datasource="myDataSource">
SELECT CustID FROM OrderHeader
</cfquery>
<html>
<body>
<cfform preservedata="yes">
    <cfloop query="qryOrderHeader">
        <cfquery name="qry3" dbtype="query">
        SELECT ActionID,ActionName FROM qryAction
        WHERE CustID = #qryOrderHeader.CustID#
        </cfquery>
        <cfselect name="ActionID" query="qry3" display="ActionName" value="ActionID" />
    </cfloop>
</cfform>
</body>
</html>

Вот пример SQL, если он поможет проиллюстрировать мой пример.

    use tempdb
    GO
    create table Cust(
    CustID Int Identity Primary Key,
    CustName Varchar(255)
    )
    GO
    INSERT INTO Cust(CustName) values('One')
    INSERT INTO Cust(CustName) values('Two')
    GO
    create table AvailableActions(
    ActionID Int Identity Primary Key,
    CustID Int,
    ActionName Varchar(255)
    )
    GO
    INSERT INTO AvailableActions(CustID,ActionName) VALUES(1,'Insert')
    INSERT INTO AvailableActions(CustID,ActionName) VALUES(1,'Edit')
    INSERT INTO AvailableActions(CustID,ActionName) VALUES(1,'Delete')
    INSERT INTO AvailableActions(CustID,ActionName) VALUES(2,'Insert')
    INSERT INTO AvailableActions(CustID,ActionName) VALUES(2,'Edit')
    GO
    CREATE TABLE OrderHeader(
    OrderHeaderID Int Identity Primary Key,
    CustID Int
    )
    INSERT INTO OrderHeader(CustID) VALUES(1)
    INSERT INTO OrderHeader(CustID) VALUES(2)
    INSERT INTO OrderHeader(CustID) VALUES(2)

Полагаю, лучшим результатом было бы включение ActionID и ActionName в qryOrderHeader.

1 Ответ

4 голосов
/ 02 июля 2010

Довольно просто создать списки выбора вручную (вместо использования cfselect) с помощью cfoutput с атрибутом group:

<cfquery name="qryAction" datasource="myDataSource">
    SELECT ActionID,CustID,ActionName 
    FROM AvailableActions
    ORDER BY CustID
</cfquery>

<cfoutput query="qryAction" group="CustID">
    <select name="actionid">
    <cfoutput>
        <option value="#val(ActionID)#">#htmlEditFormat(ActionName)#</option>
    </cfoutput>
    </select>
</cfoutput>

Обратите внимание, что вам нужно указать CustID в качестве первого (или единственного) порядка, чтобы правильно работать вложенные выходы cfoutputs. Не проверено, поэтому возможны опечатки.

...