Ir para conteúdo
  • Cadastre-se

dev botao

Dúvida Set_Context e Get_Context


Ver Solução Respondido por carlessoflu,
  • Este tópico foi criado há 737 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Postado

Estou querendo pegar o usuário logado no sistema Delphi para informar nas tabelas no BD Firebird 2.1, estou fazendo da seguinte forma: 

Depois de logar com o usuário no sistema uso o comando abaixo para set_context: 

Faço um set_context para informar o número do usuário na variável USUARIO 

DMMov.QGen2.Close; // DMMov.QGen2 é meu IBQuery
DMMov.QGen2.Sql.Clear;                                                       //número do usuário 
DMMov.QGen2.Sql.Add('select rdb$set_context(''USER_SESSION'',''USUARIO'','''+F0Menu.Label4.Caption+''') from rdb$database;');
DMMov.QGen2.Open;

//aqui é só para verificar se deu certo, e deu, a variável está setada com o número do usuário 

DMMov.QGen2.Close;
DMMov.QGen2.Sql.Clear;
DMMov.QGen2.Sql.Add('select rdb$get_context(''USER_SESSION'',''USUARIO'') as usu from rdb$database;');
DMMov.QGen2.Open;
showmessage('usuario '+DMMov.qgen2.fieldbyname('usu').asstring);

na minha tabela ENTRSAIDAS criei um campo USUARIO integer, e criei uma trigger active before insert da seguinte forma: 

CREATE OR ALTER trigger entrsaidas_usuario for entrsaidas
active before insert position 0
AS
begin
  new.usuario = RDB$GET_CONTEXT('USER_SESSION', 'USUARIO');
end

Mas o usuário está sempre ficando null, esse é o problema. Tem alguma ideia do que pode ser?

 

Fiz um teste e percebi que quando faço um insert da seguinte forma funciona, o campo usuário fica preenchido. 

DMMov.IBSQL.Close;
DMMov.IBSQL.Sql.Clear;
DMMov.IBSQL.Sql.Add('INSERT INTO ENTRSAIDAS (GRUPO, TIPO, LOJA, EMISSAO, HISTORICO, VALOR, ENTR_SAIDAS, LOJAANT, DATA, BANCODIN, TURNO, LJ, SELECIONAR, CONFIRMADO, SETOR, NUM_NFCE, REG_CARTAO, LOCACAO_REG, USUARIO) VALUES (''1'', ''Dinheiro'', ''1''');
DMMov.IBSQL.Sql.Add(', ''04/05/2023 00:00:00'', ''TRANSFERENCIA DAS LOJAS'', ''1'', ''Saida'', ''1'', ''04/05/2023 00:00:00'', ''-1'', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);');
DMMov.IBSQL.ExecQuery;
DMMov.IBSQL.Transaction.CommitRetaining;

Mas quando faço dando um insert pelo ClientDataSet ele não funciona, e dessa forma é que eu uso no sistema inteiro.

TEntrSaidas.Insert;

É isso mesmo? O Get e set context não funciona quando usa dessa forma? 

Obrigado!

  • Solution
Postado

Consegui resolver, vou deixar aqui caso alguém tenha a mesma dúvida.

Usei um SqlQuery para fazer o set_context ao invés do IBQuery e deu certo.

Acredito que é porque o SqlQuery fica ligado direto no SqlConnection, e como uso ClientDataSet para fazer o insert, que tbm é ligado direto no SqlConnetion, eles ficam na mesma SESSION de conexão.

Já o IBQuery fica ligado direto no IBDatabase, nesse caso dá certo usando o IBSQL, que tbm fica ligado no IBDatabase.

  • Este tópico foi criado há 737 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.
Visitante
Este tópico está agora fechado para novas respostas
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.

The popup will be closed in 10 segundos...
The popup will be closed in 10 segundos...