Notifications
Clear all

Soma condicional

12 Posts
3 Usuários
0 Reactions
2,671 Visualizações
(@d1nho)
Posts: 22
Eminent Member
Topic starter
 

Boa tarde amigos,
estou com uma dúvida quanto a uma soma condicional. Vamos ao cenário eu tenho uma planilha com auto-filtro chamada VENDAS_ITENS e outra Chamada VENDAS_CUPOM ambas tabelas são abastecidas através de uma fonte de dados externa vindas do banco de dados do ERP da empresa em que trabalho. Existem várias colunas em ambas planilhas que na verdade são "espelhos" de duas tabelas relacionadas em meu Banco de dados. Na tabela VENDAS_CUPOM tenho uma coluna chamada [NUMERO] que corresponde ao número do cupom registrado para aquela venda especifica, na planilha VENDAS_ITENS eu tenho os itens pertencentes aquele cupom, ou seja uma relação de 1:N onde eu tenho um único registro de cupom na tabela vendas CUPOM, este código se repete várias vezes na planilha VENDAS_ITENS pois para cada item vendido pertencente aquela venda tenho um NUMERO de cupom correspondente. Eu preciso somar a quantidade de itens vendidos dentro de um período. Vou descrever a estrutura básica das planilhas abaixo:

VENDAS_ITENS[NUMERO] -> Número da Venda Teremos vários números repetidos pois um registro para cada produto pertencente a venda
VENDAS_ITENS[PRODUTO] -> Código do produto
VENDAS_ITENS[QTDE] -> Quantidade faturada do produto
--------------------------------------------------------------------------

VENDAS_CUPOM[NUMERO] -> registro único pois aqui eu contabilizo a venda
VENDAS_CUPOM[DATA] -> Data da Venda
-------------------------------------------------------------------------

Eu preciso somar a quantidade faturada para cada produto dentro de um intervalo de datas
-------------------------------------------------------------------------

Eu tentei usando =somases(VENDAS_ITENS[QTDE];VENDAS_CUPOM[DATA];"="&A1;VENDAS_ITENS[PRODUTO];"="&A2;)
porém não consigo criar uma relação entre o número do cupom existente em uma planilha com os existentes na outra.

Desculpem minha ignorância, meu conhecimento em Excel é básico.

 
Postado : 16/04/2014 12:02 pm
(@wagner-morel-vidal-nobre)
Posts: 4063
Famed Member
 

d1nho,

Boa Tarde!

Por gentileza, compacte seu arquivo (com ZIP) e anexe o mesmo aqui. Assim ficará mais fácil de entender o que você quer e ajudar.

 
Postado : 16/04/2014 12:09 pm
(@d1nho)
Posts: 22
Eminent Member
Topic starter
 

Devido ao tamanho da planilha (Maior que o próprio banco de dados que uso como fonte em DBASE) tive que postar no 4shared
segue o link para quem puder me ajudar. Por favor não quero que façam pra mim, mas que me mandem um exemplo seguindo a mesma lógica para que eu possa aplicar em meu relatório.

Muito Obrigado.

link para Download
http://www.4shared.com/zip/0hnZP_KZce/Exemplo.html

 
Postado : 16/04/2014 12:30 pm
(@d1nho)
Posts: 22
Eminent Member
Topic starter
 

