Как в терасофте поставить месяц в родительный падеж???
Например, чтобы выдавалось вместо Январь Января
Нравится
Можно написать свою функцию, которая по номеру месяца возвращает его название в нужном падеже...
"Шевченко Юрий" написал:скорее по номеру числа в месяце а не по номеру месяца
Первое января
второе января
двадцать девятое января
Кстати у меня была давняя задумка вообще функцию добавить в 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;
Поправочка - отчет должен идти с 1цы... 1= Январь и пр..
"Fishi" написал:Да нет, все же с 0. Я настаиваю
Вы настаиваете, а у меня счета будущим месяцем проходят...
Меня такое как то мягко говоря не очень устраивает :)
Подскажите, куда вставлять данную функцию и как ее вызвать в 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;
Рад, что у вас все получилось, если будут вопросы, обращайтесь.