Buenas tardes colegas, quisiera comentarles sobre un inconveniente que estoy teniendo, tengo desarrollado un Addon en donde a través de UI API agrego un Botón a un formulario nativo, dicho botón lo que realiza es asignar los lotes a los articulos de forma automática (a través de las funciones proporcionadas por la DI API) a cada linea de una orden de venta (ya que recupera los lotes disponibles ordenados según el vencimiento).
Todo el proceso y la codificación funciona correctamente, pero se hace sumamente lento cuando las ordenes de venta superan las 20 lineas.
Se que mis búsquedas y recorridos de los lotes no entran en bucles innecesarios porque se hace lento al momento de hacer el Orden.Update()
Si por ejemplo dejo comentado la linea del código donde hace este Orden.Update() el recorrido que realiza internamente es bastante rápido.
Más abajo parte del código que se ejecuta dentro de un FOR que recorre cada linea de las ordenes de venta que voy a actualizar:
Dim Orden As Documents = _SBO.GetBusinessObject(BoObjectTypes.oOrders)
Dim Orden_lines As Document_Lines
If Orden.GetByKey(OrderEntry) Then
Orden_lines = Orden.Lines
Orden_lines.SetCurrentLine(VisOrder)
If RelQtty <> 0 Then
If ManBtchNum = "Y" Then
Dim _Consulta2 As String = "SELECT T0.DistNumber, ISNULL(T1.Quantity,0)-ISNULL(T1.CommitQty,0) FROM OBTN T0 with(nolock) INNER JOIN OBTQ T1 with(nolock) ON T0.ItemCode = T1.ItemCode AND T0.SysNumber = T1.SysNumber WHERE T1.Quantity > 0 AND T1.ItemCode = '" & (ItemCode) & "' and T1.WhsCode = '" & Orden_lines.WarehouseCode & "'order by isnull(convert(varchar, T0.ExpDate, 112), '20501231') asc"
_DataTable2.ExecuteQuery(_Consulta2)
_Grid2.DataTable = _Form.DataSources.DataTables.Item("dtAuxLot")
Dim cantauxlote As Integer = 0
For numfila2 As Integer = 0 To _Grid2.Rows.Count - 1
Dim valorFila2 As Integer = _Grid2.GetDataTableRowIndex(numfila2)
Dim DistNumber, Quantity As String
DistNumber = _Grid2.DataTable.GetValue(0, valorFila2)
Quantity = _Grid2.DataTable.GetValue(1, valorFila2)
If (RelQtty - cantauxlote) <= Quantity Then
If (RelQtty - cantauxlote) <> 0 Then
If numfila2 <> 0 Then
Orden_lines.BatchNumbers.Add()
End If
Orden_lines.BatchNumbers.BatchNumber = DistNumber
Orden_lines.BatchNumbers.Quantity = (RelQtty - cantauxlote)
cantauxlote = cantauxlote + (RelQtty - cantauxlote)
If cantauxlote = RelQtty Then
numfila2 = (_Grid2.Rows.Count - 1)
End If
End If
Else
If numfila2 <> 0 Then
Orden_lines.BatchNumbers.Add()
End If
Orden_lines.BatchNumbers.BatchNumber = DistNumber
Orden_lines.BatchNumbers.Quantity = Quantity
cantauxlote = cantauxlote + Quantity
If cantauxlote = RelQtty Then
numfila2 = (_Grid2.Rows.Count - 1)
End If
End If
Next
errNum = Orden.Update()
If Not errNum.Equals(0) Then
_SBO.GetLastError(errNum, errDes)
MessageBox.Show(errDes)
Else
End If
_Grid2.DataTable.Clear()
End If
End If
End If
Alguna recomendación que pueda aplicar?
Como les dije al momento de que la orden de venta tienen aproximadamente 20 lineas el proceso se hace muy lento al momento de hacer el Orden.Update() , por ejemplo una orden de 20 lineas tarda minimamente 6 minutos en procesar.
Si la orden tiene por ejemplo 5 lineas lo hace muy rápido y en segundos.
Desde ya muchas gracias.
Atte.-
Arturo M.