To convert from string to double you have to full back to java:
Something along the lines of
$monto : eval(Double.parseDouble(this.get("MONTO")))
However even with doing this your rules are unlikely to work consistently as you expect.
Using equality tests on doubles is fundamentally unsafe as doubles aren't represented
exactly and may not exactly match the value you think you have. Force instance
0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1 != 1.0 (dependent on floating point chipset etc).
If you are dealing with currency then it is far simpler and safer to just operate with
integers and divide by 100 when you want to display the value. The other alternative is
to use BigDecimal which will store an exact representation but will probably require more
work with getting your accumulate function correct. Your last option is to use
Math.abs(left-right) < 0.1 to see if they are approximately equal. More details can be
found here
http://firstclassthoughts.co.uk/java/traps/java_double_traps.html
Thomas
From: rules-users-bounces(a)lists.jboss.org [mailto:rules-users-bounces@lists.jboss.org] On
Behalf Of Yamil Bracho
Sent: 10 March 2010 14:27
To: Drools UserList
Subject: Re: [rules-users] Problems count and sumarizing data in facts
I solved the counting of detail lines this way:
rule "Contador de lineas detalle vs Header"
salience 10
when
Number($count : intValue) from accumulate(
$mp : Map(this["_TYPE_"] == "D"), count($mp))
$map : Map(this["_TYPE_"] == "H",
this["NU_REGISTROS"] != $count)
then
System.out.println("NumRecs=" + $count);
listBitacora.add(new BitacoraDTO($map.get("_NUMLINE_"),
"El número del lineas de detalle (" +
$count +
") no empareja con lo del encabezado
(" + $map.get("NU_REGISTROS") + ")"));
end
However, I still got problem with summarize the amounts. I wrote
rule "Sumatoria de lineas detalle vs Header"
salience 10
when
Number( $total : doubleValue) from accumulate(
Map(this["_TYPE_"] == "D",
$monto : ((Number) this["MONTO"]),
sum($monto)))
$map : Map(this["_TYPE_"] == "H",
this["MT_TOTAL"] != $total)
then
System.out.println("TOTAL=" + $total);
listBitacora.add(new BitacoraDTO($map.get("_NUMLINE_"),
"Error en el Detalle: El número del lineas
de detalle (" + $total +
") no empareja con lo del encabezado
(" + $map.get("NU_REGISTROS") + ")"));
end
And i am getting mismatched input" so my question is how to convert a string to
double in this line "$monto : ((Number) this["MONTO"])," ?
TIA
Yamil
________________________________
From: yamilbracho(a)hotmail.com
To: rules-users(a)lists.jboss.org
Date: Tue, 9 Mar 2010 17:41:43 +0000
Subject: [rules-users] Problems count and sumarizing data in facts
Hi, I have two kind of facts in a map.
There is a field called _TYPE_ (H)eader, D)etail)
In the Header line I have two String fields, one for the number of details lines
("NU_REGISTROS") and another for the sum of the detail line
("MT_TOTAL")
In the detail lines I only have a String field called "MONTO"
I would like to build two rules. One to check the count of detail lines versus the field
in the header line so I wrote :
rule "Contador de lineas detalle vs Header"
salience 10
when
$numRecs : Number()
from accumulate(Map(this["_TYPE_"] == "D", $d :
this["_NUMLINE_"]), count($d))
$map : Map(this["_TYPE_"] == "H",
this["NU_REGISTROS"] != $numRecs)
then
System.out.println("NumRecs=" + $numRecs);
listBitacora.add(new BitacoraDTO($map.get("_NUMLINE_"),
"Error en el Detalle: El número del lineas
de detalle (" + $total +
") no empareja con lo del encabezado
(" + $map.get("NU_REGISTROS") + ")"));
end
However I always got "NumRecs=1" when i print out the value of $numRecs but I
am absolute sure there is two details lines...
Second when i try to sumarize the total field in the details line i got (MONTO in the
detail line is a string):
rule "Sumatoria de lineas detalle vs Header"
salience 10
when
$total : Number()
from accumulate(Map(this["_TYPE_"] == "D",
$monto : this["MONTO"]),
sum(eval(Double.valueOf((String) $monto ))))
$map : Map(this["_TYPE_"] == "H",
this["MT_TOTAL"] != $total)
then
System.out.println("TOTAL=" + $total);
listBitacora.add(new BitacoraDTO($map.get("_NUMLINE_"),
"Error en el Detalle: El número del lineas
de detalle (" + $total +
") no empareja con lo del encabezado
(" + $map.get("NU_REGISTROS") + ")"));
end
but I got
Rule Compilation error : [Rule name='Sumatoria de lineas detalle vs Header']
rule/Rule_Sumatoria_de_lineas_detalle_vs_Header_0.java (9:1313) : The method
eval(Double) is undefined for the type Rule_Sumatoria_de_lineas_detalle_vs_Header_0
Any help in those tow problems
TIA
Yamil
________________________________
Actualízate gratis al nuevo Internet Explorer 8 y navega más
seguro<http://www.microsoft.com/spain/windows/internet-explorer/defaul...
________________________________
Compartir tus mejores FOTOS es fácil en Messenger ¡DESCUBRE
cómo!<http://events.es.msn.com/windows-live/redes-sociales/default.asp...
________________________________
**************************************************************************************
This message is confidential and intended only for the addressee. If you have received
this message in error, please immediately notify the postmaster(a)nds.com and delete it from
your system as well as any copies. The content of e-mails as well as traffic data may be
monitored by NDS for employment and security purposes. To protect the environment please
do not print this e-mail unless necessary.
NDS Limited. Registered Office: One London Road, Staines, Middlesex, TW18 4EX, United
Kingdom. A company registered in England and Wales. Registered no. 3080780. VAT no. GB 603
8808 40-00
**************************************************************************************
________________________________
This message is confidential and intended only for the addressee. If you have received
this message in error, please immediately notify the postmaster(a)nds.com and delete it from
your system as well as any copies. The content of e-mails as well as traffic data may be
monitored by NDS for employment and security purposes.
To protect the environment please do not print this e-mail unless necessary.
An NDS Group Limited company.
www.nds.com