Итоги и промежуточные итоги цикла ASP Do While

Я не претендую на звание классика ASP, но иногда нужно делать то, что нужно. Моя проблема в том, что это пользовательский отчет, созданный через ASP, и пользователь хочет, чтобы отображались промежуточные итоги и общий итог, и, честно говоря, я просто не уверен, как это сделать. В настоящее время весь отчет упакован таким образом, то, как он отображается, не имеет большого значения для проблемы.

<%do while (adoRsTrade.AbsolutePage = iPageCurrent) and (not adoRsTrade.EOF)
NewRep = adoRsTrade("calIncludedRep")

if CurRep <> NewRep or FirstTime="T" and (not adorsTrade.BOF) then %>

сложите значения для этого CurRep и отобразите их как «промежуточные итоги»

<%

FirstTime="F"
CurRep = adoRsTrade("calIncludedRep")
adoRsTrade.MoveNext
loop %>

любая помощь, которую я мог бы получить, будет принята с благодарностью, поскольку я уже упоминал, что никоим образом не являюсь гуру ASP. Спасибо, NickG

обновить промежуточный итог; общие итоги завершены, так как я могу просто повторно запустить цикл do while вне цикла, отображающий все данные и суммировать их, легко (не совсем), теперь я сталкиваюсь с тем, что .MoveNext нажат до чтобы я мог проверить NewRep; вот суммирование промежуточных итогов, а также проверка, является ли это новым представителем, что означает отображение промежуточных итогов для бывшего представителя

<%do while (adoRsTrade.AbsolutePage = iPageCurrent) and (not adoRsTrade.EOF)
NewRep = adoRsTrade("calIncludedRep")

if CurRep = NewRep then
        curPrincipal = adoRsTrade("mPrincipal")
        totPrincipal = totPrincipal + curPrincipal
            curInterest = adoRsTrade("mInterest")
            totInterest = totInterest + curInterest
        curCommission = adoRsTrade("calCommission")
        totCommission = totCommission + curCommission
            curSECFee = adoRsTrade("mSECFee")
            totSECFee = totSECFee + curSECFee
        curSvcFee = adoRsTrade("mSvcCharge")
        totSvcFee = totSvcFee + curSvcFee
            curNet = adoRsTrade("mNetAmount")
            totNet = totNet + curNet
end if    
if CurRep <> NewRep or FirstTime="T" and (not adorsTrade.BOF) then
  If FirstTime <> "T" then%>
      <TR>
        <td>
            <table class='FontStandardMinus1' border=0 cellPadding=0 align='left' cellSpacing=0 width="100%" bgcolor='#ffffff'>
                 <TR>
                    <td width="59%" align="left"><b>SubTotals<!-- for <%Response.Write(CurRep) %>-->:</b></td>
                    <td width="10%" valign=top align=right><%=FormatNumber(totPrincipal,2)%></td>
                    <td width="7%" valign=top align=right><%=FormatNumber(totInterest,2)%></td>
                    <td width="7%" valign=top align=right><%=FormatNumber(totCommission,2)%></td>
                    <td width="5%" valign=top align=right><%=FormatNumber(totSECFee,2)%></td>
                    <td width="4%" valign=top align=right><%=FormatNumber(totSvcFee,2)%></td>
                    <td width="9%" valign=top align=right><%=FormatNumber(totNet,2)%></td>
                </TR>
            </table>
        </td>
    </TR>
<%end if      
curPrincipal = 0
totPrincipal = 0
curInterest = 0
totInterest = 0
curCommission = 0
totCommission = 0
curSECFee = 0
totSECFee = 0
curSvcFee = 0
totSvcFee = 0
curNet = 0
totNet = 0 %>
<TR>
<TD width="100%">
<table class='FontStandardMinus1' border=0 cellPadding=0 align='left' cellSpacing=0 width="100%" bgcolor='#ffffff'>
<tr>
<td width=100%><b><%=adoRsTrade("calIncludedRep")%></b></td>

</tr>
</table>
</TD>
</TR>
<%end if%>
<%

FirstTime="F"
'CalCom = CalCom + adoRsTrade("calCommission")
CurRep = adoRsTrade("calIncludedRep")
adoRsTrade.MoveNext

loop%>

так что вы можете видеть, что я пытаюсь сбросить значения до 0 после отображения их в таблице, но эта таблица отображается только после того, как .MoveNext попал в хит, что означает, что даже если я хочу отобразить записи 1-5 добавлены, запись 6 уже была затронута .MoveNext и отбрасывается из набора значений. Извините за длинность этого, но я ненавижу, что комментарии не могут содержать обновленный код. спасибо за любую помощь


person Nick G    schedule 18.03.2013    source источник


Ответы (1)


Предполагая, что вы выводите переменные totPrincipal, totInterest , totCommission после цикла, единственная проблема, о которой я могу думать, это тип данных и rs.MoveFirst.

Кстати: попробуйте сделать это в одном цикле из соображений производительности!

Dim subtotPrincipal: subtotPrincipal = 0
Dim totPrincipal: totPrincipal = 0
Dim CurRep: CurRep = 0
Dim NewRep: NewRep = 0

adoRsTrade.MoveFirst
Do 
    NewRep = adoRsTrade("calIncludedRep")       
    ...
    subtotPrincipal = subtotPrincipal + CLng(adoRsTrade("mPrincipal"))
    totPrincipal = totPrincipal + CLng(adoRsTrade("mPrincipal"))
    ...

    If (CurRep <> NewRep And Not adorsTrade.BOF) Or adoRsTrade.EOF Then
        Response.Write subtotPrincipal
        subtotPrincipal = 0
    End If

    CurRep = NewRep
    adorsTrade.MoveNext
Loop Until adoRsTrade.EOF

Response.Write totPrincipal
person John    schedule 18.03.2013
comment
спасибо за ваш ответ, я смог заставить общие итоги работать правильно, используя MoveFirst вне цикла выше, после проверки, чтобы убедиться, что я был на последней странице. так что это большой шаг. Однако промежуточные итоги доставляют мне проблемы, потому что они продолжают добавлять то, что должно быть 1-м значением следующего набора после того, как я отобразил. Я даже сбрасываю все переменные на = 0 после отображения, но к ним добавляется следующее значение, не знаю, куда идти, но спасибо за вашу помощь до сих пор! - person Nick G; 18.03.2013
comment
Я не думаю, что смогу сделать это без вложенного цикла, общие итоги работают нормально, поскольку они находятся вне цикла для отображения данных, но промежуточные итоги меня убивают, я обновил свой пост с дополнительной информацией, если вы могли бы взглянуть , я понимаю, что вы заняты, и ценю помощь больше, чем я мог бы вам сказать - person Nick G; 18.03.2013
comment
Хорошо, всего несколько комментариев: 1. вы должны упорядочить свои данные с помощью calIncludedRep в SQL, потому что в противном случае это решение никогда не будет работать 2. вы можете упростить добавление, например. totPrincipal = totPrincipal + adoRsTrade("mPrincipal")и убрать сброс в ноль 3. Вы ставите флаг FirstTime после первой итерации в F не смотря ни на что - не вижу в этом смысла? 4. Проверьте вложенные ЕСЛИ - я не думаю, что это необходимо - почему бы вам просто не записать промежуточные итоги и разделение за один шаг? - person John; 18.03.2013
comment
Я действительно понял это, я сбрасывал значения после того, как уже добавил первое значение нового набора записей, из-за чего мои данные немного сбивались. теперь единственное, что мне нужно выяснить, это как получить промежуточный итог для последней записи в наборе данных, в котором я не уверен. использование If AdorsTrade.Index = (AdorsTrade.RecordCount - 1) этого не делает, но спасибо за все, что вы определенно были единственной причиной, по которой я оказался там, где я есть. - person Nick G; 18.03.2013
comment
рад, что ты разобрался! - вы можете сохранить RecordCount в переменной rsCount=AdorsTrade.RecordCount (не забудьте использовать adodb.CursorLocation = 3), а затем сравнить ее с простой увеличивающейся переменной count = count + 1 в конце цикла. - person John; 18.03.2013