You are on page 1of 71

ControlsSAP Framework

Manual
Operativo
V2007.9

Po r

Oliver Parra

ControlsSAP Framework

ndice de Contenidos
1

Introduccin a ControlsSAP ................................................................. 4


1.1
1.2

Prerrequisitos ........................................................................................................... 5
Mtodo de trabajo.................................................................................................... 5

Objetos de negocio .............................................................................. 6


2.1
Definicin de Objeto de Negocio............................................................................... 6
2.2
Creacin de un objeto maestro (SAPObject).............................................................. 7
2.3
Creacin de los objetos detalle (SAPLines) ................................................................ 8
2.4
Utilizacin de un objeto de negocio ........................................................................ 10
2.5
Tipo de validaciones definidas ................................................................................ 11
2.6
Eventos................................................................................................................... 13
2.6.1
Altas/Modificaciones...................................................................................... 14
2.6.2
Eliminaciones ................................................................................................. 15

Diseo de pantallas visuales .............................................................. 16


3.1
Controles ................................................................................................................ 16
3.1.1
SAPTextBox .................................................................................................... 17
3.1.2
SAPListBox...................................................................................................... 17
3.1.3
SAPComboBox................................................................................................ 19
3.1.4
SAPGrid .......................................................................................................... 21
3.1.5
SAPTreeSearch ............................................................................................... 24
3.1.6
SAPAttachments............................................................................................. 25
3.2
Pantallas................................................................................................................. 26
3.2.1
FormSAP......................................................................................................... 26
3.2.2
FormEditSAP................................................................................................... 27
3.2.3
FormWizard.................................................................................................... 30
3.2.4
FormSAPAlta .................................................................................................. 31
3.2.5
FormApplication............................................................................................. 32

Formulario de edicin (FormEditSAP)................................................ 34


4.1
4.2
4.3
4.4

Diseo del formulario ............................................................................................. 34


Configurar el formulario.......................................................................................... 35
Entrada/Salida de datos .......................................................................................... 37
Trabajar con las grids .............................................................................................. 38

Impresiones........................................................................................ 40
5.1
5.2
5.3
5.4
5.5

Objeto Report......................................................................................................... 40
Tipo de conexin .................................................................................................... 42
Versiones Crystal Reports ....................................................................................... 42
Visor de informes.................................................................................................... 43
Configurar informes en formularios ........................................................................ 43
2

ControlsSAP Framework

Mensaje de sistema ........................................................................... 48


6.1
6.2
6.3

Mensajes de dialogo ............................................................................................... 48


Mensajes en la barra de estado .............................................................................. 49
InputBox ................................................................................................................. 49

Autorizaciones ................................................................................... 51
7.1
7.2

Definicin ............................................................................................................... 51
Creacin ................................................................................................................. 52

Parmetros......................................................................................... 53
8.1
8.2

Creacin de parmetros.......................................................................................... 53
Utilizacin de parametros ....................................................................................... 55

Mdulos de trabajo............................................................................ 58
9.1
9.2
9.3
9.4
9.5
9.6

10
10.1
10.2
10.3
10.4

11

Creacin de un mdulo........................................................................................... 59
Creacin de los Mens............................................................................................ 59
Creacin de la base de datos................................................................................... 60
Control de versiones ............................................................................................... 62
Creacin de parmetros.......................................................................................... 62
Arranque de un mdulo de trabajo ......................................................................... 63

Integracin...................................................................................... 66
Estilo 8.8................................................................................................................. 66
Fuente, tamao de letra y color de las pantallas ..................................................... 67
Textos Dinmicos (Control + Doble-Click)................................................................ 67
Mens para SAP Business One ................................................................................ 68

Database......................................................................................... 69

11.1 Tablas, campos, ndices........................................................................................... 69


11.1.1
Campos .......................................................................................................... 69
11.1.2
ndices............................................................................................................ 70
11.2 Vistas...................................................................................................................... 70
11.3 Procedimientos almacenados ................................................................................. 70
11.4 Sentencia SQL ......................................................................................................... 70
11.5 Categoras, consultas predefinidas, bsquedas formateadas................................... 71
11.5.1
Consultas predefinidas ................................................................................... 71
11.5.2
Bsquedas formateadas ................................................................................. 71

ControlsSAP Framework

Introduccin a ControlsSAP

ControlsSAP es un Framework de desarrollo para crear aplicaciones en SAP Business One 2007
utilizando la plataforma de Microsoft .NET Framework 2.0, incluyendo mtodos para:

Replicacin de controles y pantallas con la funcionalidad y aspecto de SAP B1,


sin necesidad de utilizar la UI.

Fcil utilizacin y creacin de objetos de negocio no contemplados en la DI de


SAP Business One.

Facilidad en el mantenimiento de objetos de negocio utilizando formularios de


edicin propios.

Conjunto de herramientas para la creacin en el arranque de: tablas, campos,


bsquedas
formateadas, consultas
predefinidas, vistas, etc.
y
parametrizaciones necesarias para el funcionamiento de nuestras aplicaciones.

Control de versiones.

Impresiones con Crystal Reports.

Integracin completa de pantallas realizadas en .NET dentro de SAP Business


One.

Etc.

Dado a las numerosas carencias proporcionadas por la UI, la mejor forma de trabajar ser la de
utilizar el AddOn2 Framework para trabajar con pantallas existentes de SAP. Y utilizaremos el
framework de ControlsSAP para la creacin de nuevas pantallas, ya que este posee un conjunto
de controles y pantallas que replican a los proporcionados por la UI, pero con toda la
potencialidad de .NET y con la posibilidad de poder aadir a dems controles propios sin ningn
tipo de problema.

ControlsSAP Framework

1.1

Prerrequisitos

Para seguir el presente manual, y desarrollar con ControlsSAP Framework, es preciso tener
instalado:

Sistema Operativo Windows XP/Server 2003


SAP Business One 2007 + SDK
Visual Studio 2005 + .NET Framework 2.0
SQL Server 2000/2005

Adicionalmente se deber instalar:

1.2

Libreras de Crystal Reports (para poder visualizar informes)


Libreras DevExpress 2008 (para poder disear formularios con varios controles)
AddOn2 Framework (para la integracin del proyecto en SAP Business One)

Mtodo de trabajo

La forma de trabajar con ControlsSAP ser la de crear mdulos de trabajo. Estos mdulos sern
libreras (dlls) que podremos aadir en un proyecto cliente. De esta manera conseguiremos
reutilizar el mismo cdigo para varios clientes con las mismas necesidades.
Los mdulos constarn de:

Objetos que se deben crear en la base de datos (tablas, vistas, campos,


bsquedas formateadas, etc.)

Opciones de men

Lista de Parmetros

Autorizaciones para los formularios

Numero de versin de datos

ControlsSAP Framework

Objetos de negocio

Antes de crear cualquier pantalla necesitaramos saber que objetos de negocio va a incluir
nuestra aplicacin y que relacin van a tener entre ellos. Esta es la mejor manera de encapsular
nuestro cdigo y poderlo reutilizar mas adelante en diferentes proyectos, gracias a que todo
nuestro cdigo se basar en objetos.
Con esto conseguiremos definir en cada mdulo una pequea Data Interface (DI) que se podr
intercambiar entre diferentes Partners.

2.1

Definicin de Objeto de Negocio

Podremos definir diferentes tipos de objeto:

Objetos maestros

Objetos detalle

Cada uno de ellos trabajar con una tabla de la base de datos. Un objeto maestro podr
contener cero o varios objetos detalle que sern sus lneas.

O. Maestro

D.B.

O. Detalle
O.Detalle
O.Detalle

ControlsSAP Framework

2.2

Creacin de un objeto maestro (SAPObject)

Para crear un objeto maestro deberemos heredar de la clase ControlsSAP.SAPObject. Solo por
tenerla de base ya dispondremos de una serie de mtodos y propiedades para interactuar con
la base de datos.
Estos mtodos sern los mismos que proporcionan los objetos de la DI por lo que ya deberan
de ser de sobras conocidos.
Object:
<SAPObject>
Methods:
+Add
+GetByKey
+Remove
+Update

Aade el objeto en la base de datos.


Obtiene los datos del objeto por su clave.
Elimina el objeto de la base de datos.
Modifica los datos del objeto.

Properties:
Browser
<Lines>

Permite navegar entre sus diferentes registros.


Los diferentes tipos de Lneas que puede tener
el objeto.

Inicialmente necesitaremos implementar 3 mtodos para crear un objeto cabecera:

Constructor: donde le indicaremos la Company y la tabla de la base de datos de


la que obtendr los datos.

InicializeLines: Mtodo donde inicializaremos todos los objetos de lnea de


nuestro objeto de negocio y dems variables que podamos tener. Para
inicializar las clases de lneas deberemos llamar al mtodo DestroyLines().

ModifyingObject: Utilizaremos este mtodo para modificar la estructura


interna de nuestro origen de datos antes de empezar a trabajar con sus datos.
Desde aqu podremos:
o

Aadir un campo mas a nuestra estructura de datos con AddField().

Indicar que un campo ser de solo lectura por lo que no actualizar en


la base de datos.

No permitir nulos con NotAllowNulls(). Cuando un campo no tiene


especificado ningn valor entonces por defecto se graba un nulo, si por
el contrario queremos que se guarde otro valor usaramos este mtodo.
7

ControlsSAP Framework

Public Class Contract


Inherits ControlsSAP.SAPObject
Public Sub New(ByVal Company As SAPbobsCOM.Company)
MyBase.New(Company, "@GSP_CNTR")
End Sub
Protected Overrides Function InitializeLines() As Long
End Function
Protected Overrides Sub ModifyingObject()
End Sub
Listado 1: Ejemplo de creacin de un objeto de negocio maestro.

Despus solamente deberemos crear una propiedad por cada campo de la tabla que vayamos a
publicar. Para obtener o asignar el valor del campo del registro actual utilizaremos la funcin
FilaActual(nombre_campo).
Public ReadOnly Property Code() As String
Get
Return Me.FilaActual("Code")
End Get
End Property
Public Property CardCode() As String
Get
Return Me.FilaActual("U_GSP_CardCode")
End Get
Set(ByVal value As String)
Me.FilaActual("U_GSP_CardCode") = Value
End Set
End Property
Listado 2: Ejemplo de creacin de propiedades en objeto de negocio.

Si no se especifica ningn valor para el campo Name (que crea en todas las tablas SAP) se le
asignar el mismo valor que contenga el campo Code, que por defecto ser el campo clave.

2.3

Creacin de los objetos detalle (SAPLines)

Para crear un objeto detalle deberemos crear una nueva clase que herede de
ControlsSAP.SAPLines. Esta clase ser muy parecida a la del SAPObject pero con las
particularidades de trabajar con objetos de lneas parecidos a los de la DI de SAP.
8

ControlsSAP Framework

Object:
<SAPLines>
Methods:
+Add
+SetCurrentLine
+Delete
Properties:
Count

Aade una nueva lnea.


Se posiciona en una lnea determinada.
Elimina la lnea actual.
Devuelve el total de lneas.

En esta clase tambin tendremos mtodos para modificar la estructura de datos interna de la
clase tal como se hace en el SAPObject. Y deberemos crear tambin una propiedad por cada
campo de nuestra tabla.
En el constructor deberemos indicar la tabla, el objeto cabecera y el campo que relaciona la
tabla de lneas con la tabla cabecera.
A diferencia de las lneas de la DI de SAP, en las SAPLines existe una diferencia a tener en
cuenta:
Siempre que se quiera aadir una nueva lnea se deber primero llamar al mtodo Add() y
despus rellenar las propiedades del objeto. Por lo cual si no existe ninguna lnea la propiedad
Count() devolver 0, a diferencia de las lneas del SDK de SAP que devuelven 1 aunque no
exista ninguna entrada de datos.

Public Class Contract_Lines


Inherits ControlsSAP.SAPLines
Friend Sub New(ByVal sapobject As Contract)
MyBase.New("@GSP_CNT1", "U_GSP_CntrCode", sapobject)
End Sub
Protected Overrides Sub ModifyingLines()
End Sub
Public ReadOnly Property CntrCode() As String
Get
Return Me.FilaActual("U_GSP_CntrCode")
End Get
End Property
Public Property ItemCode() As String
9

ControlsSAP Framework

Get
Return Me.FilaActual("U_GSP_ItemCode")
End Get
Set(ByVal value As String)
Me.FilaActual("U_GSP_ItemCode") = value
End Set
End Property
Public Property Import() As Double
Get
Return Me.FilaActual("U_GSP_Import")
End Get
Set(ByVal value As Double)
Me.FilaActual("U_GSP_Import") = value
End Set
End Property
Listado 3: Ejemplo creacin de un objeto de tipo lnea.

Una vez tengamos la clase lneas creada deberemos crear una propiedad para tener acceso a
estas en la clase maestra. Esta deber ser de solo-lectura e instanciarse solamente si no tiene
valor la variable que utilicemos para definirla. No nos olvidemos despus de inicializar las lneas
en el mtodo InitializeLines.
Private _lines As Contract_Lines
Protected Overrides Function InitializeLines() As Long
Me.DestroyLines(_lines)
End Function
Public ReadOnly Property Cnt1() As Contract_Lines
Get
If Me._lines Is Nothing Then
Me._lines = New Contract_Lines(Me)
End If
Return Me._lines
End Get
End Property
Listado 4: Aadir referencia clase lneas en objeto cabecera.

2.4

Utilizacin de un objeto de negocio

Una vez definidas todas las clases que componen nuestro objeto de negocio podremos ser
capaces de utilizar este objeto para entrar datos, recuperar datos y actualizarlos.
Dim cont As Contract
cont = New Contract(Me.Company)

10

ControlsSAP Framework

cont.CardCode = "C000001"
cont.Comments = "Ejemplo creacin de contrato"
Try
cont.Add()
Catch ex As Exception
ControlsSAP.SAPMsg.Alert("Error creando contrato")
End Try
Listado 5: Ejemplo creacin registro.

Dim cont As Contract


cont = New Contract(Me.Company)
'Consulta de un registro
cont.GetByKey("1")
cont.Comments = "Ejemplo actualizacin de contrato"
Try
cont.Update()
Catch ex As Exception
ControlsSAP.SAPMsg.Alert("Error actualizando contrato")
End Try
Listado 6: Ejemplo modificacin de un registro existente.

Este es un ejemplo de utilizacin por cdigo, aunque lo comn ser tratar nuestros objetos de
negocio mediante formularios visuales. En el prximo captulo veremos como existen
formularios creados explcitamente para trabajar con este tipo de objetos y de una manera
sencilla poder crear, consultar, actualizar y eliminar registros.

2.5

Tipo de validaciones definidas

Existirn 3 tipos de atributos que utilizaremos en las propiedades de los clases SAPObject y
SAPLines para realizar diferentes tipos de validaciones:

Mandatory: Forzaremos que en la propiedad se haya indicado un valor antes de


guardar. Si lo hacemos en una propiedad que devuelve un SAPLines entonces exigir
que contenga al menos 1 lnea.

HasRelation: Obliga a que el valor de la propiedad este relacionado con un


determinado campo de otra tabla.

NonUpdatable: No permite que se pueda modificar el valor de la propiedad una vez se


ha creado el objeto.

Tambin existen 2 funciones por las que podremos saber si desde nuestra clase cabecera
SAPObject se han aadido lneas en una determinada clase SAPLines o tambin si se han
eliminado:

ExistAddedLines
11

ControlsSAP Framework

ExistDeletedLines.

Ejemplo:
Creamos un objeto Presupuesto e intentamos simular el mismo funcionamiento que un
documento de la DI de SAP. Tendremos varios campos entre ellos el cdigo de cliente y el
nombre. Deberemos tener las siguientes restricciones:
1. Para entrar una Presupuesto es obligatorio entrar el cdigo de cliente.
2. El cdigo de cliente y el nombre no pueden modificarse una vez creado el Presupuesto.
3. El valor del cdigo de cliente debe existir en la tabla de clientes [OCRD.CardCode]
4. Una vez creado el Presupuesto no se permitir aadir nuevas lneas ni eliminarlas.

Public Class Presupuesto


