guizans   29-12-2022, 22:44
#1
Hola a todos.

Hago una llamada a un método que llama a una base de datos tipo SQlite3 y me devuelve un Result. Para evitar errores mas adelante del código compruebo si la búsqueda ha tenido éxito. Y lo puedo hacer así:

Código:
If resultado.Available Then
    r = resultado["ID"]
Else
    r = -1
Endif

Pero considero que una forma mas elegante de hacer esto es con un IIf

Código:
r = IIf(resultado.Available, resultado["ID"], -1)

Pero este código me da error si el resultado está vacío. Acabo de leer en la documentación que IIf evalúa la  expresión verdadera y falsa y por eso me da error. Parece un comportamiento anti intuitivo desde mi punto vista, aunque supongo que su motivo tendrá. Es una pena ya que usar IIf me ahorra líneas y parece mas elegante. 

Un saludo.
Shell   30-12-2022, 15:20
#2
(29-12-2022, 22:44)guizans escribió: Pero este código me da error si el resultado está vacío. Acabo de leer en la documentación que IIf evalúa la  expresión verdadera y falsa y por eso me da error. Parece un comportamiento anti intuitivo desde mi punto vista, aunque supongo que su motivo tendrá. Es una pena ya que usar IIf me ahorra líneas y parece mas elegante. 

¿ Y si pruebas con "If" en vez de "IIf" de esta forma ?.

Código:
r = If(resultado.Available, resultado["ID"], -1)

Se parecen mucho. Supongo que la de forma de la sentencia abreviada de If, partió de IIf. Tendré que acostumbrarme a la forma abreviada de If.
La estoy usando con settings, ejemplo:

Código:
Public Sub Form_Open()

  Dim Apellido As String = Settings["Nombres/Apellidos"]
  Dim nCols As String = Settings["TableView/Columns"]
  Dim nRows As String = Settings["TableView/Rows"]
  Dim colores As String = Settings["Colores/PanelColor"]

  cbApellidoPrimero.Value = If(IsNull(Apellido), False, Apellido)
  tv1.Columns.Count = If(IsNull(nCols), 2, nCols)
  tv1.Rows.Count = If(IsNull(nRows), 4, nRows)

  For i As Integer = 0 To tv1.Rows.Max
    For j As Integer = 0 To tv1.Columns.Max
      tv1[i, j].Text = Settings["TableView/" & i & "," & j]
    Next
  Next
  Panel1.Background = If(IsNull(colores), &hFFFFFF, colores)

End

Pertenece a "Gambas from a Zip" : Y que todos debemos leer. Gran manual.  (Publicidad no subliminal) Wink

Programming Gambas from Zip/SaveSettings

Saludos
Última modificación: 30-12-2022, 15:20 por Shell.

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
Shordi   30-12-2022, 19:02
#3
(29-12-2022, 22:44)guizans escribió: Hola a todos.

Hago una llamada a un método que llama a una base de datos tipo SQlite3 y me devuelve un Result. Para evitar errores mas adelante del código compruebo si la búsqueda ha tenido éxito. Y lo puedo hacer así:

Código:
If resultado.Available Then
    r = resultado["ID"]
Else
    r = -1
Endif

....
....
Mmmm... sin ver tu código completo no digo esto en voz muy alta, pero así visto me parece que tu función de retornar el Result es, cuando menos confusa. Resultado ya indica por sí mismo si la búsqueda a sido exitosa o no, por lo que volver a preguntar por ello es un tanto inútil... aunque no conozco que visibilidad tiene tu variable resultado ni cómo estás usando la función que consulta la tabla de la BDD. ¿Podrías pasar el código completo?

Saludos.

No podemos regresar
guizans   30-12-2022, 23:19
#4
Hola.

Shordi: El código es un ejemplo de como IIf evalúa las expresiones antes de hacer la evaluación, no está incluido en ningún programa. Comento esto como curiosidad, me llamo mucho la atención.

Shell: No conocía la forma abreviada de If, me la apunto y también me apunto el manual.

Un saludo a todos.
Shordi   31-12-2022, 11:26
#5
(30-12-2022, 23:19)guizans escribió: Hola.

Shordi: El código es un ejemplo de como IIf evalúa las expresiones antes de hacer la evaluación, no está incluido en ningún programa. Comento esto como curiosidad, me llamo mucho la atención.

Shell: No conocía la forma abreviada de If, me la apunto y también me apunto el manual.

Un saludo a todos.
Ah... vale. La evaluación de todos los elementos de las expresiones es un "default" de las operaciones de gambas... hasta donde yo conozco. Así si escribes

[code]

El compilador toma el valor del Boolean e y el texto del objeto  y después evalua si el boolean es = a True y si el texto es = "". Por tanto el boolean se evalua 2 veces (para mirarlo y para compararlo) y el texto también (para extraerlo y para compararlo).
Si quieres velocidad tienes que reformularlo así:

[code]

Un booleano es cierto si no es 0, un texto es falso si está vacío por defecto. La construcción ... and if ... (o or if, claro) ataja la cadena de evaluaciones, por lo que si miBoolean es falso, no se mira nada más y se salta a la siguiente línea de código (el Else o el Endif).

La función iif, que yo sepa, es sólo "Estética", en su interior sigue esas mismas normas de evaluación.

Saludos.
Última modificación: 31-12-2022, 11:27 por Shordi.

No podemos regresar
  
Usuarios navegando en este tema: 3 invitado(s)
Powered By MyBB, © 2002-2024 MyBB Group.
Made with by Curves UI.