<tr>
<th width="8%">
序號
</th>
<th width="20%">
會場名稱
</th>
<th width="26%">
開始時間
</th>
<th width="26%">
結束時間
</th>
<th width="20%">
申請狀態
</th>
</tr>
<%int index = 1;%>
<s:iterator var="s" value="#request.usageList">
<tr>
<td style="text-align:center">
<%=index++ %>
</td>
<s:if test="#strid!=#s.room_id">
<s:set id="strid" value="%{#s.room_id}"/>
<td rowspan="<s:property value="TOTAL_ROWS"/>" id="<s:property value="ROOM_ID"/>" style="text-align:center">
<a href="javascript:window.location.href='<%=path%>/conference_room_view.action?room_id=<s:property value="ROOM_ID"/>&opType=2';">
<s:property value="ROOM_NAME"/>
</a>
</td>
</s:if>
<td style="text-align:center">
<s:date name="START_DATE" format="yyyy-MM-dd HH:mm:ss"/>
</td>
<td>
<s:date name="END_DATE" format="yyyy-MM-dd HH:mm:ss"/>
</td>
<td style="text-align:center">
<%=CommonMethod.getConferenceStatus((String)request.getAttribute("STATUS")) %>
</td>
</tr>
</s:iterator>
解釋一下吧,省的將來自己看的時候都想不起來了。
關鍵是紅色部分,該列表時展示各個會議室的全部申請,因此,會議室和申請記錄時一對多的關係。
每次迴圈都判斷一次,看看目前記錄中的ROOM_ID是不是和上一次的一樣,如果一樣則會議室名稱的TD不構造。如果不一樣,說明是新會議室,則聲稱TD。
rowspan="<s:property value="TOTAL_ROWS"/>"
這個是靈魂。
在第一次產生TD的時候就設定TD的佔得行數,這樣就能實現一對多的展示了。但是這個TOTAL_ROWS怎麼來,就要靠SQL的分析函數了:
COUNT(ROWID) OVER (PARTITION BY ROOM_ID) TOTAL_ROWS
在查詢項中添加上面這一項,就OK了。具體什麼意思,自己去看看SQL的解釋吧(ORACLE)。
美中不足的是,如果是分頁顯示的話效果不太理想。