Página 1 de 1

Funcao PRONAME() não retorna o esperado

Enviado: 29 Jun 2008 15:22
por rubens
Olá.. pessoal...

Eu uso em um sistema a seguinte funcao na linha final dos relatorios..

RODAPE( PROCNAME() ) ---- para enviar o nome do relatorio para a funcao rodape...


function rodae( PROCNAME )

// Verifica se a váriavel existe, se não existe cria a váriavel com vazio
If Type("PROCNAME") == "U"
PROCNAME = " "
Endif

@ 60,00 say "---> "+PROCNAME+" ---> "+cSISTEMA
EJECT

RETURN NIL

No programa que coloquei tava tudo funcionando blz.. fui colocar no resto dos meus programas e apareceu um espacço em branco no relatório.. daí fui debugar com o cld e para minha surpresa tá ocorrendo o seguinte:

Quando verifico
? Type( "PROCNAME" ) --- o CLD mostra como "C" - ok...
mas na execução do programa ele entra no loop do If..
daí verifiquei
? Type(PROCNAME) --- o CLD mostra como "U", por isso que está entrando no loop do IF.. mas eu nao estou verificando PROCNAME, sem aspas no programa...
Daí para resolver por enquanto tirei a condição... mas como eu estou implementando isso nos meus programas se ficar algum relatorio sem enviar o comando - rodape(procname()) vai dar um erro porque a variavel nao vai existir...
Mas ta funcionando no primeiro sistema... será que é um erro do clipper.. .??? já apaguei todos os obj e recompilei o sistema inteiro... mas continua dando o mesmo erro...

FUNCAO PROCNAME() NÃO RETORNA O ESPERADO

Enviado: 29 Jun 2008 19:41
por Pablo César
Olá Rubens.

Notei que você utilizou a mesma nomenclatura de variável que o próprio nome da função, isto não estaria sendo interpretado como "Reserved words" (palavras reservas) ?. Tentou mudar o nome da variável ?. Se essa função é apenas para mostrar o nome do módulo no próprio relatório, por quê você não utiliza uma variável do tipo CONSTANTE ?

Se persistir o erro, sem saber como está estruturado o seu sistema, você poderia utilizar-se de uma outra forma de identificar o seu módulo, substituindo PROCNAME() por EXENAME() da CT.lib ?

Re: FUNCAO PROCNAME() NÃO RETORNA O ESPERADO

Enviado: 29 Jun 2008 23:48
por rubens
Eu fiz um teste usando no nome da variavel no lugar de procname mudei para nomerel e dá o mesmo erro... daclareia a variavel tb como nomerel no primeiro programa para ser reconhecida dentro de todo o programa mas mesmo assim dá o erro porque nao reconhece a variavel como publica mesmo trocando o nome. não sei por que não funciona.. se tenho um sistema compilado funcionando... amanhã vou no cliente tirar um relatorio pra ver ser realmente tá funcionando... compilei os fontes que tenho aqui e ocorre o mesmo problema...

FUNCAO PROCNAME() NÃO RETORNA O ESPERADO

Enviado: 30 Jun 2008 08:28
por Pablo César
E se você criar a variável fora do cahamado da função ? Assim:

Código: Selecionar todos

nomerel:=PROCNAME()
RODAPE( nomerel ) ---- para enviar o nome do relatorio para a funcao rodape...


function rodape( nomerel )
..//..
Talvez essa função não funcione adequadamente em forma aninhada. A outra saída seria você utilizar uma variável constante:

Código: Selecionar todos

nomerel:="Relatorio_01"
RODAPE( nomerel ) ---- para enviar o nome do relatorio para a funcao rodape...


function rodape( nomerel )
..//..
Não entendendo como poderia estar dando erro ??

Re: FUNCAO PROCNAME() NÃO RETORNA O ESPERADO

Enviado: 30 Jun 2008 08:41
por rubens
Eh..
realmente estranho..

Quando manda

rodape(procname())

a funcao recebe o parametro...
mas não faz a comparacao...

vou arrumar outro compilador para ver....
talvez o meu já esteja bichado.. eu coloco o resultado aqui...

Rubens

FUNCAO PROCNAME() NÃO RETORNA O ESPERADO

Enviado: 30 Jun 2008 08:43
por Pablo César
Fiz este exemplo e ele retorna corretamente o conteúdo do nomerel. Uma coisa a ser observada é que eu repassei a variável quando é chamada desde uma outra função (veja no meu exemplo abaixo em OUTRAFUN(nomerel) onde você percebe que estou repassando a variável e desta forma não preciso declará-la como PUBLIC):

Código: Selecionar todos

nomerel:=PROCNAME()
? nomerel
RODAPE( nomerel )
RODAPE( "Relatorio_01" )
RODAPE( PROCNAME() )
? "--"
outrafun(nomerel)

FUNCTION OUTRAFUN(nomerel)
? nomerel
RODAPE( nomerel )
RODAPE( "Relatorio_01" )
RODAPE( PROCNAME() )


function rodape( nomerel )
? nomerel
Compilei em 5.2e e RTLINK também com 5.3 e BLINKER 5.01

Re: FUNCAO PROCNAME() NÃO RETORNA O ESPERADO

Enviado: 30 Jun 2008 09:07
por rubens
Pablo..

Por gentileza , compile e teste este código...

TESTAR()

FUNCTION TESTAR()
VAR := PROCNAME()
RODAPE( VAR )
RETURN NIL

FUNCTION RODAPE( VAR )
? TYPE("VAR")
IF TYPE( "VAR" ) = "C"
? "OK... ESTA TUDO CERTO"
ENDIF
RETURN NIL

FUNCAO PROCNAME() NÃO RETORNA O ESPERADO

Enviado: 30 Jun 2008 09:20
por Pablo César
Compilei e deu:

C
OK... ESTA TUDO CERTO

Deve o Clipper ou o linkador seu.

Re: FUNCAO PROCNAME() NÃO RETORNA O ESPERADO

Enviado: 30 Jun 2008 09:47
por rubens
Eh.. então blz.. o código está certo.. deve ser o meu compilador, linkador mesmo...

Vou pegar outra copia para ver... e posto o resultado. .aqui..

Obrigado

Re: FUNCAO PROCNAME() NÃO RETORNA O ESPERADO

Enviado: 01 Jul 2008 14:31
por rochinha
Amiguinho

Verifique em seu .LNK, provavelmente voce esta acrescentando alguma .LIB ou OBJ que tenha esta funcao re-codificada para dar resultado vazio.

Linke com as .LIBs originais e teste e depois acrescente outras .LIBs.