Admon - Añadir un campo configurable

Creado por David Miralpeix, Modificado el Mon, 11 Mar 2024 a las 01:22 PM por Pablo Céspedes

En el siguiente artículo aprenderás cómo crear un nuevo campo configurable en Ahora ERP.


Los campos configurables son campos nuevos que el cliente desea tener en los formularios de la aplicación. Estos campos podrán tanto editarse como explotar su información mediante listados.   

Tenemos hasta tres opciones para añadir un campo configurable a un formulario de la aplicación.

  • En una pestaña
  • En un grid
  • En el propio formulario



En una pestaña nueva del formulario 

 

Decir que en los siguientes objetos, cuando agreguemos un campo configurable al objeto, en su formulario tendremos habilitada una nueva pestaña para visualizar y editar el nuevo campo.   

  • Artículos
  • Maquinas
  • Proyectos
  • Proveedores
  • Clientes
  • Empleados
  • Tareas
  • Partes
  • Seguimientos
  • Ofertas, pedidos, albaranes y facturas de Cliente
  • Albaranes y facturas de proveedor  
  • Albaranes de envío

 

Para añadir un campo configurable a un objeto de la aplicación y que se visualice en una nueva pestaña, elegiremos la opción del Admon -> Campos Configurables. A continuación del desplegable, elegiremos el objeto al cual deseamos añadirle un campo configurable. Observamos como tenemos un nombre de tabla. A continuación, rellenaremos los siguientes campos:

  • Campo: Introduciremos el nombre del campo que se quedará guardado en la base de datos. Los nombres de campo no pueden ser valores numéricos.
  • Descripción: Es el nombre que el usuario verá como campo configurable
  • Tipo: Elegiremos el tipo de campo de base de datos. Para más información sobre los tipos de datos, consulte la documentación oficial proporcionada por Microsoft, 
    • Decimal: corresponde al tipo de SQL Server decimal, con 38 dígitos, contados a ambos lados del separador decimal y máximo 14 dígitos a la derecha de éste.
    • Doble: corresponde al tipo de SQL Server float, permite datos en el intervalo de - 1,79E+308 a -2,23E-308, 0 y de 2,23E-308 a 1,79E+308.
    • Entero: corresponde al tipo de SQL Server smallint, permite datos en el intervalo de -2^15 (-32.768) a 2^15-1 (32.767).
    • Fecha: corresponde al tipo de SQL Server datetime
    • Long: corresponde al tipo de SQL Server int, permite datos en el intervalo de -2^31 (-2.147.483.648) a 2^31-1 (2.147.483.647).
    • Sí/No: corresponde al tipo de SQL Server bit: permite valores 0 y 1. Puede traducir los valores True en 1 y False.
    • Texto: corresponde al tipo de SQL Server varchar, con la precisión indicada en el campo siguiente.
  • Precisión: Si el tipo de dato elegido es texto, estableceremos el tamaño del campo.
  • Default: El valor por defecto que tendrá el campo, tanto para objetos existentes como para nuevos objetos
  • A: Habilitamos un asistente para este campo, ver más abajo la explicación.

 



Tenemos la posibilidad de enlazar un campo configurable bien con una nueva tabla o con una tabla / vista existente, para ello marcaremos el campo A de tipo check y en la parte derecha se nos habilitará un nuevo grid.  

Debemos de pulsar los botones tabla nueva o tabla existente de la parte inferior para que podamos realizar las siguientes acciones:  

 

  • Tabla nueva: Si pulsamos este botón la aplicación nos pedirá el nombre de una tabla, a partir de aquí la aplicación crea la tabla con un campo clave por defecto, en la pestaña de datos rellenaremos la tabla nueva con los datos que por defecto que saldrán al pulsar el asistente (F3) sobre el campo configurable.  

 

  • Tabla existente: Veremos una lista con las tablas o vistas, según opción elegida de la base de datos donde nos encontramos, después de elegir la tabla veremos todos los campos de la tabla y tendremos que marcar el campo selección. Estos campos son los que se visualizaran.

 

Tanto para una tabla nueva como para una tabla existente en la pestaña de datos tenemos un campo de tipo check (S) para seleccionar que campos de la tabla se mostrarán en el asistente.  

 

Una vez rellenados los registros de los campos configurables, deberemos de salir y volver a entrar en la aplicación para que los campos configurables se vean reflejados en los objetos modificados. Los campos que tienen asistente (F3) se indican al usuario de forma visual mediante un color diferente al habitual.




En el grid del objeto 

 

Decir que esta forma de añadir campos configurables sólo es válida para aquellos objetos que utilizan una grid de usuario para su edición. Algunos ejemplos de colecciones de objetos que cumplen está condición podrían ser:

 

  • Líneas de contratos
  • Líneas de pedidos, tanto de venta como de compra.
  • Líneas de una factura deudora o acreedora  
  • Líneas de cartera
  • Líneas de contabilidad  
  • Líneas del parte(materiales)

 

