Want to protect your cyber security and still get fast solutions? Ask a secure question today.Go Premium

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 93
  • Last Modified:

condense 3 loops into 1

This code has the same iterations 3 times.  How can I keep only one loop and simply modify only the 3 variables in bold.  I don't see a pattern for the ages that would work as I was thinking of putting a loop within a loop.

'Get List of 8 to 12 and under--------
       esql = "DECLARE @fromdt AS datetime " & _
                "DECLARE @todt AS datetime " & _
                "SET @fromdt = '" & DTPicker1 & "' " & _
                "SET @todt = '" & DTPicker2 & "' " & _
                "SELECT  p.Agency, count(distinct r.RegID) " & _
                "FROM tblOrgProfile as p " & _
                "LEFT JOIN tblOrgRegistrations as r " & _
                    "ON p.AgencyID = r.AgencyID " & _
                    "AND r.AgeRegistration >= [b]8 [/b]" & _
                    "AND r.AgeRegistration <= [b]12 [/b]" & _
                "LEFT JOIN tblOrgHours as h " & _
                    "ON h.RegID = r.regid " & _
                    "AND h.ActivityDate >= @fromdt " & _
                    "AND h.ActivityDate <= @todt " & _
                "GROUP BY p.Agency " & _
                "ORDER BY p.Agency"
                
       rec1.Open (esql), conn, adOpenDynamic, adLockOptimistic
       
        i = 6
        
        Do Until rec1.EOF = True
                        
                ApExcel.Workbooks("CYSReport.xls").Sheets("Direct Service").Cells(i, [b]12[/b]).Formula = rec1.Fields(1)
                
                i = i + 2
                rec1.MoveNext

        
        Loop
                
        rec1.Close
            
       
'Get List of 13 to 17 and under--------
       esql = "DECLARE @fromdt AS datetime " & _
                "DECLARE @todt AS datetime " & _
                "SET @fromdt = '" & DTPicker1 & "' " & _
                "SET @todt = '" & DTPicker2 & "' " & _
                "SELECT  p.Agency, count(distinct r.RegID) " & _
                "FROM tblOrgProfile as p " & _
                "LEFT JOIN tblOrgRegistrations as r " & _
                    "ON p.AgencyID = r.AgencyID " & _
                    "AND r.AgeRegistration >= [b]13 [/b]" & _
                    "AND r.AgeRegistration <= [b]17 [/b]" & _
                "LEFT JOIN tblOrgHours as h " & _
                    "ON h.RegID = r.regid " & _
                    "AND h.ActivityDate >= @fromdt " & _
                    "AND h.ActivityDate <= @todt " & _
                "GROUP BY p.Agency " & _
                "ORDER BY p.Agency"
                
       rec1.Open (esql), conn, adOpenDynamic, adLockOptimistic
       
        i = 6
        
        Do Until rec1.EOF = True
                        
                ApExcel.Workbooks("CYSReport.xls").Sheets("Direct Service").Cells(i, [b]13[/b]).Formula = rec1.Fields(1)
                
                i = i + 2
                rec1.MoveNext

        
        Loop
                
        rec1.Close
        

'Get List of 18 to 20 and under--------
       esql = "DECLARE @fromdt AS datetime " & _
                "DECLARE @todt AS datetime " & _
                "SET @fromdt = '" & DTPicker1 & "' " & _
                "SET @todt = '" & DTPicker2 & "' " & _
                "SELECT  p.Agency, count(distinct r.RegID) " & _
                "FROM tblOrgProfile as p " & _
                "LEFT JOIN tblOrgRegistrations as r " & _
                    "ON p.AgencyID = r.AgencyID " & _
                    "AND r.AgeRegistration >= [b]18 [/b]" & _
                    "AND r.AgeRegistration <= [b]20 [/b]" & _
                "LEFT JOIN tblOrgHours as h " & _
                    "ON h.RegID = r.regid " & _
                    "AND h.ActivityDate >= @fromdt " & _
                    "AND h.ActivityDate <= @todt " & _
                "GROUP BY p.Agency " & _
                "ORDER BY p.Agency"
                
       rec1.Open (esql), conn, adOpenDynamic, adLockOptimistic
       
        i = 6
        
        Do Until rec1.EOF = True
                        
                ApExcel.Workbooks("CYSReport.xls").Sheets("Direct Service").Cells(i, [b]14[/b]).Formula = rec1.Fields(1)
                
                i = i + 2
                rec1.MoveNext

        
        Loop
                
        rec1.Close
        

Open in new window

0
al4629740
Asked:
al4629740
1 Solution
 
al4629740Author Commented:
as you can see, the bold did not work for me but I think you can see the variables that need attention
0
 
sirbountyCommented:
Something like this could work:

