Função STATIC em VALID

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Função STATIC em VALID

Mensagem por JoséQuintas »

Ainda estou tentando entender erros de ontem.
Error BASE/1001 Undefined function: CALCDIAS
Called from CALCDIAS(0)
Called from (b)DIGITAPARCELAS(400)
Called from GETPOSTVALIDATE(454)
Called from GETREADER(185)
Called from READMODAL(126)
Called from DIGITAPARCELAS(424)
Called from GERANOTA(214)
Called from P0600NOTA(186)
Called from JPPEDICLASS:USERFUNCTION(438)
Called from JPPEDICLASS:EXECUTE(330)
Called from P0600PED(110)
Called from DO(0)
...
errostatic.png
errostatic.png (11.33 KiB) Exibido 4433 vezes
O erro foi causado ao alterar CalcDias() pra STATIC.
Mas está no mesmo fonte, deveria estar visível.

Neste simulado, nenhum erro.

Código: Selecionar todos

PROCEDURE Main

   LOCAL GetList := {}, nValor := 0

   CLS
   @ 1, 0 GET nValor PICTURE "9999" Valid TestVal( nValor )
   @ 2, 0 GET nValor PICTURE "9999" Valid TestVal( nValor )
   @ 3, 0 GET nValor PICTURE "9999" Valid TestVal( nValor )
   @ 4, 0 GET nValor PICTURE "9999" Valid TestVal( nValor )
   @ 5, 0 GET nValor PICTURE "9999" Valid TestVal( nValor )
   READ

   RETURN

STATIC FUNCTION TestVal( nValor )

   nValor := nValor

   RETURN .T.
A questão agora é descobrir porque na outra situação não aceitou a mesma coisa.
Talvez o caminho de execução ajude.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Função STATIC em VALID

Mensagem por JoséQuintas »

Sem idéia.
Independente de todo restante, P0600Nota(), GeraNota(), DigitaParcelas(), CalcDias() estão todos no mesmo fonte.
Não vejo nada que sirva pra explicar porque numa situação funciona e em outra não.

No teste-exemplo Já tentei:

- Separar módulo em threads
- Separar função chamando função
- Separar função STATIC chamando função STATIC

Em todos os casos funcionou, então não vejo explicação pra não funcionar no aplicativo.

Alguma idéia de que tipo de teste fazer?

Por enquanto considero um bug grave, não saber quando uma função STATIC vai ou não funcionar.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
Daniel
Usuário Nível 3
Usuário Nível 3
Mensagens: 373
Registrado em: 13 Ago 2003 22:42
Localização: Apucarana - PR

Função STATIC em VALID

Mensagem por Daniel »

So vi este erro em funcões transformada em lib
ai não acha a função static
Daniel

Harbour + Minigui + dbfcdx
Marinas-Gui Pena que parou o suporte
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Função STATIC em VALID

Mensagem por asimoes »

Três tentativas:

1-Instrução -rebuild
2-Remover o STATIC e ver o que acontece, existe outro CalcDias nos fontes ?
3-Renomear CalcDias
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Função STATIC em VALID

Mensagem por JoséQuintas »

ACHEI !!!

Um velho conceito do Harbour, que a gente acaba esquecendo.

Código: Selecionar todos

@ 1, 0 GET x VALID CalcDias() .AND. &x
Mesmo CalcDias() não estando dentro da macro, é tratado de forma diferente por causa da macro.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Função STATIC em VALID

Mensagem por JoséQuintas »

A "prova do crime".... rs

Código: Selecionar todos

PROCEDURE Main

   LOCAL GetList := {}, a := 0

   CLS

   @ 1, 0 GET a VALID CalcDias() .AND. &x
   READ

   RETURN

STATIC FUNCTION CalcDias()

   RETURN .T.
d:\temp>SE/1001 Undefined function: CALCDIAS
d:\temp>rom CALCDIAS(0)
Called from (b)MAIN(7)
Called from HBGETLIST:GETPOSTVALIDATE(0)
Called from HBGETLIST:READER(0)
Called from HBGETLIST:READMODAL(0)
Called from READMODAL(0)
Called from MAIN(8)
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Função STATIC em VALID

