Hoje vou mostrar uma forma de criar automaticamente um Item Contábil através da inclusão de um fornecedor.
Pessoal, o tutorial abaixo, eu usei como base a SA2 (cadastro de Fornecedor), porém você consegue adaptar e usar a SA1 (cadastro de Cliente), basta você modificar os campos e o ponto de entrada.
A ideia aqui seria +- assim:
- Ao incluir um fornecedor, chamar o ponto de entrada ( M020INC )
- Incluir um registro na CTD, com o prefixo ‘F’
- Chamar uma rotina via ExecAuto para incluir CT1 e CVD
Então, tendo essa premissa, foi criado o exemplo abaixo (lembre-se de alterar os campos como Conta Superior, Conta Referência, etc conforme a sua base).
User Function M020INC() Local aArea := GetArea() Local lRet := .T. //Abre a tabela CTD DbSelectarea("CTD") CTD->(DbSetOrder(1)) //Se nao conseguir posicionar, registro sera criado If ! CTD->(DbSeek(FWxFilial("CTD") + 'F' + SA2->A2_COD + SA2->A2_LOJA)) RecLock("CTD", .T.) CTD->CTD_FILIAL := XFILIAL("CTD") CTD->CTD_ITEM := 'F' + SA2->A2_COD + SA2->A2_LOJA CTD->CTD_DESC01 := SA2->A2_NOME CTD->CTD_CLASSE := "2" CTD->CTD_NORMAL := "0" CTD->CTD_BLOQ := "2" CTD->CTD_DTEXIS := CTOD("01/01/1980") CTD->CTD_ITLP := 'F' + SA2->A2_COD + SA2->A2_LOJA CTD->CTD_CLOBRG := "2" CTD->CTD_ACCLVL := "1" CTD->(MsUnLock()) Processa({|| fIncConta()}) Endif RestArea(aArea) Return lRet Static Function fIncConta() Local aArea := GetArea() Local cConta Local cContaSup := "211001" Local oModelCTB Local nOpcAuto Local oCT1 Local oCVD //Local oCTS Local aLog Local cLog := "" Local nAtual //Monta a conta cConta := cContaSup + SA1->A2_COD DbSelectArea("CT1") CT1->(DbSetOrder(1)) //Se nao conseguir posicionar no Plano de Contas, sera incluida If ! CT1->(DbSeek(FWxFilial("CT1") + cConta)) //Faz o carregamento do modelo If oModelCTB == Nil oModelCTB := FWLoadModel('CTBA020') EndIf //Setando a operação como Inclusão e ativando o modelo nOpcAuto:=3 oModelCTB:SetOperation(nOpcAuto) oModelCTB:Activate() //Setando os valores da CT1 (Plano de Contas) oCT1 := oModelCTB:GetModel('CT1MASTER') oCT1:SetValue('CT1_CONTA', cConta) oCT1:SetValue('CT1_DESC01', Alltrim(SA2->A2_NOME)) oCT1:SetValue('CT1_CLASSE', '2') oCT1:SetValue('CT1_NORMAL', '2') oCT1:SetValue('CT1_NTSPED', '02') oCT1:SetValue('CT1_NATCTA', '02') oCT1:SetValue('CT1_INDNAT', '2') //Setando os dados da CVD (Plano de Contas Referencial) oCVD := oModelCTB:GetModel('CVDDETAIL') oCVD:SetValue('CVD_FILIAL', FWxFilial('CVD')) oCVD:SetValue('CVD_ENTREF', "10") oCVD:SetValue('CVD_CODPLA', "100") oCVD:SetValue('CVD_VERSAO', "0001") oCVD:SetValue('CVD_CTAREF', "2.01.01.03.01") oCVD:SetValue('CVD_CUSTO' , "") oCVD:SetValue('CVD_CLASSE', "2") oCVD:SetValue('CVD_TPUTIL', "A") oCVD:SetValue('CVD_NATCTA', "02") oCVD:SetValue('CVD_CTASUP', "2.01.01.03") //Setando os dados da CTS (Visão Gerencial) /* oCTS := oModelCTB:GetModel('CTSDETAIL') oCTS:SetValue('CTS_FILIAL', FWxFilial('CTS')) oCTS:SetValue('CTS_CODPLA', '001') oCTS:SetValue('CTS_CONTAG', '211') oCTS:SetValue('CTS_TPSALD', '1') */ //Se tiver tudo ok, confirma a gravação If oModelCTB:VldData() oModelCTB:CommitData() //Grava a conta contábil no Fornecedor RecLock("SA2", .F.) SA2->A2_CONTA := cConta SA2->(MsUnlock()) Else //Pega o Log completo aLog := oModelCTB:GetErrorMessage() //Percore todas as linhas do Log For nAtual := 1 to Len(aLog) //Se tiver log, incrementa variável If ! Empty(aLog[nAtual]) cLog + = Alltrim(aLog[nAtual]) + Chr(13) + Chr(10) EndIf Next nAtual //Mostra o erro na tela lMsErroAuto := .T. AutoGRLog(cLog) MostraErro() EndIf //Desativa o modelo de dados oModelCTB:DeActivate() EndIf RestArea(aArea) Return
Bom pessoal, por hoje é só.
Abraços e até a próxima.
teria um exemplo disso com o novo ponto de entrada CRMA980?
apartir de 04/04/2022 será desataivado o mata030 entao nao vai mais passar por esse ponto de entrada
Boa noite Robson.
No caso, o ponto de entrada é no padrão MVC, segue um exemplo: