COMO FAZER UM WHERE COM VÁRIOS CRITÉRIOS

 Tópico anterior Próximo tópico Novo tópico

COMO FAZER UM WHERE COM VÁRIOS CRITÉRIOS

VB / VBA

 Compartilhe  Compartilhe  Compartilhe
#493160 - 20/03/2020 19:22:30

ADILSOO
PRATANIA
Cadast. em:Março/2012


Olá pessoal boa noite,
Estou tentando fazer uma forma pra facilitar meu trabalho, tenho que somar os valores de uma tabela, porém, somente em determinados estoques, exemplo:

A pessoa vai adicionando os estoques que caem em um grid, esse grid, eu pego os códigos que foram adicionados, faço um for no grid, e a cada vez que passa eu faço uma soma, e vou adicionando, isso até funciona, porém, dependendo da quantidade de estoques selecionados, está demorando. Pois eu penso que teria uma forma de eu fazer assim: WHERE codestoque = 1 and 2 and 3 and 4. Pronto, eu somaria de todos, porém, não sei como poderia fazer isso, sem passar um por um. Alguma dica?

Vou postar o código para os senhores analisarem.

'Aqui eu faço um Group By para saber quais produtos eu tenho nesse periodo informado
sSQL = "SELECT * FROM tabmovestoqueitens INNER JOIN tabcadmaterial ON tabmovestoqueitens.codprod = tabcadmaterial.codmaterial INNER JOIN tabmovestoque ON tabmovestoqueitens.codmov = tabmovestoque.codmov WHERE datamov >= '" & Format(txtdataini.Text, "yyyy/mm/dd") & "' and datamov <= '" & Format(txtdatafim.Text, "yyyy/mm/dd") & "' and apto = 'NAO' and tabmovestoqueitens.tipomov = 'ENT' GROUP BY tabmovestoqueitens.codprod"
Set rs = Conexao.Execute(sSQL)

barra = 0
barra.Max = rs.RecordCount

Do While Not rs.EOF = True
    I = 0
    With gridestoques
        barra2 = 0
        barra2.Max = .Rows - 1
        For I = 1 To .Rows - 1
            'Saídas
            sSQL = "SELECT SUM(qtdeprod) as xQtdeSai FROM tabmovestoqueitens INNER JOIN tabmovestoque ON tabmovestoqueitens.codmov = tabmovestoque.codmov WHERE datamov >= '" & Format(txtdataini.Text, "yyyy/mm/dd") & "' and datamov <= '" & Format(txtdatafim.Text, "yyyy/mm/dd") & "' and apto = 'NAO' and tabmovestoqueitens.tipomov = 'SAI' and codprod = '" & rs!codprod & "' and tabmovestoqueitens.codestoque = '" & gridestoques.TextMatrix(I, 1) & "'"
            Set rs1 = Conexao.Execute(sSQL)
            
            'Entradas
            sSQL = "SELECT SUM(qtdeprod) as xQtdeEnt, SUM(vtotalprod) as vTotal FROM tabmovestoqueitens INNER JOIN tabmovestoque ON tabmovestoqueitens.codmov = tabmovestoque.codmov WHERE datamov >= '" & Format(txtdataini.Text, "yyyy/mm/dd") & "' and datamov <= '" & Format(txtdatafim.Text, "yyyy/mm/dd") & "' and apto = 'NAO' and tabmovestoqueitens.tipomov = 'ENT' and codprod = '" & rs!codprod & "' and tabmovestoqueitens.codestoque = '" & gridestoques.TextMatrix(I, 1) & "'"
            Set rs2 = Conexao.Execute(sSQL)            
            barra2 = barra2 + 1
        Next I
    End With
    gridmovprod.AddItem "" & vbTab & Format(rs!codprod, "00000") _
    & vbTab & rs!nomematerial & vbTab & rs!unid _
    & vbTab & xTotalEnt & vbTab & (xTotalSai * -1) _
    & vbTab & "" & vbTab & rs2!vTotal
    rs.MoveNext
    barra = barra + 1
Loop


Abraços!

Faça parte do grupo de VB6 no WhatsApp: CLIQUE AQUI PARA ACESSAR O GRUPO

