Ir para conteúdo

POWERED BY:

Arquivado

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

Gdias

DO WHILE tá dando TIMEOUT

Recommended Posts

Slave amigos...

 

Estou fazendo uma rotina para deletar parágrafos de um texto...

Cada parágrafo está em uma linha de registro no SQL Server e é ordenado por PK_ID_ORDEM.

 

Beleza!

 

O parágrafo 1 (que não pode ser deletado) tem ordem um, o 2 ordem 2 e assim por diante...

 

Quando peço para deletar um parágrafo tenho que alterar a ordem dos demais, por exemplo, se estou deletando o parágrafo 2 de 5, o parágrafo 3 passará (update) para 2, o 4 para 3 e o 5 para 4.

 

Tudo dá certo até o update que está gerando o seguinte erro:

 

 

Tipo de erro:

Microsoft OLE DB Provider for SQL Server (0x80040E31)

Tempo excedido

/Intranet_G4_Local/adms/adm_texto_informativo.asp, line 902

 

 

<%ID_ORDEM    = request("PK_ID_ORDEM")ID_CONTEUDO = request("PK_ID_CONTEUDO")ID_CONTEXTO = request("PK_ID_CONTEXTO")     set objRS12 = createobject("adodb.recordset")     set objRS12.activeconnection = con_adm_txt         SQL12 = "select * From TAB_TEXTO_INFORMATIVO where PK_ID_CONTEUDO = "&ID_CONTEUDO&" and PK_ID_ORDEM <> '1' and PK_ID_ORDEM <> "&ID_ORDEM&" "         objRS12.Open SQL12, ,1,2              set objRS13 = createobject("adodb.recordset")     set objRS13.activeconnection = con_adm_txt         SQL13 = "select isnull(max(PK_ID_ORDEM),0) as total From TAB_TEXTO_INFORMATIVO where PK_ID_CONTEUDO = "&ID_CONTEUDO&" and PK_ID_ORDEM <> '1' and PK_ID_ORDEM <> "&ID_ORDEM&" "         objRS13.Open SQL13, ,1,2                  TOTAL = objRS13("TOTAL")     set objRS14 = createobject("adodb.recordset")     set objRS14.activeconnection = con_adm_txt         SQL14 = "delete From TAB_TEXTO_INFORMATIVO where PK_ID_CONTEUDO = "&ID_CONTEUDO&" and PK_ID_ORDEM = "&ID_ORDEM&" "         objRS14.Open SQL14, ,1,2               set objRS15 = createobject("adodb.recordset")               set objRS15.activeconnection = con_adm_txt'aqui começa o problema                        do while NOT objRS12.EOF                if objRS12("PK_ID_ORDEM") < TOTAL + 1 then                   SQL15 = "update TAB_TEXTO_INFORMATIVO set PK_ID_ORDEM = (PK_ID_ORDEM - 1) where PK_ID_CONTEUDO = '"&ID_CONTEUDO&"' and PK_ID_ORDEM = "&objRS12("PK_ID_ORDEM")&" "                   objRS15.Open SQL15, ,1,2                   'Response.Write "ID_ORDEM : "& objRS12("PK_ID_ORDEM")&"<br>"            end if                 objRS12.MoveNext         loop %>

 

A linha 902 é : objRS15.Open SQL15, ,1,2

Já coloquei na conexão "con_adm_txt.ConnectionTimeout = 20" mas não deu certo.

 

A saber:

 

PK_ID_ORDEM = ordem do parágrafo

ID_CONTEXTO = ID do contexto - por exemplo Avisos e Notícias tem ID 7

TOTAL = é igual ao número de parágrafos fora o parágrafo 1 e o parágrafo deletado.

 

Desde já obrigado pela atenção.

 

 

Abraços,

Gustavo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Session.timeout = 1000Bom o que ta acontecendo é que provavelmente ele ta dando um looping infinito por exemplo... tem algo errado que ta atrasando teu codigo ai...da um recoferida e vai fazendo por partes... e ve aonde começa a dar esse erro =)Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

pra q tudo isso de recordset???o q você pretende fazer??falows

Compartilhar este post


Link para o post
Compartilhar em outros sites

Salve RockLoco...

 

 

Seguinte:

 

O recordset objRS12 está errado, basta que eu coloque PK_ID_ORDEM > "&ID_ORDEM&"

