Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Inside

Não repetir resultados ao randomizar

Recommended Posts

Caros amigos,

 

estou usando este código para randomizar resultados. O código mostra 8 banners mas as vezes repete um deles. Fica estranho 2 banners iguais na mesma tela.

 

Existe alguma maneira para não repetir os banners uma vez que é randomico?

dim rsb2, sqlb2, count_meio, pagesize_meio

count_meio = 0
pagesize_meio = 8

Set rsb2 = Server.CreateObject("ADODB.Recordset")

sqlb2 = "SELECT banners_vezes.id_banner, banners.id,anunciante_id,vezes_apareceu,arquivo FROM banners_vezes,banners WHERE tipo = 0 and banners_vezes.id_banner = banners.id ORDER BY RAND()"

rsb2.Open sqlb2, conn_p, 3

if rsb2.eof and rsb2.bof then
	response.write ""
else
do while not rsb2.eof and count_meio < pagesize_meio
count_meio = count_meio + 1

conn_p.execute("UPDATE banners SET vezes_apareceu = vezes_apareceu + 1 WHERE id = "& rsb2("id") &"")
%>
          <li class="cbp-item cbp-l-grid-masonry-height0">
            <div class="cbp-caption-defaultWrap"><img src="<%= strEndereco_http %>arquivos/anunciantes/<%= rsb2("arquivo") %>" alt="" /></div>
          </li>
<%
rsb2.movenext
loop
end if

set rsb2 = nothing

Obrigado pela atenção de todos

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cada banner é cadastrado nesta tabela de acordo com o plano, se ele plano 1 ele cadastrado 1 veze nesta tabela, plano 2, 5 vezes é para aumentar a chance de aparecer mais vezes do que o plano 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tente

 

 

sqlb2 = "SELECT distinct banners_vezes.id_banner, banners.id,anunciante_id,vezes_apareceu,arquivo FROM banners_vezes,banners WHERE tipo = 0 and banners_vezes.id_banner = banners.id ORDER BY RAND()"

Compartilhar este post


Link para o post
Compartilhar em outros sites

podes sempre por o resultado do primeiro banner numa session ou variavel e quando ele vai colocar o segundo banner verifica se é igual.

 

Pode nao ser o ideal mas desenrasca. :s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Caro razs

 

Fis isso tbm, mas realmente pula o que já foi mas como são 8 banners continua tendo a possibilidade de aparecer o primeiro banner ou terceiro, assim por diante.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Inside blza!

 

Bem vamos dando as ideias rsrsrs, uma ora alguma te ajuda.

 

você disse que são 8 banners que irão se randomizar mas não repetir.... E depois que rodar os 8 banner o que acontece? volta do início novamente?

 

 

Irá te dar um trabalhinho a mais, mas poderá criar um campo, por exemplo: "Exibiu" e ao ser exibido esse banner ele será setado na base de dados, ou de outra forma que você desejar armazenar essa informação. (Pois poderá querer limpar esses campos tb, para novas exibições, tem que pensar nisso tb).

 

Quando o sistema for fazer as novas exibições dos banners irá pular esse que já está setado e não será mais exibido.

 

Sei lá, foi como eu disse, vamos dar ideias até que uma possa te ajudar.

 

vlw

Compartilhar este post


Link para o post
Compartilhar em outros sites

talvez dando um numero a cada um, tipo banner1, banner2 e guardando o numero numa var e sempre que for colocar um banner novo faz um split a var e verifica se o numero do banner existe na var...


ou ate mesmo

 

sem split, guardas os nomes dos banners que vais colocando numa var separados por virgula e sempre que ele for colocar um novo banner fazes instr com o nome do novo banner para ver se ele existe nessa variavel.

 

 

 

var = InStr(banners_ja_colocados, novo_banner)

 

aconselho-te a fazer um trim aos nomes dos banners antes de os colocares na variavel e ao novo_banner pelo sim pelo nao.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como eu faço para acumular valores em uma variável? Fiz desta forma mas não deu certo:

 

banners_mostrados = "" & rsb2("id") & ","
<%= banners_mostrados %>

Compartilhar este post


Link para o post
Compartilhar em outros sites

olha este exemplo:

 

RANDOM com registros de um banco de dados sem repetição.

<%


' Gravamos o Recordset em um Array Bidimensional

Set strRS = Server.CreateObject("ADODB.RecordSet")

strRS.Open "SELECT * FROM membros ", strConexao, 3, 3

arySub = strRS.getRows()



' Fechamos a conexão pois não usaremos mais

strRS.Close

Set strRS = Nothing

strConexao.Close

Set strConexao = Nothing



Dim TotalReg, TotalNum, vran, x, encontrou, arrGerados(0)

Dim Numreg, verGerado, var_arrGerados, xLoop



Function GeraRegistros(TotalNum)

TotalReg=Cint(uBound(arySub,2)) ' Encontramos o Maior Array Gerado

vran = 1



For x = 0 To TotalNum-1 ' LOOP de 1 p/ Total solicitado

encontrou = 1

Randomize() ' Geramos o primeiro Random

NumReg = Cint((rnd*TotalReg))

verGerado = Split(var_arrGerados,",") ' Verifica se nº gerado

For xLoop = LBound(verGerado) To UBound(verGerado)

IF Trim(verGerado(xLoop)) = Trim(NumReg) Then

'Este "response" comentado abaixo, indica qual número se repetiram

'E não armazena no Array único, fazendo gerando um novo Random

'response.write "<b>[ "& verGerado(xLoop) &","& NumReg &" ]</b><br> "

x = x - 1

encontrou = 2

Exit For

End IF

Next

IF encontrou = 1 Then ' NÃO ENCONTROU, gera o próximo número



IF vran = 1 Then ' primeiro (Verificar este trecho)

arrGerados(0) = NumReg

vran = 2

Else

arrGerados(0) = arrGerados(0) &","& NumReg

End IF

var_arrGerados = Join(arrGerados)

End IF

Next

GeraRegistros = var_arrGerados

End Function

' Array gerado, podemos iniciar a formatação de perguntas

number = GeraRegistros(3)



verNum = Split(number, ",")

For x = LBound(verNum) to UBound(verNum)

response.write arySub(0,verNum(x)) &"."

response.write arySub(1,verNum(x)) &"<br>"

Next

%>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Caros

 

Eu tentei isso aqui mas noa rolou, continua repetindo:

dim rsb2_id, rsb2, sqlb2, count_meio, pagesize_meio

'Capta IDs para mostrar
set rsb2_id = conn_p.execute("SELECT banners_vezes.id_banner, banners.id,anunciante_id,vezes_apareceu,arquivo FROM banners_vezes,banners WHERE tipo = 0 and banners_vezes.id_banner = banners.id ORDER By RAND() LIMIT 0,8")
do while not rsb2_id.eof

'Concatenando IDS
'Resultado semelhante a isso: banners.id <> 25 and banners.id <> 8 and banners.id <> 24 and banners.id <> 20 and banners.id <> 31 and banners.id <> 31 and banners.id <> 35 and banners.id <> 31

id_banner2 = "banners.id <> " & rsb2_id("id") & ""
id_prepara2 = "" & id_banner2 & " and "
id_concatenado2 = id_concatenado2 & "" & id_prepara2 & ""

rsb2_id.movenext
loop

id_final2 = left(id_concatenado2,len(id_concatenado2)-4)

response.write "<!-- " & id_final2 & " -->"

count_meio = 0
pagesize_meio = 8

Set rsb2 = Server.CreateObject("ADODB.Recordset")

sqlb2 = "SELECT banners_vezes.id_banner, banners.id,anunciante_id,vezes_apareceu,arquivo FROM banners_vezes,banners WHERE " & id_final2 & " and tipo = 0 and banners_vezes.id_banner = banners.id ORDER BY RAND()"

rsb2.Open sqlb2, conn_p, 3

if rsb2.eof and rsb2.bof then
	response.write ""
else
do while not rsb2.eof and count_meio < pagesize_meio
count_meio = count_meio + 1

%>

            <div class="cbp-caption-defaultWrap"><img src="<%= strEndereco_http %>arquivos/anunciantes/<%= rsb2("arquivo") %>" alt="" /></div>
          
<%
rsb2.movenext
loop
end if

set rsb2 = nothing

Compartilhar este post


Link para o post
Compartilhar em outros sites

Era para rodar com o "SELECT DISTINCT" conforme sugestão do colega Motta.

Se você tiver mais registros na base do que vai mostrar, tente adicionar também no final da instrução o "LIMIT".

 

Att.

Compartilhar este post


Link para o post
Compartilhar em outros sites

vc mudou a linha: number = GeraRegistros(3)
O número 3 indica quantos registros vc deseja, no caso, serão gerados 3 registros aleatórios diferentes.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.