Erro ao utilizar a função GlideRecord.operation()

Fabio Mira
Giga Expert

Olá, tudo bem com vocês?

Estou tentando realizar um teste simples para entender o metodo operation() do objeto GlideRecord Server Scoped em uma PDI.

De acordo com a documentação este método serveria para identificar se o objeto GlideRecord está sofrendo um evento de "insert", "update" ou "delete".

Fiz uma BR simples, apenas para logar as informações, em uma tabela de minha aplicação escopada com a seguinte configuração:

  1. When: Before
  2. Insert: True
  3. Delete: True
  4. Update: True
  5. Script:
(function executeRule(current, previous /*null when async*/) {

	gs.info("***DEBUG previous.getTableName()" + previous.getTableName());
	gs.info("***DEBUG current.getTableName()" + previous.getTableName());
	gs.info("***DEBUG previous.getUniqueValue()" + previous.getUniqueValue());
	gs.info("***DEBUG current.getUniqueValue()" + previous.getUniqueValue());
	gs.info("***DEBUG previous.operation()" + previous.operation());
	gs.info("***DEBUG current.operation()" + current.operation());
		
})(current, previous);

Nessa versão de código ocorre um warning do Rhino informando que a propriedade "operation" não pode ser executada por se tratar de um objeto, explodindo o seguinte registro na syslog:

com.glide.script.RhinoEcmaError: Cannot call property operation in object [object GlideRecord]. It is not a function, it is "object".
sys_script.f5212186875c11109efdfcc5dabb35ee.script : Line(7) column(0)
5: gs.info("***DEBUG previous.getUniqueValue()" + previous.getUniqueValue());
6: gs.info("***DEBUG current.getUniqueValue()" + previous.getUniqueValue());
==> 7: gs.info("***DEBUG previous.operation()" + previous.operation());
8: gs.info("***DEBUG current.operation()" + current.operation());
9:
10: })(current, previous);

Aqui uma imagem com todo o log do node que executou a transação:

find_real_file.png

Tentando entender o que está ocorrendo, refiz o script fazendo um parse desse suposto objeto para String:

(function executeRule(current, previous /*null when async*/) {

	gs.info("***DEBUG previous.getTableName()" + previous.getTableName());
	gs.info("***DEBUG current.getTableName()" + previous.getTableName());
	gs.info("***DEBUG previous.getUniqueValue()" + previous.getUniqueValue());
	gs.info("***DEBUG current.getUniqueValue()" + previous.getUniqueValue());
	gs.info("***DEBUG previous.operation()" + previous.operation.toString());
	gs.info("***DEBUG current.operation()" + current.operation.toString());

})(current, previous);

Para minha surpresa o script é executado sem nenhum alerta ou erro na syslog ou no node log, porém exibe fixamente o valor de 'insert' conforme o log abaixo, independetemente se eu realizo um insert, update ou delete na tabela da BR.

A imagem abaixo o log da transação quando executei um delete direto da lista de registro

find_real_file.png

Alguem faz alguma ideia do que está ocorrendo?
Existe um erro de documentação ou minha PDI está tendo um comportamento anormal?

Obrigado

1 REPLY 1

Flavio Tiezzi
Kilo Sage

Oi, Fabio!

Bom, pelo o que eu entendi, vc está testando operation() e não está funcionando corretamente, certo?

Testei aqui na minha PDI, e consegui obter os 3 eventos (Update, Insert e Delete).

Vc tentou utilizar só o current.operation para ver o retorno?

 

(function executeRule(current, previous /*null when async*/ ) {

    var currentOperation = current.operation();
    gs.info('BR Operação current.operation(): '  + currentOperation);
	
	if(currentOperation == 'update'){
		current.setValue('u_text', 'Teste update');
	}

})(current, previous);

 

Nos testes que fiz usando o previous.operation() está retornando null. Entendo que não é possível buscar pelo evento anterior uma vez que para BR rodar ela está esperando um evento atual