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á 597 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á 597 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...