Página 1 de 1

Harbour erro bound error : array acess

Enviado: 04 Dez 2009 11:21
por leandromiler
Estou migrando um sistema pra harbour, e a rotina abaixo está dando erro de bound error: array acess. Alguem poderia me dizer o que está incorreto neste código que não funciona com harbour, pois no clipper funciona perfeitamente ?

Outra coisa, percebo que em todas as rotinas que uso a função ASIZE() o harbour não aceita, alguem poderia me ajudar ?

Desde já agradeço.

Código: Selecionar todos

IF mARQ='BANCO'
     NomeCampos := BANCO->(ARRAY(AFIELDS(FCOUNT())))
     mTIPO      := BANCO->(ARRAY(AFIELDS(FCOUNT())))
     mTAMANHO   := BANCO->(ARRAY(AFIELDS(FCOUNT())))
     mDECIMAL   := BANCO->(ARRAY(AFIELDS(FCOUNT())))
     BANCO->(AFIELDS(NomeCampos,mTIPO,mTAMANHO,mDECIMAL))
     mNUMCAMPO     := BANCO->(FCOUNT())
     IF NomeCampos[mNUMCAMPO]!='PRCHEQUE' // 28/07/2005
         SELE BANCO
         USE
         IF !ABREARQCDX((CAMINHO('BANCO')),'BANCO',.T.,10)
             ALERTA2('NAO FOI POSSIVEL ABRIR O ARQUIVO')
             CANCELA()
         ENDIF
         PACK
         USE
         ! CD DBFNTX                        > nul
         ! COPY BANCO.DBF BANCO.BKP         > nul
         ! DEL BANCO.DBF                    > nul
         ! DEL BANCO.CDX
         IF !FILE('BANCO.DBF')
           @24,01 say " Criando Arquivos  BANCO.DBF"
           @24,30 say " de   102 ate    88"
           ASIZE(A,0)
           AADD(A,{"BCODIGO"   ,"C",    5, 0})
           AADD(A,{"NOME"      ,"C",   20, 0})
           AADD(A,{"CHBANCO"   ,"N",    2, 0}) // codigo do tipo de impressao de cheque
           AADD(A,{"SALDO"     ,"N",   14, 2})
           AADD(A,{"ABERTURA"  ,"D",    8, 0})
           AADD(A,{"AGENCIA"   ,"C",   10, 0}) // agencia bancaria
           AADD(A,{"CONTA"     ,"C",   10, 0}) // Conta bancaria
           AADD(A,{"PRCHEQUE"  ,"C",    6, 0}) // proximo cheque - usado na impressao
           DBCREATE("BANCO.DBF",A)
         ENDIF
         USE BANCO ALIAS BANCO NEW
         APPE FROM BANCO.BKP
         USE
         ! CD..
         FERASE(CAMINHO('BANCO.CDX'))
         IF !FILE(CAMINHO('BANCO.CDX'))
              SHOW('Indexando arquivo de Clientes . . .')
              USE &(CAMINHO('BANCO')) ALIAS BANCO      NEW
              INDEX ON BCODIGO  TAG ('XBANCO1') EVAL CDXPROGRESS() EVERY LASTREC()/100
              INDEX ON NOME TAG ('XBANCO2')     EVAL CDXPROGRESS() EVERY LASTREC()/100
              USE
         ENDIF
         IF ABREARQCDX((CAMINHO('BANCO')),'BANCO',.F.,10)
         ELSE
             ALERTA2('NÆo foi poss¡vel abrir o arquivo de Contrato de Terceiros')
             CANCELA()
         ENDIF
     ENDIF
ENDIF

Re: Harbour erro bound error : array acess

Enviado: 04 Dez 2009 12:23
por gvc
Vc não informou em que local/linha ocorre o erro.

Por favor, veja:

Código: Selecionar todos

      IF !ABREARQCDX((CAMINHO('BANCO')),'BANCO',.F.,10)
      // ELSE
         ALERTA2('NÆo foi poss¡vel abrir o arquivo de Contrato de Terceiros')
         CANCELA()
      ENDIF
Troque
ASIZE(A,0)
por
a := {}
Troque o
AFIELDS
por
DBSTRUCT

Re: Harbour erro bound error : array acess

Enviado: 04 Dez 2009 15:25
por leandromiler
O problema está dando nesta linha

:-Y
IF NomeCampos[mNUMCAMPO]!='PRCHEQUE' // 28/07/2005

Re: Harbour erro bound error : array acess

Enviado: 04 Dez 2009 16:36
por Itamar M. Lins Jr.
Isso é muito simples de resolver.

Código: Selecionar todos

Basta apenas um fcount()
nFields := banco->(fcount())
alert(NomeCampos[nFields]) //para ver o conteudo.
Para quê, pegar mTipo,mTamanho etc se não faz nada com esses valores ?
Seu código simplificado.

Código: Selecionar todos

IF mARQ='BANCO'
     nFields := banco->(fCount())
     NomeCampos := BANCO->(ARRAY(nFields))
     BANCO->(AFIELDS(NomeCampos))
     IF NomeCampos[nFields]!='PRCHEQUE' // 28/07/2005
         SELE BANCO
         USE
         IF !ABREARQCDX((CAMINHO('BANCO')),'BANCO',.T.,10)
             ALERTA2('NAO FOI POSSIVEL ABRIR O ARQUIVO')
             CANCELA()
         ENDIF
         PACK 
         USE
         If DirChange(DBFNTX) > 0
            alert('falha mudando dir')
         EndiF
         If fRename("BANCO.DBF","BANCO.BKP") > 0
             alert('Falhou ao renomear arquivo')
         EndIf
         if ferase("BANCO.CDX") > 0 
             alert('Falha ao apagar arquivo')
         EndIf

Saudações,
Itamar M. Lins Jr.

Re: Harbour erro bound error : array acess

Enviado: 04 Dez 2009 16:42
por alxsts
Olá!

O teu código está um tanto esquisito. Para obter a estrutura de uma tabela, ao invés de AFields(), use DbStruct().
Para referenciar o array gerado, você precisará de dois indexadores, um para linha e outro para coluna.

Código: Selecionar todos

   #include "DbStruct.Ch"

   LOCAL aStruct := BANCO->( DbStruct() ), nInd, nLen

   nLen := Len( aStruct )

   FOR nInd := 1 TO nLen
      QOut( aStruct[ nInd, DBS_NAME ] )
   NEXT
   

Re: Harbour erro bound error : array acess

Enviado: 08 Dez 2009 08:47
por leandromiler
Agora consegui fazer funcionar.

Usei um pouco de cada dica que recebi.

Agradeço a todos vocês.


Abraços.

Código: Selecionar todos

 IF mARQ='SAIDA'
    NomeCampos := dbstruct()
    mNUMCAMPO     := FCOUNT()
    IF !NomeCampos[mNUMCAMPO,1]='OBS4'
      USE
      IF !ABREARQCDX((CAMINHO('SAIDA')),'SAIDA',.T.,10)
        ALERTA2('NAO FOI POSSIVEL ABRIR O ARQUIVO')
        CANCELA()
      ENDIF
      PACK
      USE
      DIRCHANGE(mPATH)
      COPY FILE ('SAIDA.DBF') TO ('SAIDA.BKP')
      FERASE('SAIDA.DBF')
      FERASE('SAIDA.CDX')
      IF !FILE('SAIDA.DBF')
        @24,01 say " Criando Arquivos  SAIDA.DBF"
        A:={}
        A:={}
        AADD(A,{"NUMERO"    ,"C",    8, 0})
        AADD(A,{"VCODIGO"   ,"C",    8, 0})
        AADD(A,{"MTCODIGO"  ,"C",   18, 0})
        AADD(A,{"SAIU"      ,"D",    8, 0})
        AADD(A,{"USUARIO"   ,"C",   10, 0})
        AADD(A,{"USUDATA"   ,"D",    8, 0})
        AADD(A,{"USUHORA"   ,"C",    5, 0})
        AADD(A,{"HR_SAIDA"  ,"C",    5, 0})
        AADD(A,{"AJUDANTE"  ,"C",   30, 0})
        AADD(A,{"OBS1"      ,"C",   60, 0})
        AADD(A,{"OBS2"      ,"C",   60, 0})
        AADD(A,{"MARCA"      ,"C",   1, 0}) // Usado para marcar saidas
        AADD(A,{"OBS3"      ,"C",   60, 0})
        AADD(A,{"OBS4"      ,"C",   60, 0})
        DBCREATE("SAIDA.DBF",A)
      ENDIF
      USE SAIDA NEW
      APPE FROM SAIDA.BKP
      USE
      IF !FILE(CAMINHO('SAIDA.CDX'))
         SHOW('Indexando arquivo de Controle de Sa¡da . . .')
         USE &(CAMINHO('SAIDA')) ALIAS SAIDA NEW
         PACK
         INDEX ON NUMERO TAG ('XSAIDA1')  EVAL CDXPROGRESS() EVERY LASTREC()/100
         USE
      ENDIF
      IF ABREARQCDX((CAMINHO('SAIDA')),'SAIDA',.F.,10)
      ELSE
        ALERTA2('NÆo foi poss¡vel abrir o arquivo de Contrato de Terceiros')
        CANCELA()
      ENDIF
    ENDIF
 ENDIF





Re: Harbour erro bound error : array acess

Enviado: 08 Dez 2009 12:43
por gvc
Use isto para verificar se o campo existe no arquivo.
Vc pode mudar para verificar vários campos e manter a estrutura dos arquivos atualizadas.

Código: Selecionar todos

nomecampos := dbstruct()
if ascan(nomecampos, {|x| x[1] = 'OBS4'}) = 0

Re: Harbour erro bound error : array acess

Enviado: 09 Dez 2009 09:32
por leandromiler
Ok GVC, muito obrigado. vou usar.