Mensagem por asimoes »

Não fiz o teste eu tentaria assim:

Considerando nos posts que a função CalcDias sempre retorna .T.

@ 1, 0 GET a VALID {|| CalcDias() , &x }
read

lRet := .F.
@ 1, 0 GET a VALID {|| CalcDias(@lRet) , IF(lRet, &x, lRet ) }
read
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Função STATIC em VALID

Mensagem por Jairo Maia »

Assim funciona:

Código: Selecionar todos

PROCEDURE Main

   LOCAL GetList := {}, a := 0

   CLS

   @ 1, 0 GET a VALID IF( CalcDias(), .T., .F. )
   READ

   RETURN

STATIC FUNCTION CalcDias()

   HB_ALERT( "Passando por CalcDias()" )

   RETURN .T.
Alterando a linha do GET como o Alexandre sugeriu também funciona:

Código: Selecionar todos

@ 1, 0 GET a VALID { || CalcDias() }
E fazendo assim também funciona (entre parenteses):

Código: Selecionar todos

@ 1, 0 GET a VALID ( CalcDias() )
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Função STATIC em VALID

Mensagem por JoséQuintas »

O problema é macro.

A rotina verdadeira em questão seria esta, pra pegar até 25 parcelas de pagamento.

Código: Selecionar todos

      FOR nCont = 2 TO 15
         cCont := LTrim( Str( nCont ) )
         cContAnt := LTrim( Str( nCont - 1 ) )
         @ Row()+1, 2 SAY "Parcela " + StrZero( nCont, 2 ) + ".:"
         @ Row(), Col()+2 GET oParcelas[ &cCont, 2 ] ;
                              WHEN lAltera .AND. ! " " $ Dtoc( oParcelas[ &cContAnt, 2 ] ) ;
                              VALID CalcDias( mnfDatEmi, oParcelas[ &cCont, 2 ], @oParcelas[ &cCont, 3 ] )
         @ Row(), Col()+2 SAY "(Dias)" GET oParcelas[ &cCont, 3 ] PICTURE "999" ;
                              WHEN lAltera .AND. ! " " $ Dtoc( oParcelas[ &cCont, 2 ] ) ;
                              VALID CalcVencto( mnfDatEmi, @oParcelas[ &cCont, 2 ], oParcelas[ &cCont, 3 ] )
         @ Row(), Col()+2 GET oParcelas[ &cCont, 1 ] PICTURE PicVal(14,2) ;
                              WHEN lAltera .AND. ! " " $ Dtoc( oParcelas[ &cCont, 2 ] ) ;
                              VALID ( NFRecalcula( nValorTotal, oParcelas, mQtd ) .AND. oParcelas[ &cCont, 1 ] <> 0 ) .OR. LastKey() == 5
      NEXT
O FOR/EACH normal não serve, porque analisa a parcela anterior, e não dá pra usar Parcela:__EnumIndex -1 no GET.

Lembrei que o FOR/EACH tem opção de trabalhar com dois arrays de uma vez.

Nunca usei, mas não custa tentar.... rs
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Função STATIC em VALID

Mensagem por JoséQuintas »

Ficou esquisita, mas funcionou.
Só pra eliminar o uso de macro..... rs
Aproveitei pra acrescentar a primeira parcela que era separada.

