Creación de nueva pantalla para mantenimiento de grupos de firmas

Creado por David Miralpeix, Modificado el Fri, 16 Feb 2024 a las 12:26 PM por David Miralpeix

< Codificación: Manipulación de grids en frmPedidos


Planteamiento inicial

Queremos crear una nueva pantalla con una sección donde podremos dar de alta, modificar o eliminar los grupos existentes y otra sección para asignar grupos al mismo.


Formulario de Grupos de Firmas

Empezaremos creando un script que abrirá nuestra nueva pantalla. Para más información sobre el proceso del mismo consultar la documentación relativa a los scripts y los formularios genéricos.


El código de apertura del script:

Sub Main()

  frmAux.Descargar 'ATENCIÓN: DEBE ESTAR SIEMPRE QUE NO SE MUESTRE EL FORMULARIO.

  Set lfrmGen = gcn.ahoraproceso ("AhoraScripts.DameFrmGenerico",False)
  lfrmGen.carga "MantenimientoGruposFirmas",,False
End Sub

IMPORTANTE: Todos los scripts que creemos deben llevar frmAux.Descargar nada más ejecutar o el comportamiento del mismo puede ser impredecible


IMPORTANTE: El nombre que le asignamos al formulario, MantenimientoGruposFirmas, determina el registro en que se grabará la modificación que hagamos dentro del propio formulario por lo que es muy importante tanto asignarle un nombre como no modificarlo una vez tengamos personalizaciones aplicadas en la misma.


Una vez creado el script al abrirlo aparecerá el formulario en blanco. Modificaremos el mismo para generar lo que necesitemos de forma estándar.


NOTA: Así como los formularios de mantenimiento tenemos que definirlos en la propia llamada (más información sobre los mismos aquí), los formularios genéricos requieren que codifiquemos sus controles y comportamiento una vez abiertos.


Para afrontar un formulario en blanco es necesario plantear las necesidades del mismo para crear los paneles que lo conformarán, puesto que servirán para dividir la pantalla en las diferentes secciones que vayamos a necesitar. En nuestra pantalla necesitaremos únicamente dos paneles, uno para el grid donde cargaremos los grupos y otro para la asignación de los empleados. Como el formulario genérico ya crea un panel de inicio, panMain, lo usaremos de base para los controles que vayamos a crear.


Para información detallada sobre la creación de paneles consultar la siguiente documentación


En esta ocasión, además, vamos a añadir a la creación de los paneles un splitter que asignaremos al panel principal. Para información detallada sobre este proceso consultar el siguiente documento.


El código de creación de los paneles y splitter:


  Set lPnlPrincipal = gForm.Controls("panMain")
  
  ' Panel mantenimiento de Grupos de Firmas
  Set lPnlGrupos = gForm.Controls.Add("Threed.SSPanel", "Pers_PnlGrupos")
  With lPnlGrupos
    .Autosize = 3
    .Move lPnlPrincipal.Left, lPnlPrincipal.Top, lPnlPrincipal.Width, lPnlPrincipal.Height
    .visible = True
    .ZOrder
  End With
  
  ' Panel asignación empleados a grupos de firma
  Set lPnlGruposEmpleados = gForm.Controls.Add("Threed.SSPanel", "Pers_PnlGruposEmpleados")
  With lPnlGruposEmpleados 
    .Autosize = 3
    .Move lPnlGrupos.Left + lPnlGrupos.Width, 0, lPnlPrincipal.Width / 2, lPnlPrincipal.Height
    .visible = True
    .ZOrder
  End With
  
  Set lSplit = gForm.Controls.Add("SSSplitter.SSSplitter.4","Pers_Splitter", lPnlPrincipal)
  With lSplit
        .AutoSize = 1 ''''''''Fill container
        .Borderstyle = 1 ''''''''None
        .SplitterResizeStyle = 1 '''''''' proportional
        .SplitterBarAppearance = 1 '''''''' Borderless
        .visible = True 
  End With
  lSplit.Panes.Add lSplit.Panes(0).Name, 3
  
  lSplit.Panes(0).Control = lPnlGrupos
  lSplit.Panes(1).Control = lPnlGruposEmpleados

NOTA: Podemos observar cómo hemos creado un panel de tipo SSPanel. Usaremos este tipo de paneles siempre que queramos meter un grid dentro del mismo porque su propiedad Autosize ajusta el tamaño del mismo de forma automática. En el siguiente documento tenemos un ejemplo de creación de ambos tipos de paneles. 

En resumidas cuentas, si queremos crear un panel con un control único usaremos SSPanel, en caso contrario cntPanel.


IMPORTANTE: Es el propio control split el que hace que pueda redimensionarse el panel principal. Si quisiéramos hacer una pantalla con un único grid el procedimiento sería el mismo pero no añadiríamos una ventana al mismo. El código siguiente ejemplifica este hecho:

Set lSplit = gForm.Controls.Add("SSSplitter.SSSplitter.4","Pers_Splitter", lPnlPrincipal)
  With lSplit
        .AutoSize = 1 ''''''''Fill container
        .Borderstyle = 1 ''''''''None
        .SplitterResizeStyle = 1 '''''''' proportional
        .SplitterBarAppearance = 1 '''''''' Borderless
        .visible = True 
  End With
  '''''lSplit.Panes.Add lSplit.Panes(0).Name, 3 <- No se añade
  
  lSplit.Panes(0).Control = <PANEL CREADO PRINCIPAL>



Ahora pasamos a la creación de los grids:


' Creación de grid de mantenimiento de grupos de firmas
  Set lGridGrupos = gForm.Controls.Add("AhoraOCX.cntGridUsuario", "Pers_GridGrupos", lPnlGrupos)
  With lGridGrupos
    .Agregar = True
    .Editar = True
    .Eliminar = True
    .CargaObjetos = False
    .EditarPorObjeto = False
    
    .AgregaColumna "IdGrupoFirma", 0, "Id."
    .AgregaColumna "@IdGrupoFirmaMostrar", 700, "Id.", True
    .AgregaColumna "Descrip", 2000, "Descripción",,,,,,,,,True
    
    .From = "Pers_Grupos_Firmas"
    .Campo("IdGrupoFirma").Default = "SELECT NumeroIdGrupo = ISNULL(MAX(IdGrupoFirma),0) + 1 FROM Pers_Grupos_Firmas"
    .Campo("@IdGrupoFirmaMostrar").Default = "SELECT NumeroIdGrupo = ISNULL(MAX(IdGrupoFirma),0) + 1 FROM Pers_Grupos_Firmas"
    .Campo("@IdGrupoFirmaMostrar").Sustitucion = "SELECT @IdGrupoFirma"
    
    .ColumnaEscalada = "Descrip"
    .Refresca = True
    .ActivarScripts = True
    .Visible = True
    .AplicaEstilo
    .RefrescaSinLoad = True
  End With
  
  ' Creación de grid de asignación de empleados a grupos
  Set lGridGruposEmpleados = gForm.Controls.Add("AhoraOCX.cntGridUsuario", "Pers_GridGruposEmpleados", lPnlGruposEmpleados)
  With lGridGruposEmpleados
    .Agregar = True
    .Editar = True
    .Eliminar = True
    .CargaObjetos = False
    .EditarPorObjeto = False
    
    .AgregaColumna "IdGrupoFirma", 0, "Id."
    .AgregaColumna "IdEmpleado", 1500, "Empleado", False, "Select IdEmpleado ,IdEmpleado IdEmp,Nombre From VCombo_Empleados", , , , "Select IdEmpleado, Nombre From VCombo_Empleados"
    
    .From = "Pers_Grupos_Firmas_Empleados"
    If lGridGrupos.getValue("IdGrupoFirma") <> "" Then .Where = "WHERE IdGrupoFirma = " & lGridGrupos.getValue("IdGrupoFirma")
    .Campo("IdGrupoFirma").Default = lGridGrupos.getValue("IdGrupoFirma")
    
    .ColumnaEscalada = "IdEmpleado"
    .Refresca = True
    .ActivarScripts = True
    .Visible = True
    .AplicaEstilo
    .RefrescaSinLoad = True
  End With


En el primer grid, Pers_GridGrupos, hemos creado una columna adicional llamada @IdGrupoFirmaMostrar y le hemos asignado un valor Default y un valor Sustitucion cuya única consulta nos muestra el campo IdGrupoFirma. Lo hemos hecho así porque si bloqueamos un campo y le damos un Default, aunque en pantalla nos lo muestre correctamente, no lo tiene en cuenta para realizar el UPDATE o el INSERT, y de esta forma tenemos un campo no editable que nos mostrará el registro que se está cargando automáticamente en el Default de IdGrupoFirma.

En resumidas cuentas; no podemos tener un campo no editable, como IdGrupoFirma, que se guarde automáticamente, por lo que creamos una columna únicamente para mostrar el valor del campo que guardaremos.


En el segundo grid, Pers_GridGruposEmpleados, su columna IdGrupoFirma tiene en Default el valor por defecto de la columna IdGrupoFirma del grid Pers_GridGrupos. No obstante, si le damos visibilidad a esa columna, vemos que siempre toma por defecto el primer valor del grid por lo que tendremos que modificar su evento Grid_RowColChange, que determina que se ha cambiado de línea, para actualizar su propiedad Where. Para más información sobre dicho evento consultar el siguiente documento.


Sub Grid_RowColChange(aGrid, LastRow, LastCol)
  If aGrid.Name = "Pers_GridGrupos" Then
    Set lGridGruposEmpleados = gForm.Controls("Pers_GridGruposEmpleados")
    lGridGruposEmpleados.Where = "WHERE IdGrupoFirma = " & aGrid.getValue("IdGrupoFirma")
    lGridGruposEmpleados.Campo("IdGrupoFirma").Default = aGrid.GetValue("IdGrupoFirma")
    lGridGruposEmpleados.Refrescar
  End If
End Sub

De esta forma cada vez que cambiamos de grupo de firmas se cargan correctamente los empleados asignados al mismo y se carga, en la columna oculta, el IdGrupoFirma, para que al insertar uno nuevo lo haga con el código correcto.


Por último sólo faltaría ocultar todos los botones que no vamos a usar.


  gForm.Controls("Botonera").Boton("botGuardar").Visible = False
  gForm.Controls("Botonera").Boton("botImprimir").Visible = False
  gForm.Controls("Botonera").Boton("botEliminar").Visible = False
  gForm.Controls("Botonera").Boton("botNuevo").Visible = False


De esta forma tenemos una pantalla de mantenimiento con dos grids referenciados y totalmente escalable.



Adjuntamos código completo de la pantalla en el adjunto MantenimientoGruposFirmas.txt.


Codificación: Ejecutando procedimientos en frmPedidos >

¿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