INSTANCIAMIENTO DE CONTROLES


Cuando se desee acceder a los métodos y propiedades de un control en concreto, debemos declarar (o castear) la variable a su interfaz específico.


Ejemplo:

// Creamos un ITextoUsuario e instanciamos el control que necesitamos.
// Método 1
ITextoUsuario idCliente = (gForm.Controls["IdCliente"] as ITextoUsuario);
// Método 2
ITextoUsuario idCliente = (ITextoUsuario)gForm.Controls["IdCliente"];

// Acceso a propiedades de control idCliente
AhoraCore.VBA.Interaction.MsgBox(idCliente.Text);

// NOTA: Se puede acceder a las propiedades del control solicitado si casteamos directamente
AhoraCore.VBA.Interaction.MsgBox((gForm.Controls["IdCliente"] as ITextoUsuario).Text);


ADICIÓN DE ESPACIOS DE NOMBRES NECESARIOS


Para usar tipos definidos en un espacio de nombres sin especificar el espacio de nombres completo donde se encuentra el elemento, es recomendable hacer uso de la directiva using. En caso de no hacerlo, el compilador será incapaz de encontrar el elemento y arrojará errores al comprobar o ejecutar el código  


Como buena práctica, es aconsejable añadir siempre los espacios de nombres AhoraOCX, AhoraCore y AhoraSistema en todos los scripts.


Script de pantalla con los espacios de nombres añadidos:

using AhoraSistema;
using AhoraOCX;
using AhoraCore;

namespace AhoraScriptsPantalla
{
  public class AhoraEmpresa_frmEmpresas : AhoraOCX.AhoraBaseScript
  {
  }
}

Script único con los espacios de nombres añadidos:

using AhoraSistema;
using AhoraOCX;
using AhoraCore;

namespace AhoraScriptsVacia
{
    public class Script_0 : AhoraOCX.AhoraBaseScript
    {
        public void Main()
        {
            IItemColeccion lObj;
            IColecciones lCol = gCn.Obj.DameColeccion("Albaranes", "Where 1=1");
            if (lCol != null)
            {
                for (int i = 1; i < lCol.Count(); i++)
                {
                    if (lCol.Objetos[i].GetType().ToString() == "Collection")
                    {
                        lObj = lCol.Objetos[i];
                        for (int x = 1; x < lObj.Objetos.Count; x++)
                        {
                            AhoraCore.VBA.Interaction.MsgBox(lObj.Objetos[x].Descripcion);
                        }
                    }
                    else
                    {
                        AhoraCore.VBA.Interaction.MsgBox(lCol.GetItem(i).Descripcion);
                    }
                }
            }
        }
    }
}


PROPIEDADES QUE HAN CAMBIADO DE NOMBRE


Para estandarizar el sistema a nomenclaturas actuales, se han renombrado algunas de las propiedades siguientes;

Caption -> Text

Locked -> ReadOnly


Recuerde que puede consultar las propiedades y métodos de nuestro sistema accediendo a la ayuda integrada en el editor de scripts: 



Por ejemplo:

// Propiedad antigua. Da error.
gForm.Caption = "Título formulario";

// Propiedad nueva.
gForm.Text = "Título formulario";



VARIANT A VALOR


Anteriormente no era necesaria la declaración directa de ninguna variable dado que “Visual Basic Script” tipaba automáticamente todas las variables con el tipo de dato "Variant". Si desea información técnica detallada sobre dicho tipo consulte este artículo.


A nivel técnico y a modo de resumen, Variant podía contener:


  • Valores escalares
  • Arrays
  • Objects
  • Valor Empty
  • Valor Nothing (null)


Para facilitar la conversión y traducción del código se ha creado una clase nueva llamada Valor que emula de forma lo más similar posible a Variant con la particularidad de que admite únicamente los siguientes valores escalares:

  • Cadenas
  • Boleanos
  • Fechas
  • Números enteros
  • Números decimales


Se aconseja siempre la declaración de las variables de tipo escalar correspondientes al valor a introducir, ejemplos: 


int valorInt = 5;
string cadena = "cadena";
DateTime fecha = new DateTime(2121,1,1);


No obstante, tienen a su disposición dicha clase para emular aquellas operaciones con operadores o comprobaciones que, a priori, no son coherentes con el tipo de dato pero que sí permitía Variant:


Ejemplos:


//  Suma de booleanos. El resultado es -2 con Variant.
Valor variableValorBT = true;
Valor variableValorB = true;
Assert.True((variableValorBT + variableValorB) == -2);
//  Suma de nulo y booleano. El resultado es -1 con Variant.
Valor variableValorBT = null;
Valor variableValorB = true;
Assert.True((variableValorBT + variableValorB) == -1);
//  Suma de nulo y string. Usando Variant es como sumar una cadena vacía.
Valor variableValorBT = null;
Valor variableValorB = "tt";
Assert.True((variableValorBT + variableValorB) == "tt");
// Operadores de ejemplo Booleanos con Valor
//  Suma de Valor (con Booleano) + Booleano. Mismo resultado que Valor + Valor
Valor variableValorBT = true;
bool variableBooleano = true;
Assert.True(variableValorBT + variableBooleano == -2);
Assert.True(variableBooleano + variableValorBT == -2);
variableValorBT = true;
variableBooleano = false;
Assert.True(variableValorBT + variableBooleano == -1);
Assert.True(variableBooleano + variableValorBT == -1);
variableValorBT = false;
variableBooleano = true;
Assert.True(variableValorBT + variableBooleano == -1);
Assert.True(variableBooleano + variableValorBT == -1);
variableValorBT = false;
variableBooleano = false;
Assert.True(variableValorBT + variableBooleano == 0);
Assert.True(variableBooleano + variableValorBT == 0);
variableValorBT = true;
//  Suma de Valor (con Booleano) + int
int variableInt = -3; // Lo "sumamos" con un entero
Assert.True(variableValorBT + variableInt == -4);
variableValorBT = null;
variableInt = 1;
// Suma de Valor (Nulo) + int
Assert.True(variableValorBT + variableInt == 1);


PROPIEDADES DE LOS OBJETOS


En C# no se admiten parámetros en las propiedades de las clases, excepto si son las propiedades por defecto, a la cual se puede acceder mediante índice o clave. Como consultar y asignar propiedades a objetos del ERP es muy habitual, la propiedad Propiedades de la clase IItem y todos sus derivados se convierte en la propiedad por defecto de la clase.


Ejemplo VBScript:

Variable = Objeto.Propiedades("Propiedad")
Objeto.Propiedades("Propiedad") = Valor

Ejemplo C#:

Variable = Objeto["Propiedad"];
Objeto["Propiedad"] = Valor;

Propiedad Item de la clase IItem


La propiedad Item (de solo lectura) de la clase IItem se elimina. Debe devolverse el mismo objeto.


Ejemplo VBScript:

Dim OtroItem As IItem
...
Set OtroItem = Objeto.Item

Ejemplo C#:

IItem OtroItem;
...
OtroItem = Objeto;


FORMATO, PRESENTACIÓN Y TIPODATO


Se modifican las propiedades, anteriormente de tipo "String", de Formato, Presentación y TipoDato para que recuperen su información de las enumeraciones siguientes:


Formato y Presentacion -----> Enumeración EFormatoCampo

Con 1 decimal -> Con1decimal

Con 2 decimales -> Con2decimales

Con 3 decimales -> Con3decimales

Con 4 decimales -> Con4decimales

Con 5 decimales -> Con5decimales

Con 6 decimales -> Con6decimales

Euros -> Euros

Fecha Año Completo - 31/12/1988 -> FechaAnyoCompleto

Fecha Corta - 31/12/88 -> FechaCorta

Fecha Mediana - 31-Dic-88 -> FechaMediana

Hora Corta - 17:30 -> HoraCorta

Hora Larga - 17:30:59 -> HoraLarga

Letra delante -> LetraDelante

Letra detras -> LetraDetras

Mayusculas -> Mayusculas

Mayusculas y Minusculas -> MayusculasyMinusculas

Pesetas -> Pesetas

Sin decimales -> SinDecimales


TipoDato -----> Enumeración ETipoDato

Numeric -> Numeric

Moneda -> Moneda

Date -> Date

String -> String

NIF -> NIF


RECUPERACIÓN DE FECHAS EN OBJETO


Debido a las particularidades de la recuperación de datos en VBScript (ADODB) los campos de tabla tipo datetime, smalldatetime o equivalentes, si su hora está grabada como "00:00:00" se devuelve el valor sin la hora. En 5.0 esto no es posible por lo que todos los campos que muestren información que sea únicamente Fecha deberían tener debidamente rellena la propiedad TipoDato y Formato.


Ejemplo:

Tabla "Conta_Ejercicios_Periodos", campo "FechaIni".


Resultado en campo SIN TipoDato y Formato establecidos:


En VBScript recupera los datos de esta forma:


No obstante en C# los recupera así:


Estableciendo en 5.0 el formato correspondiente aparece correctamente: