Ejemplo comparativo de Desarrollo con SGI tool y con SDK estándar Implantación de un módulo de Unidades de Medida.

Download Report

Transcript Ejemplo comparativo de Desarrollo con SGI tool y con SDK estándar Implantación de un módulo de Unidades de Medida.

Slide 1

Ejemplo comparativo de Desarrollo con SGI tool y con
SDK estándar

Implantación de un módulo de Unidades de Medida


Slide 2

Lógica del Desarrollo a Implementar
 Este proceso realiza la conversión de unidades de entrada de material(pallets, cajas,
etc) a las unidad por defecto de cada artículo. Para ello necesitamos realizar los
siguientes procesos en desarrollo:

 Formulario con el Nombre de las unidades: Para poder parametrizarlo a medida en
cada cliente. Se usara una tabla estándar de SAP, pero se llamara desde una opción de
menú creado

 Formulario Configuración Conversión unidades: Para poder indicar para cada articulo
la conversión a realizar en cada una de las unidades. Dicho formulario se diseñara en
.net con SGI.ControlsSAP para aprovechar los modelos ya creados y facilidad de
trabajo en formularios . net
 Documento Marketing: Al salir del campo de usuario donde se especifica las cantidad
de esa unidad de medida, realice la conversión en el campo Cantidad. P.e Si teclean 5
Palet , y cada palet son 1000 Uds. -> Qty = 5000. Gracias a SGI solamente hemos de
crear un documento que herede de SAPDocument y mapear las columnas sobre las
que se desea leer o escribir. Todo ello optimizado para que el acceso sea equivalente a
acceder a datos en memoria, en lugar de acceso UI (comunicación entre proceso SAP
y proceso Addon)


Slide 3

Herramientas Configuración SGI.
 Addon Manager: Permite manejar distintos Addons en una maquina. Útil para
desarrollo.






Permite conocer los Plugin de cada Addon.
Permite Crear diferentes perfiles para cada Addon
Genera Automáticamente el ARD de instalación de un Addon.
Llama a la herramienta de Administración del Addon seleccionado.
Permite ver al consultor todos los Addons instalados y ejecutarlos desde la herramienta.

AddonAdmin: Herramienta de configuración de los Plugins de un Addon.
Permite Activar los Plugin que se desea ejecutar
Permite darle valores a los parámetros que se usaran en el Plugin
Permite activar las tareas de creación de campos de cada Plugin.


Slide 4

Herramientas Configuración SDK.
 Activación Desarrollos. Como no disponemos de herramienta alguna para
activa/desactivar funcionalidades, debemos usar una tabla SQL o fichero
XML donde indicar si al arrancar el Addon, se ha de cargar el desarrollo o
NO.
Creación Campos. Como no tenemos herramienta donde indicar si ha de
realizar la creación de campos, vistas,.. Asociadas al desarrollo, necesitamos
una tabla donde indicar tal acción.
Necesitaremos crear un mecanismo que al arrancar el Addon, revise la tabla y
active una variable publica para que antes de realizar una acción con ese
desarrollo pregunte si esta activo o no ese desarrollo. Esto repercute en una
lógica mas compleja y penaliza el rendimiento de la aplicación.


Slide 5

Tareas a realizar para Desarrollo Plugin SGI
•Creación del Proyecto
Crear Addon : Directorio y librerías necesarias.(AddonManager).
Crear Solución y definir Plugin Packs y Plugin
Definir Tareas de Arranque de cada Plugin
Activación Plugin y Tareas (AddonAdmin)
La gestión Eventos, creación campos, activación, la realiza SGI

Crear formulario en .net para validación e introducción de datos.
Crear Objetos para manejo Datos de los formularios en .net
Crear clase que interacciona automáticamente con documento de
Marketing.
Generar ARD automáticamente con AddonManager e Instalar.

Todo se hace a través de herramientas que automatizan el proceso


Slide 6

