Mostrar Datos aleatorios en datawindows con bd

Una consulta quisiera obtener de forma aleatoria datos de la bd (mysql) sin que se repitan en un datawidows freform. En el datawindows actualmente se visualizan todos los datos, lo que me gustaria es que con un boton siguiente al dar click cargara los siguientes datos de forma aleatoria. Espero sus recomendaciones.. Y se podrian ayudarme con algun ejemplo.

1 Respuesta

Respuesta
1

Cual es el diseño de tu windows y el código que usaste hasta ahora

Hola, con lo de Windows si se refiere al tipo de ventana es Main. 

// conexion de bd
SQLCA.DBMS = "ODBC"
SQLCA.logid = "user"

SQLCA.Logpass = ""
SQLCA.AutoCommit = False
SQLCA.DBParm = "ConnectString= ' DSN=sistem;UID=user;PWD= "
connect;

dw_1.settransobject(sqlca)

dw_1.retrieve()

y en el boton siguiente 

dw_1.ScrollNextRow()

y aqui me gustaria que el proximo registro sea aleatorio.. pero no se como hacerlo si podria ayudarme con algun ejemplo, muchas gracias por su tiempo. 

long ls_num,ls_reg

ls_num=dw_1.rowcunt()

ls_reg=RAND(ls_num)

DW_1.SCROLLTOROW(ls_reg)

La funcion es rowcount()

Hola, muchas gracias por su ayuda... una inquietud je je, como seria para que no se repetiera, para probarlo use pocos registros y se repiten. Como seria la manera de que no se repetieran.? Muchas gracias por su ayuda.

El problema es que un numero aleatorio no puedes evitar que se repita, si quieres evitar esto tendrás que usar pocos registros . Porque tendrías que almacenar el numero de registro que busco y luego compararlo con la lista(array), si son muchos registro tendría que recorrer el toda la lista

Gracias, por su recomendación. Si podría ayudarme con un ejemplo por favor . investigando encontré este ejemplo, actualmente en la bd existe 10 registros. Cuando le doy siguiente con el botón repite los registros y me gustaría evitar la repetición. Agradecería mucho un ejemplo. Muchas gracias por su tiempo

//// Obtener el nº de filas
ll_num_filas = dw_1.rowcount()
//
//// Recorrer todas las filas
for ll_contador = 1 to ll_num_filas
//// Obtener el valor de la columna (para la fila actual)
ls_valor = dw_1.object.pregunta[ll_contador]
//// Buscar la primera fila que tiene el mismo valor
ll_fila = dw_1.find("pregunta= '" + ls_valor + "'", 0, ll_contador)
//// Si la primera fila es la actual, es porque no se ha insertado antes
if ll_fila = ll_contador then
//// Insertar el elemento en el arreglo
li_ultimo_elemento ++
ls_arreglo[li_ultimo_elemento] = ls_valor
end if
next

Otra opcion seria que le agregaras un campo adicional, en el datawindows en tiempo de diseño.

Ejemplo : si tu tabla tiene dos campos codigo y descipcion

select  codigo,descripcion , '0' mostrado from tabla 

el campo mostrado debe estar  invisible  y el codigo seria

long ls_num,ls_reg,i

string ls_mostrado

ls_num=dw_1.rowcount()

ls_reg=RAND(ls_num)

ls_mostrado=dw_1.object.mostrado[ls_reg]

if  ls_mostrado='0' then

DW_1.SCROLLTOROW(ls_reg)

dw_1.object.mostrado[ls_reg]='1'

else

  for i=1 to ls_num

   ls_reg=RAND(ls_num)

    ls_mostrado=dw_1.object.mostrado[ls_reg]

           if  ls_mostrado='0' then

                 DW_1.SCROLLTOROW(ls_reg)

                    dw_1.object.mostrado[ls_reg]='1'

                  i=ls_num

          end if

next

end if

Hola, gracias por responder aun no me quedo claro je je

Otra opción seria que le agregaras un campo adicional, en el datawindows en tiempo de diseño.

Ejemplo : si tu tabla tiene dos campos código y descripción

select  codigo,descripcion , '0' mostrado from tabla 

La bd tiene 5 campos. Que son: Id, Pregunta, A, B, Correcto. ¿Aquí en la bd tengo que agregar el campo por ejemplo mostrado? ¿Y luego agregarlo al datawindows? ¿O cómo seria?

En el datawindows no en la tabla. Convert sintaxis ahí agregas el campo adicional

Muchas gracias, estaba probando con 10 registros. y funciona, aunque al cerrar y volver a ejecutar sigue el mismo orden avanza de dos en dos cada que lo ejecuto. es normal que lo haga de esta forma??

La verdad es que la primera vez que usa esta función.

estaba investigando y mencionaron randomize entonces cambie el RAND POR randomize pero no funciono asi que lo deje asi como usted lo puso, aunque habria alguna otra alternativa?. igual preguntarle como evitar que al cargar la ventaana ya trae los datos del Dw. entonces el primer registro que tiene en el campo mostrado esta como "0" y al dar click en boton siguiente con forme avanza vuelve a traer el primer registro y entonces le asigna el "1" muestra dos veces el primer registro como podria evitar que se repita el primer regstro que aparece. 

en el open tiene 

la conexion

y el dw_1.retrieve() - aqui recupera el primer registro y en campo mostrado tiene "0" y conforme avanza con el boton siguiente lo vuelve a mostrar y ya le asigna el "1" como podria mostrar los datos sin que se repita el uno que tree? jejejej disculpe por tanta molestia.

Se más especifico en tu pregunta

Disculpe por tanta molestia la pregunta es recuperar los datos de la bd de forma aleatoria, con su ayuda ya funciona de forma aleatoria se lo agradezco mucho. Mi pregunta de ahora es como evitar que el primer registro que carga el datawidows aparezca dos veces le adjunto dos capturas la primera captura es cuando ejecuto y carga el datawindows con un registro y la segunda captura vuelve aparecer el mismo registro después de que le de clic en botón siguiente muestra los otros registro pero vuelve a mostrar el primer registro que aparece cuando lo ejecuto. Y no se como evitar que aparezca dos veces. Muchas gracias por su tiempo. ¿Cómo evitaría que se repitiera? Nuevamente Muchas Gracias por su tiempo. Espero haber sido claro.

En el open de la ventana tengo esto

dw_1.settransobject(sqlca)
dw_1.retrieve()

captura1

captura2

En el evento open agrega tu código

dw_1.object.mostrado[1]='1'

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas