Imprimi Página | Fechar janela

Array Out of bound (2 of 0) Dúvida Array

Impresso de: Helpfacil - Portal do conhecimento
Nome do Forum: ADVPL
Descrição do Forum: Dúvidas sobre a programação em ADVPL
URL:http://www.helpfacil.com.br/display_topic_threads.asp?ForumID=1&TopicID=44601
Data da Impressão: sábado, 5 de outubro de 2024 at 01:08


Topico: Array Out of bound (2 of 0) Dúvida Array

Postado por: LUCADVPL
Assunto: Array Out of bound (2 of 0) Dúvida Array
Data Postagem: quinta-feira, 12 de setembro de 2024 at 12:19

Fala pessoal, bom dia, tudo bem?

Eu estou com uma dúvida em relação a array... Estou fazendo uma função que processa 13000 dados de um csv de produtos e os cadastra via execauto (mata010) na tabela sb1. Quando processo esse csv de 13000 dados, sempre na linha 2664 retorna o erro de array out of bounds (2 of 0). Porém quando processo um array menor, não retorna erro nenhum, ou seja, o problema parece ser em relação ao tamanho do array... Estou debugando para tentar achar o problema, mas enquanto não encontro uma solução, alguém teria alguma dica? Ou sabe se os arrays possuem algum tipo de limitação quanto aos dados? Agradeço desde já!

OBS:. O CSV está sem problemas.

- O problema está acontecendo no array aDados, na linha: cCodigoProduto               := PadR(AllTrim(aDados[2]) , tamSX3("B1_COD")[1]) // B1_COD - Codigo

Segue minha função:


User Function ImpCSVPrd()
    Local cDiretorio
    Local cLinha := ""
    Local lPrimlin := .T.
    Local aCampos := {} // Campos do Cabecalho
    Local aDados := {} // Linhas/Dados
    Local aDadosSB1 := {}
    Local i
    Local cCodigoProduto
    Local cDescricaoProduto
    Local cUnidadeMedida
    Local cOrigemProduto
    Local nPrecoVendaPRV1
    Local nIPI
    Local cObservacaoProduto
    Local cSituacaoProduto
    Local cQuantidadeInicialEstoque
    Local nCustoStandard
    //Local nEstoqueMaximo
    Local nPesoLiquido
    Local nPesoBruto
    Local nTamanhoTipoProduto
    Local cCodigoEspecificadorST
    Local nUltimoPrecoCompra
    Local cCodigoVazio := ""

    //Local cGrupoProduto
    //Local cCodigoFornecedor

    Private aErro := {}
    PRIVATE lMsErroAuto := .F.
    PUBLIC __TTSINUSE := .T.
    PUBLIC __cLogSiga := ""


    cDiretorio := cGetFile( 'Arquivo CSV|*.csv| Arquivo TXT|*.txt| Arquivo XML|*.xml',; // [ cMascara],
                        'Selecao de Arquivos',;                                      // [ cTitulo],
                        0,;                                                         // [ cMascPadrao],
                        'C:\',;                                                      // [ cDirInicial],
                        .F.,;                                                        // [ lSalvar],
                        GETF_LOCALHARD + GETF_NETWORKDRIVE,;                         // [ nOpcoes],
                        .T.)     

    // Processo de preenchimento do array de cabecalho e do array de dados
    FT_FUSE(cDiretorio)
    ProcRegua(FT_FLASTREC())
    FT_FGOTOP()

    While ! FT_FEOF()

        IncProc("Lendo arquivo texto...")

        cLinha := FT_FREADLN()

        If lPrimlin // Primeira linha do arquivo - Cabecalho
            aCampos := Separa(cLinha,";",.T.) // Quebra das linhas ;
            lPrimlin := .F.
        Else
            aAdd(aDados, Separa(cLinha,";",.T.))
        EndIf

        FT_FSKIP()
    EndDo // Fim do processo

    ProcRegua(Len(aDados))

    For i := 2 to Len(aDados)   
       
        cCodigoProduto := PadR(AllTrim(aDados[2]) ,tamSX3("B1_COD")[1]) // B1_COD - Codigo

        cDescricaoProduto            := PadR(AllTrim(aDados[3])                          , tamSX3("B1_DESC")[1]) // B1_DESC - Descricao    
          
        cUnidadeMedida               := PadR(AllTrim(Upper(aDados[4]))                   , tamSX3("B1_UM")[1]) // B1_UM - Unidade Medida     
              
        cOrigemProduto               := PadR(AllTrim(aDados[6])                          , tamSX3("B1_ORIGEM")[1]) // B1_ORIGEM - Origem

        nPrecoVendaPRV1              := NoRound(val(replace(aDados[7],",","."))          , tamSX3("B1_PRV1")[2]) // B1_PRV1 - Preço Venda

        nIPI                         := NoRound(val(replace(aDados[8],",","."))          , tamSX3("B1_IPI")[2]) // B1_IPI - Percentual IPI

        cObservacaoProduto           := PadR(aDados[9]                                   , tamSX3("B1_OBS")[1]) // B1_OBS - Observacao

        cSituacaoProduto             := PadR(aDados[10]                                  , tamSX3("B1_SITPROD")[1]) // B1_SITPROD - Situacao produto

        cQuantidadeInicialEstoque    := NoRound(val(replace(aDados[11],",","."))        , tamSX3("B1_QTDINIC")[2]) // B1_QTDINIC - Quant. Inicial Estoque

        nCustoStandard               := NoRound(val(replace(aDados[12],",","."))        , tamSX3("B1_CUSTD")[2]) // B1_CUSTD - Custo Inicial/Standard

        //nEstoqueMaximo               := NoRound(val(replace(aDados[16],",","."))        , tamSX3("B1_EMAX")[2]) // B1_EMAX - Estoque Maximo

        nPesoLiquido                 := NoRound(val(replace(aDados[18],",","."))        , tamSX3("B1_PESO")[2]) // B1_PESO - Peso Liquido

        nPesoBruto                   := NoRound(val(replace(aDados[19],",","."))        , tamSX3("B1_PESBRU")[2])// B1_PESBRU - Peso Bruto

        nTamanhoTipoProduto          := tamSX3("B1_TIPO")[1] // B1_TIPO - Tipo do Produto

        cCodigoEspecificadorST       := PadR(aDados[40]                                  , tamSX3("B1_CEST")[1]) // B1_CEST - Codigo especificador ST

        nUltimoPrecoCompra           := NoRound(val(replace(aDados[53],",","."))        , tamSX3("B1_UPRC")[2]) // B1_UPRC - Ultimo preco de Compra

        //cGrupoProduto              := PadR(aDados[13]                                  , tamSX3("B1_GRUPO")[1]) // B1_GRUPO - Grupo do Produto

        //cCodigoFornecedor          := PadR(aDados[13]                                  , tamSX3("B1_PROC")[1]) // B1_PROC - Cosdigo Fonecedor   

        // Importação dos registros para a tabela SB1

        If cUnidadeMedida != "PC" .And. cUnidadeMedida != "UN"
            cUnidadeMedida := "UN"
        EndIf

        If cCodigoProduto == "                   " .Or. cCodigoProduto == "" .Or. cCodigoProduto == Nil .Or. Empty(cCodigoProduto)
           cCodigoVazio += cDescricaoProduto + "-"
        Else    
                    // Destino                          // Origem
            Aadd(aDadosSB1, {"B1_FILIAL"               , xFilial("SB1")                             , NIL})
            Aadd(aDadosSB1, {"B1_COD"                   , cCodigoProduto                             , NIL})
            Aadd(aDadosSB1, {"B1_DESC"                  , cDescricaoProduto                           , NIL})
            Aadd(aDadosSB1, {"B1_UM"                    , cUnidadeMedida                             , NIL})
            Aadd(aDadosSB1, {"B1_ORIGEM"               , cOrigemProduto                             , NIL})
            Aadd(aDadosSB1, {"B1_PRV1"                  , nPrecoVendaPRV1                             , NIL})
            Aadd(aDadosSB1, {"B1_IPI"                   , nIPI                                        , NIL})
            Aadd(aDadosSB1, {"B1_OBS"                   , cObservacaoProduto                          , NIL})
            //Aadd(aDadosSB1, {"B1_SITPROD"               , cSituacaoProduto                           , NIL})
            //Aadd(aDadosSB1, {"B1_QTDINIC"               , cQuantidadeInicialEstoque                  , NIL})
            Aadd(aDadosSB1, {"B1_CUSTD"                 , nCustoStandard                             , NIL})
            //Aadd(aDadosSB1, {"B1_PROC"                  , cCodigoFornecedor                          , NIL})
            //Aadd(aDadosSB1, {"B1_EMAX"                  , nEstoqueMaximo                             , NIL})
            Aadd(aDadosSB1, {"B1_PESO"                  , nPesoLiquido                                , NIL})
            Aadd(aDadosSB1, {"B1_PESBRU"               , nPesoBruto                                  , NIL})
            Aadd(aDadosSB1, {"B1_TIPO"                  , PadR("PA", nTamanhoTipoProduto)             , NIL})
            Aadd(aDadosSB1, {"B1_LOCPAD"               , "01"                                        , NIL})
            //Aadd(aDadosSB1, {"B1_GRUPO"               , cGrupoProduto                               , NIL})
            Aadd(aDadosSB1, {"B1_CEST"                  , cCodigoEspecificadorST                      , NIL})
            Aadd(aDadosSB1, {"B1_UPRC"                  , nUltimoPrecoCompra                          , NIL})
            

            // Execução Mata010
            Begin Transaction
               MSExecAuto({|x,y| Mata010(x,y)},aDadosSB1,3)
            End Transaction

            // Verificando se ocorreu um erro durante o cadastro de algum produto
            IF lMsErroAuto
               MostraErro() // Exibindo o erro na tela
               lMsErroAuto := .F.
            //ELSE    
               //ApMsgInfo("Produto Incluido com sucesso!!!!")
            ENDIF
            // Suponha que o arquivo será salvo na pasta "C:\Logs" e o nome do arquivo será "ErrosProdutos.log"


            // Limpa o array de dados do produto posicionado
            aDadosSB1 := {}
        EndIf
    Next i
    
    If !Empty(cCodigoVazio)
        FWAlertInfo("Nao é possivel cadastrar produtos sem codigos: " + cCodigoVazio, "Produtos nao cadastrados")
    Else
        MsgInfo("Todos os produtos foram cadastrados.")
    EndIf
