Página 1 de 4

Eval no Clipper 5.3 roda, no Harbour não

Enviado: 19 Abr 2011 19:15
por Amparo
ola amigos

estou tendo um erro na execução do um prg como abaixo

Código: Selecionar todos

┌──────────────────────────────────────────┐
│ Erro BASE/1004  No exported method: EVAL │
│          Erro DOS não disponível         │
│                                          │
│              Sair    Gravar              │
└──────────────────────────────────────────┘
é um fonte para gerar o arquivo padrao CNAB febrabam para os bancos

compilo o mesmo fonte em clipper e funciona, alias meu sistema esta em clipper 5.3 e estou passando para harbour

em um determinado prg tenho as seguintes linhas:
tenho um arquivo dbf chamado r_eports nele tenho 3 campos memos (R_HEADER, R_BODY e R_FOOTER)

em R_EPORTS->R_EADER tem

Código: Selecionar todos

{ |H001,H001| "0" }
{ |H002,H002| "1" }
{ |H003,H009| "REMESSA" }
{ |H010,H011| "01" }
{ |H012,H026| PadR( "COBRANCA", 15 ) }
{ |H027,H030| STRZERO( VAL( ALLTRIM( BANCOS->NUM_AGENC ) ),4 ) }
{ |H031,H032| "00" }
{ |H033,H037| PadL( AllTrim( BANCOS->NUM_CONTA ), 5, "0" ) }
{ |H038,H038| BANCOS->DIG_CONTA }
{ |H039,H046| Space(08) }
{ |H047,H076| PadR( aSystem[19,1], 30 ) }
{ |H077,H079| "341" }
{ |H080,H094| PadR( "BANCO ITAU SA", 15 ) }
{ |H095,H100| CharRem( "/", DtoC( Date() ) ) }
{ |H101,H394| Space(294) }
{ |H395,H400| "000001" }
{ || Chr(13)+Chr(10) }

em R_EPORTS->R_BODY tem

Código: Selecionar todos

{ |B001,B001| "1" }
{ |B002,B003| "02" }
{ |B004,B017| PadL( CharRem( "-/. ", aSystem[19,8] ), 14, "0" ) }
{ |B018,B021| PADL( ALLTRIM( BANCOS->NUM_AGENC ), 4, "0" ) }
{ |B022,B023| "00" }
{ |B024,B028| PadL( AllTrim( BANCOS->NUM_CONTA ), 5, "0" ) }
{ |B029,B029| BANCOS->DIG_CONTA }
{ |B030,B033| Space(04) }
{ |B034,B037| REPLICATE("0",04) }
{ |B038,B062| Space(25) }
{ |B063,B070| SUBSTR(CONTAS->TITULO_BCO,5,8) }
{ |B071,B083| REPLICATE("0",13) }
{ |B084,B086| BANCOS->CARTEIRA }
{ |B087,B107| SPACE(21) }
{ |B108,B108| "I"  }
{ |B109,B110| "01" }
{ |B111,B120| PadR( CONTAS->NUMDUP, 10 ) }
{ |B121,B126| CharRem( "/", DtoC( CONTAS->VENCDUP ) ) }
{ |B127,B139| StrZero( CONTAS->VALDUP * 100, 13, 0 ) }
{ |B140,B142| "341" }
{ |B143,B147| "00000" }
{ |B148,B149| "01" }
{ |B150,B150| "A" }
{ |B151,B156| CharRem( "/", DtoC( CONTAS->EMISSAO ) ) }
{ |B157,B158| BANCOS->INSTRUCAO1 }
{ |B159,B160| BANCOS->INSTRUCAO2 }
{ |B161,B173| StrZero( ( CONTAS->VALDUP * BANCOS->TX_PERMAN ) /30, 13, 0 ) }
{ |B174,B179| "000000" }
{ |B180,B192| StrZero( CONTAS->DESCONTO * 100, 13, 0 ) }
{ |B193,B205| Replicate( "0", 13 ) }
{ |B206,B218| Replicate( "0", 13 ) }
{ |B219,B220| IIf( CLIENTES->PESSOA = "J", "02", "01" ) }
{ |B221,B234| PadL( CharRem( "-/. ", AllTrim( CLIENTES->CGC_CPF ) ),14,"0" ) }
{ |B235,B264| PadR( CLIENTES->NOME, 30 ) }
{ |B265,B274| SPACE(10) }
{ |B275,B314| PadR( CLIENTES->ENDERECO, 40 ) }
{ |B315,B326| PADR( CLIENTES->BAIRRO, 12 ) }
{ |B327,B334| PadL( AllTrim( CharRem( "-", CLIENTES->CEP ) ), 8,  "0" ) }
{ |B335,B349| PadL( CLIENTES->CIDADE,15 ) }
{ |B350,B351| CLIENTES->ESTADO }
{ |B352,B381| PadR( aSystem[19,1], 30 ) }
{ |B382,B385| Space(04) }
{ |B386,B391| CharRem( "/", DtoC( CONTAS->VENCDUP + 1 ) )  }
{ |B392,B393| PadL( BANCOS->PRAZO_PROT, 2, "0" ) }
{ |B394,B394| Space(1) }
{ |B395,B400| GeraNumero() }
{ || Chr(13)+Chr(10) }
em R_EPORTS->FOOTER tem

