Totals from subform problem

A

andrew

Hi

I am having problems with totals from a subform. I am using 2 text boxes in
the footer of the subform to update values on the main form. It works fine
until there are 8 or more records in the subform. Once this number is
reached the 2 text boxes in the subform no longer contain a value and the
main form is not updated. However if the last record in the subform is
updated, 1 of the values is updated on the main form but the other is not.
Can anyone explain why this is happening and what to do about it?

The 2 boxes in the subform footer contain these expressions (it seems this
is not working once there are 8 records in the subform):

=Sum([TotalCost])
=Sum([TotalSale])


This function updates text boxes on the parent form (called by AfterUpdate
events on controls in the sub form):

Private Function funEquipmentValuesUpdate()
'Updates text boxes on parent form

' Requery to refresh the values in this form
Me.Requery

' Update Cost Price and Sale Price values in frmEquipment
Me.Parent.txtCostPrice = Me.txtCostTotal
Me.Parent.txtSalePrice = Me.txtSaleTotal + Me.Parent.txtAdjustment
Me.Parent.Dirty = False ' ensure form data is saved

End Function


This query is the record source for the sub form:

SELECT
ED.lngEquipmentID,
ED.lngEquipmentID2,
ED.sngQty,
E.strDescription,
E.strStockNo,
C.strCo,
ED.ysnDataType,
E.curCostPrice * ED.sngQty AS TotalCost,
E.curAdjustment * ED.sngQty AS TotalAdjustment,
E.curSalePrice * ED.sngQty AS TotalSale,
(E.curSalePrice - E.curAdjustment) * ED.sngQty AS TotalSalePreAdjust
FROM (
tblEquipmentDetails ED

INNER JOIN tblEquipment E
ON ED.lngEquipmentID2 = E.lngEquipmentID)

INNER JOIN tblCo C
ON E.lngCoID = C.lngCoID
WHERE ED.ysnDataType=Yes;


Thanks for your help.

Andrew
 
M

Marshall Barton

andrew said:
I am having problems with totals from a subform. I am using 2 text boxes in
the footer of the subform to update values on the main form. It works fine
until there are 8 or more records in the subform. Once this number is
reached the 2 text boxes in the subform no longer contain a value and the
main form is not updated. However if the last record in the subform is
updated, 1 of the values is updated on the main form but the other is not.
Can anyone explain why this is happening and what to do about it?

The 2 boxes in the subform footer contain these expressions (it seems this
is not working once there are 8 records in the subform):

=Sum([TotalCost])
=Sum([TotalSale])


This function updates text boxes on the parent form (called by AfterUpdate
events on controls in the sub form):

Private Function funEquipmentValuesUpdate()
'Updates text boxes on parent form

' Requery to refresh the values in this form
Me.Requery

' Update Cost Price and Sale Price values in frmEquipment
Me.Parent.txtCostPrice = Me.txtCostTotal
Me.Parent.txtSalePrice = Me.txtSaleTotal + Me.Parent.txtAdjustment
Me.Parent.Dirty = False ' ensure form data is saved

End Function


This query is the record source for the sub form:

SELECT
ED.lngEquipmentID,
ED.lngEquipmentID2,
ED.sngQty,
E.strDescription,
E.strStockNo,
C.strCo,
ED.ysnDataType,
E.curCostPrice * ED.sngQty AS TotalCost,
E.curAdjustment * ED.sngQty AS TotalAdjustment,
E.curSalePrice * ED.sngQty AS TotalSale,
(E.curSalePrice - E.curAdjustment) * ED.sngQty AS TotalSalePreAdjust
FROM (
tblEquipmentDetails ED

INNER JOIN tblEquipment E
ON ED.lngEquipmentID2 = E.lngEquipmentID)

INNER JOIN tblCo C
ON E.lngCoID = C.lngCoID
WHERE ED.ysnDataType=Yes;


Why it is happening is because text box expressions are
evaluated in a fairly low priority background task. But,
the events and VBA code run at a high priority. This means
that your code is running before the text box expressions
are calculated.

The way around it is to use text box expressions in both the
main form and the subform text boxs, The txtCostPrice text
box expressions on the main form would be like:
=subformcontrol.Form.txtCostTotal

OR use VBA code to calculate the sub form text box values
and then set the values on the main form.

I see that you are trying to save these calculated values,
which is a huge No-No in a database. If you insist on doing
that, then you must use the VBA approach instead of the text
box expressions.
 
A

andrew

Marshall Barton said:
andrew said:
I am having problems with totals from a subform. I am using 2 text boxes in
the footer of the subform to update values on the main form. It works fine
until there are 8 or more records in the subform. Once this number is
reached the 2 text boxes in the subform no longer contain a value and the
main form is not updated. However if the last record in the subform is
updated, 1 of the values is updated on the main form but the other is not.
Can anyone explain why this is happening and what to do about it?

The 2 boxes in the subform footer contain these expressions (it seems this
is not working once there are 8 records in the subform):

=Sum([TotalCost])
=Sum([TotalSale])


This function updates text boxes on the parent form (called by AfterUpdate
events on controls in the sub form):

Private Function funEquipmentValuesUpdate()
'Updates text boxes on parent form

' Requery to refresh the values in this form
Me.Requery

' Update Cost Price and Sale Price values in frmEquipment
Me.Parent.txtCostPrice = Me.txtCostTotal
Me.Parent.txtSalePrice = Me.txtSaleTotal + Me.Parent.txtAdjustment
Me.Parent.Dirty = False ' ensure form data is saved

End Function


This query is the record source for the sub form:

SELECT
ED.lngEquipmentID,
ED.lngEquipmentID2,
ED.sngQty,
E.strDescription,
E.strStockNo,
C.strCo,
ED.ysnDataType,
E.curCostPrice * ED.sngQty AS TotalCost,
E.curAdjustment * ED.sngQty AS TotalAdjustment,
E.curSalePrice * ED.sngQty AS TotalSale,
(E.curSalePrice - E.curAdjustment) * ED.sngQty AS TotalSalePreAdjust
FROM (
tblEquipmentDetails ED

INNER JOIN tblEquipment E
ON ED.lngEquipmentID2 = E.lngEquipmentID)

INNER JOIN tblCo C
ON E.lngCoID = C.lngCoID
WHERE ED.ysnDataType=Yes;


Why it is happening is because text box expressions are
evaluated in a fairly low priority background task. But,
the events and VBA code run at a high priority. This means
that your code is running before the text box expressions
are calculated.

The way around it is to use text box expressions in both the
main form and the subform text boxs, The txtCostPrice text
box expressions on the main form would be like:
=subformcontrol.Form.txtCostTotal

OR use VBA code to calculate the sub form text box values
and then set the values on the main form.

I see that you are trying to save these calculated values,
which is a huge No-No in a database. If you insist on doing
that, then you must use the VBA approach instead of the text
box expressions.

Thank you, that's a great help.

I realise that the design is denormalised. The reason I am saving the
values is because there is a heirarchy. Each item can be a component in
another, which in turn can be a component in another ... At present there
are up to 4 layers, but in theory there could be more. The totals are then
used throughout the application to calculate installation costs, service
charges, etc. Without the availability of Stored Procedures, calculating
the whole lot at run time would be (a) pretty complex and (b) fairly costly.
I have an SQL UPDATE query that runs in a loop to keep the totals in sync
when they are changed - this seems to work fairly well apart from the problem
described.

However, if you have any suggestions I would be more than happy to consider
how the design could be improved.

Thanks again

Andrew MCDBA MCSE
 
M

Marshall Barton

andrew said:
Marshall Barton said:
andrew said:
I am having problems with totals from a subform. I am using 2 text boxes in
the footer of the subform to update values on the main form. It works fine
until there are 8 or more records in the subform. Once this number is
reached the 2 text boxes in the subform no longer contain a value and the
main form is not updated. However if the last record in the subform is
updated, 1 of the values is updated on the main form but the other is not.
Can anyone explain why this is happening and what to do about it?

The 2 boxes in the subform footer contain these expressions (it seems this
is not working once there are 8 records in the subform):

=Sum([TotalCost])
=Sum([TotalSale])

This function updates text boxes on the parent form (called by AfterUpdate
events on controls in the sub form):

Private Function funEquipmentValuesUpdate()
'Updates text boxes on parent form

' Requery to refresh the values in this form
Me.Requery

' Update Cost Price and Sale Price values in frmEquipment
Me.Parent.txtCostPrice = Me.txtCostTotal
Me.Parent.txtSalePrice = Me.txtSaleTotal + Me.Parent.txtAdjustment
Me.Parent.Dirty = False ' ensure form data is saved

