Não salva o resultado da query no banco de dados (Firebird)

Delphi

Query

Firebird

FireDAC

20/02/2020

function GetNumeroNFCe(aIDLoja: Integer) : Integer;
var
mQuery : TFDQuery;
begin
Result := 0;
try
QueryCriar(mQuery, False);
mQuery.SQL.Add('SELECT NFCE_SEQUENCIA FROM CONFIGURACAO');
mQuery.Open();
mQuery.CachedUpdates := True;
FrmPrincipal.ConnectConfigPDV.StartTransaction;
mQuery.Edit;
mQuery.FieldByName('NFCE_SEQUENCIA').AsInteger := mQuery.FieldByName('NFCE_SEQUENCIA').AsInteger + 1;
mQuery.Post;
Result := mQuery.FieldByName('NFCE_SEQUENCIA').AsInteger;
finally
QueryLiberar(mQuery);
end;
end;

Alguém saberia me ajudar? Não estou conseguindo encontrar qual é a linha que esta incorreta.
A numeração da nota esta somando + 1 corretamente, só não grava no firebird.
Ana Soares

Ana Soares

Curtidas 0

Melhor post

Emerson Nascimento

Emerson Nascimento

20/02/2020

tente assim (de qualquer forma, faltava o commit):
function GetNumeroNFCe(aIDLoja: Integer): Integer;
var
	mQuery: TFDQuery;
begin
	Result := 0;
	try
		QueryCriar(mQuery, False);
		FrmPrincipal.ConnectConfigPDV.StartTransaction; // abre a transacao
		mQuery.ExecSQL('UPDATE CONFIGURACAO SET NFCE_SEQUENCIA = NFCE_SEQUENCIA + 1');
		FrmPrincipal.ConnectConfigPDV.Commit; // confirma a transacao
		mQuery.Open('SELECT NFCE_SEQUENCIA FROM CONFIGURACAO');
		Result := mQuery.FieldByName('NFCE_SEQUENCIA').AsInteger;
		mQuery.Close;
	finally
		QueryLiberar(mQuery);
	end;
end;

Só não entendi a finalidade do parâmetro aIDLoja
GOSTEI 1

Mais Respostas

Ana Soares

Ana Soares

20/02/2020

Show ! Funcionou, muito obrigada!

Eu copiei e coloquei a function de outra parte do código, esqueci de apagar.o aIDLoja.
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

20/02/2020

vi que você usa Firebird. nesse caso recomendo a você utilizar GENERATOR/SEQUENCE, porque é um processo protegido, e não há risco de duas instância "pegarem" o mesmo valor.

se usar generator, o instrução seria mais ou menos assim:
function GetNumeroNFCe(): Integer;
var
	mQuery: TFDQuery;
begin
	Result := 0;
	try
		QueryCriar(mQuery, False);
		mQuery.Open('SELECT GEN_ID(NFCE_SEQUENCIA,1) PROX_NFCE FROM RDB$DATABASE');
		Result := mQuery.FieldByName('PROX_NFCE').AsInteger;
		mQuery.Close;
	finally
		QueryLiberar(mQuery);
	end;
end;

para criar o generator no Firebird:
CREATE SEQUENCE NFCE_SEQUENCIA START WITH XXX INCREMENT BY 1; -- XXX É O VALOR INICIAL, NO CASO, O ÚLTIMO NFCE EXISTENTE

/* Sintaxe antiga:
CREATE GENERATOR NFCE_SEQUENCIA;
SET GENERATOR NFCE_SEQUENCIA TO XXX; -- XXX É O VALOR INICIAL, NO CASO, O ÚLTIMO NFCE EXISTENTE
*/

/* Previlégios para o generator */
GRANT USAGE ON SEQUENCE NFCE_SEQUENCIA TO SYSDBA WITH GRANT OPTION;

GOSTEI 1
Ana Soares

Ana Soares

20/02/2020

Obrigada! No inicio eu pensei em fazer assim, mas, não consegui. Ai Acabei optando pelo outro jeito, porém desta forma que você explicou é mais segura sim. Vou alterar.
GOSTEI 0
POSTAR