Parámetros opcionales

Desarrollo de Macros y programación en UNO, usar las API, llamar programas externos...

Parámetros opcionales

Notapor valenteres » Dom Feb 28, 2016 11:33 pm

Buenas noches.

Estoy intentando pasar parámetros opcionales a una función.
Siguiendo el manual de Mauricio Baeza, al entrar en la función compruebo si tiene asignado un valor, y si no es así le asigno un valor por defecto.
En mi caso paso un parámetro no opcional y 4 opcionales. De los 4 parámetros opcionales unas veces me interesa pasar unos y otras otros.
El código utilizado es el siguiente:
Código: Seleccionar todo   Expandir vistaContraer vista
Sub Prueba

Dim Aux as Double

Aux = ParOpcional(1)

End Sub


Function ParOpcional(A as integer, Optional B as Double, Optional C as Double, Optional D as Double, Optional E as Double) as Double

Select case A

   Case 1
      MsgBox "B= " & B
      If IsMissing(B) Then B=5
      MsgBox "C= " & C
      If IsMissing(C) Then C=6
      MsgBox "D= " & D
      If IsMissing(D) Then D=7
      MsgBox "E= " & E
      If IsMissing(E) Then E=8
   Case 2
      MsgBox B
      If IsMissing(B) Then B=1
      MsgBox C
      If IsMissing(C) Then C=3
      MsgBox D
      If IsMissing(D) Then D=5
      MsgBox E
      If IsMissing(E) Then E=7
   Case 3
      MsgBox B
      If IsMissing(B) Then B=2
      MsgBox C
      If IsMissing(C) Then C=4
      MsgBox D
      If IsMissing(D) Then D=6
      MsgBox E
      If IsMissing(E) Then E=8
   Case Else
      MsgBox B
      If IsMissing(B) Then B=11
      MsgBox C
      If IsMissing(C) Then C=12
      MsgBox D
      If IsMissing(D) Then D=13
      MsgBox E
      If IsMissing(E) Then E=14

End Select

ParOpcional = A + B^0.5 - C/2 + D/11 - E*5

End Function


Este código funciona bien como muestro en la siguiente captura de pantalla:
Opcionales01.png


En cambio, cuando intento pasar algunos de los parámetros opcionales da problemas
Cambiando la línea de llamada a la función :
Código: Seleccionar todo   Expandir vistaContraer vista
Aux = ParOpcional(1)

Por otra en la que se da uno de los parámetros opcionales:
Código: Seleccionar todo   Expandir vistaContraer vista
Aux = ParOpcional(1,,,,3,)

El valor de la variable las variable a las que no se ha dado valor adquieren el valor 448 y no se reconocen como Missing
Opcionales02.png


¿Como puedo ingresar el valor de algunos de los parámetros opcionales y que el resto los siga reconociendo como "Missing"

Un saludo
-------------------------------------------------------------
"Como no sabían que era imposible, lo hicieron"

Open Office 4.1.1
Libre Office 5.0
Windows 10
-------------------------------------------------------------
valenteres
 
Mensajes: 81
Registrado: Mié Jun 17, 2015 6:04 pm

Re: Parámetros opcionales

Notapor mauricio » Lun Feb 29, 2016 12:03 am

Obtienes el error 448, por que intentas usar una variable opcional que NO has pasado:
Código: Seleccionar todo   Expandir vistaContraer vista
    Select case A

       Case 1
          If IsMissing(B) Then B=5
          MsgBox "B= " & B
          If IsMissing(C) Then C=6
          MsgBox "C= " & C
          If IsMissing(D) Then D=7
          MsgBox "D= " & D
          If IsMissing(E) Then E=8
          MsgBox "E= " & E

Saludos
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
Avatar de Usuario
mauricio
 
Mensajes: 6063
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX

Re: Parámetros opcionales

Notapor mauricio » Lun Feb 29, 2016 1:04 am

