Validar campo função SM0 retorna Código Filial

Olá Pessoal Boa tarde.

Tenho uma tela MVC modelo 3. Que preciso validar se o código de filial digitado no campo(ZZH_CODEMP) existe na tabela SM0.

Tentei fazer essa função, mas não sei como funciona essa tabela SM0.

User Function zEMP()

Local aArea := GetArea()

Local lRet := .T.

DbSelectArea("SM0")

SM0->(DbSetOrder(1))

SM0->(DbGoTop())

While SM0->(!Eof() .And. SM0->M0_CODFIL == "01")

IF SM0->(DbSeek(xFilial("SM0") + M->ZZH_CODEMP)) MsgAlert("Existe !!")

ELSE

MsgAlert("Não existe registro no campo Empresa com esse código")

ENDIF

SM0->(DbSkip())

EndDo

SM0->(DbCloseArea())

RestArea(aArea)

Return (lRet)

Alguém teria algum exemplo, vi que existe a função FWLoadSM0, mas não sei como usar nesse caso.

Boa tarde!

O campo ZZH_CODEMP se refere ao código da empresa (M0_CODIGO) ou da filial da empresa (M0_CODFIL)?

Você pode usar a classe FwSM0Util para busca da empresa/filial que deseja. Exemplo:


If(Len(FwSM0Util():GetSM0Data(M->ZZH_CODEMP)) == 0)

    Help(,,'Empresa não existe',,'O código da empresa digitado não existe na tabela SM0.',1,0,,,,,,{''})

EndIf

Lembrando que o método GetSM0Data recebe a empresa como primeiro parâmetro e filial como segundo parâmetro.

Em caso de dúvidas sobre como é a sua estrutura da SM0 e caso seu dicionário de dados estiver na system, basta abrir o arquivo sigamat.emp pelo APSDU. Este arquivo está dentro da pasta system do Protheus.

Olá Giordano, o campo ZZH_CODEMP se refere ao M0_CODFIL, Obrigada seu exemplo me deu ideia de como fazer.

Amigo acho que o programa abaixo faz o que você precisa. Realmente o melhor caminho é usando a função FWLoadSM0() para não mexer no SM0/Sigamat diretamente. Procurei se tinha alguma coisa padrão mas não encontrei, em alguns lugares vi usando diretamente a função ExistCpo('SM0',cEmpAnt+mv_par02,1), não considero uma boa opção porque vai desposicionar a tabela SM0.


#INCLUDE 'RWMake.ch'
#INCLUDE 'Totvs.ch'
#INCLUDE 'ParmType.ch'
#INCLUDE 'FWCommand.CH'

//#############################################################################
//##+==========+===========+=======+====================+======+============+##
//##|Programa  | VldFilial | Autor | Cirilo Rocha      | Data | 02/06/2022  |##
//##+==========+===========+=======+====================+======+============+##
//##|Desc.     | Função para validar se a filial passada existe no SM0      |##
//##+==========+==========+=================================================+##
//##| DATA     | ANALISTA | MANUTENÇÃO EFETUADA                             |##
//##+==========+==========+=================================================+##
//##|          |          |                                                 |##
//##|          |          |                                                 |##
//##|          |          |                                                 |##
//##+==========+==========+=================================================+##
//#############################################################################
User Function VldFilial(cFilVld);
                            AS Logical

    //Declaração de Variáveis----------------------------------------------------------------------
    Local aSM0        AS Array
    Local lRet        AS Logical
    Local nX        AS Numeric

    //Parametros da rotina-------------------------------------------------------------------------
    ParamType 0        VAR cFilVld        AS Character

    //Inicializa Variaveis-------------------------------------------------------------------------
    lRet    := .F.

    //Carrega informacoes das empresas -> posicoes #include 'FWCommand.CH'
    aSM0    := FWLoadSM0()

    For nX := 1 To Len( aSM0 )
        If     aSM0[nX][SM0_GRPEMP] == cEmpAnt .And. ;
            RTrim(aSM0[nX][SM0_CODFIL]) == RTrim(cFilVld)

            lRet    := .T.
            Exit
        EndIf
    Next

    If .Not. lRet
        //MVC precisa obrigatoriamente usar a função Help
        Help('',1,'VldFilial',,'Filial '+cFilVld+' NÃO existe no sistema.',1)
    EndIf

Return lRet

Olá Cirilo, Obrigada seu exemplo também me deu uma base de como fazer.

User Function zEMP()

Local aArea := GetArea()

Local lRet := .T.

Local cCodFil := ""

Local cCamp := Alltrim(M->ZZH_CODEMP)

Local aSm0 := FWLoadSM0()

Local nPos := Ascan(aSM0,{|x| Alltrim(x[2]) == Alltrim(cCamp)})

IF (nPos > 0)

cCodFil := aSm0[nPos][02]

MsgAlert("Filial Existe"+cCodFil)

ELSEIF cCamp == "*"

ELSE

Help('',1,'VldFilial',,'Filial '+cCodFil+' NÃO existe no sistema.',1) lRet := .F. ENDIF

RestArea(aArea)

Return (lRet)