Como pegar uma alíquota do MV_ESTICM via AdvPL | Ti Responde 0118

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.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

Deixe uma resposta

Terminal de Informação