Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

vpess

Erro "Expressão demasiado complexa"

Mensagens Recomendadas

vpess

Boa tarde,

Preciso da vossa ajuda para um problema que me surgiu.

Numa aplicação que estou a fazer tive a necessidade de fazer uma query muito grande, ou seja, com bastantes union all, acontece que ao executar a mesma dá-me o erro "Expressão demasiado complexa".

A query tem cerca de 60 select's unidos com o union all.

Cumps.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
renafi

Nem disseste qual a BD nem a linguagem que estás a trabalhar...

Mas há um limite no que toca a esse assunto.

Uma das soluções é dividires essa query a meio e criares um cursor para cada uma.

Depois pesquisas a união entre os dois cursores.


Oracle Certified Professional - AdministraçãoOracle Certified Professional - Pl/sqlMCPD - Microsoft Certified Professional DeveloperMCTS - Microsoft Certified Technology Specialist

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
vpess

Boas,

Peço desculpa, realmente não coloquei toda a informação.

Estou a usar vb6 com bd em access.

Aqui vai a query:

SQL = "select m1 as ref, mq1 as qtt, mn1 as ns, servico as ser from ot where exportado=0 and mq1<>'' and m1<>'' union all " & _
"select m2 as ref, mq2 as qtt, mn2 as ns, servico as ser from ot where exportado=0 and mq2<>'' and m2<>'' union all " & _
"select m3 as ref, mq3 as qtt, mn3 as ns, servico as ser from ot where exportado=0 and mq3<>'' and m3<>'' union all " & _
"select m4 as ref, mq4 as qtt, mn4 as ns, servico as ser from ot where exportado=0 and mq4<>'' and m4<>'' union all " & _
"select m5 as ref, mq5 as qtt, mn5 as ns, servico as ser from ot where exportado=0 and mq5<>'' and m5<>'' union all " & _
"select m6 as ref, mq6 as qtt, mn6 as ns, servico as ser from ot where exportado=0 and mq6<>'' and m6<>'' union all " & _
"select m7 as ref, mq7 as qtt, mn7 as ns, servico as ser from ot where exportado=0 and mq7<>'' and m7<>'' union all " & _
"select m8 as ref, mq8 as qtt, mn8 as ns, servico as ser from ot where exportado=0 and mq8<>'' and m8<>'' union all " & _
"select m9 as ref, mq9 as qtt, '' as ns, servico as ser from ot where exportado=0 and mq9<>'' and m9<>'' union all " & _
"select m10 as ref, mq10 as qtt, '' as ns, servico as ser from ot where exportado=0 and mq10<>'' and m10<>'' union all " & _
"select m11 as ref, mq11 as qtt, '' as ns, servico as ser from ot where exportado=0 and mq11<>'' and m11<>'' union all " & _
"select m12 as ref, mq12 as qtt, '' as ns, servico as ser from ot where exportado=0 and mq12<>'' and m12<>'' union all " & _
"select m13 as ref, mq13 as qtt, '' as ns, servico as ser from ot where exportado=0 and mq13<>'' and m13<>'' union all " & _
"select m14 as ref, mq14 as qtt, '' as ns, servico as ser from ot where exportado=0 and mq14<>'' and m14<>'' union all " & _
"select m15 as ref, mq15 as qtt, '' as ns, servico as ser from ot where exportado=0 and mq15<>'' and m15<>'' union all " & _
"select m16 as ref, mq16 as qtt, '' as ns, servico as ser from ot where exportado=0 and mq16<>'' and m16<>'' union all " & _
"select m17 as ref, mq17 as qtt, '' as ns, servico as ser from ot where exportado=0 and mq17<>'' and m17<>'' union all " & _
"select m18 as ref, mq18 as qtt, '' as ns, servico as ser from ot where exportado=0 and mq18<>'' and m18<>'' union all " & _
"select m19 as ref, mq19 as qtt, '' as ns, servico as ser from ot where exportado=0 and mq19<>'' and m19<>'' union all " & _
"select m20 as ref, mq20 as qtt, '' as ns, servico as ser from ot where exportado=0 and mq20<>'' and m20<>'' union all " & _
"select m21 as ref, mq21 as qtt, '' as ns, servico as ser from ot where exportado=0 and mq21<>'' and m21<>'' union all " & _
"select m22 as ref, mq22 as qtt, '' as ns, servico as ser from ot where exportado=0 and mq22<>'' and m22<>'' union all " & _
"select m23 as ref, mq23 as qtt, '' as ns, servico as ser from ot where exportado=0 and mq23<>'' and m23<>'' union all "
SQL = SQL & _
"select m24 as ref, mq24 as qtt, '' as ns, servico as ser from ot where exportado=0 and mq24<>'' and m24<>'' union all " & _
"select m25 as ref, mq25 as qtt, '' as ns, servico as ser from ot where exportado=0 and mq25<>'' and m25<>'' union all " & _
"select m26 as ref, mq26 as qtt, '' as ns, servico as ser from ot where exportado=0 and mq26<>'' and m26<>'' union all " & _
"select m27 as ref, mq27 as qtt, '' as ns, servico as ser from ot where exportado=0 and mq27<>'' and m27<>'' union all " & _
"select m28 as ref, mq28 as qtt, '' as ns, servico as ser from ot where exportado=0 and mq28<>'' and m28<>'' union all " & _
"select m29 as ref, mq29 as qtt, '' as ns, servico as ser from ot where exportado=0 and mq29<>'' and m29<>'' union all " & _
"select m30 as ref, mq30 as qtt, '' as ns, servico as ser from ot where exportado=0 and mq30<>'' and m30<>'' union all " & _
"select m31 as ref, mq31 as qtt, '' as ns, servico as ser from ot where exportado=0 and mq31<>'' and m31<>'' union all " & _
"select m32 as ref, mq32 as qtt, '' as ns, servico as ser from ot where exportado=0 and mq32<>'' and m32<>'' union all " & _
"select m33 as ref, mq33 as qtt, '' as ns, servico as ser from ot where exportado=0 and mq33<>'' and m33<>'' union all " & _
"select m34 as ref, mq34 as qtt, '' as ns, servico as ser from ot where exportado=0 and mq34<>'' and m34<>'' union all " & _
"select m35 as ref, mq35 as qtt, '' as ns, servico as ser from ot where exportado=0 and mq35<>'' and m35<>'' union all " & _
"select m36 as ref, mq36 as qtt, '' as ns, servico as ser from ot where exportado=0 and mq36<>'' and m36<>'' union all " & _
"select m37 as ref, mq37 as qtt, '' as ns, servico as ser from ot where exportado=0 and mq37<>'' and m37<>'' union all " & _
"select m38 as ref, mq38 as qtt, '' as ns, servico as ser from ot where exportado=0 and mq38<>'' and m38<>'' union all  " & _
"select m39 as ref, mq39 as qtt, '' as ns, servico as ser from ot where exportado=0 and mq39<>'' and m39<>'' union all  " & _
"select m40 as ref, mq40 as qtt, '' as ns, servico as ser from ot where exportado=0 and mq40<>'' and m40<>'' union all " & _
"select m41 as ref, mq41 as qtt, '' as ns, servico as ser from ot where exportado=0 and mq41<>'' and m41<>'' union all " & _
"select m42 as ref, mq42 as qtt, '' as ns, servico as ser from ot where exportado=0 and mq42<>'' and m42<>'' union all  " & _
"select m43 as ref, mq43 as qtt, '' as ns, servico as ser from ot where exportado=0 and mq43<>'' and m43<>'' union all  " & _
"select m44 as ref, mq44 as qtt, '' as ns, servico as ser from ot where exportado=0 and mq44<>'' and m44<>''  union all " & _
"select m45 as ref, mq45 as qtt, '' as ns, servico as ser from ot where exportado=0 and mq45<>'' and m45<>'' union all "
SQL = SQL & _
"select s1 as ref, sq1 as qtt, '' as ns, servico as ser from ot where exportado=0 and sq1<>'' and s1<>'' union all  " & _
"select s2 as ref, sq2 as qtt, '' as ns, servico as ser from ot where exportado=0 and sq2<>'' and s2<>'' union all  " & _
"select s3 as ref, sq3 as qtt, '' as ns, servico as ser from ot where exportado=0 and sq3<>'' and s3<>'' union all " & _
"select s4 as ref, sq4 as qtt, '' as ns, servico as ser from ot where exportado=0 and sq4<>'' and s4<>'' union all " & _
"select s5 as ref, sq5 as qtt, '' as ns, servico as ser from ot where exportado=0 and sq5<>'' and s5<>'' union all " & _
"select s5 as ref, sq5 as qtt, '' as ns, servico as ser from ot where exportado=0 and sq5<>'' and s5<>'' "

rs.Open SQL, conn, 1, 3

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
M6

Não admira que a BD se queixe da expressão ser demasiado complexa, até um humano tem dificuldade em perceber isso...

Pelo (pouco) que consegui perceber, creio que isso se talvez se consiga fazer com group bys.

No limite podem-se criar tabelas sumariadoras já com essa info "marstigada" e depois é só consultar essas tabelas.

Uma nota: pelo (de novo, pouco) que percebi, parece-me que essa tabela tem graves problemas estruturais, em particular parece-me que há colunas que estão a fazer a vez de linhas...


10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
vpess

Boas,

Não diria que as colunas estão a fazer de linhas, pertence tudo ao mesmo registo.  A questão de separar na expressão é por causa da exportação e integração em outro software.

Mas já agora podem postar algum exemplo de como solucionar???

Esta expressão funciona acho que num máximo até 45 select unidos, depois dá o tal erro.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
M6

Boas,

Não diria que as colunas estão a fazer de linhas, pertence tudo ao mesmo registo.

Pois, mas pelo pouco que percebi, eu diria que sim. Essa m1, m2, ... m45 e afins costumam indicar que quem desenhou o modelo não sabia bem o que estava a fazer e que na realidade isso deviam ser linhas e não colunas...

Isso não é algo do tipo referências de um produto ou algo assim?

E os mq não são as quantidades?

A questão de separar na expressão é por causa da exportação e integração em outro software.

Isso é irrelevante para o problema...

Mas já agora podem postar algum exemplo de como solucionar???

Esta expressão funciona acho que num máximo até 45 select unidos, depois dá o tal erro.

Acho que isso está tão embrulhado que a coisa talvez só vá lá com tabelas de sumário (resolvendo via bd).

Arranja uma tabela de sumário onde guardas essa informação da seguinte forma:

Ref, Qtt, ns, servico

E depois fazes insert into from select de cada uma dessa queries que tens no union all, uma de cada vez.

Depois basta-te fazer o select a essa tabela e exportar os dados.

Podes também fazer isso no lado do VB fazes cada uma dessas queries à vez e vais guardando os valores em memória ou em ficheiro, juntando-lhe o resultado da query seguinte e assim sucessivamente.


10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
vpess

Boas,

Aqui vai um print da form com os objectos.

appz.png

Assim já percebem que isto não pode ser guardado como linhas. Senão como faria na altura de chamar o datareport e para preencher os dados fazendo a busca á bd?????

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
M6

vpes, uma imagem desse form não ajuda em nada à compreensão do problema.

Não compreendo o que ai está a ser mostrado em termos de base de dados.

A informação da coluna da direita complementa a informação da coluna da esquerda, ou são independentes e isso é apenas uma listagem corrida mostrada em duas colunas?

O HomeGateway é o m1, o telefone o m43, etc.?

Se assim é, essa informação pode e deve ser representada como linhas.


10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
jpaulino

Estou a usar vb6 com bd em access.

Estás a fazer essa query no Access no no VB? Já tentaste no Access?

Não podes mostrar a base de dados? Parece-me que é um problema de arquitectura.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
vpess

Boas,

Aqui vai informação toda:

Form VB6:

appzm.png

DataReport:

datarf.png

Base de Dados:

http://www.2shared.com/file/12216088/990e469f/OT_online.html

A aplicação está a funcionar neste processo todo, apenas não consigo exportar porque para além destes select's dos materiais aplicados ainda tenho de unir outros de serviços prestados. Ai o erro pois a expressão fica com mais de 50 select's.

Eu também pensei na hipótese de colocar isto como linhas, mas não me pareceu grande solução.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
M6

Confirma-se então: essas colunas deviam ser linhas e essa base de dados apresenta graves problemas..

vpess, aconselho-te seriamente a aprenderes a desenhar bases de dados relacionais.

Repara que se quiseres adicionar mais um produto tens de mexer na estrutura da base de dados e na aplicação, o que não faz qualquer sentido.

Tens é de ter uma tabela de produtos, onde tens os teus produtos registados, e uma tabela de vendas, saídas, stocks ou o que quer que seja a actividade referente a esses produtos, onde registas num único grupo os produtos e as respectivas quantidades.

Lê o artigo de base de dados da Revista Programar http://www.revista-programar.info/front/edition/5 creio que te pode dar uma ajuda. E se queres/necessitas de continuar a usar bases de dados, então é imperativo que aprendas o modelo relacional.


10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
M6

Eu sei onde quer chegar com a sua explicação, mas continuo a achar que vou ter problemas a fazer o datareport.

Não acredito.

Há milhares de aplicações com modelo bem feito por esse mundo fora que fazem o que também estás a fazer e não acredito que tenham problemas por terem as coisas bem feitas.

Já o contrário se mostra verdade: estás a ter problemas por teres o modelo mal feito...


10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
M6

Vê aqui http://www.databaseanswers.org/data_models/ qual o modelo que melhor se adequa ao teu problema.

Edit: provavelmente o que caso será algures um dos "'Bang for the Buck' Models".


10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
falco
A query tem cerca de 60 select's unidos com o union all.

Se fosse a ti, revia o schema... Isso parece-me exagerado.

O modelo de dados parece-me fraquinho.

O M6 já disse isto e eu reforço.

Também não escolheria o acce$$ para isto...

Já agora o form é uma atrocidade no que toca à usabilidade... Já reparaste que até precisaste de pintar legendas para o entendermos?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.