Solo por curiosidad, con Python podría ser así:
Código: Seleccionar todo   Expandir vistaContraer vista
def opt(a, **kwargs):
    'Valores predeterminados'
    default = {'b': 11, 'c': 12, 'd':13, 'e': 14}
    'Valores si a'
    values = {
        1: {'b': 5, 'c': 6, 'd':7, 'e': 8},
        2: {'b': 1, 'c': 3, 'd':5, 'e': 7},
        3: {'b': 2, 'c': 4, 'd':6, 'e': 8},
    }
    if a in values:
        default = values[a]
    'Actualizamos solo las variables opcionales pasadas'
    default.update(kwargs)
    result = a + default['b']**0.5 - default['c']/2 + default['d']/11 - default['e']*5
    return result

print (opt(1))

print (opt(2, e=3))

print (opt(3, b=5, d=10))

Me encanta Python!!
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
Avatar de Usuario
mauricio
 
Mensajes: 6063
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX

Re: Parámetros opcionales

Notapor valenteres » Lun Feb 29, 2016 8:32 am

Buenos días:

La pregunta es ¿Como puedo identificar en Basic esta situación?
¿Como puedo diferenciar si el valor B=448 es un valor válido de B o es el valor de Error 448?

Un saludo y muchas gracias
-------------------------------------------------------------
"Como no sabían que era imposible, lo hicieron"

Open Office 4.1.1
Libre Office 5.0
Windows 10
-------------------------------------------------------------
valenteres
 
Mensajes: 81
Registrado: Mié Jun 17, 2015 6:04 pm

Re: Parámetros opcionales

Notapor SLV-es » Lun Feb 29, 2016 2:42 pm

Como te ha comentado mauricio, aquí primero utilizas la variable B que quizás no se ha pasado, y luego verificas si no se ha pasado y en ese caso, le asignas un valor
Código: Seleccionar todo   Expandir vistaContraer vista
MsgBox "B= " & B
If IsMissing(B) Then B=5

Esto es erróneo.

Lo correcto es comprobar primero si se ha pasado, y si no asignarle una valor. Luego utilizarla.
Código: Seleccionar todo   Expandir vistaContraer vista
If IsMissing(B) Then B=5
MsgBox "B= " & B


Lo mismo se aplica al resto de variables de tu macro.

Primero tienes que identificar si se ha pasado la variable (si es missing), y si no se ha pasado, asignarle el valor por defecto.
Luego, ya puedes utilizar la variable. Si no es missing (se pasó), tomará el valor que se le pasó a la función.

+info en http://wiki.open-office.es/Modos_de_pas ... fice_Basic
+info en la web "no oficial" dedicada a OpenOffice en Español
AOO 4.1.2 y LibO 4.4.6 en W10 y en Lliurex
No respondo mensajes privados sobre AOO, por favor, utiliza el foro para tus preguntas
Avatar de Usuario
SLV-es
 
Mensajes: 4894
Registrado: Jue Ago 26, 2010 1:25 am
Ubicación: España

Re: Parámetros opcionales

Notapor valenteres » Lun Feb 29, 2016 3:01 pm

Buenos días:
Muchas gracias a los dos.

Algo debo estar haciendo mal, porque el comportamiento sigue siendo el mismo.
He simplificado el código y he puesto el siguiente:
Código: Seleccionar todo   Expandir vistaContraer vista
Option Explicit

Sub Prueba

Dim Aux as Double

Aux = ParOpcional(1,,3,4,5)

End Sub


Function ParOpcional(A as integer, Optional B as Double, Optional C as Double, Optional D as Double, Optional E as Double) as Double

If IsMissing(B) Then B=-99
      MsgBox "B= " & B
If IsMissing(C) Then C=-99
      MsgBox "C= " & C
If IsMissing(D) Then D=-99
      MsgBox "D= " & D
If IsMissing(E) Then E=-99
      MsgBox "E= " & E

End Function


El resultado sigue siendo el mismo. El valor que presenta es B=448, el resto de valores toma los valores aportados como opcionales.

Un saludo
-------------------------------------------------------------
"Como no sabían que era imposible, lo hicieron"

Open Office 4.1.1
Libre Office 5.0
Windows 10
-------------------------------------------------------------
valenteres
 