#493168 - 21/03/2020 08:25:27

SINCLAIR
CRICIUMA
Cadast. em:Janeiro/2001


Última edição em 21/03/2020 08:26:47 por SINCLAIR

Bom dia, Colega!

Não sei qual o banco de dados que você utiliza, mas no PostGreSQL (meu preferido) usou assim:

SELECT (campos que desejo) from (nome da tabela) where (codigo_produto in (1,5,7,19,25,27))


Ou mesmo uma soma, como por exemplo:

SELECT sum(saldo) as total_no_estoque from (nome da tabela) where (codigo_produto in (1,5,7,19,25,27))




Euzébio Cruz
Criciúma - SC


#493290 - 31/03/2020 11:22:12

ADILSOO
PRATANIA
Cadast. em:Março/2012


Sim, eu entendo, porém eu não tenho isso fixo, eu preciso fazer um loop nos estoques selecionados, depois aplicar a string.
Se eu soubesse que é os 1, 2, 3, 4 e 5, eu já colocaria, a dúvida é como fazer isso em modo de execução.

Pois ele pode selecionar 1, 2 ou 3 ou 10. Como ficaria o WHERE nesse caso?

Faça parte do grupo de VB6 no WhatsApp: CLIQUE AQUI PARA ACESSAR O GRUPO

#493291 - 31/03/2020 14:44:34

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
Você tem uma lista de id's que você quer somar, selecionadas pelo usuário, certo? Pois bem, a cláusula IN vai atender perfeitamente.

select bla bla
where id in (sua_lista_de_id)



_______________________________________________________________________
Virei Oráculo!
The end is nigh, be ready for the nukes!


#493292 - 31/03/2020 14:59:25

SINCLAIR
CRICIUMA
Cadast. em:Janeiro/2001


Última edição em 31/03/2020 14:59:51 por SINCLAIR

Colega,

Pelo que entendi, sua necessidade é formar a lista de IDs dos produtos selecionados no Grid.

Bem, percorra o Grid da primeira até a última linha e, caso a linha esteja marcada, adicione o ID em uma variável acumuladora, o que formará uma lista de IDs a colocar na cláusula Where.


Euzébio Cruz
Criciúma - SC


#493310 - 02/04/2020 06:47:21

ADILSOO
PRATANIA
Cadast. em:Março/2012


Citação:
  Você tem uma lista de id's que você quer somar, selecionadas pelo usuário, certo?

Isso mesmo

Citação:
  Pois bem, a cláusula IN vai atender perfeitamente

Certo, não entendi como eu capturo essa lista, no caso agora eu percorro o grid com o for, e cada vez que passa em um código eu faço a SQL, que no caso é o que está ficando lento, eu não entendi como aplicar isso na SQL, vou postar uma parte dela, no ponto da dúvida.

  tabmovestoqueitens.codestoque = '" & gridestoques.TextMatrix(I, 1) & "'"

Nesse ponto, caso eu referencio o "I" que é a linha, porém, como faço pra passar? Tem que ser um por um? Ou tenho que somar em uma variável, se sim, que tipo de variável devo usar?

Faça parte do grupo de VB6 no WhatsApp: CLIQUE AQUI PARA ACESSAR O GRUPO

#493311 - 02/04/2020 09:00:11

FABRICIOWEB
BELO HORIZONTE
Cadast. em:Novembro/2011


Citação:
:
  Você tem uma lista de id's que você quer somar, selecionadas pelo usuário, certo?
Isso mesmo

  Pois bem, a cláusula IN vai atender perfeitamente
Certo, não entendi como eu capturo essa lista, no caso agora eu percorro o grid com o for, e cada vez que passa em um código eu faço a SQL, que no caso é o que está ficando lento, eu não entendi como aplicar isso na SQL, vou postar uma parte dela, no ponto da dúvida.

  tabmovestoqueitens.codestoque = '" & gridestoques.TextMatrix(I, 1) & "'"

Nesse ponto, caso eu referencio o "I" que é a linha, porém, como faço pra passar? Tem que ser um por um? Ou tenho que somar em uma variável, se sim, que tipo de variável devo usar?


