2010-07-02 2 views
1

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

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

<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.

+0

Спасибо, Майкл. Присоединение таблицы AvailableActions к таблице OrderHeader приведет к созданию нескольких строк в OrderHeader. –

+0

Не уверен, что комментарий Майкла, но присоединиться к нескольким строкам - это способ сделать это - вы тогда группируете, как ответ Бена, и у вас будет то, что вам нужно. –

ответ

4

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

<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 работали правильно. Не проверено, поэтому могут быть опечатки.

+0

Спасибо, Бен. Мой пример проходит через каждый OrderHeader. Qry3 отличается для каждой строки. –

+2

Phillip, просто используйте базовое соединение, если вам нужно отменить orderheader. Принцип тот же. –

Смежные вопросы