Ir para conteúdo

POWERED BY:

Arquivado

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

ZioNN

Paginação com UNION ALL não funciona.Como resolver?

Recommended Posts

Olá pessoal,

 

Com o objetivo de fazer uma busca no conteúdo de várias tabelas ao mesmo tempo, criei uma view que consulta diversas tabelas utilizando a instrução UNION ALL do SQL-Server 2008. Esta view retorna todos os registros de todas as tabelas envolvidas de uma só vez

 

Na página ASP faço uma consulta a esta view para filtrar os resultados por uma palavra-chave e ordená-los por qqer critério desejado, porém meu script velho e batidão de paginação não funciona! E isto acontece somente com essa consulta. Com qualquer outra consulta do sistema funciona normalmente, há anos.

 

Minha paginação é a mais batida de todas, utilizando RecordCount(), AbsolutePage(), PageSize(), etc.

 

Quando eu removo a consulta à view do UNION ALL e substituo por uma consulta simples em apenas uma das tabelas, a paginação funciona perfeitamente.

 

O que pode estar acontecendo? Tem algo a ver com o uso do UNION ALL? Como resolvo isso?

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

não é pra ter problema, eu uso apenas UNION no oracle e funciona a paginação. Normalmente eu amarro todos os selects do UNION em outro SELECT pra "tornar" um novo objeto

 

não tem algum order by na sua view?

tem como postar o codigo da paginação?

Compartilhar este post


Link para o post
Compartilhar em outros sites

não é pra ter problema, eu uso apenas UNION no oracle e funciona a paginação. Normalmente eu amarro todos os selects do UNION em outro SELECT pra "tornar" um novo objeto

 

não tem algum order by na sua view?

tem como postar o codigo da paginação?

 

Criei uma view que retorna tudo

 

SELECT     'noticias' AS tabela, cod_noticia, data_noticia, titulo_noticia, descricao_noticia
FROM         ptl_vw_Noticias
WHERE     tipo_noticia = 1
UNION ALL
SELECT     'clippings' AS tabela, cod_clipping, data_publicacao_clipping, titulo_clipping, resumo_clipping
FROM         ptl_tb_clippings
UNION ALL
SELECT     'releases' AS tabela, cod_release, data_publicacao_release, titulo_release, resumo_release
FROM         ptl_tb_releases
UNION ALL
SELECT     'vinhetas' AS tabela, cod_vinheta, data_cadastro_vinheta, titulo_vinheta, descricao_vinheta
FROM         ptl_tb_vinhetas
UNION ALL
SELECT     'convencoes' AS tabela, cod_convencao, data_convencao, titulo_convencao, descricao_convencao
FROM         ptl_vw_Convencoes
UNION ALL
SELECT     'eventos' AS tabela, cod_evento, data_evento, titulo_evento, descricao_evento
FROM         ptl_vw_Eventos
UNION ALL
SELECT     'apresentacoes' AS tabela, cod_apresentacao, data_cadastro_apresentacao, titulo_apresentacao, descricao_apresentacao
FROM         ptl_vw_Apresentacoes
UNION ALL
SELECT     'mensagens' AS tabela, cod_mensagem, data_cadastro_mensagem, titulo_mensagem, descricao_mensagem
FROM         ptl_vw_Mensagens
UNION ALL
SELECT     'imagens_alta' AS tabela, cod_imagem_alta, data_cadastro_imagem_alta, titulo_imagem_alta, resumo_imagem_alta
FROM         ptl_tb_imagens_alta

Depois fiz um select nela

 

SQLEv = "SELECT tabela, cod_noticia, data_noticia, titulo_noticia, descricao_noticia" & _
	" FROM ptl_vw_Busca" & _
	" WHERE titulo_noticia LIKE '%" & sChave & "%'" & _
	" OR descricao_noticia LIKE '%" & sChave & "%'" & _
	" ORDER BY data_noticia DESC"

E este é o código da minha paginação que sempre funcionou.

 

Dim intRegistrosPorPagina, intPag, intTotalRegistros, intRegistro
intPag = Request.QueryString("pg")
if (not IsNumeric(intPag)) or (intPag = "") or (IsNull(intPag)) then
intPag = 1
else
intPag = cint(intPag)
end if
intRegistrosPorPagina = 10 ' define o número de registros por página

