Ir para conteúdo

POWERED BY:

Arquivado

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

Claudio Neto

[Resolvido] Tratamento de erro

Recommended Posts

Preciso fazer uma consulta em uma tabela baseado em uma data (o nome da tabela é composto pela data).

Mas pode ser que ocorre de não existir tabela com essa data, então será gerado um erro.

 

Tenho como tratar isso para que se for selecionada uma data que não tem tabela, apareça uma mensagem na tela?

 

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

qual mensagem de erro? como está fazendo?

 

me parece que falta ai um If rs.eof then....

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá amigo, pelo que entendi, se o nome da tabela (composto por data) não existir no bd fatalmente retornará um erro da sua Sql certo?

Neste caso a primeira coisa a fazer e verificar se a tabela existe no bd. Depois montar a condição/Sql.

Para listar as tabelas do bd pesquise por: OpenSchema e adSchemaTables

 

Abs.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Trata a variavel antes. Ex.

If Not isDate(campoData) Then
campoData = "1/1/1900"
End If
Tipo isso... aí sempre terá uma data.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Interpretei mal a dúvida...

 

Mas com certeza um On Error Next Resume, resolve o probelma.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Interpretei mal a dúvida...

 

Mas com certeza um On Error Next Resume, resolve o probelma.

É da tabela, não do campo.

 

Fala Yuri, tudo bem? Fiz um relatório legal aqui, depois que colocar no ar te passo o link para você ver.

 

Legal, eu programo em VB, e em VB é normal utilizarmos o "on error goto", mas não sabia se em ASP isso era possível, mas pela informação acima vejo que sim...

 

Só que assim, depois como eu faço para saber o número do erro para poder tratá-lo?

 

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Seguinte, coloquei isso antes de toda minha extrutura:

 

CODE

on error resume next

 

if err.number <> 0 then

response.write(err.number)

response.write(err.description)

end if

 

Mas não funcionou, continua dando o erro no meio da página, o que está errado?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não precisa de ON ERROR RESUME NEXT nesse caso. Você irá usar um IF para verificar se tem algo em seu RecordSet, algo +/- assim:

IF SeuRS.EOF THEN
'Não tem essa data no BD
ELSE
'Tem essa data no BD
END IF

Compartilhar este post


Link para o post
Compartilhar em outros sites

"On Error Resume Next" - É bom para debugar, para o user acho que não tem muita utilidade...

 

Tá meio bagunçado mas veja se isso te ajuda:

Primeiro, abra sua conexão com o DB

adSchemaTables = 20
Set rsTables = suaConexao.OpenSchema(adSchemaTables)

nameRequestTable = "nome_tabela"

Do While Not rsTables.EOF
	If Trim(rsTables("TABLE_TYPE")) = "TABLE" Then
		If rsTables("TABLE_NAME") = nameRequestTable Then
			strResults = rsTables("TABLE_NAME")
		End If
	End If
rsTables.Movenext
Loop

If strResults <> "" Then
	response.write "Nome Tabela: <b>"& strResults &"</b>"
Else
	response.write "Tabela Não Encontrada"
End If

Abs.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Salgado, me desculpe, mas você está se confundindo ao tentar me ajudar.

 

O que quero é ver se existe uma tabela, e não um valor em uma tabela, não tenho como usar rs("dealgumacoisa") nesse caso.

 

E Public2004, me parece que sua dica também não é o que preciso, mas de qualquer forma não entendi muito o funcionamento disso que fez. Vamos lá:

 

adSchemaTables = 20
Set rsTables = suaConexao.OpenSchema(adSchemaTables)

nameRequestTable = "nome_tabela" 'aqui você passa o nome da tabela que quer procurar, correto?

Do While Not rsTables.EOF
	If Trim(rsTables("TABLE_TYPE")) = "TABLE" Then 'ai aqui eu não entendi o que você está comparando
		If rsTables("TABLE_NAME") = nameRequestTable Then 'e depois você analisa no seu banco já aberto se tem o nome de uma tabela no registro (eu não tenho essa outra tabela com os nomes de todas as tabelas que possuo, então não tenho como utilizar disto)
			strResults = rsTables("TABLE_NAME")
		End If
	End If
rsTables.Movenext
Loop

If strResults <> "" Then
	response.write "Nome Tabela: <b>"& strResults &"</b>"
Else
	response.write "Tabela Não Encontrada"
End If

O que acontece é o seguinte, diariamente me são geradas tabelas, mas pode ser que em alguns dias elas não sejam geradas, e quando são, o nomes delas ficam em função da data (tabela_aaaa_mm_dd).

 

