Sin duda, es el control más complejo de los controles personalizados.
Cuando definimos una grid lo hacemos indicando un origen de datos (vista, tabla o colección de objetos) y definiendo sus columnas.
Hay varias maneras de trabajar con este control, veremos unos cuantos ejemplos de cómo utilizarlo, pero antes, es importante tener en cuenta:
- Utilizan una array de tipo XArrayDB para manejarse. Se puede referenciar mediante [NombreGrid].ArrayDB.
- Si queremos utilizar el grid sólo como un Array, sin que los cambios se vean reflejados en tablas, debemos poner sus propiedades SoloArray = true y Refresca = false.
- Si la propiedad Refresca = true el grid se refrescará siempre que se actualice un campo.
- Si el grid permite insertar filas recuerde que puede controlar el valor de los campos a insertar mediante la propiedad Default del campo. Se utiliza frecuentemente para controlar la inserción de campos clave o campos incrementales.
- Puede definir asistentes para los campos, de modo que al pulsar F3 en una celda con asistente le saldrá una pantalla de búsqueda.
- Si la grid tiene la propiedad CargaObjeto=False, cuando actualizamos un registro significa que NO estamos actualizando el objeto. La grid no podrá contener los campos de la tabla configurables del objeto.
- Si la grid tiene la propiedad CargaObjeto=True, cuando actualizamos un registro significa que estamos actualizando el objeto. Si el objeto tiene campos configurables (por lo tanto una tabla Conf_[Objeto]) y éstos se actualizarán si están reflejados en la grid.
Debido a la magnitud de este control, los ejemplos se desarrollan todos juntos al final de la sección, aunque cada propiedad o método muestre en una línea como usarlo.
- GridUsuario
- EditarPorObjeto
- EditarPorObjetoyVista
- MuestraCaption
- CaptionBase
- ConcatenaCaption
- Agregar
- Editar
- Eliminar
- CargaObjetos
- Colección
- From
- Alias
- FetchRowStyle
- TablaObjeto
- Where
- OrdenMultiple
- Preparada
- SoloArray
- Refresca
- NoUsarIdDocs
- ColumnaEscalada
- ArrayDB
- ArrayValue (fila,columna)
- SQLSelect
- ActivarScripts
- AgregaColumna
- GetValue
- GridClear
- LimpiaGrid
- Imprimir
- MenuItemAdd
- PasoExcel
- Refrescar
- SetValue
- Eventos
- Campo (NombreCampo)
- Ejemplos completos
GridUsuario
EditarPorObjeto
Descripción: Los datos son editados mediante objetos. La grid instancia el objeto y lo actualiza con los datos insertados y llama al método update del objeto. Con esta opción activada, permite guardar datos configurables del objeto. No se recomienda el uso de esta propiedad cuando la grid deba cargar un número elevado de registros, ya que ralentiza tanto la carga como el refresco de la grid.
Tipo: true/ false.
Código en VB6:
Sub Grid_BeforeLoad(aGrid) If agrid.name = "grdCopias" Then With gForm.Controls("grdCopias") .EditarPorObjeto = True End With End If End Sub
Código en C#:
public void Grid_BeforeLoad(ICntGridUsuario aGrid) { if (aGrid.Name == "grdCopias") { aGrid.EditarPorObjetoYVista = true; } }
EditarPorObjetoyVista
Descripción: Si , tanto esta propiedad como la anterior, están a True, la lectura de los campos se hará de la vista que pone en el campo EdicionGrid de la tabla Objetos en el registro de la colección. Si no se ha configurado esta vista se leerá de la tabla o vista que especifique el código (From). No se recomienda el uso de esta propiedad cuando la grid deba cargar un número elevado de registros, ya que ralentiza tanto la carga como el refresco de la grid.
Tipo: true/false.
Código en VB6:
Sub Grid_BeforeLoad(aGrid) If agrid.name = "grdCopias" Then With gForm.Controls("grdCopias") .EditarPorObjeto = True .EditarPorObjetoyVista = True End With End If End Sub
Código en C#:
public void Grid_BeforeLoad(ICntGridUsuario aGrid) { if (aGrid.Name == "grdCopias") { aGrid.EditarPorObjeto = true; aGrid.EditarPorObjetoYVista = true; } }
MuestraCaption
Descripción: Indica si se mostrará o no el caption de la grid
Tipo: true/ false
Código en VB6:
Sub Grid_BeforeLoad(aGrid) If agrid.name = "grdCopias" Then With gForm.Controls("grdCopias") .MuestraCaption = True End With End If End Sub
Código en C#:
public void Grid_BeforeLoad(ICntGridUsuario aGrid) { if (aGrid.Name == "grdCopias") { aGrid.MuestraCaption = true; } }
CaptionBase
Descripción: Es el texto que se mostrará sobre las columnas de la grid. Si no se especifica, mostrará el total de registros. Si, por el contrario, se especifica y la propiedad ConcatenaCaption = true, se concatena al total de registros, por lo que deberemos dejar un espacio en blanco al final de la cadena.
Tipo: Cadena.
Código en VB6:
Sub Grid_BeforeLoad(aGrid) If agrid.name = "grdCopias" Then With gForm.Controls("grdCopias") .CaptionBase = "Copias realizadas " End With End If End Sub
Código en C#:
public void Grid_BeforeLoad(ICntGridUsuario aGrid) { if (aGrid.Name == "grdCopias") { aGrid.ConcatenaCaption = true; aGrid.CaptionBase = "Copias realizadas: "; } }
ConcatenaCaption
Descripción: Le añade al caption base el número de registros.
Tipo: true / false.
Código en VB6:
Sub Grid_BeforeLoad(aGrid) If agrid.name = "grdCopias" Then With gForm.Controls("grdCopias") .ConcatenaCaption = True End With End If End Sub
Código en C#:
public void Grid_BeforeLoad(ICntGridUsuario aGrid) { if (aGrid.Name == "grdCopias") { aGrid.ConcatenaCaption = true; } }
Agregar
Descripción: Indica si la grid permite agregar registros.
Tipo: true / false.
Código en VB6:
Sub Grid_BeforeLoad(aGrid) If agrid.name = "grdCopias" Then With gForm.Controls("grdCopias") .Agregar = True End With End If End Sub
Código en C#:
public void Grid_BeforeLoad(ICntGridUsuario aGrid) { if (aGrid.Name == "grdCopias") { aGrid.Agregar = true; } }
Editar
Descripción: Indica si la grid permite editar registros.
Tipo: true / false.
Código en VB6:
Sub Grid_BeforeLoad(aGrid) If agrid.name = "grdCopias" Then With gForm.Controls("grdCopias") .Editar = True End With End If End Sub
Código en C#:
public void Grid_BeforeLoad(ICntGridUsuario aGrid) { if (aGrid.Name == "grdCopias") { aGrid.Editar = true; } }
Eliminar
Descripción: Indica si la grid permite eliminar registros.
Tipo: True / False.
Código en VB6:
Sub Grid_BeforeLoad(aGrid) If agrid.name = "grdCopias" Then With gForm.Controls("grdCopias") .Eliminar = True End With End If End Sub
Código en C#:
public void Grid_BeforeLoad(ICntGridUsuario aGrid) { if (aGrid.Name == "grdCopias") { aGrid.Eliminar = true; } }
CargaObjetos
Descripción: Si CargaObjetos = True el origen de datos es las colección, si no, los datos se leen del FROM.
Tipo: True / False.
Código en VB6:
Sub Grid_BeforeLoad(aGrid) If agrid.name = "grdCopias" Then With gForm.Controls("grdCopias") .CargaObjetos = True End With End If End Sub
Código en C#:
public void Grid_BeforeLoad(ICntGridUsuario aGrid) { if (aGrid.Name == "grdCopias") { aGrid.CargaObjetos = true; } }
Colección
Descripción: Le pasaremos la colección de objetos como origen de datos. Para esto necesitamos EditarPorObjeto = True.
Tipo: Colección
Código en VB6:
Sub Grid_BeforeLoad(aGrid) If agrid.name = "grdCopias" Then With gForm.Controls("grdCopias") .EditarPorObjeto= True .Coleccion = "copias" End With End If End Sub
Código en C#:
public void Grid_BeforeLoad(ICntGridUsuario aGrid) { if (aGrid.Name == "grdCopias") { aGrid.EditarPorObjeto = true; aGrid.Coleccion = gCn.Obj.DameColeccion("Copias", ""); } }
From
Descripción: Indica la tabla, vista o consulta que se utilizará como origen de datos. Intente siempre utilizar vistas o tablas directamente. Si desea emplear una consulta combinando tablas, debe especificar un Alias. Cuente con que el control hace un "SELECT columnas FROM XXX". Especifique sólo el origen de datos.
Tipo: String.
Código en VB6:
Sub Grid_BeforeLoad(aGrid) If agrid.name = "grdCopias" Then With gForm.Controls("grdCopias") .From = "VPers_Copias" End With End If End Sub
Código en C#:
public void Grid_BeforeLoad(ICntGridUsuario aGrid) { if (aGrid.Name == "grdCopias") { aGrid.From = "VPers_Copias"; } }
Alias
Descripción: Si especificamos un FROM de tipo consulta empleando tablas combinadas, ésta propiedad indicará a las columnas del grid el Alias de tabla por defecto.
Tipo: String. Ver ejemplo de grid usando alias.
Código en VB6:
Sub Grid_BeforeLoad(aGrid) If agrid.name = "grdCopias" Then With gForm.Controls("grdCopias") .Alias = "VistaPers" End With End If End Sub
Código en C#:
public void Grid_BeforeLoad(ICntGridUsuario aGrid) { if (aGrid.Name == "grdCopias") { aGrid.Alias = "VistaPers"; } }
FetchRowStyle
Descripción: Indica que cuando se refresque la grid, se activará el evento GridFetchRowStyle. Se utiliza generalmente cuando necesitamos pintar las filas del grid de acuerdo a algún valor dado.
Tipo: true/false.
Código en VB6:
Sub Grid_BeforeLoad(aGrid) If agrid.name = "grdCopias" Then With gForm.Controls("grdCopias") .Grid.FetchRowStyle = True End With End If End Sub 'Para configurar las reglas de color, debe hacerse desde la configuración de la grid.
Código en C#:
public void Grid_BeforeLoad(ICntGridUsuario aGrid) { if (aGrid.Name == "grdCopias") { aGrid.FetchRowStyle = true; } }
TablaObjeto
Descripción: Especifica la tabla en la que se van a guardar los datos del grid. Un grid puede tener un origen de datos distinto a la tabla donde se almacena. Guardará todos los datos que coincidan con los campos de la grid.
Tipo: String
Código en VB6:
Sub Grid_BeforeLoad(aGrid) If agrid.name = "grdCopias" Then With gForm.Controls("grdCopias") .TablaObjeto = "Pers_Copias" End With End If End Sub
Código en C#:
public void Grid_BeforeLoad(ICntGridUsuario aGrid) { if (aGrid.Name == "grdCopias") { aGrid.TablaObjeto = "Pers_Copias"; } }
Where
Descripción: Cláusula WHERE completa para filtrar el origen de datos.
Tipo: String
Código en VB6:
Sub Grid_BeforeLoad(aGrid) If agrid.name = "grdCopias" Then With gForm.Controls("grdCopias") .Where = "WHERE liquidada=False " End With End If End Sub
Código en C#:
public void Grid_BeforeLoad(ICntGridUsuario aGrid) { if (aGrid.Name == "grdCopias") { aGrid.Where = "WHERE Liquidada = False"; } }
OrdenMultiple
Descripción: Nombre de las columnas por las que queremos filtrar separadas por ",". Si se quiere en orden descendente añadir "DESC" tras la columna.
Tipo: String
Código en VB6:
Sub Grid_BeforeLoad(aGrid) If agrid.name = "grdCopias" Then With gForm.Controls("grdCopias") .OrdenMultiple = "IdEmpleado, FechaAlta" End With End If End Sub
Código en C#:
public void Grid_BeforeLoad(ICntGridUsuario aGrid) { if (aGrid.Name == "grdCopias") { aGrid.OrdenMultiple = "IdEmpleado, FechaAlta"; } }
Preparada
Descripción: Devuelve True cuando tiene columnas creadas. Se utiliza para saber si la grid ya ha sido inicializada.
Tipo: Boolean.
Código en VB6:
Private Sub CargarLineas() On Error GoTo Error_ With gForm.Controls("grdCopias") If not Preparada then 'Acciones a hacer la primera vez que se carga la grid End If End With End Sub
Código en C#:
public void Grid_BeforeLoad(ICntGridUsuario aGrid) { if (aGrid.Name == "grdCopias") { if (!aGrid.Preparada) { // Acciones a hacer la primera vez que se carga la grid } } }
SoloArray
Descripción: Si el valor es True especifica que queremos trabajar sin que el grid actualice los datos en la tabla.
Tipo: Boolean.
Código en VB6:
Sub Grid_BeforeLoad(aGrid) If agrid.name = "grdCopias" Then With gForm.Controls("grdCopias") .SoloArray = True End With End If End Sub
Código en C#:
public void Grid_BeforeLoad(ICntGridUsuario aGrid) { if (aGrid.Name == "grdCopias") { aGrid.SoloArray = true; } }
Refresca
Descripción: Si el valor es True especifica que se refresque el grid cada vez que se inserte, modifique o elimine un registro.
Tipo: Boolean.
Código en VB6:
Sub Grid_BeforeLoad(aGrid) If agrid.name = "grdCopias" Then With gForm.Controls("grdCopias") .Refresca = True End With End If End Sub
Código en C#:
public void Grid_BeforeLoad(ICntGridUsuario aGrid) { if (aGrid.Name == "grdCopias") { aGrid.Refresca = true; } }
NoUsarIdDocs
Descripción: Cuando utilizamos un origen de datos que carece del campo IdDoc pondremos ésta propiedad a True para que no dé error al actualizar, ya que el control necesita de un campo Identidad para realizar las actualizaciones. Use esta propiedad cuando quiera una grid en casos especiales de sólo consulta o sólo array.
Tipo: Boolean.
Código en VB6:
Sub Grid_BeforeLoad(aGrid) If agrid.name = "grdCopias" Then With gForm.Controls("grdCopias") .NoUsarIdDocs = True End With End If End Sub
Código en C#:
public void Grid_BeforeLoad(ICntGridUsuario aGrid) { if (aGrid.Name == "grdCopias") { aGrid.NoUsarIdDocs = true; } }
ColumnaEscalada
Descripción: Establece la columna que debe crecer al maximizar el grid.
Tipo: String.
Código en VB6:
Sub Grid_BeforeLoad(aGrid) If agrid.name = "grdCopias" Then With gForm.Controls("grdCopias") .ColumnaEscalada = "Descrip" End With End If End Sub
Código en C#:
public void Grid_BeforeLoad(ICntGridUsuario aGrid) { if (aGrid.Name == "grdCopias") { aGrid.ColumnaEscalada = "Descrip"; } }
ArrayDB
Descripción: Array en el que se basa la grid.
Tipo: XArrayDB.
Código en VB6:
Sub ejArrayDB Set lArray = gform.Controls("grdCopias").ArrayDb For i = lArray.LowerBound(1) To lArray.UpperBound(1) MsgBox lArray(i, 1) Next End Sub
Código en C#:
private void EjArrayDB() { IXArrayDB lArray = (gForm.Controls["grdCopias"] as ICntGridUsuario).ArrayDb; for (int i = lArray.LowerBound(1); i <= lArray.UpperBound(1); i++) { AhoraCore.VBA.Interaction.MsgBox(lArray[i, 1].ToString()); } }
ArrayValue (fila,columna)
Descripción: Devuelve o establece un valor dentro del array del grid, donde la fila es un Long y la columna String. En C# esta propiedad se ha convertido en la propiedad por defecto de ICntGridUsuario lo que nos ha permitido indizarla directamente. En el ejemplo adjunto pueden ver como se usa en este lenguaje.
Tipo: Valor.
Código en VB6:
Private Sub SumarTotal() With grdCopias For i = 0 To .Grid.ApproxCount - 1 lTotal = lTotal + .ArrayValue(i, "Total") End With End Sub
Código en C#:
private int SumarTotal() { int lTotal = 0; ICntGridUsuario grdCopias = (gForm.Controls["grdCopias"] as ICntGridUsuario); if (grdCopias != null) { for (int i = 0; i < grdCopias.ApproxCount -1; i++) { lTotal = lTotal + CInt(grdCopias[i, "Total"]); } } return lTotal; }
SQLSelect
Descripción: Instrucción SQL completa que toma el grid como origen de datos. Es la unión final de todas las instrucciones dadas (Columnas, FROM, WHERE, UNION)
Tipo: String.
Código en VB6:
Sub MostrarSelect() MsgBox gform.Controls("grdCopias").SQLSelect EndSub
Código en C#:
private void MostrarSelect() { ICntGridUsuario grdCopias = (gForm.Controls["grdCopias"] as ICntGridUsuario); AhoraCore.VBA.Interaction.MsgBox(grdCopias.SqlSelect()); }
ActivarScripts
Descripción: Activa/Desactiva la ejecución de scripts de de la grid. Si no se activa, la programación de pantalla que tienen los eventos de la grid, no se lanzará.
Tipo: True/False (por defecto, False).
Código en VB6:
Sub Show() gForm.Controls("grdLineas").ActivarScripts = True End Sub
Código en C#:
private void Show() { (gForm.Controls["grdCopias"] as ICntGridUsuario).ActivarScripts = true; }
AgregaColumna
Descripción: Este método crea las columnas en el grid. Son objetos de tipo CampoGrid y accederemos a las columnas del grid mediante la estructura: [NombreGrid].Campo ("NombreDeCampo").
Parámetros de entrada:
Parámetros obligatorios:
- Campo (String): Especifica el nombre del campo del origen de datos.
- Ancho (LONG): Establece el ancho de la columna (en TWIPS).
- Descripción (String): Especifica el nombre de la cabecera de la columna.
Parámetros Opcionales:
- Locked (Boolean): Indica que el campo se bloquea y no se puede modificar.
- Combo (String): Consulta SQL con los campos que queremos que muestre el combo. El primer campo es el que quedará en la celda al seleccionar el dato de la lista y los restantes los que desplegará el combo. Ejemplo: SELECT IdArticulo Art, IdArticulo, Descrip FROM Articulo
Si queremos que se quede la descripción lo haremos de la siguiente manera: SELECT Descrip Desc, IdArticulo, Descrip FROM Aticulos
La consulta también puede hacer referencia a un campo de la grid. Por ejemplo si en el grid tenemos un campo IdFamilia y queremos que el combo nos muestre solo los artículos de esa familia. Para hacer referencia a un campo de la grid, en la sentencia SELECT lo especificamos con "@nombrecampo". Ejemplo: SELECT IdArticulo Art, IdArticulo, Descrip FROM Articulos WHERE IdFamilia = @IdFamila
- RowRefreshCombo (Boolean): Establece que se refresque el combo al cambiar de celda, siempre y cuando la consulta del combo dependa de otro campo (como en el ejemplo anterior).
- Format (String): Indica el formato de visualización del campo. Ejemplo numérico con tres decimales: "#,##0.000". Ejemplos fecha: "mm/dd/yyyy", "yyyymmdd", etc.
- Total (Boolean): Indica si debe agregar un campo al final con la suma de los campos la columna.
- Valores (String): Sentencia SQL que especifica el valor del combo que queremos que se vea en la celda. Por ejemplo, si quiero seleccionar del combo el IdArticulo y que éste se almacene en tabla, pero mostrar en pantalla (y en la misma celda) la descripción.
El combo quedaría de ésta manera: SELECT IdArticulo Art, IdArticulo, Descrip FROM Articulos
Mientras que el parámetro valores sería: SELECT IdArticulo, Descrip FROM Articulos
Así estaríamos guardando el IdArtículo seleccionado, pero en la celda se visualizaría la descripción.
- EsResourceID (Boolean): Indica que el valor del campo será un Icono. Con lo cual cargará en la celda la imagen correspondiente. Siempre depende de la propiedad valor. Por ejemplo para cargar un Icono, la SELECT debería ser: SELECT Objeto Obj, Objeto, Icono1 FROM Objetos
- ValorFiltro: OBSOLETO. NO USAR
- Obligado (Boolean): Indica que el campo es obligatorio. Si el usuario no lo completa, saldrá un mensaje advirtiendo ésto.
Parámetros de salida: True/False, devuelve True si la columna se ha podido crear.
Código en VB6:
Sub Initialize() With gForm.Controls("grdUserStock") .activarscripts = True .from = "Pers_VStockMinimos" .agregacolumna "IdProveedorPreferencial",1000,"Id. Prov" .agregacolumna "Proveedor",1000,"Proveedor" .campo("IdProveedorPreferencial").Column.Order = 2 .campo("Proveedor").Column.Order = 3 Set gForm.Controls("filStockMinimo").GridUsuario = Form.Controls("grdUserStock") .SoloArray = False .refrescar .SoloArray = True End With End Sub
Código en C#:
private void Initialize() { ICntGridUsuario grdUserStock = (gForm.Controls["grdUserStock"] as ICntGridUsuario); ICntFiltroUsuario filStockMinimo = (gForm.Controls["filStockMinimo"] as ICntFiltroUsuario); grdUserStock.ActivarScripts = true; grdUserStock.From = "Pers_VStocksMinimos"; grdUserStock.AgregaColumna("IdProveedorPreferencial", 75, "Id.Prov."); grdUserStock.AgregaColumna("Proveedor", 250, "Proveedor"); grdUserStock.Campo("IdProveedorPreferencial").Orden = 2; filStockMinimo.GridUsuario = grdUserStock; grdUserStock.SoloArray = false; grdUserStock.Refrescar(); grdUserStock.SoloArray = true; }
GetValue
Descripción: Devuelve el valor del campo dado de la fila activa
Parámetros de entrada: Nombre del campo (String)
Parámetros de salida: Valor del campo dado (Variant)
Código en VB6:
Sub Grid_BeforeUpdate(aGrid,aCancel) If aGrid.GetValue("Bloqueado")=True Then MsgBox "No se puede actualizar una copia bloqueada",vbCritical aCancel=True End If End Sub
Código en C#:
//Para Activar este evento hay que configurar la grid. Poner en el void Initialize por ejemplo: (gForm.Controls["grdLineas"] as ICntGridUsuario).ActivarScripts = true; public void Grid_BeforeUpdate(ICntGridUsuario aGrid, Valor aCancel) { if (aGrid.GetValue("Bloqueado")) { AhoraCore.VBA.Interaction.MsgBox("No se puede actualizar una copia bloqueada", vbCritical); aCancel = true; } }
GridClear
Descripción: Borra el contenido de la grid
Parámetros de entrada: si reestablece las columnas, encabezados y otras propiedades en función del datasource actual (Boolean, opcional, por defecto True)
Código en VB6:
Sub LlamaGridClear() gForm.Controls("grdCopias").GridClear End Sub
Código en C#:
private void LlamaGridClear() { (gForm.Controls["grdCopias"] as ICntGridUsuario).GridClear(); }
LimpiaGrid
Descripción: Borra el contenido de la grid y elimina las columnas creadas
Parámetros de salida:
Código en VB6:
Sub LlamaLimpiaGrid() gForm.Controls("grdCopias").LimpiaGrid End Sub
Código en C#:
private void LlamaLimpiaGrid() { (gForm.Controls["grdCopias"] as ICntGridUsuario).LimpiaGrid(); }
Imprimir
Descripción: Imprime la grid
Parámetros de entrada: Título de página(String, opcional), si la grid tiene los parámetros de impresión configurados (Booleano, opcional, por defecto True). Si el segundo parámetro está a True, no hará caso al primero.
Parámetros de salida: True/False, devuelve True si la grid se ha mandado a la impresora correctamente.
Código en VB6:
Sub LlamaImprimeGrid() gForm.Controls("grdCopias").Imprimir End Sub
Código en C#:
private void LlamaImprimeGrid() { (gForm.Controls["grdCopias"] as ICntGridUsuario).Imprimir(); }
MenuItemAdd
Descripción: Inserta un botón en el menú popup de la grid. Es el mismo método de inserción de botones de menú y botonera. Cuando se presiona un botón popup de la grid, se activa el evento MenuClick. Hay que tener en cuenta que al añadir una opción de menú, también hay que implementar la acción de dicho menú.
Parámetros de entrada: : Caption del Botón(String), Id (String), Tipo de botón (String), Padre (Id del menú cuelga el botón, si no se especifica se entiende que es Padre), Nuevo Grupo (línea separadora que separará el botón de los anteriores) (Booleano), ResId (idIcono de la tabla Iconos_Recursos), Before (si queremos colocarlo antes de otro botón especificamos el nombre del botón).
Los tipos de botones son:
- eTipo_Menu_Boton (Botón convencional)
- eTipo_Menu_Check (botón de tipo check)
- eTipo_Menu_Combo (sólo para el control Botonera)
- eTipo_Menu_Edit (Botón con caja de texto para edición)
- eTipo_Menu_Menu (Botón de tipo menú de cabecera)
Parámetros de salida: El objeto AhoraTool creado
Código en VB6:
Sub Grid_BeforeLoad(aGrid) If aGrid.Name = "grdCopias" Then aGrid.MenuItemAdd "Duplicar copia", "mnuDuplicar", 0 , ,True, False, 123 End Sub Sub grid_MenuAfterExecute(aGrid, aMenuItem) If amenuitem.Name ="mnuDuplicar" Then Duplicar End If End Sub
Código en C#:
public void Grid_BeforeLoad(ICntGridUsuario aGrid) { if (aGrid.Name == "grdCopias") { aGrid.MenuItemAdd("Duplicar copia", "mnuDuplicar", ETipo_Menu.eTipo_Menu_Boton, "", true, false, 123); } } //Para Activar este evento hay que configurar la grid. Poner en el void Initialize por ejemplo: (gForm.Controls["grdLineas"] as ICntGridUsuario).ActivarScripts = true; public void Grid_MenuAfterExecute(ICntGridUsuario aGrid, IAhoraTool aMenuItem) { if (aMenuItem.Name == "mnuDuplicar") { // Duplicar } }
PasoExcel
Descripción: Exporta a Excel el contenido de la grid
Parámetros de salida: True/False, devuelve True si la exportación no da ningún error.
Código en VB6:
Sub LlamaPasoExcel() gForm.Controls("grdCopias").PasoExcel End Sub
Código en C#:
private void LlamaPasoExcel() { (gForm.Controls["grdCopias"] as ICntGridUsuario).PasoExcel(); }
Refrescar
Descripción: Refresca la grid.
Código en VB6:
gForm.Controls("grdCopias").Refrescar
Código en C#:
(gForm.Controls["grdCopias"] as ICntGridUsuario).Refrescar();
SetValue
Descripción: Modifica el campo por el valor dado en la fila activa.
Parámetros de entrada: Campo (String), Valor (Variant)
Parámetros de salida: True/False, devuelve True si se ha modificado el valor correctamente
Código en VB6:
Sub ejSetValue
gForm.Controls("grdCopias").setvalue "FechaIni", "01/01/2015"
End Sub
Código en C#:
private void EjSetValue()
{
(gForm.Controls["grdCopias"] as ICntGridUsuario).SetValue("FechaIni", "01/01/2015");
}
Eventos
La mayoría de los eventos suelen tener un nombre autoexplicativo y, en su mayoría, son los que suelen tener las grids estándar.
MenuClick
Descripción: se dispara cuando hacemos clic en un botón del menú popup del grid
GridLoad
Descripción: se dispara cuando se refresca la grid, es decir, cuando llamamos al método refrescar o cuando actualizamos un registro.
Campo (NombreCampo)
Este objeto es el campo, propiamente dicho, del grid. En este objeto se guardan las propiedades mencionadas en el método AgregaColumna( ) del grid.
Tipo: CampoGrid.
Código en VB6:
gForm.Controls("grdCopias").Campo("IdCopia").Booleano = False
Código en C#:
(gForm.Controls["grdCopias"] as ICntGridUsuario).Campo("IdCopia").Booleano = false;
Sustitucion
Descripción: Valor que tomará el campo cuando se actualice una celda de la misma fila.
Tipo: String.
Código en VB6:
gForm.Controls("grdCopias").Campo("IdCopia").Sustitucion = "SELECT NuevoValor FROM Tabla"
Código en C#:
(gForm.Controls["grdCopias"] as ICntGridUsuario).Campo("IdCopia").Sustitucion = "SELECT NuevoValor FROM Tabla";
Booleano
Descripción: Dibuja un control CheckBox
Tipo: Boolean.
Código en VB6:
gForm.Controls("grdCopias").Campo("IdCopia").Booleano = False
Código en C#:
(gForm.Controls["grdCopias"] as ICntGridUsuario).Campo("IdCopia").Booleano = false;
CampoFecha
Descripción: Establece un control Fecha para el campo.
Tipo: String.
Código en VB6:
gForm.Controls("grdCopias").Campo("IdCopia").CampoFecha = False
Código en C#:
(gForm.Controls["grdCopias"] as ICntGridUsuario).Campo("IdCopia").CampoFecha = false;
Default
Descripción: Establece un valor por defecto para los registros nuevos.
Tipo: String.
Código en VB6:
gForm.Controls("grdCopias").Campo("IdCopia").Default = 0;
Código en C#:
(gForm.Controls["grdCopias"] as ICntGridUsuario).Campo("IdCopia").Default = 0;
AsignaAsistente
Descripción: Lanza un AhoraProceso llamado AhoraAsistente. Cuando se pulsa F3 despliega un formulario con filtro para buscar el dato. Este procedimiento sólo define el formulario y va acompañado del método AssistAddField ( ), que definirá las columnas de la grid del asistente.
Parámetros de entrada: Número de Icono que queremos que aparezca en el Form (Long), Instrucción SQL, origen de datos (String), Where, filtro SQL, puede ser una cadena vacía (String), Lista de campos a ordenar separados por comas (String),
Nombre del campo grid. Si queremos que aparezca en el campo del asistente (String, opcional), Ancho del formulario (Long, opcional), Alto del formulario (String, opcional)
Puede consultar información detallada sobre este método en el siguiente artículo.
AssistAddField
Descripción: Define los campos de la grid del asistente F3.
Parámetros de entrada: Nombre del campo que queremos que aparezca en el grid (String), Descripción del campo (String, opcional), Tipo de dato (si se mostrará un String, long, etc) (Long, opcional), Tamaño del campo (Long, opcional), Autosize (Boolean, opcional),Indica que es el campo que queremos que nos retorne. Si no se especifica el asistente nos devuelve el primero que declaremos (Boolean, opcional).
Puede consultar información detallada sobre este método en el siguiente artículo.
CampoNuevaFila
Descripción: Indica qué campo tendrá el foco cuando la grid crea una nieva fila. es decir, la primera vez que se carga o cuando se inserta una línea.
Tipo: cadena.
Código en VB6:
Sub Initialize() gform.Controls("Botonera").ActivarScripts = True End Sub Sub Botonera_AfterExecute(aBotonera, aBoton) If aboton.name = "botGuardar" Then Establecefoco End If End Sub Sub Establecefoco () Dim g 'As AhoraOCX.cntGridUsuario Set g = gForm.Controls("grdlineas") If g.rowcount = 0 Then g.CampoNuevaFila = "@CodigoBarras" End If End Sub
Código en C#:
private void Initialize() { (gForm.Controls["grdUserStock"] as ICntBotonera).ActivarScripts = true; } public void Botonera_AfterExecute(ICntBotonera aBotonera, IAhoraTool aBoton) { if (aBoton.Name == "botGuardar") { EstableceFoco(); } } private void EstableceFoco() { AhoraOCX.Form gForm = new AhoraOCX.Form(); ICntGridUsuario g = (gForm.Controls["grdLineas"] as ICntGridUsuario); if (g.RowCount == 0) { g.CampoNuevaFila = "@CodigoBarras"; } }
--------------------------------------------------------------------------------------------------------------
Ejemplos completos
Ejemplo CampoGrid
Código en VB6:
Sub Initialize() Set lPnlEjemplos = gForm.Controls.Add("AhoraOCX.cntPanel", "PnlEjemplos") lPnlEjemplos.Resized = True lPnlEjemplos.ResizeEnabled = False lPnlEjemplos.ResizeInterior = True lPnlEjemplos.Estilo = 0 lPnlEjemplos.Visible = True gForm.TabMain.InsertItem 110, "&Ejemplo", lPnlEjemplos.Hwnd, 1 Set lGrid = gForm.Controls.Add("AhoraOCX.cntGridUsuario", "Pers_GrdEjemplo", lPnlEjemplos) End Sub Sub Show() ejCargaGrid End Sub Sub ejCargaGrid() If gform.eobjeto.objglobal.nuevo = False Then With gForm.Controls("Pers_GrdEjemplo") If Not .Preparada Then .Activarscripts = True .Agregar = True .Editar = True .Eliminar = True .CargaObjetos = False 'al estar a False necesitamos indicar la tabla donde guarda .EditarPorObjeto = False Set .Coleccion = gcn.Obj.DameColeccion("Proveedores_Articulos","WHERE idProveedor = " & gForm.Controls("IdProveedor") ,True,True) .From = "Vprov_Articulos" .AgregaColumna "IdProveedor", 0, "IdProveedor" .AgregaColumna "IdArticulo", 1000, "Id artículo", False, "SELECT IdArticulo, IdArticulo, Descrip FROM VCombo_Articulos" .AgregaColumna "@Descrip", 1000, "Descripción" , True .AgregaColumna "Precio", 1000, "Precio" 'valor por defecto para el campo IdProveedor y precio .Campo("IdProveedor").Default = gForm.Controls("EObjeto").ObjGlobal.Propiedades("IdProveedor") .Campo("Precio").Default = 0 'Sustituciones .Campo("@Descrip").Sustitucion = "SELECT Descrip FROM VCombo_Articulos WHERE IdArticulo = @IdArticulo" 'Asistentes With .Campo("IdArticulo") .AsignaAsistente gCn.Obj.Objetos("Articulos").Entorno.Icono1, "vCombo_Articulos", "", "IdArticulo", "IdArticulo", 8000, , False 'Campos del asistente .AssistAddField "IdArticulo", "Id Artículo", "String", 2000, , True .AssistAddField "Descrip", "Descripción", "String", 4500 End With .ColumnaEscalada = "@Descrip" End If .Visible = True .Refresca = True End With End If End Sub
Código en C#:
using AhoraCl; using AhoraCore; using AhoraOCX; using AhoraSistema; using static AhoraCore.VBA.Conversion; using System; namespace AhoraScriptsPantalla { public class AhoraCl_frmProveedores : AhoraOCX.AhoraBaseScript { public void Initialize() { IControl lGrid = null; ICntPanel lPnlEjemplos = null; try { lPnlEjemplos = (ICntPanel)gForm.Controls.Add("AhoraOCX.CntPanel", "PnlEjemplos", null); lPnlEjemplos.Resized = true; ((IControlResizable) lPnlEjemplos).ResizeEnabled = false; ((ICntPanel) lPnlEjemplos).ResizeInterior = true; lPnlEjemplos.Estilo = 0; lPnlEjemplos.Visible = true; ((ICntTab) gForm.Controls["TabMain"]).InsertItem(110, "&Ejemplo", lPnlEjemplos, 1); lGrid = gForm.Controls.Add("AhoraOCX.cntGridUsuario", "Pers_GrdEjemplo", lPnlEjemplos); } catch (Exception) { throw; } } public void Show() { try { ejCargaGrid(); } catch (Exception) { throw; } } public void ejCargaGrid() { try { if (((IEnlaceObjetos) gForm.FindControl("EObjeto")).ObjGlobal.Nuevo == false) { if (!((ICntGridUsuario) gForm.Controls["Pers_GrdEjemplo"]).Preparada) { ((IControlScriptable) gForm.Controls["Pers_GrdEjemplo"]).ActivarScripts = true; ((ICntGridUsuario) gForm.Controls["Pers_GrdEjemplo"]).Agregar = true; ((ICntGridUsuario) gForm.Controls["Pers_GrdEjemplo"]).Editar = true; ((ICntGridUsuario) gForm.Controls["Pers_GrdEjemplo"]).Eliminar = true; ((ICntGridUsuario) gForm.Controls["Pers_GrdEjemplo"]).CargaObjetos = false; ((ICntGridUsuario) gForm.Controls["Pers_GrdEjemplo"]).EditarPorObjeto = false; ((ICntGridUsuario) gForm.Controls["Pers_GrdEjemplo"]).Coleccion = gCn.Obj.DameColeccion("Proveedores_Articulos", "WHERE idProveedor = " + (gForm.Controls["IdProveedor"] as ITextoUsuario).Text, true, true); ((ICntGridUsuario) gForm.Controls["Pers_GrdEjemplo"]).From = "Vprov_Articulos"; ((ICntGridUsuario) gForm.Controls["Pers_GrdEjemplo"]).AgregaColumna("IdProveedor", 0, "IdProveedor"); ((ICntGridUsuario) gForm.Controls["Pers_GrdEjemplo"]).AgregaColumna("IdArticulo", 67, "Id artículo", false, "SELECT IdArticulo, IdArticulo, Descrip FROM VCombo_Articulos"); ((ICntGridUsuario) gForm.Controls["Pers_GrdEjemplo"]).AgregaColumna("@Descrip", 67, "Descripción", true); ((ICntGridUsuario) gForm.Controls["Pers_GrdEjemplo"]).AgregaColumna("Precio", 67, "Precio"); ((ICntGridUsuario) gForm.Controls["Pers_GrdEjemplo"]).Campo("IdProveedor").Default = ((IEnlaceObjetos) gForm.Controls["EObjeto"]).ObjGlobal["IdProveedor"]; ((ICntGridUsuario) gForm.Controls["Pers_GrdEjemplo"]).Campo("Precio").Default = 0; ((ICntGridUsuario) gForm.Controls["Pers_GrdEjemplo"]).Campo("@Descrip").Sustitucion = "SELECT Descrip FROM VCombo_Articulos WHERE IdArticulo = @IdArticulo"; ((ICntGridUsuario) gForm.Controls["Pers_GrdEjemplo"]).Campo("IdArticulo").AsignaAsistente(CStr(gCn.Obj.Objetos["Articulos"].Entorno.Icono1), "vCombo_Articulos", "", "IdArticulo", "IdArticulo", 8000, 0, false); ((ICntGridUsuario) gForm.Controls["Pers_GrdEjemplo"]).Campo("IdArticulo").AssistAddField("IdArticulo", "Id Artículo", ETipoDato.String, 2000, false, true); ((ICntGridUsuario) gForm.Controls["Pers_GrdEjemplo"]).Campo("IdArticulo").AssistAddField("Descrip", "Descripción", ETipoDato.String, 4500); ((ICntGridUsuario) gForm.Controls["Pers_GrdEjemplo"]).ColumnaEscalada = "@Descrip"; } gForm.Controls["Pers_GrdEjemplo"].Visible = true; ((ICntGridUsuario) gForm.Controls["Pers_GrdEjemplo"]).Refresca = true; } } catch (Exception) { throw; } } } }
Ejemplo Control Grid
Con este código al hacer doble clic sobre una columna ejecutamos una instrucción SQL.
Podemos ver como se piden parámetros para que introduzca el usuario, como se realizan consultas a la base de datos y como se obtienen los valores de una grid:
Código en VB6:
Sub Initialize() gForm.Controls("grdLineas").ActivarScripts = True End Sub 'Para Activar este evento hay que configurar la grid. Poner en el sub Initialize por ejemplo: gForm.grdLineas.ActivarScripts = True Sub Grid_DblClick(aGrid) columna = aGrid.CampoActual idDoc = aGrid.GetValue("idDoc") If (columna = "Precio") Then NuevoPrecio = InputBox("Nuevo precio: ","Nuevo precio ") If Not IsNumeric(NuevoPrecio) Then MsgBox "El precio introducido no es válido" Else If Not (gcn.executeSql("UPDATE Listas_Precios_Prov_Art SET precio = " & NuevoPrecio & " WHERE idDoc = "& idDoc )) Then MsgBox "No se ha modificado correctamente" Else MsgBox "Se ha modificado correctamente" End If End If End If End Sub
Código en C#:
public void Initialize() { (gForm.Controls["grdLineas"] as ICntGridUsuario).ActivarScripts = true; } //Para Activar este evento hay que configurar la grid. Poner en el void Initialize por ejemplo: (gForm.Controls["grdLineas"] as ICntGridUsuario).ActivarScripts = true; public void Grid_DblClick(ICntGridUsuario aGrid) { string lColumna = aGrid.CampoActual; Valor lIdDoc = aGrid.GetValue("IdDoc"); if (lColumna == "Precio") { Valor lNuevoPrecio = AhoraCore.VBA.Interaction.InputBox("Nuevo precio: ", "Nuevo precio "); if (!IsNumeric(lNuevoPrecio)) { AhoraCore.VBA.Interaction.MsgBox("El precio introducido no es válido"); } else { if (!gCn.ExecuteSql("UPDATE Listas_Precios_Prov_Art SET Precio = " + lNuevoPrecio + " WHERE IdDoc = " & lIdDoc)) { AhoraCore.VBA.Interaction.MsgBox("No se ha modificado correctamente"); } else { AhoraCore.VBA.Interaction.MsgBox("Se ha modificado correctamente"); } } } }
Éste es el evento antes de actualizar la columna del grid, advertimos al usuario que la máquina es genérica. Formulario de inicio de un contrato (frmContratos_Inicio)
Código en VB6:
Sub Initialize() gForm.grdLineas.ActivarScripts = True End Sub 'Para Activar este evento hay que configurar la grid. Poner en el sub Initialize por ejemplo: gForm.grdLineas.ActivarScripts = True Sub Grid_BeforeColUpdate(aGrid,aColIndex,aOldValue,aCancel) If agrid.columns("Descrip2").colindex = acolindex Then 'comprobar que la descripción2 no es igual que la descripción y si es genérica avisar y quitar la descripción2. If agrid.columns("Descrip2").Value = agrid.columns("Descrip").Value Then MsgBox "No puede enviar duplicar descipciones. Cambie una de las dos descripciones." acancel = True End If End If End Sub
Código en C#:
public void Initialize() { (gForm.Controls["grdLineas"] as ICntGridUsuario).ActivarScripts = true; } //Para Activar este evento hay que configurar la grid. Poner en el void Initialize por ejemplo: (gForm.Controls["grdLineas"] as ICntGridUsuario).ActivarScripts = true; public void Grid_BeforeColUpdate(ICntGridUsuario aGrid, int aColIndex, Valor aOldValue, bool aCancel) { // Comprobar que la descripción2 no es igual que la descripción y si es genérica avisar y quitar la descripción2. if (aGrid.Columns["Descrip2"].ColIndex == aColIndex) { if (aGrid.Columns["Descrip2"].Value == aGrid.Columns["Descrip"].Value) { AhoraCore.VBA.Interaction.MsgBox("No puede enviar duplicar descipciones. Cambie una de las dos descripciones."); aCancel = true; } } }
Este evento se ejecuta antes de cargar la grid. En él modificamos el origen de datos de ésta.
De esta forma, si tenemos configurada la grid con campos configurables los podemos mostrar. Este evento estaba en el formulario de listas de precios de clientes.
Código en VB6:
Sub Initialize() gForm.Controls("grdLineas").ActivarScripts=True End Sub 'Para Activar este evento hay que configurar la grid. Poner en el sub Initialize por ejemplo: gForm.grdLineas.ActivarScripts = True 'Este evento sólo se ejecuta cuando se obtiene la configuración de la grid,es decir, si no se cambia la config. sólo una vez. Sub Grid_BeforeLoad(aGrid) If aGrid.name = "grdLineas" Then aGrid.From = "VCLIENTE_Listas_Precios_Cli_SinAjenas" End If End Sub
Código en C#:
public void Initialize() { (gForm.Controls["grdLineas"] as ICntGridUsuario).ActivarScripts = true; } //Para Activar este evento hay que configurar la grid. Poner en el void Initialize por ejemplo: (gForm.Controls["grdLineas"] as ICntGridUsuario).ActivarScripts = true; public void Grid_BeforeLoad(ICntGridUsuario aGrid) { if (aGrid.Name == "grdLineas") { aGrid.From = "VCLIENTE_Listas_Precios_Cli_SinAjenas"; } }
Ejemplo Control Grid: Array sin origen de datos y campos sustitución
- Cuando no se desea cargar datos en el grid, simplemente que el usuario los introduzca, no es necesario poner un origen de datos.
- Utilizaremos sustitución cuando se selecciona un artículo y queremos que se actualice el campo Descripción, y viceversa.
- Al insertar un nuevo registro queremos que el campo cantidad por defecto sea 1.
Código en VB6:
Sub Initialize() Set lPnlArtics = gForm.Controls.Add("AhoraOCX.cntPanel", "PnlArtics") lPnlArtics.Resized = True lPnlArtics.ResizeEnabled = False lPnlArtics.ResizeInterior = True lPnlArtics.Estilo = 0 lPnlArtics.Visible = True gForm.TabMain.InsertItem 110, "&Articulos", lPnlArtics.Hwnd, 1 Set lGrid = gForm.Controls.Add("AhoraOCX.cntGridUsuario", "Pers_GrdArtics", PnlArtics) CargaGrdArticulosConSust End Sub Sub CargaGrdArticulosConSust() 'Crearemos un grid de sólo array para introducir artículos y cantidades 'Seleccionaremos los artículos de un combo 'Al seleccionar el artículo se actualzará la descripción y viceversa With gForm.Controls("Pers_GrdArtics") Set .Container = gForm.Controls("PnlArtics") .Visible = True If Not .Preparada Then .Agregar = True .Editar = True .Eliminar = True .CargaObjetos = False .EditarPorObjeto = False .Grid.FetchRowStyle = False 'Agregamos columna con formato numérico (Ver lib Ahora_Constantes) .AgregaColumna "Cantidad", 1000, "Cantidad", , , , "#,##0" .AgregaColumna "IdArticulo", 1500, "Articulo", , "Select IdArticulo, IdArticulo, Descrip From Articulos" .AgregaColumna "Descrip", 2500, "Descripcion", , "Select Descrip, Descrip, IdArticulo From Articulos" .From = "" 'sin origen de datos porque los introducirá el usuario .Where = "" .OrdenMultiple = "" 'Sustituciones .Campo("IdArticulo").Sustitucion = "SELECT IdArticulo FROM Articulos WHERE Descrip = @Descrip" .Campo("Descrip").Sustitucion = "SELECT Descrip FROM Articulos WHERE IdArticulo = @IdArticulo" .Campo("Cantidad").Default = 1 .SoloArray = False .Refresca = True End If .SoloArray = True .Refresca = False End With End Sub
Código en C#:
using AhoraCl; using AhoraCore; using AhoraOCX; using AhoraSistema; using System; using System.Windows.Forms; namespace AhoraScriptsPantalla { public class AhoraCl_frmArticulos : AhoraOCX.AhoraBaseScript { public void Initialize() { IControl lGrid = null; ICntPanel lPnlArtics = null; try { lPnlArtics = (ICntPanel)gForm.Controls.Add("AhoraOCX.CntPanel", "PnlArtics", null); lPnlArtics.Resized = true; ((IControlResizable) lPnlArtics).ResizeEnabled = false; ((ICntPanel) lPnlArtics).ResizeInterior = true; lPnlArtics.Estilo = 0; lPnlArtics.Visible = true; ((ICntTab) gForm.FindControl("TabPrincipal")).InsertItem(110, "&Articulos M", lPnlArtics, 1); lGrid = gForm.Controls.Add("AhoraOCX.CntGridUsuario", "Pers_GrdArtics", lPnlArtics); CargaGrdArticulosConSust(); } catch (Exception) { throw; } } public void CargaGrdArticulosConSust() { try { //Crearemos un grid de sólo array para introducir artículos y cantidades //Seleccionaremos los artículos de un combo //Al seleccionar el artículo se actualzará la descripción y viceversa gForm.Controls["Pers_GrdArtics"].Parent = (Control) gForm.Controls["PnlArtics"]; gForm.Controls["Pers_GrdArtics"].Visible = true; if (!((ICntGridUsuario) gForm.Controls["Pers_GrdArtics"]).Preparada) { ((ICntGridUsuario)gForm.Controls["Pers_GrdArtics"]).Agregar = true; ((ICntGridUsuario) gForm.Controls["Pers_GrdArtics"]).Editar = true; ((ICntGridUsuario) gForm.Controls["Pers_GrdArtics"]).Eliminar = true; ((ICntGridUsuario) gForm.Controls["Pers_GrdArtics"]).CargaObjetos = false; ((ICntGridUsuario) gForm.Controls["Pers_GrdArtics"]).EditarPorObjeto = false; ((ICntGridUsuario) gForm.Controls["Pers_GrdArtics"]).FetchRowStyle = false; ((ICntGridUsuario) gForm.Controls["Pers_GrdArtics"]).AgregaColumna("Cantidad", 67, "Cantidad", false, "", false, "#,##0"); ((ICntGridUsuario) gForm.Controls["Pers_GrdArtics"]).AgregaColumna("IdArticulo", 100, "Articulo", false, "Select IdArticulo, IdArticulo, Descrip From Articulos"); ((ICntGridUsuario) gForm.Controls["Pers_GrdArtics"]).AgregaColumna("Descrip", 167, "Descripcion", false, "Select Descrip, Descrip, IdArticulo From Articulos"); ((ICntGridUsuario) gForm.Controls["Pers_GrdArtics"]).From = ""; ((ICntGridUsuario) gForm.Controls["Pers_GrdArtics"]).Where = ""; ((ICntGridUsuario) gForm.Controls["Pers_GrdArtics"]).OrdenMultiple = ""; //Sustituciones ((ICntGridUsuario) gForm.Controls["Pers_GrdArtics"]).Campo("IdArticulo").Sustitucion = "SELECT IdArticulo FROM Articulos WHERE Descrip = @Descrip"; ((ICntGridUsuario) gForm.Controls["Pers_GrdArtics"]).Campo("Descrip").Sustitucion = "SELECT Descrip FROM Articulos WHERE IdArticulo = @IdArticulo"; ((ICntGridUsuario) gForm.Controls["Pers_GrdArtics"]).Campo("Cantidad").Default = 1; ((ICntGridUsuario) gForm.Controls["Pers_GrdArtics"]).SoloArray = false; ((ICntGridUsuario) gForm.Controls["Pers_GrdArtics"]).Refresca = true; } ((ICntGridUsuario) gForm.Controls["Pers_GrdArtics"]).SoloArray = true; ((ICntGridUsuario) gForm.Controls["Pers_GrdArtics"]).Refresca = false; } catch (Exception) { throw; } } } }
Ejemplo Control Grid: sólo ARRAY usando Alias y campos calculados
En éste ejemplo el grid es de sólo edición y sólo queremos que se refresque cuando se llame al método cargaGridSelecTarifas. Le pondremos un FROM porque queremos que cargue datos por defecto.
Código en VB6:
Sub cargaGridSelecTarifas() With grdSelecTarifas If Not .Preparada Then .Agregar = False .Editar = True .Eliminar = False .CargaObjetos = False .Alias = "a" '-Columna Marca (Columna Calculada) no existe en las tablas. '-Se especifica con @ .AgregaColumna "@Marca", 700, "Marca" .AgregaColumna "IdDelegacion", 1000, "Delegacion", True .AgregaColumna "IdLista", 500, "Lista", True .AgregaColumna "Descrip", 1000, "Descripción", True '-Establecemos el tipo de datos y la sustitución .Campo("@Marca").Booleano = True .Campo("@Marca").Sustitucion = "Select 0" .From="(SELECT cc.IdDelegacion,lpc.IdLista,lpc.Descrip,lpc.IdDoc" & "FROM Listas_Precios_Cli lpc " & "INNER JOIN Ceesi_Configuracion cc ON " & "lpc.IdLista=cc.Valor WHERE cc.Parametro='LISTAPRECIOS_DEFECTO')a" '-Queremos que sólo cargue las tarifas para la delegación actual. '-GCN es el objeto conexión. .Where = " WHERE a.IdDelegacion = " & gCn.IdDelegacion .OrdenMultiple = " IdDelegacion, IdLista" End If '-Cuando es un grid de solo Array el orden de refresco es el siguiente: si se cambia el orden da error .SoloArray = False .Refresca = True '-Hacemos el refresco 1 vez. .SoloArray = True .Refresca = False '-Dejamos la grid como sólo array. End With End Sub
Código en C#:
public void cargaGridSelecTarifas() { IControl grdSelecTarifas = null; try { if (!((ICntGridUsuario)grdSelecTarifas).Preparada) { ((ICntGridUsuario)grdSelecTarifas).Agregar = false; ((ICntGridUsuario)grdSelecTarifas).Editar = true; ((ICntGridUsuario)grdSelecTarifas).Eliminar = false; ((ICntGridUsuario)grdSelecTarifas).CargaObjetos = false; ((ICntGridUsuario)grdSelecTarifas).Alias = "a"; //-Columna Marca (Columna Calculada) no existe en las tablas. //-Se especifica con @ ((ICntGridUsuario)grdSelecTarifas).AgregaColumna("@Marca", 47, "Marca"); ((ICntGridUsuario)grdSelecTarifas).AgregaColumna("IdDelegacion", 67, "Delegacion", true); ((ICntGridUsuario)grdSelecTarifas).AgregaColumna("IdLista", 33, "Lista", true); ((ICntGridUsuario)grdSelecTarifas).AgregaColumna("Descrip", 67, "Descripción", true); //-Establecemos el tipo de datos y la sustitución ((ICntGridUsuario)grdSelecTarifas).Campo("@Marca").Booleano = true; ((ICntGridUsuario)grdSelecTarifas).Campo("@Marca").Sustitucion = "Select 0"; ((ICntGridUsuario)grdSelecTarifas).From = "(SELECT cc.IdDelegacion,lpc.IdLista,lpc.Descrip,lpc.IdDoc" + "FROM Listas_Precios_Cli lpc " + "INNER JOIN Ceesi_Configuracion cc ON " + "lpc.IdLista=cc.Valor WHERE cc.Parametro='LISTAPRECIOS_DEFECTO')a"; //-Queremos que sólo cargue las tarifas para la delegación actual. //-GCN es el objeto conexión. ((ICntGridUsuario)grdSelecTarifas).Where = " WHERE a.IdDelegacion = " + gCn.IdDelegacion; ((ICntGridUsuario)grdSelecTarifas).OrdenMultiple = " IdDelegacion, IdLista"; } //-Cuando es un grid de solo Array el orden de refresco es el siguiente: si se cambia el orden da error ((ICntGridUsuario)grdSelecTarifas).SoloArray = false; ((ICntGridUsuario)grdSelecTarifas).Refresca = true; ((ICntGridUsuario)grdSelecTarifas).SoloArray = true; ((ICntGridUsuario)grdSelecTarifas).Refresca = false; } catch (Exception) { throw; } }
Ejemplo Control Grid: grid de sólo lectura con Alias y filtro WHERE
Código en VB6:
Sub CargaGrdArticulosDeProv() '--Cuando se llame a éste procedimiento se aplicará el filtro WHERE '--Y mostrarán los artículos del proveedor especificado. Dim lStrVista 'As String lStrVista = "(SELECT pa.IdProveedor, pa.IdArticulo, a.Descrip, a.IdDoc " & "FROM Prov_Articulos pa " & "INNER Join Articulos a On " & "pa.IdArticulo = a.IdArticulo) Vista" With gForm.Controls("Pers_GrdComisiones") Set .Container = gForm.Controls("PnlComisiones") .Visible = True If Not .Preparada Then .Agregar = False .Editar = False .Eliminar = False .CargaObjetos = False .EditarPorObjeto = False .Grid.FetchRowStyle = False .Alias = "Vista" .AgregaColumna "IdArticulo", 1000, "IdArticulo" .AgregaColumna "Descrip", 3000, "Descripción" .From = lStrVista .OrdenMultiple = "" End If .Where = "WHERE Vista.IdProveedor = " & gForm.Controls("IdProveedor").text '--la func. sqlString me añade comillas .Refresca = True End With End Sub
Código en C#:
public void CargaGrdArticulosDeProv() { string lStrVista = ""; try { lStrVista = "(SELECT pa.IdProveedor, pa.IdArticulo, a.Descrip, a.IdDoc " + "FROM Prov_Articulos pa " + "INNER Join Articulos a On " + "pa.IdArticulo = a.IdArticulo) Vista"; gForm.Controls["Pers_GrdComisiones"].Parent = (Control) gForm.Controls["PnlComisiones"]; gForm.Controls["Pers_GrdComisiones"].Visible = true; if (!((ICntGridUsuario) gForm.Controls["Pers_GrdComisiones"]).Preparada) { ((ICntGridUsuario)gForm.Controls["Pers_GrdComisiones"]).Agregar = false; ((ICntGridUsuario) gForm.Controls["Pers_GrdComisiones"]).Editar = false; ((ICntGridUsuario) gForm.Controls["Pers_GrdComisiones"]).Eliminar = false; ((ICntGridUsuario) gForm.Controls["Pers_GrdComisiones"]).CargaObjetos = false; ((ICntGridUsuario) gForm.Controls["Pers_GrdComisiones"]).EditarPorObjeto = false; ((ICntGridUsuario)gForm.Controls["Pers_GrdComisiones"]).FetchRowStyle = false; ((ICntGridUsuario)gForm.Controls["Pers_GrdComisiones"]).Alias = "Vista"; ((ICntGridUsuario) gForm.Controls["Pers_GrdComisiones"]).AgregaColumna("IdArticulo", 67, "IdArticulo"); ((ICntGridUsuario) gForm.Controls["Pers_GrdComisiones"]).AgregaColumna("Descrip", 200, "Descripción"); ((ICntGridUsuario) gForm.Controls["Pers_GrdComisiones"]).From = lStrVista; ((ICntGridUsuario) gForm.Controls["Pers_GrdComisiones"]).OrdenMultiple = ""; } ((ICntGridUsuario) gForm.Controls["Pers_GrdComisiones"]).Where = "WHERE Vista.IdProveedor = " + ((IControlEnlazable) gForm.Controls["IdProveedor"]).Text; ((ICntGridUsuario) gForm.Controls["Pers_GrdComisiones"]).Refresca = true; } catch (Exception) { throw; } }
Ejemplo Control Grid: grid con colecciones y asistentes F3
Cuando la grid tiene la propiedad CargaObjeto=False, cuando actualizamos un registro significa que NO estamos actualizando el objeto. La grid no podrá contener los campos de la tabla configurables del objeto.
Código en VB6:
Private Sub gridLoad() On Error GoTo Error_ With GrdLineas If Not .Preparada Then .Agregar = True .Editar = True .Eliminar = True .CargaObjetos = False 'al estar a False necesitamos indicar la tabla donde guarda .EditarPorObjeto = True Set .Coleccion = EObjeto.ObjGlobal.Objetos("Trans_Prod_Lineas") .From = "Transformac_Lineas" .AgregaColumna "IdCodigo", 0, "IdCodigo" .AgregaColumna "IdLinea", 0, "IdLinea" .AgregaColumna "IdArticulo", 1875, "Id artículo", False, _ "SELECT IdArticulo, IdArticulo, Descrip FROM VCombo_Articulos Order By IdArticulo" .AgregaColumna "@Descrip", 1875, gCn.Traducir(734, "Descripción"), False, _ "SELECT Descrip, Descrip, IdArticulo FROM VCombo_Articulos Order By Descrip" .AgregaColumna "Unidades", 1000, "Unidades", , , , cFmt_Num2 .AgregaColumna "Precio", 1000, "Precio", , , , cFmt_Eur, , , , , True 'Sustituciones .Campo("IdArticulo").Sustitucion = _ "SELECT IdArticulo FROM VCombo_Articulos WHERE Descrip = @@Descrip" .Campo("@Descrip").Sustitucion = _ "SELECT Descrip FROM VCombo_Articulos WHERE IdArticulo = @IdArticulo" 'Asistentes With .Campo("IdArticulo") .AsignaAsistente gCn.Obj.Objetos("Articulos").Entorno.Icono1, "vCombo_Articulos", "", "IdArticulo", "IdArticulo", 8000, , False 'Campos del asistente .AssistAddField "IdArticulo", "Id Artículo", "String", 2000, , True .AssistAddField "Descrip", gCn.Traducir(734, "Descripción"), "String", 4500 End With With .Campo("@Descrip") .AsignaAsistente gCn.Obj.Objetos("Articulos").Entorno.Icono1, "vCombo_Articulos", "", "Descrip", "Descrip", 8000, , False 'Campos del asistente .AssistAddField "Descrip", gCn.Traducir(734, "Descripción"), "String", 4500 .AssistAddField "IdArticulo", "Id Artículo", "String", 2000, , True End With .ColumnaEscalada = "@Descrip" End If Set .Coleccion = EObjeto.ObjGlobal.Objetos("Trans_Prod_Lineas") .Where = "WHERE 1 = 0" .Refresca = True End With End_: Exit Sub Error_: GCn.Tr.Trace TError, cModuleName, " gridLoad", , Err.Description Resume End_ End Sub
Código en C#:
private void gridLoad() { ICntGridUsuario grdLineas = (gForm.Controls["grdLineas"] as ICntGridUsuario); if (!grdLineas.Preparada) { grdLineas.Agregar = true; grdLineas.Editar = true; grdLineas.Eliminar = true; grdLineas.CargaObjetos = false; grdLineas.EditarPorObjeto = true; grdLineas.Coleccion = (IColecciones)EObjeto.ObjGlobal.Objetos["Trans_Prod_Lineas"]; grdLineas.From = "Transformac_Lineas"; grdLineas.AgregaColumna("IdCodigo", 0, "IdCodigo"); grdLineas.AgregaColumna("IdLinea", 0, "IdLinea"); grdLineas.AgregaColumna("IdArticulo", 1875, "Id artículo", false, "SELECT IdArticulo, IdArticulo, Descrip FROM VCombo_Articulos Order By IdArticulo"); grdLineas.AgregaColumna("@Descrip", 1875, gCn.Traducir(734, "Descripción"), false, "SELECT Descrip, Descrip, IdArticulo FROM VCombo_Articulos Order By Descrip"); grdLineas.AgregaColumna("Unidades", 1000, "Unidades", false, null,false, cFmt_Num2); grdLineas.AgregaColumna("Precio", 1000, "Precio", false, null, false, cFmt_Eur, false, null, false, null, true); // Sustituciones grdLineas.Campo("IdArticulo").Sustitucion = "SELECT IdArticulo FROM VCombo_Articulos WHERE Descrip = @@Descrip"; grdLineas.Campo("@Descrip").Sustitucion = "SELECT Descrip FROM VCombo_Articulos WHERE IdArticulo = @IdArticulo"; // Asistentes grdLineas.Campo("IdArticulo").AsignaAsistente(gCn.Obj.Objetos["Articulos"].Entorno.Icono1.ToString(), "vCombo_Articulos", "", "IdArticulo", "IdArticulo", 8000, 0, false); // Campos del asistente grdLineas.Campo("IdArticulo").AssistAddField("IdArticulo", "Id Artículo", ETipoDato.String, 2000, false, true); grdLineas.Campo("IdArticulo").AssistAddField("Descrip", gCn.Traducir(734, "Descripción"), ETipoDato.String, 4500); grdLineas.Campo("@Descrip").AsignaAsistente(gCn.Obj.Objetos["Articulos"].Entorno.Icono1.ToString(), "vCombo_Articulos", "", "Descrip", "Descrip", 8000, 0, false); // Campos del asistente grdLineas.Campo("@Descrip").AssistAddField("Descrip", gCn.Traducir(734, "Descripción"), ETipoDato.String, 4500); grdLineas.Campo("@Descrip").AssistAddField("IdArticulo", "Id Artículo", ETipoDato.String, 2000, false, true); grdLineas.ColumnaEscalada = "@Descrip"; } grdLineas.Coleccion = (IColecciones)EObjeto.ObjGlobal.Objetos["Trans_Prod_Lineas"]; grdLineas.Where = "WHERE 1 = 0"; grdLineas.Refresca = true; }
¿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