Uso ele para saber quantos parágrafos existem depois do parágrafo que estou querendo deletar.

 

O recordset objRS13 não preciso mais dele, servia apenas para saber o total de parágrafos registrados na base.

 

O recordset objRS14 eu alterei para objRS15 e serve para deletar o parágrafo selecionado.

 

E por fim o OBJRS15 que virou OBJRS14 serve para fazer update nos parágrafos seguintes alterando as suas ordens....

 

Mexi no código mas ainda dá erro... ficou assim...

 

 

<%ACAO       = request("ACAO")ID_ORDEM       = request("PK_ID_ORDEM")ID_CONTEUDO = request("PK_ID_CONTEUDO")ID_CONTEXTO  = request("PK_ID_CONTEXTO")     set objRS12 = createobject("adodb.recordset")     set objRS12.activeconnection = con_adm_txt         SQL12 = "select * From TAB_TEXTO_INFORMATIVO where PK_ID_CONTEUDO = "&ID_CONTEUDO&"  and PK_ID_ORDEM > "&ID_ORDEM&" " 'and PK_ID_ORDEM <> '1'         objRS12.Open SQL12, ,1,2                  do while NOT objRS12.EOF                   set objRS14 = createobject("adodb.recordset")               set objRS14.activeconnection = con_adm_txt                   SQL14 = "update TAB_TEXTO_INFORMATIVO set PK_ID_ORDEM = (PK_ID_ORDEM - 1) where PK_ID_CONTEUDO = '"&ID_CONTEUDO&"' and PK_ID_ORDEM = "&objRS12("PK_ID_ORDEM")&" "                   objRS14.Open SQL14, ,1,2                   objRS14.close                   set objRS14 = nothing                        objRS12.MoveNext         loop     set objRS15 = createobject("adodb.recordset")     set objRS15.activeconnection = con_adm_txt         SQL15 = "delete From TAB_TEXTO_INFORMATIVO where PK_ID_CONTEUDO = "&ID_CONTEUDO&" and PK_ID_ORDEM = "&ID_ORDEM&" "         objRS15.Open SQL15, ,1,2%>

 

Valeu pelo interesse amigo RocKLoco

 

Abraços,

Gustavo

Compartilhar este post


Link para o post
Compartilhar em outros sites

cara, pra q abrir recordset para fazer UPDATE??? não é necessário, basta colocar nomeConexao.Execute(instrucaoUpdate)mas qdo a pessoa escolhe o paragrafo, você num passa o ID dele??? nao entendi nada do q você está querendo fazer, explique como você está fazendo (se é com FORM, sei lá)!!!falows

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ok! Vamos por partes...

 

Eu listo numa página todas os parágrafos que eu tenho de um texto (PK_ID_CONTEUDO) de um determinado assunto (PK_ID_CONTEXTO)... ok?!

 

Cada parágrafo é uma linha de registro no SQL e é ordenado através do PK_ID_ORDEM que determina se o parágrafo é o primeiro, segundo, terceiro e assim vai...

 

Essa página apresenta os parágrafos através de um DO WHILE que monta e apresenta o texto e abaixo um botão de ALTERAR e outro de DELETAR. (é um form)

 

Quando eu clico em DELETAR, passo para a página ADM_Textos.asp o PK_ID_CONTEUDO, PK_ID_CONTEXTO e PK_ID_ORDEM.

 

O que eu preciso?

Se eu cliquei em DELETAR o parágrafo 2 e tenho ao todo 5 parágrafos, preciso além de deletar o registro PK_ID_ORDEM = 2, fazer um UPDATE nos demais PK_ID_ORDEM transformando o 3 em 2, o 4 em 3 e o 5 em 4.

 

Ai vem o código:

 

'recupero as variáveisID_ORDEM    = request("PK_ID_ORDEM")ID_CONTEUDO = request("PK_ID_CONTEUDO")ID_CONTEXTO = request("PK_ID_CONTEXTO")'verifico quantos registros existem depois do parágrafo que quero deletar     set objRS12 = createobject("adodb.recordset")     set objRS12.activeconnection = con_adm_txt         SQL12 = "select * From TAB_TEXTO_INFORMATIVO where PK_ID_CONTEUDO = "&ID_CONTEUDO&"  and PK_ID_ORDEM > "&ID_ORDEM&" " 'and PK_ID_ORDEM <> '1'         objRS12.Open SQL12, ,1,2'faço um do while até que acabe os registros e no meio disso faço o update         do while NOT objRS12.EOF                   con_adm_txt.Execute("update TAB_TEXTO_INFORMATIVO set PK_ID_ORDEM = (PK_ID_ORDEM - 1) where PK_ID_CONTEUDO = '"&ID_CONTEUDO&"' and PK_ID_ORDEM = "&objRS12("PK_ID_ORDEM")&" ")                objRS12.MoveNext         loop'deleto o parágrafo que foi escolhido     set objRS15 = createobject("adodb.recordset")     set objRS15.activeconnection = con_adm_txt         SQL15 = "delete From TAB_TEXTO_INFORMATIVO where PK_ID_CONTEUDO = "&ID_CONTEUDO&" and PK_ID_ORDEM = "&ID_ORDEM&" "         objRS15.Open SQL15, ,1,2

 

Acabo de verificar que além de continuar o TIMEOUT existe outro problema, se não houver mais registros, por exemplo, dos 5 parágrafos eu quero deletar o último, não previ uma ação de deletar somente.

 

 

Mais uma vez obrigado pelo interesse RockLoco

 

Abraços,

Gustavo

 

ps.: se eu comentar a linha EXECUTE dentro do DO WHILE e colocar um Response.Write objRS12("PK_ID_ORDEM"), ele imprime na tela sem problemas.

Compartilhar este post


Link para o post
Compartilhar em outros sites

cara, tente fazer o seguinte1 - recupere o ID e a ORDEM do registro q será removido do FORM2 - remova-o usando DELETE e removendo pelo ID3 - faça um select que busque TODOS os registros ACIMA dessa ordem, por exemplo: SELECT * FROM TABELA WHERE CAMPO_ORDEM > 44 - faça um LOOP varrendo os registros encontrados dando um UPDATE no campo, exemplo: UPDATE TABELA SET CAMPO_ORDEM = CAMPO_ORDEM-1 WHERE CAMPO_CODIGO = codigoacho q isso resolve.... só adapte a lógica a sua programação e faça o teste...outra coisa, para UPDATE, DELETE e INSERT não é necessário abrir um Recordset, basta coloca nomeConexao.Execute(instrucaoSql), ok??? pois eles não retornam registro...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fala RockLoco... beleza...

 

Não tô entendendo por quê do erro, mas está dando TIMEOUT na hora do DO While

 

Quando eu comento a linha de UPDATE e habilito a linha de Response.Write, ele imprime na tela numa boa!

 

Dá uma olhada no código:

 

<%ID_ORDEM    = request("PK_ID_ORDEM")ID_CONTEUDO = request("PK_ID_CONTEUDO")ID_CONTEXTO = request("PK_ID_CONTEXTO")'deleto o ID_Ordem especificado     con_adm_txt.Execute("delete From TAB_TEXTO_INFORMATIVO where PK_ID_CONTEUDO = "&ID_CONTEUDO&" and PK_ID_ORDEM = "&ID_ORDEM&" ")     'recupero os registros acima do ID_Ordem deletado     set objRS12 = createobject("adodb.recordset")     set objRS12.activeconnection = con_adm_txt         SQL12 = "select * From TAB_TEXTO_INFORMATIVO where PK_ID_CONTEUDO = "&ID_CONTEUDO&"  and PK_ID_ORDEM > "&ID_ORDEM&" " 'and PK_ID_ORDEM <> '1'         objRS12.Open SQL12, ,1,2' vejo qual o último ID_Ordem              set objRS13 = createobject("adodb.recordset")     set objRS13.activeconnection = con_adm_txt         SQL13 = "select isnull(max(PK_ID_ORDEM),0) as total From TAB_TEXTO_INFORMATIVO where PK_ID_CONTEUDO = "&ID_CONTEUDO&" " 'and PK_ID_ORDEM <> '1' and PK_ID_ORDEM <> "&ID_ORDEM&" "         objRS13.Open SQL13, ,1,2                  TOTAL = objRS13("TOTAL")'se o ID_Ordem for diferente do último ID_Ordem, faço o do while                  if ID_ORDEM <> TOTAL then          	 DIM iContador          	 iContador = 1 	 do while not objRS12.eof     con_adm_txt.Execute("update TAB_TEXTO_INFORMATIVO set PK_ID_ORDEM = "&iContador&" where PK_ID_CONTEUDO = '"&ID_CONTEUDO&"' and PK_ID_ORDEM = "&objRS12("PK_ID_ORDEM")&" ")     'Response.Write "ID_ORDEM : "& objRS12("PK_ID_ORDEM")&"<br><br>" 	 objRS12.MoveNext 	 iContador = iContador + 1 	 loop         end if%>

Tá dano o erro:

 

Não é possível exibir a página Ocorreu um problema com a página que você está tentando acessar e não é possível exibi-la. --------------------------------------------------------------------------------Experimente o seguinte:Clique no botão Atualizar ou tente novamente mais tarde.Abra a cs7266et301 home page e procure os links para as informações desejadas. HTTP 500.100 - Servidor interno Erro - erro do ASPInternet Information Services--------------------------------------------------------------------------------Informações técnicas (para a equipe de suporte)Tipo de erro:Microsoft OLE DB Provider for SQL Server (0x80040E31)Tempo excedido/Intranet_G4_Local/adms/adm_texto_informativo.asp, line 934

Não sei mais o que faço com essa mer@#...

Tem alguma idéia do problema?

 

Valeu a força...

 

 

Gustavo

Compartilhar este post


Link para o post
Compartilhar em outros sites

tente assim.. dei uma modificada!!!

<%ID_ORDEM    = request("PK_ID_ORDEM")ID_CONTEUDO = request("PK_ID_CONTEUDO")ID_CONTEXTO = request("PK_ID_CONTEXTO")'deleto o ID_Ordem especificadocon_adm_txt.Execute("delete From TAB_TEXTO_INFORMATIVO where PK_ID_CONTEUDO = "&ID_CONTEUDO&" and PK_ID_ORDEM = "&ID_ORDEM&" ")'recupero os registros acima do ID_Ordem deletadoSQL12 = "select * From TAB_TEXTO_INFORMATIVO where PK_ID_CONTEUDO = "&ID_CONTEUDO&"  and PK_ID_ORDEM > "&ID_ORDEM&" " 'and PK_ID_ORDEM <> '1'set objRS12 = con_adm_txt.Execute(SQL12)if NOT objRS12.EOF then while not objRS12.eof  con_adm_txt.Execute("update TAB_TEXTO_INFORMATIVO set PK_ID_ORDEM = PK_ID_ORDEM-1 where PK_ID_CONTEUDO = '"&ID_CONTEUDO&"' and PK_ID_ORDEM = "&objRS12("PK_ID_ORDEM")&" ")  'Response.Write "ID_ORDEM : "& objRS12("PK_ID_ORDEM")&"<br><br>"  objRS12.MoveNext Wendend ifobjRS12.Closeset objRS12 = nothing%>

Compartilhar este post


Link para o post
Compartilhar em outros sites

porque voce nao faz um update para todos e nao um por um...

 

tipo:

 

<%ID_ORDEM    = request("PK_ID_ORDEM")ID_CONTEUDO = request("PK_ID_CONTEUDO")ID_CONTEXTO = request("PK_ID_CONTEXTO")'deleto o ID_Ordem especificadocon_adm_txt.Execute("delete From TAB_TEXTO_INFORMATIVO where PK_ID_CONTEUDO = "&ID_CONTEUDO&" and PK_ID_ORDEM = "&ID_ORDEM&" ")'atualizo os registros acima do ID_Ordem deletadocon_adm_txt.Execute("update TAB_TEXTO_INFORMATIVO set PK_ID_ORDEM = PK_ID_ORDEM-1 where PK_ID_CONTEUDO = '"&ID_CONTEUDO&"' and PK_ID_ORDEM > " & ID_ORDEM)%>

mais fácil e rápido

Compartilhar este post


Link para o post
Compartilhar em outros sites

Meu amigo rOcKLoCoMuitíssimo obrigado pela ajuda, funcionou perfeitamente, mais uma vez você me tirou de um sufoco...Valeu mesmo... fico te devendo (rs)Abraços,Gustavops.: obrigado também pela atenção do FABRICIOGOMES e do DackAle

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.