Harbour erro bound error : array acess

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

Moderador: Moderadores

leandromiler
Usuário Nível 2
Usuário Nível 2
Mensagens: 55
Registrado em: 26 Nov 2009 08:38
Localização: Ribeirão Preto - SP
Contato:

Harbour erro bound error : array acess

Mensagem 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
Editado pela última vez por Toledo em 04 Jun 2010 19:22, em um total de 1 vez.
Razão: Mensagem editada para colocar a tag [ code ]<br>Veja como utilizar esta tag: http://www.pctoledo.com.br/forum/faq.php?mode=bbcode#f2r1
Clipper 5.3b / CDX Nativo / Blinker 7

Ninguem sabe tanto que não possa aprender, e nem sabe tão pouco que não possa ensinar !!!
Avatar do usuário
gvc
Colaborador
Colaborador
Mensagens: 1270
Registrado em: 23 Ago 2005 10:57

Re: Harbour erro bound error : array acess

Mensagem 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
"TRS-80/Sincler/Apple/PC - Clipper Winter 85, tlink 1.0 [pc 10 MHz - 640K] {NEZ 8000 2Kb RAM}"
{POG - Programação Orientada a Gambiarra}
leandromiler
Usuário Nível 2
Usuário Nível 2
Mensagens: 55
Registrado em: 26 Nov 2009 08:38
Localização: Ribeirão Preto - SP
Contato:

Re: Harbour erro bound error : array acess

Mensagem por leandromiler »

O problema está dando nesta linha

:-Y
IF NomeCampos[mNUMCAMPO]!='PRCHEQUE' // 28/07/2005
Clipper 5.3b / CDX Nativo / Blinker 7

Ninguem sabe tanto que não possa aprender, e nem sabe tão pouco que não possa ensinar !!!
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7929
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Re: Harbour erro bound error : array acess

Mensagem 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.
Editado pela última vez por Itamar M. Lins Jr. em 04 Dez 2009 16:50, em um total de 1 vez.
Saudações,
Itamar M. Lins Jr.
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Re: Harbour erro bound error : array acess

Mensagem 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
   
[]´s
Alexandre Santos (AlxSts)
leandromiler
Usuário Nível 2
Usuário Nível 2
Mensagens: 55
Registrado em: 26 Nov 2009 08:38
Localização: Ribeirão Preto - SP
Contato:

Re: Harbour erro bound error : array acess

Mensagem 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




Clipper 5.3b / CDX Nativo / Blinker 7

Ninguem sabe tanto que não possa aprender, e nem sabe tão pouco que não possa ensinar !!!
Avatar do usuário
gvc
Colaborador
Colaborador
Mensagens: 1270
Registrado em: 23 Ago 2005 10:57

Re: Harbour erro bound error : array acess

Mensagem 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
"TRS-80/Sincler/Apple/PC - Clipper Winter 85, tlink 1.0 [pc 10 MHz - 640K] {NEZ 8000 2Kb RAM}"
{POG - Programação Orientada a Gambiarra}
leandromiler
Usuário Nível 2
Usuário Nível 2
Mensagens: 55
Registrado em: 26 Nov 2009 08:38
Localização: Ribeirão Preto - SP
Contato:

Re: Harbour erro bound error : array acess

Mensagem por leandromiler »

Ok GVC, muito obrigado. vou usar.
Clipper 5.3b / CDX Nativo / Blinker 7

Ninguem sabe tanto que não possa aprender, e nem sabe tão pouco que não possa ensinar !!!
Responder