Hi Yamil,
'eval()' expects a primitive boolean value as a result of the expression.
You may need to look into creating a custom accumulate function that can
accept a string and do the conversion in java. Have a look at section
6.5.2.10.1 Accumulate Function in the Drools documentation:
Alternatively, you could change the type of your map to something like
Map<String, Double>
Hope it helps,
Enda
2010/3/11 Yamil Bracho <yamilbracho(a)hotmail.com>
I rewrote as :
rule "Sumatoria de lineas detalle vs Header"
salience 10
when
Number( $total : doubleValue) from accumulate(
Map(this["_TYPE_"] == "D",
$monto : this["MONTO"]),
sum(eval(toDouble($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
Where "toDouble" is :
function Double toDouble(Object oMonto) {
String strMonto = oMonto.toString();
int len = strMonto.length();
int pos = len - 3;
strMonto = StringUtils.left(strMonto, pos) + "." +
StringUtils.right(strMonto,2);
return Double.valueOf(strMonto) ;
}
And I got
Rule Compilation error : [Rule name='Sumatoria de lineas detalle vs
Header']
rule/Rule_Sumatoria_de_lineas_detalle_vs_Header_0.java (9:1350) :
The method eval(Double) is undefined for the type
Rule_Sumatoria_de_lineas_detalle_vs_Header_0
Thanks again, Thomas..!
------------------------------
From: TSwindells(a)nds.com
To: rules-users(a)lists.jboss.org
Date: Thu, 11 Mar 2010 09:25:31 +0000
Subject: Re: [rules-users] Problems count and sumarizing data in facts
Have you tried assigning the string to $monto and then performing the
evel within the sum?
*From:* rules-users-bounces(a)lists.jboss.org [mailto:
rules-users-bounces(a)lists.jboss.org] *On Behalf Of *Yamil Bracho
*Sent:* 10 March 2010 19:38
*To:* Drools UserList
*Subject:* Re: [rules-users] Problems count and sumarizing data in facts
Thanks Thomas.
I rewrote the rule as:
rule "Sumatoria de lineas detalle vs Header"
salience 10
when
Number( $total : doubleValue) from accumulate(
Map(this["_TYPE_"] == "D",
$monto : eval(Double.parseDouble(this.get("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
but I am getting errors in the parseDouble:
[828,29]: [ERR 101] Line 828:29 no viable alternative at input 'Double' in
rule "Sumatoria de lineas detalle vs Header" in pattern Map[828,67]: [ERR
102] Line 828:67 mismatched input ')' expecting 'then' in rule
"Sumatoria de
lineas detalle vs Header"
Any hint...
------------------------------
From: TSwindells(a)nds.com
To: rules-users(a)lists.jboss.org
Date: Wed, 10 Mar 2010 15:13:49 +0000
Subject: Re: [rules-users] Problems count and sumarizing data in facts
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(a)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
------------------------------
¿Sabes que la Videollamada de Messenger es GRATIS
¡Descúbrela!<http://events.es.msn.com/windows-live/redes-sociales/default.aspx>
------------------------------
**************************************************************************************
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
------------------------------
¿Quieres saber qué móvil eres? ¡Descúbrelo
aquí!<http://www.quemovileres.com/>
_______________________________________________
rules-users mailing list
rules-users(a)lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users