ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

[resolvido] Descontos por convênio

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
renanbg
Colaborador
Colaborador


Registrado: Quinta-Feira, 12 de Abril de 2012
Mensagens: 1158

MensagemEnviada: Qui Nov 23, 2017 6:47 am    Assunto: [resolvido] Descontos por convênio Responder com Citação

Amigos, estou pensando em montar uma estrutura para dar descontos diferenciados no mesmo produto, de acordo com o convenio.

----------------------------------------------------
EX: PRODUTO X custa R$ 10,00

Se for um cliente do convenio UNIMED, vai ter um desconto de 20%
Se for um cliente do convenio SITRACOM vai ter desconto de 15%
----------------------------------------------------

A Tabela PROCEDIMENTOS contem os produtos e seus valores

Pensei em criar uma nova tabela chamada DESCONTOS, com essa estrutura

Código:
ID_PRODUTO
ID_CONVENIO
DESCONTO


FUNCIONAMENTO:

AO dar enter num EDIT, um DBGRID abre listando os produtos, de acordo com o filtro digitado no EDIT

No evento de keypress desse dbgrid, eu poderia fazer um novo select na tabela descontos, para ver se o produto selecionado tem desconto.
Em caso positivo, faço os calculos, armazeno o novo valor numa variavel e por fim, listo o produto e seu novo valor num dbgrdid.

Não sei se essa seria a melhor alternativa. O que vocês acham?


Editado pela última vez por renanbg em Qui Nov 30, 2017 10:42 am, num total de 1 vez
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
joemil
Moderador
Moderador


Registrado: Quinta-Feira, 25 de Março de 2004
Mensagens: 9098
Localização: Sinop-MT

MensagemEnviada: Qui Nov 23, 2017 7:57 am    Assunto: Responder com Citação

mas cada procedimento vai ter um desconto diferenciado por convenio ou o convenio vai dar um desconto geral em tudo?
_________________
<b>SEMPRE COLOQUE [RESOLVIDO] NO SEU POST</b>
Enviar imagens: http://tinypic.com/
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
renanbg
Colaborador
Colaborador


Registrado: Quinta-Feira, 12 de Abril de 2012
Mensagens: 1158

MensagemEnviada: Qui Nov 23, 2017 8:21 am    Assunto: Responder com Citação

joemil escreveu:
mas cada procedimento vai ter um desconto diferenciado por convenio ou o convenio vai dar um desconto geral em tudo?


mas cada procedimento vai ter um desconto diferenciado por convenio.

Se você form comprar o produto X, terá 20% de desconto e se eu for comprar o produto X, terei 15%.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Qui Nov 23, 2017 9:39 am    Assunto: Responder com Citação

Bom dia,

Mas eu teria 20% de desconto por causa do meu convênio em todos os procedimentos ou somente em alguns?
Se for em todos os procedimentos e não houver a necessidade de ter um histórico dos descontos com o decorrer do tempo, o desconto poderia até mesmo ficar na tabela de convênios.


Citação:
No evento de keypress desse dbgrid, eu poderia fazer um novo select na tabela descontos, para ver se o produto selecionado tem desconto.
Em caso positivo, faço os calculos, armazeno o novo valor numa variavel e por fim, listo o produto e seu novo valor num dbgrdid.

Mesmo que seja criada a tabela de descontos, acho que você pode fazer um Join na query inicial (a princípio Left Join considerando que pode não ter um desconto) que exibe os procedimentos no DBGrid, sendo que dessa forma você já vai ter o desconto sem esse novo Select que você citou.

Espero que ajude

_________________
Assinatura: https://www.imoveisemexposicao.com.br/imoveis-alugar-guarulhos!v_rio-residencial-apartamento
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
renanbg
Colaborador
Colaborador


Registrado: Quinta-Feira, 12 de Abril de 2012
Mensagens: 1158

MensagemEnviada: Qui Nov 23, 2017 9:55 am    Assunto: Responder com Citação

Somente em alguns procedimentos terão o desconto, por isso pensei em cadastra-los nessa nova tabela.

Desta forma tem como fazer um join?

Hoje minha SQL está assim:

Código:
      qrBusca.Close;
      qrBusca.SQL.Clear;
      qrBusca.SQL.Add('SELECT CODIGO, ID_PROCEDIMENTO, PROCEDIMENTO, VALOR');
      qrBusca.SQL.Add('FROM PROCEDIMENTOS');
      qrBusca.SQL.Add('WHERE ID_PROCEDIMENTO = :ID and (COD_CONVENIO = :CONV OR COD_CONVENIO = 0)');
      qrBusca.ParamByName('ID').AsInteger := StrToInt(edIDProcedimento.Text);

      //Filtro que busca o procedimento pelo convenio vinculado
      if LookupConvenio.Text <> '' then
         qrBusca.ParamByName('CONV').AsInteger := LookupConvenio.KeyValue
      else
         qrBusca.ParamByName('CONV').AsInteger := 0;

      qrBusca.Open;
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Qui Nov 23, 2017 10:23 am    Assunto: Responder com Citação

