Olá pessoal…
Hoje vou mostrar uma função desenvolvida que através de um Fornecedor (SA2), cria um Cliente (SA1) novo em 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
Bom pessoal, por hoje é só.
Abraços e até a próxima.