Boa noite pessoal, devido ao tamanho da planilha original receio que o pessoal terá dificuldades em entender aquela estrutura. O que preciso fazer é relativamente simples de se fazer. Eu quero apurar o total de vendas de um determinado item dentro de um período obedecendo algumas regras de persistência de dados imposta pela estrutura de dados do sistema que me fornece estas informações. Hoje eu já faço estes cálculos para gerar este relatório usando SQL com alguns poucos INNER JOINS eu consigo fazer isso, porém é uma mão de obra tremenda, pois eu exporto os arquivos em DBF usando ODBC + MSQUERY Importo para uma base em MySQL (por que? é muito mais rápido criar consultas em um SGDB que possui linguagem SQL nativa do que usar ODBC para "emular" o SQL no DBase).
Após executar a Query eu importo do MySQL para o Excel usando alguns filtros eu crio o relatório da forma como meus chefes precisam, eu queria ganhar tempo nesta mão de obra toda, quando descobri que era possível usar o recurso de fonte de dados do excel para se atualizar direto dos arquivos .DBF do ERP eu pensei que talvez pude-se automatizar esta tarefa no próprio excel, e ganhar tempo nessa mão de obra toda. Porém meu pouco conhecimento em Excel me deixou na mão na hora de criar os processos da query, usando Formulas e meu conhecimento em VBA é nulo.
Já tentei de tudo esta é minha ultima tentativa, estou desenvolvendo uma solução em C# para esta empresa, para substituir o Sistema atual por ser muito lento (devido ao fato de ter sido criado usando VO +Dbase em 1995.
Este relatório, já faz parte do product backlog do projeto, porém devido as constantes solicitações vindas do faturamento me cobrando este relatório eu queria ganhar um tempo fazendo isso em uma ferramenta de analise de dados (Excel) e ganhar algum tempo até a conclusão do Módulo Financeiro do Sistema, sem ter que criar uma rotina para analisar dados de outro sistema, que não foi Eu quem desenvolveu para gerar um relatório.

Enfim eu fiz um exemplo bem mais simples, mas que elucida muito melhor aquilo que preciso fazer.

Qualquer ajuda será bem vinda.

 
Postado : 16/04/2014 6:55 pm
(@wagner-morel-vidal-nobre)
Posts: 4063
Famed Member
 

Não consegui baixar seu arquivo.

Qual o tamanho do mesmo? Não da para compactar em 2 ou 3 pedaços e anexar aqui mesmo? Caso contrário, coloque em outro site como o SendSpace.

 
Postado : 16/04/2014 7:02 pm
(@d1nho)
Posts: 22
Eminent Member
Topic starter
 

Olá Wagner,
eu anexei aqui mesmo em meu ultimo post.

 
Postado : 16/04/2014 7:03 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Cara,

Vc falou em período então sugiro acrescentar data final na sua consulta. Além disso, com um simples PROCV() em uma das tabelas seu SOMASES() funciona perfeitamente.

O que vc deve incluir está em amarelo. Em laranja a fórmula que resolve seu problema.

Qq coisa me fale.

Abs,

 
Postado : 16/04/2014 8:18 pm
(@d1nho)
Posts: 22
Eminent Member
Topic starter
 

Olá Mandrix.xls
Realmente sua solução funcionou nesta planilha de exemplo. Porém na planilha de produção, ficou EXTREMAMENTE LENTO. levou 20 minutos para calcular a data de venda para cada item, na minha opinião é algo redundante, pois a data já existe na planilha CUPOM_FISCAL, acredito que o critério chave aqui seja o NUMERO do cupom pois este existe no CUPOM FISCAL e EXISTE para cada item pertencente aquele cupom fiscal(Venda) logo creio que o correto seria usar a coluna número como critério assim como já faço em SQL. Será que existe um meio de fazer o mesmo sem a necessidade de criar uma nova coluna em ITENS_COPONS_FISCAL ? pois eu realmente acho meio POG criar esta coluna DATA na planilha de ITENS se já temos a coluna NUMERO que poderia se usada como critério. Então eu pergunto se realmente vale a pena fazer isso.

Realmente é um intervalo, não considerei isso no exemplo pois achei desnecessário, já que a dúvida não era esta.

Muito obrigado por seu apoio, mas sigo em busca de uma solução, mais limpa e rápida. Se não conseguir fazer no Excel, vou criar uma solução em C# assim posso usar uma query SQL para isso.

Vou postar a query aqui, quem sabe algum colega consegue "traduzir" isto para o ambiente do Excel. Por hora MUITO obrigado mesmo por usa resposta, não resolveu meu problema totalmente, mas foi capaz de me ensinar muitas coisas.

Abraços.

[SQL]