Tareas a realizar para implementación del desarrollo SDK.
•Creación del Proyecto
Conexión con SAP.
Implementar Procedimientos para creación Campos a partir XML.
Implementar Procedimientos para creación Objetos UDO.
Definición de Menús
Definición Manejador para cada tipo Evento SAP y reenviar eventos

Crear formulario en UI con ScreenPainter. Complejo y con pero
resultado
Crear Objetos UDO para manejo Datos de los formularios en .net
 Crear formulario UI y validaciones a realizar en el formulario. Gestión
de los eventos que llegan al formulario. Gestión de líneas nuevas,
gestión del estado del formulario al añadir líneas,…

Crear un nuevo proyecto .net para generar ARD e instalar.


Slide 7

Creación Addon SGI.


Slide 8

Definir PLuginPack y Plugin SGI
PLuginPack : Conjunto de Plugins. Se corresponde con un proyecto de .net, el cual generar
una Dll. Luego la dll generada incluye los plugins.
Plugin : Unidad de Desarrollo. Es completamente independiente. Crea sus campos, carga sus
menús Por tanto es portable a cualquier otro Addon de un cliente, ya que todo el código que
usa esta contenido en el Plugin , a diferencia del SDK que esta repartido.


Slide 9

Estructura Proyecto SDK.
 Cuerpo principal de ejecución del Addon. Faltaría incluir la lógica de verificación
si se tiene que activar el desarrollo, o tiene que crear los campos de dicho
desarrollo.


Slide 10

Definir Menús y Campos a Crear en SGI

Al definir el menú , también le indicamos el manejador que recibe el evento.

Captura Eventos de los menús de SAP en SGI


Slide 11

Carga Menús SDK
Podemos comprobar que la definición de menús es mas laboriosa en SDK que en SGI


Slide 12

Gestión Eventos en cuerpo principal Addon en SDK
En el Main tenemos un bucle de eventos, en el cual tenemos que preguntar por cada eventos
que nos llega a que formulario se lo voy a pasar. Esto penaliza el rendimiento. En SGI el
manejador de eventos , usa tabla Hash para localizar el puntero del manejador destino.


Slide 13

Creación Campos Usuario: Potencia XML , facilidad Definición SGI.
 ‘Start -> Tarea que se llama automáticamente por SGI al activarla en AddonAdmin
Public Sub Start() Implements
Addon2Core.InitEngine.InitJobs.ICreacionCamposSap.Start
CreacionCampos()
End Sub
Private Sub CreacionCampos()
Dim oTablas As Addon2Core.DataEngine.B1.CB1Tables
Dim oTabla As Addon2Core.DataEngine.B1.CB1Table
Dim field As Addon2Core.DataEngine.B1.CB1Field
oTablas = New Addon2Core.DataEngine.B1.CB1Tables
oTabla = oTablas.AddUserTable("IFG_CABUNIDM", "Cabe3cera Lineas UnidMed.")
oTabla.AddAlphaField("IFG_ART", "Articulo", 20)
oTabla.AddAlphaField("IFG_DESC", "Descripcion Articulo", 50)

 SGI dispone de una Utilidad que a partir de un Excel genera las instrucciones para la
creación campos, por lo que a partir del documento Orgánico de campos se puede
generar de manera automática las instrucciones para la creación de campos.


Slide 14

Creacion Campos SDK
 Hemos de crear procedimientos para realizar toda la gestión y creación Campos.
 Funciones creadas para el ejemplo. No mostramos el codigo pues serian 4-5 diapositivas.
• Private Function LoadBDFromXML(ByVal Sboapp As SAPbouiCOM.Application, ByVal file As String,
ByVal Titulo As String) As Boolean
• Public Sub Tablas_Campos(ByVal Sboapp As SAPbouiCOM.Application)
• Public Sub Tablas_Usuario(ByVal Sboapp As SAPbouiCOM.Application)

 Ejemplo XML : Es rapido de ejecución , pero no facil de implementar o visualizar.Miremos el













codigo XML para la definicion de creacion de un campo.

152



@EXO_OCAJ
EXO_SNES
Entrada de Stock
A
N
1



Slide 15

Formulario SGI.ControlsSAP
 Diseño en entorno Visual Studio. Mucho mas fácil y rápido de uso que ScreenPainter.
 Permite herencia, al ser el formulario una clase .net
 Permite añadir cualquier control .net, no solo los controles estándar librería
ControlsSAP, o estándar de .net.
 El Manejo de Eventos de los controles del formulario los gestiona automáticamente
el FrameWork de .net por lo que no genera trafico de comunicación con UI, como el
SDK.
 Esquema Trabajo formularios .net .
El formulario .net y validaciones y acciones sobre los controles .net.
Objetos manejo datos. Se dispone de una herramienta que los genera automáticamente.

 Existencia Plantillas para cada tipo de formulario .
 Wizard de generación del código fuente a partir de la selección de Tabla y tipo.
 Grid potente y rápido. Pertenece a la suite de Developper Express. Permite
validaciones a nivel de celda, de línea, y de Grid.


Slide 16

Diseño Formularios con Visual Studio


Slide 17

Resultado formulario integrado en SAP


Slide 18

Formulario SDK. Manejo de eventos
 En el formulario tenemos un procedimiento que evalúa si el evento pasado lo
necesita, y comprueba a quien se lo tiene que pasar. Vemos un ejemplo sencillo y
podemos comprobar como se complica la lógica. Evidentemente esto no es eficiente.


Slide 19

Diseño Formularios SDK con ScreenPainter
Solo se permite añadir los controles de SAP. Con formularios .net podemos añadir cualquier tipo de
control al formulario. Cuando diseñamos un Grid no siempre genera correctamente el XML y hay que
entrar a modificarlo a mano en el XML. En Visual Studio tenemos integrado formulario y código. En SDK
no.
Desventaja: Crear un formulario a partir de otro existente es muy laborioso, pues tiene definidos las
tablas, UID,.. en .NET es mas sencillo, pues el formulario solo tiene los controles visuales, las
características se le pueden añadir por código fácilmente.


Slide 20

Integración Formularios .net en SAP
 La integración de los formularios .net dentro de SAP es sencillo.
 ‘Este es el único código a realizar. El evento llega automáticamente por el SGI.
_
Private Sub MenuConf_MenuClick(ByVal sender As Object, ByVal event_info As
Addon2Core.EventEngine.CB1MenuEventArgs)
Dim oForm As frmConfigUnidades
oForm = New frmConfigUnidades(Addon2Core.Addon.CB1App.Company)
Addon2Core.Addon.CB1App.EmbedIntoSAP(oForm)
oForm.Show()

End Sub


Slide 21

Integración Formularios SDK en SAP
 Una variable unica para todos los formularios.
If AddOn.oFunc.unidm Then
'Iniciamos el objeto de unidades de medida al arrancar el Addon.
oUnidMed = New cUnidMedDoc
End If
Public Overrides Sub SboAplicacion_ItemEvent(ByVal FormUID As String, ByRef pVal As
SAPbouiCOM.ItemEvent, ByRef BubbleEvent As Boolean)
Try
If AddOn.oFunc.unidm Then
Me.ItemEventUNIDM(FormUID, pVal, BubbleEvent)
End If

Esto implica que para todos los formularios abiertos del mismo tipo, el objeto que los
gestiona es el mismo. Hay que remapear controles cada vez que se va a realizar una
operación , para asegurarnos de que se corresponde con el formulario activo en ese
momento. En SGI automáticamente crea un objeto para cada formulario que se abre,
pudiendo mantener datos cálculos, pues se corresponde con dicho formulario.
En SGI esta casuística depende del formulario del que se hereda.


Slide 22

Interacción con Documentos de Marketing con SGI
 Crear clase Interaccionar con Formularios SAP
 ‘Solo hemos de indicar que hereda de CB1Form y que formulario queremos
capturar -> Addon2Defs.TiposFormVentas -> todos los doc Ventas.
), GetType(Addon2Defs.TiposFormVentas))> _
 Public Class cGestionUnidadesMedida
 Inherits Addon2Core.UI.Forms.CB1Form