End Function


This query is the record source for the sub form:

SELECT
ED.lngEquipmentID,
ED.lngEquipmentID2,
ED.sngQty,
E.strDescription,
E.strStockNo,
C.strCo,
ED.ysnDataType,
E.curCostPrice * ED.sngQty AS TotalCost,
E.curAdjustment * ED.sngQty AS TotalAdjustment,
E.curSalePrice * ED.sngQty AS TotalSale,
(E.curSalePrice - E.curAdjustment) * ED.sngQty AS TotalSalePreAdjust
FROM (
tblEquipmentDetails ED

INNER JOIN tblEquipment E
ON ED.lngEquipmentID2 = E.lngEquipmentID)

INNER JOIN tblCo C
ON E.lngCoID = C.lngCoID
WHERE ED.ysnDataType=Yes;


Why it is happening is because text box expressions are
evaluated in a fairly low priority background task. But,
the events and VBA code run at a high priority. This means
that your code is running before the text box expressions
are calculated.

The way around it is to use text box expressions in both the
main form and the subform text boxs, The txtCostPrice text
box expressions on the main form would be like:
=subformcontrol.Form.txtCostTotal

OR use VBA code to calculate the sub form text box values
and then set the values on the main form.

I see that you are trying to save these calculated values,
which is a huge No-No in a database. If you insist on doing
that, then you must use the VBA approach instead of the text
box expressions.

Thank you, that's a great help.

I realise that the design is denormalised. The reason I am saving the
values is because there is a heirarchy. Each item can be a component in
another, which in turn can be a component in another ... At present there
are up to 4 layers, but in theory there could be more. The totals are then
used throughout the application to calculate installation costs, service
charges, etc. Without the availability of Stored Procedures, calculating
the whole lot at run time would be (a) pretty complex and (b) fairly costly.
I have an SQL UPDATE query that runs in a loop to keep the totals in sync
when they are changed - this seems to work fairly well apart from the problem
described.

However, if you have any suggestions I would be more than happy to consider
how the design could be improved.


As long as you understand the problems associated with
storing calculated values, and because I do not have a clear
picture of your entire application in mind, I won't belabor
the point.

Did you need help using VBA to calculate the sum values?
 
A

andrew

Marshall Barton said:
andrew said:
Marshall Barton said:
andrew wrote:
I am having problems with totals from a subform. I am using 2 text boxes in
the footer of the subform to update values on the main form. It works fine
until there are 8 or more records in the subform. Once this number is
reached the 2 text boxes in the subform no longer contain a value and the
main form is not updated. However if the last record in the subform is
updated, 1 of the values is updated on the main form but the other is not.
Can anyone explain why this is happening and what to do about it?

The 2 boxes in the subform footer contain these expressions (it seems this
is not working once there are 8 records in the subform):

=Sum([TotalCost])
=Sum([TotalSale])

This function updates text boxes on the parent form (called by AfterUpdate
events on controls in the sub form):

Private Function funEquipmentValuesUpdate()
'Updates text boxes on parent form

' Requery to refresh the values in this form
Me.Requery

' Update Cost Price and Sale Price values in frmEquipment
Me.Parent.txtCostPrice = Me.txtCostTotal
Me.Parent.txtSalePrice = Me.txtSaleTotal + Me.Parent.txtAdjustment
Me.Parent.Dirty = False ' ensure form data is saved

End Function


This query is the record source for the sub form:

SELECT
ED.lngEquipmentID,
ED.lngEquipmentID2,
ED.sngQty,
E.strDescription,
E.strStockNo,
C.strCo,
ED.ysnDataType,
E.curCostPrice * ED.sngQty AS TotalCost,
E.curAdjustment * ED.sngQty AS TotalAdjustment,
E.curSalePrice * ED.sngQty AS TotalSale,
(E.curSalePrice - E.curAdjustment) * ED.sngQty AS TotalSalePreAdjust
FROM (
tblEquipmentDetails ED

INNER JOIN tblEquipment E
ON ED.lngEquipmentID2 = E.lngEquipmentID)

INNER JOIN tblCo C
ON E.lngCoID = C.lngCoID
WHERE ED.ysnDataType=Yes;


Why it is happening is because text box expressions are
evaluated in a fairly low priority background task. But,
the events and VBA code run at a high priority. This means
that your code is running before the text box expressions
are calculated.

The way around it is to use text box expressions in both the
main form and the subform text boxs, The txtCostPrice text
box expressions on the main form would be like:
=subformcontrol.Form.txtCostTotal

OR use VBA code to calculate the sub form text box values
and then set the values on the main form.

I see that you are trying to save these calculated values,
which is a huge No-No in a database. If you insist on doing
that, then you must use the VBA approach instead of the text
box expressions.

Thank you, that's a great help.

I realise that the design is denormalised. The reason I am saving the
values is because there is a heirarchy. Each item can be a component in
another, which in turn can be a component in another ... At present there
are up to 4 layers, but in theory there could be more. The totals are then
used throughout the application to calculate installation costs, service
charges, etc. Without the availability of Stored Procedures, calculating
the whole lot at run time would be (a) pretty complex and (b) fairly costly.
I have an SQL UPDATE query that runs in a loop to keep the totals in sync
when they are changed - this seems to work fairly well apart from the problem
described.

However, if you have any suggestions I would be more than happy to consider
how the design could be improved.


As long as you understand the problems associated with
storing calculated values, and because I do not have a clear
picture of your entire application in mind, I won't belabor
the point.

Did you need help using VBA to calculate the sum values?

I agree whole heartedly with your general point. I think (hope) I have
arrived at a reasonable compromise in this case, though I'm always open to
improvements.

Thanks for the offer of help with the VBA. I believe it can be done using
either the DSum function or embedded SQL - I don't know which would be more
efficient. I had a brief play with DSum and didn't get it to work so yes,
any help would be much appreciated.

Andrew
 
M

Marshall Barton

andrew said:
Marshall Barton said:
andrew said:
:
andrew wrote:
I am having problems with totals from a subform. I am using 2 text boxes in
the footer of the subform to update values on the main form. It works fine
until there are 8 or more records in the subform. Once this number is
reached the 2 text boxes in the subform no longer contain a value and the
main form is not updated. However if the last record in the subform is
updated, 1 of the values is updated on the main form but the other is not.
Can anyone explain why this is happening and what to do about it?

The 2 boxes in the subform footer contain these expressions (it seems this
is not working once there are 8 records in the subform):

=Sum([TotalCost])
=Sum([TotalSale])

This function updates text boxes on the parent form (called by AfterUpdate
events on controls in the sub form):

Private Function funEquipmentValuesUpdate()
'Updates text boxes on parent form

' Requery to refresh the values in this form
Me.Requery

' Update Cost Price and Sale Price values in frmEquipment
Me.Parent.txtCostPrice = Me.txtCostTotal
Me.Parent.txtSalePrice = Me.txtSaleTotal + Me.Parent.txtAdjustment
Me.Parent.Dirty = False ' ensure form data is saved

End Function


This query is the record source for the sub form:

SELECT
ED.lngEquipmentID,
ED.lngEquipmentID2,
ED.sngQty,
E.strDescription,
E.strStockNo,
C.strCo,
ED.ysnDataType,
E.curCostPrice * ED.sngQty AS TotalCost,
E.curAdjustment * ED.sngQty AS TotalAdjustment,
E.curSalePrice * ED.sngQty AS TotalSale,
(E.curSalePrice - E.curAdjustment) * ED.sngQty AS TotalSalePreAdjust
FROM (
tblEquipmentDetails ED

INNER JOIN tblEquipment E
ON ED.lngEquipmentID2 = E.lngEquipmentID)

INNER JOIN tblCo C
ON E.lngCoID = C.lngCoID
WHERE ED.ysnDataType=Yes;


Why it is happening is because text box expressions are
evaluated in a fairly low priority background task. But,
the events and VBA code run at a high priority. This means
that your code is running before the text box expressions
are calculated.

The way around it is to use text box expressions in both the
main form and the subform text boxs, The txtCostPrice text
box expressions on the main form would be like:
=subformcontrol.Form.txtCostTotal

OR use VBA code to calculate the sub form text box values
and then set the values on the main form.

I see that you are trying to save these calculated values,
which is a huge No-No in a database. If you insist on doing
that, then you must use the VBA approach instead of the text
box expressions.


