|
ActiveDelphi .: O site do programador Delphi! :.
|
Exibir mensagem anterior :: Exibir próxima mensagem |
Autor |
Mensagem |
renanbg Colaborador
Registrado: Quinta-Feira, 12 de Abril de 2012 Mensagens: 1158
|
Enviada: Qui Nov 23, 2017 6:47 am Assunto: [resolvido] Descontos por convênio |
|
|
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 |
|
|
joemil Moderador
Registrado: Quinta-Feira, 25 de Março de 2004 Mensagens: 9098 Localização: Sinop-MT
|
Enviada: Qui Nov 23, 2017 7:57 am Assunto: |
|
|
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 |
|
|
renanbg Colaborador
Registrado: Quinta-Feira, 12 de Abril de 2012 Mensagens: 1158
|
Enviada: Qui Nov 23, 2017 8:21 am Assunto: |
|
|
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 |
|
|
imex Moderador
Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Qui Nov 23, 2017 9:39 am Assunto: |
|
|
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 |
|
|
renanbg Colaborador
Registrado: Quinta-Feira, 12 de Abril de 2012 Mensagens: 1158
|
Enviada: Qui Nov 23, 2017 9:55 am Assunto: |
|
|
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 |
|
|
imex Moderador
Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Qui Nov 23, 2017 10:23 am Assunto: |
|
|
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 |
|
|
renanbg Colaborador
Registrado: Quinta-Feira, 12 de Abril de 2012 Mensagens: 1158
|
Enviada: Qui Nov 23, 2017 12:10 pm Assunto: |
|
|
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 |
|
|
renanbg Colaborador
Registrado: Quinta-Feira, 12 de Abril de 2012 Mensagens: 1158
|
Enviada: Qui Nov 23, 2017 1:02 pm Assunto: |
|
|
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 |
|
|
imex Moderador
Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Sáb Nov 25, 2017 7:41 pm Assunto: |
|
|
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 |
|
|
renanbg Colaborador
Registrado: Quinta-Feira, 12 de Abril de 2012 Mensagens: 1158
|
Enviada: Dom Nov 26, 2017 7:58 am Assunto: |
|
|
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 |
|
|
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|