Código: Selecionar todos

{ |T001,T001| "9" }
{ |T002,T394| Space(393) }
{ |T395,T400| GeraNumero() }
{ || Chr(13)+Chr(10) }
meu prgs

Código: Selecionar todos

FUNCTION GERA_CNAB(nRecRep)
LOCAL aHeadArray := {}
LOCAL aBodyArray := {}
LOCAL aFootArray := {}
LOCAL lRetorno     := .T.
LOCAL bCodeBlock
LOCAL sBuffer

...

R_EPORTS->( DBGoTo( nRecRep ) )

...
*o R_HEADER, R_BODY E R_FOOTER sao campos MEMO
aHeadArray := BuildArray( AllTrim( R_EPORTS->R_HEADER ) )
aBodyArray := BuildArray( AllTrim( R_EPORTS->R_BODY      ) )
aFootArray := BuildArray( AllTrim( R_EPORTS->R_FOOTER  ) )

...

FOR nCont := 1 TO len(aHeadArray)
   bCodeBlock := aHeadArray[ nCont ]
*nesta linha é que da o erro em harbour no clipper funciona
   sBuffer += Eval( bCodeBlock )

NEXT nCont

....

return lRetorno

*************************************************************
FUNCTION BuildArray( strMemo )

LOCAL  aArrayRet, nLinhas, nContador, uBloco

aArrayRet := {}
nLinhas   := MLCount( strMemo, 250 )

FOR nContador := 1 TO nLinhas
 uBloco := AllTrim( MemoLine( strMemo, 250, nContador ) )

 IF Empty( uBloco ) .OR. uBloco = "//"
    LOOP
 ENDIF

 ALTD()

 AAdd( aArrayRet, uBloco )
NEXT nContador

RETURN  aArrayRet


ja tentei varias formas e nao consegui resultado satisfatorio, tentei colocar MACRO e da erro, sera que alguem tem alguma ideia de como resolver o problema,

abraços

Eval no Clipper 5.3 roda, no Harbour não

Enviado: 19 Abr 2011 20:29
por Pablo César
Na sua linha 24 do seu código prg, você está tratando como se fosse um codeblock mas não seria umk array ? O uso do AEval não seria o mais apropriado ? Desculpe se eu estiver enganado.

Eval no Clipper 5.3 roda, no Harbour não

Enviado: 19 Abr 2011 22:51
por alxsts
Olá!

A função Eval() recebe como parâmetro um code-block. Assim, a sua função BuildArray() deverá retornar um array de code-blocks. Acho difícil que isto esteja funcionando em Clipper 5.3...

Tente fazer

Código: Selecionar todos

AAdd( aArrayRet,  &( "{ || " + uBloco + "}" ) )

Eval no Clipper 5.3 roda, no Harbour não

Enviado: 20 Abr 2011 08:46
por Amparo
ola amigos

Pablo César escreveu:Na sua linha 24 do seu código prg, você está tratando como se fosse um codeblock mas não seria umk array ? O uso do AEval não seria o mais apropriado ? Desculpe se eu estiver enganado.
Pablo
repare que a linha 24 esta dentro de um FOR entao eu passo para a VARIAVEL bCodeBlock o resultado de cada array, depois faço a chamada do EVAL()
alxsts escreveu:Olá!

A função Eval() recebe como parâmetro um code-block. Assim, a sua função BuildArray() deverá retornar um array de code-blocks. Acho difícil que isto esteja funcionando em Clipper 5.3...
alxsts
tenho o sistema feito em clipper 5.3 funcionando em varios clientes com arquivos para itau, bradesco...

Eval no Clipper 5.3 roda, no Harbour não

Enviado: 20 Abr 2011 09:38
por alxsts
Olá!

Tudo bem, Amparo.

Testou a alteração que propus? Funcionou?

Eval no Clipper 5.3 roda, no Harbour não

Enviado: 20 Abr 2011 10:30
por Itamar M. Lins Jr.
Ola!
É relativamente fácil.
Colocar um alert('testando: '+linhatal)
Teste linha a linha para ver qual linha está com o problema.
O Harbour é mais sensível do que o clipper.

Saudações,
Itamar M. Lins Jr.

Eval no Clipper 5.3 roda, no Harbour não

Enviado: 20 Abr 2011 10:34
por Jairo Maia
Olá Amparo,

Qundo estava em xHarbour (não é seu caso, calma...), tive um problema com Macro em um módulo de um sistema na migração. Embora não fora com Code Block. Estudando o manual sobre macros, e lendo seu problema, me reportei ao manual do xHarbour pq lembrei que via Macro era possivel cria inclusive Code Block.

Esta ocorrendo erro, pq seu bloco está sendo recebido como String.

Vou colocar abaixo um exemplo do manual, mas em Harbour não consegui compilar, talvez deve ser incluido alguma lib, não sei.

Porém, caso em Harbour não tenha as funções do exemplo, creio que algum colega mais experiente possa lhe dizer quais são as similares em Harbour. Segue o exemplo do manual, e reitero: xHarbour. Veja que o exemplo mostra duas possibilidade de vc chamar uma função via Macro, e uma delas é code Block:

Código: Selecionar todos

// The example outlines two possibilities of calling a function
// indirectly via macro expression. The first compiles a macro
// to PCode, and the second creates a code block with the macro
// operator. Note that functions that are only included in macro
// expressions should be REQUESTed to make sure they are linked.

   REQUEST QOut, Time

   PROCEDURE Main
      LOCAL cMacro := "QOut( Time() )"
      LOCAL cPCode := HB_MacroCompile( cMacro )
      LOCAL bBlock := &( "{||" + cMacro + "}" )

      HB_VMExecute( cPCode )

      EVal( bBlock )
   RETURN

Re: eval no clipper 5.3 rada no harbour nao

Enviado: 20 Abr 2011 10:46
por Itamar M. Lins Jr.
Ola!
Talvéz lendo esse teste aqui possa ajudar.
Atenção para esta linha:
// Notice the Clipper bug: GetBlock is receiving the reference to
// the codeblock parameter than the value of EVAL(bResult) shouldn't
// depend on the order of block creation/value changing (GetBlock/SetRef).

Código: Selecionar todos

//
// $Id: codebl.prg 9200 2008-08-20 11:04:28Z vszakats $
//

STATIC cbStatic

Function Main()
Local a := TestBlocks()
LOCAL cb

   qout( eval( a[ 1 ] ) )      // 23
   qout( eval( a[ 2 ], 42 ) )  // 42
   qout( eval( a[ 1 ] ) )      // 42
   qout( eval( a[ 2 ], 15 ) )  // 15

   mqout( 15, eval( a[ 1 ] ) )      // 15 15
   mqout( 14, eval( a[ 1 ] ) )      // 14 15
   mqout( 42, eval( a[ 2 ], 42 ) )  // 42 42
   mqout( 14, eval( a[ 2 ], 42 ) )  // 14 42
   mqout( 42, eval( a[ 1 ] ) )      // 42 42
   mqout( 14, eval( a[ 1 ] ) )      // 14 42

   GetArray( @a )
   PrintArray( @a )

   qout( "Test for variables passed by reference in a codeblock" )
   DetachWithRefer()

   qout( "Test for indirect detaching of local variables" )
   DetachToStatic( 1 )
   mqout( 2, EVAL( cbStatic, 1 ) )
   mqout( 3, EVAL( cbStatic, 2 ) )
   cb :=cbStatic
   DetachToStatic( 100 )
   mqout( 200, EVAL( cbStatic, 100 ) )
   mqout( 300, EVAL( cbStatic, 200 ) )
   mqout( 4, EVAL( cb, 3 ) )

   ReferParam()

Return( NIL )

Static Function TestBlocks()
LOCAL nFoo := 23
Return( { {|| nFoo }, {|n| nFoo := n } } )

Static Function mqout( nExpected, nGot )

   qout( nExpected, nGot )

Return( NIL )

/////////////////////////////////////////////////////////////////
PROCEDURE GetArray( a )
LOCAL i

   a :=ARRAY( 100 )
   FOR i:=1 TO 100
     IF (i % 6) == 0
         a[ i-2 ] =NIL
         a[ i-4 ] =NIL
     ENDIF
     a[ i ] := TestBlocks()
   NEXT

RETURN

PROCEDURE PrintArray( a )
LOCAL i

   FOR i:=1 TO 100
     IF a[i] != NIL
       EVAL( a[ i ][ 2 ], i )
       mqout( i, EVAL( a[ i ][ 1 ] ) )
     ENDIF
   NEXT

RETURN

//////////////////////////////////////////////////////////////////
Function DetachWithRefer()
Local nTest
Local bBlock1 := MakeBlock()
Local bBlock2 := {|| DoThing( @nTest ), qout( nTest ) }

   eval( bBlock1 )
   eval( bBlock2 )

Return( NIL )

Function MakeBlock()
Local nTest
RETURN( {|| DoThing( @nTest ), qout( nTest ) } )

Function DoThing( n )

   n := 42

Return( NIL )

//////////////////////////////////////////////////////////////////////
FUNCTION DetachToStatic( n )

  cbStatic ={|x| n+x}

RETURN NIL

// ------------------------------------------------------------
Function ReferParam()
Local bResult

? "Test for codeblock parameter passed by reference"

PassByValue( {|lEnd| ;
   bResult := GetBlock( @lEnd ), ;  
   SetByRef( @lEnd ) } )
// Clipper & xHarbour it's .T.
//In Harbour it is .F. 
? "Printed value in Clipper  .T. =", Eval( bResult )           
?
// Notice the Clipper bug: GetBlock is receiving the reference to
// the codeblock parameter than the value of EVAL(bResult) shouldn't
// depend on the order of block creation/value changing (GetBlock/SetRef).

PassByRef( {|lEnd| ;
   bResult := GetBlock( @lEnd ), ;  
   SetByRef( @lEnd ) } )
// Clipper & xHarbour it's .T.
//In Harbour it is .F. 
? "Printed value in Clipper  .T. =", Eval( bResult )           
?

? "2nd test for codeblock parameter passed by reference"

PassByValue( {|lEnd| ;
   SetByRef( @lEnd ), ;
   bResult := GetBlock( @lEnd ) } )
// Clipper & xHarbour it's .T.
//In Harbour it is .F. 
? "Printed value in Clipper  .F. =", Eval( bResult )           
?

PassByRef( {|lEnd| ;
   SetByRef( @lEnd ), ;
   bResult := GetBlock( @lEnd ) } )
// Clipper & xHarbour it's .T.
//In Harbour it is .F. 
? "Printed value in Clipper  .F. =", Eval( bResult )           
?

Return Nil

Static Function PassByValue( bBlock )
Local lSomeVar := .T.
Eval( bBlock, lSomeVar )
? "lSomeVar value in Clipper .T. =", lSomeVar
Return .T.

Static Function PassByRef( bBlock )
Local lSomeVar := .T.
Eval( bBlock, @lSomeVar )
? "lSomeVar value in Clipper .F. =", lSomeVar
Return .T.

Static Function SetByRef( lVar )
lVar := .F.
Return Nil

Static Function GetBlock( lVar )
Return {|| lVar }
// ------------------------------------------------------------
Saudações,
Itamar M. Lins Jr.

Re: eval no clipper 5.3 rada no harbour nao

Enviado: 20 Abr 2011 11:28
por Jairo Maia
Olá Amparo,

Tente esta alteração a apartir da linha 24 do testo "meu prgs":

FOR nCont := 1 TO len(aHeadArray)
bCodeBlock := aHeadArray[ nCont ]
/////////////////////////
bCodeBlock :=&( bCodeBlock )
//////////////////////////
sBuffer += Eval( bCodeBlock )
NEXT nCont

Parece que em Harbour dá certo.

Abraços

Re: eval no clipper 5.3 rada no harbour nao

Enviado: 20 Abr 2011 11:42
por Amparo
ola amigos

alxsts
alxsts escreveu:Olá!

A função Eval() recebe como parâmetro um code-block. Assim, a sua função BuildArray() deverá retornar um array de code-blocks. Acho difícil que isto esteja funcionando em Clipper 5.3...

Tente fazer

Código: Selecionar todos

AAdd( aArrayRet,  &( "{ || " + uBloco + "}" ) )
da forma que me passou da erro

Código: Selecionar todos

┌─────────────────────────────────┐
│ Erro BASE/1449  Syntax error: & │
│     Erro DOS não disponível     │
│                                 │
│         Sair    Gravar          │
└─────────────────────────────────┘
Itamar M. Lins Jr. escreveu:Ola!
É relativamente fácil.
Colocar um alert('testando: '+linhatal)
Teste linha a linha para ver qual linha está com o problema.
O Harbour é mais sensível do que o clipper.
Itamar

aplicando o alert na linha conforme abaixo

Código: Selecionar todos

FOR nCont := 1 TO nSize
 bCodeBlock := aHeadArray[ nCont ]
alert(bCodeBlock)
 sBuffer += Eval( bCodeBlock )

NEXT nCont

vou ter o seguinte resultado?

a primeira linha do array aHeadArray
┌─────────────────────────┐
│   { |H001,H001| "0" }   │
│                         │
│           Ok            │
└─────────────────────────┘

ai vai dar o erro na li sBuffer += Eval(bCodeBlock )

Re: eval no clipper 5.3 rada no harbour nao

Enviado: 20 Abr 2011 18:12
por Itamar M. Lins Jr.
Hummm rapaz.
É para ter no array, uma expressão de cada véz.
Desse forma, continua sem saber qual é a expressão que dá erro.

Saudacões,
Itamar M. Lins Jr.

Re: eval no clipper 5.3 rada no harbour nao

Enviado: 20 Abr 2011 19:01
por Amparo
ola amigos
Itamar M. Lins Jr. escreveu:Hummm rapaz.
É para ter no array, uma expressão de cada véz.
Desse forma, continua sem saber qual é a expressão que dá erro.

Saudacões,
Itamar M. Lins Jr.
Itamar

pois tem, e o erro da logo na primeira ou seja quando vou aplicar EVAL em { |H001,H001| "0" }

Jairo Maia escreveu:Olá Amparo,

Tente esta alteração a apartir da linha 24 do testo "meu prgs":

FOR nCont := 1 TO len(aHeadArray)
bCodeBlock := aHeadArray[ nCont ]
/////////////////////////
bCodeBlock :=&( bCodeBlock )
//////////////////////////
sBuffer += Eval( bCodeBlock )
NEXT nCont

Parece que em Harbour dá certo.

Abraços
Jairo

da erro de macro &

Re: Eval no Clipper 5.3 roda, no Harbour não

Enviado: 20 Abr 2011 22:40
por Itamar M. Lins Jr.
Ola!
O Harbour acusa erro:

Código: Selecionar todos

Function Main
? eval({ |H001,H001| "0" })
Compiling 'teste.prg'...
teste.prg(2) Error E0003 Duplicate variable declaration 'H001'
teste.prg(2) Error E0003 Duplicate variable declaration 'H001'
2 errors
Lógico tem que ser "H001,H00X" não pode ter duas variáves com o mesmo nome.
Como ele vai saber qual vai manipular e retornar o resultado ?

Saudações,
Itamar M. Lins Jr.

Re: Eval no Clipper 5.3 roda, no Harbour não

Enviado: 21 Abr 2011 08:06
por Jairo Maia
Olá Amparo,

Que estranho. Compilei o exemplo abaixo e funcionou:

Código: Selecionar todos

REQUEST QOut, Time 
   
Proc Main()
 Loca bBlock := "{|| QOut( Time() ) }"
  ? bBlock                   // string com estrutura de code block
  bBlock := &( bBlock )      // transforma em macro
  EVal( bBlock )             // executou QOut( Time() ) 
 Retu

Re: Eval no Clipper 5.3 roda, no Harbour não

Enviado: 23 Abr 2011 08:51
por Amparo
ola amigos

FUNCIONOUUUUUUU...

tive que fazer duas alterações para funcionar.

no meu DBF campo MEMO que guardo as instruções de cada linha do arquivo layout CNAB, por exemplo
{ |H001,H001| "0" }
{ |H002,H002| "1" }
{ |H003,H009| "REMESSA" }

troquei por
{ |H001| "0" }
{ |H002| "1" }
{ |H003,H009| "REMESSA" }

no meu PRG
na linha com a seguinte instrução:
sBuffer += Eval( bCodeBlock )

acrescentei a macro
sBuffer += Eval( &(bCodeBlock) )

quero agradecer ao Itamar, Jairo, alxsts e pablo sem ajudar de vcs eu iria bater muito a cabeça e talvez disistiria de migrar para Harbour.

abrigado