Olá pessoal, td certo?
Sabe quando precisamos daquela rotina pra dar uma “pequena” agilizada no processo?
Em se tratando de geração de viagens no Gestão de Transportes Protheus, e com a necessidade de velocidade nas operações, seja em transportadoras ou em operadores logísticos, imagine se sua preocupação fosse somente lançar as notas fiscais e calcular os fretes.
Toda a parte de criação de Viagem (Mod 2) pode ser automatizada.
Abaixo te dou um exemplo de como fazer isso. Porém, neste exemplo, não estou considerando estornos. Mas, baseado no código de geração, pode-se facilmente desenvolver outras transações.
O código é acionado a partir do ponto de entrada TM200FIM, no final do cálculo do frete
Veja:
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 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 |
#include "rwmake.ch" #include "protheus.ch" /*/{Protheus.doc} TM200FIM //TODO Este Ponto de Entrada, localizado no TMSA200(Cálculo do Frete), é executado após o final de todo o processo de gravação dos documentos e da geração das notas de saída. @author Fernando Bueno @since 01/01/2017 @version undefined @type function /*/ User Function TM200FIM() Local aArea := GetArea() Local cFilDoc := PARAMIXB[1] Local cDocto := PARAMIXB[2] Local cSerie := PARAMIXB[3] fViagem(cFilDoc, cDocto, cSerie) RestArea(aArea) Return Nil /*/{Protheus.doc} fViagem //TODO Função que cria viagem no TMS @author Fernando Bueno @since 01/01/2017 @version 1.0 @param cFilDoc, characters, descricao @param cDocto, characters, descricao @param cSerie, characters, descricao @type function /*/ Static Function fViagem(cFilDoc, cDocto, cSerie) Local cLote := "" Local cViagem := "" Local aFields := {} Local aData := {} Local cVeic := "" Local cMot := "" Local cCarga := "" cLote := Posicione("DT6",1,xFilial("DT6")+cFilDoc+cDocto+cSerie,"DT6_LOTNFC") //Traz o número do lote cViagem := Posicione("DTP",2,xFilial("DTP")+cFilDoc+cLote,"DTP_VIAGEM") // Traz o número da viagem, de acordo com o lote buscado acima cCarga := Posicione("DTP",2,xFilial("DTP")+cFilDoc+cLote,"DTP_X_NCAR") //Aqui apenas um campo para controlar de qual carga vieram os dados If Empty(cViagem) cViagem := NextNumero("DTQ",2,"DTQ_VIAGEM",.T., "000001") /******************************************************** Neste ponto a filial é trocada para buscar dados do faturamento, de onde conseguiremos trazer veículo e motorista OBS: Você pode encontrar outra forma de trazer veículo e motorista, caso não tenha OMS ********************************************************/ cFilBkp := cFilAnt cFilAnt := "0101" cVeic := Posicione("DAK",1,xFilial("DAK")+cCarga,"DAK_X_VCTE") cMot := Posicione("DAK",1,xFilial("DAK")+cCarga,"DAK_X_MCTE") cFilAnt := cFilBkp /********************************************************/ //Veiculo da viagem aFields := {"DTR_FILIAL","DTR_FILORI","DTR_VIAGEM","DTR_ITEM","DTR_CODVEI","DTR_QTDEIX",; "DTR_INSRET","DTR_VALFRE","DTR_VALPDG","DTR_CREADI","DTR_LOJCRE","DTR_NOMCRE",; "DTR_ADIFRE","DTR_FRECAL","DTR_REBTRF","DTR_CODFOR","DTR_LOJFOR","DTR_QTEIXV",; "DTR_VALRB1","DTR_VALRB2","DTR_CALRB1","DTR_CALRB2","DTR_PERADI","DTR_TIPCRG"} //Monto o array com os dados que serão gravados na tabela de veículos da viagem (DTR) //Busque conforme sua necessidade aData := {xFilial("DTR"),cFilAnt,cViagem,"01",cVeic,0,; 0,0,0,; "000001","01",; "EMPRESA PROPRIETÁRIA DO VEÍCULO",; 0,"2","2","000001","01",0,; 0,0,"2","2",0,"2"} //Grava DTR U_SAVEDATA("DTR", aFields, aData) //Motorista da viagem aFields := {"DUP_FILIAL","DUP_FILORI","DUP_VIAGEM","DUP_ITEDTR","DUP_CODVEI","DUP_CODMOT",; "DUP_VALSEG","DUP_CONDUT","DUP_FORADT"} //Monto o array com os dados que serão gravados na tabela de motoristas da viagem (DUP) //Busque conforme sua necessidade aData := {xFilial("DUP"),cFilAnt,cViagem,"01",cVeic,cMot,; 0,"1","1"} //Grava DUP u_SAVEDATA("DUP", aFields, aData) //Viagem aFields := {"DTQ_FILIAL","DTQ_FILORI","DTQ_VIAGEM","DTQ_TIPVIA","DTQ_ROTA",; "DTQ_DATGER","DTQ_HORGER","DTQ_SERTMS","DTQ_TIPTRA"} //Monto o array com os dados que serão gravados na tabela de viagem (DTQ) //Busque conforme sua necessidade aData := {xFilial("DTQ"),cFilAnt,cViagem,"1","RT0001",; DATE(),StrTran(Time(),":",""),"3","1"} //Grava DTQ u_SAVEDATA("DTQ", aFields, aData) dbSelectArea("DTP") DTP->( dbSetOrder(2) ) If DTP->( dbSeek(xFilial("DTP")+cFilAnt+cLote) ) RecLock("DTP",.F.) DTP->DTP_VIAGEM := cViagem MsUnlock() EndIf EndIf /********************************************************************** Aqui gravará os documentos na viagem. O ponto de entrada TM200FIM é acionado a cada documento gerado. Então, com as verificações realizadas acima, no código, não serão criadas viagens repetidas /*********************************************************************/ //Documentos da viagem aFields := {"DUD_FILIAL","DUD_FILORI","DUD_FILDOC","DUD_DOC","DUD_SERIE","DUD_SERTMS","DUD_TIPTRA",; "DUD_CDRDES","DUD_GERROM","DUD_SERVIC","DUD_CDRCAL","DUD_ENDERE","DUD_STATUS",; "DUD_DOCTRF","DUD_FILATU","DUD_CEPENT"} //Monto o array com os dados que serão gravados na tabela de viagem (DUD) aData := {xFilial("DUD"),cFilAnt,cFilDoc,cDocto,cSerie,"3","1",; DT6->DT6_CDRDES,"2","002",DT6->DT6_CDRCAL,"0","1",; "2",cFilAnt,"19880000"} //Grava DUD u_SAVEDATA("DUD", aFields, aData) Return /*/{Protheus.doc} SAVEDATA //TODO Função genérica para gravar dados @author Fernando Bueno @since 01/01/2017 @version 1.0 @param cArea, characters, descricao @param aFields, array, descricao @param aData, array, descricao @type function /*/ User Function SAVEDATA(cArea,aFields,aData) Local aArea := GetArea() Local nI := 0 dbSelectArea(cArea) RecLock(cArea, .T.) For nI := 1 To Len(aFields) (cArea)->&(aFields[nI]) := aData[nI] Next nI MsUnlock() RestArea(aArea) Return nil //Função para realizar testes User Function VIAGTST() Local aFields := {"DTQ_FILIAL","DTQ_FILORI","DTQ_VIAGEM","DTQ_TIPVIA","DTQ_ROTA",; "DTQ_DATGER","DTQ_HORGER","DTQ_SERTMS","DTQ_TIPTRA","DTQ_STATUS"} Local aData := {xFilial("DTQ"),cFilAnt,NextNumero("DTQ",2,"DTQ_VIAGEM",.F., "000001"),"1","RT0001",; DATE(),StrTran(Time(),":",""),"3","1","1"} u_SAVEDATA("DTQ", aFields, aData) Return nil |
Fernando Bueno
Consultor em FBSOLUTIONS
Sou consultor na área de implantação de sistemas ERP, com experiência na análise e implantação de projetos de sistemas, configurando a estrutura do software, capacitando usuários-chaves, ministrando treinamentos e workshops.
Atuando desde 2005 no mercado de tecnologia, desenvolvendo e implantando e sistemas gerenciais, sistemas e sites web e ecommerce.
Siga-me no Linked In
Atuando desde 2005 no mercado de tecnologia, desenvolvendo e implantando e sistemas gerenciais, sistemas e sites web e ecommerce.
Siga-me no Linked In
Últimos posts por Fernando Bueno (exibir todos)
- O Papel Estratégico do Setor Logístico na Cadeia de Suprimentos - 20 de novembro de 2024
- Logística Reversa: Estratégia Sustentável e Lucrativa para Empresas - 20 de novembro de 2024
- A Importância da Contagem de Estoque para a Eficiência Empresarial - 20 de novembro de 2024