Árvore de páginas

AVISO

É possível executar este processo somente quando a montagem de volumes for efetuada manualmente no WMS Protheus, via rotina Montagem de Volumes.

CONTEÚDO

01. VISÃO GERAL

É possível utilizar através de forma customizada as informações de volumes montados no WMS Protheus, para impressão na Nota Fiscal quando no faturamento.

Por padrão, as informação do Pedido são replicadas para os campos da Nota Fiscal, porém, quando se faz a montagem de volumes no WMS Protheus esta informação não é gravada no Pedido, por este permitir liberações parciais, distorcendo assim as informações reais dos volumes faturados numa liberação parcial.

Sendo assim existem dois Pontos de Entrada do faturamento que podem ser utilizados para realizar esta gravação:

  • MTASF2 - Geração de registros em SF2

Este Ponto de Entrada é chamado após a gravação dos dados principais da Nota Fiscal, porém, antes da gravação das informações de volumes e deve manipular o array Private aEspVol que alimentará os campos da Nota Fiscal.

  • SF2460I - Atualização das tabelas referentes à nota fiscal

Este Ponto de Entrada é chamado após a gravação de todas as informação da Nota Fiscal e deve alterar diretamente os campos da tabela de Nota Fiscal (SF2).

02. EXEMPLO

Exemplo
#include "protheus.ch"

// Este ponto de entrada grava um array do tipo Private que irá gravar os volumes da nota fiscal
User Function MTASF2()
Local aVolumes := QtdVolSF2()
   If Len(aVolumes) > 0
      // Caso queira limpar os volumes calculados no padrão
      // aEspVol := {}
      If Len(aEspVol) >= 1
         aEspVol[1] := aVolumes
      Else
         Aadd(aRet, aVolumes)
      EndIf
   EndIf
Return

// Este ponto de entrada deve gravar diretamente na tabela SF2 nos campos correspondentes
User Function SF2460I()
Local aVolumes := QtdVolSF2()
   If Len(aVolumes) > 0
      RecLock("SF2",.F.)
      SF2->F2_ESPECI1 := aVolumes[1]
      SF2->F2_VOLUME1 := aVolumes[2]
      SF2->(MsUnLock())
   EndIf
Return

Static Function QtdVolSF2()
Local aAreaAnt  := GetArea()
Local cQuery    := ""
Local cAliasQry := GetNextAlias()
Local aRet      := {}

   cQuery = "SELECT count(DISTINCT DCV_CODVOL) AS DCV_QTDVOL"
   cQuery+=  " FROM "+RetSqlName("SC9")+" SC9"
   cQuery+= " INNER JOIN "+RetSqlName("DCV")+" DCV"
   cQuery+=    " ON DCV.DCV_FILIAL = '"+xFilial("DCV")+"'"
   cQuery+=   " AND DCV.DCV_PEDIDO = SC9.C9_PEDIDO"
   cQuery+=   " AND DCV.DCV_ITEM = SC9.C9_ITEM"
   cQuery+=   " AND DCV.DCV_SEQUEN = SC9.C9_SEQUEN"
   cQuery+=   " AND DCV.DCV_PRDORI = SC9.C9_PRODUTO"
   cQuery+=   " AND DCV.D_E_L_E_T_ = ' '"
   cQuery+= " WHERE SC9.C9_FILIAL  = '"+xFilial("SC9")+"'"
   cQuery+=   " AND SC9.C9_NFISCAL = '"+SF2->F2_DOC+"'"
   cQuery+=   " AND SC9.C9_SERIENF = '"+SF2->F2_SERIE+"'"
   cQuery+=   " AND SC9.D_E_L_E_T_ = ' '"

   DbUseArea(.T.,'TOPCONN',TcGenQry(,,cQuery),cAliasQry,.F.,.T.)
   TcSetField(cAliasQry,'DCV_QTDVOL','N',10,0)
   If (cAliasQry)->(!Eof()).And. (cAliasQry)->DCV_QTDVOL > 0)
      // Supondo que a espécie seja caixas
      Aadd(aRet, {"CAIXA", (cAliasQry)->DCV_QTDVOL})
   EndIf
   (cAliasQry)->(dbCloseArea())
   RestArea(aAreaAnt)
Return aRet

03. ASSUNTOS RELACIONADOS

Pontos de Entrada

04. ANEXO - PDF