Segue um exemplo de query:

Código:
SELECT P.CODIGO, P.ID_PROCEDIMENTO, P.PROCEDIMENTO, P.VALOR, D.DESCONTO
FROM PROCEDIMENTOS AS P
LEFT JOIN DESCONTOS AS D
    ON D.ID_PROCEDIMENTO = P.ID_PROCEDIMENTO AND
       D.ID_CONVENIO = P.COD_CONVENIO
WHERE P.ID_PROCEDIMENTO = :ID and (P.COD_CONVENIO = :CONV OR P.COD_CONVENIO = 0)


Espero que ajude
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
renanbg
Colaborador
Colaborador


Registrado: Quinta-Feira, 12 de Abril de 2012
Mensagens: 1158

MensagemEnviada: Qui Nov 23, 2017 12:10 pm    Assunto: Responder com Citação

Hum, entendi.

Então os proximos passos seriam:

1- ver se a query trouxe algum resultado.

NÃO:
showmessage('nada foi encontrado')

SIM:
Código:
if query.fieldbyname(desconto').asfloat > 0 then
variavel:= desconto
else
variavel:= valorsemdesconto;
grava dados


ou, me ocorreu agora, se eu informar o valor do desconto, no campo DESCONTO, lançaria o valorsemdesconto-desconto. Acho que ficaria mais pratico

Vou iniciar a criação da tabela e depois volto pra comentar.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
renanbg
Colaborador
Colaborador


Registrado: Quinta-Feira, 12 de Abril de 2012
Mensagens: 1158

MensagemEnviada: Qui Nov 23, 2017 1:02 pm    Assunto: Responder com Citação

Hum, agora me toquei de uma coisa.

Na tabela PROCEDIMENTO, o ID que vai ter desconto não vai ser vinculado a um convenio, ou seja o P.COD_CONVENIO será sempre zero(0);
Acho que neste caso poderia sem assim

Código:
SELECT P.CODIGO, P.ID_PROCEDIMENTO, P.PROCEDIMENTO, P.VALOR, D.DESCONTO
FROM PROCEDIMENTOS AS P
LEFT JOIN DESCONTOS AS D
    ON D.ID_PROCEDIMENTO = P.ID_PROCEDIMENTO AND
       D.ID_CONVENIO = :CONV                         //alterei aqui
WHERE P.ID_PROCEDIMENTO = :ID and (P.COD_CONVENIO = :CONV OR P.COD_CONVENIO = 0)
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Sáb Nov 25, 2017 7:41 pm    Assunto: Responder com Citação

Sobre o desconto, acho melhor você gravar no campo o percentual, pois pelo jeito é como o usuário está acostumado e dessa forma também não vai ser necessária nenhuma alteração nesse campo quando o valor do procedimento for alterado.
Para exibir tanto o valor do desconto como o valor do procedimento com o desconto, acho que você pode criar campos calculados no DataSet. Se for o caso existem vários artigos sobre esse assunto.

Espero que ajude
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
renanbg
Colaborador
Colaborador


Registrado: Quinta-Feira, 12 de Abril de 2012
Mensagens: 1158

MensagemEnviada: Dom Nov 26, 2017 7:58 am    Assunto: Responder com Citação

Acredite ou não, me pediram que o desconto fosse em valor e não em percentual. Até comentei que a cada reajuste de preços teriam que ir na tabela de descontos e alterar os registros, mas como é o cliente que manda, a gente alerta, mas acata. kkkk

Desta forma, na hora de inserir os dados no cds, mudei de:

Código:
cdstemp.fieldbyname('valor').asfloat := cdsprocedimento.fieldbyname('valor').asfloat;


para

Código:
cdstemp.fieldbyname('valor').asfloat := cdsprocedimento.fieldbyname('valor').asfloat - cdsdesconto.fieldbyname('desconto').asfloat;


se achar o desconto subtrai, se não achar, subtrai por zero, o que mantem o valor original.

aparentemente funciona bem.

Optei por criar uma configuração de desconto maximo, essa sim em percentual. Aí no momento de cadastrar o desconto é feita a verificação para que não ultrapasse 20%, por exemplo. Vou ver se finalizo isso amanhã.

Outra alteração que fiz no select foi no ID_procedimento. Esse campo não é a chave, mas sim um codigo das operadoras de convenio. Aí pensei...se alguem alterar essa ID, lá no cadastro de procedimentos, imediatamente perderei a sua ligação na tabela de descontos.

optei então por usar a ID somente na busca, mas o codigo(autoincremento) na gravação

Código:
SELECT P.CODIGO, P.ID_PROCEDIMENTO, P.PROCEDIMENTO, P.VALOR, D.DESCONTO
FROM PROCEDIMENTOS AS P
LEFT JOIN DESCONTOS AS D
    ON D.COD_PROCEDIMENTO = P.CODIGO AND //ALTEREI AQUI
       D.ID_CONVENIO = :CONV                       
WHERE P.ID_PROCEDIMENTO = :ID and (P.COD_CONVENIO = :CONV OR P.COD_CONVENIO = 0);
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB