Relatório pegando dado por Edit

Delphi

16/10/2012

olá pessoal tenho aqui um form de baixa de parcelas,

nele coloquei 1 botão para fazer um relatório com o recibo, ele ta certinho pegando as informações que eu quero,
mas queria q ele pegasse o valor pago e escrevesse por extenso, mas dai este dado não estaria salvo no banco de dados.

tem como fazer o relatorio pegar este dado de um edit mesmo?
Jeferson Araujo

Jeferson Araujo

Curtidas 0

Respostas

Singular Ti

Singular Ti

16/10/2012

Eu fiz uma funcao onde voce passa um valor e ela retorna esse valor escrito por extenso
Segue a unit:

unit lib_extenso;

interface

function extenso (valor: real): string;

implementation

uses SysUtils,  Dialogs;


function extenso (valor: real): string;
var
   Centavos, Centena, Milhar, Milhao, Texto, msg: string;
const
   Unidades: array[1..9] of string = ('Um', 'Dois', 'Tres', 'Quatro', 'Cinco',
   'Seis', 'Sete', 'Oito', 'Nove');
   Dez: array[1..9] of string = ('Onze', 'Doze', 'Treze', 'Quatorze', 'Quinze',
   'Dezesseis', 'Dezessete', 'Dezoito', 'Dezenove');
   Dezenas: array[1..9] of string = ('Dez', 'Vinte', 'Trinta', 'Quarenta',
   'Cinquenta', 'Sessenta', 'Setenta',
   'Oitenta', 'Noventa');
   Centenas: array[1..9] of string = ('Cento', 'Duzentos', 'Trezentos',
   'Quatrocentos', 'Quinhentos', 'Seiscentos',
   'Setecentos', 'Oitocentos', 'Novecentos');

function ifs(Expressao: Boolean; CasoVerdadeiro, CasoFalso: String): String;
begin
  if Expressao
  then Result:=CasoVerdadeiro
  else Result:=CasoFalso;
end;

function MiniExtenso (trio: string): string;
var
   Unidade, Dezena, Centena: string;
begin
   Unidade:='';
   Dezena:='';
   Centena:='';
   if (trio[2]='1') and (trio[3]<>'0') then
   begin
      Unidade:=Dez[strtoint(trio[3])];
      Dezena:='';
   end
   else
   begin
      if trio[2]<>'0' then Dezena:=Dezenas[strtoint(trio[2])];
      if trio[3]<>'0' then Unidade:=Unidades[strtoint(trio[3])];
   end;
   if (trio[1]='1') and (Unidade='') and (Dezena='')
   then Centena:='cem'
   else
   if trio[1]<>'0'
   then Centena:=Centenas[strtoint(trio[1])]
   else Centena:='';
      Result:= Centena + ifs((Centena<>'') and ((Dezena<>'') or (Unidade<>'')), ' e ', '')
      + Dezena + ifs((Dezena<>'') and (Unidade<>''),' e ', '') + Unidade;
end;

begin
  if (valor>999999.99) or (valor<0) then
  begin
    msg:='O valor do contrato está fora do intervalo permitido.';
    msg:=msg+'O número deve ser maior ou igual a zero e menor que 999.999,99.';
    msg:=msg+' Se não for corrigido o número não será escrito por extenso.';
    showmessage(msg);
    Result:='';
    exit;
  end;
  if valor=0 then
  begin
    Result:='';
    Exit;
  end;
  Texto:=formatfloat('000000.00',valor);
  Milhar:=MiniExtenso(Copy(Texto,1,3));
  Centena:=MiniExtenso(Copy(Texto,4,3));
  Centavos:=MiniExtenso('0'+Copy(Texto,8,2));
  Result:=Milhar;
  if Milhar<>'' then
  if copy(texto,4,3)='000' then
  Result:=Result+' Mil Reais'
  else
  Result:=Result+' Mil, ';
  if (((copy(texto,4,2)='00') and (Milhar<>'')
  and (copy(texto,6,1)<>'0')) or (centavos=''))
  and (Centena<>'') then Result:=Result+' e ';
  if (Milhar+Centena <>'') then Result:=Result+Centena;
  if (Milhar='') and (copy(texto,4,3)='001') then
  Result:=Result+' Real'
  else
  if (copy(texto,4,3)<>'000') then Result:=Result+' Reais';
  if Centavos='' then
  begin
    Result:=Result+'.';
    Exit;
  end
  else
  begin
    if Milhar+Centena='' then
    Result:=Centavos
    else
    Result:=Result+', e '+Centavos;
    if (copy(texto,8,2)='01') and (Centavos<>'') then
    Result:=Result+' Centavo.'
    else
    Result:=Result+' Centavos.';
  end;
end;

end.


Para utilizar voce faz assim:

variavel := extenso(valor);


Espero ter ajudado..
Abraços!!
GOSTEI 0
Jeferson Araujo

Jeferson Araujo

16/10/2012

a função para gerar o numero por extenso eu já fiz... oq quero eh que no relatório ele imprima este valor, sem ter que estar salvando no banco de dados,
GOSTEI 0
Gilvanio Gonçalves

Gilvanio Gonçalves

16/10/2012

Colega, não sei qual componente vc esta usando para gerar o relatório
supondo que seja o nativo do delphi, o quickreport, tem como vc enviar
o valor do seu edit, deste que seu edit já tenha o valor por extenso gerado
nele atraves de sua função ok?.
vc pode usar, edit ou label, o que receber o valor por extenso.

sendo no quick report, no local onde vc quer que tenha o valor por extenso
insira nele um QrLabel, renomei para valorext.

codigo no botão que vai cahamar o relatório.

exemplo 1 - codigo abaixo com o quick report no mesmo form do edit.


Form1.valorext.caption:=edit1.Text;
QuickRep1.Preview;


exemplo2 - neste codigo abaixo com o quick report em outro form.

Form2.valorext.caption:=edit1.Text;
form2.QuickRep1.Preview;


desta forma o relatorio recebe o valor por extenso para imprimir ou mesmo para um preview, sem buscar no banco de dados.
espero que seja isto que vc deseja.

Obs:
o exemplo é por um edit porque vc disse que pode ser por ele, mas vc pode
pegar a variavel do seu extenso e mandar para o seu relatorio!.



at+
GOSTEI 0
Gilvanio Gonçalves

Gilvanio Gonçalves

16/10/2012

no exemplo do quick report estando em outro form, esqueci de te dizer, que ele deverá receber a unit
do form do edit.

implementation

uses Unit1;// unit fpr form1.



Abs.
GOSTEI 0
Gilvanio Gonçalves

Gilvanio Gonçalves

16/10/2012

no exemplo do quick report estando em outro form, esqueci de te dizer, que ele deverá receber a unit
do form do edit.


implementation

uses unit1;// unit fpr form1.


abs.



correção de digitação:

implementation

uses unit1;// unit form1.






GOSTEI 0
Jeferson Araujo

Jeferson Araujo

16/10/2012

oq eu uso é o fast report... nao sei se funciona igual mas irei testá-lo obrigado!
GOSTEI 0
Alisson Santos

Alisson Santos

16/10/2012

Jefferson depois post aqui se conseguiu ou não fazer.
GOSTEI 0
Jeferson Araujo

Jeferson Araujo

16/10/2012

é não consegui... talvez por ser fastreport... nao encontrei nenhum componente parecido com o do quick,

mas nele consigo criar uma variável, Dentro da pagina que configuro o relatorio... só nao estou conseguindo enviar os dados para esta variável.
GOSTEI 0
Jeferson Araujo

Jeferson Araujo

16/10/2012

Pronto Resolvido!

Resolvi da seguinte maneira,

na tela do relatório fui em relatório, variáveis, criei uma nova categoria e criei uma variável chamada Numero_Extenso, e no meu form do Delphi eu criei uma variável numeroextenso que é o que aparece no Edit,
no botão de visualizar o relatório, eu assim:

frxRecibo.Variables['Numero_Extenso']:= QuotedStr(numeroextenso);

aí no caso ele está aparecendo normalmente ^^, muito simples de fazer mas como não sabia quebrei a cabeça, mas agora aprendi!

vlw pela ajuda.. mesmo que não tenha resolvido foi o que me incentivou a conseguir
GOSTEI 0
Gilvanio Gonçalves

Gilvanio Gonçalves

16/10/2012

é não consegui... talvez por ser fastreport... nao encontrei nenhum componente parecido com o do quick,

mas nele consigo criar uma variável, Dentro da pagina que configuro o relatorio... só nao estou conseguindo enviar os dados para esta variável.


Jeferson, supondo que sua function que gera o extenso esteja no mesmo form do edit ok.

sendo assim no form (ou pagina como vc diz)do seu relátorio crie uma variavel tipo string.

exemplo:
var
  Form2: TForm2;// form do seu relatorio
  ext : String;// a variavel


no evento onshow deste form faça assim:

ext := form1.valorPorExtenso(StrToFloat(form1.Edit1.Text));



ext é o nome da variavel criada.
onde é form1, é o form que esta a function e o edit.
onde esta (valorPorExtenso) seria o nome de sua function.
os nomes vc muda conforma vc usa ai.

vc tem que declarar a unit no form1 no seu form2 e no form2 a unit do form1.

exemplo form1:

implementation

uses Unit2;


no form do relatorio:

implementation

uses Unit1;


o codigo esta facil de entender, a varivel ext, recebe o valor digitado no
edit1, já convertido em extenso pela sua function.

Assim vc esta recebendo os dados na variavel como vc disse que não conseguiu
fazer.

agora é só usar o valor da variavel, ou a variavel não sei como vc irá adaptar
ao seu uso.

te passei como pegar o valor por uma variavel como vc disse que seria vaiavel
pra vc devido ser fastReport, pois eu não uso o FastReport, para te passar um exemplo
como fiz usando o quickReport,ok?.eu uso o fortes report.

espero que assim resolva.

se ainda tiver duvida? post ai.










GOSTEI 0
POSTAR