Mensajes: 81
Registrado: Mié Jun 17, 2015 6:04 pm

Re: Parámetros opcionales

Notapor SLV-es » Lun Feb 29, 2016 4:11 pm

Creo recordar que existían algunos términos que no se podían utilizar como nombres de variables; y ahora que lo comentamos, creo que la B era una de ellos
+info en la web "no oficial" dedicada a OpenOffice en Español
AOO 4.1.2 y LibO 4.4.6 en W10 y en Lliurex
No respondo mensajes privados sobre AOO, por favor, utiliza el foro para tus preguntas
Avatar de Usuario
SLV-es
 
Mensajes: 4894
Registrado: Jue Ago 26, 2010 1:25 am
Ubicación: España

Re: Parámetros opcionales

Notapor mauricio » Lun Feb 29, 2016 4:24 pm

A mi me funciono sin problemas con la B...

Y "nunca" utilices un MsgBox dentro de una función...
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
Avatar de Usuario
mauricio
 
Mensajes: 6063
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX

Re: Parámetros opcionales

Notapor valenteres » Lun Feb 29, 2016 7:37 pm

Buenas tardes:

No lo consigo. He actualizado Libre Office a la versión 5.0.5.2 y sigue igual.
De momento puede pasar sin los parámetros opcionales.

Muchas gracias
-------------------------------------------------------------
"Como no sabían que era imposible, lo hicieron"

Open Office 4.1.1
Libre Office 5.0
Windows 10
-------------------------------------------------------------
valenteres
 
Mensajes: 81
Registrado: Mié Jun 17, 2015 6:04 pm

Re: Parámetros opcionales

Notapor SLV-es » Lun Feb 29, 2016 8:20 pm

Código: Seleccionar todo   Expandir vistaContraer vista
Option Explicit

Sub Prueba
  Dim Aux as Double
  Aux = ParOpcional(1,,3,4,5)
End Sub

Function ParOpcional(A as integer, Optional B, Optional C, Optional D, Optional E) as Double
If IsMissing(B) Then B=-99
      MsgBox "B= " & B
If IsMissing(C) Then C=-99
      MsgBox "C= " & C
If IsMissing(D) Then D=-99
      MsgBox "D= " & D
If IsMissing(E) Then E=-99
      MsgBox "E= " & E
End Function


Funciona :)
+info en la web "no oficial" dedicada a OpenOffice en Español
AOO 4.1.2 y LibO 4.4.6 en W10 y en Lliurex
No respondo mensajes privados sobre AOO, por favor, utiliza el foro para tus preguntas
Avatar de Usuario
SLV-es
 
Mensajes: 4894
Registrado: Jue Ago 26, 2010 1:25 am
Ubicación: España

Re: Parámetros opcionales

Notapor valenteres » Lun Feb 29, 2016 9:00 pm

Algo he visto:

En Apache OpenOffice 4.1.2 funciona perfectamente
En Libre Office 5.0.5.2 sigo teniendo los mismos problemas

Ahora tengo un dilema:
- Apache me daba problemas con los gráficos
- Libre Office me da problemas con los parámetros opcionales

solución ¿?

Un saludo
-------------------------------------------------------------
"Como no sabían que era imposible, lo hicieron"

Open Office 4.1.1
Libre Office 5.0
Windows 10
-------------------------------------------------------------
valenteres
 
Mensajes: 81
Registrado: Mié Jun 17, 2015 6:04 pm

Re: Parámetros opcionales

Notapor SLV-es » Lun Feb 29, 2016 9:23 pm

En LibO 4.4.6 funciona perfectamente
+info en la web "no oficial" dedicada a OpenOffice en Español
AOO 4.1.2 y LibO 4.4.6 en W10 y en Lliurex
No respondo mensajes privados sobre AOO, por favor, utiliza el foro para tus preguntas
Avatar de Usuario
SLV-es
 
Mensajes: 4894
Registrado: Jue Ago 26, 2010 1:25 am
Ubicación: España


Volver a Macros y API UNO

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 3 invitados