SAP BO. SAP Business One. Importar y exportar autorizaciones mediante Microsoft Excel

     Antes que nada una disculpa por la tardanza ahora retomare de una manera mas seguida el blog. Últimamente hemos estado viendo bastantes ejemplos con código ya sea mediante el UI o el DI API de SAP Business One. 

     Ahora en este ejemplo vamos a exportar las autorizaciones de un usuario y a su vez poderlas importar dentro de otro usuario cualquiera. Como requisito ocuparemos tener el UI API instalado en nuestro equipo así como el Excel previamente configurado para que ejecute macros, por ultimo vamos a necesitar tener una instancia de SAP Businees One antes de ejecutar cualquier acción. 
    El objeto SBObob nos permite leer información de una manera fácil y sencilla. Este objeto por lo particular regresa un recordset con la información. En nuestro caso vamos a utilizar los métodos GetSystemPermisson  y el método SetSystempermission.

     Para importar o exportar nuestras autorizaciones vamos a trabajar con la pantalla de "Autorizaciones generales" que esta en la ruta Gestión > Inicializacion de sistema> Autorizaciones > Autorizaciones generales. Ahora bien como trabajaremos con el UI Api recuerden que la forma de accesar a las pantallas de SAP Es mediante un ID en este caso es el "form type 951". Bueno ahora con todos estos detalles escribamos algo  de código. Comencemos con el Exportar nuestras autorizaciones a la hoja de Excel. 

1. Nos conectamos a la instancia de SAP Business One que hemos abierto. 

Dim SboGuiApi     As New SAPbouiCOM.SboGuiApi
Dim SBO_App       As SAPbouiCOM.Application
Dim oCompany      As New SAPbobsCOM.Company
  SboGuiApi.Connect ("0030002C0030002C00530041005000420044005F00440061007400650076002C0050004C006F0
                                     06D0056004900490056")
  Set SBO_App = SboGuiApi.GetApplication()
  Set oCompany = SBO_App.Company.GetDICompany()


2. Vamos abrir la pantalla de autorizaciones. 

SBO_App.ActivateMenuItem ("3332")
  
  Dim oForm         As SAPbouiCOM.Form
  Dim oMatrix       As SAPbouiCOM.Matrix
 
  Set oForm = SBO_App.Forms.ActiveForm
  If oForm.TypeEx <> "951" Then
    MsgBox "Error when opening authorization form"
    End
  End If


3. Ponemos el nombre a las cabeceras y vamos a expandir todo el árbol de autorizaciones  para colocarlo en nuestra hoja de Excel. 

ActiveSheet.Cells(1, 1) = "ID"
  ActiveSheet.Cells(1, 2) = "Name"
  ActiveSheet.Cells(1, 3) = "Level"
  ActiveSheet.Cells(1, 4) = "Number of Sons"
    oForm.Items.Item("13").Click (ct_Regular)
    row = 2

  Set oMatrix = oForm.Items.Item("6").Specific

  For i = 1 To oMatrix.VisualRowCount
   
    Dim oEditPermCode As SAPbouiCOM.EditText
    Dim oEditPermName As SAPbouiCOM.EditText
    Dim oEditPermLevel As SAPbouiCOM.EditText
    Dim oEditPermNumOfSons As SAPbouiCOM.EditText
   
    Set oEditPermCode = oMatrix.Columns.Item("0").Cells.Item(i).Specific
    Set oEditPermName = oMatrix.Columns.Item("1").Cells.Item(i).Specific
    Set oEditPermLevel = oMatrix.Columns.Item("7").Cells.Item(i).Specific
    Set oEditPermNumOfSons = oMatrix.Columns.Item("6").Cells.Item(i).Specific
   
    ActiveSheet.Cells(row, 1) = oEditPermCode.String
    ActiveSheet.Cells(row, 2) = oEditPermName.String
    ActiveSheet.Cells(row, 3) = oEditPermLevel.String
    ActiveSheet.Cells(row, 4) = oEditPermNumOfSons.String
   
    If oEditPermCode.String = "UP_MAIN_HEADER" Then Exit For
    row = row + 1
  Next


4. Ahora vamos a leer la lista de usuarios y sus permisos. Para darle claridad a nuestros permisos usaremos el  BOPermission Enumerator que tiene los siguientes valores: 
          - RW acceso total 
              - RO solo lectura 
              - NO sin autorización
              - VA diversas autorizaciones
              - ND no definido. 

Dim oRsSUers As SAPbobsCOM.Recordset
  Dim oSBObob As SAPbobsCOM.SBObob
  Set oSBObob = oCompany.GetBusinessObject(SAPbobsCOM.BoObjectTypes.BoBridge)
  Set oRsSUers = oSBObob.GetUserList()
  col = 5
 
  Do While Not oRsSUers.EOF
    ActiveSheet.Cells(1, col) = oRsSUers.Fields.Item(0).Value
    row = 2
    Do While Not (ActiveSheet.Cells(row, 1) = "" Or ActiveSheet.Cells(row, 1) = "UP_MAIN_HEADER")
      If ActiveSheet.Cells(row, 4) = 0 Then
        Dim oRsPerm As SAPbobsCOM.Recordset
        Set oRsPerm = oSBObob.GetSystemPermission(oRsSUers.Fields.Item(0).Value, i)
        Dim s As String
        Select Case oRsPerm.Fields.Item(0).Value
          Case 1
            s = "RW"
          Case 2
            s = "RO"
          Case 3
            s = "NO"
          Case 4
            s = "VA"
          Case 6
            s = "ND"
          Case Else
            s = "n.a."
        End Select
        ActiveSheet.Cells(row, col) = s
      End If
      row = row + 1
    Loop
    col = col + 1
    oRsSUers.MoveNext
  Loop

  oCompany.Disconnect


Ahora bien con este sencillo ejemplo si lo ejecutamos vamos a ver como nuestro libro de Excel se llena como en la siguiente imagen. 

     Por ultimo que utilidad tendría usar esto, pues muy sencillo configuramos por ejemplo las autorizaciones   de un usuario del depto. de ventas y todos lo demás usuarios que cumplen con ese mismo perfil importarle esta autorizaciones solamente copiando la columna correspondiente. Y para hacer este trabajo de importación vamos a usar el siguiente método. Lo único que hay que tener en cuenta es que a los super usuarios no se les puede incluir en la hoja de Excel, así que cuidado con este dato. 

 Dim SboGuiApi     As New SAPbouiCOM.SboGuiApi
  Dim SBO_App       As SAPbouiCOM.Application
  Dim oCompany      As New SAPbobsCOM.Company

  SboGuiApi.Connect ("0030002C0030002C00530041005000420044005F00440061007400650076002C0050004C006F006D0056004900490056")
  Set SBO_App = SboGuiApi.GetApplication()

  Set oCompany = SBO_App.Company.GetDICompany()
 
  col = 5
 
  Dim oSBObob As SAPbobsCOM.SBObob
  Set oSBObob = oCompany.GetBusinessObject(SAPbobsCOM.BoObjectTypes.BoBridge)
 
  Do While ActiveSheet.Cells(1, col) <> ""
   
    UserName = ActiveSheet.Cells(1, col)
    row = 2
   
    Do While ActiveSheet.Cells(row, 1) <> "" Or ActiveSheet.Cells(row, 1) <> "UP_MAIN_HEADER"

    If ActiveSheet.Cells(row, 4) = 0 Then
        Select Case ActiveSheet.Cells(row, col)
          Case "RW"
            lPermission = 1
          Case "RO"
            lPermission = 2
          Case "NO"
            lPermission = 3
          Case "VA"
            lPermission = 4
          Case "ND"
            lPermission = 6
          Case Else
            lPermission = -1
        End Select
       
        If lPermission <> -1 Then
          Call oSBObob.SetSystemPermission(UserName, ActiveSheet.Cells(row, 1), lPermission)
          If oCompany.GetLastErrorCode <> 0 Then
            ActiveSheet.Cells(row, col).Color = "123456"
          End If
        End If
      End If
      row = row + 1
    Loop
    col = col + 1
    oRsSUers.MoveNext
  Loop

  oCompany.Disconnect

     Espero les se de ayuda a mucha gente que me ha preguntado el como importar fuera del data transfer, en caso de que no sea algo parecido haremos un ejemplo sobre importar algún dato mediante el SDK de SAP. Saludos y promete actualizar mas y mas seguido. 

5 comentarios:

  1. Anónimo Says:

    muchas gracias por esto, la verdad me ha quedado un poco grande ejecutarlo ya que nos e si lo ejecuto dentro del excel VB o desde donde?, quisera saber si hay posibilidad de que me envies solo el cuerpo de las autorizaciones sin los usuarios queiro solo exportar todos los valores, te agradeceria si me puedes colaborar con esto ya que veo que lo tienes en excel

    gracias

    ricardo

  2. Anónimo Says:

    Buen dia, soy nuevo en esto y quisiera de tus consejos. necesito crear una aplicacion con otro sistema que al momento de generar orden de compra en el sistema X, me genere una orden de compra en SBO.

    que objeto necesito para realizar tal insercion. o si me podes proporcionar algun ejemplo que haga algo similar te estare muy agradecido.

    por cierto estoy usando .net 2008

  3. Edgar Avena Vázquez Says:

    hazme llegar tu correo saludos

  4. Jonathan Ramírez Says:

    Hola, he probado generar el archivo con el código que incluyes pero veo que no funciona correctamente... por ejemplo, en la mayoría otorga RW y en dos usuarios todo lo marca con RO aunque no sea así

    Quedo atento a tu respuesta

  5. Unknown Says:

    EStimado Edgar, primero gracias por los aportes de este blog, me han sido de mucha ayuda.

    En este caso, cuando dices instancia de SAP Business One a que te refieres?

    En que programa se anota todo este código que haz dejado?

    Como veras soy neófito en el tema de programación y me gustaría aplicar este ejemplo que me resulta útil para un requerimiento.

    Agradezco tu ampliación

    Saludos cordiales

Related Posts with Thumbnails