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 i = 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á
Comments
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(string, ByRef retMedia) As %Status (ou o tipo desejado)
2ª - No método CalcularMedia(string, ByRef 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.
Como não consegui, por enquanto deixei do mesmo jeito que você mencionou.
Oi Daniella,
Referente a sua questão eu tinha feito essa pergunta na mensagem anterior:
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?
Você verificou ?
Oi, obrigada novamente. Foi compilada. Ainda não entendi porque não funciona, mas consegui chamar com ##class.