Improve a Function running time - Update data in a table(looping thru the data) (1 Viewer)

kfschaefer

Registered User.
Local time
Yesterday, 23:58
Joined
Oct 10, 2008
Messages
58
I have a pfunction in updating the data of blank fields in a table that met a certain criteria - the current process is slow and I am looking for a way to improve the processing time.

What I am attempting to accomplish - I have a list of employees and the training courses they are required to take, however, not all employees are required to take the same list of courses. My output needs to display all employees (and employee info) with the column headings = the ever changing list of Training Course Numbers. hence the Crosstab query I am using to update the temp table of the final results.

My current function compares the required courses for each employee inputs the completion date or leaves blank if not completed, however, it the employee is not Required to take the course in question, then I need to place a value = "NR" in the field. It is not as simple as replace all blanks with NR, since some required courses may not have been completed yet.

The big issue is that you need to compare the fieldname to the name of the course to determine if the code needs to replace the blank value with the NR, Since the crosstab query will determine the name of the column heading. It would be great if this could be simplified by using a query(s), however, I have had no luck with this method.

See Attached for example of Data from the Table. YELLOW cells = NOT Complete - Blank needs to be NR -


Any and all suggestions is greatly appreciated.

Karen

NOTE: "Ilp Learning Cd"(fieldname) = CourseNo
BEMS = EmployeeID (pk)

Code:
Public Sub FillInNRs()
On Error GoTo ProcError

'Purpose: Add "NR" (Not Required) for each employee record in the temporary linked table, zTempData,
'         where there is no course assignment for this employee (ie. no record in the select query "qryEmpMgrCourseList").

Dim db As DAO.Database
Dim rs1 As DAO.Recordset  'Temporary work table: zTempData
Dim rs2 As DAO.Recordset  'qryEmpMgrCourseList
Dim fld As DAO.Field
Dim i As Integer
Dim j As Integer          'Used to store a count of how many courses are in rs1 (zTempData)
Dim strSQL As String
Dim strSQL1 As String

   Set db = CurrentDb()

'Open rs1 (read/write ---> dbOpenDynaset). Note: If zTempData has no records, then we notify user and exit procedure.
   strSQL = "SELECT * FROM ztempdata ORDER BY BEMS"
   Set rs1 = db.OpenRecordset(strSQL, dbOpenDynaset)
   j = rs1.Fields.Count - 1  'We subtract 1 because field references are "zero-based".
   rs1.MoveLast: rs1.MoveFirst

   If rs1.EOF = True Then
      MsgBox "There are no required courses for current employees to process.", vbInformation, "No Records To Process..."
      GoTo ExitProc
   End If

'Open rs2 (read only ---> dbOpenSnapshot)
   strSQL1 = "SELECT BEMS, [Ilp Learning Cd] FROM qryEmpMgrCourseList ORDER BY BEMS, [Ilp Learning Cd]"
   Set rs2 = db.OpenRecordset(strSQL1, dbOpenSnapshot)
   rs2.MoveFirst

'Check field values in zTempData (rs1). This recordset includes a dynamic number of fields.
'The first four fields, fields 0-4, are constant: Org, MgrName, EmployeeName, BEMS and PercentCompleteByName

   Do Until rs1.EOF
      For i = 6 To j
         If rs1(i).Name <> rs2("[Ilp Learning Cd]") Then 'Or IsNull(rs1(i).Name) Course is "NR" (Not Required) for this BEMS
            rs1.Edit
            rs1(i) = "NR"
            rs1.Update
         Else
            rs2.MoveNext
                'We have reached the end of rs2, so add "NR" to any remaining fields in rs1 before moving on.
              If rs2.Fields("BEMS") <> rs1.Fields("BEMS") Or rs2.EOF Or IsNull(rs2.Fields("Bems")) Then
                Do Until i = j
                  i = i + 1
                  rs1.Edit
                  rs1(i) = "NR"
                  rs1.Update
               Loop
               rs1.MoveNext
            End If
         End If

      Next i
   Loop


ExitProc:
'Cleanup
   On Error Resume Next
   rs1.Close: Set rs1 = Nothing
   rs2.Close: Set rs2 = Nothing
   Set db = Nothing
   Exit Sub

