Tenho que emitir um recibo e devo colocar o valor por extenso, como devo proceder no ireport para obter este resultado?
Oi
francocaldas, seja bem vindo ao PJ… Olhe, o IReport nao faz isso nao, mas existem por aí algumas classes e pacotes que fazem isso, mas sao de terceiros…
T+
Jeveaux, eu ja possuo uma classe que converte valores para extenso, mas como usar esta classe junto com ireport?
a classe tem q estar no classpath do report… por ex, tu pode exibir um field assim certo?
logo, tb pode fazer assim:
Obrigado pela dica, está funcionando, tudo ok.
O vc quis dizer com a classe tem q estar no classpath do report? Como eu faco isso?
Jah tentei de varias formas mas ele nao acha o pacote da classe que eu quero chamar…
Minha classe se chama Myclasse e fica no pacote myclasse, e o caminho eh: c:/eclipse/wokspace/projeto/myclasse
e os relatorios estao em outro pacote, o caminho eh: c:/eclipse/wokspace/projeto/relatorio e eh nesse pacote que eu quero gerar os relatorios, pois eh um servlet na camada que recupera os parametros do jsp, chama a camada de banco q retorna um ResultSet que contem esse campo status que eu quero usar o metodo em cima.
Jah tentei dessas 4 formas:
new Myclasse.traduzStatus( $F{status} );
new myclasse.Myclasse.traduzStatus( $F{status} );
myclasse.Myclasse classe = new myclasse.Myclasse();
classe.traduzStatus( $F{status} );
myclasse.Myclasse classe = new Myclasse();
classe.traduzStatus( $F{status} );
Alguns da erro dizendo q o pacote nao existe, outros da erro de sitaxe locos dizendo q esperava um “;” ou um “)”, mas se eu ponho eles troca de erro pro outro e se ponho o otro inverte, e se ponho os 2 da os 2 erros… alguem pode me da uma luz?
Como ultima opcao, se ninguem puder me ajudar com isso, pode me dar uma ajuda na sintaxe que eu devo usar pra escrever um IF e mapear o status ali no iReport mesmo?
Franco estou trabalhando num projeto que tem como um de seus relatorios uma autorização de pagamento onde é necessario mostrar o valor por extenso s,o que j,a pesquisa na net e naum encontrei nenhuma classe de terceiros que tratasse isso, até achar este forum e onde vc diz que tem uma classe assim, e a questaum é a seguinte vc poderia ceder a classe pra mim?
Bom, dei uma fuçada no iReport e tem como vc montar um scriplet dentro dele, ele cria uma classe com o nome do scriplet e cira o .java e o .class dela e guarda no mesmo dir, dai ele roda certinho.
Poderia me dizer como posso criar esse scriplet no ireport pois já procurei e naum encontrei um meio de cria-lo
import java.math.BigInteger;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Iterator;
import java.text.DecimalFormat;
public class Extenso {
private ArrayList nro;
private BigInteger num;
private String Qualificadores[][] = {
{"centavo", "centavos"},
{"", ""},
{"mil", "mil"},
{"milh\u00e3o", "milh\u00f5es"},
{"bilh\u00e3o", "bilh\u00f5es"},
{"trilh\u00e3o", "trilh\u00f5es"},
{"quatrilh\u00e3o", "quatrilh\u00f5es"},
{"quintilh\u00e3o", "quintilh\u00f5es"},
{"sextilh\u00e3o", "sextilh\u00f5es"},
{"septilh\u00e3o", "septilh\u00f5es"}
};
private String Numeros[][] = {
{"zero", "um", "dois", "tr\u00eas", "quatro", "cinco", "seis", "sete", "oito", "nove", "dez",
"onze", "doze", "treze", "quatorze", "quinze", "desesseis", "desessete", "dezoito", "desenove"},
{"vinte", "trinta", "quarenta", "cinquenta", "sessenta", "setenta", "oitenta", "noventa"},
{"cem", "cento", "duzentos", "trezentos", "quatrocentos", "quinhentos", "seiscentos",
"setecentos", "oitocentos", "novecentos"}
};
/**
* Construtor
*/
public Extenso() {
nro = new ArrayList();
}
/**
* Construtor
*
*@param dec valor para colocar por extenso
*/
public Extenso(BigDecimal dec) {
this();
setNumber(dec);
}
/**
* Constructor for the Extenso object
*
*@param dec valor para colocar por extenso
*/
public Extenso(double dec) {
this();
setNumber(dec);
}
/**
* Constructor for the Extenso object
*
*@param dec String com valor para colocar por extenso
*/
public Extenso(String dec) {
this();
try {
setNumber( new BigDecimal( Double.parseDouble(dec) ) );
}
catch(java.lang.NumberFormatException e) {
setNumber( new BigDecimal( 0.0 ) );
}
}
/**
* Sets the Number attribute of the Extenso object
*
*@param dec The new Number value
*/
public void setNumber(BigDecimal dec) {
// Converte para inteiro arredondando os centavos
num = dec
.setScale(2, BigDecimal.ROUND_HALF_UP)
.multiply(BigDecimal.valueOf(100))
.toBigInteger();
// Adiciona valores
nro.clear();
if (num.equals(BigInteger.ZERO)) {
// Centavos
nro.add(new Integer(0));
// Valor
nro.add(new Integer(0));
}
else {
// Adiciona centavos
addRemainder(100);
// Adiciona grupos de 1000
while (!num.equals(BigInteger.ZERO)) {
addRemainder(1000);
}
}
}
public void setNumber(double dec) {
setNumber(new BigDecimal(dec));
}
/**
* Description of the Method
*/
public void show() {
Iterator valores = nro.iterator();
while (valores.hasNext()) {
System.out.println(((Integer) valores.next()).intValue());
}
System.out.println(toString());
}
/**
* Description of the Method
*
*@return Description of the Returned Value
*/
public String toString() {
StringBuffer buf = new StringBuffer();
int numero = ((Integer) nro.get(0)).intValue();
int ct;
for (ct = nro.size() - 1; ct > 0; ct--) {
// Se ja existe texto e o atual n�o � zero
if (buf.length() > 0 && ! ehGrupoZero(ct)) {
buf.append(" e ");
}
buf.append(numToString(((Integer) nro.get(ct)).intValue(), ct));
}
if (buf.length() > 0) {
if (ehUnicoGrupo())
buf.append(" de ");
while (buf.toString().endsWith(" "))
buf.setLength(buf.length()-1);
if (ehPrimeiroGrupoUm())
buf.insert(0, "h");
if (nro.size() == 2 && ((Integer)nro.get(1)).intValue() == 1) {
buf.append(" real");
} else {
buf.append(" reais");
}
if (((Integer) nro.get(0)).intValue() != 0) {
buf.append(" e ");
}
}
if (((Integer) nro.get(0)).intValue() != 0) {
buf.append(numToString(((Integer) nro.get(0)).intValue(), 0));
}
return buf.toString();
}
private boolean ehPrimeiroGrupoUm() {
if (((Integer)nro.get(nro.size()-1)).intValue() == 1)
return true;
return false;
}
/**
* Adds a feature to the Remainder attribute of the Extenso object
*
*@param divisor The feature to be added to the Remainder attribute
*/
private void addRemainder(int divisor) {
// Encontra newNum[0] = num modulo divisor, newNum[1] = num dividido divisor
BigInteger[] newNum = num.divideAndRemainder(BigInteger.valueOf(divisor));
// Adiciona modulo
nro.add(new Integer(newNum[1].intValue()));
// Altera numero
num = newNum[0];
}
/**
* Description of the Method
*
*@param ps Description of Parameter
*@return Description of the Returned Value
*/
private boolean temMaisGrupos(int ps) {
for (; ps > 0; ps--) {
if (((Integer) nro.get(ps)).intValue() != 0) {
return true;
}
}
return false;
}
/**
* Description of the Method
*
*@param ps Description of Parameter
*@return Description of the Returned Value
*/
private boolean ehUltimoGrupo(int ps) {
return (ps > 0) && ((Integer)nro.get(ps)).intValue() != 0 && !temMaisGrupos(ps - 1);
}
/**
* Description of the Method
*
*@return Description of the Returned Value
*/
private boolean ehUnicoGrupo() {
if (nro.size() <= 3)
return false;
if (!ehGrupoZero(1) && !ehGrupoZero(2))
return false;
boolean hasOne = false;
for(int i=3; i < nro.size(); i++) {
if (((Integer)nro.get(i)).intValue() != 0) {
if (hasOne)
return false;
hasOne = true;
}
}
return true;
}
boolean ehGrupoZero(int ps) {
if (ps <= 0 || ps >= nro.size())
return true;
return ((Integer)nro.get(ps)).intValue() == 0;
}
/**
* Description of the Method
*
*@param numero Description of Parameter
*@param escala Description of Parameter
*@return Description of the Returned Value
*/
private String numToString(int numero, int escala) {
int unidade = (numero % 10);
int dezena = (numero % 100); //* nao pode dividir por 10 pois verifica de 0..19
int centena = (numero / 100);
StringBuffer buf = new StringBuffer();
if (numero != 0) {
if (centena != 0) {
if (dezena == 0 && centena == 1) {
buf.append(Numeros[2][0]);
}
else {
buf.append(Numeros[2][centena]);
}
}
if ((buf.length() > 0) && (dezena != 0)) {
buf.append(" e ");
}
if (dezena > 19) {
dezena /= 10;
buf.append(Numeros[1][dezena - 2]);
if (unidade != 0) {
buf.append(" e ");
buf.append(Numeros[0][unidade]);
}
}
else if (centena == 0 || dezena != 0) {
buf.append(Numeros[0][dezena]);
}
buf.append(" ");
if (numero == 1) {
buf.append(Qualificadores[escala][0]);
}
else {
buf.append(Qualificadores[escala][1]);
}
}
return buf.toString();
}
/**
* Para teste
*
*@param args numero a ser convertido
*/
/*public static void main(String[] args) {
if (args.length == 0) {
System.out.println("Sintax : ...Extenso <numero>");
return;
}
Extenso teste = new Extenso(new BigDecimal(args[0]));
System.out.println("Numero : " + (new DecimalFormat().format(Double.valueOf(args[0]))));
System.out.println("Extenso : " + teste.toString());
}*/
}
Em que parte especificamente do ireport eu tenho que por a classe que vou utilizar
No REPORT PROPERTIES tem uma aba chamada SCRIPLET, lah vc poe pra USE THIS SCRIPLET CLASS e escreve a classe: meupacote.MinhaClasse
Olha coloquei minha classe no classpath do Ireport.
Dentro do meu TextField coloquei assim:
ClasseC.Extenso($F{vlbaixado})
Ele me retornou esse erro alguem sabe me dizer:
Error filling print… Error evaluating expression : Source text : ClasseC.Extenso($F{vlbaixado})
net.sf.jasperreports.engine.fill.JRExpressionEvalException: Error evaluating expression :
Uma alternativa é utilizar uma biblioteca já pronta que faz a conversão de uma valor numérico em um valor por extenso
No link a seguir tem algumas sugestões
Escrever valores por extenso
Quando eu precisei eu adicionei a biblioteca ao meu projeto(que era web) e fornecia o valor por extenso como parâmetro ao relatório.