Função que cria Cliente a partir de Fornecedor em AdvPL

Função que cria Cliente a partir de Fornecedor em AdvPL

Olá pessoal…

Hoje vou mostrar uma função desenvolvida que através de um Fornecedor (SA2), cria um Cliente (SA1) novo em AdvPL.

AdvPL
AdvPL

A função basicamente serve como uma clonagem do Fornecedor para o Cliente, para fazer com que ela funcione, basta chamar a rotina e passar o RecNo do Fornecedor.

Será procurado então o CNPJ / CPF na tabela de clientes, caso não exista um novo cliente será criado através de ExecAuto.

Para a rotina funcionar adequadamente, crie os campos A2_X_CLCOD e A2_X_CLLOJ (Código e Loja do Cliente respectivamente), e verifique a criação dos parâmetros MV_X_CLNAT, MV_X_CLVEN e MV_X_CLSAT.

Abaixo o código fonte completo:

//Bibliotecas
#Include "Protheus.ch"

/*/{Protheus.doc} zCliFor
Função que cadastra cliente a partir dos dados do fornecedor
@type function
@author Atilio
@since 12/10/2016
@version 1.0
@param nRecSA2, numérico, RecNO do Fornecedor
@return lRet, Retorna se deu certo ou não a inclusão do cliente
@example
u_zCliFor(888)
@obs Os campos A2_X_CLCOD e A2_X_CLLOJ devem estar criados na base
Verificar os parâmetros MV_X_CLNAT, MV_X_CLVEN e MV_X_CLSAT
/*/
User Function zCliFor(nRecSA2)
Local aArea     := GetArea()
Local lRet      := .T.
Local aSA1      := {}
Local cCodCli   := ""
Local nAtual    := 0
Local cNatAux   := SuperGetMV('MV_X_CLNAT', .F., "")
Local cVenAux   := SuperGetMV('MV_X_CLVEN', .F., "")
Local cSatAux   := SuperGetMV('MV_X_CLSAT', .F., "")
Default nRecSA2 := 0

//Se tiver recno
If nRecSA2 != 0
//Se não for o mesmo recno, posiciona no fornecedor
DbSelectArea('SA2')
If SA2->(RecNo()) != nRecSA2
SA2->(DbGoTo(nRecSA2))
EndIf

//Somente se não tiver cliente e loja
If Empty(SA2->A2_X_CLCOD) .And. Empty(SA2->A2_X_CLLOJ)
DbSelectArea('SA1')
SA1->(DbSetOrder(3)) //A1_FILIAL + A1_CGC
SA1->(DbGoTop())

//Se o CNPJ já existir, usa o cliente como referência
If SA1->(DbSeek(FWxFilial('SA1') + SA2->A2_CGC))
//Grava o cliente no fornecedor
RecLock('SA2', .F.)
A2_X_CLCOD := SA1->A1_COD
A2_X_CLLOJ := SA1->A1_LOJA
SA2->(MsUnlock())

Else
//Adiciona os campos
cCodCli := GetSXENum("SA1","A1_COD")
ConfirmSX8()
aAdd(aSA1, {"A1_FILIAL",  FWxFilial("SA1"), Nil})
aAdd(aSA1, {"A1_COD",     cCodCli,          Nil})
aAdd(aSA1, {"A1_LOJA",    "01",             Nil})
aAdd(aSA1, {"A1_CGC",     SA2->A2_CGC,      Nil})
aAdd(aSA1, {"A1_EST",     SA2->A2_EST,      Nil})
aAdd(aSA1, {"A1_PESSOA",  SA2->A2_TIPO,     Nil})
aAdd(aSA1, {"A1_NOME",    SA2->A2_NOME,     Nil})
aAdd(aSA1, {"A1_NREDUZ",  SA2->A2_NREDUZ,   Nil})
aAdd(aSA1, {"A1_END",     SA2->A2_END,      Nil})
aAdd(aSA1, {"A1_INSCR",   SA2->A2_INSCR,    Nil})
aAdd(aSA1, {"A1_COD_MUN", SA2->A2_COD_MUN,  Nil})
aAdd(aSA1, {"A1_MUN",     SA2->A2_MUN,      Nil})
aAdd(aSA1, {"A1_BAIRRO",  SA2->A2_BAIRRO,   Nil})
aAdd(aSA1, {"A1_CEP",     SA2->A2_CEP,      Nil})
aAdd(aSA1, {"A1_DDD",     SA2->A2_DDD,      Nil})
aAdd(aSA1, {"A1_TEL",     SA2->A2_TEL,      Nil})
aAdd(aSA1, {"A1_FAX",     SA2->A2_FAX,      Nil})
aAdd(aSA1, {"A1_EMAIL",   SA2->A2_EMAIL,    Nil})
aAdd(aSA1, {"A1_CONTATO", SA2->A2_CONTATO,  Nil})
aAdd(aSA1, {"A1_NATUREZ", cNatAux,          Nil})
aAdd(aSA1, {"A1_VEND",    cVenAux,          Nil})
aAdd(aSA1, {"A1_SATIV1",  cSatAux,          Nil})

Begin Transaction
lMsErroAuto := .F.
MSExecAuto({|x, y| Mata030(x, y)}, aSA1, 3)

//Se houve erro, disarma a transação
If lMsErroAuto
lRet := .F.
MostraErro()
DisarmTransaction()

Else
//Grava o cliente no fornecedor
RecLock('SA2', .F.)
A2_X_CLCOD   := cCodCli
A2_X_CLLOJ := "01"
SA2->(MsUnlock())
EndIf
End Transaction
EndIf
EndIf
Else
lRet := .F.
EndIf

RestArea(aArea)
Return lRet

Esses e outros códigos, estão disponíveis gratuitamente no nosso GitHub, acesse em github.com/dan-atilio/AdvPL.
Caso queira uma customização específica para sua empresa, saiba mais em nossa Loja.

Bom pessoal, por hoje é só.
Abraços e até a próxima.

About Dan_Atilio

Analista e desenvolvedor de sistemas. Técnico em Informática pelo CTI da Unesp. Graduado em Banco de Dados pela Fatec Bauru. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor do projeto Terminal de Informação, onde são postados tutoriais e notícias envolvendo o mundo da tecnologia.

Deixe uma resposta

%d blogueiros gostam disto: