Здравствуйте Террасофт!
В созданном "ФастРепорт" отчете реализована функция подстановки суммы прописью, следующим образом:
ConvertUtils, CurrencyUtils: Variant;
procedure memSummaOnBeforePrint(Sender: TfrxComponent);
var
Amount: String;
AmountInStr: String;
begin
Amount := FloatToStr(SUM(
AmountInStr := ConvertUtils.ScriptControl.CodeObject.AmountToStr(Amount, 'ru', 'RUB');
memSumma.Text := AmountInStr;
end;
procedure frxReportOnStartReport(Sender: TfrxComponent);
var
Connector: Variant;
begin
Connector := ds_ReportInvoiceWithNDSForRussia11.GetConnector();
ConvertUtils := Connector.Services.GetNewItemByUSI('scr_ConvertUtils');
CurrencyUtils := Connector.Services.GetNewItemByUSI('scr_CurrencyUtils');
end;
begin
end.
Подскажите как реализовать подстановку копеек цифрами, а остальное оставить, как было, буквами?
Нравится
Игорь, могу сказать, что у нас это рализовано, возможно, не самым оптимальным методом, поскольку дорабатывался этот функционал на заре знакомства с системой, но работает так:
function PartAmountInCurrencyToString(Dataset, SumString, UE, UEkopek, ValUE, ValUEkopek){ var kopekString = SumString.substring(SumString.lastIndexOf(UEkopek),SumString.length); var rubleString = SumString.substring(SumString.lastIndexOf(UE),SumString.length); rubleString = rubleString.substring(0,rubleString.indexOf(' ')); var rubleValSring = SumString.substring(0,SumString.indexOf(UE) - 1); Dataset.Values('SumString') = rubleValSring + ' ' + rubleString + ' ' + ValUEkopek + ' ' + kopekString; }
В качестве SumString передается то, что у Вас лежит в AmountInStr. Затем происходит запись непосредственно в Датасет... Вы можете использовать просто переменную...
По другим параметрам:
пример вызова PartAmountInCurrencyToString(Dataset,SumString, 'руб', 'коп', ruble, kopek);
при этом
//Рубли и копейки var fullSum = Dataset.ValAsStr('Amount') if(fullSum.lastIndexOf(",") == -1){ fullSum = fullSum + ',00'; } //если "круглое" число копеек if(fullSum.lastIndexOf(",") == fullSum.length - 2){ fullSum = fullSum + '0'; } var ruble = fullSum.substring(0,fullSum.lastIndexOf(",")); var kopek = fullSum.substring(fullSum.length - 2,fullSum.length);
Надеюсь, помогла :)
Для того, чтобы внести данные изменения, необходимо откорректировать скрипт scr_ConvertUtils:
Найдите строку
ko = Propis(price = kop, CurrencyOperations.K);
и замените ее на строку
ko = CurrencyOperations.K + " копеек";
Благодарю за ответы!
Алёна ваш метод достаточно трудоемок, если не найдется более простого примера обязательно воспользуюсь вашим, отдельная вам благодарность.
Анна пример предложенный вами не работает, скрипт срабатывает, но в результате вместо копеек цифрами, много раз повторяется слово:"копеек" в разных падежах.
"Alimova Anna" написал:Для того, чтобы внести данные изменения, необходимо откорректировать скрипт scr_ConvertUtils
Анна, а если в другом месте понадобится все строкой? Мы именно из этих соображений не стали менять основной скрипт, потому что в одном месте копейки нужны цифрами, а в другом прописью...
Игорь, в таком случае попробуйте заменить скрипт scr_ConvertUtils на скрипт в приложении.
Что менялось: в функции Propis добавлен фрагмент кода
if(D == CurrencyOperations.K){ litera = price + ' ' + edinicy.split(/[\s\!,\.\?]+/g).pop(); return litera; }
и в следующем фрагменте
ko != '' ? res = ru + ' ' + ko: res = ru; if (CurrencyOperations.Language == 'ru') { ru == 'Ноль ' + CurrencyOperations.R[0] && ko != ''? res = ko: 0; kop == 0? res += ' ноль ' + CurrencyOperations.K[0]: 0; } else { ru == 'Нуль ' + CurrencyOperations.R[0] && ko != ''? res = ko: 0; kop == 0? res += ' нуль ' + CurrencyOperations.K[0]: 0; }
заменены строки ' ноль ' на цифру.
Алена, если Вас в разных отчетах нужно по-разному отображать копейки, тогда имеет смысл модифицировать функцию Propis:
1. Добавить в нее дополнительный параметр - копейки цифрами или буквами
2. Вызывать добавленный мною фрагмент кода по условию kopnum == true
if((D == CurrencyOperations.K)&&(kopnum == true)){ litera = price + ' ' + edinicy.split(/[\s\!,\.\?]+/g).pop(); return litera; }
Аналогично поступить с фрагментом кода 0 копеек
Анна спасибо вам, теперь все работает как надо. До конца только не понял, как пользоваться этим:
-----------------------
Алена, если Вас в разных отчетах нужно по-разному отображать копейки, тогда имеет смысл модифицировать функцию Propis:
1. Добавить в нее дополнительный параметр - копейки цифрами или буквами
2. Вызывать добавленный мною фрагмент кода по условию kopnum == true
if((D == CurrencyOperations.K)&&(kopnum == true)){
litera = price + ' ' + edinicy.split(/[\s\!,\.\?]+/g).pop();
return litera;
}
Аналогично поступить с фрагментом кода 0 копеек
---------------------------------------------
Видимо вызов: "ConvertUtils.ScriptControl.CodeObject.AmountToStr(Amount, 'ru', 'RUB');" будет видоизменен? Если да то подскажите как? Если нет, получается, необходимо отлавливать отчет в котором запускается этот скрипт?
Анна, спасибо! Интересный вариант :) Вносить изменения в функцию побоялись по той причине, что "мало ли где еще она вызывается"