David Emerson
davide at dalyn.co.nz
Wed Oct 1 17:39:17 CDT 2003
Group,
AXP FE, SQL2000 BE.
I am looking for pointers at this stage as how I can do the task. I have a
vba procedure which runs on the click of a button (most of it is replicated
below). As it is currently dealing with over 2000 meters it takes a while
to run (because it is going back and forth between Access and SQL).
Basically what it does is loop through one recordset of meters, looks up
values from other related tables, then adds records to a couple of other
tables. It is things like looping through a recordset, and checking that
records don't exist before creating new records that I am unsure of.
Is there a way to write the same thing in SQL so that it can all be run in
the BE?
'Create invoice transactions for meters needing estimate readings.
Call basInfo("Creating estimate meter readings.")
Dim rstEstimate As ADODB.Recordset, rst As ADODB.Recordset
Dim rstMeterRead As ADODB.Recordset, rstPlans As ADODB.Recordset
Dim lngCustID As Long, lngMeterID As Long, intInvStatNo As Integer
Dim lngInvStatID As Long, dtmStatDate As Date, lngInvMeterID As Long
Dim sngTotDisc As Single, errMsg As String
Dim bytCount As Byte, sngUnits As Single
Set rstEstimate = basRunDataObject("dbo.spMthEndEstMeterReading",
adCmdStoredProc) 'List of active meters and estimated monthly readings
Do Until rstEstimate.EOF
Call basInfo("Creating estimate meter readings." & vbCrLf &
rstEstimate!SortOrder)
lngCustID = rstEstimate!CustIDNo
lngMeterID = rstEstimate!MeterID
intInvStatNo = DLookup("InvNumber", "dbo.tblCustomers", "CustomerID =
" & lngCustID)
lngInvStatID = basCustomDLookUp("StatementID", "dbo.tblCustStatement",
"CustIDNo = " & lngCustID & " and StatementNumber = " & intInvStatNo)
If Not IsNull(lngInvStatID) Then 'Statement record exists
dtmStatDate = basCustomDLookUp("StatementDate",
"dbo.tblCustStatement", "CustIDNo = " & lngCustID & " and StatementNumber =
" & intInvStatNo)
Else 'Should always be a statement - this is a precaution
MsgBox "There is no current statement for customer " &
rstEstimate!SortOrder & ". The record has not been processed. Please note
this message and refer to your support officer."
GoTo EndLoop
End If
lngInvStatID = basCustomDLookUp("InvoiceID", "dbo.tblCustInvoice",
"StatementIDNo = " & lngInvStatID & " and InvoiceNumber = " & intInvStatNo)
If IsNull(lngInvStatID) Then
MsgBox "There is no current invoice for customer " &
rstEstimate!SortOrder & ". The record has not been processed. Please note
this message and refer to your support officer."
GoTo EndLoop
End If
Set rst = basRunDataObject("dbo.tblCustInvoiceMeter", adCmdTable)
'Check for Meter record
With rst
.filter = "MeterIDNo = " & lngMeterID & " and InvoiceIDNo = " &
lngInvStatID
If (.EOF Or .BOF) Then 'Meter record not exit - Create meter records
'Update Meter record
rstEstimate!PresMeterReadDate = DateAdd("d",
-Me!txtEstDays, dtmStatDate)
rstEstimate!PresMeterReading =
rstEstimate!LastMeterReading + int(rstEstimate!MthEstimateUse / 30 *
(rstEstimate!PresMeterReadDate - rstEstimate!LastMeterReadDate) + 0.5)
rstEstimate!ActualEstimate = 2 'Estimate
If rstEstimate!NextMeterReadDate <=
rstEstimate!PresMeterReadDate + Me!txtEstDays Then 'Next read due before
date of current account
rstEstimate!NextMeterReadDate =
basLastBusDay(DateAdd("m", 1, rstEstimate!NextMeterReadDate - 1)) 'Subtract
1 to account for 1 Oct date
End If
'Adjust readings if clock ticked over last month
If rstEstimate!DigitsRead > 3 Then
If rstEstimate!LastMeterReading >= 10 ^
rstEstimate!DigitsRead Then
rstEstimate!LastMeterReading =
rstEstimate!LastMeterReading - 10 ^ rstEstimate!DigitsRead
rstEstimate!PresMeterReading =
rstEstimate!PresMeterReading - 10 ^ rstEstimate!DigitsRead
End If
End If
rstEstimate.Update
Set rstMeterRead = basRunDataObject("dbo.tblMeterReadings",
adCmdTable)
With rstMeterRead
.AddNew
!CustIDNo = lngCustID
!MeterIDNo = lngMeterID
.Update
End With
rstMeterRead.Close
Set rstMeterRead = Nothing
.AddNew
!InvoiceIDNo = lngInvStatID
!MeterIDNo = lngMeterID
!LastMeterReadDate = rstEstimate!LastMeterReadDate
!CustServPlanIDNo = DLookup("PlanID",
"dbo.tblCustServicePlans", "Inactive = 0 and MeterIDNo = " & lngMeterID)
.Update
End If
End With
rst.Close
Set rst = Nothing
EndLoop:
rstEstimate.MoveNext
Loop
rstEstimate.Close
Set rstEstimate = Nothing
Regards
David Emerson
DALYN Software Ltd
25b Cunliffe St, Johnsonville
Wellington, New Zealand
Ph/Fax (877) 456-1205