No Pensais Que Se Debería Corregirse Result En Un Bucle For-Next


Objetivo: No Pensais Que Se Debería Corregirse Result En Un Bucle For-Next
Estaba yo pensando que si en este supuesto debería ser mejorado Result

Código: [Descargar] [Ocultar]
  1. For n = 0 To resultado.Max 
  2. .[n, 0].Text = resultado["Descripción"] 
  3. resultado.MoveNext 
  4. Next 
  5. resultado.MoveFirst 'Si no ponemos esto el cursor estaría al final y cuando lo invocas te da un error 
  6.  


Y lo que pasa es que cuando termina el bucle el estado de resultado que no es mas que un Result el puntero esta al final como es de prever. Pero si necesitamos seguir usándolo a mi desde luego me pasa muy a menudo y es que se me olvida volver el puntero al primer elemento con resultado.MoveFirst y lo que propongo es como una regla, cuando metemos un objeto Result en un For-Next tras el final del bucle, este bucle debería saber de forma automática que el Result debería volver a su estado inicial osea hacer automáticamente resultado.MoveFirst

En fin, piénsenlo, debemos de evolucionar, no es una idea para nada ilógica.

Saludos y espero opiniones

última edición por gambafeliz el Jueves, 11 Junio 2020, 05:35; editado 2 veces
Perfil MP  
Objetivo: Re: No Pensais Que Se Debería Corregirse Result En Un Bucle For-Next
Hola

Me resulta raro usar Result dentro de un bucle, ya que precisamente lo que hace result es iterar en los resultados de la consulta. Me parece un error de diseño o quizás esté equivocado y tenga algún sentido...

De hecho, en la segunda iteración del bucle, el objeto result ya no devuelve resultados como es lógico, a menos que se inicialice de algún modo. ¿Puedes explicar (si te apetece) cuál es la motivación para hacer eso?

Saludos

Perfil MP  
Objetivo: Re: No Pensais Que Se Debería Corregirse Result En Un Bucle For-Next
jguardon escribió: [Ver mensaje]
Hola

Me resulta raro usar Result dentro de un bucle, ya que precisamente lo que hace result es iterar en los resultados de la consulta. Me parece un error de diseño o quizás esté equivocado y tenga algún sentido...

De hecho, en la segunda iteración del bucle, el objeto result ya no devuelve resultados como es lógico, a menos que se inicialice de algún modo. ¿Puedes explicar (si te apetece) cuál es la motivación para hacer eso?

Saludos


Hooola jguardon

Para mi Result es una tabla por decirlo así. Result en sí no itera nada, aunque si es un objeto como una tabla el cual es posible recorrerlo con sus diferentes propiedades MOVE.

Imaginemos que el Result tiene una lista de 2 elementos y una sola columna.

1. Creamos un bucle For-Next e iteramos o llamamos elemento a elemento.
2. Cuando llega al final de la lista el cursor esta lógicamente al final
3. El bucle termina su iteración y salimos fuera del bucle para proseguir con la siguiente linea de código

Te expongo una breve explicación: Tu y yo somos programadores y sabemos que el cursor tras el bucle queda al final, pero no siempre te das cuenta y escribes nuevo código tras este bucle para seguir usando el Result, (ERROR) tras el bucle, el Result sin acordarte que debes inicializar el cursor al primer elemento, a mi me pasa mucho simplemente me abstraigo y sigo programando. Pero el diseñador de un lenguaje, lo sabe estas en un bucle y sabe que están los dos elementos (For-Next y Result) por que no inicializa el cursor de Result automáticamente sin que intervenga el usuario (el programador) es algo que obliga a recordar y además un Result.MoveFirst después de un bucle es feo.

Por supuesto es una simple opinión, pero creo que se puede hacer, es una evolución del lenguaje, y mejora la usabilidad para el usuario del lenguaje, además que es algo lógico y no es complicado de hacer, también puede ser que como es un objeto independiente (Result), y tiene un funcionamiento como el actual, simplemente no interacciona con su entorno, pero para eso debería estar el compilador, el cual debería evolucionar y detectar errores simples como este, añadiendo de forma automática la linea siguiente al bucle For-Next e implementar Result.MoveFirst por poner un ejemplo.

En fin, esta es mi nueva explicación.

Saludos.

Perfil MP  
Objetivo: Re: No Pensais Que Se Debería Corregirse Result En Un Bucle For-Next
sugiero algunas formas de usar un result

Esta para rercorrer el result
Dim res As Result

While res.Available
print res["Apellido"]
res.MoveNext
Wend

Llegado el caso res.MoveFirst asegura la vuelta a empezar

Esta otra forma la uso en evento _Data y uso resShow.MoveTo(Row)
Public Sub GridView1_Data(Row As Integer, Column As Integer)

Dim fpic As Variant
Dim fgrp As String
Dim pic As Picture
Dim xFld As String
Dim ipic As String

For Each fgrp In stxFld
If ctnGrp.Exist(fgrp) Then
If ctnGrp[fgrp] = "Image" Then
fpic = ctnGrp.Key
Endif
Endif
Next

If resShow.Available Then
resShow.MoveTo(Row)
xFld = stxFld[Column]