Código: Selecionar todos

      FOR EACH oElement, oNumElement IN oParcelas, { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25 }
         @ Row()+1, 2 SAY "Parcela " + StrZero( oElement:__EnumIndex, 2 ) + ".:"
         IF oElement:__EnumIndex == 1
            @ Row(), Col() + 2 GET oElement[ 2 ] ;
                                   WHEN lAltera ;
                                   VALID ! " " $ Dtoc( oElement[ 2 ] ) .AND. CalcDias( mnfDatEmi, oElement[ 2 ], @oElement[ 3 ] )
            @ Row(), Col() + 2 SAY "(Dias)" GET oElement[ 3 ] PICTURE "999" ;
                                   WHEN lAltera ;
                                   VALID CalcVencto( mnfDatEmi, @oElement[ 2 ], oElement[ 3 ] )
            @ Row(), Col() + 2 GET oElement[ 1 ] PICTURE PicVal(14,2) ;
                                   WHEN lAltera ;
                                   VALID ( NFRecalcula( nValorTotal, oParcelas, mQtd ) .AND. oElement[ 1 ] <> 0 ) .OR. LastKey() == 5
         ELSE
            @ Row(), Col()+2 GET oElement[ 2 ] ;
                                 WHEN lAltera .AND. ! " " $ Dtoc( oParcelas[ oNumElement - 1, 2 ] ) ;
                                 VALID CalcDias( mnfDatEmi, oElement[ 2 ], @oElement[ 3 ] )
            @ Row(), Col()+2 SAY "(Dias)" GET oElement[ 3 ] PICTURE "999" ;
                                 WHEN lAltera .AND. ! " " $ Dtoc( oElement[ 2 ] ) ;
                                 VALID CalcVencto( mnfDatEmi, @oElement[ 2 ], oElement[ 3 ] )
            @ Row(), Col()+2 GET oElement[ 1 ] PICTURE PicVal(14,2) ;
                                 WHEN lAltera .AND. ! " " $ Dtoc( oElement[ 2 ] ) ;
                                 VALID ( NFRecalcula( nValorTotal, oParcelas, mQtd ) .AND. oElement[ 1 ] <> 0 ) .OR. LastKey() == 5
         ENDIF
      NEXT
Isso é pra isto:
parcelas.png
Além das diversas opções de prazos, alguns esquisitos por sinal, também dá pra alterar manual.
Dependendo de senha apenas mostra, e não deixa alterar nada.

Conforme vai preenchendo vai recalculando.
- pode colocar data de vencimento em data
- pode colocar vencimento em quantidade de dias, já calcula data
- pode escolher valores das parcelas, já vai recalculando o saldo restante
- se digitar em branco, considera encerrado, assim o usuário só preenche o que precisa
- pode passear por todos os valores e datas

Deu certo esse FOR EACH com duas variáveis, não dá erro na função STATIC, por não ter mais macro.
No final o segundo elemento é só porque em determinado ponto verifico elemento anterior, e precisava identificar isso de alguma forma.
Só pra eliminar o uso de macro em GET, que me gerou problemas.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Função STATIC em VALID

Mensagem por JoséQuintas »

Alterei de novo.. rs
Apenas deixei o esquema original livre da interferência, sem precisar de macro.

Código: Selecionar todos

      FOR EACH oElement IN { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25 }
         @ Row()+1, 2 SAY "Parcela " + StrZero( oElement, 2 ) + ".:"
         IF oElement == 1
            @ Row(), Col() + 2 GET oParcelas[ oElement, 2 ] ;
                                   WHEN lAltera ;
                                   VALID ! " " $ Dtoc( oParcelas[ oElement, 2 ] ) .AND. CalcDias( mnfDatEmi, oParcelas[ oElement, 2 ], @oParcelas[ oElement, 3 ] )
            @ Row(), Col() + 2 SAY "(Dias)" GET oParcelas[ oElement, 3 ] PICTURE "999" ;
                                   WHEN lAltera ;
                                   VALID CalcVencto( mnfDatEmi, @oParcelas[ oElement, 2 ], oParcelas[ oElement, 3 ] )
            @ Row(), Col() + 2 GET oParcelas[ oElement, 1 ] PICTURE PicVal(14,2) ;
                                   WHEN lAltera ;
                                   VALID ( NFRecalcula( nValorTotal, oParcelas, mQtd ) .AND. oParcelas[ oElement, 1 ] <> 0 ) .OR. LastKey() == 5
         ELSE
            @ Row(), Col()+2 GET oParcelas[ oElement, 2 ] ;
                                 WHEN lAltera .AND. ! " " $ Dtoc( oParcelas[ oElement - 1, 2 ] ) ;
                                 VALID CalcDias( mnfDatEmi, oParcelas[ oElement, 2 ], @oParcelas[ oElement, 3 ] )
            @ Row(), Col()+2 SAY "(Dias)" GET oParcelas[ oElement, 3 ] PICTURE "999" ;
                                 WHEN lAltera .AND. ! " " $ Dtoc( oParcelas[ oElement, 2 ] ) ;
                                 VALID CalcVencto( mnfDatEmi, @oParcelas[ oElement, 2 ], oParcelas[ oElement, 3 ] )
            @ Row(), Col()+2 GET oParcelas[ oElement, 1 ] PICTURE PicVal(14,2) ;
                                 WHEN lAltera .AND. ! " " $ Dtoc( oParcelas[ oElement, 2 ] ) ;
                                 VALID ( NFRecalcula( nValorTotal, oParcelas, mQtd ) .AND. oParcelas[ oElement, 1 ] <> 0 ) .OR. LastKey() == 5
         ENDIF
      NEXT
