No vídeo de hoje, vamos demonstrar em como gerar um Documento de Entrada logo após faturar um Documento de Saída.
A dúvida de hoje, nos perguntaram, que existe um grupo de empresas, onde uma precisa fazer transferência de produtos para a outra, e ao invés de usar a rotina de Transferência (MATA311), eles faturam um documento de saída por uma, e geram documento de entrada em outra, só que de forma manual.
Pensando nisso, vamos demonstrar em como fazer de forma mais automatizada, dentro do ponto de entrada M460FIM, criando assim um documento de entrada com as mesmas informações da Saída, mas em outra filial.
Obs.: O ideal é utilizar a MATA311, mas se precisar de um recurso paliativo, pode se usar esse exemplo.
Segue abaixo o vídeo exemplificando:
E abaixo o código fonte desenvolvido:
//Bibliotecas #Include "TOTVS.ch" /*/{Protheus.doc} User Function M460FIM Ponto de entrada após gerar o documento de saída @type Function @author Atilio @since 18/03/2024 @see https://tdn.totvs.com/pages/releaseview.action?pageId=6784180 /*/ User Function M460FIM() Local aArea := FWGetArea() //Se o usuário confirmar a pergunta, aciona a geração do documento de entrada If FWAlertYesNo("Deseja gerar o Documento de Entrada?", "Entrada?") u_zVid0122() EndIf FWRestArea(aArea) Return /*/{Protheus.doc} User Function zVid0122 Gera Documento de Entrada através de um Documento de Saída @type Function @author Atilio @since 18/03/2024 @obs O ideal é utilizar a MATA311, mas se precisar de um recurso paliativo, pode se usar esse exemplo /*/ User Function zVid0122() Local aArea := FWGetArea() Local aAreaSF2 := SF2->(FWGetArea()) Local aAreaSD2 := SD2->(FWGetArea()) Local cFilDest := "01" //"0201" Local cFilBkp := cFilAnt Local aCabSF1 := {} Local aItensSD1 := {} Local aLinha := {} Local cItem := StrTran(Space(TamSX3('D1_ITEM')[01]), ' ', '0') Private lMsErroAuto := .F. //Monta o cabeçalho do documento de entrada aAdd(aCabSF1, {"F1_TIPO" , "N" , Nil}) aAdd(aCabSF1, {"F1_FORMUL" , "N" , Nil}) aAdd(aCabSF1, {"F1_DOC" , SF2->F2_DOC , Nil}) aAdd(aCabSF1, {"F1_SERIE" , SF2->F2_SERIE , Nil}) aAdd(aCabSF1, {"F1_EMISSAO" , SF2->F2_EMISSAO , Nil}) aAdd(aCabSF1, {"F1_FORNECE" , SF2->F2_CLIENTE , Nil}) aAdd(aCabSF1, {"F1_LOJA" , SF2->F2_LOJA , Nil}) aAdd(aCabSF1, {"F1_ESPECIE" , "NFE" , Nil}) aAdd(aCabSF1, {"F1_COND" , "C01" , Nil}) //Abre os itens da NF DbSelectArea("SD2") SD2->(DbSetOrder(3)) // D2_FILIAL + D2_DOC + D2_SERIE + D2_CLIENTE + D2_LOJA + D2_COD + D2_ITEM SD2->(MsSeek( FWxFilial("SD2") + SF2->(F2_DOC+F2_SERIE) )) //Enquanto houver dados nos itens da NF e for o mesmo documento e série While ! SD2->(EOF()) .And. D2_FILIAL == FWxFilial("SD2") .And. (D2_DOC+D2_SERIE) == SF2->(F2_DOC+F2_SERIE) cItem := Soma1(cItem) //Adiciona uma linha no array do documento de entrada aLinha := {} aAdd(aLinha, {"D1_ITEM" , cItem , Nil} ) aAdd(aLinha, {"D1_COD" , SD2->D2_COD , Nil} ) aAdd(aLinha, {"D1_QUANT" , SD2->D2_QUANT , Nil} ) aAdd(aLinha, {"D1_VUNIT" , SD2->D2_PRCVEN , Nil} ) aAdd(aLinha, {"D1_TOTAL" , SD2->D2_TOTAL , Nil} ) aAdd(aLinha, {"D1_TES" , "001" , Nil} ) aAdd(aItensSD1, aClone(aLinha)) SD2->(DbSkip()) EndDo //Troca a filial para onde será inserido a entrada cFilAnt := cFilDest cNumEmp := cEmpAnt + cFilAnt OpenFile(cNumEmp) //Aciona a criação do documento de entrada MSExecAuto({|x, y, z| Mata103(x, y, z) }, aCabSF1, aItensSD1, 3) //Se houve erro, mostra ao usuário If lMsErroAuto MostraErro() EndIf //Volta a filial para a original cFilAnt := cFilBkp cNumEmp := cEmpAnt + cFilAnt OpenFile(cNumEmp) FWRestArea(aAreaSF2) FWRestArea(aAreaSD2) FWRestArea(aArea) Return
Bom pessoal, por hoje é só.
Abraços e até a próxima.