ProcError:
    If Err.Number = 3021 Then
       Err.Clear
       Resume Next
    Else
        MsgBox "Error " & Err.Number & ": " & Err.Description, _
              vbCritical, "Error in procedure FillInNRs..."
        Resume Next
        Resume
    End If
End Sub
 

Attachments

  • zTempSample1.jpg
    zTempSample1.jpg
    103.4 KB · Views: 177
  • zTempSample.jpg
    zTempSample.jpg
    93.8 KB · Views: 181
  • TrainTempUpdate.jpg
    TrainTempUpdate.jpg
    91.8 KB · Views: 172
Last edited:

the_net_2.0

Banned
Local time
Today, 01:58
Joined
Sep 6, 2010
Messages
812
Karen. how long does it take?

I didn't look at these images, nor did I read your code really, but it is slow because of the multiple loops and conditionals.

if your two tables are related in some way, you can reduce it to one loop, and possibly even write a query with a single or double conditional.

if there are two tables, one for employees and the other for training courses, a normalized structure would really enable you to query out every single field from both tables, inner joining them on the one commond field. In that scenario, you can run an update query with the one result dataset as a single statement, or you can run one loop in code on the same query statement.

bottom line, that scenario would speed up the process, if not a lot, at least modestly.
 

vbaInet

AWF VIP
Local time
Today, 07:58
Joined
Jan 22, 2010
Messages
26,374
Just to expand a little on what the net 2.0 rightly said, the problem is you have two inner loops that run multiple times per field in rs2, then multiple times per field in rs1 and finally multiple times per record in rs1.

From your inner most loop and the one outside that I can see that the conditions you're checking against are pretty much static. You're better off using an UPDATE query or statement for these.
 

kfschaefer

Registered User.
Local time
Yesterday, 23:58
Joined
Oct 10, 2008
Messages
58
The problem with an update query is matching the CourseNo from another table to the FieldName(CourseNo). NOT A the same list every time - constantly changing, hence the need to create the temp table

UNFORTUNATELY - I am unable to post the mdb - privacy issues.

When I step thru the code it seems to get stuck in a loop -possibly in the second loop - moves error
ProcError:
If Err.Number = 3021 Then
Err.Clear

This code is not originally mine - so the error handling is not my usual.

The current process run prior to running this function is as follows - Note the final product will be exported to Excel - spreadsheet that must be in a certain order and layout.

1. Identify Standard Course list -
2. Create a temp table that has this standard Course List as fieldnames, with the other necessary fields: UnitChief, OrgNo, Manager, BEMS, EmployeeName, PercentComplete, Then the values of complete date or NR or LOA in the Matching Employee to the specific Courses. Using an Update query from the results of a Crosstab query.

Run Function to determine the value of the Course Fields(multiple fields)

3. Export to Excel(Workbook w/Mulitple WorkSheets)
4. Conditional format of the date cells.

Hope this clarifies a few things -

The code seems to get stuck in the loop, like I mentioned before - so Maybe we should concentrate on the fixing of the code instead of replacing it an I will deal with the speed issue later. to reiterate I need to compare the Field value to the field Name and also see if the employee has completed that course if so input the CompleteDate. Once the complete dates have been updated, then compare 1 row at a time compare Course name to FieldName if the equal and the Complete date is empty -determine if the employee is required to take that course, if not Update the data to reflect the "NR" other wise leave it blank. The 2 separate recordsets is the only way I know how to meet the various crieteria to determine which value should or should not be updated.


I hope this helps you understand what i am up against.
 

kfschaefer

Registered User.
Local time
Yesterday, 23:58
Joined
Oct 10, 2008
Messages
58
After stepping thru the code the problem happens when the EmployeeID (BEMS) are equal and there is a value in the date field, it moves to the error code.

Looking for suggestion on the best approach to have the recordset move to the next rs1.movenext in my code.

Thanks,

karen
 

the_net_2.0

Banned
Local time
Today, 01:58
Joined
Sep 6, 2010
Messages
812
karen,

ideally you should change the data structure here, because it's causing more headaches for you than it's worth, but reality is that you have to deal with what you have.

soooo...from reading your first post, I assume the source where you get the "required courses per employee" information is "qryEmpMgrCourseList"??? That is not clear, unless I missed it. Once that is figured out, you can write the function pretty easy. the code will simply consist of running down records from top to bottom, and through each record, looping the fields, because each course is one field, using rs.fields(index).name as the reference to the course value you need to check on. that's all it is.