acho que vc poderia criar uma lista fazendo for e mandando a list para uma variavel e so depois chamar sua consulta com a variavel id acho que nao ficaria lento nao



#493320 - 02/04/2020 13:55:04

ADILSOO
PRATANIA
Cadast. em:Março/2012


Citação:
  mandando a list para uma variavel

Qual tipo de variável que armazena lista?

Faça parte do grupo de VB6 no WhatsApp: CLIQUE AQUI PARA ACESSAR O GRUPO

#493322 - 02/04/2020 14:21:39

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
Citação:
:
  mandando a list para uma variavel
Qual tipo de variável que armazena lista?

Uma simples string, com cada parâmetro separado por vírgula.

Dica: perca esse raciocínio de "percorrer o grid". Entenda que o grid é simplesmente uma representação de dados, uma simples exibição. Os dados que estão visíveis devem estar em alguma variável.

_______________________________________________________________________
Virei Oráculo!
The end is nigh, be ready for the nukes!


#493324 - 02/04/2020 14:56:08

ADILSOO
PRATANIA
Cadast. em:Março/2012


Perfeito, eu fiz uma variável que eu preencho e eu formatei de forma a colocar no WHERE e ficou assim: 2, 1, 3, 4, 5, 6

Ficou uma SQL bem grande, mas funcionou perfeitamente...
  sSQL = "SELECT SUM(qtdeprod) as xQtdeSai, SUM(vtotalprod) as vTotalSai, SUM(qtdeprod) as xQtdeEnt, SUM(vtotalprod) as vTotalEnt, codprod, unid, nomematerial FROM tabmovestoqueitens INNER JOIN tabcadmaterial ON tabmovestoqueitens.codprod = tabcadmaterial.codmaterial INNER JOIN tabmovestoque ON tabmovestoqueitens.codmov = tabmovestoque.codmov WHERE datamov >= '" & Format(txtdataini.Text, "yyyy/mm/dd") & "' and datamov <= '" & Format(txtdatafim.Text, "yyyy/mm/dd") & "' and apto = 'NAO' and tabmovestoqueitens.codestoque = '" & xEstoques & "' GROUP BY tabmovestoqueitens.codprod"


Agora, KERPLUNK, você disse   perca esse raciocínio de "percorrer o grid" , porém, nesse meu caso pra preencher a variável eu tenho que percorrer né? Já que preciso saber quais itens eu adicionei.

Faça parte do grupo de VB6 no WhatsApp: CLIQUE AQUI PARA ACESSAR O GRUPO

#493325 - 02/04/2020 15:21:28

FABRICIOWEB
BELO HORIZONTE
Cadast. em:Novembro/2011


Citação:
:
Perfeito, eu fiz uma variável que eu preencho e eu formatei de forma a colocar no WHERE e ficou assim: 2, 1, 3, 4, 5, 6

Ficou uma SQL bem grande, mas funcionou perfeitamente...
  sSQL = "SELECT SUM(qtdeprod) as xQtdeSai, SUM(vtotalprod) as vTotalSai, SUM(qtdeprod) as xQtdeEnt, SUM(vtotalprod) as vTotalEnt, codprod, unid, nomematerial FROM tabmovestoqueitens INNER JOIN tabcadmaterial ON tabmovestoqueitens.codprod = tabcadmaterial.codmaterial INNER JOIN tabmovestoque ON tabmovestoqueitens.codmov = tabmovestoque.codmov WHERE datamov >= '" & Format(txtdataini.Text, "yyyy/mm/dd") & "' and datamov <= '" & Format(txtdatafim.Text, "yyyy/mm/dd") & "' and apto = 'NAO' and tabmovestoqueitens.codestoque = '" & xEstoques & "' GROUP BY tabmovestoqueitens.codprod"


Agora, KERPLUNK, você disse   perca esse raciocínio de "percorrer o grid" , porém, nesse meu caso pra preencher a variável eu tenho que percorrer né? Já que preciso saber quais itens eu adicionei.

sim



 Tópico anterior Próximo tópico Novo tópico


Para responder este tópico o login é requerido
Se você já possui uma conta de usuário por favor faça seu login
Se você não possui uma conta de usuário use a opção Criar usuário