Критерии выбора Crystal Reports: очистка кода выбранной даты

#crystal-reports #crystal-reports-8.5

#crystal-отчеты #crystal-reports-8.5

Вопрос:

У меня есть повторяющийся отчет, который запускается два раза в месяц для проверки определенных дат. Я ищу все, что не попадает на следующий 15-й или следующий последний день месяца.

Я использую Crystal Reports 8.5, если это имеет значение.

Я нашел способ автоматизировать этот процесс, но он очень громоздкий. Мне интересно, есть ли более элегантное решение для следующего кода:

 if DatePart ("d", CurrentDate) < 15 then
    not ((DatePart ("d", {gb_comb_stmt.nxt_stmt_dt}) = 15  and
        DatePart ("m", {gb_comb_stmt.nxt_stmt_dt}) = DatePart ("m", CurrentDate) and
        DatePart ("yyyy", {gb_comb_stmt.nxt_stmt_dt}) = DatePart ("yyyy", CurrentDate))

        or (DatePart ("d", {gb_comb_stmt.nxt_stmt_dt}) = DatePart("d", DateAdd("d", -1 , DateAdd("m", 1 , Date(year(currentDate), month(currentDate), 1))))  and
        DatePart ("m", {gb_comb_stmt.nxt_stmt_dt}) = DatePart ("m", CurrentDate) and
        DatePart ("yyyy", {gb_comb_stmt.nxt_stmt_dt}) = DatePart ("yyyy", CurrentDate)))
else
    not ((DatePart ("d", {gb_comb_stmt.nxt_stmt_dt}) = 15  and
        DatePart ("m", {gb_comb_stmt.nxt_stmt_dt}) = (DatePart ("m", CurrentDate)   1) and
        DatePart ("yyyy", {gb_comb_stmt.nxt_stmt_dt}) = DatePart ("yyyy", CurrentDate))

        or (DatePart ("d", {gb_comb_stmt.nxt_stmt_dt}) = DatePart("d", DateAdd("d", -1 , DateAdd("m", 1 , Date(year(currentDate), month(currentDate), 1))))  and
        DatePart ("m", {gb_comb_stmt.nxt_stmt_dt}) = DatePart ("m", CurrentDate) and
        DatePart ("yyyy", {gb_comb_stmt.nxt_stmt_dt}) = DatePart ("yyyy", CurrentDate)))
 

Ответ №1:

Вы можете получить последний день месяца с помощью этой формулы. На простом английском языке он возвращает «за день до первого числа следующего месяца»:

dateserial(year(currentdate),month(currentdate) 1,1-1)

«Следующее 15-е число месяца» лишь немного отличается:

 if datepart("d",currentdate) < 16
     then dateserial(year(currentdate),month(currentdate),15)
else
     dateserial(year(currentdate),month(currentdate) 1,15) 

Объединяя эти два, окончательный выбор записи будет выглядеть следующим образом:

 not({gb_comb_stmt.nxt_stmt_dt} = {@formula1})
and not({gb_comb_stmt.nxt_stmt_dt} = {@formula2}) 

Комментарии:

1. Похоже, что функция «dateserial ()» является здесь коротким ответом. Я думаю, это покрывает это, спасибо.