Escrito por

Pergunta Daniela R · Mar. 11, 2024

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

Comments

Danusa Calixto · Mar. 11, 2024

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 🤞🏼 

0
Daniela R  Mar. 11, 2024 to Danusa Calixto

@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.

0
Daniela R  Mar. 11, 2024 to Daniela R

Como não consegui, por enquanto deixei do mesmo jeito que você mencionou.

0
Danusa Calixto  Mar. 13, 2024 to Daniela R

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 ? 

0
Daniela R  Mar. 13, 2024 to Danusa Calixto

Oi, obrigada novamente. Foi compilada. Ainda não entendi porque não funciona, mas consegui chamar com ##class.

0