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