Кстати у меня была давняя задумка вообще функцию добавить в Terrasoft, которая бы возвращала любой падеж... Понятно, что неидеально и сложно бы она работала, но все же. Решилась бы проблема обращений, месяцев и т.д...
но руки естественно не доходят:smile: может в Идеи?
как вариант платная библиотека http://morpher.ru/Default.aspx. Либо аналоги...
Понятно, что для наилучших результатов нужны большие словари, либо пополняемые, либо доступные в сети.
"Раловец Ольга" написал:Наверное, придется в элементе управления прописывать 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;
Около года назад тоже сделал такую процедурку)) Возникала частая потребность, так что даже выделил в отдельный скрипт, хотел еще назвать 'имени FastReport':lol:
Саму функцию следует объявить до самого ее вызова, к примеру в самом начеле кода.
Предположим, что у нас есть 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 (выводилась только дата), а мне в нем нужны были еще данные, для заголовка счета. В результате дописал процедуру, не знаю насколько это корректно, но нужного результата я добился: