 |
ActiveDelphi .: O site do programador Delphi! :.
|
Exibir mensagem anterior :: Exibir próxima mensagem |
Autor |
Mensagem |
lbeckerf Novato

Registrado: Quarta-Feira, 27 de Março de 2013 Mensagens: 6
|
Enviada: Dom Abr 28, 2013 10:21 pm Assunto: Calculos [RESOLVIDO] |
|
|
Boa noite a todos, me chamo Lauro Becker.
Estou trabalhando em um sistema de recibos sendo que preciso calcular o INSS o procedimento abaixo recebe o valor e teoricamente deveria identificar a faixa de percentual e calcular e alimentar a variavel inss, o procedimento esta calculando corretamente com as procentagens de 9 e 11%, mas na de 8% ele não calcula... Peço perdão pela minha falta de experiência tenho uns 2 meses que estou estudando pela net, isso quando esta esta funcionando... Desde já agradeço a compreensão de todos... Obrigado.
Segue código:
procedure Tfrm_principal.CalculaINSS;
begin
if (CB_INSS_SIM.Checked = true) and (DB_Vlr_Bruto.Field.Value > 0) then
begin
if (DB_Vlr_Bruto.Field.Value > 100) and (DB_Vlr_Bruto.Field.Value <= frm_config.DBE_inss_fx01.Field.Value)
then
inss := (DB_Vlr_Bruto.Field.Value * /100;
lb_idc_inss.Caption := '8,00';
if (DB_Vlr_Bruto.Field.Value >= frm_config.DBE_inss_fx02.Field.Value) and (DB_Vlr_Bruto.Field.Value <= frm_config.DBE_inss_fx03.Field.Value)
then
inss := (DB_Vlr_Bruto.Field.Value * 9)/100;
lb_idc_inss.Caption := '9,00';
if (DB_Vlr_Bruto.Field.Value >= frm_config.DBE_inss_fx04.Field.Value) and (DB_Vlr_Bruto.Field.Value <= frm_config.DBE_inss_fx05.Field.Value)
then
inss := (DB_Vlr_Bruto.Field.Value * 11)/100;
lb_idc_inss.Caption := '11,00';
if (DB_Vlr_Bruto.Field.Value > frm_config.DBE_inss_fx05.Field.Value)
then
inss := (frm_config.DBE_inss_fx05.Field.Value * 11)/100;
lb_idc_inss.Caption := '11,00';
end
else
inss := 0;
end;
Editado pela última vez por lbeckerf em Qua Mai 01, 2013 10:31 pm, num total de 1 vez |
|
Voltar ao Topo |
|
 |
felipekk Colaborador


Registrado: Quinta-Feira, 5 de Janeiro de 2012 Mensagens: 1531 Localização: Pirapora - MG
|
Enviada: Seg Abr 29, 2013 9:00 am Assunto: |
|
|
Bom dia e seja bem vindo ao fórum.
Vc verificou se essas condições estão sendo satisfeitas?
Código: | if (CB_INSS_SIM.Checked = true) and (DB_Vlr_Bruto.Field.Value > 0) then
begin
if (DB_Vlr_Bruto.Field.Value > 100) and (DB_Vlr_Bruto.Field.Value <= frm_config.DBE_inss_fx01.Field.Value)
then |
_________________ "Esteja ligado em melhora contínua: hoje melhor do que ontem e pior do que amanhã."
 |
|
Voltar ao Topo |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Seg Abr 29, 2013 10:50 am Assunto: |
|
|
Bom dia,
Para executar mais de um comando dentro de um If é necessário delimitar os comandos dentro de um bloco Begin / End mais ou menos como segue:
Código: | if {condições} then
begin
// comandos
// comandos
end
else
if {outras condições} then
begin
// comandos
// comandos
end
else
begin
// comandos
// comandos
end; |
Espero que ajude.
_________________
Assinatura: http://www.imoveisemexposicao.com.br/imoveis-em-guarulhos |
|
Voltar ao Topo |
|
 |
lbeckerf Novato

Registrado: Quarta-Feira, 27 de Março de 2013 Mensagens: 6
|
Enviada: Seg Abr 29, 2013 1:38 pm Assunto: |
|
|
felipekk escreveu: | Bom dia e seja bem vindo ao fórum.
Vc verificou se essas condições estão sendo satisfeitas?
Código: | if (CB_INSS_SIM.Checked = true) and (DB_Vlr_Bruto.Field.Value > 0) then
begin
if (DB_Vlr_Bruto.Field.Value > 100) and (DB_Vlr_Bruto.Field.Value <= frm_config.DBE_inss_fx01.Field.Value)
then |
|
Boa tarde!
Muito obrigado pela atenção Felipe. Sim esta condição esta sendo satisfeita, ja bati cabeça e nada se vc quiser e tiver tempo posso te mandar por email o meu projeto para vc. Obrigado e boa tarde! |
|
Voltar ao Topo |
|
 |
lbeckerf Novato

Registrado: Quarta-Feira, 27 de Março de 2013 Mensagens: 6
|
Enviada: Seg Abr 29, 2013 1:40 pm Assunto: |
|
|
imex escreveu: | Bom dia,
Para executar mais de um comando dentro de um If é necessário delimitar os comandos dentro de um bloco Begin / End mais ou menos como segue:
Código: | if {condições} then
begin
// comandos
// comandos
end
else
if {outras condições} then
begin
// comandos
// comandos
end
else
begin
// comandos
// comandos
end; |
Espero que ajude.
_________________
Assinatura: http://www.imoveisemexposicao.com.br/imoveis-em-guarulhos |
Boa tarde!
Imex muito obrigado pela orientação, esta ja não sai mais da minha cabeça. Agradeço antecipadamente a ajuda de todos! |
|
Voltar ao Topo |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Seg Abr 29, 2013 4:03 pm Assunto: |
|
|
Desculpe mas não entendi o que você quis dizer.
Acho que você vai conseguir resolver essa questão se colocar os comandos a serem executas para cada condição dentro de um bloco Begin / End.
Qualquer coisa volte a postar. |
|
Voltar ao Topo |
|
 |
lbeckerf Novato

Registrado: Quarta-Feira, 27 de Março de 2013 Mensagens: 6
|
Enviada: Seg Abr 29, 2013 11:11 pm Assunto: |
|
|
Imex, boa noite! quando falei "essa não saia mais da minha cabeça" estava falando da sua orientação sobre a organização do codigo...
Sobre o problema: este codigo é para cacular o valor do inss que incide sobre o valor nas faixas de 8%, 9% e 11% e o teto maximo é de R$ 457,27:
valor ate 1247,11 desconta 8%, valor de 1247,12 ate 2078,52 desconta 9%, valor de 2078,53 ate 4157,05 desconta 11%, valor acima de 4157,05 desconta teto maximo de 11%, ou seja 457,27. O sistema esta calculando corretamente todas as faixas, o erro esta quando o valor bruto é menor que 1000, dae ele calcula direto o teto maximo, como se o valor bruto fosse maior que 4157,05..... Ja mudei o codigo veja:
procedure Tfrm_principal.CalculaINSS;
begin
if (DB_Vlr_Bruto.Field.Value > 100) and (DB_Vlr_Bruto.Field.Value <= frm_config.DBE_inss_fx01.Field.Value)
then
begin
inss := (DB_Vlr_Bruto.Field.Value * /100;
lb_idc_inss.Caption := '8,00';
end
else
if (DB_Vlr_Bruto.Field.Value >= frm_config.DBE_inss_fx02.Field.Value) and (DB_Vlr_Bruto.Field.Value <= frm_config.DBE_inss_fx03.Field.Value)
then
begin
inss := (DB_Vlr_Bruto.Field.Value * 9)/100;
lb_idc_inss.Caption := '9,00';
end
else
if (DB_Vlr_Bruto.Field.Value >= frm_config.DBE_inss_fx04.Field.Value) and (DB_Vlr_Bruto.Field.Value <= frm_config.DBE_inss_fx05.Field.Value)
then
begin
inss := (DB_Vlr_Bruto.Field.Value * 11)/100;
lb_idc_inss.Caption := '11,00';
end
else
if (DB_Vlr_Bruto.Field.Value > frm_config.DBE_inss_fx05.Field.Value)
then
begin
inss := (frm_config.DBE_inss_fx05.Field.Value * 11)/100;
lb_idc_inss.Caption := '11,00';
end
else
inss := 0;
end;
Desde ja agradeço a ajuda e boa noite a todos!!!!! |
|
Voltar ao Topo |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Ter Abr 30, 2013 2:31 pm Assunto: |
|
|
Boa tarde,
Confirma uma coisa... o erro está ocorendo quando o valor bruto é menor ou igual a 100 ou 1000?
Acho que você teria que verificar e/ou postar os valores que estão em frm_config.DBE_inss_fx01 a frm_config.DBE_inss_fx05 para analisarmos melhor o seu código.
Acho também que seria melhor ter um campo para a aliquota de cada faixa (ex: frm_config.DBE_inss_aliq01 a frm_config.DBE_inss_aliq05) e outro para o teto do valor bruto, pois dessa forma esses valores não ficariam fixos no código.
Qualquer coisa volte a postar.
Espero que ajude. |
|
Voltar ao Topo |
|
 |
lbeckerf Novato

Registrado: Quarta-Feira, 27 de Março de 2013 Mensagens: 6
|
Enviada: Ter Abr 30, 2013 9:42 pm Assunto: |
|
|
imex escreveu: | Boa tarde,
Confirma uma coisa... o erro está ocorendo quando o valor bruto é menor ou igual a 100 ou 1000?
Acho que você teria que verificar e/ou postar os valores que estão em frm_config.DBE_inss_fx01 a frm_config.DBE_inss_fx05 para analisarmos melhor o seu código.
Acho também que seria melhor ter um campo para a aliquota de cada faixa (ex: frm_config.DBE_inss_aliq01 a frm_config.DBE_inss_aliq05) e outro para o teto do valor bruto, pois dessa forma esses valores não ficariam fixos no código.
Qualquer coisa volte a postar.
Espero que ajude. |
Boa noite a todos!
Imex, o erro ocorre quando o valor bruto é menor que 1000, acima deste valor o calculo é efetuado corretamente.. segue os valores:
frm_config.DBE_inss_fx01.Field.Value = 1247,11
frm_config.DBE_inss_fx02.Field.Value = 1247,12
frm_config.DBE_inss_fx03.Field.Value = 2078,52
frm_config.DBE_inss_fx04.Field.Value = 2078,53
frm_config.DBE_inss_fx05.Field.Value = 4157,05
A lógica é a seguinte:
Se o valor_bruto for menor ou igual a 1247,11 então o desconto de inss do valor_bruto é de 8%.
Se o valor_bruto for maior ou igual a 1247,12 e menor ou igual a 2078,52 então o desconto de inss do valor_bruto é de 9%.
Se o valor_bruto for maior ou igual a 2078,53 e menor ou igual a 4157,05 então o desconto de inss do valor_bruto é de 11%.
Se o valor_bruto for maior ou igual a 4157,05 então o desconto de inss do valor_bruto é de 11%.
Desde já agradeço o tempo que vc tem disponibilizado para me ajudar! |
|
Voltar ao Topo |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Qua Mai 01, 2013 9:17 pm Assunto: |
|
|
Boa noite,
Fiz algumas alterações no seu código (substitui DB_Vlr_Bruto.Field.Value pela variável vVlr_Bruto, e frm_config.DBE_inss_fx01.Field.Value a frm_config.DBE_inss_fx05.Field.Value pelas constantes cFx01 a cFx05) apenas para testa-lo em relação ao problema que você relatou quando o valor bruto é menor que 1000 (não testei outros valores) e o problema não ocorreu. Segue o código:
Código: | procedure Tfrm_principal.CalculaINSS;
const
cFx01 = 1247.11;
cFx02 = 1247.12;
cFx03 = 2078.52;
cFx04 = 2078.53;
cFx05 = 4157.05;
var
vVlr_Bruto: currency;
inss: currency;
begin
vVlr_Bruto := 900;
if (vVlr_Bruto > 100) and (vVlr_Bruto <= cFx01) then
begin
inss := (vVlr_Bruto * 8) / 100;
lb_idc_inss.Caption := '8,00';
end
else
if (vVlr_Bruto >= cFx02) and (vVlr_Bruto <= cFx03) then
begin
inss := (vVlr_Bruto * 9)/100;
lb_idc_inss.Caption := '9,00';
end
else
if (vVlr_Bruto >= cFx04) and (vVlr_Bruto <= cFx05) then
begin
inss := (vVlr_Bruto * 11)/100;
lb_idc_inss.Caption := '11,00';
end
else
if (vVlr_Bruto > cFx05) then
begin
inss := (cFx05 * 11)/100;
lb_idc_inss.Caption := '11,00';
end
else
inss := 0;
ShowMessage('INSS = ' + FormatFloat('#,##0.00', inss));
end; |
Também acho que é possível melhorar a lógica utilizada nos Ifs.
Espero que seja útil. |
|
Voltar ao Topo |
|
 |
lbeckerf Novato

Registrado: Quarta-Feira, 27 de Março de 2013 Mensagens: 6
|
Enviada: Qua Mai 01, 2013 10:30 pm Assunto: |
|
|
imex escreveu: | Boa noite,
Fiz algumas alterações no seu código (substitui DB_Vlr_Bruto.Field.Value pela variável vVlr_Bruto, e frm_config.DBE_inss_fx01.Field.Value a frm_config.DBE_inss_fx05.Field.Value pelas constantes cFx01 a cFx05) apenas para testa-lo em relação ao problema que você relatou quando o valor bruto é menor que 1000 (não testei outros valores) e o problema não ocorreu. Segue o código:
Código: | procedure Tfrm_principal.CalculaINSS;
const
cFx01 = 1247.11;
cFx02 = 1247.12;
cFx03 = 2078.52;
cFx04 = 2078.53;
cFx05 = 4157.05;
var
vVlr_Bruto: currency;
inss: currency;
begin
vVlr_Bruto := 900;
if (vVlr_Bruto > 100) and (vVlr_Bruto <= cFx01) then
begin
inss := (vVlr_Bruto * 8) / 100;
lb_idc_inss.Caption := '8,00';
end
else
if (vVlr_Bruto >= cFx02) and (vVlr_Bruto <= cFx03) then
begin
inss := (vVlr_Bruto * 9)/100;
lb_idc_inss.Caption := '9,00';
end
else
if (vVlr_Bruto >= cFx04) and (vVlr_Bruto <= cFx05) then
begin
inss := (vVlr_Bruto * 11)/100;
lb_idc_inss.Caption := '11,00';
end
else
if (vVlr_Bruto > cFx05) then
begin
inss := (cFx05 * 11)/100;
lb_idc_inss.Caption := '11,00';
end
else
inss := 0;
ShowMessage('INSS = ' + FormatFloat('#,##0.00', inss));
end; |
Também acho que é possível melhorar a lógica utilizada nos Ifs.
Espero que seja útil. |
Boa noite a todos!
imex meu irmão, problema resolvido.... muito obrigado pelo o tempo que disponibilizou para me ajudar, espero que este tópico sirva para alguém que assim como eu estava com esta dúvida... Cara te desejo todo o sucesso. Obrigado e qualquer coisa é só falar!! vlw! |
|
Voltar ao Topo |
|
 |
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|