MaximoAccess

Caro Usuário, antes de postar pela primeira vez, leia as regras do fórum.

Obrigado

Administração do MaximoAccess

Dicas Ms Access, Exemplos Ms Access, Codigos VBA Ms Access, SQL Ms Access

    Atualização de dados baseada em consultas.

    Compartilhe

    srv4ever
    Novato
    Novato

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 35
    Registrado : 20/01/2016

    Atualização de dados baseada em consultas.

    Mensagem  srv4ever em 17/3/2016, 19:07

    Boa tarde, amigos.
    Tenho quebrado a cabeça ultimamente, vamos ao cenário:

    1) Tenho um ERP, e utilizo alguns dados, via ODBC para fazer um sistema de Análise de crédito.

    2) Calculamos um limite de crédito baseado no que o cliente gastou no último ano.
    (Se foi gasto até R$ 3.000,00, então 30% desse valor gasto é o limite, se foi entre R$ 3.000,00 e R$ 10.000,00, então seu limite é de 25% do valor gasto e finalmente se foi acima de R$ 10.000,00, apenas do que foi gasto é o limite de crédito.

    3) Os valores das vendas eu consigo pela tabela tbo_Tb.NotaFiscal, como também o ID do cliente.


    Objetivo: Atualizar os limites de crédito de cada cliente fazendo essa consulta e cálculo e atualizar a tabela de limites.


    Alguém consegue me dar uma luz? Estou mais perdido do que cego em tiroteio!!!



    Agradeço desde já!


    Wilian
    avatar
    studioaccess
    Novato
    Novato

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 9
    Registrado : 19/03/2016

    Re: Atualização de dados baseada em consultas.

    Mensagem  studioaccess em 19/3/2016, 16:19

    Wilian

    Utilize a função DSum para obter o valor gasto na tabela tbo_Tb.NotaFiscal
    Depois atualize o valor na tabela de limites utilizando o método Docmd.RUNSQL

    Exemplo:

    Código:


    Dim dblValorGasto
    Dim lngIDCliente as long
    Dim dblLimite as long

    dblValorGasto= DSum("[CampoValorGasto]","[tbo_Tb.NotaFiscal]","[IDCliente]=" & lngIDCliente )
    dblLimite = Calculo_do_limite_baseado_no_valor_gasto(dblValorGasto)

    Docmd.runsql = "UPDATE tbl_Limites SET tbl_Limites.Limite = " & dblLimite  & " WHERE (((tbl_Limites.IdCliente)=" & lngIDCliente  &"));"


    Qualquer dúvida estou à disposição

    srv4ever
    Novato
    Novato

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 35
    Registrado : 20/01/2016

    Re: Atualização de dados baseada em consultas.

    Mensagem  srv4ever em 21/3/2016, 20:28

    Boa tarde, amigo.
    Em primeiro lugar, muito obrigado por ajudar!

    Desculpe a demora para responder!
    Fiquei tentando achar soluções, e não consegui, recebo erro de sintaxe com todas as formas que tentei.

    Dim dblValorGasto
    Dim lngIDCliente as long
    Dim dblLimite as long

    dblValorGasto= DSum("[NFValorTotal]","[tbo_TbNotaFiscal]","[CliId]=" & CliId )
    IF ([dblValorGasto] <=3000; dblLimite = ([dblValorGasto] *0,30); [dblValorGasto] >3000 AND [dblValorGasto]<=10000; dblLimite = ([dblValorGasto]*0,25); dblLimite = ([dblValorGasto]*0,2))
    Docmd.runsql = "UPDATE tbl_Limites SET tbl_Limites.Limite = " & dblLimite & " WHERE (((tbl_Limites.CliId)=" & CliId &"));"


    Consegue me dar uma ajuda?


    Agradeço novamente.


    Wilian
    avatar
    studioaccess
    Novato
    Novato

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 9
    Registrado : 19/03/2016

    Re: Atualização de dados baseada em consultas.

    Mensagem  studioaccess em 22/3/2016, 02:53

    Wilian

    O problema estava no IF, coloquei ele em uma função para facilitar a leitura do código. Ficou assim

    Código:

    Private Function CalculoLimite(dblValorGasto As Double)

    If dblValorGasto <= 3000 Then
        CalculoLimite = dblValorGasto * 0.3
    ElseIf [dblValorGasto] > 3000 And [dblValorGasto] <= 10000 Then
        CalculoLimite = dblValorGasto * 0.25
    Else
        CalculoLimite = dblValorGasto * 0.2
    End If

    End Function

    Para obter o limite do cliente criei a função LimiteCliente que recebe como parâmetro o ID do Cliente

    Código:

    Public Function LimiteCliente(CliId) As Double

    Dim dblValorGasto As Double
    Dim dblLimite As Double

    'Sai da rotina caso nenhum ID de cliente não tenha sido informado
    If IsNull(CliId) Then Exit Function

    dblValorGasto = DSum("[NFValorTotal]", "[tbo_TbNotaFiscal]", "[CliId]=" & CliId)
    dblLimite = CalculoLimite(dblValorGasto)
    LimiteCliente = dblLimite

    End Function

    Também separei do código a rotina que armazena o limite do cliente
    Não sei se você precisará armazenar o valor em uma tabela, porque a qualquer momento você pode consultar o valor através da função LimiteCliente

    Código:

    Sub ArmazenarLimite(CliId)

    DoCmd.SetWarnings False 'Desabilita as mensagens de confirmação
    DoCmd.RunSQL "UPDATE tbl_Limites SET tbl_Limites.Limite = " & LimiteCliente(CliId) & " WHERE (((tbl_Limites.CliId)=" & CliId & "));"
    DoCmd.SetWarnings True 'Reabilita as mensagens de confirmação

    End Sub


    Abaixo, link do arquivo com estas alterações

    [Você precisa estar registrado e conectado para ver este link.]

    srv4ever
    Novato
    Novato

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 35
    Registrado : 20/01/2016

    Re: Atualização de dados baseada em consultas.

    Mensagem  srv4ever em 22/3/2016, 18:26

    Poxa vida, amigo!
    Realmente obrigado!!
    Você realmente deu uma ótima luz, e também me mostrou que eu preciso estudar muito!!!
    Mas no caso, a intenção é atualizar todos os clientes automaticamente e de uma vez só, sem precisar informar o CliId, até porque tem mais de 5000 clientes.

    Você sabe se existe alguma forma de fazer essa atualização automaticamente?

    Agradeço novamente!!!
    avatar
    studioaccess
    Novato
    Novato

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 9
    Registrado : 19/03/2016

    Re: Atualização de dados baseada em consultas.

    Mensagem  studioaccess em 22/3/2016, 19:01

    Wilian

    Para atualizar todos os limites você pode utilizar a instrução SQL abaixo dentro de uma consulta ou executar através de código utilizando o método DoCmd.RunSQL

    Código:

    DoCmd.RunSQL "UPDATE tbl_Limites SET tbl_Limites.Limite = LimiteCliente([tbl_Limites]![CliId]);"

    [Você precisa estar registrado e conectado para ver esta imagem.]

    Ivan

    srv4ever
    Novato
    Novato

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 35
    Registrado : 20/01/2016

    Re: Atualização de dados baseada em consultas.

    Mensagem  srv4ever em 23/3/2016, 12:11

    Perfeito, amigo!
    Como essa parte do BD vem de um ERP com tabelas vinculadas, vou conseguir testar apenas mais tarde, porém, assim que possível, posto o resultado.
    Obrigado mesmo!!!

    srv4ever
    Novato
    Novato

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 35
    Registrado : 20/01/2016

    Re: Atualização de dados baseada em consultas.

    Mensagem  srv4ever em 23/3/2016, 12:46

    Amigo.
    Consegui fazer alguns testes.
    Aquela função para obter o limite é dependente de informar o CliId.
    Existe alguma forma de obter todos os limites automaticamente, para depois utilizar aquele método para atualizar todos automaticamente também?
    Realmente, desculpe o abuso, sei que preciso estudar MUITO!!!

    Muito obrigado pela ajuda, de verdade!

    srv4ever
    Novato
    Novato

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 35
    Registrado : 20/01/2016

    Re: Atualização de dados baseada em consultas.

    Mensagem  srv4ever em 30/3/2016, 15:04

    Consegui fazer uma consulta que me traz o limite de cada cliente, mas me restou uma dúvida, como eu insiro os valores da consulta na tabela?
    Olhando as imagens, quero colocar os valores da coluna LIMITES da consulta na coluna CliValorLimiteCredito da tabela.
    Cada CliId com o seu devido limite.

    Consulta:
    [Você precisa estar registrado e conectado para ver esta imagem.]

    Tabela:
    [Você precisa estar registrado e conectado para ver esta imagem.]


    Novamente agradeço pela ajuda!


    Wilian.
    avatar
    studioaccess
    Novato
    Novato

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 9
    Registrado : 19/03/2016

    Re: Atualização de dados baseada em consultas.

    Mensagem  studioaccess em 31/3/2016, 01:12

    Wilian

    Utilize esta consulta

    [Você precisa estar registrado e conectado para ver esta imagem.]

    ou o código abaixo

    Código:

    Docmd.RunSQL "UPDATE dbo_TbClientes SET dbo_TbClientes.CliValorLimiteCredito = LimiteCliente([dbo_TbClientes]![CliId]);"

    srv4ever
    Novato
    Novato

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 35
    Registrado : 20/01/2016

    Re: Atualização de dados baseada em consultas.

    Mensagem  srv4ever em 31/3/2016, 13:38

    Obrigado amigo.
    Mas nesse caso ele vai armazenar na tabela o valor retornado daquela função que vc fez, certo?
    Só que aquela função funciona apenas se vc digitar o ID o cliente, eu não consegui fazer aquela função retornar todos os limites de todos os CliId de uma vez.

    O máximo que consegui foi criar uma consulta que soma tudo e me mostra, como na imagem que coloquei.

    srv4ever
    Novato
    Novato

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 35
    Registrado : 20/01/2016

    Re: Atualização de dados baseada em consultas.

    Mensagem  srv4ever em 6/4/2016, 14:56

    Estou obtendo erro nesse comando.
    Já tentei deixar tudo em uma linha só, tirando o "& _" mas não resolveu.


    DoCmd.RunSQL "SELECT dbo_TbDocumento.CliId, dbo_TbCliente.CliNomeRazaoSocial, dbo_TbTitulo.TitStatus, Sum(dbo_TbTitulo.TitValor) AS SomaDeTitValor, IIf([SomaDeTitValor]<=3000,[SomaDeTitValor]*0.3,IIf(([SomaDeTitValor]>3000 And [SomaDeTitValor]<=10000),[SomaDeTitValor]*0.25,[SomaDeTitValor]*0.2)) AS LIMITE" & _
    "FROM (dbo_TbDocumento LEFT JOIN dbo_TbTitulo ON dbo_TbDocumento.DocId = dbo_TbTitulo.DocId) INNER JOIN dbo_TbCliente ON dbo_TbDocumento.CliId = dbo_TbCliente.CliId" & _
    "WHERE (((dbo_TbDocumento.DocDataHoraIncl) < Now() And (dbo_TbDocumento.DocDataHoraIncl) >= (Now() - 365)))" & _
    "GROUP BY dbo_TbDocumento.CliId, dbo_TbCliente.CliNomeRazaoSocial, dbo_TbTitulo.TitStatus" & _
    "HAVING ((dbo_TbTitulo.TitStatus)="L");"



    Está dando sintaxe incorreta, mas não tenho idéia de onde.
    Estou colocando isso numa função para retornar o valor de LIMITE de todos os clientes, na consulta comum funciona normalmente, mas na hora de usar na função dá erro de sintaxe.

    srv4ever
    Novato
    Novato

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 35
    Registrado : 20/01/2016

    Re: Atualização de dados baseada em consultas.

    Mensagem  srv4ever em 26/4/2016, 19:00

    up

    srv4ever
    Novato
    Novato

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 35
    Registrado : 20/01/2016

    Re: Atualização de dados baseada em consultas.

    Mensagem  srv4ever em 4/5/2016, 15:52

    up

      Data/hora atual: 22/10/2018, 00:40