none
Ejecutar procedimiento a partir de un string RRS feed

  • Pregunta

  • Hola un saludo todos.

    Quisiera saber si se puede ejecutar un procedimiento a partir de una cadena string

     

    Por ejemplo:

    Tengo un procedimiento que se llame:

     

    Private Sub SaldoMes(ByVal sCelda As String, ByVal iMes As Integer, ByVal iBd As Integer)

     

    Entonces en una cadena string tengo: "SaldoMes("400 001 101",1,1)-SaldoMes("405 001 101",1,1)-SaldoMes("410 001 101",1,1)"

     

    Lo que quiero lograr es que si detecto que tengo ese valor en el string, entonces llamar al procedimiento SaldoMes con todo y parametros que trae la cadena, sin tener que separar los valores ni nada de eso.

     

    Aqui tengo 3 veces el mismo procedimiento

    Entonces si detecto que tengo el procedimiento ejecutarlo con los parametros que ya tiene tal y como si lo llamara con un evento call.

     

    Lei algunos articulos pero no me queda claro el procedimiento:

    http://forums.microsoft.com/MSDN-ES/ShowPost.aspx?PostID=3758316&SiteID=11

    http://www.west-wind.com/presentations/dynamicCode/DynamicCode.htm

     

    Saludos, Gracias

    viernes, 7 de noviembre de 2008 5:23

Todas las respuestas

  • Esto es preciamente lo que se hace con command$ ...

     

    cuando una aplicación recibe parámetros de inicio, lo que hace es 'desguazar' la cadena de entrada (un string) para separar sus partes comprobar que todo es correcto e invocar al método elegido...

     

    Por ejemplo, seguro que habrás visto órdenes de shell del tipo:

    Code Snippet

    Move *.txt d:\mistxt\*.* 

     

     

    El CMD (command.com en versiones anterioes a xp en windows), lo que hace es trocear la cadena de entrada para verificar por partes que está todo correcto y si es así llama al método correspondiente.

     

    un código de ejemplo:

    Code Snippet

    Public Function Comandos(ByVal cadena As String) As Object

        Dim result As Object

        Dim parametros() As String

       

         If InStr(cadena, "/") = 0 Then ' si la cadena está vacía se cumple también este caso

            MsgBox("No se ha detectado un comando válido... el comando válido debe llevar tras de si el símbolo '/'")

            Exit Function

        End If

     

        parametros = Split(cadena, "/")

     

        If parametros(1) = "" Then

            MsgBox("Se ha enviado un comando sin parámetros. Los comandos actuales necesitan al menos 2 parámetros")

            Exit Function

        End If

     

        Select Case Trim(parametros(0).ToLower)

            Case "suma"

                result = Sumar(parametros(1))

            Case "resta"

                result = Restar(parametros(1))

            Case "multiplica"

                result = multiplicar(parametros(1))

            Case "divide"

       result = Dividir(parametros(1))

            Case Else

                MsgBox("comando no reconocido repase la sintaxis...")

                Call showSintaxis()

        End Select

        Return result

    End Function

     

    ' sumar no tiene problemas si los parametros valen 0, suma 0 

    Private Function Sumar(ByVal cadena As String) As Long

        Dim suma As Long

        Dim param() As String = Split(cadena, " ") ' el separador es un espacio

     

        For k As Integer = 1 To param.Length - 1

            If param(k) <> "0" Then

                suma += param(k) ' paam(k) es un string, se hace una conversión implícita

            End If

        Next

        Return suma

    End Function

     

    ' la división requiere ciertas comprobaciones que deben hacerse..

    Private Function Dividir(ByVal cadena As String) As Single

        Dim param() As String = Split(cadena, " ") ' el separador es un espacio

        Dim division As Single

        ' si no hay 2 parámetros indicar error, indicar sintaxis específica del comando y salir

        ' si hay más de 2 parámetros se aeptan los 2 primeros, el resto se ignora y no se indica error, en todo caso una advertencia

        ' si la división es entre 0 se indica error o se devuelve 0 oel parametro 1 a gusto..

        'se procede a dividir

        ' se envía el resultado

    End Function

     

     

     

     

     

     

     

    En el ejemplo se ilustra un simple caso que recibe una cadena la corta por un separador prefijado (en el ejemplo se usa la barra '/') esamina la parte primera, que al caso llamamos comando, lo que resta son parámetros de ese comando.

     

    Se determina el comando que es en cuestión, para ello hay que tener en cuenta no equivocarse con mayúsculas, minúsculas... (según deseemos)... dentro de un bloque select case, una vez determinado del que se trata invocamos a la función asociada pasándole como parámetro el parámetro 1 que se obtuvo al cortar la cadena de entrada inicial.

     

    Ahora la pelota la tiene cada función que debe evaluar si ha recibido parámetros y si son correctos, de aceurdo a lo que necesita, si no es el caso indica el error producido y/o la sintaxis correcta o esperada, si todo fue bien ejecuta lo indicado en el código con los parámetros recibidos.

    sábado, 8 de noviembre de 2008 2:39
  • Vaya miré los links después de responder...

     

    Dav76 preguntaba alrespecto allá por junio o julio,  ya le respondí en su momento pero me fui 2 semanas de vaciones así que no tuve ocasión de responder sus dudas, de ehcho cuando volví ya ni siquiera recordaba el caso. Yo le indicaba que podía usar la API, para hacerlo pero no supo portar el ejemplo de VB6 a VB2005, ya que principlamente no supo entender el puntero de cadena StrPtr...

    http://forums.microsoft.com/msdn-es/ShowPost.aspx?PostID=3479014&SiteID=11

     

    De todos modos parece según señala en ese link que das que ya lo halogrado, en ese caso simplmenete copia el código y modifica lo que necesites para adaptarlo a tus necesidades...

     

    No obstante la pregunta está mal planteada, ya que no es una cadena que se pasa a un procedimiento para evaluar llamadas a funciones sino que la propia cadena ya contiene las funciones a ejecutar.

     

    nota sin embargo que ese métdoo es más lento en cuanto a ejecución ya que debe convertirse desde cadena a cada uno de sus tipos de datos, es decir se compila en tiempo real cada cadena... quieras o no puede ser un problema de rendimiento en determinadas situaciones y en determinados entornos...

    sábado, 8 de noviembre de 2008 2:58