Как в терасофте поставить месяц в родительный падеж???
Например, чтобы выдавалось вместо Январь Января
Нравится
Можно написать свою функцию, которая по номеру месяца возвращает его название в нужном падеже...
"Шевченко Юрий" написал:скорее по номеру числа в месяце а не по номеру месяца
Первое января
второе января
двадцать девятое января
Кстати у меня была давняя задумка вообще функцию добавить в 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 добавляете функцию типа
[javascript]
function MonthDecl(aDate: TDateTime): String;
begin
case MonthOf(aDate) of
0: Result:= 'Января';
1: Result:= 'Февраля';
//...
end
end;
[/javascript]
и вызываете ее где необходимо
Всем спасибо. Публикую полученную версию - может кому понадобится :)
// Дата в родительном падеже
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;
Поправочка - отчет должен идти с 1цы... 1= Январь и пр..
"Fishi" написал:Да нет, все же с 0. Я настаиваю
Вы настаиваете, а у меня счета будущим месяцем проходят...
Меня такое как то мягко говоря не очень устраивает :)
Подскажите, куда вставлять данную функцию и как ее вызвать в FastReports?
Функция DecodeDateRod описанная в комментарии
http://www.community.terrasoft.ru/forum/topic/4393#comment-17243
формирует дату в формате 29 Сентября 2011 г.
Данную фунцию следует объявить в вкладке Code в сервисе FastReport

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

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

В коде обработчика будем вызывать функцию преобразования даты
[csharp]
procedure Memo1OnBeforePrint(Sender: TfrxComponent);
begin
Memo1.Text :=DecodeDateRod();
end;
[/csharp]
В данном коде предполагается, что к отчету подключен TSDataset1, в котором задан конкретный Dataset, в котором есть колонка MyDate где хранится даты для отображения
В предпросмотре получим следующий результат

Полный код сервиса FastReport:
[csharp]
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();
end;
begin
end.
[/csharp]
Пример сервисов, на которых тестировал вывод, в прикрепленных файлах.
Алексей, без Ваших пояснений никогда бы не разобрался) Все получилось!
Единственное, результат полностью перебивал значение Memo (выводилась только дата), а мне в нем нужны были еще данные, для заголовка счета. В результате дописал процедуру, не знаю насколько это корректно, но нужного результата я добился:
[javascript]
procedure Memo13OnBeforePrint(Sender: TfrxComponent);
begin
Memo13.Text :='Счет №' + Inttostr()+ ' ' + 'от' + ' ' + DecodeDateRod();
end;
[/javascript]
Рад, что у вас все получилось, если будут вопросы, обращайтесь.