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:
User Function CRMA980() Local aArea := FWGetArea() Local aParam := PARAMIXB Local xRet := .T. Local oObj := Nil Local cIdPonto := "" Local cIdModel := "" //Se tiver parametros If aParam != Nil //Pega informacoes dos parametros oObj := aParam[1] cIdPonto := aParam[2] cIdModel := aParam[3] //Apos a gravacao total do modelo e dentro da transacao If cIdPonto == "MODELCOMMITTTS" nOper := oObj:nOperation //Se for inclusão If nOper == 3 /* aqui você faz sua tratativa*/ EndIf EndIf EndIf FWRestArea(aArea) Return xRet