Pergunta
· Mar. 11

Chamada de método funciona em uma rotina, um procedimento semelhante não funciona em outra rotina

Olá a todos!

 

Estou com o seguinte problema

Em uma rotina chamei o método da seguinte forma:

;
;
;
write !, "Informe uma palavra ou frase para verificar: "
;
read str
;
set sc = $$ValidarPalindromo^YYHORG001(str)
;
;
write !, sc
;
quit

 

Método da classe YYHORG001

 

Method ValidarPalindromo(string)
{
set textoOriginal = $zconvert(string, "l")
set textoOriginalLimpo = $translate($translate(textoOriginal, " "), ".,;:?!\'", "")
set textoInvertidoLimpo = $translate($translate($zconvert($reverse(string), "l"), " "), ".,;:?!\'", "")
;
;
if textoInvertidoLimpo = textoOriginalLimpo {
;write !, textoInvertidoLimpo,
;!, textoOriginalLimpo
;
;
set sc = $$$OK
quit sc
;

else{
;write !, textoInvertidoLimpo,
;!, textoOriginalLimpo
;
set sc = $$$ERROR()
quit sc
; }
}

 

Nesta rotina é possível executar o método normalmente, porém em outra rotina, eu tento executar um método utilizando o mesmo procedimento e recebo o seguinte erro:
<NOROUTINE>YYTRA002+10^YYTRA002 *YYHORG002

 

segue a outra rotina, onde tento executar o outro método

write !, "Informe uma lista de números,", !, "ex.: 1,10,9,5,3,6,8,10,3,99,9,66,51", !
;
read string
;
;
set retMedia = 0
;
set sc = $$CalcularMedia^YYHORG002(string, retMedia)
;
;
write !, sc
;
quit

 

Método da classe YYHORG002

 

Method CalcularMedia(string, ByRef retMedia)
{
set listaNums = $listbuild()
;
;
for = 1 : 1 : $length(string)
{
set caracter = $extract(string, i)
if $isvalidnum(caracter)
{
write !, caracter
set $list(listaNums) = caracter
}
write !, $length(listaNums)
}
;
set media = retMedia
;
quit retMedia
}

 

Alguém , por gentileza, poderia me tirar essa dúvida, porque um funciona e o outro não?

 

Grata desde já

$ZV: 2018.1.3.414.0
Discussão (5)0
Entre ou crie uma conta para continuar

Oi Daniella. 
Tudo bem? 

Seguem algumas considerações que observei a respeito do seu código: 

1) O erro <NOROTINE> indica que a rotina YYHORG002 não existe. Isso pode ter ocorrido se a YYHORG002 não foi compilada. Você verificou se a classe foi compilada com sucesso? 

2) Se você está trabalhando com classes, por quê não está chamando ao método usando a orientação a objetos, e sim chamando a rotina gerada através da compilação ?  

Exemplo:

substituir de: set sc $$ValidarPalindromo^YYHORG001(str
para : set sc = ##class(YYHORG001).ValidarPolindromo(str)

Observações: 

1ª - está faltando na assinatura do método o tipo do retorno:
       Ex1: Method ValidarPalindromo(string) As %Status
     
 Ex2: 
Method CalcularMedia(stringByRef retMedia) As %Status (ou o tipo desejado)

2ª - No método CalcularMedia(stringByRef retMedia) o segundo parâmetro retMedia está definido com passagem por referencia, e na chamada da rotina você deveria usar o ponto (.) antes da variável: .retMedia 

3ª - No mesmo método você está retornando o mesmo valor de retMedia que foi enviado na chamada ao método. Está correto?  Desta forma as variáveis media e retMedia terão sempre o mesmo valor.

4ª - Se os métodos não são de instancia (que acessam dados do objeto da classe) e são chamados como métodos de operação, eles devem ser definidos como ClassMethod para serem acessados diretamente sem instanciar a classe. 
 

Espero ter ajudado!
Boa sorte 🤞🏼 

@Danusa Calixto 
Muito agradecida pelo seu auxílio.

No exercício que estou a realizar, é pedido o seguinte: Para executar o método: set sc=$$CalcularMedia(string,.retMedia)

Por isso tentei executar o método desta maneira, porém em um funciona, no outro não.

A questão do retorno, tinha deixado daquele jeito por enquanto, mas já corrigi. Só gostaria de saber como chamar o método do mesmo jeito que fiz na primeira rotina e funcionou.