PDA

Ver la Versión Completa : Números a letras


metroyd
18-09-2008, 20:16:09
Hola,espero puedan ayudarme. Estoy haciendo un reporte de cantidades. Al final en la banda Summary tengo los totales, los cuales calculo mediante un QRExpression. Pero me interesa tambien tener estos totales en LETRA. No se como hacer esto. Espero puedan ayudarme. No se como acceder al resultado del QRExpr.

NOTA: He bajado el ATexto, pero no se como usarlo. Tambien habrá cantidades con punto decimal (dos decimales)

Gracias

Caral
18-09-2008, 20:42:30
Hola
Pones el componente en el form.
Pon esta funcion:

function Deletrear(numero: real) : string; var
letras: TLetras;
begin
letras := TLetras.Create(nil);
try
letras.Numero := numero;
Result := letras.AsString;
finally
letras.Free;
end;
end;
Luego indicas de donde sacas el dato y donde lo quieres pones.

var
n: String;
begin
n:= Deletrear(StrToFloat(QRExpression1.Text) );
QRlabel1.Text:= (n);

A ver como va la cosa.
Saludos

ContraVeneno
18-09-2008, 21:02:48
http://www.clubdelphi.com/trucos/index.php?id=208&scroll=0&scrollb=0

revisa hasta el final

metroyd
18-09-2008, 21:03:19
ME MARCA EL SIGUIENTE ERROR:

Project sistema.exe raised exception Class EConverter error with message "" is not a valid floating point value.

Mi codigo es:


procedure TForm18.BitBtn1Click(Sender: TObject);
// AQUI METI LA FUNCION QUE ME DIJISTE
function Deletrear(numero: real) : string; var
letras: TLetras;
begin
letras := TLetras.Create(nil);
try
letras.Numero := numero;
Result := letras.AsString;
finally
letras.Free;
end;
end;
// FIN DE LA FUNCION
var
npages:integer;
n:string;
begin
IF DE.Date > A.Date THEN BEGIN
Application.MessageBox('ERROR EN LAS FECHAS','SISTEMA MULTAS',MB_ICONERROR);
END
ELSE BEGIN
Form17:= TForm17.Create(Application);

datamodule4.buscar.close;
datamodule4.buscar.SQL.Clear;
datamodule4.buscar.SQL.Add('SELECT multas.folio,agentes.clave_agente, agentes.nombre, agentes.rfc, multas.importe_agente, sum(multas.importe_agente) AS total_agente,'
+'sum(multas.importe_agente) * 2 AS total_cien FROM agentes,multas,'
+'detalle_multa_age WHERE multas.fecha_pago >= "'+QuotedStr(FormatDateTime('yyyy-mm-dd',de.date))+'" AND multas.fecha_pago <= "'+QuotedStr(FormatDateTime('yyyy-mm-dd',a.date))+'"'
+' AND detalle_multa_age.nombre = agentes.nombre and detalle_multa_age.folio = multas.folio group by clave_agente');
datamodule4.buscar.Open;

form17.qrlabel4.Caption:=FormatDateTime('d mmm yyyy',DE.DATE);
form17.qrlabel5.Caption:=FormatDateTime('d mmm yyyy',A.DATE);


form17.QuickRep1.DataSet:=datamodule4.buscar;
form17.QRDBText1.DataSet:=datamodule4.buscar;
form17.QRDBText2.DataSet:=datamodule4.buscar;
form17.QRDBText3.DataSet:=datamodule4.buscar;
form17.QRDBText4.DataSet:=datamodule4.buscar;
form17.QRDBText5.DataSet:=datamodule4.buscar;

form17.QRDBText1.DataField:='clave_agente';
form17.QRDBText2.DataField:='nombre';
form17.QRDBText3.DataField:='rfc';
form17.QRDBText4.DataField:='total_agente';
form17.QRDBText5.DataField:='total_cien';

// AQUI VIENE EL PROCESO QUE QUIERO HACER
form17.QRExpr2.Expression:='SUM(total_cien)';
form17.QRExpr3.Expression:='SUM(total_agente)';

// ACCEDER AL RESULTADO DEL QREXPRE2:
N:= Deletrear(StrToFloat(form17.QRExpr2.Value.strResult));
form17.QRLabel22.Caption:=N;

form17.QuickRep1.Prepare;

nPages:=form17.QuickRep1.QRPrinter.PageCount;
form17.QRLabel6.Caption:=FormatDateTime('d mmmm yyyy',DATE);
form17.QRLabel20.Caption:=inttostr(npages);
form17.QuickRep1.PreviewModal;
form17.Close;

END;

end;

metroyd
18-09-2008, 21:14:17
http://www.clubdelphi.com/trucos/index.php?id=208&scroll=0&scrollb=0

revisa hasta el final

Esta funcion (la ultima) que parametros le envio?? La puedo incluir en cualquier form???

metroyd
18-09-2008, 21:27:54
Probé esto:

form17.qrlabel22.caption:= form17.QRExpr2.Value.strResult


Y el resultado son caracteres extraños. O sea, el problema viene desde como asignar el resultado de un QRExpr a una variable o label.

metroyd
18-09-2008, 22:47:27
Gracias a los que me ayudaron.
El problema lo resolvi mediante el evento OnPrint del QRExpression:


procedure TForm17.QRExpr2Print(sender: TObject; var Value: String);

// AQUI METI LA FUNCION QUE ME DIJISTE
function Deletrear(numero: real) : string; var
letras: TLetras;
begin
letras := TLetras.Create(nil);
try
letras.Numero := numero;
Result := letras.AsString;
finally
letras.Free;
end;
end;
// FIN DE LA FUNCION

var
n:string;
begin
form17.qrlabel37.Caption:=FOrmatfloat('#,##0.00',strtofloat(value));
n:= Deletrear(StrToFloat(Value));
form17.QRLabel39.Caption:=uppercase('( '+n+' PESOS 00/100 M.N.)');
value:=form17.QRLabel37.Caption;

end;

ContraVeneno
18-09-2008, 22:47:52
Esta funcion (la ultima) que parametros le envio?? La puedo incluir en cualquier form???

La puedes incluir en cualquier formulario, le envías un valor tipo moneda y te regresa un texto

benjineo
25-05-2012, 20:14:45
a mi me sale el mismo error, pero solo con cantidades como de 3450.00 pero con las pequenias si funciona bien(250.00)!!!....ya le movi al onprint y nada!..alguein sugiere algo?

Caral
25-05-2012, 20:39:58
Hola
Si el dato es obtenido de un campo se necesita ponerlo en el evento before del componente table o query que se use.
NO el evento del reporte, el del query o table, segun sea el caso ya que necesita obtener el dato primero.
Saludos

benjineo
25-05-2012, 20:45:05
de hecho me guie en el procedimiento de @metroyd, el dato lo estoy sacando de un QRExpr, lo paso a un QRLabel y despues ese QRlabel lo convierto, y me funciona bien para cantidades pequenias, pero ya a cantidades como de 3540 me arroja el error!

Caral
25-05-2012, 20:53:43
Hola
Podrias usar un qrlabel.Caption:=Formatfloat('#,##0.00',strtofloat(value));
Asi le das formato ya que el ATexto funciona con numeros y sacas el dato de un caption.
Saludos

benjineo
25-05-2012, 23:19:35
Se supone que asi lo hagio, Este es mi codigo:


procedure TVenta.QRExpr2Print(sender: TObject; var Value: String);

function Deletrear(numero: real) : string; var
letras: TLetras;
begin
letras := TLetras.Create(nil);
try
letras.Numero := Trunc(numero);
Result := Format('%s CON %d/100 .-', [Letras.AsString, Trunc(100*Frac(Numero))]); *no se si el error me de por esta seccion?!
finally
letras.Free;
end;
end;

var
n:string;
begin
Ventas.qrlabel38.Caption:=FOrmatfloat('#,##0.00',strtofloat(value));
n:= Deletrear(StrToFloat(Value));
form17.QRLabel39.Caption:=uppercase('( '+n+')');
value:=Ventas.QRLabel38.Caption;

end;

benjineo
29-05-2012, 17:53:21
pues ya lo modifique y nada, me sigue dando el error cuando la cantidad es de 1000.00 para arriba solo me escribe bien cuando llega hasta 999.99...alguna sugerencia?

benjineo
31-05-2012, 19:36:57
hola que tal a todos, tengo un problemilla, uso este codigo:

function Deletrear(numero: real) : string; var
letras: TLetras;
begin
letras := TLetras.Create(nil);
try
letras.Numero := Trunc(numero);
Result := Format('%s CON %d/100 .-', [Letras.AsString, Trunc(100*Frac(Numero))]); *no se si el error me de por esta seccion?!
finally
letras.Free;
end;
end;

var
n:string;
begin
Ventas.qrlabel38.Caption:=FOrmatfloat('#,##0.00',strtofloat(value));
n:= Deletrear(StrToFloat(Value));
form17.QRLabel39.Caption:=uppercase('( '+n+')');
value:=Ventas.QRLabel38.Caption;

end;

me funciona bien, pero solo para numeros hasta el 999.99, cuando pasa a 1000 me pone el siguiente error: "raised exception Class EConverter error with message "1000.23" is not a valid floating point value....

ya modifique en el on print, en el before print, y nada...alguna recomendacion?!!

benjineo
31-05-2012, 21:22:55
#25
Hace 1 Minuto
benjineo
Registrado

Registrado: may 2012
Posts: 5

hola que tal a todos, tengo un problemilla, uso este codigo:

function Deletrear(numero: real) : string; var
letras: TLetras;
begin
letras := TLetras.Create(nil);
try
letras.Numero := Trunc(numero);
Result := Format('%s CON %d/100 .-', [Letras.AsString, Trunc(100*Frac(Numero))]); *no se si el error me de por esta seccion?!
finally
letras.Free;
end;
end;

var
n:string;
begin
Ventas.qrlabel38.Caption:=FOrmatfloat('#,##0.00',strtofloat(value));
n:= Deletrear(StrToFloat(Value));
form17.QRLabel39.Caption:=uppercase('( '+n+')');
value:=Ventas.QRLabel38.Caption;

end;

me funciona bien, pero solo para numeros hasta el 999.99, cuando pasa a 1000 me pone el siguiente error: "raised exception Class EConverter error with message "1000.23" is not a valid floating point value....

ya modifique en el on print, en el before print, y nada...alguna recomendacion?!!

benjineo
31-05-2012, 21:26:59
lo que no eh intentado y voy hacer es lo dela configuracion regional!

Casimiro Notevi
31-05-2012, 21:52:46
Hola benjineo, creo que necesitas volver a leer nuestra guía de estilo (http://www.clubdelphi.com/foros/guiaestilo.php), gracias por tu colaboración :)

Y recuerda poner los tags al código fuente, ejemplo:

http://neftali.clubdelphi.com/images/UtilizarTAGs.png

Gracias :)

Resumiendo, pregunta nueva en hilo nuevo.
Este es de hace 4 años y creo que no das ninguna solución al tema tratado, sino que tienes una duda similar, en todo caso.
Saludos.

benjineo
31-05-2012, 22:04:12
una diculpa, tengo una duda similar, uso este codigo:

function Deletrear(numero: real) : string; var
letras: TLetras;
begin
letras := TLetras.Create(nil);
try
letras.Numero := Trunc(numero);
Result := Format('%s CON %d/100 .-', [Letras.AsString, Trunc(100*Frac(Numero))]); *no se si el error me de por esta seccion?!
finally
letras.Free;
end;
end;

var
n:string;
begin
Ventas.qrlabel38.Caption:=FOrmatfloat('#,##0.00',strtofloat(value));
n:= Deletrear(StrToFloat(Value));
form17.QRLabel39.Caption:=uppercase('( '+n+')');
value:=Ventas.QRLabel38.Caption;

end;

me funciona bien, pero solo para numeros hasta el 999.99, cuando pasa a 1000 me pone el siguiente error: "raised exception Class EConverter error with message "1000.23" is not a valid floating point value....

ya modifique en el on print, en el before print, y nada...alguna recomendacion?!!

Casimiro Notevi
31-05-2012, 23:00:25
Bien, pero crear un hilo nuevo no es contestar a un hilo existente, tu pregunta no es una respuesta a este hilo en el que estamos.
Debes crear un hilo nuevo. Por ejemplo, en el mismo foro "Varios", botón "crear nuevo hilo", pones un título descriptivo y explicas lo que has puesto aquí.
Son equivocaciones normales en los "novatos" que llegan a clubdelphi, tenlo en cuenta para la siguiente pregunta que quieras hacer, gracias.

Tu error es simple: raised exception Class EConverter error with message "1000.23" is not a valid floating point value....

El problema es que estás usando las comas y los puntos al revés, o lo cambias en tu código o lo cambias en la "configuración regional" de windows. Allí debes decirle que usas las comas para separar millares y los puntos para los decimales... o viceversa.

benjineo
31-05-2012, 23:02:33
Perdon de nuevo!!!...gracias por la recomendacion...

Casimiro Notevi
31-05-2012, 23:03:54
Perdon de nuevo!!!...gracias por la recomendacion...

No te preocupes, estas cosas pasan al principio.

benjineo
01-06-2012, 16:35:47
listo ya quedo el error era que en el mask de QRExpr tenia #,##0.00 y lo cambie a ###0.00, asi como tambien en Ventas.qrlabel38.Caption:=FOrmatfloat('###0.00',strtofloat(value)), y el error se corrigio!...y quedo funcionando....gracias por tus recomendaciones Caral

benjineo
01-06-2012, 16:37:07
listo ya quedo el error era que en el mask de QRExpr tenia #,##0.00 y lo cambie a ###0.00, asi como tambien en Ventas.qrlabel38.Caption:=FOrmatfloat('###0.00',strtofloat(value)), y el error se corrigio!...y quedo funcionando....gracias por tus recomendaciones Casimiro Notevi

benjineo
01-06-2012, 16:55:42
tal vez el error es al usar las comas, a mi me paso que le elimine las comas y solo deje el punto y el problema se soluciono...

Casimiro Notevi
01-06-2012, 17:44:23
De nada ;)
Y he unido lo del otro hilo que llevabas "paralelo" a este. Para otra vez procura no hacer esto, gracias. Ya sabes, no repetir cosas en distintos hilos.