I have a watcher with the following (pseudo)code ...
- Code: Select all
Private Sub ComCareSalesOrderImport(ByVal FileName As String)
Dim salesOrder As JiwaSales.SalesOrder.SalesOrder = JiwaApplication.Manager.Instance.BusinessLogicFactory.CreateBusinessLogic(Of JiwaSales.SalesOrder.SalesOrder)(Nothing)
'...
Do While Not csvParser.EndOfData
'...
salesOrder.CreateNew(JiwaSales.SalesOrder.SalesOrder.NewSalesOrderTypes.e_NewSalesOrder, debtor.DebtorID)
'...
For Each txn In txns
'...
salesOrder.SalesOrderLines.AddInventoryItem(inventory.InventoryID, JiwaSales.SalesOrder.SalesOrderLineCollection.SalesOrderLineInventorySeedTypes.e_SalesOrderLineInventoryID, newKey)
'...
Next
If salesOrder.SalesOrderLines.Count > 0 Then salesOrder.Save()
Loop
End Sub
The trouble is, if there is a failure due to either erroneous CSV data or because prerequisites haven't been entered (typically a debtor not yet created in Jiwa), then the import fails (with error reporting) AT THAT POINT, however all previous CSV lines have succeeded, leaving Jiwa partially updated by the batch. The client requirement is that on any failure the whole batch is to be ignored ... they will then remedy the error (create the debtor, etc) and drop the CSV in again. So I need some sort of BEGIN/ROLLBACK functionality.
I am considering the following ...
- Code: Select all
Private Sub ComCareSalesOrderImport(ByVal FileName As String)
Dim salesOrders = New List(Of JiwaSales.SalesOrder.SalesOrder)
'...
Do While Not csvParser.EndOfData
Dim salesOrder As JiwaSales.SalesOrder.SalesOrder = JiwaApplication.Manager.Instance.BusinessLogicFactory.CreateBusinessLogic(Of JiwaSales.SalesOrder.SalesOrder)(Nothing)
'...
salesOrder.CreateNew(JiwaSales.SalesOrder.SalesOrder.NewSalesOrderTypes.e_NewSalesOrder, debtor.DebtorID)
'...
For Each txn In txns
'...
salesOrder.SalesOrderLines.AddInventoryItem(inventory.InventoryID, JiwaSales.SalesOrder.SalesOrderLineCollection.SalesOrderLineInventorySeedTypes.e_SalesOrderLineInventoryID, newKey)
'...
Next
If salesOrder.SalesOrderLines.Count > 0 Then salesOrders.Add(salesOrder)
Loop
For Each salesOrder As JiwaSales.SalesOrder.SalesOrder In salesOrders
salesOrder.Save()
Next
End Sub
This will (well, should) work - as the error handling will gracefully exit (with reporting) before any .Save()s. Is this the best approach, or is there built in functionality for this that I am missing (or simply a better approach)?
Cheers,
Neil