Página 1 de 3

ERRO: UNDEFINED SYMBOL AFTER LIBRARY SEARCH

Enviado: 09 Ago 2007 19:31
por ERCS123
SYMBOL: FIRTS REFERENCE
EXTENSO CHEQUE.OBJ
PRT CHEQUE.OBJ
MESEXT CHEQUE.OBJ


O cheque.prg tem uma rotina de imprimir cheque. O funcs.prg tem as function EXTENSO, PRT e MESEXT, que sao usadas para imprimir o cheque.
Acontece que na hora de imprimir aparece um erro na linha que tem o comando EXTENSO.

Qual seria o problema?

Obrigado
Ewerton

Enviado: 09 Ago 2007 19:47
por sygecom
Tche, sabe a linha que esta dando o erro ? posta a função para nos ter ideia do que pode esta acontecendo...de mais detalhes tipo como vc esta usando...

Enviado: 09 Ago 2007 20:09
por ERCS123

Código: Selecionar todos

FUNCS.PRG


*---------------------------------------------------------------------
* PROGRAMA_____: PRT()
* FUNۂO_______: PREENCHIMENTO DE CHEQUE.
*---------------------------------------------------------------------
function prt(pflag)
*---------------------------------------------------------------------
static ST_prtativa:=.f.
local Tvolta := ST_prtativa
local TarqSpool := Set( _SET_PRINTFILE )
   if ( Pflag != NIL )  // SE FOR PASSADO UM PARAMETRO
      ST_Prtativa := ( Pflag )
      set print ( Pflag )
      set console (.NOT. Pflag )
      set cursor (.NOT. Pflag )
      Set(_SET_DEVICE, iif( Pflag, "PRINTER", "SCREEN" ) )
      if ( len( TarqSpool ) > 0 )
         Set( _SET_PRINTFILE, TarqSpool, .T. )
      endif
    endif
return ( Tvolta )
************************************************

*---------------------------------------------------------------------
* PROGRAMA_____: EXTENSO()
* FUNۂO_______: RETORNA O EXTENSO DE UM VALOR.
*---------------------------------------------------------------------
function extenso(m_val)
*---------------------------------------------------------------------
local Tstr   := strzero( abs( m_val ), 18, 2 )
local Acifra := {{'TRILHAO' , 'TRILHOES'},;
              {'BILHAO'   , 'BILHOES' },;
              {'MILHAO'   , 'MILHOES' },;
              {'MIL'      , 'MIL'     },;
              {'   '      , '   '     },;
              {'CENTAVO'  , 'CENTAVOS'} }
local Tx               // Contador temporario
local Textenso  := ' '  // String do valor por extenso
local Tsubs     := ' '     // Subgrupo tres em tres casas do str
local Tcentavos := val( substr( Tstr, 17 ) )
  if (m_val > 0)
     if ( Tcentavos > 0 )
        Textenso:=ExtCem( strzero( Tcentavos, 3 ) ) + ;
       Acifra[ 6 ] [ iif( Tcentavos = 1, 1, 2 ) ]
     endif
     if ( int( m_val ) > 0 )
        Textenso:= iif(int(m_val) = 1,;
       'REAL','REAIS') +;
       iif(Tcentavos > 0, ' E ','' ) + Textenso
     endif
     for Tx := 5 to 1 step -1
       if ( val(Tsubs := substr(Tstr,(Tx * 3) -2,3)) > 0 )
          Textenso:=ExtCem( Tsubs ) + Acifra[ Tx ] ;
            [iif(val(Tsubs)= 1, 1 , 2)] + ' ' + Textenso
       endif
     next Tx
   endif
return( StripDouble( Textenso, ' ' ) )  

*------------------------------------------------------------------------*
* CHEQUE PARA: BANCO DO  B R A S I L
* PROGRAMA_____: PRINTCHE()  
* FUNۂO_______: PREENCHIMENTO DE CHEQUE.
*-----------------------------------------------------------------------------*
function Printche( m_val, m_nom, m_cid, m_ven)
*-----------------------------------------------------------------------------*
local Text := extenso(m_val) + space(2)
local Tpos := rat(" ", substr(Text, 1, 72) )     
local Aextenso := { substr( Text, 1, Tpos+1)+ repl("*",90 - Tpos),substr(Text,Tpos+1)+ repl("*",97 - (len(Text) - Tpos ))}  
local Tx
     PRT( .T. )
     setprc( 0, 0 )
     devpos( 0, 0 )
     ?? PRINTER_INIT
     if ( m_val = 10000000000 )
        devout( chr(15) )
        @ 2,107 say m_val picture "@e ******,***,***,***,***.**"
        devout( "##" )
     else
        devout( chr(18) )
        @ 2,62 say m_val picture "@e **,***,***,***.**"   
        devout ( "#"+ chr(15))
    endif
    @ 5,43 say Aextenso[1]                      
    @ 7,35 say Aextenso[2] + chr(18)            
    if (m_nom != nil)
       @ 9,20 say m_nom                                 
    endif
    @ 11,45 say substr( m_cid, 1, 11)                
    @ 11,57 say strzero(day(m_ven),2)+space(4)+ mesext2(m_ven)  
    @ 11,77 say right(str(year(m_ven),4),2)                     
    DevPos(LINES_PER_PAGE, 0)
    setprc(0, 0)
    ?? PRINTER_END
    PRT(.F.)
RETURN(NIL)

*------------------------------------------------------------------------*
* CHEQUE PARA: BANCO DO  B R A D E S C O
* PROGRAMA_____: PRINTCHEQUE2()  
* FUNۂO_______: PREENCHIMENTO DE CHEQUE.
*-----------------------------------------------------------------------------*
 #define LINES_PER_PAGE 24                                             //CHEQUE
 #define PRINTER_INIT chr(27)+"C"+chr(LINES_PER_PAGE)+chr(27)+"0"      //CHEQUE
 #define PRINTER_END chr(27)+"C"+chr(66)+chr(27)+"2"                   //CHEQUE
*-----------------------------------------------------------------------------*
function Printcheque2( m_val, m_nom, m_cid, m_ven)
*-----------------------------------------------------------------------------*
local Text := extenso(m_val) + space(2)
local Tpos := rat(" ", substr(Text, 1, 90) )     
local Aextenso := { substr( Text, 1, Tpos+1)+ repl("*",100 - Tpos),substr(Text,Tpos+1)+ repl("*",103 - (len(Text) - Tpos ))}  
local Tx
     PRT( .T. )
     setprc( 0, 0 )
     devpos( 0, 0 )
     ?? PRINTER_INIT
     if ( m_val = 10000000000 )
        devout( chr(15) )
        @ 2,91 say m_val picture "@e ******,***,***,***,***.**"
        devout( "##" )
     else
        devout( chr(18) )
        @ 2,46 say m_val picture "@e **,***,***,***.**"   
        devout ( "#"+ chr(15))
    endif
    @ 5,08 say Aextenso[1]                      
    @ 7,08 say Aextenso[2] + chr(18)            
    if (m_nom != nil)
       @ 9,00 say m_nom                                 
    endif
    @ 11,29 say substr( m_cid, 1, 11)                
    @ 11,41 say strzero(day(m_ven),2)+space(4)+ mesext2(m_ven)  
    @ 11,61 say right(str(year(m_ven),4),2)                     
    DevPos(LINES_PER_PAGE, 0)
    setprc(0, 0)
    ?? PRINTER_END
    PRT(.F.)
RETURN(NIL)


NO .PRG PRINCIPAL DO MEU SISTEMA EU COLOQUEI:
SET PROCEDURE TO FUNCS


NO CHEQUE.PRG ONDE TEM A ROTINA DE IMPRIMIR O CHEQUE.

Código: Selecionar todos