depois vem

 

objRsEv.Open SQLEv, oConn, 1, 3
If Not objRsEv.Eof Then
									

'paginação inicio
	intTotalRegistros = objRsEv.RecordCount
	objRsEv.PageSize = intRegistrosPorPagina 'define o tamanho da página no recordset
	totalPaginas = objRsEv.PageCount
	if intPag < 1 then intPag = 1
	if intPag > objRsEv.PageCount then intPag = objRsEv.PageCount
	if not objRsEv.EOF then objRsEv.AbsolutePage = intPag
'paginação fim
										
	counter = 1
	Do While Not objRsEv.Eof AND counter <= intRegistrosPorPagina

objRsEv.movenext
counter = counter + 1
Loop

basicamente é isso

 

detalhe: sempre usei o Native provider do SQL 2008 e nunca tive qqer problema com a paginação, embora esta seja a primeira vez que o fiz usando com UNION ALL

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não consegui resolver a pendência acima ainda. Já tentei tudo que passou pela minha cabeça. Alguma alma caridosa? Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Ted,

 

Segue abaixo o print

 

SELECT tabela, cod_noticia, data_noticia, titulo_noticia, descricao_noticia FROM ptl_vw_Busca WHERE titulo_noticia LIKE '%palavrachave%' OR descricao_noticia LIKE '%palavrachave%' ORDER BY data_noticia DESC

Ela não dá erro no SQL, só a paginação que não funciona.

 

Erro que retorna é

 

ADODB.Recordset error '800a0bb9'

 

Arguments are of the wrong type, are out of acceptable range, or are in conflict with one another.

 

/portal/busca_listagem.asp, line 47

 

A linha 47 possui

 

if not objRsEv.EOF then objRsEv.AbsolutePage = intPag

O que pode ser?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ted,

 

Tentei trocar o provider de OLEDB para ODBC e funcionou, portanto parece ser uma limitação do provider OLEDB native do SQL Server 2008 para este caso específico de UNION ALL, pq nas demais queries todas do portal funciona normalmente, já que uso OLEDB pra tudo.

 

você tem alguma idéia por que isso acontece só neste caso específico? E como fazer pra funcionar usando o provider OLEDB?

 

Eu usava

 

'OLE DB

'Provider=SQLNCLI10;Server=myServerAddress;Database=myDataBase;Uid=myUsername; Pwd=myPassword;

 

E usei agora

 

'ODBC

'Driver={SQL Server Native Client 10.0};Server=myServerAddress;Database=myDataBase;Uid=myUsername;Pwd=myPassword;

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Normalmente, o seguinte erro irá acontecer se você tentar definir o cursor inválido ou propriedades de bloqueio em um objeto Recordset.

 

verifique se naun usou o nomes "amigáveis" para os valores (como adLockReadOnly), ao invés das constantes inteiro , sem incluir Adovbs.inc.

 

dá um

Response.Write SQL 'na sua string

Response.End

Compartilhar este post


Link para o post
Compartilhar em outros sites

Normalmente, o seguinte erro irá acontecer se você tentar definir o cursor inválido ou propriedades de bloqueio em um objeto Recordset.

 

verifique se naun usou o nomes "amigáveis" para os valores (como adLockReadOnly), ao invés das constantes inteiro , sem incluir Adovbs.inc.

 

dá um

Response.Write SQL 'na sua string

Response.End

 

Xan (resumindo pra ficar mais fácil)

 

Eu uso assim:

 

SQLEv = "SELECT tabela, cod_noticia, data_noticia, titulo_noticia, descricao_noticia" & _

" FROM ptl_vw_Busca" & _

" WHERE titulo_noticia LIKE '%" & sChave & "%'" & _

" OR descricao_noticia LIKE '%" & sChave & "%'" & _

" ORDER BY data_noticia DESC"

 

 

objRsEv.Open SQLEv, oConn, 1, 3

If Not objRsEv.Eof Then

 

Esta query impressa fica

 

SELECT tabela, cod_noticia, data_noticia, titulo_noticia, descricao_noticia FROM ptl_vw_Busca WHERE titulo_noticia LIKE '%palavrachave%' OR descricao_noticia LIKE '%palavrachave%' ORDER BY data_noticia DESC

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.