|
Bem Vindo, Visitante
|
Todos os Fórums
ADVPL
|
Imprimir
Enviar Para um Amigo Precisa estar Logado
|
|
|
Assunto: |
Array Out of bound (2 of 0) Dúvida Array |
|
Versão: |
12.1.2210 |
|
Plataforma: |
Microsoft |
Complemento: |
|
|
DB: |
SQL Server |
Complemento: |
|
|
|
|
|
Mensagem do
LUCADVPL
em 12/09/2024, 12:19 h
Local: SP Registro: 05/02/2024 Postagens: 14 |
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 |
|
|
Mensagem do
ROBERTOMEN
em 12/09/2024, 20:02 h
Local: PR Registro: 04/07/2017 Postagens: 546 |
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 |
|
|
Mensagem do
LUCADVPL
em 13/09/2024, 09:02 h
Local: SP Registro: 05/02/2024 Postagens: 14 |
Legal, obrigado ROBERTOMEN, imaginei que houvesse alguma limitação pelo comportamento "estranho", obrigado pela ajuda |
|
|
Mensagem do
LUCADVPL
em 13/09/2024, 13:10 h
Local: SP Registro: 05/02/2024 Postagens: 14 |
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. |
|
Para postar no Fórum você precisa efetuar o seu login ou se registrar
|
|