Exclusão de Documento de Saída com a opção "Apto a faturar", restaurando empenho do produto endereçado com número de série.

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:

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:

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

Em nenhum dos pedidos foi infomado 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 disposníveis:

Conforme os pedidos forem faturados, os registros empenhados serão excluído 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.


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. 

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

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.