Inherits ControlsSAP.SAPObject
'...
<NonUpdatable()> _
<Mandatory()> _
<HasRelation("OCRD", "CardCode")> _
Public Property CardCode() As String
Get
Return Me.FilaActual("U_GSP_CardCode")
End Get
Set(ByVal Value As String)
Me.FilaActual("U_GSP_CardCode") = Value
End Set
End Property
<NonUpdatable()> _
Public Property CardName() As String
Get
Return Me.FilaActual("U_GSP_CardName")
End Get
Set(ByVal Value As String)
Me.FilaActual("U_GSP_CardName") = Value
End Set
End Property
Private Sub Oferta_Updating(ByVal Obj As SAPObject) Handles
Me.Updating
If Me.ExistAddedLines(Me.Lines) Then
Throw New ValidationException("No se puede aadir
una lnea una vez creado el
documento")
End If
If Me.ExistDeletedLines(Me.Lines) Then
Throw New ValidationException("No se puede borrar una
fila una vez creado el
documento ")
12

ControlsSAP Framework

End If
End Sub
Listado 7: Ejemplo de utilizacin de atributos de validacin

Este mismo tipo de restricciones las podramos tener para el objeto lneas.

2.6

Eventos

Durante el momento de la ejecucin de las diferentes acciones que soportan los objetos de
negoci, podemos alterar los datos antes de que estos se guarden o podemos realizar
validaciones propias para cancelar determinadas acciones segn nuestras necesidades. El orden
secuencial de los diferentes eventos ms comunes es:

13

ControlsSAP Framework

2.6.1 Altas/Modificaciones
Add/Update

Validaciones internas

Mandatory
HasRelation
NonUpdatable
...

Validating

Adding/Updating

Por cada lnea del SAPLines aadida/modificada:

SavingLine

ValidatingLine

Recorre las lneas

ValidatedLines

Base de
Datos
Added/Updated

14

ControlsSAP Framework

2.6.2 Eliminaciones
Remove()

Removing

Eliminamos cada lnea del SAPLines:

Delete()

Recorre las lneas

Base de
Datos
Removed

15

ControlsSAP Framework

Diseo
visuales

de

pantallas

La librera de ControlsSAP incluye una serie de controles y formularios .NET pero con el
Look&Feel de SAP, estos nos ayudaran a trabajar sin las limitaciones que tiene la UI ya que
programaremos en la plataforma de Microsoft.NET 2.0.
Por lo que aunque necesitemos algn tipo de control o funcionalidad que no este disponible en
ControlsSAP podremos utilizarlo igualmente en nuestros proyectos con lo que podemos utilizar
una lista de recursos ilimitada, a diferencia de la programacin con la UI.

3.1

Controles

En este apartado veremos una lista de controles disponibles en ControlsSAP. Estos controles
dispondrn de una serie de propiedades comunes, ya que la mayora de ellos implementan una
misma Interface.
La mayora de controles son tpicos en Windows por lo que solamente se tratarn con mayor
detalle los ms importantes y complejos.
La lista de controles disponibles con el Look&Feel de SAP:

SAPLabel: control de etiqueta.

SAPCheckBox: casilla de verificacin.

SAPRadioButton: control de opciones.

SAPPanel: panel de agrupacin de controles.

SAPTextBox: caja de texto.

SAPListBox: control de seleccin parecido al ChooseFromList de SAP.

SAPComboBox: control combo de seleccin.


16

ControlsSAP Framework

SAPLinkedButton: Control de vinculo o flecha naranja.

SAPGrid: control de grid.

SAPTree: control de rbol.

TreeSearch: control de bsquedas en una grid mediante una serie de filtros


fijados.

SAPAttachments: control por el cual podremos anexar o visualizar diferentes


archivos relacionados con un registro.

3.1.1 SAPTextBox
Este es el control mas usado junto con las etiquetas SAPLabel. Son cajas de texto donde el
usuario podr introducir o consultar datos.
Podremos definir que tipo de datos va a utilizar el control y la entrada o salida variar segn
este.
DataType

SubDataType

Numero

Precio

Aade el smbolo de moneda y muestra los decimales


indicados en SAP para el tipo Precio.

Importe

Aade el smbolo de moneda y muestra los decimales


indicados en SAP para el tipo Importe.

Cantidad

Muestra los decimales indicados en SAP para el tipo


Cantidad.

Entero

No muestra decimales

Porcentaje

Muestra el smbolo de %

Cadena

Para datos de tipo texto

Memo

Para datos de tipo texto con multilnea

Fecha

Fechas

Hora

Valores de tipo hora

Los de tipo numrico solamente aceptarn entradas de datos numricos. Si seleccionamos el


tipo Fecha entonces se comportar como las entradas de fecha de SAP.

3.1.2 SAPListBox
Este control es tambin uno de los ms utilizados en los formularios y de los ms tiles ya que
te permite seleccionar valores que pertenezcan a una lista de registros, de una manera sencilla
y practica.

17

ControlsSAP Framework
Las propiedades ms utilizadas:

ValueMember: Indica de que columna obtendremos el valor una vez


seleccionado un registro.

DisplayMember: Indica la columna ser la que utilizaremos para mostrar en el


control una vez seleccionado un valor.

SelectedValue: Propiedad en la que podremos asignar u obtener el valor del


registro seleccionado y que hemos indicado el la propiedad ValueMember.

Otros de los mtodos ms comunes:

AddColumn: Aadiremos las columnas que queremos visualizar en la lista de


registros.

SetItemValue: Desde este mtodo podemos asignar tambin un valor al control


pero sin provocar el evento SelectedValueChaged, a diferencia de hacerlo con
SelectedValue.

La lista de datos que mostrar el control puede venir de diferentes orgenes:

Indicando la tabla de la que se obtendrn los datos

With Me.SapListBox1
.Table = "OCRD"
.ValueMember = "CardCode"
.DisplayMember = "CardName"
.Condition = "CardType='C'"
.Company = Me._company
End With

Asignndole un objeto DataTable a su propiedad DataSource:


18

ControlsSAP Framework

Dim dt as DataTable
dt = ControlsSAP.DoQuery(SELECT * FROM OCRD)
Me.SapListBox1.DataSource = dt

Aadiendo los valores manualmente con el mtodo InsertRow

With Me.SapListBox1
.InsertRow("O", "Abierto")
.InsertRow("C", "Cerrado")
.InsertRow("P", "Pendiente")
End With

Tambin podremos aadir valores con:


o

AddValidValues: Consulta la lista de valores validos definidos para un


campo de SAP.

AssignEnum: muestra la lista de valores de la enumeracin indicada.

Cuando asignemos los datos mediante la propiedad Table y queramos aadir un registro propio
cada vez que se carguen los datos, utilizaremos el evento SAPListBox.BoundTable.
Private Sub lstIC_BoundTable(...) Handles SapListBox1.BoundTable
Me.lstIC.InsertRow("-1", "-Ningn Interlocutor comercial-", 0)
End Sub
Listado 8: Despus de cada carga de IC, aadimos un nuevo valor.

Tambin podemos utilizar la propiedad DisplayControl para especificar otro control en el que
se volcarn los datos correspondientes a la columna especificada en el DisplayMember. En vez
de mostrarse la descripcin en el mismo control se mostrar en el control que indiquemos.

3.1.3 SAPComboBox
El control SAPComboBox incorpora la mayora de funciones y propiedades del control
SAPListBox anterior pero con el aspecto de un control combo. Este se utiliza normalmente para
mostrar listas pequeas de valores.

19

ControlsSAP Framework
Para los controles de lista se ha aadido nueva funcionalidad para poder aadir registros
nuevos desde el mismo control, ahorrndonos el trabajo de tener que ir a buscar la opcin de
men correspondiente a esta accin.

Podremos aadir registros indicando:

El nombre de la tabla: que abrir un formulario de alta de registros tpico


(FormSAPAlta)

El tipo de formulario: abrir el formulario de mantenimiento en modo crear. Este tiene


que heredar de FormEditSAP.

El id. de men de SAP: con este identificador (MenuUID) abriremos la pantalla


correspondiente en SAP. Para este tipo de formularios no se podrn aadir los registros
creados en el control, solamente servir para abrir el formulario de SAP.

Las funciones que utilizaremos para el SAPListBox son:

SetFormToCreate: Que aadir el botn de Nuevo en el formulario de seleccin.

Y para el control SAPComboBox:

InsertCreateRow: Que crear un nuevo registro Definir nuevo.

20

ControlsSAP Framework

3.1.4 SAPGrid
Complejo control de Grid que nos servir para mostrar un conjunto de valores y para realizar el
mantenimiento de los objetos SAPLines.

Podremos aadir diferentes tipos de columnas segn el tipo de datos que queramos mostrar:

AddColumn: Aade una columna genrica segn el tipo de datos que vaya a
mostrar.

AddPriceColumn: columna para datos de tipo precio. Visualizar el smbolo de


moneda y los decimales definidos en SAP para el tipo Precio.

AddImportColumn: columna para datos de tipo importe. Visualizar el smbolo


de moneda y los decimales definidos en SAP para el tipo Importe.

AddQuantityColumn: columna para datos de tipo cantidad. Visualizar los


decimales definidos en SAP para el tipo Cantidad.

AddPercentatgeColumn: visualiza el smbolo de %


21

ControlsSAP Framework

AddBooleanSAPColumn: visualizara una columna con formato checkbox para


datos alfanumricos con valores Y o N (Yes/No)

AddListColumn: parecido al control SAPListBox, donde le indicaremos un


origen de datos y la celda de la grid solamente podr se un valor de esta lista.

AddComboBoxColumn: visualizara una celda de tipo combo para la seleccin


de un valor en una lista indicada de valores.

AddProgressBarColumn: muestra una barra de progreso segn el valor actual


de la celda.

AddMemoColumn: podremos aadir columnas con textos lagos en varias lneas.


AddImageColumn: aadiremos columnas para mostrar imgenes desde una ruta. Deberemos
indicar un campo que ser el que contenga la ruta especfica de la imagen.
Otras configuraciones que puede tener la grid:

ObjectSource: propiedad para asignar los datos de un objeto SAPLines como


origen de datos.

AcceptsAddLines: nos indica si se pueden aadir nuevas lneas en la grid.

AcceptsDeleteLines: indica si podremos eliminar registros de la grid.

Editable: Indica si la grid permitir edicin de sus celdas

ShowEmptyLine: muestra una fila vaca para la entrada de nuevos registros.

MarkRow: Marca las filas en negrita que cumplan un criterio establecido.

DisableRows: Deshabilita las filas que cumplan con un criterio.

SelectRow: selecciona una o varias filas

GetSAPLine: posiciona el objeto SAPLines segn la fila indicada de la grid.

En prximos apartados veremos como trabajar un objeto de negocio desde un formulario. Los
objetos lneas se trabajarn con el control SAPGrid que dispone de varios eventos especiales
que nos informarn de cualquier modificacin en las lneas:

UpdatingSAPLine

UpdateSAPLine

ValidateSAPLine

DeletedSAPLine

DeletingSAPLine

3.1.4.1 Multiseleccin
Las columnas de tipo lista (AddListColumn) disponen de la opcin de multiseleccin. Existe un
parmetro por el que podremos indicar si queremos utilizar multi-seleccin o no. Los eventos
22

ControlsSAP Framework

UpdateSAPLine/ UpdatingSAPLine del SAPGrid se ejecutarn por cada fila, como si las
hubieramos entrado una a una.
Si alguna de las filas no pasa con xito la validacin entonces no se aadir en la grid.

c = .AddListColumn("Cd.artculo", "U_GSP_ItemCode", Me._company,


"OITM", "ItemCode", New String() {"ItemName", "ItemCode", _
"VatGourpSa", "ItmsGrpCod"}, , ,
True)

3.1.4.2 Columnas obligatorias


Existe un mtodo en el control SAPGrid por el que podremos indicar si alguna de las columnas
que hemos aadido es una columna de inicio, que quiere decir que es obligatorio que
introduzcamos un valor en una de estas columnas antes que en ninguna otra.
Ejemplo:
No podremos introducir ningn valor en las lneas mientras no exista un valor en la columna de
artculo:
.AddBeginningColumn("U_GSP_ItemCode")
Listado 9: Cdigo de ejemplo para indicar un columna obligatoria.
23

ControlsSAP Framework

Figura 1: Ejemplo de advertencia al intentar introducir un valor en una columna diferente a la indicada
como obligatoria.

Se ha publicado tambin un evento ShowingEditor por el que podremos conseguir efectos


parecidos al anterior, o sea no permitir la edicin de una celda mientras no se cumplan
determinados criterios.
Ejemplo:
No podemos introducir ningn valor en la grid mientras no se haya introducido el cdigo del
cliente (campo de cabecera):
Private Sub SapGrid1_ShowingEditor(...) Handles SapGrid1.ShowingEditor
If Not Me.lstCardCode.HasValue Then
ControlsSAP.SAPMsg.StatusBarMsg("Falta cdigo de
interlocutor comercial", True)
e.Cancel = True
End If
End Sub

3.1.5 SAPTreeSearch
Control de vista de datos para realizar diferentes tipos de filtros (panel izquierda). Adems de
poder filtrar en tiempo de ejecucin.
24

ControlsSAP Framework
3.1.6 SAPAttachments
Control utilizaremos para adjuntar o visualizar archivos en una carpeta de documentos anexos
de una manera sencilla.
Podremos realizar las siguientes acciones:
Explorar: Seleccionaremos un archivo y lo anexaremos por defecto en la carpeta de documentos
de anexo especificada en SAP. Si indicamos una ruta mediante la propiedad AttachmentPath
entonces se utilizar esta ruta para realizar una copia del archivo.
Visualizar: Abrir el documento seleccionado.
Borrar: Eliminar el documento seleccionado de la lista de documentos del control.
Drag&Drop: El control permite la posibilidad de arrastrar y soltar archivos dentro de este, con lo
que se creara una copia del archivo en la ruta de anexos especificada.
Tambin permitir arrastrar y soltar mensajes de correo desde Microsoft Outlook.

25

ControlsSAP Framework

Se utilizar para guardar documentos adjuntos por ejemplo en un SAPObject. Para ello
solamente necesitaremos una propiedad de tipo String donde guardaremos la lista de
archivos en cadena y separados por punto y coma.
Para obtener la lista de archivos utilizaremos la propiedad Attachments del control.

3.2

Pantallas

Existen varios tipos de pantallas con las que podremos trabajar. La base de todas ellas ser la
clase ControlsSAP.Forms.FormSAP. Esta clase ser la que utilicemos normalmente y la que
proporcionar a nuestros formularios el aspecto de pantalla de SAP e incluirn todos los
mecanismos de integracin en SAP Business One como si fueran pantallas propias de la UI.

3.2.1 FormSAP
Este tipo de formulario ser la clase base de las que heredarn todos nuestros formularios. Con
esto dispondremos de todos los mtodos, funciones y propiedades que nos servirn para
interactuar con las dems pantallas y facilitarn la integracin con SAP.
Podremos interactuar con algunos botones de la barra de herramientas de SAP Business One
como son los de Excel, los de Word, los de impresin y presentacin preliminar, y tambin los
de mailing. Para ello disponemos de una serie de eventos y de propiedades para habilitar o no
los botones de la barra de herramientas:

AcceptsExcel: Habilita el botn de Excel de la barra de herramientas y podemos


capturar la pulsacin a travs del evento Excel.

Word Habilita el botn de Word de la barra de herramientas y podemos


capturar la pulsacin a travs del evento Word.

AcceptsPrint/AcceptsPreview: Habilita la impresin/presentacin preliminar


que capturaremos desde el evento Print

eMailing: ser el evento que capturaremos si queremos modificar la pantalla de


mailing que aparecer por defecto. Como por ejemplo aadir un destinatario,
datos adjuntos, etc.

Tambin tendremos funciones muy utilizadas como:

OpenForm: Abre un formulario y lo integra en SAP automticamente.

OpenFormDialog: abre un formulario en modo dialogo para obtener un


resultado.

OpenFormEdit: abre un formulario de edicin (que veremos en el prximo


apartado) y se sita en un registro indicado.

OpenReport: muestra una pre-visualizacin de un informe de CrystalReports.

26

ControlsSAP Framework

3.2.2 FormEditSAP
Nos permite realizar el mantenimiento de los objetos de negocio creados a partir de un
SAPObject de una manera rpida y sencilla. Este es formulario mas complejo que existe pero
tambin el mas utilizado, por lo que dedicaremos un capitulo especifico para hablar de el.
Este tipo de formularios interacta con los botones de la barra de herramientas referentes al
mantenimiento de datos, a dems de los ya mencionados anteriormente por el hecho de
heredar de FormSAP. Estos son:

AcceptsAdd: permite tener habilitado el botn de Nuevo.

AcceptsDelete: habilita la opcin de men de eliminar.

AcceptsSearch: activa el botn de bsquedas

AcceptsUpdate: habilita los botones de desplazamiento de registros (primero,


anterior, siguiente, ultimo)

Una vez configuradas las acciones que queremos tener disponibles en nuestra pantalla
deberemos conocer los estados que puede tener el formulario por motivo de realizar
cualquiera de estas acciones. Desde la propiedad Estat podremos saber si estamos en alguno de
los estados siguientes:

CONSULTING: indica que estamos en un estado de consulta. Se provoca en el


momento de desplazarse entre los registros

UPDATE: indica que estamos realizando una actualizacin en un registro ya


existente. La mayora de los controles vistos hasta ahora disponen de una
propiedad CausesActionUpdate que si esta activada indicar que cualquier
cambio en ese control provocar un cambio de estado en el formulario.

SEARCH: no se utiliza.

ADD/ADDING: nos informa de que se esta aadiendo un nuevo registro.

Existe una propiedad ButtonForm para indicar que botn del formulario ser el indicado en
recibir los cambios de estado del formulario y proceder a un tipo de accin u otra dependiendo
de este:
Estado

Texto del ButtonForm

Accin

CONSULTING

Ok

Cerrar el formulario

UPDATE

Actualizar

Actualizar los datos

ADD

Crear

Crea un nuevo registro

Todo este tipo de acciones tienen una serie de mtodos asignados que podremos sobrescribir
para aadir funcionalidad propia segn nuestras necesidades:

DoAdd: prepara el formulario para crear un nuevo registro. Se ejecuta en el


momento de de pulsar sobre el botn de Nuevo. Podemos utilizarlo para
asignar valores por defecto en los controles.
27

ControlsSAP Framework

DoDelete: realiza la accin de eliminar el registro actual. Se ejecuta cuando


pulsamos sobre la opcin de men Datos Eliminar

DoSearch: realiza una bsqueda entre todos los datos. Se obtiene cuando
pulsamos sobre buscar.

GoToFirst: se desplaza al primer registro.

GoToLast: nos desplazamos al ltimo registro.

GoToPrevious: nos desplazamos al registro anterior.

GoToNext: registro siguiente

GoToKey: de posiciona en el registro que coincida con la clave indicada.

3.2.2.1 Carga de datos


Existirn 2 maneras de cargar datos en un FormEditSAP trabajando con un objeto de negocio
SAPObject.

Usando GetAllObjects:
Esta es la manera ms usual de obtener los datos en un FormEditSAP.
Podremos consultar todos los datos del objeto existentes en ese momento. Se
puede tambin indicar por que campo queremos que aparezcan ordenados los
registros.

28

ControlsSAP Framework

Base de
datos

Deberemos asignar el objeto al formulario y este se encargar de consultar los


datos del registro indicado en cada momento.
_of = New Oferta(_company)
Me.GetAllObjects(_of, "U_GSP_CardName")
Listado 10: Instanciacin y uso del un SAPObject en un FormEditSAP.

Usando el GetSAPObject del objeto:


Otra manera de consultar los datos de un objeto es la de asignarle previamente
el origen de datos (por el que queremos navegar) al Browser del objeto. Es
necesario que en el origen de datos exista un campo con la clave principal del
objeto.
Para ello utilizaremos el mtodo GetSAPObject que indicar al formulario que
debe trabajar con los datos del objeto actual.

Browser

Ejemplo: Solamente podremos navegar por registros donde el total sea mayor
de 1000.
29

ControlsSAP Framework

Dim dt As DataTable
dt =DoQuery("SELECT Code, U_CardCode, U_CardName, U_DocDate
FROM
[@GSP_DEMO_OFERTA]
WHERE (U_GSP_DocTotal > '1000')", Me._company)
If dt.Rows.Count > 0 Then
_of.Browser.RecordSet = dt
End If
Me.GetSAPObject(_of)
Listado 11: Utilizacin del Browser y uso del GetSAPObejct.

Solo podremos desplazarnos por los registros seleccionados en el momento de cargar el


Browser del objeto. Por los que si existen nuevos registros creados posteriormente por otros
usuario o procesos no se visualizarn, pero si los cambios ya que en cada movimiento se
refrescarn los datos del objeto actual.
Por defecto si no se especifica ninguna accin en el momento de la carga el formulario se
posicionar en el ltimo registro.

3.2.3 FormWizard
Este tipo de formulario puede ser muy til para realizar pantallas asistentes de forma rpida y
prctica. Consistir en un formulario con un control de pestaas que en el momento de
ejecucin se visualizar como una pantalla asistente propia de las de SAP.

Permitiremos realizar un cambio de pgina dependiendo de si se cumplen las validaciones que


creemos oportunas, capturando los eventos:

PageChanged

PageChanging
30

ControlsSAP Framework

Estos eventos nos informarn de que pgina venimos y a que pgina nos dirigimos. Podremos
cambiar la informacin descriptiva de la pgina actual por medio de la propiedad Description.
Tambin podremos desplazarnos por las pginas a travs de cdigo mediante:

NextPage: nos desplazamos a la pgina siguiente.

PreviousPage: nos movemos a la anterior pgina.

ActualPage. Podemos obtener en que pagina estamos actualmente y podemos


desplazarnos tambin a una pgina en concreto asignndole un valor.

El formulario asistente podr tener 2 configuraciones diferentes segn la propiedad PageEnd:


1. Si es False al llegar a la ltima pgina el botn de continuar quedar
deshabilitado.
2. Si es True en la ltima pgina aparecer un botn de finalizar que lanzar un
evento FinalizeWizard que deberemos capturar para ejecutar las acciones
necesarias al finalizar el asistente.

3.2.4 FormSAPAlta
Es un sencillo y prctico tipo de formulario que utilizaremos para crear o actualizar registros en
una tabla de usuario de SAP. Estas pantallas son tiles para tablas bsicas, donde solamente sea
necesario indicar un cdigo y una descripcin.
Podremos utilizarlas sobre todo para realizar mantenimientos de tablas en entornos fuera de
SAP Business One.

Figura 2: Ejemplo de pantalla tipo FormSAPAlta.

31

ControlsSAP Framework

3.2.5 FormApplication
Si queremos reutilizar nuestro cdigo en un entorno fuera de SAP Business One, podremos
simular un entorno parecido en aspecto y funcionalidades vistas, utilizando el tipo de
formulario FormApplication. Con el dispondremos de una interficie parecida a la de SAP
incluyendo la barra de herramientas, barra de men, men principal, etc. Dispone de mtodos
para:

Conectar a la base de datos

Aadir los mdulos de trabajo y sus mens

Abrir formularios

Desplazarse por los registros, crear, buscar, etc.

Gestionar las aplicaciones

Control de versiones

En el evento Load del formulario llamaremos a la funcin Connect. Esta funcin realizar la
conexin a la ltima base de datos de SAP conectada. Si es la primera vez se mostrar un
formulario en el que indicaremos los datos necesarios para la conexin.
Para cargar mdulos de trabajo utilizaremos AddNewModule/AddItemModule y lo
realizaremos en el evento LoadModules. Si estos necesitan crear tablas, campos, etc. lo
realizarn antes de iniciarse la aplicacin informando al usuario de los cambios que se van a
realizar para cada mdulo.

Public Class frmMenu


Private Sub frmMenu_Load(ByVal sender As Object, ByVal e As
EventArgs) Handles MyBase.Load
Me.Connect()
End Sub

Private Sub frmMenu_LoadModules(ByVal sender As Object, ByVal e As


EventArgs) Handles Me.LoadModules
Me.AddItemsModule(DLL.LoadDLL(Me.Company))
End Sub
End Class
Listado 12: Conexin y arranque de un mdulo desde un formulario FormApplication.

32

ControlsSAP Framework

Figura 3: Ejemplo FormApplicacion.

33

ControlsSAP Framework

Formulario
(FormEditSAP)

de

edicin

En este capitulo veremos en profundidad como trabajar un objeto de negocio SAPObject a


travs de un formulario de edicin FormEditSAP.

4.1

Diseo del formulario

Primero de todo disearemos una pantalla que herede de FormEditSAP y le aadiremos los
controles necesarios para poder editar el objeto con el que vayamos a trabajar.

Figura 4: Ejemplo diseo de un formulario de edicin.


34

ControlsSAP Framework

El objeto de negocio con el que trabajaremos ser el visto en ejemplos anteriores. Para el
mantenimiento de las propiedades del objeto Contrato necesitaremos aadir los siguientes
controles y configurarlos de manera:
1. Cdigo: SAPTextBox, no acepta ediciones ni en alta ni en actualizaciones.
2. Cdigo cliente: SAPListBox, de consulta de los clientes

Table = OITM
ValueMember =CardCode
DisplayMember = CardName
Condition = CardType=C

3. Fecha Inicio/Fecha Fin: SAPTextBox acepta todo tipo de ediciones

DataType = Fecha

4. Comentarios: SAPTextBox multilnea, acepta todo tipo de ediciones

DataType = Memo

5. Lneas de contrato: Las lneas las trabajaremos mediante un SAPGrid.


A todos estos controles les deberemos indicar tambin las propiedades siguientes para que
interacten con el estado del formulario:

4.2

CausesActioUpdate = True

CausesAspectChage = True

Configurar el formulario

El paso siguiente ser entrar ya en el cdigo y crear un constructor que reciba un objeto
SAPBobsCOM.Company. Definiremos dos variables de clase que utilizaremos para el objeto de
negocio con el que trabajar el formulario y la otra variable para referenciar la Company.

Private _company As SAPbobsCOM.Company


Private _obj As Contract
Public Sub New(ByVal Company As SAPbobsCOM.Company)
MyBase.New()
'El Diseador de Windows Forms requiere esta llamada.
InitializeComponent()
'Agregar cualquier inicializacin despus de la llamada a
'InitializeComponent()
Me._company = Company
End Sub
Listado 13: Ejemplo constructor de un FormEditSAP.
35

ControlsSAP Framework

Una vez definido el constructor pasaremos a configurar los controles que utilizar el formulario.
Para ello utilizaremos el evento Load del formualrio. Definiremos tambin con el mtodo
ViewColumnInSearch las columnas que queremos que se muestren en el momento de las
bsquedas.
Private Sub FormEditSAP1_Load(ByVal sender As Object, _
ByVal e As EventArgs) Handles MyBase.Load
'Configuracin de la busqueda del formulario
Me.ViewColumnInSearch("Code", "Cdigo")
Me.ViewColumnInSearch("U_GSP_CardCode", "Cdigo cliente")
Me.ViewColumnInSearch("U_GSP_DataIn", "Fecha inicio")
Me.ViewColumnInSearch("U_GSP_DateOut", "Fecha de fin")
'Configuracin del Listbox de clientes
With lstCardCode
.Company = Me._company
.AddColumn("CardCode", "Cdigo")
.AddColumn("CardName", "Nombre", 200)
.AddColumn("Phone1", "Telfono")
End With
'Configuracin de la Grid
With grdCnt1
.AddListColumn("Cod. Artculo", "U_GSP_ItemCode", _
Me._company, "OITM", "ItemCode", _
New String() {"ItemName"})
.AddColumn("Descripcin", "ItemName")
.AddQuantityColumn("Cantidad inicial", "U_GSP_QuantIn")
.AddQuantityColumn("Cantidad final", "U_GSP_QuantOut")
.AddImportColumn("Importe", "U_GSP_Import")
End With
Listado 14: Ejemplo configuracin del formulario y sus controles.

Existe la posibilidad tambin, en el momento de buscar


tablas sobrescribiendo la consulta del formulario.

, de hacer aparecer datos de otras

Para ello deberemos capturar el evento BuldingSearch. Como requisito indispensable debe
aparecer como mnimo el campo clave del objeto en la nueva bsqueda.
Private Sub frmOferta_BuldingSearch(ByRef sqlQuery As String) Handles _
Me.BuldingSearch
sqlQuery = "SELECT [@GSP_DEMO_OFERTA].Code, OCRD.CardCode,
OCRD.CardName, OCRD.Address
FROM [@GSP_DEMO_OFERTA] INNER JOIN OCRD
ON [@GSP_DEMO_OFERTA].U_GSP_CardCode =
OCRD.CardCode"
End Sub
Listado 15: Ejemplo utilizacin bsqueda propia con BuldingSearch.

Tambin instanciaremos el objeto y cargaremos todos los datos por defecto del objeto de
negocio para poder empezar a trabajar con el, dentro del evento Load.
36

ControlsSAP Framework

'Creacin del objeto de negocio y obtencin de los datos


_obj = New Contract(_company)
Me.GetAllObjects(_obj)
Me.GoToLast()
Listado 16: Carga de datos en el objeto de negocio.

4.3

Entrada/Salida de datos

El formulario dispondr de 2 mtodos que deberemos sobrescribir y que necesitaremos para


realizar la entrada de datos del objeto hacia el formulario como el proceso contrario.
Deberemos sobrescribir el LoadFormWithObject que se ejecutar cada vez que se necesite
cargar datos en los controles desde el objeto actual:
Public Overrides Sub LoadFormWithObject()
txtCode.Text = Me._obj.Code
lstCardCode.SelectedValue = Me._obj.CardCode
txtDataIn.Text = Me._obj.DataIn
txtDateOut.Text = Me._obj.DateOut
txtComments.Text = Me._obj.Comments
'Carga de las lneas
grdCnt1.ObjectSource = Me._obj.Cnt1
End Sub

Para el proceso contrario, cargar los datos entrados en el formulario en las propiedades del
objeto sobrescribiremos el mtodo LoadObjectWithForm. Este se ejecutara en el momento de
aadir o actualizar:
Public Overrides Sub LoadObjectWithForm()
Me._obj.CardCode = lstCardCode.SelectedValue
Me._obj.DataIn = txtDataIn.Value
Me._obj.DateOut = txtDateOut.Value
Me._obj.Comments = txtComments.Text
End Sub

Hay que observar que las lneas no necesitan actualizarse ya que al trabajarse con la Grid se
actualizan directamente en su origen de datos, por lo que el objeto dispondr de los nuevos
valores en todo momento.

Con esto ya estaramos en disposicin de poder realizar ya un mantenimiento bsico de nuestro


objeto. Por lo que si aadimos una nueva opcin de men en la que abramos el formulario
podremos ya realizar altas, modificaciones, bsquedas, etc.
37

ControlsSAP Framework

Figura 5: Ejemplo formulario de edicin en tiempo de ejecucin.

4.4

Trabajar con las grids

Para completar nuestro mantenimiento con las lneas, deberemos realizar algunas validaciones,
y completar algunos datos como por ejemplo: en el caso de entrar un cdigo de artculo
querremos que nos aparezca automticamente la descripcin. Para ello necesitaremos capturar
un evento de la grid que nos informe que se ha modificado y actualizar la propiedad de la lnea
correspondiente.
Private Sub grdCnt1_UpdateSAPLine(ByVal l As ControlsSAP.SAPLines,
ByVal ColumnName As String) Handles grdCnt1.UpdateSAPLine
If ColumnName = "U_GSP_ItemCode" Then
Dim it As SAPbobsCOM.Items
it = Me._company.GetBusinessObject(oItems)
it.GetByKey(Me._obj.Cnt1.ItemCode)
'Actualizamos la descripcin
Me._obj.Cnt1.ItemName = it.ItemName
End If
End Sub

Para validar por ejemplo que la cantidad inicial sea siempre menor que la cantidad final
haramos lo siguiente:

38

ControlsSAP Framework

Private Sub grdCnt1_ValidateSAPLine(ByVal l As ControlsSAP.SAPLines, _


ByVal e As DevExpress.XtraGrid.Views.Base.RowAllowEventArgs) Handles
grdCnt1.ValidateSAPLine
With Me._obj.Cnt1
If .QuantIn > .QuantOut Then
ControlsSAP.SAPMsg.StatusBarMsg("La cantidad inicial
debe de ser mayor que la cantidad final", True)
e.Allow = False
End If
End With
End Sub

Es recomendable que todas las validaciones que debamos realizar sobre los objetos de
negocio se realicen dentro del propio objeto. Ya que si en otro momento lo utilizamos sin el
formulario correspondiente, nos servirn las mismas validaciones y cumpliremos en cualquier
entorno las reglas de negocio siempre.

39

ControlsSAP Framework

Impresiones

El Framework de ControlsSAP dispone de utilidades para facilitar el trabajo con informes


realizados con la herramienta Cystal Reports. Esto facilita la incorporacin de informes en las
aplicaciones realizadas.

5.1

Objeto Report

Existe un objeto Report que podemos utilizar para imprimir, previsualizar, exportar a pdf, etc.,
informes creados con la herramienta de Crystal Reports.
Las propiedades y mtodos mas usados para este tipo de objeto son:

ReportName: Indicaremos la ruta del fichero rpt. El informe deber estar dentro de la
ruta especificada en el formulario de configuracin (Figura 6).

SetParameterValue: Si el informe contiene parmetros podremos indicarle los valores


a estos mediante este mtodo.

Print: Realiza la impresin del informe indicado en la propiedad ReportName. Si el


informe incluye parmetros y no hemos indicado sus valores aparecer un formulario
de demanda (Figura 7). Tambin se mostrar un dialogo de impresin para especificar
la impresora y el numero de copias (Figura 8). Si no queremos imprimir directamente
por una impresora sin mostrar el dialogo de impresin entonces utilizaremos el mtodo
DirectPrint.

DirectPrint: Realiza la impresin directa del informe. Funcionar igual que el mtodo
Print pero sin mostrar el dialogo de impresin. Deberemos especificar una impresora y
el nmero de copias. Si no especificamos ninguna se imprimir una copia por la
impresora por defecto.

Preview: Realizar una impresin preliminar. Si el informe incluye parmetros y no


hemos indicado sus valores aparecer un formulario de demanda.

40

ControlsSAP Framework

SelectionFormula: Podemos indicar una formula con formato de Crystal Reports para
poder filtrar los registros por el criterio indicado.

En el constructor deberemos especificar el objeto SAPBobsCOM.Company. Este se utilizar


para conectar la base de datos del informe hacia la indicada en el objeto. Por lo que podremos
reutilizar cualquier informe aunque este se haya creado con una conexin diferente.
Es importante que realicemos la liberacin del objeto Report con el mtodo Dispose. Para no
tener problemas posteriores de memoria.

Figura 6: Formulario de configuracin. Especificar la ruta de los informes

Figura 7: Formulario de demanda de parmetros

41

ControlsSAP Framework

Figura 8

5.2

Tipo de conexin

Al disear informes con Crystal Reports podemos utilizar 2 tipos de conexin con la base de
datos, que sern compatibles con la impresin de ControlsSAP:

ODBC: Por defecto ControlsSAP Framework crear una conexin de tipo ODBC que
podremos utilizar para disear los informes con Crystal Reports. Podemos
consultar/modificar sus datos desde Gestin Configuracin.

OleDB (ADO): Podremos utilizar los informes creados con una conexin OleDB (ADO)
para SQL Server.

El sistema se encargar de reconocer que conexin utiliza el informe antes de actualizar los
datos de conexin con la base de datos actual.

5.3

Versiones Crystal Reports

Podemos disear informes que sean compatibles con las versiones de Crystal Reports 10 o
Crystal Reports para NET 2.0 o la ultima versin de Crystal Reports 2008.
El objeto Report lo podremos encontrar en una de las siguientes libreras, dependiendo de que
versin de Crystal Reports que necesitemos:

ControlsSAP.CrystalReports.v10.dll

ControlsSAP.CrystalReports.v12.dll

42

ControlsSAP Framework

Podremos utilizar una u otra, o las dos a la vez. En estas libreras encontraremos el objeto
Report. El objeto lo encontraremos en el namespace:

ControlsSAP.CrystalReports .Cr10.Report

ControlsSAP.CrystalReports .Cr12.Report

5.4

Visor de informes

Cada visor incluir su propia barra de herramientas, adems podremos utilizar tambin la barra
de herramientas de SAP o del formulario de aplicacin si estamos por fuera.

5.5

Configurar informes en formularios

Existen propiedades y mtodos en los formularios de tipo FormSAP, que nos permitirn aadir
internamente informes para posteriormente poderlos previsualizar o imprimir. Tambin
permitiremos aadir informes externamente a nivel de usuario, pudiendo duplicar informes
existentes o aadiendo nuevos.
Para utilizar esta nueva funcionalidad deberemos activar la propiedad UseSystemPrinting. Por
defecto esta propiedad estar a False, por lo que al pulsar sobre imprimir/previsualizar se
ejecutar el mtodo OnPrint y el evento PrintingForm. Pero si queremos utilizar esta
funcionalidad esta propiedad deber estar a True, y ya no se ejecutarn los mtodos y
eventos anteriormente mencionados.
43

ControlsSAP Framework

Para aadir un informe tenemos una propiedad Reports que nos permitir aadir varios
informes al formulario del siguiente modo:
Me.Reports.Add("Facturas", New cr12.Report(GetType(misfacturas),
Me._company))
Me.Reports.Add("Factura2", New cr12.Report(GetType(factura1),
Me._company), _
New CrystalReportsParameter("Code",
Me.txtCode))

Public Sub Add(Description as String,


ReportObj AS ControlsSAP.CrystalReports.IReport,
ParamArray Parameters CrystalReportsParameter())
Description: Descripcin que le daremos al informe. Deber ser nica para los informes del
formulario.
ReportObj: Instanciaremos un objeto Report indicndole el tipo de la clase que hace referencia
al informe CrystalReports, y la company desde la que obtendr los datos.
Parameters: Lista de parmetros que queramos pasar a el informe en el momento de
imprimirlo. Los parmetros podrn ser de tipo Discreto o de tipo Rango. Necesitaremos indicar
el nombre del parmetro y de que control del formulario obtendremos el valor. Tambin
podremos pasar valores constantes.
Para poder incluir informes dentro de nuestros proyectos y as utilizarlos como una clase
deberemos tener instalado alguna versin de Crystal Reports que incluya herramientas de
integracin para Visual Studio.
Podemos obtener una desde la herramienta de instalacin de Visual Studio 2005, marcando la
casilla Crystal Reports para Visual Studio que instalar las libreras para Crystal Reports 10
(Figura 9).

44

ControlsSAP Framework

Figura 9: Crystal Reports para Visual Studio 2005

Si tenemos esta funcionalidad ya podremos anexar documentos *.rpt en nuestro proyecto. Al


anexarlos al proyecto automticamente se generar una clase *.vb que utilizaremos para hacer
referencia a estos informes.

Con esto ya tendramos definidos varios informes de sistema. Ahora podramos definir otros
informes de usuario, propios para cada tipo de cliente. Para ello utilizaremos el botn del
diseador de layaouts de SAP (Figura 10: Diseador de informes).

45

ControlsSAP Framework

Figura 10: Diseador de informes

Desde el diseador podremos realizar las siguientes acciones:


Fijar como estndar: Podremos definir que formulario queremos fijar por defecto.
Podremos indicar si lo queremos para todos lo usuarios o solamente para el usuario actual.
Si algn usuario tuviera una configuracin propia no se le cambiara si indicamos que lo
queremos para todos los usuarios. Solamente afectara cuando el usuario no tenga ningn
informe definido por defecto para el.
Duplicar: Crear una copia del informe seleccionado en un archivo rpt, en la ruta de los
informes indicada en la configuracin.
Nuevo informe: Podremos aadir un nuevo informe de CrystalReports. Para ello
deberemos indicar una descripcin que no se podr repetir y seleccionar un informe rpt
que crear una copia en la ruta de los reports.
Una vez seleccionado el fichero con el report aparecern los parmetros de este. Si
queremos que el parmetro este relacionado con algn control del formulario deberemos
indicar el nombre de este control. Si por lo contrario queremos indicar un valor fijo se lo
indicaremos entre llaves ({Valor}), y si lo dejamos en blanco entonces en el momento de la
impresin se lo pedir al usuario.
Tambin podremos indicar el nmero de copias por defecto. Si indicamos una impresora
fija se imprimir directamente por ella, si lo dejamos en blanco en el momento de imprimir
aparecer el dialogo de impresin con la impresora por defecto del sistema.

46

ControlsSAP Framework

Figura 11: Aadir un nuevo informe.

Editar: Permitir editar una informe de usuario. Los informes de sistema no se pueden
modificar. Si queremos variar algn valor deberemos duplicar el informe y entonces editar
el nuevo informe de usuario.
Eliminar: Eliminaremos el informe de usuario seleccionado.
Disear: Permite abrir el informe para su diseo siempre y cuando tengamos las
herramienta de Crystal Reports instalada en la mquina.
Una vez configurados los informes si pulsamos previsualizar
informes incluidos en el formulario.

Si pulsamos el botn de imprimir

nos aparecer una lista con los

, imprimiremos el informe considerado por defecto.

47

ControlsSAP Framework

Mensaje de sistema

Disponemos de una serie de mensajes de sistema con la apariencia de SAP Business One, para
facilitar la comunicacin entre el usuario y la aplicacin.
Existirn diferentes tipos de mensajes:

Informativo

Aviso

Decisin

Error

Accin

Entrada de datos

6.1

Mensajes de dialogo

Existen una serie de mensajes ya definidos segn el tipo de mensaje que queramos mostrar:
Ico

Tipo
SAPMsg.Question
SAPMsg.Alert
SAPMsg.Critical/Exception
SAPMsg.Info

Podemos configurar nuestro propio mensaje con la funcin SAPMsg.Show indicando el


mensaje, el icono, los botones.
Pulsando <Control + C> al aparecen una mensaje del tipo SAPMsg, podremos copiar el texto del
mensaje.
48

ControlsSAP Framework

Para utilizar mensajes que muestren excepciones capturadas podemos utilizar la funcin
SAPMsg.Show y pasarle la excepcin. Este tipo de mensajes permite que haciendo doble clic
sobre el mensaje de error, poder visualizar la pila de la excepcin (Figura 12: Mensaje
mostrando la excepcin completa.).

Figura 12: Mensaje mostrando la excepcin completa.

6.2

Mensajes en la barra de estado

Tambin se han aadido los 3 tipos de mensaje que se pueden indicar en la barra de estado
mediante la funcin SAPMsg.StatusBar.
Confirmacin/Success
Error
Informacin/Warning

6.3

InputBox

Este tipo de mensaje de sistema nos permitir obtener un valor del usuario con el mtodo
ControlsSAP.SAPMsg.InputBox.

49

ControlsSAP Framework

Figura 13: Ejemplo InputBox de tipo fecha.

Dim d As DateTime
d = SAPMsg.InputBox( _
"Hasta que fecha quieres eliminar los registros del 'Log de
modificaciones'", _
SAPMsg.InputType.Date, Today)

50

ControlsSAP Framework

Autorizaciones

ControlsSAP Framework proporciona una serie de funcionalidades integradas con SAP Business
One que permiten definir autorizaciones de usuario para mostrar o no las pantallas definidas
con la herramienta. Estas autorizaciones se configurarn desde el formulario de autorizaciones
de SAP Business One.

7.1

Definicin

Al arrancar un mdulo de trabajo, se generar una autorizacin de usuario, por cada formulario
que cargue nuestra aplicacin de manera automtica.
Estas autorizaciones se modificaran desde la pantalla de SAP Gestin Inicializacin sistema
Autorizaciones Autorizaciones generales, desde las autorizaciones de usuario (Figura 14).
Ser necesario definir un atributo por cada formulario con una descripcin (mximo 40
caracteres) que defina el formulario. Si no se especifica ningn atributo la descripcin de la
autorizacin ser la misma que el nombre del formulario. El atributo que utilizaremos ser
ControlsSAP.Forms.FormDescription.
Por defecto todos los formularios estarn controlados mediante autorizaciones. Si queremos
que un formulario determinado no este sujeto a ningn tipo de autorizacin (podr abrirlo
cualquier usuario) utilizaremos el atributo ControlsSAP. Authorizations.AuthorizationExempt.

51

ControlsSAP Framework

Figura 14

Por defecto todas las autorizaciones nuevas que se creen lo harn por defecto con
Autorizacin total.

7.2

Creacin

De momento para que se creen automticamente las autorizaciones de todos los formularios
de una librera, es necesario cambiar el AssemblyDataBaseVersion para provocar una
actualizacin y que exista en el modulo algn objeto para crear en la base de datos ya sea una
tabla, campo, vista, etc. desde el FormDLL (ver capitulo Mdulos de trabajo).
Existir una opcin en el men administrador, para crear/actualizar estas autorizaciones, de
manera manual.

52

ControlsSAP Framework

Parmetros

Existe una clase por la que podemos crear de una manera fcil objetos que contendrn una lista
de parmetros que nos puede servir para la parametrizacin del mdulo. Sin la necesidad de
crear nuevos objetos y ni tablas en la base de datos.
Estos se podrn modificar ya sea desde el propio objeto o por el usuario de la aplicacin
mediante el formulario de Parmetros en el men Gestin.

8.1

Creacin de parmetros

Nuestros mdulos podrn tener una lista de parmetros con los que poder interactuar. Para
ello
definiremos
en
nuestro
proyecto
una
clase
que
herede
de
ControlsSAP.Parameters.ApplicationParameters y definiremos una lista de variables, cada una
con el atributo ControlsSAP.Parameters.ParameterAttribute. Donde podremos especificar:

El tipo de parmetro que normalmente coincidir con el tipo de la variable.

El nombre del parmetro (opcional).

Descripcin.

Valor por defecto.

Visibilidad del parmetro. Si es un parmetro de sistema solamente ser posible


modificarlo entrando en la aplicacin en modo Administrador.

Comentarios.

Podemos indicar al parmetro datos extras mediante otros atributos como Data y Mask:

Una sentencia SQL con los valores validos para el parmetro.

Una lista de valores que sern los valores validos que puede aceptar el
parmetro.
53

ControlsSAP Framework

Una mascara de entrada de datos.

Podemos ver un ejemplo de cmo definir una clase con 2 parmetros:


Imports ControlsSAP
Imports ControlsSAP.Parameters
Imports ControlsSAP.Parameters.ParameterType
Public Class Parametros1
Inherits ControlsSAP.Parameters.ApplicationParameters
Public Sub New(ByVal c As SAPbobsCOM.Company)
MyBase.New(c)
End Sub
' Cantidad inicial
<Parameter([Integer], _
"Cantidad inicial", _
5, False, _
"Cantidad mnima inicial ")> _
Public CANTINI As Integer
' Ruta plantillas
<Parameter([String], _
"Ruta plantillas", _
"C:\Plantillas", False, _
"Ruta compartida donde estarn las plantillas de contratos")> _
Public PATHPLANT As String
End Class

Ejemplos para indicar un origen de datos con el atributo ControlsSAP.Parameters.Data. El


origen podr ser una sentencia SQL, o una lista de valores del mismo tipo definido en la
variable:
'Valores posibles: Numeros par del 0 al 20
<Parameter([Integer], ...)> _
<Data(0, 2, 4, 8, 10, 12, 14, 16, 18, 20)> _
Public NumeroPar As Integer

'Valores posibles: Las listas de precios


<Parameter([Integer], ... > _
<Data("SELECT ListNum, ListName FROM OPLN"> _
Public ListaPrecios

54

ControlsSAP Framework

Existe otro tipo de atributo ControlsSAP.Parameters.Mask. Con los que podremos definir
mascaras con expresiones regulares, para la entrada de datos desde el formulario de
parmetros.
Ejemplo:
'Solamente se podrn introducir direcciones ftp
<Parameter([String], ...)> _
<Mask("ftp\://[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(/\S+)?")> _
Public DireccionFtp As String

8.2

Utilizacin de parametros

Para modificar los valores lo podremos hacer desde cdigo o mediante el formulario de edicin
de parmetros (Figura 15) que hay en GestinParmetros, donde estarn todos los
parmetros de los mdulos aadidos.
Dim p As Parametros1
p = New Parametros1 (c)
p. PATHPLANT="C:\Plantillas\Demo"
p.Save()

Para que nuestra clase parmetros aparezca en el formulario de edicin de parmetros que
trae el framework de ControlsSAP y podamos editarlos es necesario que en algn momento del
arranque de la aplicacin, registremos una instancia de nuestra clase con:
ControlsSAP.Register.Parameter(ApplicationParameter)
Public Overrides Sub Run()
...
ControlsSAP.Register.Parameter(DLL.GetParameters(c))
End Sub

55

ControlsSAP Framework

Figura 15

Desde la clase ApplicationParameters, donde definimos los parmetros de nuestro mdulo,


podremos indicarle al constructor el nombre de una categora por la que se agruparn los
parmetros de un mismo mdulo, cuando se muestren desde el formulario de parmetros
(Figura 16).
Public Class ParemetersDemo
Inherits ControlsSAP.Parameters.ApplicationParameters
Public Sub New(ByVal c As SAPbobsCOM.Company)
MyBase.New(c, "Demo Categoria")
End Sub
...

56

ControlsSAP Framework

Grupo 1

Grupo 2

Figura 16

Por lo que podremos tener registrados en un mismo mdulo/librera varias clases de


parmetros. Que se localizarn en la misma pestaa y se agruparn por las categoras indicadas.

57

ControlsSAP Framework

Mdulos de trabajo

Nuestras aplicaciones pueden crear en el arranque varios tipos de objetos newcesarios


para el inicio de la aplicacin, como son:

Objetos que se deben crear en la base de datos (tablas, vistas, campos,


bsquedas formateadas, etc.)

Opciones de men

Lista de Parmetros

Autorizaciones para los formularios

Que dejarn la aplicacin preparada para comenzar a trabajar con ella sin la necesidad
de realizar ninguna accin extra.
Mens

Modulo
Versin DLL
Versin Fichero

Objetos definidos
en la base de
datos

Versin DB: 2009.0.0.0

Parmetros

Autorizaciones

58

ControlsSAP Framework

9.1

Creacin de un mdulo

Para crear nuestro modulo deberemos utilizar un objeto de tipo formulario, que
utilizaremos para definir el men de la aplicacin y sus objetos a crear en la base de datos.
Tendremos que crear un formulario del tipo ContolsSAP.Forms.FormDLL. Utilizaremos
el diseador del formulario para crear el men de nuestro modulo aadiendo varios MenuStrip
para cada tipo de men.

9.2

Creacin de los Mens


Un mdulo podr constar de 3 tipos diferentes de mens:

Men de aplicacin: Ser el men principal que utilizar el usuario de la


aplicacin.

Men definicin: Este es el men que aparecer dentro del men Gestin
Definicin y que utilizaremos para aadir las opciones referentes a la creacin
de datos maestros. Parecido al men que definicin que aparece en SAP.

Men administrador: Este men solamente lo podrn visualizar los


programadores y nos servir para ocultar determinadas opciones al usuario.

Para disear cada tipo de men utilizaremos el control MenuStrip (propios de .NET)
segn nuestras necesidades.
En cada MenuStrip aadido podremos definir una o varias opciones de men y
submens.
Existir 3 propiedades en la clase FormDLL para especificar si el men es de aplicacin,
definicin o de administrador:

MenuAdminStrip

MenuApplicationStrip

MenuDefinitionStrip

59

ControlsSAP Framework

9.3

Creacin de la base de datos

Nuestro modulo necesitar definir una serie de objetos en la base de datos de SAP para
funcionar correctamente. Los objetos se crearn la primera vez que arranque el mdulo o
cuando se detecte un cambio de versin lo que provocar que se creen o actualicen aquellos
objetos que se han aadido o modificado.
En prximos captulos veremos ms extensamente que objetos utilizaremos para crear tablas,
campos, vista, etc. en la base de datos.

60

ControlsSAP Framework

Desde nuestro formulario iremos aadiendo todos los objetos necesarios para poder ejecutar
nuestro modulo y en el momento del arranque estos se crearn si es necesario. Para esto existe
la propiedad DataBase que nos proporciona un objeto de tipo lista, para ir aadiendo tablas,
campos y dems objetos que deber crear nuestro modulo al arrancar o al cambiar de versin.
Deberemos sobrescribir el mtodo CreateDataBaseObjects() e ir aadiendo las tablas y
campos. Los objetos se definirn igual que lo haramos desde el diseador de SAP (sin el @
delante de las tablas y sin el U_ delante de los campos).
Definiremos 2 tablas con sus diferentes campos:

Public Overrides Sub CreateDataBaseObjects()


MyBase.CreateDataBaseObjects()
With Me.DataBase.AddTable("GSP_CNTR", "Contratos").Fields
.AddAlfanumerico("GSP_CardCode", "Cdigo cliente", 50)
.AddAlfanumerico("GSP_CardName", "Nombre", 100)
.AddFecha("GSP_DataIn", "Fecha inicio")
.AddFecha("GSP_DateOut", "Fecha de fin")
.AddMemo("GSP_Comments", "Comentarios")
End With
With Me.DataBase.AddTable("GSP_CNT1", "Lineas de
contratos").Fields
.AddAlfanumerico("GSP_CntrCode", "Cd.contrato", 8)
.AddAlfanumerico("GSP_ItemCode", "Cod. Artculo", 50)
.AddAlfanumerico("GSP_ItemName", "Descripcin", 150)
.AddCantidad("GSP_QuantIn", "Cantidad inicial")
.AddCantidad("GSP_QuantOut", "Cantidad final")
.AddImporte("GSP_Import", "Importe")
End With
End Sub

Podemos aadir a la lista objetos de tipo:

Tablas: dentro de cada tabla podemos aadir objetos como campos, valores validos, e
ndices.

Vistas

Procedimientos almacenados

Acciones SQL: como inserts, updates, deletes.

Categoras SAP: dentro de cada categora podemos definir bsquedas formateadas,


consultas predefinidas.

61

ControlsSAP Framework

9.4

Control de versiones

Para el control de versiones existe un mecanismo mediante un atributo de ensamblado por el


cual el programador podr modificar e indicar que el modulo en cuestin debe ser actualizado.
Este se deber indicar en el archivo AssemblyInfo del proyecto.

<Assembly: ControlsSAP.AssemblyDataBaseVersion("2007.0.0.12")>

En el momento de arrancar se detectar si se ha modificado la versin o si es un nuevo mdulo


por lo que se avisar al usuario que se van a ejecutar modificaciones en SAP. De esta manera no
har falta que el consultor o los usuarios de SAP sepan que campos o tablas se tienen que crear
en una nueva versin.

9.5

Creacin de parmetros

Nuestros mdulos podrn tener una o varias listas de parmetros con los que poder
interactuar.
Para que nuestras clases de parmetros estn disponibles desde el formulario de edicin que
trae el framework de ControlsSAP es necesario que en algn momento de la carga inicial
registremos una instancia de nuestra clase con:
ControlsSAP.Register.Parameter(ApplicationParameter)

Ejemplo de registro de los parmetros desde la carga del pluggin.


Public Overrides Sub Run()
...
ControlsSAP.Register.Parameter(DLL.GetParameters(c))
End Sub

62

ControlsSAP Framework

9.6

Arranque de un mdulo de trabajo

Una vez creado el formulario que contendr el mdulo definiremos una clase (por norma
general se llamar DLL) con un mtodo LoadDLL- que retornar un objeto LibraryDLL que
utilizaremos mas adelante.

Public Class DLL


Public Shared Function GetParameters(ByVal c As Company) As
Parametros1
Return New ParemetersDemo(c)
End Function
Public Shared Function LoadDLL(ByVal c As SAPbobsCOM.Company) As
ControlsSAP.Forms.FormDLL.LibraryDLL
ControlsSAP.Register.Parameter(DLL.GetParameters(c))
Dim f As New frmDLL(c)
Return f.GetMenuDLL
End Function
End Class

Despus si lo que queremos el cargar el modulo creado dentro de SAP Business One crearemos
un Pluggin y en el momento de ejecutar el Run realizaremos 3 acciones:
1. Conectaremos al AddOn mediante AddOnConnection()
63

ControlsSAP Framework

2. Cargaremos los mdulos que necesite nuestra aplicacin


(AddModule/AddItemsModule)
3. Arrancaremos una aplicacin que crear un nuevo punto de men en SAP B1
incluyendo las opciones de men de los mdulos cargados hasta ese momento.
Imports ControlsSAP
Imports ControlsSAP.SapUI
<PluginEngine.Plugin("Demo2005", "DemoProject2005", _
"Integracion AddOn DemoProject2005", "Oliver Parra", "1.0")> _
Public Class WinFormDemoPlugin
Inherits Addon2Core.PluginEngine.CPlugin
Public Overrides Sub Run()
Try
'Conecta la libreria ControlsSAP con el AddOn
AddOn.AddonConnection()
'Carga de los modulos que tendra nuestra
'aplicacin en SAP Business One
AddOn.AddItemsModule( _
DLL.LoadDLL(Addon2Core.Addon.CB1App.Company))
'Arranca una aplicacin con los mdulos
'cargados hasta ese momento
ControlsSAP.SapUI.AddOn.Start("SBO_OneDemo2")

Catch ex As Exception
SapMsg.Show(ex)
End Try
End Sub
End Class

64

65

ControlsSAP Framework

ControlsSAP Framework

10

Integracin

10.1 Estilo 8.8


Las pantallas se repintarn segn el estilo elegido en SAP Business One. Sin la necesidad de
realizar ninguna modificacin desde el diseador de cdigo.

Estilo clsico:

Nuevo Estilo 8.8:

66

ControlsSAP Framework

10.2 Fuente, tamao de letra y color de las pantallas


En el momento de abrirse los formularios se mostrarn con la configuracin de fuente y color
establecidos en SAP Business One.

En modo diseo se continuara diseando las pantallas tal y como hasta ahora. Para que se
pueda utilizar esta nueva funcionalidad el formulario debe tener la propiedad AutoScaleMode
a Font. Por defecto los formularios ya se crean con este valor.

10.3 Textos Dinmicos (Control + Doble-Click)


Se podrn modificar los textos de las etiquetas de algunos controles, tal y como hace SAP,
pulsando {CONTROL} y haciendo DOBLE-CLICK con el ratn.
Los controles con esta funcin habilitada sern:

SAPLabel (etiquetas)

SAPTabPage (Pestaas)

SAPRadioButton/SAPCheckBox

Columnas de la grid

Esta funcionalidad se grabar en la base de datos donde se conecte por defecto el AddOn.

67

ControlsSAP Framework

10.4 Mens para SAP Business One


Para crear nuestro men de aplicacin desde el formulario FormDLL existir un tipo de control
que nos permitir aadir la opcin de men dentro de unas coordenadas especficas en el
men de SAP.

Nuevo tipo de men

La propiedad que utilizaremos para ello ser SapLocation desde la que podremos especificar:

ParentUID: Identificador del men padre de la que colgara nuestra opcin. Si no se


especifica ningn valor, se pintar la opcin en su lugar por defecto. Si se especifica 0 o
el valor 43520 se aadir en el men raz.

Position: Posicin que ocupar nuestra opcin dentro de las opciones que cuelgan de
men indicado en el ParentUID. Si la posicin es -1, la opcin se aadir al final.

Para poder utilizar este nuevo control en opciones ya creadas, podemos convertir la opcin de
men a SAPMenuItem fcilmente. Desde la opcin Convertir en... en el men contextual que
existe en el diseador de mens de Visual Studio haciendo clic derecho sobre el control.

68

ControlsSAP Framework

11

Database

En este capitulo veremos una serie de objetos que podemos crear en la base de datos de SAP
Business One. Todos ellos implementan una interficie que incluye un mtodo Execute. Que
sirve para crear/actualizar el objeto en la base de datos.
Si necesitamos crear en un momento dado cualquiera de estos objetos utilizaramos este
mtodo. Pero lo normal ser que se creen los objetos en el momento de arranque del mdulo.
Y para ello en vez de utilizar el mtodo Execute lo que haramos es aadir los objetos en la
coleccin FormDLL.DataBase dentro del mtodo FormDLL.CreateDataBaseObjects.

11.1 Tablas, campos, ndices


Podemos crear tablas en SAP Business One con el objeto SAPUserTable. Indicndole un nombre
y una descripcin.

11.1.1 Campos
Para definir los campos utilizaremos la coleccin Fields.
Podemos definir campos con los mtodos siguientes:

AddAlfanumerico: Aade un campo de tipo alfanumrico.

AddBooleano: Aade un campo alfanumrico de longitud 1 carcter, con los valores


vlidos (Y)es/(N)o.

AddCantidad: define un campo de tipo cantidad.

AddImporte: crea un campo en la tabla de tipo importe.

AddPrecio: define un campo de tipo precio.

AddFecha: define un campo de tipo fecha.

AddHora: define un campo de tipo hora.


69

ControlsSAP Framework

AddLinkTable: define un campo alfanumrico de 8 caracteres, vinculado a una tabla de


usuario.

AddMemo: crea un campo de tipo texto.

AddNumerico: aade un campo de tipo numrico de una longitud indicada.

AddPorcentaje: crea un campo de tipo porcentaje.

Estas instrucciones devuelven un objeto de tipo SAPUserField, que podemos utilizar para aadir
varios valores validos.

11.1.2 ndices
Desde el objeto SAPUserTable podemos tambin definir ndices desde la propiedad Keys.
Podemos definir 2 tipos de ndices:

AddIndex: Aade un ndice a la tabla. Indicaremos el nombre del ndice y la lista de


campos que lo componen. Los campos se indicarn sin el U_.

AddUniqueIndex: Aade un ndice como el anterior pero este de tipo nico.

11.2 Vistas
Para crear vistas en la base de datos utilizaremos el objeto SAPView. Deberemos indicar el
nombre de la vista y la consulta SQL.

11.3 Procedimientos almacenados


Para definir procedimientos almacenados utilizaremos el objeto SAPProcedure. Indicaremos el
nombre del procedimiento a crear y la sentencia SQL que lo compone.

11.4 Sentencia SQL


Para realizar sentencias SQL como INSERT, UPDATE, DELETE, disponemos de mtodo
ControlsSAP.DoAction, que realiza la accin en el instante. Pero si lo que queremos es que se
ejecuten este tipo de sentencias SQL en el momento de la carga de la aplicacin, por ejemplo
insertar valores por defecto despus de crear una tabla, entonces la sentencia anterior no nos
servira. Para esto existe el objeto SAPAction donde indicaremos la accin a realizar y la
aadiremos junto con los dems objetos en el momento de crear.
70

ControlsSAP Framework

El objeto SAPAction no esta pensado para realizar acciones en la base de datos fuera de los
formularios de tipo FormDLL (para aadirlos en el objeto Database). Para realizar este tipo
acciones se debe utilizar la funcin ControlsSAP.DoAction.

11.5 Categoras, consultas predefinidas, bsquedas


formateadas
Podemos aadir consultas predefinidas, y bsquedas formateadas propias de SAP. Para ello
deberemos aadir primero una categora. Utilizaremos el objeto SAPQueryCategories
indicando un nombre.
La estructura de estos objetos en SAP es la siguiente:

Categoras
Consultas predefinidas
Bsquedas formateadas

11.5.1 Consultas predefinidas


Desde el mtodo AddQuery del objeto SAPQueryCategories crearemos una consulta
predefinida de SAP de tipo SAPUserQuery. Deberemos indicarle un nombre a la consulta y la
sentencia SQL a ejecutar.
Podremos aadir al objeto SAPUserQuery bsquedas formateadas de SAP.

11.5.2 Bsquedas formateadas


Para aadir bsquedas formateadas propias de SAP Business One necesitaremos aadirlas
desde el objeto SAPUserQuery. Con el mtodo AddFormatedSearch asignaremos estas
bsquedas a las consultas de SAP.
Dim q As New SAPQueryCategories(Me.Company, "Consultas Generales")
With q
With .AddQuery("ConsultaFamilias", _
"SELECT Code, Name FROM [@GSP_FAMILIES]
WHERE U_GSP_GroupCode = $[OITM.ItmsGrpCod]")
.AddFormattedSearch("150", "U_GSP_FAMILIA")
End With
End With

71

You might also like