StrataFrame Forum

Why are these fields deemed to be empty?

http://forum.strataframe.net/Topic7190.aspx

By Peter Jones - 2/26/2007

Hi,

Please see attached screen shot. This is a DevExpress grid populated from a stored proc. All the fields from the left, up until the column with 999, are "required fields" in the BO. The ones to the right of the 999 are not. The bottom panel shows the data that is returned by the stored proc.

I changed the value in the 4th column from 100 to 3100 and clicked Save. This fired a Broken Rule on the 5 marked columns saying they are 'required'. From the database listing you can see the checkboxes with errors have a value of False (0) and the column second from the right (which is an integer column) also has a value of 0.

If I change the integer column from 0 to 1 the broken rule goes away for that column. If I then change the column back to its original value of 0 the broken rule still doesn't fire. However, the same process does not work for the checkboxes, i.e. ticking a checkbox to True stops the broken rule from firing but once it is ticked back to False the rule fires again.

Cheers, Peter

By StrataFrame Team - 2/27/2007

Yes, the required fields validation tests on the "default" value for each data type... the value that the columns are initialized to if the AllowNullValuesOnNewRow = False.  So, if you want to test on NULL values, then you'll need test on those values yourself rather than use the built-in required fields options.
By Peter Jones - 2/27/2007

Hi Ben,

Sorry, you have lost me... The row in question isn't a new row, it is the first row in the database (refer to the table in the screen shot I sent) and every column has a value - it just seems to be False columns and zero columns that are creating the problem.

A more general question relating to your answer. The BO in question does have "AllowNullValuesOnNewRow = False" which is what I want, i.e. I want to be in control of setting defaults which I do as follows:

Private Sub boATT_SetDefaultValues1() Handles Me.SetDefaultValues

Me.ATTActive = True

Me.ATTDType = "1"

Me.ATTFBatch = False

Me.ATTFHide = False

Me.ATTID = Guid.NewGuid()

Me.ATTLookUp = False

Me.ATTMandInLU = False

Me.ATTRangeFrom = 0

Me.ATTRangeTo = 999

Me.ATTRBatch = False

Me.ATTSBatch = False

Me.ATTSequ = 0

Me.ATTSHide = True

Me.ATTSPBatch = False

Me.ATTType = "1"

End Sub

When I create a new row the above code fires and the correct default values are set - I can see them in the UI. However, when I click Save I have the same problem I get with an existing row, i.e. any fields set to False or Zero fires the Required Fields broken rule.

Cheers, Peter

By Trent L. Taylor - 2/27/2007

Whether the row is new or not, required fields assume that False and 0 are empty.  You can build the source code in debug mode to see how required fields are validated.  But the reason they are giving you the error is because they are set to false for the booleans and 0 for the integers.  Generally boolean values are not good candidates for the required fields collection since there are only two values.  If you are using NULL support, this value gets translated into a False in most cases.

I recommend removing these fields from the Required Fields collection and just adding your own business logic in the CheckRulesOnCurrentRow event.

By Peter Jones - 2/27/2007

Hi Trent,

Ok, I understand however I'm left somewhat bemused as to why False and 0 are not considered 'real values'.

Cheers, Peter

By Trent L. Taylor - 2/28/2007

Ok, I understand however I'm left somewhat bemused as to why False and 0 are not considered 'real values'.

They are considered "real values", they are just considered to be empty. 

By Steve L. Taylor - 2/28/2007

When we test on values within the business object, we generally use the .Item property, which evaluates the strong-typed properties of the subclass and returns the values.  So, .Item("ATTLookUp") will call the Get of the ATTLookUp property.  So, when testing default values, since most columns are .NET value types (not reference types), we have to test on the "default" value for a value type (because value types always have a value).  We do test on DBNull.Value from the CurrentRow("ATTLookUp") to test required fields as well, but we also have to test on the default for value types, so 0 and False are considered to have not been set.  Generally, you won't want to use the RequiredFields for a Boolean property, you'll want to test the CurrentRow("FieldName") Is DBNull.Value on your own.
By Peter Jones - 2/28/2007

Hi Steve,

Thanks for explanation. I have no problems with the Boolean side of things - we simply don't make them Required and make sure we initialise them when creating a new row - from then on the user can only toggle between 0 and 1. However, I just want to be sure I understand the restriction re 'value type' columns. As I understand it, for any 'value type' column, we cannot use the RequiredField option in StrataFrame if zero is a valid value - can you please confirm.

Cheers, Peter

By StrataFrame Team - 3/1/2007

Yes, if you want 0 to be a valid value, then you will need to test on the CurrentRow("FieldName") Is DBNull.Value within the CheckRulesOnCurrentRow event.