Importar um arquivo texto para o Orçamento (MATA415)
Já tentou importar um arquivo texto para a rotina de orçamento?
É uma tristeza só, a rotina de orçamento utiliza uma tabela temporária chamada TMP1 e por conta disso temos algumas pequenas dificuldades em suas validações.
Mas com um certo jeitinho, conseguimos driblar e resolver os problemas do dia a dia com esta rotina.
Hoje, irei mostrar umas das formas de importar um arquivo texto para o orçamento, não irei postar todo o código, mas a parte que mais interessa, que é a do preenchimento do grid.
Mas antes veja o artigo Importando arquivo texto, agora que já está familiarizado, vamos no que interessa.
Considerando um arquivo texto com duas colunas, sedo a primeira com o código do produto e a segunda com a quantidade.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 |
Static Function Importar(cArquivo) /*declare suas variaveis*/ Local nItem := 0 Local aStrutTMP1 := {} /*coloque aqui seu código para importar o arquivo texto e depois armazena-lo num array*/ aAreaTMP1 := GetArea() TMP1->(Dbgotop()) //A ideia é saber quantas linhas temos no grid, em caso de uma alteração While TMP1->(!EOF()) nItem++ TMP1->(dbskip()) End aStrutTMP1 := dbStruct() //Preenche a grid com os dados If nItem==1 cItem := "00" else cItem := TMP1->CK_ITEM endif //Supondo que você preencheu o array aLinhas com o conteudo do arquivo //sendo CODIGO;QUANTIDADE //aLinha[n,1];aLinha[n,2] //Percorremos todo o array For nI := 1 TO LEN(aLinhas) If nI == 1 If nItem==1 //se tiver algum registro adiciono mais um TMP1->(DBGOTO(nITEM+1)) Else TMP1->(DBGOTO(nITEM)) lAux:=.T. Endif cItem := TMP1->CK_ITEM //Quando estamos no modo de inclusão, a rotina de orçamento não deixa os //campos do grid em memoria, para isso é preciso pular uma linha e começar a partir da segunda oGetDad:AddLine() EndIf nItem++ cItem := soma1(cItem) dbSelectArea("TMP1") RecLock("TMP1",.F.) TMP1->CK_ITEM := cItem TMP1->CK_PRODUTO := aLinhas[nI][1] TMP1->CK_QTDVEN := aLinhas[nI][2] TMP1->CK_VALOR := TMP1->CK_QTDVEN * TMP1->CK_PRCVEN aAreaTMP1 := GetArea() A093Prod(.T.,TMP1->CK_PRODUTO,TMP1->CK_PRODUTO,.T.) //Valida o código do produto If !A415Prod(TMP1->CK_PRODUTO) aadd(aItensErro,{TMP1->CK_ITEM,TMP1->CK_PRODUTO}) EndIf If ExistTrigger("CK_PRODUTO") RunTrigger(2,nItem,Nil,,"CK_PRODUTO") Endif M->CK_PRCVEN := TMP1->CK_PRCVEN M->CK_QTDVEN := aLinhas[nI][2] TMP1->CK_QTDVEN := M->CK_QTDVEN M->CK_VALOR := M->CK_QTDVEN * M->CK_PRCVEN TMP1->CK_VALOR := TMP1->CK_QTDVEN * TMP1->CK_PRCVEN M->CK_ENTREG := dEntrega //Inicializa as Variaveis For nA := 1 to Len(aStrutTMP1) cVariavel := 'M->'+astrutTMP1[nA][1] xConteudo := FieldGet(nA) Private &cVariavel:= xConteudo Next DbSelectArea('TMP1') //reforço as informações nas variaveis de memoria For nA := 1 to Len(aStrutTMP1) cVariavel := 'M->'+astrutTMP1[nA][1] xConteudo := &cVariavel FieldPut(nA,xConteudo) Next M->CK_VALOR := M->CK_QTDVEN * M->CK_PRCVEN TMP1->CK_VALOR := TMP1->CK_QTDVEN * TMP1->CK_PRCVEN TMP1->(MsUnLock()) if nI<LEN(aLinhas) oGetDad:AddLine() //adiciono uma linha, com esta linha eu coloco o grid na memoria endif oGetDad:Refresh() //atualizo o grid Next nI IF lAux oGetDad:AddLine() oGetDad:Refresh() ENDIF nBrLin := nItem + 1 oGetDad:nCount := nItem + 1 oGetDad:ForceRefresh() IF lAux==.F. TMP1->(DBGOTOP()) ENDIF Return |
Talvez o código possa ficar menor, não sei, mas deste jeito funcionou muito bem comigo.
Caso conheça outra forma, compartilhe…
2 comentários
oGetDad onde essa variável é criada?? Pq usar essa variável?
Bom dia Breno!
O oGetDad é uma variável pública criado dentro da rotina MATA415, ela recebe o componente MsGetDB utilizado para criar a grade dos itens.
oGetDb := MsGetDB():New(aPosObj[2,1],aPosObj[2,2],aPosObj[2,3],aPosObj[2,4],nOpcx,”A415LinOk”,”A415TudOk”,”+CK_ITEM”,.T., , ,.T., ,”TMP1″)
Private oGetDad := oGetDb
Com isso podemos manipular o componente MsGetDB.
Espero ter ajudado.