Formulario Genérico - Instanciar el formulario genérico para crear un formulario de petición de datos.

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

Código VB6: 

En ocasiones necesitamos que el formulario que diseñamos interactúe con el formulario que lo llama. Ya sea pasándole un parámetro, o esperando una respuesta para refrescar un grid, por ejemplo.
En estos casos el AhoraProceso "AhoraScripts.AbrirFrmGenerico" no nos servirá.
Tendremos que utilizar el AhoraProceso "AhoraScripts.DameFrmGenerico".

Esta funcionalidad está presente desde la versión 4.0. Para utilizarla deberá de existir el registro en la tabla AhoraProcesos, de lo contrario debe pasar éste script de definición de AhoraProcesos.

IF NOT EXISTS (SELECT * FROM [Ahora_Procesos] WHERE [IdAhoraProceso]='AhoraScripts.DameFrmGenerico')
INSERT INTO [Ahora_Procesos] ([IdAhoraProceso],[Descrip],[IdTipo],[Libreria],[Clase],[Metodo],[IdLlamada],[RetornoTipo],[RetornoObjeto],[CheckParam],[Observaciones],[Macro],[Net])
VALUES('AhoraScripts.DameFrmGenerico','Devuelve el formulario FrmGenerico.',3,'AhoraScripts','Scripts','DameFrmGenerico',1,NULL,1,0,'Public Function Carga(ByVal aNombreForm As String, Optional aPropietario As Object = Nothing, Optional aModal As Boolean = True) As Boolean)',0,0)


COPIAR LISTAS DE PRECIO DE OTRO PROVEEDOR
- El siguiente ejemplo pretende crear un formulario donde el usuario seleccione un dato de un control de tipo Combo.
- Se creará un botón de Aceptar y otro de Cerrar.
- Si el usuario pulsa "Aceptar" llamará a una stored procedure en la base de datos y cerrará la ventana. A continuación el formulario que hizo la llamada refrescará el grid.

'* Código del formulario padre "Listas de precios Proveedor"
Sub Show()
'Creamos el botón que llamará al frmGenérico
gform.Controls("Botonera" ).Botonadd "&Copiar de otra Lista de Precios", "botCopiarLista" ,,,,406
End Sub

Sub Botonera_AfterExecute(aBotonera, aBoton)
If aboton.name = "botCopiarLista" Then
abrirFrmGen
End If
End Sub

Sub Initialize()
gform.Controls("Botonera").ActivarScripts = True
End Sub

Sub abrirFrmGen
'gcn.ahoraproceso "AhoraScripts.AbrirFrmGenerico", False, "Pers_lpc_Combo", gcn.sesion.MainForm ,True
'Instanciamos el formulario, haciendo la llamada al ahoraProceso
Set lfrmGen = gcn.ahoraproceso ("AhoraScripts.DameFrmGenerico",False)
If lfrmGen Is Nothing Then
MsgBox "No se pudo instanciar el formulario genérico. Sólo está presente desde la versión 4.0." & Vbcrlf & " Si tiene esta versión o superior, debe solicitar el script SQL de creación de ahoraProceso presente en la documentación web"
Exit Sub
End If
lfrmgen.tag = gForm.Controls("IdLista").text ' Pasamos el IdLista al formulario genérico a través de la propiedad "Tag" del formulario.
lfrmGen.carga "Pers_lpc_Combo",gform ,True ' Importante parámetros: "NombreForm", [Objeto formulario padre], [Modal]
gForm.Controls("grdLineas").refrescar ' Como el formulario es modal, al cerrarse se refrescará el grid
End Sub

'* Código del formulario genérico. --Atención, el control combo se crea mediante asistente, no se incluye script de creación de control en el ejemplo.

Sub Show()

With gForm.Controls("Botonera")
.activarscripts = True
.SeguridadObjeto = 0 'No muestra los botones estándar de objeto
.botonesMantenimiento = 5 ' Mostramos el botón de aceptar y cerrar
.habilitaBotones
End With
End Sub


Sub Botonera_AfterExecute(aBotonera, aBoton)
Select Case aboton.Name
Case "botAceptar"
If "" & gForm.Controls("NuevoCombo1").text = "" Then
MsgBox "Debe seleccionar una lista",VbExclamation,"Atención"
Exit Sub
End If
If MsgBox ("¿Confirma que quiere copiar la lista de precios del proveedor escogido?",vbQuestion + vbYesNo + Vbdefaultbutton2, "Confirmación") = VbYes Then
Set lColParam = gcn.damenewcollection
lColParam.add gForm.Controls("NuevoCombo1").text
lColParam.add gform.tag

If gCn.EjecutaStoreCol("pPers_Copia_ListasPrecios_Prov" ,lColParam) Then
MsgBox "Proceso ejecutado correctamente."

Else
MsgBox "Hubo un problema al copiar la Lista de precios. Consulte con el dpto de TIC." ,vbExclamation,"Atención"
Exit Sub
End If

abotonera.botonexecute "botCerrar" ' Cerramos el formulario genérico

End If
End Select
End Sub

Sub Initialize()
' El control NuevoCombo1 se ha creado mediante asistente y la definición está en tablas.
'gForm.Controls("NuevoCombo1").CaptionLink = True
End Sub

Código C#:

Para que el siguiente código pueda funcionar se requiere que exista un procedimiento almacenado de tipo "Pers" que es al que llamaremos.

Para el siguiente ejemplo podemos usar este, que no tiene ninguna lógica programada pero servirá para poder ejemplificar la llamada:

ALTER PROCEDURE pPers_Copia_ListasPrecios_Prov
@IdListaOrigen INT,
@IdListaDestino INT
AS
BEGIN
  -- Proceso de copia aquí
  RETURN -1
END

El código en el formulario de listas de precios de proveedores con el instanciamiento del frmGenerico:

using AhoraOCX;
using AhoraScripts;
using static AhoraCore.VBA.Interaction;

namespace AhoraScriptsPantalla
{
  public class AhoraCl_frmListas_Precios_Prov : AhoraOCX.AhoraBaseScript
  {

    public void Show()
    {
      // Añadimos nuevo botón a Botonera
      (gForm.Controls["Botonera"] as ICntBotonera).BotonAdd("&Copiar de otra Lista de Precios", "botCopiarLista","",ETipo_Menu.eTipo_Menu_Boton,false,406);
        }

    public void Initialize()
    {
      (gForm.Controls["Botonera"] as ICntBotonera).ActivarScripts = true;
    }

    public void Botonera_AfterExecute(ICntBotonera aBotonera, IAhoraTool aBoton)
    {
      if (aBoton.Name == "botCopiarLista") 
      {
        AbrirFrmGen();
      }
    }

    private void AbrirFrmGen()
    {
      // Llamada al formulario genérico
            IfrmGenerico lFrmGen = (IfrmGenerico)gCn.AhoraProceso("AhoraScripts.DameFrmGenerico", out _);
      if (lFrmGen == null)
      {
        MsgBox("No se pudo instanciar el formulario genérico", AhoraCore.VbMsgBoxStyle.vbCritical, "Error crítico");
        return;
      }

      // Se le pasa al Tag del formulario genérico el IdLista del formulario
      lFrmGen.Tag = (gForm.Controls["IdLista"] as IComboUsuario).Text;
      lFrmGen.Carga("Pers_lpc_Combo", gForm, true);

      // Como hemos abierto el formulario genérico en modal al regresar actualizamos el grid por si hubiéramos hecho cambios
      (gForm.Controls["grdLineas"] as ICntGridUsuario).Refrescar();
        }

  }

}

El código dentro del frmGenerico que crea un combo con las diferentes listas de precio de proveedor y llama al procedimiento almacenado:


using AhoraCore;
using AhoraGeneral;
using AhoraOCX;
using static AhoraCore.VBA.Interaction;

namespace AhoraScriptsPantalla
{
  public class AhoraScripts_Pers_lpc_Combo : AhoraOCX.AhoraBaseScript
  {

    public void Show()
    {
            // Creación de ComboUsuario para mostrar todas las listas de precio de Proveedor
            IComboUsuario claseComboUsuario = new ComboUsuario();
            IComboUsuario campoPers = (IComboUsuario)claseComboUsuario.CrearNuevoControl(
                gForm,                                                  // Formulario
                "persIdLista",                                          // NombreControl
                "Lista Origen:",                                        // Caption
                15,                                                     // Posición horizontal (Left)
                35,                                                     // Posición vertical (Top)
                210,                                                    // Ancho (en píxeles)
                20,                                                     // Alto (en píxeles)
                gForm.Controls["panMain"],                              // Control Contenedor
                true,                                                   // ¿Caption visible?
                ETipoDato.String,                                       // Tipo de dato
                EFormatoCampo.NoEstablecido,                            // Formato de campo
                63,                                                     // Ancho de etiqueta (en píxeles)
                1,                                                      // Índice de tabulación
                "SELECT Descrip, IdLista FROM Listas_Precios_Prov",     // SQL del combo
                2,                                                      // Nº de columnas
                2,                                                      // Nº de columna activa
                "Descrip",                                              // Nombre campo columna 1
                ETipoDatoColumnaCombo.Texto,                            // Tipo de dato columna 1
                150,                                                    // Anchura columna 1 (en píxeles)
                "L.Proveedor.",                                         // Descripción columna 1
                "IdLista",                                              // Nombre campo columna 2
                ETipoDatoColumnaCombo.Entero,                           // Tipo de dato columna 2
                75,                                                     // Anchura columna 2 (en píxeles)
                "Id."                                                   // Descripción columna 2
                );

            ICntBotonera botonera = (gForm.Controls["Botonera"] as ICntBotonera);
            botonera.ActivarScripts = true;
            botonera.SeguridadObjeto = 0;
            botonera.BotonesMantenimiento = EBotonesMant.eBotMant_AceptarCerrar;
            botonera.HabilitaBotones();
        }

    public void Botonera_AfterExecute(ICntBotonera aBotonera, IAhoraTool aBoton)
    {
            IComboUsuario persIdLista = (gForm.Controls["persIdLista"] as IComboUsuario);

            switch (aBoton.Name)
            {
                case "botAceptar":
                    {
                        if (persIdLista.Text == "")
                        {
                            MsgBox("Debe seleccionar una lista,", VbMsgBoxStyle.vbExclamation, "Atención");
                            return;
                        }
                        if (MsgBox("¿Confirma que quiere copiar la lista de precios del proveedor escogido?", VbMsgBoxStyle.vbQuestion | VbMsgBoxStyle.vbYesNo | VbMsgBoxStyle.vbDefaultButton2, "Confirmación") == VbMsgBoxResult.vbYes)
                        {
                            IVB6Collection<Valor> lColParam = gCn.DameNewCollection();
                            lColParam.Add(persIdLista.Text);
                            lColParam.Add(gForm.Tag);

                            if (gCn.EjecutaStoreCol("pPers_Copia_ListasPrecios_Prov", lColParam))
                            {
                                MsgBox("Proceso ejecutado correctamente.", VbMsgBoxStyle.vbInformation, "Proceso finalizado");
                            }
                            else
                            {
                                MsgBox("Se produjo un problema al copiar la lista de precios.", VbMsgBoxStyle.vbExclamation, "Atención");
                            }

                            aBotonera.BotonExecute("botCerrar");

                        }
                        break;
                    }
            }
    }

  }
}



¿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