Árvore de páginas


Especificação do Uso da Soma1 para Pedido de Venda e Documentos de Saída usados no Módulo Faturamento

Produto:Microsiga Protheus®
Ambiente:Faturamento (SIGAFAT)
Ocorrência:Exemplificação do Uso da Função Soma1 e Exemplo de Funções Auxiliares
Passo a passo:

A função Soma1() é comumente utilizada nas rotinas do modulo Faturamento, como por exemplo no controle de numeração dos item de um pedido de Venda ou de um Documento de Saída. Possuindo a documentação própria:

E a documentação a respeito de sua limitação:

Visando um melhor entendimento de seu funcionamento trouxemos o exemplo abaixo de como o incremento de valor nesta é feito, usando como base o tamanho de dois caracteres (mesmo tamanho usado nos itens do pedido de venda e no documento de saída).

Exemplo: 

Soma1
User Function Exemplo()
	
	Local cValor	:= "00"
	Local nX		:= 0
    Local nY        := 0
    Local cMessage  := ""
    Local aValores  := {}
    
	For nX := 1 To 150
		cValor := Soma1(cValor)
        aadd(aValores, {nX, cValor})
	Next nX
    For nY := 1 To 30
        cMessage += "|" + AllTrim(Str(aValores[nY][1])) + " --> " +  aValores[nY][2] + "|   "
        cMessage += "|" + AllTrim(Str(aValores[nY+30][1])) + " --> " +  aValores[nY+30][2] + "|   "
        cMessage += "|" + AllTrim(Str(aValores[nY+60][1])) + " --> " +  aValores[nY+60][2] + "|   "
        cMessage += "|" + AllTrim(Str(aValores[nY+90][1])) + " --> " +  aValores[nY+90][2] + "|   "
        cMessage += "|" + AllTrim(Str(aValores[nY+120][1])) + " --> " +  aValores[nY+120][2] + "|   "
        cMessage += CRLF
    Next nY

Return MsgInfo( cMessage, "Soma1 - Exemplo" )

Veja que o resultado apresenta um valor alfanumérico para as numerações que superam 99, isso ocorre pois a variável cValor é um caracter com tamanho 2.

Pode lhe interessar:

Por vezes há a necessidade de consultar a numeração de um item do pedido ou da nota conforme mencionamos, para tal segue exemplo de uma função na qual ao receber o valor do item (em formato caracter) faz a devolução do numero correspondente a esta expressão alfanumérica. 

Retorna Valor do Soma1
User Function RetVlSoma1(cValor)

    Local aArea     := GetArea()
    Local nValor    := 0
    Local nAtual    := 0
    Local nPosIni   := 0
    Local nValAux   := 0
    Local lSoNumero := .T. //Indica se o cValor é composto apenas de números
    Local cAscII    := ""
    Local cCaract   := ""
    Local cZeros    := ""
    Local nTamValor := 0

    Default cValor  := ""

    cValor := Upper(cValor) // Obs: Se atentar se o uso da Soma1 esta utilizando o terceiro parâmetro (lSomaLow)
    nTamValor := Len(cValor) //Carrega o tamanho da expressão

    //Percorre os caracteres do cValor até localizar o primeiro caractere
    For nAtual := 1 To nTamValor
        cCaract := SubStr(cValor, nAtual, 1)
         
        //Se tiver alguma letra
        If cCaract $ "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
            If nPosIni == 0
                nPosIni := nAtual
            EndIf
            lSoNumero := .F.
            
            Exit
        Else
            If nAtual == nTamValor .And. lSoNumero //Se tiver somente numero, converte com Val
                nValor := Val(cValor)
            EndIf
        EndIf
    Next

    If !lSoNumero      
        //Percorre os valores
        For nAtual := 1 To nTamValor
            cCaract := SubStr(cValor, nAtual, 1)
            cZeros  := Replicate("0", nTamValor-nAtual)
             
            //Se tiver alguma letra no numero
            If cCaract $ "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
                cAscII := cValToChar(Asc(cCaract) - 64 + 9)
                 
                //Se for a partir da segunda posição e não for a última
                If nAtual > nPosIni .And. nAtual != nTamValor
                    nValAux := Val(cAscII + cZeros) + Iif(nAtual != nTamValor, 26 * (Asc(cCaract) - 64), 0)
                    nValAux *= Val(cAscII)
                    nValAux += (26 + Val(cAscII))
                    nValor += nValAux
                     
                Else
                    nValor += Val(cAscII + cZeros) + Iif(nAtual != nTamValor, 26 * (Asc(cCaract) - 64), 0)
                EndIf
             
            //Se for somente números
            Else
                //Se for a partir da segunda posição e não for a última
                If nAtual > nPosIni .And. nAtual != nTamValor
                    nValor += Val(cCaract + cZeros) + (36 * 26) + (26*Val(cCaract))
                Else
                    nValor += Val(cCaract + cZeros)
                EndIf
            EndIf
        Next        
    EndIf
     
    RestArea(aArea)
Return nValor

Importante!

Os exemplos contidos nesta documentação são construídos via User Function, logo se tratam de customizações. Sua utilização/aplicação é opcional, assim como a possibilidade de alteração do comportamento desenhado nestes exemplos. Portanto qualquer alteração e manutenção destes exemplos em seu ambiente são de responsabilidade própria de quem fez sua aplicação.