【问题标题】:ASP Do While loop totals and subtotalsASP Do While 循环总计和小计
【发布时间】:2021-08-19 23:00:33
【问题描述】:

我并不声称自己是一个典型的 ASP 人,但有时你必须做你必须做的事情。我的问题是这是一个通过 ASP 自定义构建的报告,用户希望运行 SubTotals 并显示总计,老实说,我只是不知道如何去做。目前整个报告都是这样包装的,它的显示方式对问题没有太大影响。

<%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 专家。 谢谢, 尼克G

更新小计的东西;总计已完成,因为我可以在循环外重新运行 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 击中,并被从值集中丢弃。很抱歉这个冗长,但我讨厌 cmets 不能包含更新的代码。 感谢您的帮助

【问题讨论】:

    标签: loops asp-classic do-while


    【解决方案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
    

    【讨论】:

    • 感谢您的回复,在检查以确保我在最后一页之后,我能够通过在上述循环之外使用 MoveFirst 来使总计正常工作。所以这是一大步。但是,小计给我带来了问题,因为它们在我显示后不断添加应该是下一组的第一个值。我什至在显示后将所有变量重置为 = 0,但下一个值被添加到这些变量中,不知道该去哪里,但感谢您到目前为止的帮助!
    • 我不认为没有嵌套循环我可以做到这一点,总计工作正常,因为它们在循环之外显示数据但小计正在杀死我,我更新了我的帖子如果您可以查看更多信息,我了解您很忙,并且比我能告诉您的更感谢您的帮助
    • 好的,只是几个 cmets:1. 您必须在 SQL 中通过 calIncludedRep 对数据进行排序,否则此解决方案将永远无法工作 2. 您可以通过例如简化添加。 totPrincipal = totPrincipal + adoRsTrade("mPrincipal") 并删除重置为零 3. 您在第一次迭代后将标志 FirstTime 设置为 F 没有什么 - 我看不出这有什么意义? 4.检查嵌套的IF——我认为这些没有必要——你为什么不一步写出小计和分隔符?
    • 我实际上想通了,在添加了新记录集的第一个值之后我正在重置值,这导致我的数据有点偏离。现在我唯一要弄清楚的是如何获得我不确定的数据集中最后一条记录的小计。使用 If AdorsTrade.Index = (AdorsTrade.RecordCount - 1) 并没有这样做,但感谢您所做的一切,您绝对是我获得现在位置的唯一原因
    • 很高兴你知道了! - 您可以将RecordCount 存储在变量rsCount=AdorsTrade.RecordCount 中(不要忘记使用adodb.CursorLocation = 3),然后在循环结束时将其与简单的递增变量count = count + 1 进行比较。
    猜你喜欢
    • 1970-01-01
    • 2015-07-03
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 2016-06-25
    • 1970-01-01
    • 1970-01-01
    • 2021-07-01
    相关资源
    最近更新 更多