No vídeo de hoje, vamos demonstrar em como buscar a alíquota de um estado do parâmetro MV_ESTICM.
A dúvida de hoje, nos perguntaram, como buscar o valor da alíquota de um estado do parâmetro MV_ESTICM, já que ele não possui separadores (como ponto e vírgula, pipe, entre outros).
Pensando nisso, montamos esse exemplo, onde vamos demonstrar em como encontrar a posição que esta o estado e pegar o valor em seguida, até a próxima letra.
Segue abaixo o vídeo exemplificando:
E abaixo o código fonte desenvolvido:
//Bibliotecas
#Include "TOTVS.ch"
/*/{Protheus.doc} zVid0118
Demonstração de como buscar alíquotas de estados no parâmetro MV_ESTICM
@type user function
@author Atilio
@since 29/01/2024
/*/
User Function zVid0118()
Local aArea := FWGetArea()
Local cEstado := Upper(Alltrim(FWInputBox("Digite a sigla do estado")))
Local nValor := 0
Local cTexto := ""
//Se tiver estado preenchido e for dois caracteres
If ! Empty(cEstado) .And. Len(cEstado) == 2
//Busca a alíquota
nValor := u_zGetICMS(cEstado)
//Mostra o resultado em uma mensagem
cTexto := FormatStr("Para o estado %c a alíquota é de %n", {cEstado, nValor})
FWAlertInfo(cTexto, "Teste Alíquota")
EndIf
FWRestArea(aArea)
Return
/*/{Protheus.doc} zGetICMS
Função que retorna a alíquota do estado
@type user function
@author Atilio
@since 29/01/2024
@param cEstado, Caractere, Sigla do Estado a ser procurada no parâmetro MV_ESTICM
@return nValor, Numérico, Valor da alíquota
@example
nValor := u_zGetICMS("SP")
/*/
User Function zGetICMS(cEstado)
Local aArea := FWGetArea()
Local cParam := Alltrim(GetMV("MV_ESTICM"))
Local nPosIni := 0
Local nPosFim := 0
Local nValor := 0
//Se o estado procurado esta no parâmetro
If cEstado $ cParam
//Pega a posição e inicial e + 2 caracteres devido ao tamanho da sigla
nPosIni := At(cEstado, cParam) + 2
//Percorre o restante do parâmetro
For nPosFim := nPosIni To Len(cParam)
//Se for caractere, sai do laço para pegar só os numéricos
If IsAlpha(SubStr(cParam, nPosFim, 1))
nPosFim--
Exit
EndIf
Next
//Pega o Valor
nQuantidade := (nPosFim-nPosIni) + 1
nValor := Val(SubStr(cParam, nPosIni, nQuantidade))
EndIf
FWRestArea(aArea)
Return nValor
Bom pessoal, por hoje é só.
Abraços e até a próxima.