Los pasos a seguir para añadir un campo configurable en el objeto serían los siguientes:  

 

 

  • Acceder al ADMON, link campos configurables y comprobar que para el objeto en cuestión no tenemos tabla de campos configurables, en ese caso debemos crear la tabla configurable insertando un nombre. Por ejemplo: Pers_Conf_Fact_Acree_Desglose. 
  • Al pulsar guardar el ADMON crea la tabla y además en la nueva tabla se añaden todos los valores de claves primarias que hay en la tabla origen. La tabla configurable tiene que tener tantos registros como la tabla origen.
  • Si la tabla ya está creada o para el objeto ya tenemos tabla creada  solamente debemos añadir los campos configurables que deseemos.
  • Crear una vista que incluya tanto los campos de la tabla configurable, como los campos del propio objeto. No repetir las claves.  
  • Asignar permisos  a la vista que hemos creado.  Ejemplo: zpermisos NombreVistaPers
  • Ir a la tabla objetos, filtrar por el objeto al que queremos añadir campos configurables   y realizar los siguientes cambios en los campos:  
  • En el objeto: En el campo TablaOtra observar que está el nombre de la tabla que hemos creado, de lo contrario añadir el nombre de la tabla. 
  • En la colección del objeto: En el campo EdicionGrid introduciremos el nombre de la vista que hemos creado.
  • Al crear la tabla desde el admon el proceso también ha creado los triggers asociados a esta tabla, sobre todo los triggers de insert y delete puesto que siempre tenemos que tener los mismos registros en la tabla del objeto como en la tabla configurable.  
  • En el formulario donde vamos a añadir el campo configurable iremos  y escribiremos la siguiente instrucción de código dentro del procedimiento


Código VB6:

Sub Initialize
  gform.NombreDelGrid.EditarPorObjetoyVista =TRUE 


Código C#:

public override void Initialize()
{
    base.Initialize();
    (gForm.Controls["NombreDelGrid"] as ICntGridUsuario).EditarPorObjetoYVista = true:
}


  • Sobre el grid del objeto, botón derecho del ratón sobre la esquina superior izquierda y elegimos la opción configurar…  
  • Añadir los campos de la nueva tabla en la grid inferior "Campos nuevos" 
  • Configurar los campos  
  • Establecer en este formulario de edición de las columnas de la grid, la seguridad para que todos los usuarios la puedan cambiar. Esto se realiza a través del menú Asignar --> Asignar Grupos de Seguridad. Añadiendo el registro de empresa "GRUPOAHORA" 

 

 

Ejemplo de campos configurables para el objeto líneas de facturas de acreedor:

 

Objeto donde voy a añadir campos configurables: Factura_Acreedor_Linea que corresponde con la tabla Factura_Acreedor_Lineas cuyos campos clave son:

  • IdFactura
  • IdIva
  • Idretencion

 

En el campo TablaOtra de la tabla objetos hemos puesto el nombre de la tabla que hemos creado: Conf_facturas_acreedor_lineas. Esta tabla contiene los campos clave de la tabla del objeto más dos campos configurables más:

  • IdMaquina
  • IdEmpleado


Asignamos permisos a la tabla y a la vista. 

Rellenamos los campos de tablaotra y ediciongrid de la tabla y el objeto respectivamente  

Creamos los nuevos triggers, con el formato de trigger de cliente:

  • Trigger de delete de la tabla Facturas_acreedor_lineas: NombreCliente_Facturas_Acreedor_Lineas_UTRIG
DELETE Conf_Facturas_Acreedor_Lineas   FROM Deleted, Conf_Facturas_Acreedor_Lineas    WHERE Deleted.IdFactura=Conf_Facturas_Acreedor_Lineas.IdFactura   and Deleted.IdIVA=Conf_Facturas_Acreedor_Lineas.IdIVA  and Deleted.IdRetencion=Conf_Facturas_Acreedor_Lineas.IdRetencion
  • Trigger de insert de la tabla Facturas_acreedor_lineas: NombreCliente_Facturas_Acreedor_Lineas_ITRIG
IF @@ROWCOUNT<>0 BEGIN
INSERT INTO Conf_Facturas_Acreedor_Lineas (IdFactura, IdIva, IdRetencion)  
SELECT IdFactura, IdIva, IdRetencion from Inserted 
END

 

A continuación iremos al formulario del objeto en la aplicación y configuraremos el grid con los nuevos campos. Si obtenemos el mensaje de error: “error actualizando los valores configurables”, es porque los triggers no están bien diseñados.  



En el propio formulario 

 

Ejemplo de introducción de un campo nuevo de tipo texto en el formulario de partes.


Código VB6:

Sub Initialize() 
 ''Texto Control Rotura 
  Set lContenedor=gform.[EL CONTROL QUE SEA]   
  Set lTexto = gForm.Controls.Add("AhoraOcx.Textousuario", "Control_Roturas", lContenedor) 
  lTexto.ObjOrigen = "EObjeto"   
  lTexto.ObjPOrigen = "Control_Roturas"   
  lTexto.visible=True   
  lTexto.Move gForm.Causa.Left - 1150, gForm.Causa.Top +  gForm.Causa.Height + 370 ,gForm.Causa.Width, gForm.Causa.Height   
  lTexto.CaptionVisible=True  
  lTexto.CaptionControl="Control Roturas:"   
  lTexto.CaptionWidth=1200   
  lTexto.AplicaEstilo 
