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 |