'Get List of 8 to 12 and under--------
for x as int16 = 8 to 22 step 5
  if x = 18 then 
    y = 20
  else
    y = x + 4
  end if
  esql = "DECLARE @fromdt AS datetime " & _
                "DECLARE @todt AS datetime " & _
                "SET @fromdt = '" & DTPicker1 & "' " & _
                "SET @todt = '" & DTPicker2 & "' " & _
                "SELECT  p.Agency, count(distinct r.RegID) " & _
                "FROM tblOrgProfile as p " & _
                "LEFT JOIN tblOrgRegistrations as r " & _
                    "ON p.AgencyID = r.AgencyID " & _
                    "AND r.AgeRegistration >= " & x & " & _
                    "AND r.AgeRegistration <= " & y & " & _
                "LEFT JOIN tblOrgHours as h " & _
                    "ON h.RegID = r.regid " & _
                    "AND h.ActivityDate >= @fromdt " & _
                    "AND h.ActivityDate <= @todt " & _
                "GROUP BY p.Agency " & _
                "ORDER BY p.Agency"
                
       rec1.Open (esql), conn, adOpenDynamic, adLockOptimistic
       
        i = 6
        
        Do Until rec1.EOF = True
                        
                ApExcel.Workbooks("CYSReport.xls").Sheets("Direct Service").Cells(i, [b]12[/b]).Formula = rec1.Fields(1)
                
                i = i + 2
                rec1.MoveNext

        
        Loop
                
        rec1.Close
next            
                    

Open in new window

0
 
royehSoftware EngineerCommented:
Open 3 recordsets, and loop through them all:

E.G.

'Get List of 8 to 12 and under--------
       esql1 = "DECLARE @fromdt AS datetime " & _
                "DECLARE @todt AS datetime " & _
                "SET @fromdt = '" & DTPicker1 & "' " & _
                "SET @todt = '" & DTPicker2 & "' " & _
                "SELECT  p.Agency, count(distinct r.RegID) " & _
                "FROM tblOrgProfile as p " & _
                "LEFT JOIN tblOrgRegistrations as r " & _
                    "ON p.AgencyID = r.AgencyID " & _
                    "AND r.AgeRegistration >= [b]8 [/b]" & _
                    "AND r.AgeRegistration <= [b]12 [/b]" & _
                "LEFT JOIN tblOrgHours as h " & _
                    "ON h.RegID = r.regid " & _
                    "AND h.ActivityDate >= @fromdt " & _
                    "AND h.ActivityDate <= @todt " & _
                "GROUP BY p.Agency " & _
                "ORDER BY p.Agency"
                
'Get List of 13 to 17 and under--------
       esql2 = "DECLARE @fromdt AS datetime " & _
                "DECLARE @todt AS datetime " & _
                "SET @fromdt = '" & DTPicker1 & "' " & _
                "SET @todt = '" & DTPicker2 & "' " & _
                "SELECT  p.Agency, count(distinct r.RegID) " & _
                "FROM tblOrgProfile as p " & _
                "LEFT JOIN tblOrgRegistrations as r " & _
                    "ON p.AgencyID = r.AgencyID " & _
                    "AND r.AgeRegistration >= [b]13 [/b]" & _
                    "AND r.AgeRegistration <= [b]17 [/b]" & _
                "LEFT JOIN tblOrgHours as h " & _
                    "ON h.RegID = r.regid " & _
                    "AND h.ActivityDate >= @fromdt " & _
                    "AND h.ActivityDate <= @todt " & _
                "GROUP BY p.Agency " & _
                "ORDER BY p.Agency"
                
'Get List of 18 to 20 and under--------
       esql3 = "DECLARE @fromdt AS datetime " & _
                "DECLARE @todt AS datetime " & _
                "SET @fromdt = '" & DTPicker1 & "' " & _
                "SET @todt = '" & DTPicker2 & "' " & _
                "SELECT  p.Agency, count(distinct r.RegID) " & _
                "FROM tblOrgProfile as p " & _
                "LEFT JOIN tblOrgRegistrations as r " & _
                    "ON p.AgencyID = r.AgencyID " & _
                    "AND r.AgeRegistration >= [b]18 [/b]" & _
                    "AND r.AgeRegistration <= [b]20 [/b]" & _
                "LEFT JOIN tblOrgHours as h " & _
                    "ON h.RegID = r.regid " & _
                    "AND h.ActivityDate >= @fromdt " & _
                    "AND h.ActivityDate <= @todt " & _
                "GROUP BY p.Agency " & _
                "ORDER BY p.Agency"
                
       rec1.Open (esql1), conn, adOpenDynamic, adLockOptimistic
       rec2.Open (esql2), conn, adOpenDynamic, adLockOptimistic
       rec3.Open (esql3), conn, adOpenDynamic, adLockOptimistic

        i = 6
        
        Do Until rec1.EOF = True And rec2.EOF = True And rec3.EOF = True
	
                If rec1.EOF = False Then ApExcel.Workbooks("CYSReport.xls").Sheets("Direct Service").Cells(i, [b]12[/b]).Formula = rec1.Fields(1)
                If rec2.EOF = False Then ApExcel.Workbooks("CYSReport.xls").Sheets("Direct Service").Cells(i, [b]13[/b]).Formula = rec2.Fields(1)
                If rec3.EOF = False Then ApExcel.Workbooks("CYSReport.xls").Sheets("Direct Service").Cells(i, [b]14[/b]).Formula = rec3.Fields(1)
                
                i = i + 2

                If rec1.EOF = False Then rec1.MoveNext
                If rec2.EOF = False Then rec2.MoveNext
                If rec3.EOF = False Then rec3.MoveNext
        
        Loop
                
        rec1.Close
        rec2.Close
        rec3.Close

Open in new window


You'll need to double-check the EOF flags, because you have multiple recordsets.
0

Featured Post

Free Tool: Site Down Detector

Helpful to verify reports of your own downtime, or to double check a downed website you are trying to access.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now