End Sub 

Sub CargaObjeto  
    IF gForm.Eobjeto.ObjGlobal.Propiedades("IdClasificacion") = 1 then  
        gform.Controls("Control_Roturas").Visible=True  
    Else  
        gform.Controls("Control_Roturas").Visible=False   
    End If 
End Sub 

Sub ActualizaObjeto      
    IF gForm.Eobjeto.ObjGlobal.Propiedades("IdClasificacion") = 1 then  
        gform.Controls("Control_Roturas").Visible=True   
    Else  
        gform.Controls("Control_Roturas").Visible=False   
    End If 
End Sub


Código C#:

public override void Initialize()
{
    base.Initialize();
    // Texto Control Rotura
    var lContenedor = gForm;
    ITextoUsuario lTexto = (ITextoUsuario)gForm.Controls.Add("AhoraOCX.TextoUsuario", "Control_Roturas", gForm);
    lTexto.ObjOrigen = "EObjeto";
    lTexto.ObjPOrigen = "Control_Roturas";
    lTexto.Visible = true;
    IControl lCausa = gForm.Controls["Causa"];
    lTexto.SetBounds(lCausa.Left - 77, lCausa.Top + lCausa.Height + 25, lCausa.Width, lCausa.Height);
    lTexto.CaptionVisible = true;
    lTexto.CaptionControl = "Control Roturas:";
    lTexto.CaptionWidth = 80;
    lTexto.AplicaEstilo();
}

public override void CargaObjeto()
{
    base.CargaObjeto();
    CompruebaVisibilidadControlRotura();
}

public override void ActualizaObjeto()
{
    base.ActualizaObjeto();
    CompruebaVisibilidadControlRotura();
}

private void CompruebaVisibilidadControlRotura()
{
    if ((gForm.Controls["EObjeto"] as IEnlaceObjetos).ObjGlobal["IdClasificacion"] == 1)
    {
        (gForm.Controls["Control_Rotura"] as ITextoUsuario).Visible = true;
    }
    else
    {
        (gForm.Controls["Control_Rotura"] as ITextoUsuario).Visible = false;
    }
}


Ejemplo para agregar un panel al formulario de artículos máquina:  

 

 Código VB6:

On Error Resume Next 

 IF not gcn.Sesion.ParametroBool("MAQUINAS_DEFINICION_SERVICIOS_MOVTIERRA") Then     
    exit sub   
End IF        

SET lPnl = gForm.Controls("PnlMovTierras")     
    IF lPnl IS Nothing then     
        gForm.Width=  gForm.Width +1200     
        Set lPnl = gForm.Controls.Add("AhoraOCX.cntPanel", "PnlMovTierras" )      
        lPnl.ResizeInterior =True     
        lPnl.ResizeEnabled = False     
        lPnl.Estilo=0      
        lPnl.Visible=True     
        gForm.TabDatos.InsertItem 100, "&Mov. Tierras",  lPnl.Hwnd, 1            
        Set lGrid = gForm.Controls.Add("AhoraOCX.cntGridUsuario", "grdMovTierras",lPnl )     
        lGrid.Visible=True    
        lGrid.AplicaEstilo      
        lPnl.Width=  gForm.Width-200     
    Else     
        SET lGrid= gForm.Controls("grdMovTierras")   
   End if


Código C#:

try
{
    if (!gCn.Sesion.ParametroBool("MAQUINAS_DEFINICION_SERVICIOS_MOVTIERRA"))
    {
        return;
    }

    ICntGridUsuario lGrid = null;
    if (!gForm.Controls.ContainsKey("PnlMovTierras"))
    {
        gForm.Width = gForm.Width + 80;
        ICntPanel lPnl = (ICntPanel)gForm.Controls.Add("AhoraOCX.CntPanel", "PnlMovTierras");
        lPnl.ResizeInterior = true;
        lPnl.ResizeEnabled = false;
        lPnl.Estilo = EEstilo_Panel.eEst_Panel_Recuadro;
        lPnl.Visible = true;
        (gForm.Controls["TabDatos"] as ICntTab).InsertItem(100, "&Mov. Tierras", lPnl, 1);
        lGrid = (ICntGridUsuario)gForm.Controls.Add("AhoraOCX.CntGridUsuario", "grdMovTierras", lPnl);
        lGrid.Visible = true;
        lPnl.Width = gForm.Width - 13;
    }
    else
    {
        lGrid = (ICntGridUsuario)gForm.Controls["grdMovTierras"];
    }
}
catch (Exception)
{
    throw;
}

¿Le ha sido útil este artículo?

¡Qué bien!

Gracias por sus comentarios

¡Sentimos mucho no haber sido de ayuda!

Gracias por sus comentarios

¡Háganos saber cómo podemos mejorar este artículo!

Seleccione al menos una de las razones
Se requiere la verificación del CAPTCHA.

Sus comentarios se han enviado

Agradecemos su esfuerzo e intentaremos corregir el artículo