Ir para conteúdo

POWERED BY:

Arquivado

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

Vitor SF

A cada repeticao do loop é feito um novo update na mesma linha, e o ac

Recommended Posts

Olá pessoal!

 

Estou com um problema muito estranho e nao faco ideia de como resolver.

 

Tenho um site de Eleiçoes, isto siginifica: "muitas pessoas acessando e votando ao mesmo tempo".

 

Em uma rotina existe um loop que faz um update para cada iteração(repeticao), porem este loop é executado tao rapido que o acess nao consegue executar o comando e liberar para o proximo comando. Então o que acontece é que a segunda repeticao pega o valor velho, enquanto a primeira esta fazendo os calculos.

 

Não tenho certeza mas acho que é isso que esta acontecendo... vou dar um exemplo pra explicar melhor:

 

analisem as linhas de codigo

do until i = 6

 

strCandidato="Select * from candidato where codigo="&cpfStream

set rsCandidato=server.CreateObject("ADODB.RecordSet")

rsCandidato.Open strCandidato, strConnDB

 

qtVotos = cInt(rsCandidato("qtVotos")) 'Quantidade atual de votos

peso = cInt(rsQuesito("peso")) 'Novo Voto

somaVotos = qtVotos + peso

 

sqlUpdate = "UPDATE candidato SET qtVotos = "&somaVotos

sqlUpdate = sqlUpdate&" WHERE codigo = "&cpfStream&" and referencia="&ref

connDB.execute sqlUpdate

 

i = i + 1

loop

 

Eu executei este codigo apoes perceber o erro gerei um relatorio que imprime os valores a cada repeticao, o relatorio é:

 

sequencia de peso de voto: 4,3,1,2,6,2

 

repeticoes:

1)

qtVotos: 0

peso: 4

soma: 4

 

2)

qtVotos: 0

peso: 3

soma: 3

 

3)

qtVotos: 4

peso: 1

soma: 5

 

4)

qtVotos: 3

peso: 2

soma: 5

 

5)

qtVotos: 5

peso: 6

soma: 11

 

6)

qtVotos: 5

peso: 2

soma: 7

 

 

Reparem como se alterna as somas.... uma solução que eu arranjei de imediato foi dar um delay para permitir que os calculos sejam executados cada um com seu tempo, mas eu acho que isso nao resolveria se muitas pessoas utilizassem o acess ao mesmo tempo...

 

 

MINHAs DUVIDAs

O que eu estou supondo está relamente acontecendo(o acess nao consegue calcular rapidamente)?

Como resolver isso?

a programacao gerou este problema de conflito com uma unica pessoa, entao consequentemente se o sistema estiver sendo usado por varios usuarios ao mesmo tempo, esses conflitos so irao aumentar?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Meu, com certeza não é problema do access....

 

Verifique se a sua lógica está correta, outra boa coisa seria fechar o recordset antes de abrí-lo novamente.

Uma coisa que percebi é que você está misturando dois recordsets mas não está dando o move.next no rsQuesito("peso"). A cada volta do loop ele estará com o mesmo valor.

Não sei se o código abaixo resolve porque não tenho o código todo, mas parece que seria assim o correto

 

strCandidato="Select * from candidato where codigo="&cpfStreamdo until i = 6set rsCandidato=server.CreateObject("ADODB.RecordSet")rsCandidato.Open strCandidato, strConnDBqtVotos = cInt(rsCandidato("qtVotos")) 'Quantidade atual de votospeso = cInt(rsQuesito("peso")) 'Novo VotosomaVotos = qtVotos + peso sqlUpdate = "UPDATE candidato SET qtVotos = "&somaVotossqlUpdate = sqlUpdate&" WHERE codigo = "&cpfStream&" and referencia="&refconnDB.execute sqlUpdatersCandidato.CloseSet RSCandidato=nothingrsQuesito.movenexti = i + 1loop

Compartilhar este post


Link para o post
Compartilhar em outros sites

hmmm...o movenext do recordset Quesito esta em outro lugar... este nao eh o problema...o codigo que citei acima so tem a parte principal... aonde esta ocorrendo o erro...eu ja tentei fechar o RS antes de abrir de novo... mas continua a mesma coisa...tenho quase certeza que eh o acess, pq qd eu coloco um delay no final do loop(antes de comecar outro loop), o codigo executa perfeitamente...a solucao que um professor de faculdade me deu seria migrar do acess para o Mysql... vamo ver se da certo hehehese der certo... acess nunca mais.... =P

Compartilhar este post


Link para o post
Compartilhar em outros sites

o movenext do recordset Quesito esta em outro lugar... este nao eh o problema...o codigo que citei acima so tem a parte principal... aonde esta ocorrendo o erro...

? Se entendi direito você faz um SELECT para pegar o valor do campo "qtVotos" de um certo registro. Depois faz um UPDATE desse mesmo registro, alterando apenas o campo "qtVotos", somando um valor a ele. Certo?Se for isso mesmo, um problema pode ser o fato de você estar fazendo um UPDATE em um registro aberto.Uma forma de melhorar isso poderia ser, mudando um pouco a sugestão do arr:
set rsCandidato=server.CreateObject("ADODB.RecordSet")strCandidato="Select qtVotos from candidato where codigo="&cpfStreamdo until i = 6rsCandidato.Open strCandidato, strConnDBqtVotos = cInt(rsCandidato("qtVotos")) 'Quantidade atual de votosrsCandidato.Closepeso = cInt(rsQuesito("peso")) 'Novo VotosomaVotos = qtVotos + pesosqlUpdate = "UPDATE candidato SET qtVotos = "&somaVotossqlUpdate = sqlUpdate&" WHERE codigo = "&cpfStream&" and referencia="&refconnDB.execute sqlUpdatei = i + 1loop
Mas se realmente for o mesmo campo do mesmo registro tanto no SELECT quanto no UPDATE tente assim:
sqlUpdate = "UPDATE candidato SET qtVotos = qtVotos + " & cInt(rsQuesito("peso"))sqlUpdate = sqlUpdate & "  WHERE codigo = "&cpfStream&" and referencia="&refconnDB.execute sqlUpdate
:huh:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se for isso mesmo, um problema pode ser o fato de você estar fazendo um UPDATE em um registro aberto.

eu ja tentei fechar o registro no final do loop... continuou com o mesmo problema...

Vitor.Não é o Access.Verifique seu código.

...então qual é o problema???

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.