function prx0318()

 sele 1
 use bancaria alias ban shar
 set index to ind_ch8, ind_ch7

 sele 2
 use bxconta alias bai shar
 set index to ind_ch9, ind_ch6


 private m_doc,m_emi,m_nom,m_obs,m_ven,m_val,m_cid

 sele 1
 te_cli1=savescreen(06,03,18,74)
 centra(02,"®¯ EMISSAO DE CHEQUES ®¯")
 m_doc:=0
 m_emi:=date()
 m_nom:=space(40)
 m_obs:=space(40)
 m_val:=0
 m_ven:=date()
 m_cid:=space(10)
 m_cid:="FRANCA-SP "
 m_tip:=space(1)
 while .t.  
   mens("Tecle <ESC> p/ Sair!")
   setcursor(2)
   cor(4)
   @ 05,03 clear to 18,74    
   @ 05,03 to 18,74
   apaga(5,60,5,68,"n/g","n/g")  
   @ 05,60 say "Inclusao"
   cor(4) 
   @ 05,59 say "["    
   @ 05,68 say "]"    
    sombra(06,05,18,74)
    @ 06,10 say "Tipo Banco:"
    @ 08,10 say "N. Cheque.:"
    @ 08,35 say "Emissao:"
    @ 10,10 say "Nominal...:"
    @ 12,10 say "Vencimento:"
    @ 12,35 say "Valor..:"
    @ 14,10 say "Cidade....:"
    @ 16,10 say "Observacao:"
   @ 06,42 say "[1] BRADESCO / [2] BRASIL"
   cor(6)   
   @ 06,22 get m_tip pict "@!" valid m_tip $ "12"
   read
   if m_tip == "1"
        @ 06,25 say "BRADESCO"
   else
        @ 06,25 say "BRASIL"       
   endif
   @ 08,22 get m_doc pict "@!"
   @ 08,44 get m_emi pict "##/##/####"
   @ 10,22 get m_nom pict "@!"
   @ 12,22 say m_ven pict "##/##/####"
   @ 12,44 say m_val pict "@E 99,999,999.99"  
   @ 14,22 say m_cid pict "@!"
   @ 16,22 say m_obs pict "@!"
   read  
   if lastkey()=27
     dbcloseall()
     return
   endif
   if empty(m_doc)
     mens("Lancamento Invalido !  |  <ENTER> Retorna")
     tone(900,9)
     inkey(0)
     loop
   endif             
   mens("Tecle <ESC> p/ Sair!")                    
   sele 2  
   set order to 2
   seek m_doc 
   if found()
     mens("Cheque ja Compensado !  |  <ENTER> Retorna")
     tone(900,9)
     inkey(0)
     loop
   else
      sele 1
      set order to 2
      seek m_doc 
      if found()
        mens("Cheque ja Cadastrado !  |  <ENTER> Retorna")
        tone(900,9)
        inkey(0)
        loop
      endif
    endif   
    sele 1
    mens("Tecle <ESC> p/ Sair!")
    setcursor(2)
    cor(6)
    @ 12,22 get m_ven pict "##/##/####" valid(m_ven!=ctod("  /  /    "))
    read
    if (m_ven<m_emi)
      mens("Data do Vencimento menor que a Data de Emissao!")
      tone(900,9)
      inkey(0)
      mens("Tecle <ESC> p/ Voltar!")
      loop
    endif
    mens("Tecle <ESC> p/ Voltar!")       
    setcursor(2)
    cor(6)
    @ 12,44 get m_val pict "@E 99,999,999.99" valid(m_val>0)  
    read
    if lastkey()=27
      loop
    endif
    @ 14,22 get m_cid pict "@!"
    @ 16,22 get m_obs pict "@!"
    read
    if lastkey()=27
      loop
    endif      
    mens("Tecle <ENTER> p/ Imprimir!")
    inkey(0)
    impress()
    if m_tip == "1"    
         printcheque2(m_val,m_nom,m_cid,m_ven)
    else
         printche(m_val,m_nom,m_cid,m_ven)
    endif
    confirma("Inclusao","Cheque")
    Cresp=space(1)
    @ 23,78 get Cresp pict "@!" valid Cresp $ "SN"
    read 
    If Cresp ="S"
      mens("Gravando...")
      appe blan
      repl doc with m_doc       
      repl emi with m_emi       
      repl nom with m_nom 
      repl obs with m_obs       
      repl ven with m_ven 
      repl val with m_val
      repl cid with m_cid
  unloc()
      m_doc:=0
      m_emi:=date()
      m_nom:=space(40)
      m_obs:=space(40)
      m_val:=0
      m_ven:=date()
      m_cid:=space(10)
      m_cid:="FRANCA-SP "
      loop
    endif  
    If Cresp ="N" 
    unloc()
      loop
    endif
    If LastKey() = 27
      mens("Tecle <ESC> p/ Sair!")
      loop
    endif
  enddo
  dbcloseall()
  lib_var()
  RestScreen=(05,06,20,75,tecli1)
  return 