the only thing you need to know is how you check the requirements for each employee, for each course, because that info is not displayed in the images you attached.
 

kfschaefer

Registered User.
Local time
Yesterday, 23:58
Joined
Oct 10, 2008
Messages
58
"qryEmpMgrCourseList" is the query that contains the actual dates completed for the courses taken by the employee.

the "zTemptable" fieldNames is the list of the required courses. I do have a query called "qryCoursesOnXLSExport" (required course List) is used to make the temp table via the crosstab query. the crosstab query returns the results of which Employee has completed the course by placing the completion date in the appropriate Course Number in the zTempTable.

Now I need to determine which of the Employees are not required to take certain courses.

After studying my data see the example, I think it would be best to take the First employeeid(BEMS) and check it against the list of required and if not equal to then input NR across the row, then move to the next BEMS in the ZtempTable.

Example: SEE Attachment.

If employeeID = '984248' in example
and
CourseNo "TR017003" is completed, however he is assigned to take course No "GLWC029", has not been completed should stay empty and then the remaining list of courses should be "NR".

Here is my latest attempt.
Code:
Public Sub FillInNRs()
On Error GoTo ProcError

'Purpose: Add "NR" (Not Required) for each employee record in the temporary linked table, zTempData,

' where there is no course assignment for this employee (ie. no record in the select query "qryEmpMgrCourseList_NH").

Dim rs1 As DAO.Recordset  'Temporary work table: zTempData
Dim rs2 As DAO.Recordset  'qryEmpMgrCourseList
Dim fld As DAO.Field
Dim i As Integer
Dim j As Integer          'Used to store a count of how many courses are in rs1 (zTempData)
Dim strSQL As String
Dim strSQL1 As String

   strSQL = "SELECT * FROM ztempdata ORDER BY BEMS"
   Set rs1 = CurrentDb.OpenRecordset(strSQL, dbOpenDynaset)
  
   j = rs1.Fields.Count - 1  'We subtract 1 because field references are "zero-based".

   If rs1.RecordCount = 0 Then
      MsgBox "There are no required courses for current employees to process.", vbInformation, "No Records To Process..."
      GoTo ExitProc
   End If
   
   'List of Employee and Course numbers where New Hire rules apply - Code to insert NH instead of a date
   strSQL1 = "SELECT *  from qryEmpMgrCourseList"
   Set rs2 = CurrentDb.OpenRecordset(strSQL1, dbOpenSnapshot)
'Check field values in zTempData (rs1). This recordset includes a dynamic number of fields.
'The first four fields, fields 0-6, are constant: UBEMS, Org, MgrName, EmployeeName, BEMS and PCT

    rs1.MoveFirst
    Do Until rs1.EOF
        Do Until rs2.EOF
            If rs1("BEMS") = rs2("BEMS") Then
                For i = 6 To j
                    If rs1(i).Name <> rs2("[Ilp Learning Cd]") Then
                        rs1.Edit
                        rs1(i) = "NR"
                        rs1.Update
                        Exit For
                    End If
                Next i
            rs2.MoveNext
            End If
        Loop
        rs1.MoveNext
    Loop
    
ExitProc:
'Cleanup
   On Error Resume Next
   rs1.Close: Set rs1 = Nothing
   rs2.Close: Set rs2 = Nothing
   Exit Sub

ProcError:
    If Err.Number = 3021 Then
       Err.Clear
       Resume Next
    Else
        MsgBox "Error " & Err.Number & ": " & Err.Description, _
              vbCritical, "Error in procedure FillInNRs..."
        Resume Next
        Resume
    End If
End Sub
but I am unsuccessful ion getting the data to update correctly.

Thanks for your assistance, Please note I will be calling it quits for the day and will be back online in the a.m.

Karen
 

Attachments

  • zTempSample.jpg
    zTempSample.jpg
    93.8 KB · Views: 176
  • zTempSample1.jpg
    zTempSample1.jpg
    103.4 KB · Views: 170

the_net_2.0

Banned
Local time
Today, 01:58
Joined
Sep 6, 2010
Messages
812
OK. I'm not following the problem at all Karen, sorry about that.

From what I read, the crosstab query and temp table are both redundant and not needed. This is not putting a damper on things, but it really does sound like you are making this much more complicated than need be.

I'm not really sure what else to say at this point. But, what I will offer, and I'm sure others here will as well, is a short service on your db. If you want to upload a sample with sample data, include the data as it is now and what the result should look like, I'm 99.9% sure someone here can get a solution posted back up here in minutes.

I'm sometimes accused of being overconfident. :D
 

vbaInet

AWF VIP
Local time
Today, 07:58
Joined
Jan 22, 2010
Messages
26,374
Looking at the attachment that has some rows blank and some fields highlighted doesn't make any sense to us. Maybe if it had some illustrations as to how does yellow cells were derived based on the two tables then it might be of some use.

A crosstab query on its own is slow and looping through a large recordset and making changes per row is slow. Basing your recordset on an already slow crosstab query will make things even slower, plus the other factors already mentioned.

To be honest, if you're needing to compare field names with field values, then it definitely indicates that a data restructure is needed as the net has already pointed out. Now that you reiterated the point that you're checking field names against field values I can see that an update query will be of no use. At quick glance of your loops there's no way of optimising it.

Unless we can see the db or see the records, the tables and how they are related there's not much else we can advice.
 

kfschaefer

Registered User.
Local time
Yesterday, 23:58
Joined
Oct 10, 2008
Messages
58
Ok - here goes.

I have a spreadsheet that is layout per the users request, I need to put the information from the database into this spreadsheet. This spreadsheet includes multiple worksheets, 1 per Unit manager and 1 per unit manger summary. I have no say on how the data is to be displayed, Since the list of courses can and will change I need to be able to handle this change. The course name, number, Mandatory Date, Duration, etc make of the first 6 rows of data. This will be based on the standard required list of courses. Hence I have a way to populate these rows and columns of data based on this list. Since this list of Courses fluctuates the total number of columns will change and the necessary employee's courses need to line up with these columns.

So my solution was to create a temp table that establish the necessary fieldnames (various Courses) That need to be in certain order: By Mandatory date, then alpha order of the Course Name (a requirement for the xls)

So based on the Crosstab query where a value = 0 I am creating this temp table on the fly(temporarily linked table) established the correct FieldNames(CourseNo), Then I use the crosstab query to update this temp table. Once I have populated the temp table with the employees completion dates for the various courses I then need to validate which courses are still required and not completed. And those where the employee is not required to take - Update the "NR" in the empty fields. I will later need to indicate which employees have been Newly hired within the last 6 months of current date, and which employees are on Loan to the dept - this changes the requirement we need to track for these individuals.

As I stated that it is not a data structure issue - I have normalized by data the best I could, but to meet the requirements of this particular portion of the database/xls I am forced to be creative in my solution. I have to work with what I got - a simple update query will not work in my case because of the fluctuating field names and match the employee data in the correct order.

Any and all suggestions are extremely appreciated.

Thanks.
 

spikepl

Eledittingent Beliped
Local time
Today, 08:58
Joined
Nov 3, 2010
Messages
6,142
I too have difficulties following what is going on.

I have a process which starts with data input from worksheats, with variable number of columns in each worksheet. I gobble up this data into some tables, and then I transpose the data, each table inot a new transposed table, so that each new row corresponds to an old column etc.. Thereafter it's easy to deal with the data in the normal fashion. It appears to me that your data simply is not structured in the normalized fashion, but just because the input isn't is it necessary to voluntarily persist with the suffering throughout ?:)
 

kfschaefer

Registered User.
Local time
Yesterday, 23:58
Joined
Oct 10, 2008
Messages
58
Thank you for your input, however, this is what I have to work with and cannot be changed due to the user requirements that they want to use the existing worksheet and how it is formatted. So I need to find a way to get my normalized data from my database to the spreadsheet without changing the look of the xls and make it work seamlessly. This is just one small part of picture. 1 report out of many - but my user is very stubborn. My database does have referential integrity and is normalized - it just getting this data into the xls will be the death of me and of course I am under an extreme deadline - must have deliverable by years end.

My current problem is analyzing the data in the temp table which is the results of the crosstab query and determine which employees are not required to certain courses and indicated it by updating the value to "NR". And since the fieldname contains the CourseNo I need to compare fieldname to the list of required courses and see if the current employee is required or not. That is why I am using the comparison of the 2 different recordsets.

