Variável currency esta retornando zero mesmo a função tendo

12/12/2018

0

Bom dia a todos, tenho uma variável currency que esta retornando zero, mas a função que retorno os dados está retornando no result corretamente, segue abaixo o código:

Função:
function TFacadeMensalista.getSaldoAnteriorMensalista(idMensalista: Integer; DataInicial, DataFinal: TDateTime): Currency;
var
vsSQL : String;
begin
Result := 0;
vsSQL := '''''''' select ml_saldo ''''''''
+ '''''''' from ''''''''
+ '''''''' mensalista_lancamento ''''''''
+ '''''''' where ''''''''
+ '''''''' ml_pessoa = '''''''' + CSql(idMensalista)
+ '''''''' and ml_data between '''''''' + CSql(DataInicial) + '''''''' and '''''''' + CSql(DataFinal)
+ '''''''' and ml_tipo = '''''''' + CSql(eML_TIPO_PAGAMENTO)
+ '''''''' and ml_situacao = '''''''' + CSql(eML_SITUACAO_NORMAL)
+ '''''''' order by ml_data '''''''';
controle.DadosAux.ExecutaSQL(vsSQL);
Result := controle.DadosAux.getCur(ML_SALDO);
end;


Chamando ela:
saldoAnterior := facade.getSaldoAnteriorMensalista(mensalista, dataIni, dataFim);

E mesmo assim retorna 0, muito estranho se alguém souber de algo, me avisa por favor, valeu.
Fernando Wahl

Fernando Wahl

Responder

Posts

12/12/2018

Emerson Nascimento

function TFacadeMensalista.getSaldoAnteriorMensalista(idMensalista: Integer; DataInicial, DataFinal: TDateTime): Currency;
var
	vsSQL : String;
begin
	Result := 0;
	vsSQL :=	' select ml_saldo from mensalista_lancamento '
			+ ' where '
			+ ' ml_pessoa = ' + CSql(idMensalista)
			+ ' and ml_data between ' + CSql(DataInicial) + ' and ' + CSql(DataFinal)
			+ ' and ml_tipo = ' + CSql(eML_TIPO_PAGAMENTO)
			+ ' and ml_situacao = ' + CSql(eML_SITUACAO_NORMAL)
			+ ' order by ml_data ';
	controle.DadosAux.ExecutaSQL(vsSQL);
	Result := controle.DadosAux.getCur(ML_SALDO);
end;

seria necessário publicar o código das funções
- CSql()
- controle.DadosAux.ExecutaSQL()
- controle.DadosAux.getCur()

porque elas que tratam dos parâmetros, executam (abrem) a query e retornam o conteúdo do campo.
Responder

12/12/2018

Raimundo Pereira

Exatamente como o Emerson:

Fiz um teste em base local:

function TFP.getSaldoAnteriorMensalista(idMensalista: Integer;
  DataInicial, DataFinal: TDateTime): Currency;
var
  vsSQL: String;
begin

  Result := 0;
  dm.DadosAux.close;
  dm.DadosAux.sql.Clear;
  vsSQL := ' select ml_saldo ' + ' from ' + ' mensalista_lancamento ' +
    ' where ' + ' ml_pessoa = ' + IntToStr(idMensalista) +
    ' and ml_data between ''' + DateToStr(DataInicial) + ''' and ''' +
    DateToStr(DataFinal) + '''' + ' and ml_tipo = ''' + eML_TIPO_PAGAMENTO +
    '''' + ' and ml_situacao = ''' + eML_SITUACAO_NORMAL + '''' +
    ' order by ml_data ';

  dm.DadosAux.sql.Text := vsSQL;

  vsSQL := StringReplace(vsSQL, '/', '.', [rfReplaceAll, rfIgnoreCase]);

  dm.DadosAux.open;
  Result := dm.DadosAux.FieldByName('ml_saldo').AsCurrency;
end;


Chamando a função usei:
eML_SITUACAO_NORMAL:='N'; //Apenas para efeito de teste
eML_TIPO_PAGAMENTO:='X'; //Apenas para efeito de teste
ShowMessage(CurrToStr(getSaldoAnteriorMensalista(1,DateTimePicker1.Date,DateTimePicker2.Date)));


Responder

12/12/2018

Jucélio Silva

Uma dica é testar o sql puro no banco e ver se te dar o retorno.<br />
<br />
Testa em mais de uma IDE , já tive caso de querys complexas não executar da forma que eu esperava em uma IDE e na outra rodava certinho, isso ocorre por conta da formatação de datas, não sei qual banco ou formato de data mas DateTime é campeão em me pegar peças no Oracle e no Informix.
Responder

12/12/2018

Fernando Wahl

Boa tarde a todos, ja consegui resolver, mas tive que fazer um programação Chuck Noris.

A função estava correta, o problema não pé nela, estava na declaração de variável.

Valeu galera.
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar