Склонение месяца

Как в терасофте поставить месяц в родительный падеж???
Например, чтобы выдавалось вместо Январь Января

Нравится

22 комментария

Можно написать свою функцию, которая по номеру месяца возвращает его название в нужном падеже...

скорее по номеру числа в месяце а не по номеру месяца

"Шевченко Юрий" написал:скорее по номеру числа в месяце а не по номеру месяца

Первое января
второе января
двадцать девятое января

Кстати у меня была давняя задумка вообще функцию добавить в Terrasoft, которая бы возвращала любой падеж... Понятно, что неидеально и сложно бы она работала, но все же. Решилась бы проблема обращений, месяцев и т.д...
но руки естественно не доходят:smile: может в Идеи?

"Александр Кудряшов" написал:Решилась бы проблема обращений, месяцев и т.д.

А это вообще возможно? Если только с использованием каких-нибудь веб-сервисов больших словарей

как вариант платная библиотека http://morpher.ru/Default.aspx. Либо аналоги...
Понятно, что для наилучших результатов нужны большие словари, либо пополняемые, либо доступные в сети.

"Александр Кудряшов" написал:для наилучших результатов нужны большие словари

Лучше самому просклонять фамилию клиента, нежели потом автоматом будет выслано неправильно.

Собственно, нужно для Fast Report, чтобы поле типа "Дата" выходило с месяцем в нужном падеже.
Простым форматированием получается "1 Январь 2010"

Наверное, придется в элементе управления прописывать iif([MonthOf([Date])] = 1; 'Января'; iif()) и так далее.

"Раловец Ольга" написал:Наверное, придется в элементе управления прописывать iif([MonthOf([Date])] = 1; 'Января'; iif()) и так далее.

Или такие варианты:
- в Dataset отчета добавить вычисляемое поле, которое заполняется в скрипте к Dataset;
- в SelectQuery отчета добавить колонку с текстом SQL, в котором через (CASE WHEN THEN END) вычислить месяц.

"Парфенов Евгений" написал:Собственно, нужно для Fast Report, чтобы поле типа "Дата" выходило с месяцем в нужном падеже.
Простым форматированием получается "1 Январь 2010"

в отчете в Code добавляете функцию типа

function MonthDecl(aDate: TDateTime): String;  
begin
    case MonthOf(aDate) of
    0: Result:= 'Января';
    1: Result:= 'Февраля';
    //...
    end            
end;

и вызываете ее где необходимо

Всем спасибо. Публикую полученную версию - может кому понадобится :)

// Дата в родительном падеже
function DecodeDateRod(aDate: TDateTime): String;
var m : string;
d, y : integer;
begin
m:= '';

case MonthOf(aDate) of
0: m:= 'Января';
1: m:= 'Февраля';
2: m:= 'Марта';
3: m:= 'Апреля';
4: m:= 'Мая';
5: m:= 'Июня';
6: m:= 'Июля';
7: m:= 'Августа';
8: m:= 'Сентября';
9: m:= 'Октября';
10: m:= 'Ноября';
11: m:= 'Декабря';
end;

d := DayOf(aDate);
y := YearOf(aDate);

Result := Inttostr(d) + ' ' + m + ' ' + Inttostr(y) + 'г.';
end;

Около года назад тоже сделал такую процедурку)) Возникала частая потребность, так что даже выделил в отдельный скрипт, хотел еще назвать 'имени FastReport':lol:

Поправочка - отчет должен идти с 1цы... 1= Январь и пр..

Да нет, все же с 0. Я настаиваю:wink:

"Fishi" написал:Да нет, все же с 0. Я настаиваю

Вы настаиваете, а у меня счета будущим месяцем проходят...
Меня такое как то мягко говоря не очень устраивает :)

Тогда у меня надо сначала m++)))
У меня версия TS 3.1.1 X25, хотя не думаю что это существенно... Ждем пока кто разяснит ситуацию, пока 1:1)

А у меня TS 3.3.0.61 )))

Подскажите, куда вставлять данную функцию и как ее вызвать в FastReports?

Функция DecodeDateRod описанная в комментарии
http://www.community.terrasoft.ru/forum/topic/4393#comment-17243
формирует дату в формате 29 Сентября 2011 г.
Данную фунцию следует объявить в вкладке Code в сервисе FastReport

Саму функцию следует объявить до самого ее вызова, к примеру в самом начеле кода.

Предположим, что у нас есть Memo1 контрол который находится на странице FastReport в котором мы отображаем дату

Добавим обработчик OnBeforePrint на Memo1

В коде обработчика будем вызывать функцию преобразования даты

procedure Memo1OnBeforePrint(Sender: TfrxComponent);
begin
Memo1.Text :=DecodeDateRod(<TSDataset1."MyDate">);
end;

В данном коде предполагается, что к отчету подключен TSDataset1, в котором задан конкретный Dataset, в котором есть колонка MyDate где хранится даты для отображения
В предпросмотре получим следующий результат

Полный код сервиса FastReport:

function DecodeDateRod(aDate: TDateTime): String;
var m : string;
d, y : integer;
begin
m:= ''; 
case MonthOf(aDate) of
0: m:= 'Января';
1: m:= 'Февраля';
2: m:= 'Марта';
3: m:= 'Апреля';
4: m:= 'Мая';
5: m:= 'Июня';
6: m:= 'Июля';
7: m:= 'Августа';
8: m:= 'Сентября';
9: m:= 'Октября';
10: m:= 'Ноября';
11: m:= 'Декабря';
end;
d := DayOf(aDate);
y := YearOf(aDate); 
Result := Inttostr(d) + ' ' + m + ' ' + Inttostr(y) + 'г.';
end;
 
procedure Memo1OnBeforePrint(Sender: TfrxComponent);
begin
Memo1.Text :=DecodeDateRod(<TSDataset1."MyDate">);
end;
 
begin
 
end.

Пример сервисов, на которых тестировал вывод, в прикрепленных файлах.

Алексей, без Ваших пояснений никогда бы не разобрался) Все получилось!

Единственное, результат полностью перебивал значение Memo (выводилась только дата), а мне в нем нужны были еще данные, для заголовка счета. В результате дописал процедуру, не знаю насколько это корректно, но нужного результата я добился:

procedure Memo13OnBeforePrint(Sender: TfrxComponent);
begin
Memo13.Text :='Счет №' + Inttostr(<ds_ReportInvoiceWithNDSForRussia."InvoiceNumber">)+ ' ' + 'от' + ' ' + DecodeDateRod(<ds_ReportInvoiceWithNDSForRussia."InvoiceDate">);
end;

Рад, что у вас все получилось, если будут вопросы, обращайтесь.

Показать все комментарии