Árvore de páginas

Versões comparadas

Chave

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

...

infomado disposníveis excluído " alterdo

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:

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 Modified

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

Image Modified

Image Modified

Image Modified

Image Modified

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 Modified

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 Modified

O pedido de venda será acessado e

alterado para estornar as liberações, liberando os dois empenhos acima citados:

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

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. 

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.