вставил следующий код в модуль fs_isysrtti.pas
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
{сама функция преообразования}
//begin fix
function ConvertSumToPropis(Number:real):string;
var
PartNum, TruncNum, NumTMP, D: integer;
NumStr : string;
i, R : byte;
Flag11 : boolean;
begin
D:= 1000000 ;
R:= 4 ;
TruncNum:=Trunc(Number);
if TruncNum<> 0
then
repeat
PartNum:=TruncNum div D;
Dec(R);
D:=D div 1000 ;
until PartNum<> 0
else
R:= 0 ;
for i:=R downto 1 do
begin
Flag11:=False;
NumTMP:=PartNum div 100 ;
case NumTMP of
1 : NumStr:=NumStr+'сто ';
2 : NumStr:=NumStr+'двести ';
3 : NumStr:=NumStr+'триста ';
4 : NumStr:=NumStr+'четыреста ';
5 : NumStr:=NumStr+'пятьсот ';
6 : NumStr:=NumStr+'шестьсот ';
7 : NumStr:=NumStr+'семьсот ';
8 : NumStr:=NumStr+'восемьсот ';
9 : NumStr:=NumStr+'девятьсот ';
end;
NumTMP:=(PartNum mod 100 ) div 10 ;
case NumTMP of
1 : begin
NumTMP:=PartNum mod 100 ;
case NumTMP of
10 : NumStr:=NumStr+'десять ';
11 : NumStr:=NumStr+'одиннадцать ';
12 : NumStr:=NumStr+'двенадцать ';
13 : NumStr:=NumStr+'тринадцать ';
14 : NumStr:=NumStr+'четырнадцать ';
15 : NumStr:=NumStr+'пятнадцать ';
16 : NumStr:=NumStr+'шестнадцать ';
17 : NumStr:=NumStr+'семнадцать ';
18 : NumStr:=NumStr+'восемнадцать ';
19 : NumStr:=NumStr+'девятнадцать ';
end;
case i of
3 : NumStr:=NumStr+'миллионов ';
2 : NumStr:=NumStr+'тысяч ';
1 : NumStr:=NumStr+'рублей ';
end;
Flag11:=True;
end;
2 : NumStr:=NumStr+'двадцать ';
3 : NumStr:=NumStr+'тридцать ';
4 : NumStr:=NumStr+'сорок ';
5 : NumStr:=NumStr+'пятьдесят ';
6 : NumStr:=NumStr+'шестьдесят ';
7 : NumStr:=NumStr+'семьдесят ';
8 : NumStr:=NumStr+'восемьдесят ';
9 : NumStr:=NumStr+'девяносто ';
end;
NumTMP:=PartNum mod 10 ;
if not Flag11 then
begin
case NumTMP of
1 : if i= 2 then
NumStr:=NumStr+'одна '
else NumStr:=NumStr+'один ';
2 : if i= 2 then
NumStr:=NumStr+'две '
else NumStr:=NumStr+'два ';
3 : NumStr:=NumStr+'три ';
4 : NumStr:=NumStr+'четыре ';
5 : NumStr:=NumStr+'пять ';
6 : NumStr:=NumStr+'шесть ';
7 : NumStr:=NumStr+'семь ';
8 : NumStr:=NumStr+'восемь ';
9 : NumStr:=NumStr+'девять ';
end;
case i of
3 : case NumTMP of
1 : NumStr:=NumStr+'миллион ';
2 , 3 , 4 : NumStr:=NumStr+'миллиона ';
else
NumStr:=NumStr+'миллионов ';
end;
2 : case NumTMP of
1 : NumStr:=NumStr+'тысяча ';
2 , 3 , 4 : NumStr:=NumStr+'тысячи ';
else
if PartNum<> 0 then
NumStr:=NumStr+'тысяч ';
end;
1 : case NumTMP of
1 : NumStr:=NumStr+'рубль ';
2 , 3 , 4 : NumStr:=NumStr+'рубля ';
else NumStr:=NumStr+'рублей ';
end;
end;
end;
if i> 1 then
begin
PartNum:=(TruncNum mod (D* 1000 )) div D;
D:=D div 1000 ;
end;
end;
PartNum:=Round(Frac(Number)* 100 );
if PartNum= 0 then
begin
ConvertSumToPropis:=NumStr+'00 копеек';
Exit;
end;
NumTMP:=PartNum div 10 ;
if NumTMP= 0 then
NumStr:=NumStr+'0'+IntToStr(PartNum)+' '
else
NumStr:=NumStr+IntToStr(PartNum)+' ';
NumTMP:=PartNum mod 10 ;
case NumTMP of
1 : if PartNum<> 11 then
NumStr:=NumStr+'копейка'
else
NumStr:=NumStr+'копеек';
2 , 3 , 4 : if (PartNum< 5 ) or (PartNum> 14 ) then
NumStr:=NumStr+'копейки'
else
NumStr:=NumStr+'копеек';
else NumStr:=NumStr+'копеек';
end;
ConvertSumToPropis:=NumStr;
end;
//end fix
constructor TFunctions.Create;
begin
FCatStr := 'ctString';
FCatDate := 'ctDate';
FCatConv := 'ctConv';
FCatFormat := 'ctFormat';
FCatMath := 'ctMath';
FCatOther := 'ctOther';
//.....
//begin fix
AddMethod('function ConvertSumToPropis(Number:real):string', CallMethod1, FCatConv);
//end fix
//.....
function TFunctions.CallMethod1(Instance: TObject; ClassType: TClass;
const MethodName: String; var Params: Variant): Variant;
var
{$IFDEF Delphi6}
i: Int64;
{$ELSE}
i: Integer;
{$ENDIF}
begin
if MethodName = 'INTTOSTR' then
begin
i := Params[ 0 ];
Result := IntToStr(i)
end
else if MethodName = 'FLOATTOSTR' then
Result := FloatToStr(Params[ 0 ])
else if MethodName = 'DATETOSTR' then
Result := DateToStr(Params[ 0 ])
else if MethodName = 'TIMETOSTR' then
Result := TimeToStr(Params[ 0 ])
else if MethodName = 'DATETIMETOSTR' then
Result := DateTimeToStr(Params[ 0 ])
//begin fix
else if MethodName = 'CONVERTSUMTOPROPIS' then
Result := ConvertSumToPropis(Params[ 0 ])
//end fix
end;
И не работает [ConvertSumToPropis([SUM(<frxDBS_WayBill."SUMMA">,MasterData1)])]
???
__________________________________________________________________
THE TRUTH IS OUT THERE