Histórico da Página
...
| Produto: | Microsiga Protheus® | |||||||||||||||||||||
| Ambiente: | Faturamento (SIGAFAT) | |||||||||||||||||||||
| Ocorrência: | Exemplificação de comportamento | da exclusão deao 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 | preenchapossuam o número de série | na emissão da nota.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:
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. | 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 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: 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: O pedido de venda será acessado e alterado para estornar as liberações, liberando os dois empenhos acima citados: 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: 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 | ||||||
|---|---|---|---|---|---|---|
| ||||||
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 |
| title | Importante! |
|---|









