台灣最大程式設計社群網站
線上人數
945
 
會員總數:246134
討論主題:189713
歡迎您免費加入會員
討論區列表 >> ASP >> ASP 如何加快運行效率
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
ASP 如何加快運行效率
價值 : 200 QP  點閱數:1379 回應數:5
樓主

Alan Yuan
門外漢
0 13
763 31
發送站內信

這程式是每年分店內所有員工, 每個月的佣金計算報表, 我發現每次開啟這個報表, 運作時間都很久, 並發覺同一個資料庫, 在這個網頁連續開啟超過數十次, 担心會影響到其他用者同時操作入單, 希望可以找到一到寫得更理想的方法。謝謝大家幫忙。附圖片說明, 希望文字不會太長。

<%
ReDim AnTotal(12)
ReDim HnTotal(12)
ReDim RnTotal(12)
ReDim ZnTotal(12)
ReDim EnTotal(12)
ReDim BnTotal(12)
ReDim T1(12)

' 第一 : 求該年度總共有那些員工....
SQL = "Select BStaff From Invoice Where Year =" & YYY & " And Not BType = 'D' And ISNull(BStaff) = False"
SQL = SQL & " Group by BStaff Order By BStaff"
Set rs = GetMdbRecordset( NInvoice , SQL)
While Not rs.EOF
If Len(StaffList) = 0 Then
StaffList = rs("BStaff")
Else
StaffList = StaffList & ", " & rs("BStaff")
End If
rs.movenext
Wend
rs.close
Set rs = Nothing

StaffL = Split(StaffList, ", ")
For J = 0 to UBound(StaffL)
BStaff = StaffL(J)

'第二, 求個別員工的佣金計算...DDD是該員工的所有佣金, (再拆分為HHH是剪頭髮, RRR是賣洗頭用品, EEE是修甲, BBB是賣套票, 各佣金計法都不同)
For I = 1 to 12
SQL = "Select Month, Sum(BSalary) as DDD,"
SQL = SQL & " Sum(iif(ATYPE='H', BSalary, 0)) as HHH,"
SQL = SQL & " Sum(iif(ATYPE='R', BSalary, 0)) as RRR,"
SQL = SQL & " Sum(iif(ATYPE='E', BSalary, 0)) as EEE,"
SQL = SQL & " Sum(iif(ATYPE='B', BSalary, 0)) as BBB"
SQL = SQL & " From Invoice Where Not BType = 'D' And Month =" & I & " And BStaff = '" & BStaff & "' And Not AType = 'Q' And Year =" & YYY & " Group by Month"
Set rs = GetMdbRecordset( NInvoice , SQL)

AnTotal(I) = 0
HnTotal(I) = 0
RnTotal(I) = 0
EnTotal(I) = 0
BnTotal(I) = 0
If rs.EOF Then
AnTotal(I) = 0
HnTotal(I) = 0
RnTotal(I) = 0
EnTotal(I) = 0
BnTotal(I) = 0
Else
AnTotal(I) = rs("DDD")
HnTotal(I) = rs("HHH")
RnTotal(I) = rs("RRR")
EnTotal(I) = rs("EEE")
BnTotal(I) = rs("BBB")
rs.close
End If

' 如果員工是 M1 或 M2, 要減返洗頭學徒的錢
If BStaff = "M1" or BStaff = "M2" Then
SQL = "Select Month, Sum(BSalary) as ZZZ From Invoice"
SQL = SQL & " Where Not BType = 'D' And Month = " & I & " And AType = 'A' And BStaff2 = '" & BStaff & "' And Year =" & YYY & " Group by Month"
Set rs = GetMdbRecordset( NInvoice , SQL)
If rs.EOF Then
ZnTotal(I) = 0
Else
ZnTotal(I) = rs("ZZZ")
End If

AnTotal(I) = CLng((HnTotal(I) - ZnTotal(I) - 80000) * 0.35)
If AnTotal(I) < 0 Then
AnTotal(I) = 0
End If
AnTotal(I) = AnTotal(I) + RnTotal(I)
End If

' End
' 如果員工是 "M3", 也要減返洗頭學徒的錢 , 但佣金是 *0.32
If BStaff = "M3" Then
SQL = "Select Month, Sum(BSalary) as ZZZ From Invoice"
SQL = SQL & " Where Not BType = 'D' And Month = " & I & " And AType = 'A' And BStaff2 = '" & BStaff & "' And Year =" & YYY & " Group by Month"
Set rs = GetMdbRecordset( NInvoice , SQL)
If rs.EOF Then

ZnTotal(I) = 0
Else
ZnTotal(I) = rs("ZZZ")
End If

AnTotal(I) = CLng((HnTotal(I) - ZnTotal(I) - 80000) * 0.32)
If AnTotal(I) < 0 Then
AnTotal(I) = 0
End If
AnTotal(I) = AnTotal(I) + RnTotal(I)
End If
' End

