Imprimi Página | Fechar janela |
Execauto mata200 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=44383 Data da Impressão: terça-feira, 5 de dezembro de 2023 at 02:49 Topico: Execauto mata200 Postado por: PIETRCK Assunto: Execauto mata200 Data Postagem: quarta-feira, 25 de outubro de 2023 at 08:59 Bom dia, Tenho uma customização para importação em massa de estrutura de produtos, utilizando o execauto da MATA200. Porém sempre que executo ele insere apenas o primeiro registro, no segundo ele afirma que o código é inválido. Segue o código: If ! (oFile:EoF()) nLinha := 1 aItens := {} //Enquanto houver linhas a serem lidas While (oFile:HasLine()) MsProcTxt("Analisando registro " + cValToChar(nLinha)) //Buscando o texto da linha atual cLinAtu := oFile:GetLine() //Despreza o cabeçalho if nLinha > 1 aDadosTemp := Separa(cLinAtu, ‘;‘, .T.) IF cCodigo != aDadosTemp[1] cCodigo := aDadosTemp[1] if LEN(aCab) != 0 MSExecAuto({|x,y,z| mata200(x,y,z)},aCab,aItens,3,.F.) If !lMsErroAuto AutoGrLog("Incluido com sucesso a estrutura do produto " + aCab[1][2] + cPulLin) EndIf endif aItens := {} aCab := {} aCab := {{"G1_COD",aDadosTemp[1],NIL},; {"G1_QUANT",VAL(aDadosTemp[4]),NIL},; {"NIVALT","S",NIL},; {"ATUREVSB1","N",NIL}} ENDIF aadd(aGets,{"G1_COD",aDadosTemp[1],NIL}) aadd(aGets,{"G1_COMP",aDadosTemp[2],NIL}) aadd(aGets,{"G1_TRT",aDadosTemp[3],NIL}) aadd(aGets,{"G1_QUANT",VAL(aDadosTemp[4]),NIL}) aadd(aGets,{"G1_PERDA",VAL(aDadosTemp[5]),NIL}) aadd(aGets,{"G1_INI",CTOD(aDadosTemp[6]),NIL}) aadd(aGets,{"G1_FIM",CTOD(aDadosTemp[7]),NIL}) aadd(aGets,{"G1_REVINI",aDadosTemp[8],NIL}) aadd(aGets,{"G1_REVFIM",aDadosTemp[9],NIL}) aadd(aGets,{"G1_DESC",aDadosTemp[10],NIL}) aadd(aGets,{"G1_GROPC",aDadosTemp[11],NIL}) aadd(aGets,{"G1_OBSERV",aDadosTemp[12],NIL}) aadd(aGets,{"G1_LOCCONS",aDadosTemp[13],NIL}) aadd(aItens,aGets) aGets := {} endif nLinha++ EndDo //Caso o arquivo tenha terminado mas possua itens ainda ele realiza a inclusão if nLinha > 1 .AND. LEN(aItens) > 0 MSExecAuto({|x,y,z| mata200(x,y,z)},aCab,aItens,3,.F.) If !lMsErroAuto AutoGrLog("Incluido com sucesso a estrutura do produto " + aCab[1][2] + cPulLin) EndIf endif EndIf Debuguei e as variaveis de cabeçalho e itens estão corretas. Alguém já pegou algo parecido? Respostas: Postado Por: TIAGOFLM Data Postagem: quarta-feira, 25 de outubro de 2023 at 13:32 Bom dia, verifique se ao definir o cCodigo como aDadosTemp[1] está pegando o codigo da linha atual, pois pode ser que ao definir esteja usando um código que já passou pelo execauto Postado Por: ROBERTOMEN Data Postagem: quarta-feira, 25 de outubro de 2023 at 14:42 Boa tarde https://centraldeatendimento.totvs.com/hc/pt-br/articles/360019402932-Cross-Segmentos-TOTVS-Backoffice-Linha-Protheus-ADVPL-FWFileReader-n%C3%A3o-faz-a-leitura-de-todas-as-linhas-corretamente troca ai pra ver se resolve.... // cLinAtu := oFile:GetLine() cLinAtu := oFile:GetLine(.t.) Postado Por: ROBERTOMEN Data Postagem: quarta-feira, 25 de outubro de 2023 at 15:03 Realmente, analisando o ponto de vista do TIAGO, a variável cCodigo só é diferente de aDadosTemp[1], antes de entrar no if, depois ela nunca será diferente pois não esta sendo atualizada e neste caso só vai rodar o execauto uma vez. IF cCodigo != aDadosTemp[1] cCodigo := aDadosTemp[1] Postado Por: PIETRCK Data Postagem: quarta-feira, 25 de outubro de 2023 at 15:31 No exemplo do CSV abaixo ela é diferente duas vezes: G1_COD;G1_COMP;G1_TRT;G1_QUANT;G1_PERDA;G1_INI;G1_FIM;G1_REVINI;G1_REVFIM;G1_DESC;G1_GROPC;G1_OBSERV;G1_LOCCONS 000000;000009;2;1;0;26/06/2023;31/12/2049;;;;;; 000000;000007;1;1;0;26/06/2023;31/12/2049;;;;;; 000002;000009;1;1;0;26/06/2023;31/12/2049;;;;;; 000007;000009;1;1;0;26/06/2023;31/12/2049;;;;;; Pois agrupo todos os G1_COD iguais mas em diferentes itens. Tanto que no primeiro código indiferente de quantos itens ele inclui, mas no segundo ele da erro de invalido. Durante o debug eu verifiquei a variavel de cabeçalho e itens e esta com os dados corretos em ambas as execuções do execauto. Postado Por: ROBERTOMEN Data Postagem: quinta-feira, 26 de outubro de 2023 at 16:02 sim mas no seu fonte é só é declarada uma vez, só aqui: IF cCodigo != aDadosTemp[1] cCodigo := aDadosTemp[1] depois daqui ela nunca mais será diferente. por isto que o executo insere apenas o primeiro registro |
Imprimir Página | Fechar Janela |