Ajuda em melhorar o código, deixar o código mais limpo (sequência de if then)

24/05/2020

0

Boa tarde, gostaria da ajuda para melhorar o trecho a seguir (deixar mais limpo )

data_ini := StartOfTheMonth(gf_data_fim);
data_fim := gf_data_fim;

ultimo_dia := EndOfTheMonth(data_fim);
dia_str := copy(FormatDateTime('dd/mm/yyyy',data_fim), 1, 2);


if trunc(ultimo_dia) = trunc(data_fim) then
begin
data_ini := StartOfTheMonth(data_fim);
data_fim := data_fim
end;

if (trunc(data_fim) < trunc(ultimo_dia)) and (StrToInt(dia_str) > 3)then
begin
data_ini := data_fim - 3;
data_fim := data_fim;
end;

if (trunc(data_fim) < trunc(ultimo_dia)) and (StrToInt(dia_str) = 3) then
begin
data_ini := data_fim - 2;
data_fim := data_fim;
end;

if (trunc(data_fim) < trunc(ultimo_dia)) and (StrToInt(dia_str) = 2) then
begin
data_ini := data_fim - 1;
data_fim := data_fim;
end;

if (trunc(data_fim) < trunc(ultimo_dia)) and (StrToInt(dia_str) = 1) then
begin
data_ini := data_fim;
data_fim := data_fim;
end;

minha aplicação tem uma exportação diária do caixa e ela ocorre da seguinte maneira

último dia da cada mês eu exporto os 30 ou 31 dias, mas por exemplo no dia 29 eu exporto apenas os últimos 3 dias (29 - 3) assim ficaria dias 29, 28,27 e 26, para os dias iniciais do mês se for dia 2 eu exporto dia 2 menos 1 (exportando assim dias 2 e 1), dia 3 eu exporto 3 menos 2 (exportando dias 3, 2, e 1). Assim eu evito que nos dias iniciais do mês eu não exporte os últimos dias o mês anterior.
Emanuel Gonçalves

Emanuel Gonçalves

Responder

Post mais votado

24/05/2020

basta fazer:
var
  dia: word;

  [...]

  data_ini := StartOfTheMonth(gf_data_fim); // data_ini = 1o. dia do mês de gf_data_fim
  data_fim := gf_data_fim;
  ultimo_dia := EndOfTheMonth(data_fim); // ultimo_dia = ultimo dia do mês de gf_data_fim
  dia := DayOf(data_fim); // dia em data_fim - DayOf() está contida na unit DateUtils

  // se data_fim for igual a ultimo_dia, nada precisa ser feito
  // porque data_ini seria '01/05/2020' e data_fim seria '31/05/2020'

  // se data_fim for menor que ultimo_dia, e dia for maior que 3, obtém sempre os últimos 4 dias
  // portanto, se data_fim = '25/05/2020', então data_ini será '22/05/2020'
  if (trunc(data_fim) < trunc(ultimo_dia)) and (dia > 3) then
    data_ini := data_fim - 3

  // se dia for menor ou igual a 3, nada precisa ser feito,
  // porque data_ini seria '01/05/2020' e data_fim seria, por exemplo, '03/05/2020'
ou seja: basta um único if

Emerson Nascimento

Emerson Nascimento
Responder

Mais Posts

24/05/2020

Emerson Nascimento

basta fazer:
var
  dia_data_ini, dia_data_fim, dia_ultimo_dia: word;

  // da forma que as variáveis são tratadas abaixo,
  // sabemos que todas as datas estão dentro do mesmo mês
  // logo só é preciso trabalhar com o dia
  data_ini := StartOfTheMonth(gf_data_fim); // data_ini = 1o. dia do mês de gf_data_fim
  data_fim := gf_data_fim;
  ultimo_dia := EndOfTheMonth(data_fim); // ultimo_dia = ultimo dia do mês de gf_data_fim
  dia_data_ini := DayOf(data_ini); // dia em data_ini - DayOf() está na unit DateUtils
  dia_data_fim := DayOf(data_fim); // dia em data_fim - DayOf() está na unit DateUtils
  dia_ultimo_dia := DayOf(ultimo_dia); // dia em ultimo_dia - DayOf() está na unit DateUtils

  // se o dia_data_fim for igual a dia_ultimo_dia, nada precisa ser feito
  // porque data_ini seria '01/05/2020' e data_fim seria '31/05/2020'

  // se dia_data_fim for maior que 3 e menor que dia_ultimo_dia, obtém sempre os últimos 4 dias
  // portanto, se dia_data_fim = 25, então data_ini será '22/05/2020'
  if (dia_data_fim < dia_ultimo_dia) and (dia_data_fim > 3) then
    data_ini := data_fim - 3

  // se dia_data_fim for menor ou igual a 3, nada precisa ser feito,
  // porque data_ini seria '01/05/2020' e data_fim seria, por exemplo, '03/05/2020'
ou seja: você precisa de um único if
Responder

25/05/2020

Emanuel Gonçalves

Perfeito, muito obrigado !!!

basta fazer:
var
  dia: word;

  [...]

  data_ini := StartOfTheMonth(gf_data_fim); // data_ini = 1o. dia do mês de gf_data_fim
  data_fim := gf_data_fim;
  ultimo_dia := EndOfTheMonth(data_fim); // ultimo_dia = ultimo dia do mês de gf_data_fim
  dia := DayOf(data_fim); // dia em data_fim - DayOf() está contida na unit DateUtils

  // se data_fim for igual a ultimo_dia, nada precisa ser feito
  // porque data_ini seria '01/05/2020' e data_fim seria '31/05/2020'

  // se data_fim for menor que ultimo_dia, e dia for maior que 3, obtém sempre os últimos 4 dias
  // portanto, se data_fim = '25/05/2020', então data_ini será '22/05/2020'
  if (trunc(data_fim) < trunc(ultimo_dia)) and (dia > 3) then
    data_ini := data_fim - 3

  // se dia for menor ou igual a 3, nada precisa ser feito,
  // porque data_ini seria '01/05/2020' e data_fim seria, por exemplo, '03/05/2020'
ou seja: basta um único if
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar