Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Estou fazendo um pequeno script para alterar a ordenação de registros no banco de dados e toda vez que eu executo este script, ele parece estar sendo executado DUAS vezes, pois está alterando a ordem em dois níveis, quando deveria ser apenas um.
Exemplo: se pego o produto na posição 1 e peço para alterar para a posição 2, ele vai para a 3. Mas o mais bizarro é que quando a página recarrega, a listagem mostra ele na posição 2, correta, porém no BD o registro já está na posição 3. Chamando a página novamente (agora sem enviar os parametros offset e iCod) a listagem já se altera e mostra o registro na posição 3, conforme o banco. Bizarro!!!
Testei no Chrome e Firefox.
É um script que roda na mesma página que lista os registros. Quando o usuário clica na seta pra cima ou para baixo, o redireciono para a mesma página com os parametros offset e iCod, sendo offset (0 ou 1) e iCod o id do produto.
Onde está o erro? Por favor, ajudem.
Vejam o código abaixo.
' Alteração de ordem
If trim(offset) <> "" AND IsNumeric(iCod) Then
Set objRsOrder = Server.CreateObject("Adodb.Recordset")
'Recupero a posição atual do registro
SQLOrder = "SELECT ordem_produto FROM ns_tb_produtos WHERE cod_produto = " & iCod
objRsOrder.Open SQLOrder, oConn, 1, 3
If Not objRsOrder.Eof Then
posAtual = objRsOrder("ordem_produto")
End If
objRsOrder.Close
Set objRsOrder = nothing
'Recupero a posição do registro logo acima ou abaixo, conforme a escolha do usuário
SQLOrder = "SELECT TOP 1 cod_produto, ordem_produto FROM ns_tb_produtos"
if offset = 1 OR offset <> 0 Then
SQLOrder = SqlOrder & " WHERE ordem_produto > " & posAtual & " ORDER BY ordem_produto"
elseif offset = 0 Then
SQLOrder = SqlOrder & " WHERE ordem_produto < " & posAtual & " ORDER BY ordem_produto DESC"
end If
Set objRsOrder = Server.CreateObject("Adodb.Recordset")
objRsOrder.Open SQLOrder, oConn, 1, 3
if Not objRsOrder.Eof Then
codProdSuperior = objRsOrder("cod_produto")
ordemProdutoSuperior = objRsOrder("ordem_produto")
SQLOrder = "UPDATE ns_tb_produtos SET ordem_produto = " & ordemProdutoSuperior & " WHERE cod_produto = " & ParaNumeralSQL(iCod)
'Atualiza posição do registro em edição
oConn.Execute(SQLOrder)
SQLOrder = "UPDATE ns_tb_produtos SET ordem_produto = " & posAtual & " WHERE cod_produto = " & ParaNumeralSQL(codProdSuperior)
'Atualiza posição do registro superior
oConn.Execute(SQLOrder)
End if
objRsOrder.Close
Set objRsOrder = nothing
end if
Fala Xanburzum! Obrigado por ajudar.
Então, como "teste desespero" separei o script da página de listagem. Agora chamo a função em outra página que depois retorna para a listagem, e desta forma funciona perfeitamente, sem qualquer alteração no código que postei acima.
Alguma ideia do que pode estar acontecendo, pois quando o script está na mesma página da listagem de produtos dá o problema mencionado anteriormente?
Muito esquisito.
Como funciona, acho que o problema não está no ponto que você mencionou, certo? Ou não? rsss
Abs
Pode estar relacionada com a cache, tente isto, ao ordenar na mesma página no fim do script faça o response.redirect novamente para essa página
tente , como citado acima, limpar , use isso para limpar
response.expires = 0
response.expiresabsolute = Now() -1
response.addHeader "pragma","no-cache"
response.addHeader "cache-control","private"
Response.CacheControl = "no-cache"
Session.Contents.RemoveAll()
Session.Abandon
e dê um response.write na sua string SQL para ver o que esta sendo passado.
Fala Xanburzum, já existe isso no script, exceto o Session pois trata-se de uma área admin que só funciona logado com Sessions.
>
Estou fazendo um pequeno script para alterar a ordenação de registros no banco de dados e toda vez que eu executo este script, ele parece estar sendo executado DUAS vezes, pois está alterando a ordem em dois níveis, quando deveria ser apenas um.
Exemplo: se pego o produto na posição 1 e peço para alterar para a posição 2, ele vai para a 3. Mas o mais bizarro é que quando a página recarrega, a listagem mostra ele na posição 2, correta, porém no BD o registro já está na posição 3. Chamando a página novamente (agora sem enviar os parametros offset e iCod) a listagem já se altera e mostra o registro na posição 3, conforme o banco. Bizarro!!!
Testei no Chrome e Firefox.
É um script que roda na mesma página que lista os registros. Quando o usuário clica na seta pra cima ou para baixo, o redireciono para a mesma página com os parametros offset e iCod, sendo offset (0 ou 1) e iCod o id do produto.
Onde está o erro? Por favor, ajudem.
Vejam o código abaixo.
' Alteração de ordem
If trim(offset) <> "" AND IsNumeric(iCod) Then
Set objRsOrder = Server.CreateObject("Adodb.Recordset")
'Recupero a posição atual do registro
SQLOrder = "SELECT ordem_produto FROM ns_tb_produtos WHERE cod_produto = " & iCod
objRsOrder.Open SQLOrder, oConn, 1, 3
If Not objRsOrder.Eof Then
posAtual = objRsOrder("ordem_produto")
End If
objRsOrder.Close
Set objRsOrder = nothing
'Recupero a posição do registro logo acima ou abaixo, conforme a escolha do usuário
SQLOrder = "SELECT TOP 1 cod_produto, ordem_produto FROM ns_tb_produtos"
if offset = 1 OR offset <> 0 Then
SQLOrder = SqlOrder & " WHERE ordem_produto > " & posAtual & " ORDER BY ordem_produto"
elseif offset = 0 Then
SQLOrder = SqlOrder & " WHERE ordem_produto < " & posAtual & " ORDER BY ordem_produto DESC"
end If
Set objRsOrder = Server.CreateObject("Adodb.Recordset")
objRsOrder.Open SQLOrder, oConn, 1, 3
if Not objRsOrder.Eof Then
codProdSuperior = objRsOrder("cod_produto")
ordemProdutoSuperior = objRsOrder("ordem_produto")
SQLOrder = "UPDATE ns_tb_produtos SET ordem_produto = " & ordemProdutoSuperior & " WHERE cod_produto = " & ParaNumeralSQL(iCod)
'Atualiza posição do registro em edição
oConn.Execute(SQLOrder)
SQLOrder = "UPDATE ns_tb_produtos SET ordem_produto = " & posAtual & " WHERE cod_produto = " & ParaNumeralSQL(codProdSuperior)
'Atualiza posição do registro superior
oConn.Execute(SQLOrder)
End if
objRsOrder.Close
Set objRsOrder = nothing
'o seu formulário vem depois deste script
'aqui faça um redirect para a mesma página
feche as conexões
oconn.close
set oconn = nothing
response.redirect "para a mesma página"
end if
...
form
coloquei o código no fim do seu script
ao inves de deixar
if offset = 1 OR offset <> 0 Then
deixe apenas
if offset = 1
e faça o teste