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)