' 如果員工是 "M4", 其佣金全數相加後, >40,000及<40,000 計法又不同, 由今年11月生效.

If I = 11 or I = 12 Then
If BStaff = "M4" Then

If EnTotal(I) < 40000 Then
AnTotal(I) = CLng((EnTotal(I) * 0.075))
ElseIf EnTotal(I) > 40000 and EnTotal(I) < 55000 Then
AnTotal(I) = CLng(((EnTotal(I) - 40001) * 0.15) + 3000)
Else
AnTotal(I) = CLng(((EnTotal(I) - 55001) * 0.3) + 5249.85)
End If

If AnTotal(I) < 0 Then
AnTotal(I) = 0
End If
AnTotal(I) = CLng(AnTotal(I) + RnTotal(I) + BnTotal(I))
End If
End If
' End

If AnTotal(I) > 0 Then
AnTotal(I) = CLng(AnTotal(I))
Else
AnTotal(I) = 0
End If

T1(I) = T1(I) + AnTotal(I)

Next
%>


' 以下是 HTML 報表顯示

<td bgcolor="#C0C0C0" align="Center">
<span lang="en-us"><font face="Calibri" size="2" color="#800000">
<font color="#000000"><a href="Stat3A.asp?M2=<%=YYY%>&BStaff=<%=BStaff%>"><%=BStaff%></a></font></font></span><font face="Calibri">
</font>
<td bgcolor="#FFFFFF" align="Center">
<font face="Calibri" size="2"><%=AnTotal(1)%></font></td>
<td bgcolor="#FFFFFF" align="Center">
<font face="Calibri" size="2"><%=AnTotal(2)%></font></td>
<td bgcolor="#FFFFFF" align="Center">
<font face="Calibri" size="2"><%=AnTotal(3)%></font></td>
<td bgcolor="#FFFFFF" align="Center">
<font face="Calibri" size="2"><%=AnTotal(4)%></font></td>
<td bgcolor="#FFFFFF" align="Center">
<font face="Calibri" size="2"><%=AnTotal(5)%></font></td>
<td bgcolor="#FFFFFF" align="Center">
<font face="Calibri" size="2"><%=AnTotal(6)%></font></td>
<td bgcolor="#FFFFFF" align="Center">
<font face="Calibri" size="2"><%=AnTotal(7)%></font></td>
<td bgcolor="#FFFFFF" align="Center">
<font face="Calibri" size="2"><%=AnTotal(8)%></font></td>
<td bgcolor="#FFFFFF" align="Center">
<font face="Calibri" size="2"><%=AnTotal(9)%></font></td>
<td bgcolor="#FFFFFF" align="Center">
<font face="Calibri" size="2"><%=AnTotal(10)%></font></td>
<td bgcolor="#FFFFFF" align="Center">
<font face="Calibri" size="2"><%=AnTotal(11)%></font></td>
<td bgcolor="#FFFFFF" align="Center">
<font face="Calibri" size="2"><%=AnTotal(12)%></font></td>
</tr>
<%
Next
%>


本篇文章發表於2014-12-12 02:11
1樓
不錯的參考

迷路
捐贈 VP 給 迷路 檢舉此回應
這個問題其實有兩個處理角度,兩個都和ASP沒什麼關係

第一,從資料庫的角度,資料表的設計是否有優化過、主鍵是否有設定
另外,第一步和第二步是否能合併處理

第二,從程式的角度,如果資料庫已經優化了,但是資料量實在太龐大時,就得要分批處理資料
建議的處理方式是以AJAX的方式,在網頁開啟後分批去資料庫要資料,然後顯示到網頁上
本篇文章回覆於2014-12-12 09:55
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
作者回應

Alan Yuan
檢舉此回應
謝謝回覆, 我是想從 SQL 語法上去改善。或者是我的寫法過於複雜, 迴轉又再迴轉,不知可會有更簡單, "一矢中的"的新方向, 謝謝各位賜教.....
本篇文章回覆於2014-12-12 10:50
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
不錯的參考

ChaRles Wu
檢舉此回應
小弟我的經驗分享:假如SQL裡面有「否定句」(例如:"not" , "<>" , "!="),在資料量大的情況之下,反應好像會比較慢一點..
本篇文章回覆於2016-11-18 12:15
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
最有價值解答

lethal
檢舉此回應
如果要有建議的話:
1. 不要把程式碼和 HTML 分開,至少全包在 <% %> 裡面。
2. 看起來你的迴圈至少要開24次 rs,應該將 Set rs 包在 for...next的外層,像這樣

或寫成副程式呼叫。

本篇文章回覆於2016-11-20 21:28
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
作者回應

Alan Yuan
檢舉此回應
很多謝二位的回覆, 二年後還有人回應我, 很感激你們。謝謝。
本篇文章回覆於2016-11-29 00:51
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.