Return


Respostas:

Postado Por: ROBERTOMEN
Data Postagem: quinta-feira, 12 de setembro de 2024 at 20:02

boa noite.


Cuidados com Matrizes

Matrizes são listas de elementos, portanto memória é necessária para armazenar estas informações. Como as matrizes podem ser multidimensionais, a memória necessária será a multiplicação do número de itens em cada dimensão da matriz, considerando-se o tamanho do conteúdo de cada elemento contido nesta. Portanto o tamanho de uma matriz pode variar muito.

A facilidade da utilização de matrizes, mesmo que para armazenar informações em pacotes como descrito anteriormente, não é compensada pela utilização em memória quando o número de itens em um array for muito grande. Quando o número de elementos for muito grande deve-se procurar outras soluções, como a utilização de um arquivo de banco de dados temporário.

Não há limitação para o número de dimensões que uma matriz pode ter, mas o número de elementos máximo (independentes das dimensões onde se encontram) é de 100000.



Fonte TDN



Postado Por: LUCADVPL
Data Postagem: sexta-feira, 13 de setembro de 2024 at 09:02

Legal, obrigado ROBERTOMEN, imaginei que houvesse alguma limitação pelo comportamento "estranho", obrigado pela ajuda



Postado Por: LUCADVPL
Data Postagem: sexta-feira, 13 de setembro de 2024 at 13:10

Pessoal, resolvido o problema, o erro não estava no array, e sim em algum formato não visível no csv, apenas fiz uma validação para pular linhas nulas e está rodando normalmente, obrigado pela ajuda.




Imprimir Página | Fechar Janela