Thank you, that's a great help.

I realise that the design is denormalised. The reason I am saving the
values is because there is a heirarchy. Each item can be a component in
another, which in turn can be a component in another ... At present there
are up to 4 layers, but in theory there could be more. The totals are then
used throughout the application to calculate installation costs, service
charges, etc. Without the availability of Stored Procedures, calculating
the whole lot at run time would be (a) pretty complex and (b) fairly costly.
I have an SQL UPDATE query that runs in a loop to keep the totals in sync
when they are changed - this seems to work fairly well apart from the problem
described.

However, if you have any suggestions I would be more than happy to consider
how the design could be improved.


As long as you understand the problems associated with
storing calculated values, and because I do not have a clear
picture of your entire application in mind, I won't belabor
the point.

Did you need help using VBA to calculate the sum values?

I agree whole heartedly with your general point. I think (hope) I have
arrived at a reasonable compromise in this case, though I'm always open to
improvements.

Thanks for the offer of help with the VBA. I believe it can be done using
either the DSum function or embedded SQL - I don't know which would be more
efficient. I had a brief play with DSum and didn't get it to work so yes,
any help would be much appreciated.


Since Sum operates on the filtered records in the form's
record source, it can be difficult getting DSum or creating
an SQL statement to select the same records displayed in the
form.

The form's recordset contains exactly the records you need
to use in the sum calculation and code in the subform could
look like:

Dim SumTotalCost As Currency
Dim SumTotalSale As Currency

With Me.RecordsetClone
If .RecordCount > 0 Then
.MoveFirst
Do Until .EOF
SumTotalCost = SumTotalCost + !TotalCost
SumTotalSale = SumTotalSale + !TotalSale
.MoveNext
Loop
Me.txtCostTotal = SumTotalCost
Me.txtSaleTotal = SumTotalSale
Else
Me.txtCostTotal = Null
Me.txtSaleTotal = Null
End If

Me.Parent.txtCostPrice = Me.txtCostTotal
Me.Parent.txtSalePrice = Me.txtSaleTotal _
+ Me.Parent.txtAdjustment
Me.Parent.Dirty = False
End With

I think doing this in the AfterUpdate event of the cost and
sale text boxes is way too soon. You should not force a
record to be saved until users do something to indicate that
they are done entering/editing the record. In general that
would be in the subform's **form** AfterUpdate event. At
that point, there is no need to requery the subform.
 
A

andrew

Marshall Barton said:
andrew said:
Marshall Barton said:
andrew wrote:
:
andrew wrote:
I am having problems with totals from a subform. I am using 2 text boxes in
the footer of the subform to update values on the main form. It works fine
until there are 8 or more records in the subform. Once this number is
reached the 2 text boxes in the subform no longer contain a value and the
main form is not updated. However if the last record in the subform is
updated, 1 of the values is updated on the main form but the other is not.
Can anyone explain why this is happening and what to do about it?

The 2 boxes in the subform footer contain these expressions (it seems this
is not working once there are 8 records in the subform):

=Sum([TotalCost])
=Sum([TotalSale])

This function updates text boxes on the parent form (called by AfterUpdate
events on controls in the sub form):

Private Function funEquipmentValuesUpdate()
'Updates text boxes on parent form

' Requery to refresh the values in this form
Me.Requery

' Update Cost Price and Sale Price values in frmEquipment
Me.Parent.txtCostPrice = Me.txtCostTotal
Me.Parent.txtSalePrice = Me.txtSaleTotal + Me.Parent.txtAdjustment
Me.Parent.Dirty = False ' ensure form data is saved

End Function


This query is the record source for the sub form:

SELECT
ED.lngEquipmentID,
ED.lngEquipmentID2,
ED.sngQty,
E.strDescription,
E.strStockNo,
C.strCo,
ED.ysnDataType,
E.curCostPrice * ED.sngQty AS TotalCost,
E.curAdjustment * ED.sngQty AS TotalAdjustment,
E.curSalePrice * ED.sngQty AS TotalSale,
(E.curSalePrice - E.curAdjustment) * ED.sngQty AS TotalSalePreAdjust
FROM (
tblEquipmentDetails ED

INNER JOIN tblEquipment E
ON ED.lngEquipmentID2 = E.lngEquipmentID)

INNER JOIN tblCo C
ON E.lngCoID = C.lngCoID
WHERE ED.ysnDataType=Yes;


Why it is happening is because text box expressions are
evaluated in a fairly low priority background task. But,
the events and VBA code run at a high priority. This means
that your code is running before the text box expressions
are calculated.

The way around it is to use text box expressions in both the
main form and the subform text boxs, The txtCostPrice text
box expressions on the main form would be like:
=subformcontrol.Form.txtCostTotal

OR use VBA code to calculate the sub form text box values
and then set the values on the main form.

I see that you are trying to save these calculated values,
which is a huge No-No in a database. If you insist on doing
that, then you must use the VBA approach instead of the text
box expressions.


Thank you, that's a great help.

I realise that the design is denormalised. The reason I am saving the
values is because there is a heirarchy. Each item can be a component in
another, which in turn can be a component in another ... At present there
are up to 4 layers, but in theory there could be more. The totals are then
used throughout the application to calculate installation costs, service
charges, etc. Without the availability of Stored Procedures, calculating
the whole lot at run time would be (a) pretty complex and (b) fairly costly.
I have an SQL UPDATE query that runs in a loop to keep the totals in sync
when they are changed - this seems to work fairly well apart from the problem
described.

However, if you have any suggestions I would be more than happy to consider
how the design could be improved.


As long as you understand the problems associated with
storing calculated values, and because I do not have a clear
picture of your entire application in mind, I won't belabor
the point.

Did you need help using VBA to calculate the sum values?

I agree whole heartedly with your general point. I think (hope) I have
arrived at a reasonable compromise in this case, though I'm always open to
improvements.

Thanks for the offer of help with the VBA. I believe it can be done using
either the DSum function or embedded SQL - I don't know which would be more
efficient. I had a brief play with DSum and didn't get it to work so yes,
any help would be much appreciated.


Since Sum operates on the filtered records in the form's
record source, it can be difficult getting DSum or creating
an SQL statement to select the same records displayed in the
form.

The form's recordset contains exactly the records you need
to use in the sum calculation and code in the subform could
look like:

Dim SumTotalCost As Currency
Dim SumTotalSale As Currency

With Me.RecordsetClone
If .RecordCount > 0 Then
.MoveFirst
Do Until .EOF
SumTotalCost = SumTotalCost + !TotalCost
SumTotalSale = SumTotalSale + !TotalSale
.MoveNext
Loop
Me.txtCostTotal = SumTotalCost
Me.txtSaleTotal = SumTotalSale
Else
Me.txtCostTotal = Null
Me.txtSaleTotal = Null
End If

Me.Parent.txtCostPrice = Me.txtCostTotal
Me.Parent.txtSalePrice = Me.txtSaleTotal _
+ Me.Parent.txtAdjustment
Me.Parent.Dirty = False
End With

I think doing this in the AfterUpdate event of the cost and
sale text boxes is way too soon. You should not force a
record to be saved until users do something to indicate that
they are done entering/editing the record. In general that
would be in the subform's **form** AfterUpdate event. At
that point, there is no need to requery the subform.

Thanks Marsh, that worked a treat. I have taken your advice about using the
subform's AfterUpdate event and I think it is better.
 
M

Marshall Barton

Balmora said:
lets say i have a main form called mainform and a sub form called subform

on the mainform there is id and grandtotal all bound
on suform there is id, name, total all bound and in the footer sumtotal
unbound

this is wok i understand it

Private Sub sumtotal_AfterUpdate()

Dim sumtotal As Currency

With Me.RecordsetClone
If .RecordCount > 0 Then
.MoveFirst
Do Until .EOF
sumtotal = !total
.MoveNext
Loop
Me.sumtotal = sumtotal
Else
Me.sumtotal = Null
End If

Me.mainform.grandtotal = Me.sumtotal

Me.mainform.Dirty = False
End With

End Sub


I can't see where you describe the problems you are having
using that procedure.

Just looking at the code, the only thing that looks wrong
are the lines witn Me.mainform....

I'm pretty sure those should be:

Parent.grandtotal = Me.sumtotal
and
Parent.Dirty = False

Do you really have a seriously good reason to be saving
those calculated totals? Do you understand why you should
NOT do that? Are you aware of how many problems that can
cause? Access is a database system and a mindset based on
what is done with spreadsheets will make a mess of any
database.
 
Top