Automáticamente cuando se abre un documentos de Ventas, se crea un objeto de
la clase por cada uno de ellos, y nos llegan los eventos a los controles que se lo
indiquemos de manera automática.


Slide 23

Interacción con Documentos de Marketing SDK
 Tenemos que comprobar por código cuando se ha de realizar la ejecución del código para el Item y Eventos
esperado. En formularios con captura de varios eventos provoca la falta de claridad del código , con el
consiguiente generación de incidencias. En SGI el evento llega directamente al manejador de la clase que
espera dicho Evento. Esto implica que cualquier evento que se produzca , va a ejecutar dicho código , para
saber si hay alguien que lo espera.

Tendremos codigo en clase principal del Addon


















Private Sub SBO_Application_ItemEvent(ByVal FormUID As String, ByRef pVal As SAPbouiCOM.ItemEvent, ByRef BubbleEvent As Boolean) Handles
SBO_Application.ItemEvent
If pVal.BeforeAction = False Then

Select Case FormUID
Case "IFG_CUNID"
If oFrmUnidMed.EventHandler_Formulario(SBO_Application, pVal) = False Then
SBO_Application.StatusBar.SetText("Error en la gestion de eventos IFG_OCOM", SAPbouiCOM.BoMessageTime.bmt_Short,
SAPbouiCOM.BoStatusBarMessageType.smt_Error)
End If
Case "139"
If oFunc.ActivoUnidadesMedida Then
if oGestUnidMedida_EventHandLer((SBO_Application, pVal) = False
SBO_Application.StatusBar.SetText("Error en la gestion de eventos Unid.Medida", SAPbouiCOM.BoMessageTime.bmt_Short,
SAPbouiCOM.BoStatusBarMessageType.smt_Error)
End If
End If
End Select
End If
End Sub


Slide 24

Captura de Eventos de Formularios SAP con SGI
 Definir los controles a los que vamos a capturar sus Eventos.
 Se hace como en .net, simplemente hay que especificarle el atributo WithEvents
Private _oMatrix As Addon2Core.UI.Controls.CB1Matrix
Private WithEvents oColUnid1 As Addon2Core.UI.Controls.CB1FloatEditMatrixColumn
Private WithEvents oColArticulo As Addon2Core.UI.Controls.CB1EditMatrixColumn
Private WithEvents oColCantidad As Addon2Core.UI.Controls.CB1FloatEditMatrixColumn
• Al declararlo , podemos seleccionar en el combo de eventos disponibles el que deseamos capturar y
automáticamente SGI nos crea un manejador para ese evento. Nosotros únicamente hemos de incluir el
código que queremos que se ejecute en ese caso.
 Private Sub oColUnid1_OnBeforeValidate(ByVal sender As Object, ByVal e As
Addon2Core.EventEngine.CB1ItemEventArgs) Handles oColUnid1.OnBeforeValidate, OColUnid2.OnBeforeValidate,






If Not CalculoUnidades(e.Row) Then
Addon2Core.EventEngine.CEventManager.AbortEvent()
End If
End Sub

 Esto facilita la claridad de los programas y su fiabilidad. Pues evitamos los bucles de IF then… , con una lógica

compleja, ante la que cualquier cambio produce consecuencias inesperadas y perdida de tiempo en depuración de
código y pruebas hasta detectar la incidencia.


Slide 25

Captura de Eventos de Formularios SAP con SDK

 Y Código en la clase que se ocupa de interaccionar con el formulario del
documento de Pedido.

Public Overrides Function ItemEventUNIDM (ByVal FormUID As String, ByRef pVal As
SAPbouiCOM.ItemEvent, ByRef BubbleEvent As Boolean) As Boolean
Try
If pVal.EventType = SAPbouiCOM.BoEventTypes.et_VALIDATE And pVal.BeforeAction And
and (pVal.ColUID = "U_IFG_UNI1" Or pVal.ColUID = "U_IFG_UNI2" Or pVal.ColUID =
"U_IFG_UNI3" Or pVal.ColUID = "U_IFG_UNI4") Then
If Not pVal.InnerEvent Then
Me.CalculoUnidades(Me.SBOAplication.Forms.ActiveForm, pVal.Row)
Else
BubbleEvent = False
End If
End Function


Slide 26

Acceso a las celdas para calculo de la conversión con SGI.
‘El acceso a las celda del grid se realiza con única llamada a la UI al tener mapeado el
acceso a la columna. Con SDK se requieren mas llamadas a la UI.-> mas lentitud.
articulo = oColArticulo.Value(irow)
‘El método value automáticamente realiza la conversión según la moneda de SAP y la
Configuración regional de manera automática, en el caso de campos numéricos.
Select Case sUnidad
Case "U_IFG_UNI1"
ValorUnidad = oColUnid1.Value(iRow)
Case "U_IFG_UNI2"
ValorUnidad = OColUnid2.Value(iRow)
Case "U_IFG_UNI3"
ValorUnidad = oColUnid3.Value(iRow)
Case "U_IFG_UNI4"
ValorUnidad = oColUnid4.Value(iRow)
End Select

oColCantidad.Value(irow) = total


Slide 27

Acceso a las celdas para calculo de la conversión .
‘Para automatizar el acceso a las celdas , se crea una función para acceder a los valores
de las celdas. Podemos observar el numero de llamadas a la UI necesarias. En SGI el
calculo es mediante una única instrucción.
Public Shared Function getValorMatrixN(ByVal sForm As SAPbouiCOM.Form, ByVal matrix As String, ByVal sNRow As Long, ByVal columna As
String) As Double
Dim valor As Double
Dim sCad As String
Dim Car As Char
Dim oMatrix As SAPbouiCOM.Matrix
Try
oMatrix = sForm.Items.Item(matrix).Specific
sCad = oMatrix.Columns.Item(columna).Cells.Item(CInt(sNRow)).Specific.value
Car = Right(sCad, 1)
If Char.IsLetter(Car) Then
sCad = CStr(cGlobalesSAP.CMonedaToNumber(sCad))
End If
If DatosAddon.DatosGenerales.FSeparadorDecimal = "," Then
sCad = sCad.Replace(".", ",")
End If
valor = CDbl(sCad)

Tendremos que implementar también las siguientes funciones : getValorMatrixA (alfanumérico), getValorMatrixN
(Numérico),…


Slide 28

Instalación ARD en SGI
 No se necesita crear proyecto de Instalación.
 AddonManager : Genera Automáticamente el ARD. Solo hay que proporcionar la






ruta donde se va a instalar la carpeta Addon con los desarrollos en el servidor.
Instalación Cliente: Solo se instala la primera vez en cada puesto cliente un ARD
genérico, que solo tiene una Dll que hace de lanzador.
Instalación Servidor: Copiar nuestra carpeta MisAddons2\EJEMPLO_SGI en el
cliente.
Actualizaciones : Para realizar una actualización de los desarrollos, se copia la
DLL del pluginPack en el servidor. NO se realiza ninguna acción en los puestos
clientes.
Permite tener varias versiones de Addon en el servidor para usarlos como
pruebas o verificación de puesta en marcha de desarrollos. Para ello solo
tenemos que crear un perfil nuevo.


Slide 29

Instalación ARD en SDK
 Se ha de crear un proyecto de instalación , añadiendo todos los ficheros
necesarios. Los cuales se copian a la maquina local en el proceso de la
instalación.
 Se ha de generar un ARD y la instalación se realiza en todos los puestos clientes.
No hay diferencia entre la instalación de servidor y maquina cliente.
 Actualizaciones : Para realizar una actualización de los desarrollos, implica
generar un ARD nuevo, parar a los puestos clientes. Al arrancar los puestos
clientes, se produce la desinstalación del ARD anterior y la instalación del nuevo.
Con el riesgo que ello conlleva, pues en algún puesto se le pueda dar a cancelar,
o se puede bloquear ,…incluso obligarnos a generar de nuevo el ARD con un
numero de versión superior.
 Se pierde mucho tiempo con las actualizaciones y además siempre implica un
riesgo y el modo de instalación no te permite una rápida respuesta. En cambio
con SGI, cualquier cambio solo requiere copiar la librería en el servidor, y que los
puestos clientes salgan de SAP y vuelvan a entrar para tener las modificaciones.


Slide 30

Beneficios del uso Formularios SGI.ControlsSAP
 Reusabilidad Código
• Permite herencia de formularios.
• Se usa una metodología de programación explicita.

 Rendimiento Aplicaciones.
• Al ser formulario .net , los eventos se producen dentro de la aplicación .net.
• La gestión eventos es eficiente, pues la controla el Framework
• Facilidad mantenimiento aplicaciones en comparación con formularios UI

 Rápido Desarrollo Aplicaciones.
• Al ser formularios .net permite utilizar la herencia de código , tanto como herencia
visual.
• Wizard para la generación automática del formulario y los objetos para acceder a los
datos..

 Intercambio Desarrollos.
• Al usar todos la misma metodología, es inmediato incorporar código de otros
Parnerts.


Slide 31

Beneficios del uso SGI para Desarrollos con SAP
 Framework con Herramientas para automatizar tareas.





AddonManager:.
AddonAdmin.
Activación / Desactivación de Plugin de Manera Automática.
Funciones de conversión , Ejecución Querys, Procedimientos , en definitiva un FrameWork
que esta por encima del SDK y que nos automatiza de manera eficiente la mayoría de las
tareas de programación.
• Visor CR integrado , mas la clase para imprimir , a la que se le puede especificar impresora,
numero copias, bandeja, …

 Rendimiento Aplicaciones.

• Manejador Eventos optimizado. Envía Evento directamente al manejador..
• Cacheo de controles para evitar llamadas a la UI

 Rápido Desarrollo Aplicaciones.

• Dispone de Herramientas que generan código de herramientas repetitivas.
• Herramienta para generar las instrucciones de creación de campos.
• Programación directa en los eventos de los controles. Facilita la programación y su posterior
mantenimiento al localizar fácilmente donde se realiza cada operación.

 Eliminación Tiempos Actualización.

• En las actualizaciones ya no hay que generar ARD, solo copiar la DLL del plugin Pack en la
carpeta del servidor.


Slide 32

Desventajas de usar SDK
 Reusabilidad Código
• No es fácil compartir desarrollos al tener una metodología diferente, y tareas básicas como la
activación o creación de campos de usuario, no están normalizadas y los desarrolladores tienen que
crearla cada uno con su criterio.
• Al estar repartido el código en varios formularios : Declaración , recogida eventos,.. en formularios y
procedimientos distintos, dificulta la compartición de código.

 Impresión.

• Carece de herramienta de impresión mediante código. Si se desea imprimir algún informe, se ha de
realizar un desarrollo para integrar un visor y una clase para gestionar todos los aspectos
relacionados con la impresión de informes. SGI por defecto implementa el visor de CR 2003 y objeto
para poder realizar la impresión de informes.

 Rendimiento Aplicaciones.

• En procesos en los que al abrir el formulario tiene que crear items o modificar los items de los
formularios de SAP, se produce efecto de parpadeo.
• En los procesos de manipulación de las celdas del grid, el retardo de un calculo puede llegar a tardar
entre 3-4 seg. Cuando con SGI el calculo es instantáneo.

 Ciclo desarrollo grande.

• Debido a la complejidad del uso de la UI, y las operaciones a realizar para cada acción, hace que los
desarrollos con SDK nos lleven casi el 50% respecto a SGI.

 Actualización Modificaciones en Cliente.

• En instalaciones con muchos puestos clientes, la actualización de modificaciones, con generación de
ARD nuevo, supone una autentica situación critica y un elevado coste en tiempo.