Árvore de páginas

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

...

da exclusão de preencha na emissão da nota.

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. 

Produto:Microsiga Protheus®
Ambiente:Faturamento (SIGAFAT)
Ocorrência:Exemplificação de comportamento ao excluir um Documento de Saída com a opção "Apto à faturar", contendo produtos que possuam controle de Lote e endereçamento, mas que não possuam o número de série preenchidos nos campos D2_NUMSER/C6_NUMSERI
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: 

Bloco de código
languagejs
titleSoma1
linenumberstrue
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.

Image Removed

O produto utilizado possui controle de lote e endereçamento, e para melhor exemplificação, demonstraremos uma situação hipotética.

Exemplo: o produto "BRU001" possui um estoque com 4 unidades, sendo que todas estão devidamente endereçadas e com numerações de série:

Image Added

Foram criados 2 Pedidos de venda, sendo que o primeiro receberá 2 itens deste produto e o outro pedido, os outros 2 itens:

Image Added

Image Added

Image Added

Image Added

Em nenhum dos pedidos foi informado a numeração de série. Sendo assim, a medida que os pedidos forem faturados, o sistema empenhará os produtos na ordem de disponibilização que as numerações de séries estiverem disponíveis:

Image Added

Conforme os pedidos forem faturados, os registros empenhados serão excluídos porque foram consumidos na geração do documento de saída. Ao excluir o Documento de Saída com a opção "Apto à faturar", a rotina irá reinserir os registros na rotina de "Saldos por Endereço" novamente. Sendo assim, será excluída somente a primeira nota. Os registros que foram recuperados foram referentes ao primeiro pedido:

Image Added

O pedido de venda será acessado e alterado para estornar as liberações, liberando os dois empenhos acima citados:

Image Added

Desta forma, os registros estão liberados para empenho caso um novo pedido seja incluído ou alguma nova liberação do pedido de venda seja feita. Agora, o segundo documento de saída será excluído com a opção "Apto à faturar". Ou seja, será gerada uma nova liberação ao pedido de venda para que fique apto a faturar e como não foi informada nenhuma numeração de série no Pedido de Venda e no Documento de Saída (D2_NUMSER/C6_NUMSERI), a rotina disponibilizará a alocação das primeiras numerações de série disponíveis para o lote mencionado, sendo as primeiras numerações de série, conforme a imagem abaixo:

Image Added


Observação: Caso queira que o Pedido de Venda e o Documento de Saída contenha algum de seus itens vinculados a uma numeração de série específica, será necessário incluir esta informação no campo "Número de Serie" no Pedido de Venda (C6_NUMSERI) e, respectivamente no Documento de Saída (D2_NUMSER). Desta forma, ao excluir o Documento de Saída, o produto sempre será vinculado a numeração de série especificada. 

Pode lhe interessar:
Bloco de código
languagejs
titleRetorna Valor do Soma1
linenumberstrue
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
Informações
titleImportante!
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.