I was thinking that I might try a different approach to the data from the ztemptable, BEMS to see if that BEMS exists in RequiredCourseList, if so and is null than indicate with maybe NC - Not Complete instead of leaving it blank, then do the remain empty fields in the zTEmptable = NR.

Does this make any sense?

Thanks,
Karen
 

spikepl

Eledittingent Beliped
Local time
Today, 08:58
Joined
Nov 3, 2010
Messages
6,142
I think you misunderstood me: I transpose data in Access - in that way the users' input is unaffected, the output I can make whichever way I wish (or is required), but the intervening steps are dealing with data the way it's supposed to be.
 

kfschaefer

Registered User.
Local time
Yesterday, 23:58
Joined
Oct 10, 2008
Messages
58
How would you recommend to transpose the ever changing column headings (CourseNo) and match up the employee data so that the appropriate data matches the column headings - from within Access and are in the correct order?
When I attempt to use crosstab Queries it does not allow me to place the correct order of the courseNo to match the spreadsheet. Crosstabs will only put in alpha/numeric order. I already went down that road and could not find a good solution.

See my recent attachment of the spreadsheet I need to update - and again keep in mind that the column headings will constantly change depending on the courses being tracked.

K
 

spikepl

Eledittingent Beliped
Local time
Today, 08:58
Joined
Nov 3, 2010
Messages
6,142
The column headings are course names right? From what I understand you spreadsheet has a variable number of columns, but the items in the first 6 rows are always of the same nature ? Then that corresponds to data in table like:

Courses:

CourseID (PK)
CourseName
...
(the remaining rows)

I am not sure what follows the first 6 rows in your spreadsheet, but then again nothing stops you from dealing with the rest in either same or different way, as necessary.

And a transpose-routine would simply run through the columns of the table created by reading the spreadsheet, and create a new row in a new table, plugging the column name into the second field, for as many rows as there are columns in the original table. The first field would then be CourseID, the second CourseName and so on. After running through the column headers of the original table (or row 1, depending on exactly how you import the data), then run through the next row of the original table, thereby filling the next column of the new table. And so on.

From this point onwards you can deal with the data with normal queries, and you can always transform it back into which ever shape or form is required for output.
 

kfschaefer

Registered User.
Local time
Yesterday, 23:58
Joined
Oct 10, 2008
Messages
58
but back to my original problem indicating which course is required and which is not so I still need to update the temptable accordingly with NR or NC, etc. the output of the data is not so much the issue - it is updating actual courses per employee with a date or some time of code indicator. Hence I need to match the fieldname to the field value from the other table to determine which is which..

k
 

kfschaefer

Registered User.
Local time
Yesterday, 23:58
Joined
Oct 10, 2008
Messages
58
THANKS FOR ALL YOUR INPUT, however, I was able to resolve the issue by rethinking my approach to the problem. I broke up the updating of the temp table. I reverse my order of Updating which code ("NC", LOA, or NH), then updated any Null values in the fields to the "NR". this seems to have resolved my issue and the processing time is relatively quick.

