1

以下のコードは、EOFではないときにEOFではない時間を別の場所に配置すると壊れます。これはASPクラシックコードでは違法ですか?どうすれば修正できますか?

<table cellspacing = "0" cellpadding = "3" class = "horiz ">
    <tr>
        <th width = "20%">Acronym</th>
        <th width = "50%">Meaning</th>
        <th width = "30%">Source</th>
    </tr>
    <%
    count = 0
    pletter = "z"
    fletter = left(con("acronym"),1)
    %>
     <% while (NOT con.EOF) %>
    <tr>
        <td colspan = "3" ><h2><a name="A">A</a></h2></td>
    </tr>
     <% while (NOT con.EOF) %>
    <tr>
        <td><%=con("acronym")%></td>
        <td><%=con("meaning")%></td>
        <td><%=con("source")%></td>
    </tr>
     <%
    con.MoveNext()
    Wend
    %>
    <%
    con.MoveNext()
    Wend
    %>
</table>
4

3 に答える 3

3

while ループを 1 つだけにしてみませんか。if ステートメントを追加して、最初の文字が変更されたかどうかを判断します (たとえば、A から B へ)。文字が変わる場合は、TR を追加して文字を表示します。

dim lastCharacter = ""
while (not con.EOF)
    dim firstLetterOfAcronym  = left(con("acronym"),1)
    if lastCharacter <> firstLetterOfAcronym then
       rem show TR of firstLetterOfAcronym
       lastCharacter = firstLetterOfAcronym 
    end if

    <tr>..... show row as usual </tr>
    con.MoveNext()
wend
于 2013-02-05T00:41:27.180 に答える
1

Acronym でレコードセットがソートされていると仮定します。

これは @Valamas のソリューションとまったく同じで、単一のループを意味しますが、もう少し完全な例です。

<table cellspacing = "0" cellpadding = "3" class = "horiz">
    <tr>
        <th width = "20%">Acronym</th>
        <th width = "50%">Meaning</th>
        <th width = "30%">Source</th>
    </tr>
    <%
    mainletter = ""

    While (NOT con.EOF)
        letter = Left(con("acronym")
        If mainletter <> letter Then
            %>
            <tr>
                <td colspan = "3" ><h2><a name="<%=letter%>"><%=letter%></a></h2></td>
            </tr>   
            <%
            mainletter = Left(con("acronym"),1)
        End If
        <tr>
            <td><%=con("acronym")%></td>
            <td><%=con("meaning")%></td>
            <td><%=con("source")%></td>
        </tr>
        <%
        con.MoveNext()
    Wend
    %>
</table>
于 2013-02-08T10:54:29.720 に答える
-1

(ループを介して)レコードセットの最後に到達すると、最初にリセットされないため(指示がない限り)、最初のループでレコードセットの最後に到達すると、2番目のループが開始されます。すでに最後に。

論理的ではないのでコードを書き直しますが、コードをそのまま機能させたい場合は、ループが終了した後にmovefirstを追加して、レコードセットの先頭に戻ります。

...
</tr>
 <%
con.MoveNext()
Wend
con.movefirst
con.MoveNext()
Wend
%>
</table>

編集:実際には、これを行うとループに陥り、最初のループの前にレコードセットのクローンを作成し、同じデータを持つ2つの異なるレコードセットをループします。それ以外の場合は、少しきれいになるように書き直します。

于 2013-02-05T03:58:50.300 に答える