SE EU COMPILO SEPARADAMENTE O CHEQUE.PRG FUNCIONA, MAS QUANDO EU ACRESCENTO ESTA ROTINA NO SISTEMA, DA ERRO NA HORA DE IMPRIMIR ( NA LINHA ONDE TEM A FUNCAO EXTENSO()

Enviado: 09 Ago 2007 20:11
por Maligno
SYMBOL: FIRTS REFERENCE
EXTENSO CHEQUE.OBJ
PRT CHEQUE.OBJ
MESEXT CHEQUE.OBJ
Tente copiar a mensagem de erro conforme ela aparece no seu vídeo. Seu problema não parece estar numa função propriamente, mas na identificação de uma biblioteca para o linker. Se ele não encontrar, solta uma mensagem parecida, mas não é bem essa. E a julgar pelo título do tópico é bem isso mesmo.

Não precisa postar a função, que não vai refrescar nada. É perda de tempo. Poste o seu script de linkedição ou uma cópia da linha de comando que executa o linker.

Enviado: 09 Ago 2007 20:12
por Maligno
Diga como você compila e linka seu programa. O script ou linha de comando, seja lá a forma que você usa.

Enviado: 09 Ago 2007 20:20
por ERCS123

Código: Selecionar todos


creating temporary work file
creating temporary work file c:\windows\temp\rt0011775.swp

UNDEFINED SYMBOL AFTER LIBRARY SEARCH:

SYMBOL               FIRST REFERENCE
EXTENSO                FUNCS.OBJ
PRT                        FUNCS.OBJ
MESEXT2                 FUNCS.OBJ

Enviado: 09 Ago 2007 20:21
por Maligno
Depois dê uma olhada no NG do Clipper e veja que SET PROCEDURE é uma coisa do tempo do guaraná com rolha. Ninguém mais usa isso. Há outras formas de agregar objetos ao seu executável que são bem mais eficientes.

Enviado: 09 Ago 2007 20:24
por Maligno
Sem ver seu script de linkedição ou linha de comando do linker, não tem como sugerir precisamente um conserto. :)
Mas, é provável que haja um erro na identificação de FUNCS.OBJ para o linker. Por isso que eu digo que é melhor ver como você está linkando.

Enviado: 09 Ago 2007 20:56
por ERCS123

Código: Selecionar todos

@echo off
del *.ovl
cls
@echo Inicio do Processo de COMPILACAO !!!
cls
if not exist cli0001.obj clipper cli0001 -q
if errorlevel 1 goto fim
cls
if not exist for0001.obj clipper for0001 -q
if errorlevel 1 goto fim
cls
if not exist fat0001.obj clipper fat0001 -m -q
if errorlevel 1 goto fim
cls
if not exist uti0001.obj clipper uti0001 -q 
if errorlevel 1 goto fim
cls
if not exist fin0001.obj clipper fin0001 -m -q
if errorlevel 1 goto fim
cls
if not exist pro0001.obj clipper pro0001 -m -q
if errorlevel 1 goto fim
cls
if not exist vend001.obj clipper vend001 -m -q
if errorlevel 1 goto fim
cls
if not exist nota001.obj clipper nota001 -q  
if errorlevel 1 goto fim
cls
if not exist bole001.obj clipper bole001 -q
if errorlevel 1 goto fim
cls
if not exist funcs.obj clipper funcs  -q
if errorlevel 1 goto fim
cls
if not exist esto001.obj clipper esto001 -q
if errorlevel 1 goto fim
cls
if not exist inicio.obj clipper inicio -m -q
if errorlevel 1 goto fim
cls
if not exist ficha01.obj clipper ficha01 -q 
if errorlevel 1 goto fim
cls
if not exist rela001.obj clipper rela001 -q 
if errorlevel 1 goto fim
cls
if not exist rela002.obj clipper rela002 -q 
if errorlevel 1 goto fim
cls
if not exist tela001.obj clipper tela001 -q 
if errorlevel 1 goto fim
cls
if not exist cheque01 clipper cheque01 -q 
if errorlevel 1 goto fim
cls
rtlink @ercs 
cls
inicio
cls
:fim

Código: Selecionar todos

file inicio

lib clbc,clbcmat,relogio,super

beginarea
       section into fat_001 file fat0001
       section into cli_001 file cli0001
       section into for_001 file for0001
       section into pro_001 file pro0001
       section into fin_001 file fin0001
       section into ven_001 file vend001
       section into uti_001 file uti0001       
       section into not_001 file nota001       
       section into bol_001 file bole001       
       section into est_001 file esto001       
       section into fuc_001 file funcs       
       section into fih_001 file ficha01     
       section into rel_001 file rela001     
       section into rel_002 file rela002     
       section into tel_001 file tela001     
       section into che_001 file cheque01     
endarea


Nao sei se o problema e a compilacao, porque tem varias funcoes no FUNCS.PRG que é usado no sistema. O erro esta apenas nessas 3 funcoes mencionadas anteriormente.

Obs: Compilei o cheque01.PRG separadamente, criei o EXE, e funcionou corretamente, mas quando coloco essa funcoes no meu sistema, no arquivo Funcs.prg, a rotima de imprimir cheque não funciona.

Enviado: 09 Ago 2007 21:14
por Maligno
Experimente colocar sua FUNCS.OBJ como primeira da lista do seu script.

Enviado: 09 Ago 2007 21:25
por ERCS123
mudei, coloquei o Funcs.obj no inicio da compilacao....deu o mesmo erro, e uma mensagem

warning wrt0022: EXE may not execute properly -- undefined symbols



Estas funcoes, não estaria em conflito com as outras que tenho mno funcs.prg? Talves algum comando, ou nome repetido? Porque quando eu separo apenas as funcoes que uso para imprimir os cheques, e compilo, funciona, e quando eu as coloco no funcs.prg, onde tem muitas funcoes, não da certo.

Enviado: 09 Ago 2007 21:45
por Maligno
Pensei que poderia estar havendo um conflito de nomes no FUNCS com algum objeto anterior a ele. Às vezes acontece. O arquivo que vem primeiro causa um conflito com o que vem depois.

Você disse que CHEQUE01 funciona e gera um EXE se sozinha. Mas nesse script, do jeito que está, com o FUNCS.OBJ, essa função de CHEQUE01 deixa de funcionar. Não gera o EXE ou o erro é na hora de executar?

Enviado: 09 Ago 2007 21:48
por ERCS123
O erro acontece, na hora de imprimir o cheque. Na hora de executar a linha de comando da funcao EXTENSO, que esta no funcs.prg

Enviado: 09 Ago 2007 21:52
por Maligno
Aquela mensagem de erro que você passou é do linker. Ou seja, é de tempo de linkedição. Se na hora de imprimir, quando vai executar a função EXTENSO, dá erro, é um erro de tempo de execução. E essa mensagem? Qual é?

Enviado: 09 Ago 2007 22:48
por ERCS123
ERRO BASE/1001 UNDEFINED FUNCTION EXTENSO - ESSE ERRO OCORRE NA HORA DE IMPRIMIR

Código: Selecionar todos


*------------------------------------------------------------------------*
* CHEQUE PARA: BANCO DO  B R A D E S C O
* PROGRAMA_____: PRINTCHEQUE2()  
* FUNۂO_______: PREENCHIMENTO DE CHEQUE.
*-----------------------------------------------------------------------------*
 #define LINES_PER_PAGE 24                                             //CHEQUE
 #define PRINTER_INIT chr(27)+"C"+chr(LINES_PER_PAGE)+chr(27)+"0"      //CHEQUE
 #define PRINTER_END chr(27)+"C"+chr(66)+chr(27)+"2"                   //CHEQUE
*-----------------------------------------------------------------------------*
function Printcheque2( m_val, m_nom, m_cid, m_ven)
*-----------------------------------------------------------------------------*

**********************************
**********************************
local Text := extenso(m_val) + space(2)  ****ERRO NESSA LINHA
*******************************
*********************************


local Tpos := rat(" ", substr(Text, 1, 90) )     
local Aextenso := { substr( Text, 1, Tpos+1)+ repl("*",100 - Tpos),substr(Text,Tpos+1)+ repl("*",103 - (len(Text) - Tpos ))}  
local Tx
     PRT( .T. )
     setprc( 0, 0 )
     devpos( 0, 0 )
     ?? PRINTER_INIT
     if ( m_val = 10000000000 )
        devout( chr(15) )
        @ 2,91 say m_val picture "@e ******,***,***,***,***.**"
        devout( "##" )
     else
        devout( chr(18) )
        @ 2,46 say m_val picture "@e **,***,***,***.**"   
        devout ( "#"+ chr(15))
    endif
    @ 5,08 say Aextenso[1]                      
    @ 7,08 say Aextenso[2] + chr(18)            
    if (m_nom != nil)
       @ 9,00 say m_nom                                 
    endif
    @ 11,29 say substr( m_cid, 1, 11)                
    @ 11,41 say strzero(day(m_ven),2)+space(4)+ mesext2(m_ven)  
    @ 11,61 say right(str(year(m_ven),4),2)                     
    DevPos(LINES_PER_PAGE, 0)
    setprc(0, 0)
    ?? PRINTER_END
    PRT(.F.)
RETURN(NIL)