320 likes | 619 Views
Ejemplo comparativo de Desarrollo con SGI tool y con SDK estándar. Implantación de un módulo de Unidades de Medida. Lógica del Desarrollo a Implementar.
E N D
Ejemplo comparativo de Desarrollo con SGI tool y con SDK estándar Implantación de un módulo de Unidades de Medida
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)
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.
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.
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 Todo se hace a través de herramientas queautomatizan el proceso • 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
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.
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.
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.
Definir Menús y Campos a Crear en SGI Al definir el menú , también le indicamos el manejador que recibe el evento. CapturaEventos de los menús de SAP en SGI
Carga Menús SDK Podemos comprobar que la definición de menús es mas laboriosa en SDK que en SGI
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.
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() DimoTablas As Addon2Core.DataEngine.B1.CB1Tables DimoTabla As Addon2Core.DataEngine.B1.CB1Table Dimfield As Addon2Core.DataEngine.B1.CB1Field oTablas = New Addon2Core.DataEngine.B1.CB1Tables oTabla = oTablas.AddUserTable("IFG_CABUNIDM", "Cabe3cera LineasUnidMed.") 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.
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. • PrivateFunctionLoadBDFromXML(ByValSboapp As SAPbouiCOM.Application, ByValfile As String, ByVal Titulo As String) As Boolean • Public Sub Tablas_Campos(ByValSboapp As SAPbouiCOM.Application) • Public Sub Tablas_Usuario(ByValSboapp 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. • <Object>152</Object> • </AdmInfo> • <CUFD> • <row> • <TableID>@EXO_OCAJ</TableID> • <AliasID>EXO_SNES</AliasID> • <Descr>Entrada de Stock</Descr> • <TypeID>A</TypeID> • <Dflt>N</Dflt> • <EditSize>1</EditSize> • </row>
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.
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.
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.
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. <Addon2Core.EventEngine.SynchronizedEvent()> _ Private Sub MenuConf_MenuClick(ByValsender As Object, ByValevent_info As Addon2Core.EventEngine.CB1MenuEventArgs) DimoForm As frmConfigUnidades oForm = New frmConfigUnidades(Addon2Core.Addon.CB1App.Company) Addon2Core.Addon.CB1App.EmbedIntoSAP(oForm) oForm.Show() End Sub
Integración Formularios SDK en SAP • Una variable unica para todos los formularios. IfAddOn.oFunc.unidmThen 'Iniciamos el objeto de unidades de medida al arrancar el Addon. oUnidMed = New cUnidMedDoc EndIf PublicOverrides Sub SboAplicacion_ItemEvent(ByValFormUID As String, ByRefpVal As SAPbouiCOM.ItemEvent, ByRefBubbleEvent As Boolean) Try IfAddOn.oFunc.unidmThen Me.ItemEventUNIDM(FormUID, pVal, BubbleEvent) EndIf 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.
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. • <Addon2Core.UI.Forms.B1FormTypeEx(GetType(Addon2Defs.TiposFormCompras), 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.
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(ByValFormUID As String, ByRefpVal As SAPbouiCOM.ItemEvent, ByRefBubbleEvent As Boolean) HandlesSBO_Application.ItemEvent • IfpVal.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) • EndIf • Case "139" • IfoFunc.ActivoUnidadesMedidaThen • ifoGestUnidMedida_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) • EndIf • EndIf • EndSelect • EndIf • End Sub
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 PrivateWithEvents oColUnid1 As Addon2Core.UI.Controls.CB1FloatEditMatrixColumn PrivateWithEventsoColArticulo As Addon2Core.UI.Controls.CB1EditMatrixColumn PrivateWithEventsoColCantidad 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(ByValsender As Object, ByVal e As Addon2Core.EventEngine.CB1ItemEventArgs) HandlesoColUnid1.OnBeforeValidate, OColUnid2.OnBeforeValidate, • IfNotCalculoUnidades(e.Row) Then • Addon2Core.EventEngine.CEventManager.AbortEvent() • EndIf • 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.
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. PublicOverridesFunctionItemEventUNIDM (ByValFormUID As String, ByRefpVal As SAPbouiCOM.ItemEvent, ByRefBubbleEvent As Boolean) As Boolean Try IfpVal.EventType = SAPbouiCOM.BoEventTypes.et_VALIDATE And pVal.BeforeAction And and (pVal.ColUID = "U_IFG_UNI1" OrpVal.ColUID = "U_IFG_UNI2" OrpVal.ColUID = "U_IFG_UNI3" OrpVal.ColUID = "U_IFG_UNI4") Then IfNotpVal.InnerEventThen Me.CalculoUnidades(Me.SBOAplication.Forms.ActiveForm, pVal.Row) Else BubbleEvent = False EndIf EndFunction
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
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),…
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.
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.
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.
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.
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.