1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

[RESOLVIDO] Função em SQL SERVER + VAriavel vazia

Discussão em 'Programação' iniciada por RicAlmeida, 26 de Novembro de 2008. (Respostas: 18; Visualizações: 3305)

  1. RicAlmeida

    RicAlmeida Power Member

    Boas,

    Por exemplo eu tenho 8 variaveis, so que nem todas sao preenchidas e tenho que fazer todas as formas possiveis para fazer a pesquisa. so que se nao preencher as variaveis todas ele nao me retorna alguma coisa.

    O que eu pretendo e se existe alguma maneira de contornar isso caso essa variavek estiver vazia ele nao liga i para para outra variavel.
     
  2. Armadillo

    Armadillo Folding Member

    mostra a query que estás a usar, por favor ;)
     
  3. RicAlmeida

    RicAlmeida Power Member

    neste momento estou a fazer isto

    Código:
    declare @cliente char(50), @vendedor char(50), @tipo char(50),@qualidade char(50),@espessura char(50), @largura char(50),@comprimento char(50),@zona char(50)
    
    set @cliente=#1#
    set @vendedor=#2#
    set @tipo=#3#
    set @qualidade=#4#
    set @espessura=#5#
    set @largura=#6#
    set @comprimento=#7#
    set @zona=#8#
    
    SELECT Bo.nome as 'cliente', Bi.design as 'designacao', Bi.u_qttenc as 'qtt_enc', bi.qtt2 as 'qtt_entrega',bi.usrdata as 'prazo_entrega', bi.dedata as 'data_entrega', Bo.vendnm as 'vendedor', bo.u_obs as 'obs', BI.lobs as 'ot', Bo.obranome as 'req_cliente', Bi.lobs2 as 'doc_destino','rohs'=(case when BI.u_rohs=0 then ' ' ELSE 'X' END), Bi.debito as 'preco', BI.u_nintcert as 'n_certificado',Bo.zona as 'zona', bi.u_tpcertif as 'tp_certificado' FROM Bo inner join BI on Bo.obrano=Bi.obrano where Bo.ndos='1'and bi.ndos='1' and [email protected]+'%' and [email protected] and [email protected] and [email protected] and [email protected] and [email protected] and [email protected] and [email protected]
    
    
     
  4. Armadillo

    Armadillo Folding Member

    nesse caso vais ter que usar condições para criares o "Select" correcto. Ou trocas o operador "and" por "or", mas aí irá, provavelmente, alterar o resultado esperado.
    Link: If...Else
     
    Última edição: 26 de Novembro de 2008
  5. RicAlmeida

    RicAlmeida Power Member

    uma das hipoteses e fazer tipo if's pa mostrar todas as condições so que isto da-me muitas mas mesmo muitas condições

    trocando o operador de and por or funcionaram em condições
     
  6. Armadillo

    Armadillo Folding Member

    nao podes criar uma string que te vá construindo a query correcta?
    Assim "só" tens 7 ifs, em vez de um if para cada uma das 5040 querys possiveis.
    Também podes usar um "case" para te ir gerando a SQL-string e depois corres essa string com o comando "Execute" ;)

    cumps
     
  7. RicAlmeida

    RicAlmeida Power Member

    podias-me dar um pequeno exemplo disso, ou entao indicar um tutorial
     
  8. Armadillo

    Armadillo Folding Member

    String concatenation
    Execute

    Se eu percebi bem, o que terás que fazer será assim mas em T-SQL ;)
    Código:
    strSQL = "Select * FROM Tabela where "
    Se var1 !="" então 
       strSQL = strSQL + "campo1='asd'"
    Fim se
    Se var2 !="" então 
       strSQL = strSQL + "campo2='asd'"
    Fim se
    
    Executar strSQL
    
     
  9. RicAlmeida

    RicAlmeida Power Member

    vou experimentar isso, depois digo mais alguma coisa.
     
  10. RicAlmeida

    RicAlmeida Power Member

    parece que nao esta a resultar da-me sempre erro
     
  11. Granadafeup

    Granadafeup Power Member

    Devia de funcionar. Já fiz algumas funções no SQL Server com recurso a técnica que o Armadillo descreveu e funciona.

    Que erro é que te dá? Faz um @print da query e confirma se está direita
     
  12. Viva.
    Tambem podes usar 'Case When a=.. then ... else .... end'.
    Hélio
     
  13. RicAlmeida

    RicAlmeida Power Member

    O que tou a fazer e isto:
    Código:
    declare @cliente varchar(50), @vendedor varchar(50), @tipo varchar(50),@qualidade varchar(50),@espessura varchar(50), @largura varchar(50),@comprimento varchar(50),@zona varchar(50)
    
    set @cliente=#1#
    set @vendedor=#2#
    set @tipo=#3#
    set @qualidade=#4#
    set @espessura=#5#
    set @largura=#6#
    set @comprimento=#7#
    set @zona=#8#
    
    strSQL="SELECT  Bo.nome as 'cliente', Bi.design as 'designacao', Bi.u_qttenc as 'qtt_enc', bi.qtt2 as 'qtt_entrega',bi.usrdata as 'prazo_entrega', bi.dedata as 'data_entrega', Bo.vendnm as 'vendedor', bo.u_obs as 'obs', BI.lobs as 'ot', Bo.obranome as 'req_cliente', Bi.lobs2 as 'doc_destino','rohs'=(case when BI.u_rohs=0 then ' ' ELSE 'X' END), Bi.debito as 'preco', BI.u_nintcert as 'n_certificado',Bo.zona as 'zona', bi.u_tpcertif as 'tp_certificado' FROM Bo inner join BI on Bo.obrano=Bi.obrano where Bo.ndos='1'and bi.ndos='1'")
    
    if (@cliente<>'') 
        strsql=strsql+" and [email protected]+'%"
    end if
    
    if (@vendedor<>'') 
        strsql=strsql+" and [email protected]"
    end if
    
    if (@tipo<>'') 
        strsql=strsql+" and [email protected]"
    end if 
    
    if (@qualidade<>'') 
        strsql=strsql+" and [email protected]"
    end if
    
    if (@espessura!='') 
        strsql=strsql+" and bi.u_espess>[email protected]"
    end if
    
    if (@largura!='') 
        strsql=strsql+" and bi.u_largura>[email protected]"
    end if
    
    if (@comprimento!='') 
        strsql=strsql+" and bi.u_comp>[email protected]"
    end if 
    
    if (@zona!='') 
        strsql=strsql+" and [email protected]"
    end if
    
    Exec strsql
    o erro que me esta a dar e este
     
  14. Armadillo

    Armadillo Folding Member

    adiciona ' á tua StrSQL
    ou seja:
    Código:
    strSQL=[B][COLOR=Red]'[/COLOR][/B]"SELECT  ..." [COLOR=Red]'[/COLOR]
    
    
    acho que é assim ;)
     
  15. RicAlmeida

    RicAlmeida Power Member

    ta dificil,
    ja meti as ' ' e continua a dar o mesmo err0
     
  16. RicAlmeida

    RicAlmeida Power Member

    O Case posso utilizar dentro do where

    ou seja

    SELECT * FROM BO WHERE case when @cliente!=0 then [email protected] end

    posso utilizar como eu mostrei ai ou tenho que fazer algumas modificações
     
  17. RicAlmeida

    RicAlmeida Power Member

    Tá resolvido
     
  18. Armadillo

    Armadillo Folding Member

    não queres colocar a solução? ;)
     
  19. RicAlmeida

    RicAlmeida Power Member

    Eu arranjei outra maneira de o fazer, e ao que parece para os efeitos e melhor para os utilizador trabalharem assim


    Código:
    declare @cliente varchar(50), @vendedor varchar(50), @tipo varchar(50),@qualidade varchar(50),@espessura numeric(10,3), @largura numeric(10,3),@comprimento numeric(10,3),@zona varchar(50)
    
    set @cliente=#1#
    set @vendedor=#2#
    set @tipo=#3#
    set @qualidade=#4#
    set @espessura=#5#
    set @largura=#6#
    set @comprimento=#7#
    set @zona=#83
    
    
    
    select BO.vendedor as 'codvendedor', Bi.familia as 'familia', BI.u_largura as 'Largura', Bi.u_espess as 'espessura',Bi.u_qualid as 'qualidade', BI.u_comp as 'comprimento', Bo.nome as 'cliente', Bi.design as 'designacao', Bi.u_qttenc as 'qtt_enc', bi.qtt2 as 'qtt_entrega',bi.usrdata as 'prazo_entrega', bi.dedata as 'data_entrega', Bo.vendnm as 'vendedor', bo.u_obs as 'obs', BI.lobs as 'ot', Bo.obranome as 'req_cliente', Bi.lobs2 as 'doc_destino','rohs'=(case when BI.u_rohs=0 then ' ' ELSE 'X' END), Bi.debito as 'preco', BI.u_nintcert as 'n_certificado',Bo.zona as 'zona', bi.u_tpcertif as 'tp_certificado' from BO inner join BI on Bo.obrano=Bi.obrano where Bi.ndos='1' and Bo.ndos='1' and bo.nome like @cliente+'%' and bo.vendnm like @vendedor+'%' and bi.familia like @tipo+'%' and bi.u_qualid like @qualidade+'%' and bi.u_espess>[email protected] and BI.u_largura>[email protected] and bi.u_comp>[email protected] and bo.zona like @zona+'%'
    
    
    Obrigado pela a ajuda na mesma
     

Partilhar esta Página