GridView1[Row, Column].Text = resShow[xFld]
If stxUni.Count > 0 Then
If xFld = stxUni[0] Then
If fpic <> "" Then
ipic = adi &/ resShow[fpic]
If Exist(ipic) Then
If Stat(ipic).Type = gb.File Then
pic = Image.Load(ipic).Stretch(GridView1.Rows.Height, GridView1.Rows.Height).Picture
GridView1[Row, Column].Picture = pic
Endif
Endif
Endif
Endif
Endif

If (Row Mod 2) = 0 Then
GridView1[Row, Column].Background = Color.TextBackground
Else
GridView1[Row, Column].Background = Color.Background
Endif

Endif
GridView1.Refresh

End


Saludos

Perfil MP  
Objetivo: Re: No Pensais Que Se Debería Corregirse Result En Un Bucle For-Next
Hola, gambafeliz

Volviendo a leer tu post, ya estoy dudando. Como lo has editado, ya no me acuerdo si al principio declarabas el objeto result dentro o fuera del bucle. En cualquier caso, el objeto y la consulta hay que declararla fuera del bucle, evidentemente, e ir iterando los resultados que devuelve el objeto result. Éste, en mi opinión, sólo es reutilizable si se vuelve a declarar o si -como bien dices- recolocas el cursor al principio. Para mí, lo más limpio es volverlo a declarar y justo después utilizarlo. Eso automáticamente devolverá los resultados de la nueva consulta. O bien, volver a llamar al procedimiento o función que efectúa la consulta.

Pero como cada cual hace las cosas a su manera, mientras no se produzcan errores inesperados, eres libre de mover el cursor donde quieras.

Para la representación gráfica de los resultados, el ejemplo de tincho usando el evento Data es el ideal, en lugar de ir escribiendo mediante bucles las celdas con cada campo.

Saludos

Perfil MP  
Objetivo: Re: No Pensais Que Se Debería Corregirse Result En Un Bucle For-Next
tincho escribió: [Ver mensaje]
sugiero algunas formas de usar un result

Esta para rercorrer el result
Llegado el caso res.MoveFirst asegura la vuelta a empezar


Gracias, esto me será útil, lo conozco pero se me va la pelota y no lo uso.

Quiero dejar claro que aunque lo agradezco en realidad quería una opinión sobre mi pregunta, pero bueno, lo digo simplemente para centrar el tema.

tincho escribió: [Ver mensaje]


Esta otra forma la uso en evento _Data y uso resShow.MoveTo(Row)


Esta bien pero se te ha olvidado algo muy importante y es decir en que momento se produce el evento _Data que yo sinceramente lo desconocía. Y que para que sea mas didáctico para los lectores pienso que se debería al menos explicar esto que te cuento, lo hace mas claro para los novatos en gambas como yo.

Gracias tincho y no veas mi conversación como algo atacante sino simplemente constructivo. Saludos.

Perfil MP  
Objetivo: Re: No Pensais Que Se Debería Corregirse Result En Un Bucle For-Next
jguardon escribió: [Ver mensaje]
Hola, gambafeliz

Volviendo a leer tu post, ya estoy dudando. Como lo has editado, ya no me acuerdo si al principio declarabas el objeto result dentro o fuera del bucle.


Nunca se vio la declaración de Result pero para dejarlo claro lo hago evidentemente antes del bucle sino peta el programa.


jguardon escribió: [Ver mensaje]

En cualquier caso, el objeto y la consulta hay que declararla fuera del bucle, evidentemente, e ir iterando los resultados que devuelve el objeto result. Éste, en mi opinión, sólo es reutilizable si se vuelve a declarar


Vuelvo a declarar pero entonces no estas entendiendo mi solicitud de este hilo, gastando una linea de código para o Declarar nuevamente el Result o para MoveFirst, me temo que estoy perdiendo el tiempo, sino entendéis lo que pretendo, es solo una conversación donde explico un caso y digo que el compilador debe corregir automaticamente lo Result después de un bucle For o While ya que lo saca tincho, da igual es que lo lógico es evitar que pete el programa por algo que el desarrollador del lenguaje conoce que va a pasar por un olvido del programador o usuario de Gambas.

En fin.

jguardon escribió: [Ver mensaje]

o si -como bien dices- recolocas el cursor al principio. Para mí, lo más limpio es volverlo a declarar y justo después utilizarlo. Eso automáticamente devolverá los resultados de la nueva consulta.


Esto no lo entiendo del todo, si lo redeclaro de nuevo, esto hace una llamada a la base de datos o en su defecto haces una declaración vinculando el anterior Result.


En fin no te como mas la cabeza, gracias por participar en mi consulta, te mando saludo, joven.

Perfil MP  

Página 1 de 1


  
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
Puede descargar archivos
No puede publicar eventos en el calendario

   

Está utilizando la versión (Lo-Fi). Para ver la versión completa del foro, haga clic aquí.

Powered by Icy Phoenix based on phpBB
Design by DiDiDaDo

Página generada en:: 0.0881s (PHP: 29% SQL: 71%)
Consultas SQL: 29 - Debug off - GZIP Activado