E para o cliente é gerado um relatório, que ele seleciona em função da data. Nos dias que não houverem tabelas com a data especificada, a página irá gerar um erro, pois executou um select em uma tabela inexistente.

 

Com o tratamento de erro, eu posso evitar que esse erro ocorra, mostrando uma mensagem ao usuário (data inválida).

 

Mas de qualquer forma, eu consegui o que preciso, com a utilização de on error resume next.

 

Obrigado a todos que ao menos tentaram me ajudar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Que bom que tenha resolvido!

 

Apenas para esclarecer o cód. da minha sugestão:

'Abriu a conexão - Ok

adSchemaTables = 20
Set rsTables = suaConexao.OpenSchema(adSchemaTables)

nameRequestTable = "nome_tabela" 'Exatamente, o nome da tabela que vai procurar.

Do While Not rsTables.EOF
	If Trim(rsTables("TABLE_TYPE")) = "TABLE" Then 'Um BD tem vários objetos, mas quero verificar apenas as Tabelas.

'Esta condição na verdade verifica se existe alguma tabela com o nome requisitado e não dentro dela.
'Caso encontrar, armazena o nome da tabela na variável: strResults
		If rsTables("TABLE_NAME") = nameRequestTable Then
			strResults = rsTables("TABLE_NAME")
		End If

	End If
rsTables.Movenext
Loop
'Fecha e destrói os objetos criados

'Feito a verificação, agora é só dar continuidade, montar a Sql com a variável ou enviar msg de erro ao user
If strResults <> "" Then
	response.write "Nome Tabela: <b>"& strResults &"</b>"
Else
	response.write "Tabela Não Encontrada"
End If

Abs.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Desculpe por não ter entendido o seu problema, mas que bom que conseguiu resovê-lo. Poderia compartilhar a sua solução?

 

Indico que use sem o on error, você pode listar para seu usuário apenas as datas/tabelas que efetivamente existem em seu BD usando o OpenSchema do Objeto Connection do ADO.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Que bom que tenha resolvido!

 

Apenas para esclarecer o cód. da minha sugestão:

'Abriu a conexão - Ok

adSchemaTables = 20
Set rsTables = suaConexao.OpenSchema(adSchemaTables)

nameRequestTable = "nome_tabela" 'Exatamente, o nome da tabela que vai procurar.

Do While Not rsTables.EOF
	If Trim(rsTables("TABLE_TYPE")) = "TABLE" Then 'Um BD tem vários objetos, mas quero verificar apenas as Tabelas.

'Esta condição na verdade verifica se existe alguma tabela com o nome requisitado e não dentro dela.
'Caso encontrar, armazena o nome da tabela na variável: strResults
		If rsTables("TABLE_NAME") = nameRequestTable Then
			strResults = rsTables("TABLE_NAME")
		End If

	End If
rsTables.Movenext
Loop
'Fecha e destrói os objetos criados

'Feito a verificação, agora é só dar continuidade, montar a Sql com a variável ou enviar msg de erro ao user
If strResults <> "" Then
	response.write "Nome Tabela: <b>"& strResults &"</b>"
Else
	response.write "Tabela Não Encontrada"
End If

Abs.

 

Essa linha Set rsTables = suaConexao.OpenSchema(adSchemaTables), serve para se conectar com com o database e procurar uma tabela no banco?

Isso era o que eu não conhecia, por isso não entendi seu código. Me parece interessante, já procurei por isso antes para trabalhar com VB, mas ninguém soube me ajudar, então a solução que achei foi trabalhar com o tratamento de erro, que em VB é muito mais eficiente que em ASP, diga-se de passagem. Mas irei testar essa forma também.

 

Obrigado.

 

Ah, mas só para constar a forma que fiz:

 

CODE

<%

on error resume next

 

dim expSQL

 

expSQL = "select * from tabela_" & year(date) & "_" & month(date) & "_" & day(date)

set rs = server.createobject("adodb.recordset")

rs.open expSQL, cn, 3, 3

 

if err.number <> 0 then

If Err.number<>0 then

if err.number = -2147217865 then

session("mensagemfinal") = "Não existem dados para essa data"

response.redirect("ok.asp")

end if

End If

end if

%>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Essa linha Set rsTables = suaConexao.OpenSchema(adSchemaTables), serve para se conectar com com o database e procurar uma tabela no banco?

Exato! No exemplo, sugeri a procura apenas pelo nome da tabela, pois com o método "OpenSchema" é possível verificar toda a estrutura da mesma, tais como: colunas, tipo de dados, etc...

 

Abs.

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.