See my final code.
Code:
 '***********************************UPDATES TEMP TABLE WITH VARIOUS CODES PRIOR TO EXPORT TO TRAINING WORKSHEET *****************
    
    strSQL = "SELECT BEMS, [Ilp Learning Cd], CompletionDt" & _
             " FROM qryEmpMgrCourseList" & _
             " WHERE (((CompletionDt) Is Null))" & _
             " GROUP BY BEMS, [Ilp Learning Cd], CompletionDt"
    Set rs = db.OpenRecordset(strSQL, dbOpenDynaset)
    
    If rs.RecordCount = 0 Then
       MsgBox "There are no required courses for current employees to process.", vbInformation, "No Records To Process..."
       GoTo ExitProc
    End If
    
    'List of Employee and Course numbers where Course is required and Code to insert NC (Not Completed) instead of a date
    rs.MoveFirst
    Do Until rs.EOF
        gBEMS = rs("BEMS").value
            strSQL1 = "SELECT * FROM ztempdata WHERE (BEMS=" & gBEMS & ")"
            Set rs1 = db.OpenRecordset(strSQL1, dbOpenDynaset)
            j = rs1.Fields.Count - 1  'We subtract 1 because field references are "zero-based".
                Do Until rs1.EOF
                    If rs("BEMS") = rs1("BEMS") Then
                        For i = 6 To j
                            If rs1(i).Name = rs("[Ilp Learning Cd]") Then
                                rs1.Edit
                                rs1(i) = "NC"
                                rs1.Update
                                Exit For
                            End If
                        Next i
                rs1.MoveNext
                    End If
                Loop
    rs.MoveNext
    Loop
   
    'Now, fill in the "NH" (New Hire) data into this temporary work table.
    
    strSQL = "SELECT BEMS, [Ilp Learning Cd], CompletionDt" & _
             " FROM qryEmpMgrCourseList" & _
             " WHERE (((CompletionDt) Is Null) AND NH = 'X')" & _
             " GROUP BY BEMS, [Ilp Learning Cd], CompletionDt"
    Set rs = db.OpenRecordset(strSQL, dbOpenDynaset)
    
    'List of Employee and Course numbers where Course are Coded to insert NH (New Hire) instead of a date
   ' rs.MoveFirst
    Do Until rs.EOF
        gBEMS = rs("BEMS").value
            strSQL1 = "SELECT * FROM ztempdata WHERE (BEMS=" & gBEMS & ")"
            Set rs1 = db.OpenRecordset(strSQL1, dbOpenDynaset)
            j = rs1.Fields.Count - 1  'We subtract 1 because field references are "zero-based".
                Do Until rs1.EOF
                    If rs("BEMS") = rs1("BEMS") Then
                        For i = 6 To j
                            If rs1(i).Name = rs("[Ilp Learning Cd]") Then
                                rs1.Edit
                                rs1(i) = "NH"
                                rs1.Update
                                Exit For
                            End If
                        Next i
                rs1.MoveNext
                    End If
                Loop
    rs.MoveNext
    Loop
    
    'Fills in the "LOA" (Leave of Absences) data into this temporary work table. - Not to be included in final count/percentages

    strSQL = "SELECT qryEmpMgrCourseList.UCBEMS, qryEmpMgrCourseList.MgrName, qryEmpMgrCourseList.BEMS," & _
            " qryEmpMgrCourseList.Pct, qryEmpMgrCourseList.[Ilp Learning Cd], qryEmpMgrCourseList.MandReqDate," & _
            " qryEmpInfo.LOA_StartDate, qryEmpInfo.LOA_EndDate" & _
            " FROM qryEmpMgrCourseList INNER JOIN qryEmpInfo ON qryEmpMgrCourseList.BEMS = qryEmpInfo.BEMS" & _
            " WHERE (((qryEmpInfo.LOA_StartDate) Is Not Null)) OR (((qryEmpInfo.LOA_EndDate) Is Not Null))"
    Set rs = db.OpenRecordset(strSQL, dbOpenDynaset)
       
    Do Until rs.EOF
        gBEMS = rs("BEMS").value
            strSQL1 = "SELECT * FROM ztempdata WHERE (BEMS=" & gBEMS & ")"
            Set rs1 = db.OpenRecordset(strSQL1, dbOpenDynaset)
            j = rs1.Fields.Count - 1  'We subtract 1 because field references are "zero-based".
                Do Until rs1.EOF
                    If rs("BEMS") = rs1("BEMS") Then
                        For i = 6 To j
                            If rs1(i).Name = rs("[Ilp Learning Cd]") Then
                                rs1.Edit
                                rs1(i) = "LOA"
                                rs1.Update
                                Exit For
                            End If
                        Next i
                rs1.MoveNext
                    End If
                Loop
    rs.MoveNext
    Loop

'Now, fill in the "NR" (Not Required) data into this temporary work table where CourseNos(date field) are NULL.
    strSQL = "SELECT * FROM ztempdata"
    Set rs = db.OpenRecordset(strSQL, dbOpenDynaset)
    j = rs.Fields.Count - 1  'We subtract 1 because field references are "zero-based".
        Do Until rs.EOF
            For i = 6 To j
                If IsNull(rs(i).value) = True Then
                    rs.Edit
                    rs(i) = "NR"
                    rs.Update
                End If
            Next i
        rs.MoveNext
        Loop

Many thanks of all the time and effort you put into my problem.

Karen:):):p
 

vbaInet

AWF VIP
Local time
Today, 07:58
Joined
Jan 22, 2010
Messages
26,374
Even more loops:eek::p

Although I would have done things very differently, I digress. In any case I'm pleased to hear that you derived at a quicker solution.
 

Users who are viewing this thread

Top Bottom