< 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
Sus comentarios se han enviado
Agradecemos su esfuerzo e intentaremos corregir el artículo