SELECT cademit.NUMERO,
cademit.DATA,
CASE DATE_FORMAT(cademit.DATA,'%w')
WHEN 0 THEN ('Domingo')
WHEN 1 THEN ('Segunda')
WHEN 2 THEN ('Terça')
WHEN 3 THEN ('Quarta')
WHEN 4 THEN ('Quinta')
WHEN 5 THEN ('Sexta')
WHEN 6 THEN ('Sabado')
END AS DIA,
caditf.NUMERO,
caditf.PRODUTO,
sum(caditf.QTDE) as QTDE,
caditf.PRECO,
cadprod.CODIGO, cadprod.GRUPO,
cadprod.DESCRICAO
FROM cademit
INNER JOIN caditf ON (caditf.NUMERO = cademit.NUMERO)
INNER JOIN cadprod ON (caditf.PRODUTO = cadprod.CODIGO)
WHERE (cademit.DATA = '2014-01-03')
GROUP BY cadprod.CODIGO)

 
Postado : 17/04/2014 8:25 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

cademit, caditf ecadprod se referem a quais abas da planilha??

 
Postado : 17/04/2014 10:25 am
(@d1nho)
Posts: 22
Eminent Member
Topic starter
 

Opa Reinaldo,
funciona assim:
CADEMIT (cadastro de cupons emitidos) = CUPONS_FISCAIS
CADITF (cadastro de itens de cupons emitidos) = ITENS_CUPONS_FISCAIS
CADPROD (cadastro de produtos ) = PRODUTOS

Relações CADEMIT = CADITF
1:N
Obrigado pela ajuda.

 
Postado : 17/04/2014 10:37 am
(@d1nho)
Posts: 22
Eminent Member
Topic starter
 

Olá Amantes do Excel,
definitivamente estou gostando desta ferramenta, resolvi aproveitar o feriado prolongado para estudar um pouco do VBA e fiquei maravilhado com as possibilidades que encontrei. Usando um módulo para criar consultas SQL direto em minha pasta de trabalho consigo fazer consultas aos dados livremente sem necessidade do uso de formulas complexas e as vezes "mirabolantes" para chegar no resultado que preciso. Só estou com dificuldade na sintaxe do INNER JOIN para o EXCEl, eu sei que mesmo o SQL sendo padrão ele possui algumas particularidades de SGDB para SGBD. Por isso não estou conseguindo criar os JOINS nesta consulta. Estou anexando a planilha de testes com o código criado, se algum puder me ajudar com a sintaxe dos JOINS eu ficaria muito grato, vou continuar tentando aqui. Caso eu encontre a solução eu fecho este tópico. Como o assunto agora passou a ser VBA, deixo que a moderação fique a vontade para mover meu tópico para a seção correta no forum.

Obrigado a todos. Quem puder me ajudar por favor baixe a planilha para analisar.

 
Postado : 19/04/2014 7:46 am
(@d1nho)
Posts: 22
Eminent Member
Topic starter
 

Após estudar um pouco de VBA consegui criar uma formula (Function) que realiza exatamente todo calculo que eu precisava sem muito esforço, agora que começei a entender melhor a sintaxe do VBA tudo ficou mais simples. Problema solucionado pessoal. Estou Anexando a planilha com a Solução.

Código VBA

Function FATPRODPERIODO(dataInicial As Date, dataFinal As Date, codigoProduto As Integer) As Double

Dim Total As Double
Dim numero As String
Dim numRegCuponsFiscais As Integer
Dim numRegItensCuponsFiscais As Integer
Dim subTotal As Double

Set rngCuponsFiscaisData = Range("CUPONS_FISCAIS[DATA]")
Set rngItensCuponsFiscaisNumero = Range("ITENS_CUPONS_FISCAIS[NUMERO]")
numRegCuponsFiscais = rngCuponsFiscaisData.Count
numRegItensCuponsFiscais = rngItensCuponsFiscaisNumero.Count
For i = 1 To numRegCuponsFiscais
If rngCuponsFiscaisData.Cells(i, 1).Value >= dataInicial And _
rngCuponsFiscaisData.Cells(i, 1).Value <= dataFinal Then
numero = rngCuponsFiscaisData.Cells(i, 1).Offset(, -1).Value
For x = 1 To numRegItensCuponsFiscais
If numero = rngItensCuponsFiscaisNumero.Cells(x, 1).Value And _
codigoProduto = rngItensCuponsFiscaisNumero.Cells(x, 2).Value Then
subTotal = rngItensCuponsFiscaisNumero.Cells(x, 3).Value
Total = Total + subTotal
End If
Next x
End If
Next i
FATPRODPERIODO = Total
End Function

 
Postado : 22/04/2014 11:26 am