Nota:
Essas coisas podem ser até mais interessantes em ambiente GUI, pra eliminar necessidade de macro, ou outras gambiarras, dependendo da LIB...
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Função STATIC em VALID

Mensagem por JoséQuintas »

Só reforçando:

Assim STATIC funciona

Código: Selecionar todos

@ 1, 0 GET nValor VALID CalcDias()
Assim é onde STATIC acusa erro

Código: Selecionar todos

@ 1, 0 GET nValor VALID CalcDias() .AND. &X
Quando tem macro no valid, acaba tratando o valid inteiro como macro, e neste caso CalcDias() não pode ser STATIC.
O negócio é evitar macro sempre que possível, pra não ter surpresas.
Isso também vale pra indexação.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Função STATIC em VALID

Mensagem por asimoes »

Se colocar a função calcdias na macro ?

Ou se colocar

X += " .and. calcdias ()"

?
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Função STATIC em VALID

Mensagem por JoséQuintas »

Agora pirei... kkkkk

Agora teve alerta na compilação, que considero correto para o tipo de problema.

Código: Selecionar todos


PROCEDURE Main

   LOCAL n, x := "Qualquer2(n)", GetList := {}

   @ 1, 1 GET n
   @ 2, 1 GET n VALID Qualquer( n )
   @ 3, 1 GET n VALID &x
   @ 4, 1 GET n VALID Qualquer( n ) .AND. &x
   READ

   RETURN

STATIC FUNCTION Qualquer( x );  RETURN x=x
FUNCTION Qualquer2( x ); RETURN x=x
Compiling 'test.prg'...

test.prg:9: error E0047 Code block contains both macro and declared symbol references 'N'

test.prg:9: error E0047 Code block contains both macro and declared symbol references 'X'

test.prg:9: error E0042 Macro of declared symbol '{|| Qualquer( n ) .AND. &x}'
3 erros
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Função STATIC em VALID

Mensagem por JoséQuintas »

Código: Selecionar todos


PROCEDURE Main

   LOCAL n, x := "Qualquer2(n)", GetList := {}

   @ 1, 1 GET n
   @ 2, 1 GET n VALID Qualquer( n )
   @ 3, 1 GET n VALID &x
   @ 4, 1 GET n VALID Qualquer( n ) .AND. &(x)
   READ

   RETURN

STATIC FUNCTION Qualquer( x );  RETURN x=x
FUNCTION Qualquer2( x ); RETURN x=x
Assim compilou.
Mas não só função STATIC, variável também.
Error BASE/1003 Variable does not exist: N
d:\temp>rom (b)MAIN(8)
d:\temp>rom HBGETLIST:GETPOSTVALIDATE(0)
d:\temp>rom HBGETLIST:READER(0)
Called from HBGETLIST:READMODAL(0)
Called from READMODAL(0)
Called from MAIN(10)
Detalhe:
Nestes últimos foi com a GETSYS default do Harbour
No aplicativo é com minha própria GETSYS.
Por isso mensagem diferente, cada uma se comporta de um jeito, mas as duas acabam gerando o mesmo erro.

É o que comentei mesmo: quando tem macro, toda a linha se transforma em macro.
A macro é resolvida dentro da getsys, e lá dentro não existe a variável n ou a função STATIC.

Já sem macro, vai um codeblock que pode ser usado normalmente.

O problema não é um ou outro, é quando usa os dois juntos.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder