Hi,
For me it seems there is a big bug for businessobject code.
Look there:
Businesslayer.vb
IsDirty property
<Browsable(False), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)> _ Public ReadOnly Property IsDirty() As Boolean Get
If Me._IsSavedOnTransaction
Then Return False
Else
Return ChangesExistOnCurrentDataTable()
End If
End Get End PropertySo, getter return me always FALSE when Me._IsSavedOnTransaction!
Ok... look next the Me._IsSavedOnTransaction set to False only in the ResetIsSavedOnTransactionFlagOnBusinessObjects Otherwise - Me._IsSavedOnTransaction is TRUE
Now look the SAVE
Public Overridable Function
Save(ByVal Transactional As Boolean, ByVal TransactionKey As String) As SaveUndoResult
.....
If Transactional Then
'-- Set the flag on this business object
Me._IsSavedOnTransaction = True Dim list As List(Of BusinessLayer) = Nothing
SyncLock _BosOnTransaction
If _BosOnTransaction.TryGetValue(Me._DataSourceKey & "|" & TransactionKey, list) AndAlso _
Not list.Contains(Me) Then
list.Add(Me)
End If
End SyncLock
End If
Here - we set the
ME._IsSavedOnTransaction = TRUE.. and nowhere its reset.... No.. its resets.. but just in one place
Public Shared Sub
TransactionCommit(ByVal DataSourceKey As String, ByVal TransactionKey As String)
ResetIsSavedOnTransactionFlagOnBusinessObjects(DataSourceKey, TransactionKey) '-- Commit the transaction on the data source
DataLayer.TransactionCommit(DataSourceKey, TransactionKey)
End Sub
Public Shared Sub
TransactionRollback(ByVal DataSourceKey As String, ByVal TransactionKey As String)
<--- ON MY PRIVATE LOOK - HERE MUST BE A CALL TO RESET IsSavedOnTransaction flag.. DataLayer.TransactionRollback(DataSourceKey, TransactionKey)
End Sub
And Finaly look my code Dim lcTransactionId As String = Guid.NewGuid.ToString
Try
'-- Start the transaction
BusinessLayer.TransactionBegin("ERPDATA", lcTransactionId, System.Data.IsolationLevel.ReadCommitted)
'-- Save the business objects on the transaction
If Bestell_kopfBO1.Save(True, lcTransactionId) = MicroFour.StrataFrame.Data.SaveUndoResult.Success Then
...............................................
Else
If Bestell_kopfBO1.BrokenRules.Count > 0 Then
Throw New Exception(String.Format("A business rule broken : {0} ", Me.Bestell_kopfBO1.BrokenRules.ToArray(0).Description))
Else
Throw New Exception()
End If
End If
BusinessLayer.TransactionCommit("ERPDATA", lcTransactionId)
DevExpress.XtraEditors.XtraMessageBox.Show("The data completed saved!")
Catch ex As Exception
'-- If an exception occurs during the saving of the records, then
' abort the transaction.
BusinessLayer.TransactionRollback("ERPDATA", lcTransactionId)
'TODO: Translate messagebox
DevExpress.XtraEditors.XtraMessageBox.Show(String.Format("The data can't be saved. Reason: {0}", ex.Message))
End Try
First time broken rules exist (>0), so - SAVE is fail.. and EditState still "Adding"
but IsDirty = FALSE!!!!!!!!!!!!!!BECAUSE Me._IsSavedOnTransaction Still TRUE after TransactionRollback.Then I change some data and click SAVE again.. and after this - my SAVE don't check any BUsinessRules and Saves the data, because
isDirty = FALSE, and business object
does not check changes!
Please let us know ASAP about this problem.
Can't belive nobody has such problem!
Thanks
Denis
P.S.
Sorry for mistake in topic subject.. "I mean "Big bug in BusinessObject"
) not "is"