Você está na página 1de 68

#INCLUDE 'PROTHEUS.

CH'
#INCLUDE 'APVT100.CH'

/*ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
±±ÉÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍ»±±
±±ºPrograma ³VIXA063 ºAutor ³Ihorran Milholi º Data ³ 09/10/13 º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºDesc. ³Rotina de conferencia via coletor de dados º±±
±±º ³ º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºUso ³SIGAWMS º±±
±±ÈÍÍÍÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ±±
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß*/
User Function VIXA063(lRadioF,cStatRF)

Local aAreaAnt := GetArea()


Local aAreaSDB := SDB->(GetArea())
Local lRet := .t.
Local cLoteAConf := Space(Len(SDB->DB_DOC))
Local cEndereco := Space(Len(SDB->DB_LOCALIZ))
Local cWmsUMI := If(AllTrim(SuperGetMv('MV_WMSUMI',.F.,'0')) ==
'5','3',AllTrim(SuperGetMv('MV_WMSUMI',.F.,'0')))
Local lDigita := (SuperGetMV('MV_DLCOLET',.F.,'N') == 'N')
Local cStatExec := SuperGetMV('MV_RFSTEXE',.F.,'1') //-- DB_STATUS indincando
Atividade Executada

//Variaveis para controle do produto na conferencia


Local aRecSDB := {}
Local aPrdSYS := {}
Local aLoteSYS := {}
Local nPos := 0
Local nPos2 := 0
Local nPosEti := 0
Local cProduto := ""
Local cDescPro := ""
Local cDescPr2 := ""
Local nConver := 0
Local cNorma := ""
Local nLinha := 0
Local nQtde := 0
Local nQtdAvar := 0
Local cDscUM := ""
Local cPictQt := ""
Local cLoteCtl := ""
Local aEtBurra := {}
Local cEtBurra := ""
Local lRetrab := .f.
Local cIDOPera := ""
Local nQtdNorma := 0
Local nQtdNorma2 := 0
Local cStage := ""
Local aAvarias := {}
Local cLote := Space(TamSx3("DB_LOTECTL")[1])
Local nQtdEnder := 0
Local lLiberEnd := .f.
Local nQtdeEti := 0
Local cIdMovto := ""
Local cServErro := AllTrim(GetNewPar("MV_YSRVERR","015"))
Local nQtdConfNor := 0
Local i := 0
Private cCadastro := 'Conferencia'
Private lWmsLote := SuperGetMv('MV_WMSLOTE',.F.,.F.)
Private cDocto := SDB->DB_DOC
Private cSerie := SDB->DB_SERIE
Private cOrigem := SDB->DB_ORIGEM
Private cServic := SDB->DB_SERVIC
Private cTarefa := SDB->DB_TAREFA
Private cAtivid := SDB->DB_ATIVID
Private cCliFor := SDB->DB_CLIFOR
Private cLoja := SDB->DB_LOJA
Private cRecHum := SDB->DB_RECHUM
Private cLocal := SDB->DB_LOCAL

//Destrava Registros SDB travado pela rotina DLGV001


MsUnlockAll()

//-- Atribui a funcao de JA CONFERIDOS a combinacao de teclas <CTRL> + <Q>


VTSetKey(17,{|| VA063JaConf(cDocto,aPrdSYS)},'Ja Conferidos')

//-- Atribui a funcao de LIBEREAR ETIQUETA PARA ENDEREÇAMENTO a combinacao de


teclas <CTRL> + <L>
VTSetKey(12,{|| VA063LibVol(cDocto,@aEtBurra,aRecSDB,@aPrdSYS)},'Liberar Volume')

//Verifica se é possivel inicia esta conferencia


lRet :=
VA063TravaReg(cServic,cDocto,cSerie,cCliFor,cLoja,cOrigem,cServic,cTarefa,cAtivid,@
aRecSDB)

//Valida parametro MV_WMSUMI


If lRet .and. !(cWmsUMI $ '0ú1ú2ú3ú4')
DLVTAviso('VIXA063','Parametro MV_WMSUMI incorreto...')
lRet := .F.
RestArea(aAreaSDB)
RestArea(aAreaAnt)
EndIf

//-- Indica ao operador o endereco de origem da conferencia


If lRet

DLVTCabec(,.F.,.F.,.T.)
DLVEndereco(0,0,SDB->DB_LOCALIZ,SDB->DB_LOCAL,,,'Va para o Endereco')

lRet := VA063ESC(aRecSDB)

EndIf

//Confirma o endereço de origem


If lRet

While lRet .and. Empty(cEndereco)

DLVTCabec(,.F.,.F.,.T.)
@ 02,00 VTSay PadR('Endereco',VTMaxCol())
@ 03,00 VTSay PadR(SDB->DB_LOCALIZ,VTMaxCol())
@ 05,00 VTSay PadR('Confirme !',VTMaxCol())
@ 06,00 VTGet cEndereco Pict '@!' Valid VA063End(SDB-
>DB_LOCALIZ,@cEndereco,cLocal)
VTRead

lRet := VA063ESC(aRecSDB,"C",@cEndereco)

EndDo

EndIf

//Confirma o codigo do lote de conferencia ou de retrabalho


If lRet

While lRet .and. Empty(cLoteAConf)

DLVTCabec(,.F.,.F.,.T.)
@ 01,00 VTSay PadR('LOTE '+SDB->DB_DOC,VTMaxCol())
@ 02,00 VTGet cLoteAConf Picture '@!' Valid(iif(cLoteAConf==SDB-
>DB_DOC,.t.,.f.))
VTRead

lRet := VA063ESC(aRecSDB,"C",@cLoteAConf)

EndDo

EndIf

// Conta os produtos e preenche o array aPrdSYS


If lRet
lRet := VA063LoadEtq(aRecSDB,@aPrdSYS,@aLoteSYS,@aEtBurra)
EndIf

//LEANDRO REMOVER
//cTxtArraySDB := ArrTokStr(aRecSDB)
//cTxtPrdSYS := ArrTokStr(aPrdSYS)

//Inicia a conferencia da mercadoria


If lRet

//-- Inicio da contagem de produtos


While lRet

If lDigita
cProduto := Space(Len(SDB->DB_PRODUTO))
Else
If Len(SB1->B1_CODBAR) > 48
cProduto := Space(Len(SB1->B1_CODBAR))
Else
cProduto := Space(48) //-- Tamanho minimo da Etiqueta
EndIf
EndIf

//Apaga valores das variaveis


cDescPro := ""
cDescPr2 := ""
cNorma := ""
nConver := 0
nQtde := 0
nQtdAvar := 0
cDscUM := ""
cPictQt := ""
cLoteCtl := Space(TamSx3("DB_LOTECTL")[1])
cEtBurra := Space(TamSx3("ZS_CODIGO")[1]+1)
lRetrab := .f.
cIDOPera := ""
cEtSugest := ""
cStage := ""
lLiberEnd := .f.
cIdMovto := ""
nQtdNorma := 0
nQtdConfNor := 0
nQtdNorma2 := 0

//-- Escolha do Produto a ser Conferido


DLVTCabec(,.F.,.F.,.T.)
@ 01,00 VTSay PadR('Produto',VTMaxCol())
@ 02,00 VTGet cProduto Picture '@!' Valid
VA063Prd(aPrdSYS,@cProduto,@cDescPro,@cDescPr2,@nConver,@cNorma,@cDscUM,@cPictQt,@c
LoteCtl,@nQtdNorma,@nQtdNorma2,@lRetrab,@cIDOPera,@cStage,@cIdMovto)
VTRead

lRet := VA063ESC(aRecSDB,"C",@cProduto)

If lRet .and. Empty(cProduto)


Loop
EndIf

If lRet .And. lWmsLote .And. Rastro(cProduto) .And. aScan(aLoteSYS,


{|x| x[1] == cProduto}) > 0

@ 04,00 VTSay PadR('Lote',VTMaxCol())


@ 05,00 VTGet cLoteCtl Picture PesqPict('SDB','DB_LOTECTL') When
Empty(cLoteCtl) Valid VA063Lot(aLoteSYS,cProduto,@cLoteCtl)
VTRead

lRet := VA063ESC(aRecSDB,"C",@cLoteCtl)

If lRet .and. Empty(cLoteCtl)


Loop
EndIf

EndIf

If lRet

If lRetrab

nPos := aSCan(aEtBurra,{|x| x[3] == lRetrab})

If nPos > 0

cEtSugest := Alltrim(aEtBurra[nPos][1])

EndIf

ElseIf nQtdNorma == 0

nPos := aScan(aEtBurra,{|x| x[4][1][1] == cProduto})


If nPos > 0
cEtSugest := Alltrim(aEtBurra[nPos][1])

EndIf

ElseIf nQtdNorma > 0 .and. Empty(cStage)

For i := 1 to Len(aEtBurra)

If Empty(aEtBurra[i][2])

nPos := aSCan(aEtBurra[i][4],{|x| x[1] ==


cProduto .and. x[2] < nQtdNorma .and. x[3] == cIdOpera})

If nPos > 0

cEtSugest := Alltrim(aEtBurra[i][1])
nQtdConfNor := aEtBurra[i][4][nPos][2]
Exit

EndIf

EndIf

Next

Else

nPos := aSCan(aEtBurra,{|x| x[2] == cStage})

If nPos > 0

cEtSugest := Alltrim(aEtBurra[nPos][1])
nPos2 := aSCan(aEtBurra[nPos][4],{|x| x[1] ==
cProduto .and. x[2] < nQtdNorma .and. x[3] == cIdOpera})

If nPos2 > 0

nQtdConfNor := aEtBurra[nPos][4][nPos2][2]

EndIf

EndIf

EndIf

If !Empty(cEtSugest)

DLVTCabec('Associe a Etiqueta',.F.,.F.,.T.)
@ 01, 00 VTSay PadR(cProduto ,VTMaxCol())
@ 02, 00 VTSay PadR('Etiqueta' ,VTMaxCol())
@ 03, 00 VTSay PadR(cEtSugest ,VTMaxCol())
@ 05, 00 VTSay PadR('Confirme!' ,VTMaxCol())
@ 06, 00 VTGet cEtBurra Pict '@!' Valid
VA063EtBurra(1,@cEtBurra,aEtBurra,cEtSugest)
VTRead

Else
//-- Escolha do Produto a ser Conferido
DLVTCabec(,.F.,.F.,.T.)
@ 01,00 VTSay PadR('Etiqueta Burra',VTMaxCol())
@ 02,00 VTGet cEtBurra Picture "@!" Valid
VA063EtBurra(1,@cEtBurra,aEtBurra,cEtSugest)
VTRead

EndIf

lRet := VA063ESC(aRecSDB,"C",@cEtBurra)

If lRet .and. Empty(cEtBurra)


Loop
EndIf

EndIf

If lRet

//-- Exibe informações para conferencia


nLinha := 0

DLVTCabec(,.F.,.F.,.T.)

nLinha++; @ nLinha,00 VTSay


PadR('Cod.:'+AllTrim(cProduto),VTMaxCol())
nLinha++; @ nLinha,00 VTSay
PadR('Desc:'+AllTrim(cDescPro),VTMaxCol())

If !Empty(cDescPr2)
nLinha++; @ nLinha,00 VTSay PadR(cDescPr2,VTMaxCol())
EndIf

If nQtdNorma <> nQtdNorma2

If lWmsLote .And. Rastro(cProduto)

nPos := aScan(aPrdSYS,{|x| x[1] == cProduto .and.


x[2] == cLoteCtl})

Else

nPos := aScan(aPrdSYS,{|x| x[1] == cProduto})

EndIf

If aPrdSYS[nPos][4] < nQtdNorma

nLinha++; @ nLinha,00 VTSay PadR("Fracionado:


"+AllTrim(Transform(nQtdNorma,PesqPict('SDB','DB_QUANT'))),VTMaxCol())

EndIf

EndIf

nLinha++; @ nLinha,00 VTSay PadR('Emb.:'+AllTrim(cDscUM)+" com


"+AllTrim(Transform(nConver,PesqPict('SB1','B1_CONV'))),VTMaxCol())
nLinha++; @ nLinha,00 VTSay
PadR('Norm:'+AllTrim(cNorma),VTMaxCol())
nLinha++; @ nLinha,00 VTSay PadR('Qtde '+cDscUM,VTMaxCol())
nLinha++; @ nLinha,00 VTGet nQtde Picture cPictQt Valid
VA063Qtd(@nQtde,nConver,cProduto,cLoteCtl,aPrdSYS,@nQtdNorma,cStage,cIDOPera,nQtdCo
nfNor)
VTRead

lRet := VA063ESC(aRecSDB,"N",@nQtde)

If lRet .and. nQtde == 0


Loop
EndIf

If lRet

If cOrigem == "Z54"

//-- Escolha do Produto a ser Conferido


DLVTCabec(,.F.,.F.,.T.)
@ 01,00 VTSay PadR('Emb.:'+AllTrim(cDscUM)+" com
"+AllTrim(Transform(nConver,PesqPict('SB1','B1_CONV'))),VTMaxCol())
@ 02,00 VTSay PadR('Qtde '+cDscUM+'
Avariada',VTMaxCol())
@ 03,00 VTGet nQtdAvar Picture cPictQt Valid
VA063AvarValid(@nQtdAvar,nQtde,aRecSDB)
VTRead

EndIf

EndIf

If lRet

//Transforma as quantidades em multiplos devido a embalagem


nQtde := nQtde*nConver
nQtdAvar := nQtdAvar*nConver

//Se o produto for retrabalho poderá ser aglutinado em


apenas uma etiqueta
//Se o produto for pulmão só poderá ter um produto na
etique e esta não poderá ultrapassar a norma
//Se o produto for stage a etiqueta poderá ser aglutina
podem entre estruturas fisicas
//Se não tiver seq. de abastecimento o produto poderá ter
mais de uma etiqueta porem não poderá ser aglutinado a outro produto

If nQtde == nQtdAvar

cEtSugest := ""

EndIf

EndIf

If lRet

If !Empty(cEtBurra)

//Inclui registros no vetor de controle de etiquetas


nPosEti := aScan(aEtBurra,{|x| x[1] ==
Alltrim(cEtBurra)})

If nPosEti == 0

aAdd(aEtBurra,
{Alltrim(cEtBurra),cStage,lRetrab,{}})

nPosEti := Len(aEtBurra)

EndIf

//Inclui registros no vetor


nPos := aScan(aEtBurra[nPosEti][4],{|x| x[1] ==
cProduto .and. x[3] == cIDOpera})

If nPos == 0
aAdd(aEtBurra[nPosEti][4],{cProduto,nQtde-
nQtdAvar,cIDOpera})
Else
aEtBurra[nPosEti][4][nPos][2] += nQtde-nQtdAvar
EndIf

EndIf

//Posiciona no vetor dos produtos em conferencia


nPos := aScan(aPrdSYS,{|x| x[1] == cProduto .and. x[2] ==
cLoteCtl})

aPrdSYS[nPos][4] += nQtde
aPrdSYS[nPos][5] += nQtdAvar

For z := 1 to Len(aPrdSYS[nPos][7])

SDB->(dbGoTo(aPrdSYS[nPos][7][z]))

nQtdeEti := 0

BEGIN TRANSACTION

If nQtde > 0

If SDB->DB_QUANT > SDB->DB_QTDLID

If nQtde > SDB->DB_QUANT-SDB-


>DB_QTDLID

nQtde -= SDB-
>DB_QUANT-SDB->DB_QTDLID
nQtdeEti := SDB->DB_QUANT-
SDB->DB_QTDLID

RecLock("SDB",.F.)
SDB->DB_QTDLID += SDB-
>DB_QUANT-SDB->DB_QTDLID
SDB->DB_DATA :=
dDataBase
SDB->DB_HRINI := Time()
SDB->(msUnlock())
Else

RecLock("SDB",.F.)
SDB->DB_QTDLID += nQtde
SDB->DB_DATA :=
dDataBase
SDB->DB_HRINI := Time()
SDB->(msUnlock())

nQtdeEti:= nQtde
nQtde := 0

EndIf

EndIf

EndIf

If nQtdAvar > 0

If SDB->DB_QUANT > SDB->DB_YQTAVAR

If nQtdAvar > SDB->DB_QUANT-SDB-


>DB_YQTAVAR

nQtdAvar -= SDB->DB_QUANT-
SDB->DB_YQTAVAR

RecLock("SDB",.f.)
SDB->DB_YQTAVAR += SDB-
>DB_QUANT-SDB->DB_YQTAVAR
SDB->DB_DATA :=
dDataBase
SDB->DB_HRINI := Time()
SDB->(msUnlock())

nQtdeEti-= nQtdAvar

Else

RecLock("SDB",.f.)
SDB->DB_YQTAVAR +=
nQtdAvar
SDB->DB_DATA :=
dDataBase
SDB->DB_HRINI := Time()
SDB->(msUnlock())

nQtdeEti -= nQtdAvar
nQtdAvar := 0

EndIf

EndIf

EndIf

//Indice da tabela SZS


//ZS_FILIAL+ZS_CODIGO+ZS_DOC+ZS_SERIE+ZS_CLIFOR+ZS_LOJA+ZS_ORIGEM+ZS_PROD+ZS_LOCAL+
ZS_LOTECTL+ZS_NUMLOTE

IF !Empty(cEtBurra)

//Inclui os registros para etiqueta burra


SZS->(dbSetOrder(3))
If SZS->(dbSeek(xFilial("SZS")+cEtBurra))
RecLock("SZS",.F.)
//Procura itens para aglutinar
ElseIf SZS->(dbSeek(xFilial("SZS")
+cEtBurra+SDB->DB_NUMSEQ+cIDOPera+cIdMovto+SDB->DB_IDDCF))
RecLock("SZS",.F.)
Else
RecLock("SZS",.T.)
EndIf

//Inclui os registros de etiqueta burra


SZS->ZS_FILIAL := xFilial("SZS")
SZS->ZS_CODIGO := cEtBurra
SZS->ZS_DOC := SDB->DB_DOC
SZS->ZS_SERIE := SDB->DB_SERIE
SZS->ZS_CLIFOR := SDB->DB_CLIFOR
SZS->ZS_LOJA := SDB->DB_LOJA
SZS->ZS_ORIGEM := SDB->DB_ORIGEM
SZS->ZS_PROD := SDB->DB_PRODUTO
SZS->ZS_LOTECTL := SDB->DB_LOTECTL
SZS->ZS_NUMLOTE := SDB->DB_NUMLOTE
SZS->ZS_QUANT += nQtdeEti
SZS->ZS_STATUS := "1"
SZS->ZS_LOCAL := SDB->DB_LOCAL
SZS->ZS_NUMSEQ := SDB->DB_NUMSEQ
SZS->ZS_IDDCF := SDB->DB_IDDCF
SZS->ZS_IDOPERA := cIDOPera
SZS->ZS_IDMOVTO := cIdMovto
SZS->(msUnLock())

//altera prioridade de convocacao de


acordo com a data e hora de liberação da etiqueta burra
u_VWMSPriorid(SDB->(Recno()),cIdMovto)

//Verifica regras de pulmão para liberar


o endereçamento
If nQtdNorma > 0 .and.
Empty(cStage) .and. !lRetrab

If SZS->ZS_QUANT ==
nQtdNorma //.or. SDB->DB_QUANT == SDB->DB_QTDLID

aPrdSYS[nPos][6] += SZS-
>ZS_QUANT

RecLock('SDB',.F.)
SDB->DB_YQTLIBE += SZS-
>ZS_QUANT
SDB->(MsUnLock())
RecLock('SZS',.F.)
SZS->ZS_STATUS := "2"
SZS->(MsUnLock())

//Elimina a etiqueta do vetor


de etiquetas
nPosEti := aScan(aEtBurra,{|
x| x[1] == cEtBurra})

aDel(aEtBurra,nPosEti)
aSize(aEtBurra,Len(aEtBurra)-
1)

EndIf

ElseIf nQtdNorma > 0 .and. !Empty(cStage)

//aPrdSYS[nPos][6] := SDB-
>DB_QTDLID-SDB->DB_YQTAVAR-SDB->DB_YQTLIBE

ElseIf nQtdNorma == 0

If SDB->DB_SERVIC ==
cServErro .and. SDB->DB_QUANT == SDB->DB_QTDLID .and. SDB->DB_QUANT == SZS-
>ZS_QUANT

aPrdSYS[nPos][6] := SDB-
>DB_QUANT

RecLock('SDB',.F.)
SDB->DB_YQTLIBE := SDB-
>DB_QUANT
SDB->(MsUnLock())

RecLock('SZS',.F.)
SZS->ZS_STATUS := "2"
SZS->(MsUnLock())

//cria serviço para


endereçamento
u_VA062CriaDCF(SDB->DB_QUANT)

//Elimina a etiqueta do vetor


de etiquetas
nPosEti := aScan(aEtBurra,{|
x| x[1] == cEtBurra})

aDel(aEtBurra,nPosEti)
aSize(aEtBurra,Len(aEtBurra)-
1)

EndIf

EndIf

EndIf

END TRANSACTION
// Verifica se a conf do produto foi finalizada
If ( SDB->DB_QUANT - SDB->DB_QTDLID ) == 0
DLVTCabec("CONFERENCIA TOTAL",.F.,.F.,.T.)
@ 01,00 VTSay 'PRODUTO: '
@ 02,00 VTSay SDB->DB_PRODUTO
DLVTRodaPe()
End If

//Força a saida do FOR


If nQtde == 0 .and. nQtdAvar == 0
Exit
EndIf

Next

EndIf

EndIf

EndDo

//-- Destrava os Registros Utilizados


dbSelectArea("SDB")
MaDestrava(aRecSDB)

EndIf

Return(lRet)

/*ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
±±ÉÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍ»±±
±±ºPrograma ³VA063ESC ºAutor ³Ihorran Milholi º Data ³ 09/10/13 º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºDesc. ³Verifica se o conferente ira abandonar a rotina TECLAR ESC º±±
±±º ³ º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºUso ³SIGAWMS º±±
±±ÈÍÍÍÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ±±
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß*/
Static Function VA063ESC(aRecSDB,xTipo,xParam)

Local lRet := .f.


Local nOpc := 0
Default xTipo := "C"
Default xParam := ""

//Verifica se o ultimo botão foi ESC


If VTLastKey() == 27

DLVTCabec(,.F.,.F.,.T.)
@ 01,00 VTSay PadR('MENU CONFERENCIA',VTMaxCol())
@ 03,00 VTSay PadR('1 - RETORNAR',VTMaxCol())
@ 04,00 VTSay PadR('2 - FINALIZAR',VTMaxCol())
@ 05,00 VTSay PadR('3 - TROCAR CONFERENCIA',VTMaxCol())
@ 06,00 VTSay PadR('4 - ABANDONAR',VTMaxCol())
@ 07,00 VTGet nOpc Picture "9" Valid (nOpc > 0 .and. nOpc < 5)
VTRead
Do Case

Case nOpc == 1

lRet := .t.

//Zera parametros digitados anteriormente


Do Case
Case xTipo == "C"; xParam := Space(Len(xParam))
Case xTipo == "N"; xParam := 0
EndCase

Case nOpc == 2; lRet := VA063FinConf(aRecSDB)

Case nOpc == 3; VA063TrocaLote(aRecSDB,@lRet)

Case nOpc == 4; VA063Abandona(aRecSDB,"000001",@lAbandona,@lRet)

OtherWise; lRet := .t.

EndCase

Else

lRet := .t.

EndIf

Return(lRet)

/*ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
±±ÉÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍ»±±
±±ºPrograma ³VA063AbandºAutor ³Ihorran Milholi º Data ³ 09/10/13 º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºDesc. ³Verifica se o conferente ira abandonar a rotina TECLAR ESC º±±
±±º ³ º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºUso ³SIGAWMS º±±
±±ÈÍÍÍÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ±±
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß*/
Static Function VA063Abandona(aRecSDB,cOcorr,lAbandona,lRet)

Local nCont := 0
Local cStatAExe := SuperGetMV('MV_RFSTAEX',.F.,'4') //-- DB_STATUS
indincando Atividade A Executar

Default cOcorr := ""


Default lAbandona := .t.
Default lRet := .f.

If !Empty(cOcorr)

//Seta o primeiro registro a conferir


SDB->(dbGoTo(aRecSDB[1][2]))

//Chama rotina para verificar a autorização do lider


If u_VIXA065(SDB->DB_DOC,SDB->DB_ORIGEM,cOcorr)
lAbandona := .t.
lRet := .f.
Else
lAbandona := .f.
lRet := .t.
EndIf

EndIf

If lAbandona

//Percorre os registros para verificar se já houve alguma contagem


For i := 1 to Len(aRecSDB)

//Seta no registro a conferir


SDB->(dbGoTo(aRecSDB[i][2]))

If SDB->DB_QTDLID > 0
nCont++
EndIf

Next

//Caso não tenha ocorrido nenhuma contagem libera o registro para outro
conferente
If nCont == 0

For i := 1 to Len(aRecSDB)

//Seta no registro a conferir


SDB->(dbGoTo(aRecSDB[i][2]))

RecLock('SDB',.F.)
SDB->DB_RECHUM := ""
SDB->DB_STATUS := cStatAExe
SDB->DB_HRINI := ""
SDB->(msUnLock())

Next

EndIf

EndIf

Return

/*ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
±±ÉÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍ»±±
±±ºPrograma ³VA063TrocaºAutor ³Ihorran Milholi º Data ³ 09/10/13 º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºDesc. ³Valida novo LOTE de conferencia º±±
±±º ³ º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºUso ³SIGAWMS º±±
±±ÈÍÍÍÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ±±
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß*/
Static Function VA063TrocaLote(aRecSDB,lRet)

Local lRet := .t.


Local cAlias := GetNextAlias()
Local cDocto := Space(Len(SDB->DB_DOC))

//Chama rotina para abandonar a conferencia que esta sendo executada


VA063Abandona(aRecSDB,"000002",,@lRet)

If !lRet
//Chama tela para escolha do novo lote
DLVTCabec(,.F.,.F.,.T.)
@ 01,00 VTSay PadR("NOVO LOTE",VTMaxCol())
@ 02,00 VTGet cDocto Picture '@!' Valid VA063ValTroca(@cDocto)
VTRead
EndIf

Return

/*ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
±±ÉÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍ»±±
±±ºPrograma ³VA063TrocaºAutor ³Ihorran Milholi º Data ³ 09/10/13 º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºDesc. ³Verifica se o conferente ira mudar de LOTE de conferencia º±±
±±º ³ º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºUso ³SIGAWMS º±±
±±ÈÍÍÍÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ±±
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß*/
Static Function VA063ValTroca(cDocto)

Local lRet := .t.


Local cAlias := GetNextAlias()
Local cSerie := Space(Len(SDB->DB_SERIE))
Local cOrigem := SDB->DB_ORIGEM
Local cServic := SDB->DB_SERVIC
Local cTarefa := SDB->DB_TAREFA
Local cAtivid := SDB->DB_ATIVID
Local cCliFor := SDB->DB_CLIFOR
Local cLoja := SDB->DB_LOJA
Local cRecHum := __cUserID
Local lRadioF := (SuperGetMV('MV_RADIOF')=='S') //-- Como Default o parametro
MV_RADIOF e verificado
Local cStatRF := '1' //-- Como
Default a radio frequencia VAI gerar movimentos no SDB SEM atualizar estoque

//Verifica a existencia do documento para conferencia


//Query para recuperar todos os itens a executar conferencia
BeginSql Alias cAlias

SELECT TOP 1 SDB.R_E_C_N_O_ RECSDB

FROM %table:SDB% SDB

WHERE SDB.DB_FILIAL = %xFilial:SDB%


AND SDB.DB_ESTORNO = %Exp:''%
AND SDB.DB_ATUEST = %Exp:'N'%
AND SDB.DB_DOC = %Exp:cDocto%
AND SDB.DB_TAREFA = %Exp:cTarefa%
AND SDB.DB_ATIVID = %Exp:cAtivid%

AND ( SDB.DB_RECHUM = %Exp:cRecHum%


OR SDB.DB_RECHUM = %Exp:''%)

AND SDB.%NotDel%

EndSql

(cAlias)->(dbGoTop())

//Percorre todos os itens


If (cAlias)->(!Eof())

//Seta no registro a conferir


SDB->(dbGoTo((cAlias)->RECSDB))

//Chama rotina de conferencia via coletor


/*lRet := */u_VIXA063(lRadioF,cStatRF)

Else

lRet := .f.
cDocto := Space(Len(SDB->DB_DOC))
DLVTAviso('VA063ValTroca',"LOTE INCORRETO")

EndIf

//Elimina a area de trabalho


(cAlias)->(dbCloseArea())

Return(lRet)

/*ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
±±ÉÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍ»±±
±±ºPrograma ³VA063FinC ºAutor ³Ihorran Milholi º Data ³ 09/10/13 º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºDesc. ³Rotina para finalização da conferencia º±±
±±º ³ º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºUso ³SIGAWMS º±±
±±ÈÍÍÍÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ±±
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß*/
Static Function VA063FinConf(aRecSDB)

Local i
Local j

Local cStatExec := SuperGetMV('MV_RFSTEXE',.F.,'1') //-- DB_STATUS


indincando Atividade Executada
Local cStatProb := SuperGetMV('MV_RFSTPRO',.F.,'2') //-- DB_STATUS
indincando Atividade com Problemas
Local cStatAuto := SuperGetMV('MV_RFSTAUT',.F.,'A') //-- DB_STATUS indincando
Atividade Automatica
Local cStatAExe := SuperGetMV('MV_RFSTAEX',.F.,'4') //-- DB_STATUS
indincando Atividade A Executar
Local cStatManu := SuperGetMV('MV_RFSTMAN',.F.,'M') //-- DB_STATUS
indincando Atividade Manual

Local cOcorrFalta := AllTrim(SuperGetMV('MV_YOCOFAL',.F.,"0001"))


Local cOcorrAvar := AllTrim(SuperGetMV('MV_YOCOAVA',.F.,"0002"))

Local cServErro := AllTrim(GetNewPar("MV_YSRVERR","015"))


Local cTarefEnd := AllTrim(GetNewPar("MV_YTAREND","009"))
Local cServEnd := AllTrim(GetNewPar("MV_YSRVEND","005"))

Local nQtdOcorr := 0
Local nQtdEnder := 0
Local cNumSeq := ""
Local cIdMovto := ""
Local aEndFalta := {}
Local aExcecoes := {}

Local cAlias := GetNextAlias()


Local cAliasSDB := GetNextAlias()
Local cAliasSZT

Local nPos := 0
Local lInc := .f.
Local nRecDC5 := 0
Local aTelaAnt := VTSave(00,00,VTMaxRow(),VTMaxCol())
Local cOcorr := "000005"
Local lRet := .T.
Local lFirstAprov := .T.
Local cIdLider := ""
Local lNeedAprov := .T.
Local xError := ""

Private lMsErroAuto

//Percorre todos os registros para verificar se existe falta


//caso afirmativo pede autorização do superior
For i := 1 to Len(aRecSDB)

//Seta no registro a conferir


SDB->(dbGoTo(aRecSDB[i][2]))
lNeedAprov := .T.
If SDB->DB_QUANT > SDB->DB_QTDLID

aNotasOrig := VA063GetNfs(AllTrim(SDB->DB_DOC),SDB->DB_PRODUTO,SDB-
>DB_LOTECTL,SDB->DB_NUMLOTE,SDB->DB_LOCAL)
nQtdDif := SDB->DB_QUANT - SDB->DB_QTDLID
// Validar se ocorrência já está registrada.
//Verifica a ultima atividade de endereçamento para diminuir a
quantidade do mesmo
lNeedAprov := .T.
cAliasSZT := GetNextAlias()
BeginSql Alias cAliasSZT

SELECT SZT.R_E_C_N_O_ SZTREC


FROM %table:SZT% SZT
WHERE
SZT.%NotDel%
AND SZT.ZT_FILIAL = %xFilial:SDB%
AND SZT.ZT_DOC = %Exp:SDB->DB_DOC%
AND SZT.ZT_ORIG = %Exp:SDB->DB_ORIGEM%
AND SZT.ZT_OCORR = %Exp:cOcorr%
AND SZT.ZT_PRODUTO = %Exp:SDB->DB_PRODUTO%
EndSql

(cAliasSZT)->(dbGoTop())
If (cAliasSZT)->(!Eof())
While (cAliasSZT)->(!Eof())
SZT->( DbGoTo( (cAliasSZT)->SZTREC ) )
If ( SZT->ZT_QUANT == nQtdDif )
lNeedAprov := .F.
EndIf
(cAliasSZT)->(DbSkip())
EndDo
EndIf
(cAliasSZT)->(dbCloseArea())

If lNeedAprov
//Chama rotina para verificar a autorização do lider // Uma vez
que já existe a ocorrência
If lFirstAprov .AND. U_VIXA065(SDB->DB_DOC,SDB-
>DB_ORIGEM,cOcorr,aNotasOrig,nQtdDif)

cIdLider := SZT->ZT_USERLIB
lRet := .T.
lFirstAprov := .F.

// Apos a primeira aprovação, as proximas faltas já estao


aprovadas automaticamente
ElseIf !lFirstAprov

RecLock('SZT',.T.)

SZT->ZT_FILIAL := xFilial('SZT')
SZT->ZT_DATA := dDataBase
SZT->ZT_DOC := SDB->DB_DOC
SZT->ZT_ORIG := SDB->DB_ORIGEM
SZT->ZT_OCORR := cOcorr
SZT->ZT_HORA := Time()
SZT->ZT_USER := RetCodUsr()
SZT->ZT_USERLIB := cIdLider
SZT->ZT_MOTIVO := FWGetSX5("ZZ",cOcorr)[1][4]
SZT->ZT_QUANT := nQtdDif
If !Empty(aNotasOrig)
SZT->ZT_FORNECE := aNotasOrig[1][3]
SZT->ZT_LOJA := aNotasOrig[1][4]
SZT->ZT_PRODUTO := aNotasOrig[1][8]
SZT->ZT_UMA := aNotasOrig[1][9]
SZT->ZT_CUSTO := aNotasOrig[1][10] * nQtdDif
EndIf
MsUnlock()

Else

lRet := .F.
Return .T.

EndIf
EndIf
EndIf

Next

If !lRet
Return lRet
EndIf

//Percorre todos os registros para analisar se esta OK


For i := 1 to Len(aRecSDB)

Begin Transaction

//Seta no registro a conferir


SDB->(dbGoTo(aRecSDB[i][2]))

RecLock('SDB',.F.)
SDB->DB_DATAFIM:= dDataBase
SDB->DB_HRFIM := Time()

If SDB->DB_QUANT == SDB->DB_QTDLID .and. SDB->DB_YQTAVAR == 0

SDB->DB_STATUS := cStatExec

Else

SDB->DB_STATUS := cStatProb
SDB->DB_ANOMAL := 'S'

EndIf

SDB->(MsUnLock())

aNotasOrig := VA063GetNfs(AllTrim(SDB->DB_DOC),SDB->DB_PRODUTO,SDB-
>DB_LOTECTL,SDB->DB_NUMLOTE,SDB->DB_LOCAL)

//Gera as acorrencias para reconferencia ou devolução de venda


If SDB->DB_YQTAVAR > 0
// Validar se já existe ocorrência cadastrada.
DbSelectArea("DCN")
DCN->(DbSetOrder(2)) // DCN_FILIAL + DCN_PROD + DCN_LOCAL + DCN_NUMSEQ
+ DCN_DOC + DCN_SERIE+DCN_CLIFOR+DCN_LOJA+DCN_ITEM
If Len(aNotasOrig) > 0
If DCN->(!DbSeek( xFilial("DCN") + SDB->DB_PRODUTO + SDB-
>DB_LOCAL + aNotasOrig[1][6] + aNotasOrig[1][1] + aNotasOrig[1][2] + aNotasOrig[1]
[3] ))
nQtdOcorr := 0
Else
nQtdOcorr := SDB->DB_YQTAVAR
EndIf
Else
nQtdOcorr := SDB->DB_YQTAVAR
EndIf
While nQtdOcorr <> 0

RecLock("DCN",.T.)
DCN->DCN_FILIAL := xFilial("DCN")
DCN->DCN_NUMERO := GetSxENum("DCN","DCN_NUMERO")
DCN->DCN_OCORR := cOcorrAvar
DCN->DCN_STATUS := "1"
DCN->DCN_DTINI := dDataBase
DCN->DCN_HRINI := Time()
DCN->DCN_YLOTER := SDB->DB_DOC
DCN->DCN_PROD := SDB->DB_PRODUTO
DCN->DCN_LOCAL := SDB->DB_LOCAL
DCN->DCN_LOTECT := SDB->DB_LOTECTL
DCN->DCN_NUMLOT := SDB->DB_NUMLOTE

If Len(aNotasOrig) > 0

DCN->DCN_DOC := aNotasOrig[1][1]
DCN->DCN_SERIE := aNotasOrig[1][2]
DCN->DCN_CLIFOR := aNotasOrig[1][3]
DCN->DCN_LOJA := aNotasOrig[1][4]
DCN->DCN_NUMSEQ := aNotasOrig[1][6]
DCN->DCN_ITEM := aNotasOrig[1][5]

If aNotasOrig[1][7] >= nQtdOcorr

DCN->DCN_QUANT := nQtdOcorr

//Acerta saldo do vetor para proxima analise


aNotasOrig[1][7] -= nQtdOcorr
nQtdOcorr := 0

Else

DCN->DCN_QUANT := aNotasOrig[1][7]

//Acerta saldo do vetor para proxima analise


nQtdOcorr -= aNotasOrig[1][7]
aNotasOrig[1][7] := 0

EndIf

Else

DCN->DCN_DOC := SDB->DB_DOC
DCN->DCN_YLOTER := SDB->DB_DOC
DCN->DCN_QUANT := nQtdOcorr
nQtdOcorr := 0

EndIf

DCN->(msUnLock())

ConfirmSX8()

If Len(aNotasOrig) > 0

//Apaga registro do vetor caso tenha utilizado


If aNotasOrig[1][7] == 0
aDel(aNotasOrig,1)
aSize(aNotasOrig,Len(aNotasOrig)-1)
EndIf

EndIf
EndDo

EndIf

If SDB->DB_QUANT-SDB->DB_QTDLID > 0
// Validar se já existe ocorrência cadastrada.
DbSelectArea("DCN")
DCN->(DbSetOrder(2)) // DCN_FILIAL + DCN_PROD + DCN_LOCAL + DCN_NUMSEQ
+ DCN_DOC + DCN_SERIE + DCN_CLIFOR+DCN_LOJA+DCN_ITEM
If Len(aNotasOrig) > 0
If DCN->(DbSeek( xFilial("DCN") + SDB->DB_PRODUTO + SDB->DB_LOCAL
+ aNotasOrig[1][6] + aNotasOrig[1][1] + aNotasOrig[1][2] + aNotasOrig[1][3] ))
nQtdOcorr := 0
Else
nQtdOcorr := SDB->DB_QUANT-SDB->DB_QTDLID
EndIf
Else
nQtdOcorr := SDB->DB_QUANT-SDB->DB_QTDLID
EndIf
// Validar se ocorrência já existe. _> Se estiver em aberto, cancela e
gera uma nova. _> Se estiver encerrada, não permite a geração.
While nQtdOcorr <> 0

RecLock("DCN",.T.)
DCN->DCN_FILIAL := xFilial("DCN")
DCN->DCN_NUMERO := GetSxENum("DCN","DCN_NUMERO")
DCN->DCN_OCORR := cOcorrFalta
DCN->DCN_STATUS := "1"
DCN->DCN_DTINI := dDataBase
DCN->DCN_HRINI := Time()
DCN->DCN_YLOTER := SDB->DB_DOC
DCN->DCN_PROD := SDB->DB_PRODUTO
DCN->DCN_LOCAL := SDB->DB_LOCAL
DCN->DCN_LOTECT := SDB->DB_LOTECTL
DCN->DCN_NUMLOT := SDB->DB_NUMLOTE

If Len(aNotasOrig) > 0

DCN->DCN_DOC := aNotasOrig[1][1]
DCN->DCN_SERIE := aNotasOrig[1][2]
DCN->DCN_CLIFOR := aNotasOrig[1][3]
DCN->DCN_LOJA := aNotasOrig[1][4]
DCN->DCN_ITEM := aNotasOrig[1][5]
DCN->DCN_NUMSEQ := aNotasOrig[1][6]

If aNotasOrig[1][7] >= nQtdOcorr

DCN->DCN_QUANT := nQtdOcorr

//Acerta saldo do vetor para proxima analise


aNotasOrig[1][7] -= nQtdOcorr
nQtdOcorr := 0

Else

DCN->DCN_QUANT := aNotasOrig[1][7]

//Acerta saldo do vetor para proxima analise


nQtdOcorr -= aNotasOrig[1][7]
aNotasOrig[1][7] := 0

EndIf

Else

DCN->DCN_DOC := SDB->DB_DOC
DCN->DCN_YLOTER := SDB->DB_DOC
DCN->DCN_QUANT := nQtdOcorr
nQtdOcorr := 0

EndIf

DCN->(msUnLock())

ConfirmSX8()

If Len(aNotasOrig) > 0

//Apaga registro do vetor caso tenha utilizado


If aNotasOrig[1][7] == 0
aDel(aNotasOrig,1)
aSize(aNotasOrig,Len(aNotasOrig)-1)
EndIf

EndIf

EndDo

EndIf

//Quantidade a endereçar
nQtdEnder := SDB->DB_QTDLID-SDB->DB_YQTAVAR-SDB->DB_YQTLIBE
aEndFalta := {}

RecLock('SDB',.F.)
SDB->DB_YQTLIBE += nQtdEnder
SDB->(MsUnLock())

//Chamada para criação da função de endereçamento caso tenha erro de cadastro


If SDB->DB_SERVIC == cServErro

//Libera as etiquetas relacionadas a este produto


SZS->(dbSetOrder(2))
If SZS->(dbSeek(xFilial("SZS")+SDB->DB_DOC+SDB->DB_SERIE+SDB-
>DB_CLIFOR+SDB->DB_LOJA+SDB->DB_ORIGEM+SDB->DB_PRODUTO+SDB->DB_LOCAL+SDB-
>DB_LOTECTL+SDB->DB_NUMLOTE))

While SZS->(!Eof()) .and. SZS->ZS_FILIAL+SZS->ZS_DOC+SZS-


>ZS_SERIE+SZS->ZS_CLIFOR+SZS->ZS_LOJA+SZS->ZS_ORIGEM+SZS->ZS_PROD+SZS-
>ZS_LOCAL+SZS->ZS_LOTECTL+SZS->ZS_NUMLOTE == ;
xFilial("SZS")+SDB-
>DB_DOC+SDB->DB_SERIE+SDB->DB_CLIFOR+SDB->DB_LOJA+SDB->DB_ORIGEM+SDB-
>DB_PRODUTO+SDB->DB_LOCAL+SDB->DB_LOTECTL+SDB->DB_NUMLOTE

If Empty(SZS->ZS_IDOPERA) .and. SZS->ZS_STATUS == "1"

RecLock('SZS',.F.)
SZS->ZS_STATUS := "2"
SZS->(MsUnLock())

If SZS->ZS_QUANT == 0

//COMO NÃO CRIA DCF, UTILIZA O ID JA EXISTENTE


cIDDCF := SZS->ZS_IDDCF

Else

//cria serviço para endereçamento


cIDDCF := u_VA062CriaDCF(SZS->ZS_QUANT)

EndIf

If SDB->DB_QUANT <> SZS->ZS_QUANT

nPos := aScan(aEndFalta,{|x| x[01] == SDB-


>DB_SERVIC .and.;

x[02] == SDB->DB_PRODUTO .and.;

x[03] == SDB->DB_LOCAL .and.;

x[04] == SDB->DB_NUMSEQ .and.;

x[05] == SDB->DB_DOC .and.;

x[06] == SDB->DB_SERIE .and.;

x[07] == SDB->DB_CLIFOR .and.;

x[08] == SDB->DB_LOJA .and.;

x[09] == SDB->DB_LOCALIZ .and.;

x[10] == SDB->DB_ORIGEM .and.;

x[12] == cIDDCF})

If nPos == 0

aAdd(aEndFalta,{ SDB->DB_SERVIC,;
SDB-
>DB_PRODUTO,;
SDB-
>DB_LOCAL,;
SDB-
>DB_NUMSEQ,;
SDB-
>DB_DOC,;
SDB-
>DB_SERIE,;
SDB-
>DB_CLIFOR,;
SDB-
>DB_LOJA,;
SDB-
>DB_LOCALIZ,;
SDB-
>DB_ORIGEM,;
SDB-
>DB_QUANT-SZS->ZS_QUANT,;
cIDDCF})

Else

aEndFalta[nPos][11] += SDB->DB_QUANT-SZS-
>ZS_QUANT

EndIf

EndIf

EndIf

SZS->(dbSkip())

EndDo

Else

nPos := aScan(aEndFalta,{|x| x[01] == SDB->DB_SERVIC .and.;


x[02] ==
SDB->DB_PRODUTO .and.;
x[03] ==
SDB->DB_LOCAL .and.;
x[04] ==
SDB->DB_NUMSEQ .and.;
x[05] ==
SDB->DB_DOC .and.;
x[06] ==
SDB->DB_SERIE .and.;
x[07] ==
SDB->DB_CLIFOR .and.;
x[08] ==
SDB->DB_LOJA .and.;
x[09] ==
SDB->DB_LOCALIZ .and.;
x[10] ==
SDB->DB_ORIGEM .and.;
x[12] ==
SDB->DB_IDDCF})

If nPos == 0

aAdd(aEndFalta,{ SDB->DB_SERVIC,;
SDB->DB_PRODUTO,;
SDB->DB_LOCAL,;
SDB->DB_NUMSEQ,;
SDB->DB_DOC,;
SDB->DB_SERIE,;
SDB->DB_CLIFOR,;
SDB->DB_LOJA,;
SDB->DB_LOCALIZ,;
SDB->DB_ORIGEM,;
SDB->DB_QUANT,;
SDB->DB_IDDCF})

Else

aEndFalta[nPos][11] += SDB->DB_QUANT

EndIf

EndIf

//Acerta os endereçamento com quantidade menor devido a falta e avaria e


libera as etiquetas para endereçamento
Else //If SDB->DB_YQTAVAR > 0 .or. SDB->DB_QUANT-SDB->DB_QTDLID > 0

//Verifica a ultima atividade de endereçamento para diminuir a


quantidade do mesmo
BeginSql Alias cAlias

SELECT SDB.R_E_C_N_O_ SDBREC


, SDB.DB_IDOPERA
, SDB.DB_QUANT
, ISNULL(SZS.ZS_QUANT,%Exp:0%) ZS_QUANT
, ISNULL(SZS.R_E_C_N_O_,%Exp:0%) SZSREC

FROM %table:SDB% SDB

LEFT JOIN %table:SZS% SZS ON


SZS.%NotDel%
AND SZS.ZS_FILIAL = %xFilial:SZS%
AND SZS.ZS_DOC = SDB.DB_DOC
AND SZS.ZS_SERIE = SDB.DB_SERIE
AND SZS.ZS_CLIFOR = SDB.DB_CLIFOR
AND SZS.ZS_LOJA = SDB.DB_LOJA
AND SZS.ZS_ORIGEM = SDB.DB_ORIGEM
AND SZS.ZS_PROD = SDB.DB_PRODUTO
AND SZS.ZS_LOTECTL = SDB.DB_LOTECTL
AND SZS.ZS_NUMLOTE = SDB.DB_NUMLOTE
AND SZS.ZS_LOCAL = SDB.DB_LOCAL
AND SZS.ZS_NUMSEQ = SDB.DB_NUMSEQ
AND SZS.ZS_IDOPERA = SDB.DB_IDOPERA
AND SZS.ZS_IDMOVTO = SDB.DB_IDMOVTO
AND SZS.ZS_IDDCF = SDB.DB_IDDCF

WHERE SDB.%NotDel%
AND SDB.DB_FILIAL = %xFilial:SDB%
AND SDB.DB_STATUS = %Exp:cStatAExe%
AND SDB.DB_ESTORNO = %Exp:''%
AND SDB.DB_ATUEST = %Exp:'N'%
AND SDB.DB_TAREFA = %Exp:cTarefEnd%
AND SDB.DB_ORDATIV = %Exp:'01'%
AND SDB.DB_SERVIC = %Exp:SDB->DB_SERVIC%
AND SDB.DB_DOC = %Exp:SDB->DB_DOC%
AND SDB.DB_SERIE = %Exp:SDB->DB_SERIE%
AND SDB.DB_CLIFOR = %Exp:SDB->DB_CLIFOR%
AND SDB.DB_LOJA = %Exp:SDB->DB_LOJA%
AND SDB.DB_PRODUTO = %Exp:SDB->DB_PRODUTO%
AND SDB.DB_ORIGEM = %Exp:SDB->DB_ORIGEM%
AND SDB.DB_LOCAL = %Exp:SDB->DB_LOCAL%
AND SDB.DB_LOTECTL = %Exp:SDB->DB_LOTECTL%
AND SDB.DB_NUMLOTE = %Exp:SDB->DB_NUMLOTE%

EndSql

(cAlias)->(dbGoTop())
While (cAlias)->(!Eof())

If (cAlias)->DB_QUANT <> (cAlias)->ZS_QUANT

SDB->(dbGoTo((cAlias)->SDBREC))

//Cria Vetor com produtos a serem endereçados na doca de


conferencia
//produtos falta e avaria

nPos := aScan(aEndFalta,{|x| x[01] == SDB->DB_SERVIC .and.;


x[02] ==
SDB->DB_PRODUTO .and.;
x[03] ==
SDB->DB_LOCAL .and.;
x[04] ==
SDB->DB_NUMSEQ .and.;
x[05] ==
SDB->DB_DOC .and.;
x[06] ==
SDB->DB_SERIE .and.;
x[07] ==
SDB->DB_CLIFOR .and.;
x[08] ==
SDB->DB_LOJA .and.;
x[09] ==
SDB->DB_LOCALIZ .and.;
x[10] ==
SDB->DB_ORIGEM .and.;
x[12] ==
SDB->DB_IDDCF})

If nPos == 0

aAdd(aEndFalta,{ SDB->DB_SERVIC,;
SDB->DB_PRODUTO,;
SDB->DB_LOCAL,;
SDB->DB_NUMSEQ,;
SDB->DB_DOC,;
SDB->DB_SERIE,;
SDB->DB_CLIFOR,;
SDB->DB_LOJA,;
SDB->DB_LOCALIZ,;
SDB->DB_ORIGEM,;
SDB->DB_QUANT-(cAlias)-
>ZS_QUANT,;
SDB->DB_IDDCF})

Else

aEndFalta[nPos][11] += SDB->DB_QUANT-(cAlias)-
>ZS_QUANT

EndIf
//Verifica totas atividade de endereçamento para diminuir a
quantidade do mesmo
BeginSql Alias cAliasSDB

SELECT SDB.R_E_C_N_O_ SDBREC


FROM %table:SDB% SDB
WHERE SDB.DB_FILIAL = %xFilial:SDB%
AND SDB.DB_SERVIC = %Exp:SDB->DB_SERVIC%
AND SDB.DB_DOC = %Exp:SDB->DB_DOC%
AND SDB.DB_SERIE = %Exp:SDB->DB_SERIE%
AND SDB.DB_CLIFOR = %Exp:SDB->DB_CLIFOR%
AND SDB.DB_LOJA = %Exp:SDB->DB_LOJA%
AND SDB.DB_PRODUTO = %Exp:SDB->DB_PRODUTO%
AND SDB.DB_ORIGEM = %Exp:SDB->DB_ORIGEM%
AND SDB.DB_LOCAL = %Exp:SDB->DB_LOCAL%
AND SDB.DB_LOTECTL = %Exp:SDB->DB_LOTECTL%
AND SDB.DB_NUMLOTE = %Exp:SDB->DB_NUMLOTE%
AND SDB.DB_NUMSEQ = %Exp:SDB->DB_NUMSEQ%
AND SDB.DB_IDMOVTO = %Exp:SDB->DB_IDMOVTO%
AND SDB.DB_IDDCF = %Exp:SDB->DB_IDDCF%
AND SDB.DB_ESTORNO = %Exp:''%
AND SDB.DB_ATUEST = %Exp:'N'%
AND SDB.%NotDel%

EndSql

(cAliasSDB)->(dbGoTop())
While (cAliasSDB)->(!Eof())

SDB->(dbGoTo((cAliasSDB)->SDBREC))

RecLock("SDB",.F.)

If (cAlias)->ZS_QUANT > 0

SDB->DB_QUANT := (cAlias)->ZS_QUANT
SDB->DB_QTSEGUM := ConvUM(SDB->DB_PRODUTO,
(cAlias)->ZS_QUANT,0,2)

DCR->(dbSetOrder(1))
If DCR->(dbSeek(xFilial("DCR")+SDB-
>DB_IDDCF+SDB->DB_IDDCF+SDB->DB_IDMOVTO+SDB->DB_IDOPERA))

RecLock("DCR",.F.)
DCR->DCR_QUANT := SDB->DB_QUANT
DCR->DCR_QTSEUM := SDB->DB_QTSEGUM
DCR->(msUnLock())

EndIf

Else

//Apaga amarração
DCR->(dbSetOrder(1))
If DCR->(dbSeek(xFilial("DCR")+SDB-
>DB_IDDCF+SDB->DB_IDDCF+SDB->DB_IDMOVTO+SDB->DB_IDOPERA))

RecLock("DCR",.F.)
DCR->(dbDelete())
DCR->(msUnLock())

EndIf

//Apaga movimento
SDB->(dbDelete())

EndIf

SDB->(msUnLock())

(cAliasSDB)->(dbSkip())

EndDo
(cAliasSDB)->(dbCloseArea())

EndIf

If (cAlias)->SZSREC > 0

SZS->(dbGoTo((cAlias)->SZSREC))

RecLock('SZS',.F.)
SZS->ZS_STATUS := "2"
SZS->(MsUnLock())

EndIf

(cAlias)->(dbSkip())
EndDo
(cAlias)->(dbCloseArea())

EndIf

//Endereça produtos falta e avaria na doca de conferencia


For z := 1 to Len(aEndFalta)

//aAdd(aEndFalta,{SDB->DB_SERVIC,SDB->DB_PRODUTO,SDB->DB_LOCAL,SDB-
>DB_NUMSEQ,SDB->DB_DOC,SDB->DB_SERIE,SDB->DB_CLIFOR,SDB->DB_LOJA,SDB-
>DB_LOCALIZ,SDB->DB_QUANT-(cAlias)->ZS_QUANT}

lInc := .F.
aExcecoes := {}

//Verifica as atividades de excessão deste endereço


SBE->(dbSetOrder(1))
If SBE->(dbSeek(xFilial("SBE")+aEndFalta[z][3]+aEndFalta[z][9]))

DCL->(dbSetOrder(1))
If DCL->(dbSeek(xFilial('DCL')+SBE->BE_EXCECAO))

While DCL->(!Eof()) .and. DCL->DCL_FILIAL+DCL->DCL_CODIGO


== xFilial('DCL')+SBE->BE_EXCECAO

aAdd(aExcecoes,DCL->DCL_ATIVID)
DCL->(dbSkip())
EndDo

EndIf

//Rotina para criar as atividades de endereçamento automatico na


doca
DC5->(dbSetOrder(2))
If DC5->(dbSeek(xFilial("DC5")+cTarefEnd))

//Rotina executada atravez do execução de serviço


//serve para gerar os registros do SDB para execução da
conferencia
DC6->(dbSetOrder(1))
If DC6->(dbSeek(xFilial("DC6")+DC5->DC5_TAREFA))

cIdMovto := u_WMSProxSeq()

While DC6->(!Eof()) .and. xFilial("DC6")+DC5-


>DC5_TAREFA == DC6->DC6_FILIAL+DC6->DC6_TAREFA

If aScan(aExcecoes,DC6->DC6_ATIVID) == 0

//aAdd(aEndFalta,{SDB->DB_SERVIC,SDB-
>DB_PRODUTO,SDB->DB_LOCAL,SDB->DB_NUMSEQ,SDB->DB_DOC,SDB->DB_SERIE,SDB-
>DB_CLIFOR,SDB->DB_LOJA,SDB->DB_LOCALIZ,SDB->DB_QUANT-(cAlias)->ZS_QUANT}

lInc := .T.

RecLock("SDB",.t.)

SDB->DB_FILIAL := xFilial("SDB")
SDB->DB_ITEM := StrZero(1,2)
SDB->DB_PRIORI := "ZZ"
SDB->DB_IDOPERA :=
GetSx8Num('SDB','DB_IDOPERA')
SDB->DB_HRINI := Time()
SDB->DB_DATA := dDataBase
SDB->DB_TIPO := "E"
SDB->DB_ATUEST := "N"
SDB->DB_TM := "499"
SDB->DB_PRODUTO := aEndFalta[z][2]
SDB->DB_LOCAL := aEndFalta[z][3]
SDB->DB_LOCALIZ := SBE->BE_LOCALIZ
SDB->DB_ESTFIS := SBE->BE_ESTFIS
SDB->DB_ENDDES := SBE->BE_LOCALIZ
SDB->DB_ESTDES := SBE->BE_ESTFIS
SDB->DB_DOC := aEndFalta[z][5]
SDB->DB_SERIE := aEndFalta[z][6]
SDB->DB_CLIFOR := aEndFalta[z][7]
SDB->DB_LOJA := aEndFalta[z][8]
SDB->DB_ORIGEM := aEndFalta[z][10]
SDB->DB_QUANT := aEndFalta[z]
[11]
SDB->DB_QTSEGUM := ConvUM(aEndFalta[z]
[2],aEndFalta[z][11],0,2)
SDB->DB_SERVIC := aEndFalta[z][1]
SDB->DB_TAREFA := DC5->DC5_TAREFA
SDB->DB_ORDTARE := DC5->DC5_ORDEM
SDB->DB_ATIVID := DC6->DC6_ATIVID
SDB->DB_RHFUNC := DC6->DC6_FUNCAO
SDB->DB_RECFIS := DC6->DC6_TPREC
SDB->DB_ORDATIV := DC6->DC6_ORDEM
SDB->DB_NUMSEQ := aEndFalta[z][4]
SDB->DB_STATUS := cStatAuto
SDB->DB_IDMOVTO := cIdMovto
SDB->DB_IDDCF := aEndFalta[z]
[12]

SDB->(MsUnLock())

ConfirmSX8()

RecLock("DCR",.t.)
DCR->DCR_FILIAL := xFilial("DCR")
DCR->DCR_IDORI := SDB->DB_IDDCF
DCR->DCR_IDDCF := SDB->DB_IDDCF
DCR->DCR_IDMOV := SDB->DB_IDMOVTO
DCR->DCR_QUANT := SDB->DB_QUANT
DCR->DCR_IDOPER := SDB->DB_IDOPERA
DCR->DCR_QTSEUM := SDB->DB_QTSEGUM
DCR->DCR_EMPENH := 0
DCR->DCR_EMP2 := 0
DCR->(msUnLock())

EndIf

DC6->(dbSkip())

EndDo

//Executa a proxima atividade caso o serviço seja


automatico
If lInc .and. SDB->DB_STATUS == cStatAuto

//Declarado apenas aqui devido a problemas em


rotina padrão
aParam150 := Array(34)

aParam150[01] := SDB->DB_PRODUTO //-- Produto


aParam150[02] := SDB->DB_LOCAL //--
Almoxarifado
aParam150[03] := SDB->DB_DOC //--
Documento
aParam150[04] := SDB->DB_SERIE //--
Serie
aParam150[05] := SDB->DB_NUMSEQ //--
Sequencial
aParam150[06] := SDB->DB_QUANT //--
Saldo do produto em estoque
aParam150[07] := SDB->DB_DATA //-- Data da
Movimentacao
aParam150[08] := Time() //--
Hora da Movimentacao
aParam150[09] := SDB->DB_SERVIC //--
Servico
aParam150[10] := SDB->DB_TAREFA //--
Tarefa
aParam150[11] := SDB->DB_ATIVID //--
Atividade
aParam150[12] := SDB->DB_CLIFOR //--
Cliente/Fornecedor
aParam150[13] := SDB->DB_LOJA //-- Loja
aParam150[14] := ''
//-- Tipo da Nota Fiscal
aParam150[15] := '01' //--
Item da Nota Fiscal
aParam150[16] := ''
//-- Tipo de Movimentacao
aParam150[17] := SDB->DB_ORIGEM //--
Origem de Movimentacao
aParam150[18] := SDB->DB_LOTECTL //-- Lote
aParam150[19] := SDB->DB_NUMLOTE //-- Sub-
Lote
aParam150[20] := SDB->DB_LOCALIZ //--
Endereco
aParam150[21] := SDB->DB_ESTFIS //--
Estrutura Fisica
aParam150[22] := '1' //--
Regra de Apanhe (1=LOTE/2=NUMERO DE SERIE/3=DATA)
aParam150[23] := SDB->DB_CARGA //--
Carga
aParam150[24] := SDB->DB_UNITIZ //--
Nr. do Pallet
aParam150[25] := SDB->DB_LOCAL //--
Centro de Distribuicao Destino
aParam150[26] := SDB->DB_ENDDES //--
Endereco Destino
aParam150[27] := SDB->DB_ESTDES //--
Estrutura Fisica Destino
aParam150[28] := SDB->DB_ORDTARE //-- Ordem
da Tarefa
aParam150[29] := SDB->DB_ORDATIV //-- Ordem
da Atividade
aParam150[30] := SDB->DB_RHFUNC //--
Funcao do Recurso Humano
aParam150[31] := SDB->DB_RECFIS //--
Recurso Fisico
aParam150[32] := SDB->DB_IDDCF //--
Identificador do DCF
aParam150[33] := Space(TamSx3("DCF_CODNOR")[1])
aParam150[34] := SDB->DB_IDMOVTO

//-- Efetua a Gravacao do Produto no Endereco


Desejado
//lRet := DLXGrvEnd(,,,,,,,SBE-
>BE_CODZON,,'1',.T.,'2',,,,,.F.)
lRet := WmsEndereca(.T.,'2')

EndIf

EndIF

EndIf

EndIf

Next
End Transaction

Next

//-- Destrava os Registros Utilizados


dbSelectArea("SDB")
MaDestrava(aRecSDB)

// Validar se o momvimento já não foi feito // SD7. -> NUMSEQ SDA -> *IDDCF -> NUM
CQ sd7
//Percorre todos os registros para analisar as divergencias e gerar os Pedidos de
devolução
For nI := 1 to Len(aRecSDB)
//Begin Transaction
//Seta no registro a conferir
SDB->(dbGoTo(aRecSDB[nI][2]))
If SDB->DB_YQTAVAR > 0 .or. SDB->DB_QUANT-SDB->DB_QTDLID > 0
VTAlert("Aguarde a transferência de produtos e geração do Pedido para
as Divergencias","Atenção.",.T.,1,3)
cProduto := SDB->DB_PRODUTO
nSldLiber := SDB->DB_YQTAVAR + (SDB->DB_QUANT - SDB->DB_QTDLID) //
SDB->DB_QUANT - SDB->DB_YQTLIBE
// Chama rotina de liberação do CQ
lRet := LiberarCQ(cDocto,cProduto,nSldLiber)
// Caso o produto tenha ocorrência, e não tenha o SKU no FALTA sem
saldo no CQ para transferência para o FALTA enviar #EnvWorkflow(cDocto)
// ENVIAR WORKFLOW
If lRet
// Chama rotina de transferencia armazem
lRet := EnderFalta(cDocto,cProduto,nSldLiber)
EndIf
EndIf
Next nI
// Gera Pedido de Devolucao das inconsistencias do checkin
If lRet
lRet := GeraPedDev(@xError)
If lRet
EnvWorkflow(cDocto) // ENVIAR WORKFLOW
For nI := 1 to Len(aRecSDB)
//Seta no registro a conferir
SDB->(dbGoTo(aRecSDB[nI][2]))
RecLock("SDB",.F.)
SDB->DB_DATAFIM:= dDataBase
SDB->DB_HRFIM := Time()
SDB->DB_STATUS := cStatManu // Status Manual
SDB->DB_ANOMAL := '011' // DEVOLVER MERCADORIAS
//SDB->DB_ATUEST := 'S'
SDB->(MsUnLock())
Next nI
Else
EnvWorkflow(cDocto, xError) // ENVIAR WORKFLOW
EndIf
EndIf
// Atualizar o STATUS GERAL!
// Finaliza o status de conferencia do romaneio
If lRet
//u_VWMSFinalLote(cDocto)
dbSelectArea("Z53")
Z53->(dbSetOrder(2))
If Z53->(dbSeek(xFilial("Z53")+Padr(cDocto,TamSx3("Z53_NUM")[1])))
RecLock("Z53",.f.)
Z53->Z53_STATUS := "R"
Z53->Z53_TXTSTT := "Recebido"
Z53->(msUnLock())
EndIf
EndIf

Return .F.

/*ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
±±ÉÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍ»±±
±±ºPrograma ³VA063GetNfºAutor ³Ihorran Milholi º Data ³ 18/10/13 º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºDesc. ³Rotina para recuperar as notas fiscais de origem º±±
±±º ³ º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºUso ³SIGAWMS º±±
±±ÈÍÍÍÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ±±
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß*/
Static Function VA063GetNfs(cDoc,cProduto,cLoteCtl,cNumLote,cLocal)

Local cAlias := GetNextAlias()


Local aRet := {} //{'','','','','','',0,'',0}

BeginSql Alias cAlias

SELECT SD1.D1_DOC, SD1.D1_SERIE, SD1.D1_FORNECE, SD1.D1_LOJA,


SD1.D1_ITEM, SD1.D1_NUMSEQ, SD1.D1_QUANT, SD1.D1_COD, SD1.D1_VUNIT, SZS.ZS_CODIGO

FROM %table:SD1% SD1

INNER JOIN %table:Z54% Z54 ON Z54.Z54_FILIAL = %xFilial:Z54%


AND Z54.Z54_DOC
= SD1.D1_DOC
AND Z54.Z54_SERIE
= SD1.D1_SERIE
AND Z54.Z54_FORN
= SD1.D1_FORNECE
AND Z54.Z54_LOJA
= SD1.D1_LOJA
AND Z54.Z54_TIPO
= SD1.D1_TIPO
AND Z54.Z54_NUM
= %Exp:cDoc%
AND Z54.%notdel%

LEFT JOIN %table:SZS% SZS ON SZS.%NotDel%


AND SZS.ZS_FILIAL =
%xFilial:SZS%
AND SZS.ZS_DOC =
%Exp:SDB->DB_DOC%
AND SZS.ZS_SERIE = %Exp:SDB-
>DB_SERIE%
AND SZS.ZS_CLIFOR = %Exp:SDB-
>DB_CLIFOR%
AND SZS.ZS_LOJA =
%Exp:SDB->DB_LOJA%
AND SZS.ZS_ORIGEM = %Exp:SDB-
>DB_ORIGEM%
AND SZS.ZS_PROD =
%Exp:SDB->DB_PRODUTO%
AND SZS.ZS_LOTECTL =
%Exp:SDB->DB_LOTECTL%
AND SZS.ZS_NUMLOTE =
%Exp:SDB->DB_NUMLOTE%
AND SZS.ZS_LOCAL = %Exp:SDB-
>DB_LOCAL%
AND SZS.ZS_NUMSEQ = %Exp:SDB-
>DB_NUMSEQ%

WHERE SD1.D1_FILIAL = %xFilial:SD1%


AND SD1.D1_COD = %Exp:cProduto%
AND SD1.D1_LOTECTL = %Exp:cLoteCtl%
AND SD1.D1_NUMLOTE = %Exp:cNumLote%
AND SD1.D1_LOCAL = %Exp:cLocal%
AND SD1.%NotDel%

EndSql

(cAlias)->(dbGoTop())

While (cAlias)->(!Eof())

aAdd(aRet,{ (cAlias)->D1_DOC,(cAlias)->D1_SERIE,(cAlias)->D1_FORNECE,
(cAlias)->D1_LOJA,(cAlias)->D1_ITEM,;
(cAlias)->D1_NUMSEQ,(cAlias)->D1_QUANT,(cAlias)->D1_COD,
(cAlias)->ZS_CODIGO,(cAlias)->D1_VUNIT})

(cAlias)->(dbSkip())

EndDo

(cAlias)->(dbCloseArea())

Return(aRet)

/*ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
±±ÉÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍ»±±
±±ºPrograma ³VA063TravaReg ºAutor ³Ihorran Milholi º Data ³ 09/10/13 º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºDesc. ³Trava todos os registros da conferencia para inicio do mesmoº±±
±±º ³ º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºUso ³SIGAWMS º±±
±±ÈÍÍÍÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ±±
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß*/
Static Function
VA063TravaReg(cServic,cDocto,cSerie,cCliFor,cLoja,cOrigem,cServic,cTarefa,cAtivid,a
RecSDB)

Local cAlias := GetNextAlias()


Local cRecHum := __cUserID
Local cStatProb := SuperGetMV('MV_RFSTPRO',.F.,'2') //-- DB_STATUS
indincando Atividade com Problemas
Local cStatInte := SuperGetMV('MV_RFSTINT',.F.,'3') //-- DB_STATUS
indincando Atividade Interrompida
Local cStatAExe := SuperGetMV('MV_RFSTAEX',.F.,'4') //-- DB_STATUS
indincando Atividade A Executar
Local cServRetr := AllTrim(GetNewPar("MV_YSRVRET","016"))
Local lErro := .f.

//AND SDB.DB_SERVIC = %Exp:cServic%

//Query para recuperar todos os itens a executar conferencia


BeginSql Alias cAlias

SELECT SDB.R_E_C_N_O_ RECSDB

FROM %table:SDB% SDB

WHERE SDB.DB_FILIAL = %xFilial:SDB%


AND SDB.DB_ESTORNO = %Exp:''%
AND SDB.DB_ATUEST = %Exp:'N'%
AND SDB.DB_DOC = %Exp:cDocto%
AND SDB.DB_SERIE = %Exp:cSerie%
AND SDB.DB_CLIFOR = %Exp:cCliFor%
AND SDB.DB_LOJA = %Exp:cLoja%
AND SDB.DB_ORIGEM = %Exp:cOrigem%
AND SDB.DB_TAREFA = %Exp:cTarefa%
AND SDB.DB_ATIVID = %Exp:cAtivid%
AND SDB.DB_STATUS IN (%Exp:cStatProb%,%Exp:cStatAExe%,%Exp:cStatInte%)
AND SDB.%NotDel%

ORDER BY SDB.DB_FILIAL, SDB.DB_STATUS, SDB.DB_PRIORI, SDB.DB_CARGA


, SDB.DB_DOC, SDB.DB_SERIE, SDB.DB_CLIFOR, SDB.DB_LOJA,
SDB.DB_ITEM
, SDB.DB_SERVIC, SDB.DB_ORDTARE, SDB.DB_ORDATIV

EndSql

(cAlias)->(dbGoTop())

Begin TransAction

//Percorre todos os itens


While (cAlias)->(!Eof()) .and. !lErro

//Seta no registro a conferir


SDB->(dbGoTo((cAlias)->RECSDB))

If cServRetr == cServic .and. SDB->DB_SERVIC <> cServic

(cAlias)->(dbSkip())
Loop

EndIf

If SDB->(SimpleLock())

//Guarda os registros SDB para posterior utilização


aAdd(aRecSDB,{"SDB",(cAlias)->RECSDB})

If SDB->DB_STATUS == cStatAExe .or. ( (SDB->DB_STATUS == cStatInte .or.


SDB->DB_STATUS == cStatProb) .and. SDB->DB_RECHUM == cRecHum)

If Empty(SDB->DB_RECHUM)

RecLock('SDB',.F.) // Trava para gravacao


SDB->DB_RECHUM := cRecHum
SDB->DB_STATUS := cStatInte
SDB->DB_DATA := dDataBase
SDB->DB_HRINI := Time()
SDB->(msUnLock())

Else

RecLock('SDB',.F.) // Trava para gravacao


SDB->DB_RECHUM := cRecHum
SDB->DB_STATUS := cStatInte
SDB->(msUnLock())

EndIf
Else

lErro := .t.

EndIf

Else

lErro := .t.

EndIf

(cAlias)->(dbSkip())

EndDo

//Caso tenha erro na seleção dos registros o sistema ira abortar


If lErro

DisarmTransaction()

//Libera todos os registros


For i:= 1 to Len(aRecSDB)
//Seta no registro a conferir
SDB->(dbGoTo(aRecSDB[i][2]))
SDB->(msUnLock())
Next

aRecSDB := {}

DLVTAviso(cCadastro,'Não foi possivel selecionar este lote para


conferencia!',{"Abandonar Conferencia"})

EndIf

End TransAction
//Elimina a area de trabalho
(cAlias)->(dbCloseArea())

Return(Len(aRecSDB)>0)

/*
ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
±±ÚÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄ¿±±
±±³Fun‡„o ³VA063End | Autor ³ Alex Egydio ³Data³12.02.2007³±±
±±ÃÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄ´±±
±±³Descri‡„o ³ Valida o endereco ³±±
±±ÃÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´±±
±±³Parametros³ ³±±
±±ÀÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ±±
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß*/
Static Function VA063End(cEnderSYS,cEndereco,cLocal)

Local aAreaAnt:= GetArea()


Local aAreaSBE:= SBE->(GetArea())
Local lRet := .T.

If cEndereco != cEnderSYS
DLVTAviso('VA063End','Endereco incorreto!')
cEndereco := Space(Len(SDB->DB_LOCALIZ))
lRet := .F.
EndIf

If lRet
SBE->(DbSetOrder(1))
If SBE->( ! MsSeek(xFilial('SBE')+cLocal+cEndereco))
DLVTAviso('VA063End','O Endereco '+AllTrim(cEndereco)+' nao esta
cadastrado!')
cEndereco := Space(Len(SDB->DB_LOCALIZ))
lRet := .F.
EndIf
EndIf

RestArea(aAreaSBE)
RestArea(aAreaAnt)

Return(lRet)

/*
ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
±±ÚÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄ¿±±
±±³Fun‡„o ³ VA063Prd | Autor ³ Alex Egydio ³Data³12.02.2007³±±
±±ÃÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄ´±±
±±³Descri‡„o ³ Valida o produto ³±±
±±ÃÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´±±
±±³Parametros³ ³±±
±±ÀÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ±±
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß*/
Static Function
VA063Prd(aPrdSYS,cProduto,cDescPro,cDescPr2,nConver,cNorma,cDscUM,cPictQt,cLoteCtl,
nQtdNorma,nQtdNorma2,lRetrab,cIDOPera,cStage,cIdMovto)
Local lDigita := (SuperGetMV('MV_DLCOLET',.F.,'N') == 'N')
Local cWmsUMI := AllTrim(SuperGetMv('MV_WMSUMI',.F.,'1'))
Local nMax := VTMaxCol()-5
Local cTipId := ""
Local lRet := .T.
Local aProduto := {}
Local nPos := 0
Local cAlias := GetNextAlias()
Local cEstFis := ""
Local cCodBarra := ""

If !lDigita

cTipId := CBRetTipo(cProduto)

//If cTipId $ "EAN8OU13-EAN14-EAN128"

//CBRetEtiEAN= Produto, Qtde, Lote, Validade, Serie


aProduto := CBRetEtiEAN(cProduto)

If Len(aProduto) > 0

cCodBarra := cProduto
cProduto := aProduto[1]
nConver := aProduto[2]
cLoteCtl := Padr(aProduto[3],Len(SDB->DB_LOTECTL))

EndIf

/*
Else

aProduto := CBRetEti(cProduto,'01')

If Len(aProduto) > 0

cCodBarra := cProduto
cProduto := aProduto[1]
nConver := aProduto[2]
cLoteCtl := Padr(aProduto[16],Len(SDB->DB_LOTECTL))

EndIf

EndIf
*/

If Empty(aProduto)

DLVTAviso('VA063Prd','Etiqueta invalida!')
VTKeyBoard(chr(20))
lRet := .F.

EndIf

EndIf

If lRet
SB1->(DbSetOrder(1))
If !SB1->(MsSeek(xFilial('SB1')+cProduto))
DLVTAviso('VA063Prd','O produto '+AllTrim(cProduto)+' nao esta
cadastrado!')
VTKeyBoard(chr(20))
lRet := .F.
EndIf

EndIf

If lRet

If aSCan(aPrdSYS,{|x| x[1] == cProduto}) == 0


DLVTAviso('VA063Prd','O produto '+AllTrim(cProduto)+' nao consta no
lote de recebimento!')
VTKeyBoard(chr(20))
lRet := .F.
EndIf

EndIf

If lRet

//Caso a conversão seja 0, iguala para 1


nConver := iif(nConver==0,1,nConver)

//-- Divide Descr. do produto em 3 linhas


cDescPro := SubStr(SB1->B1_DESC, 1,nMax)
cDescPr2 := SubStr(SB1->B1_DESC, nMax+1,nMax)

//recupera a posição do produto


nPos := aSCan(aPrdSYS,{|x| x[1] == cProduto})

SDB->(dbGoTo(aPrdSYS[nPos][7][1]))

//Define o fator de conversão e unidade de medida


SLK->(dbSetOrder(2))
If SLK->(dbSeek(xFilial("SLK")+cProduto+Padr(cCodBarra,TamSx3("LK_CODBAR")
[1]))) .and. SLK->(FieldPos("LK_YUM")) > 0

cDscUM := SLK->LK_YUM
cPictQt:= PesqPict("SDB","DB_QUANT")

ElseIf SB1->B1_TIPCONV == "D" .and. SB1->B1_CONV == nConver .and. SDB-


>DB_QTSEGUM > 0

cDscUM := SB1->B1_SEGUM
cPictQt:= PesqPict("SDB","DB_QTSEGUM")

Else

cDscUM := SB1->B1_UM
cPictQt:= PesqPict("SDB","DB_QUANT")

EndIf

//Recupera a norma do produto


aAux := VA063GetInfProd(SDB->DB_SERVIC,SDB->DB_DOC,SDB->DB_SERIE,SDB-
>DB_CLIFOR,SDB->DB_LOJA,SDB->DB_ORIGEM,SDB->DB_PRODUTO,SDB->DB_LOCAL,SDB-
>DB_LOTECTL,SDB->DB_NUMLOTE)
nQtdNorma := aAux[1]
lRetrab := aAux[2]
cStage := aAux[3]
cNorma := aAux[4]
cIDOPera := aAux[5]
cIdMovto := aAux[6]
nQtdNorma2 := aAux[7]

EndIf

Return(lRet)

/*
ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
±±ÚÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄ¿±±
±±³Fun‡„o ³WMSV070LOT| Autor ³ Alex Egydio ³Data³12.02.2007³±±
±±ÃÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄ´±±
±±³Descri‡„o ³ Valida o lote ³±±
±±ÃÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´±±
±±³Parametros³ ³±±
±±ÀÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ±±
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß*/
Static Function VA063Lot(aLoteSYS,cProduto,cLoteCtl)

Local cRetPE := ""


Local lRet := .T.

lRet := !Empty(cLoteCtl)

If lRet .And. Len(aLoteSYS)>0 .And. aScan(aLoteSYS,{|x| x[1] == cProduto .And.


x[2] == cLoteCtl}) == 0
DLVTAviso('VA063Lot','O lote '+AllTrim(cLoteCtl)+' nao consta no documento
atual!')
lRet := .F.
EndIf

Return(lRet)

/*
ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
±±ÚÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄ¿±±
±±³Fun‡„o ³WMSV070QTD| Autor ³ Alex Egydio ³Data³12.02.2007³±±
±±ÃÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄ´±±
±±³Descri‡„o ³ Valida a quantidade ³±±
±±ÃÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´±±
±±³Parametros³ ³±±
±±ÀÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ±±
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß*/
Static Function
VA063Qtd(nQtde,nConver,cProduto,cLoteCtl,aPrdSYS,nQtdNorma,cStage,cIDOPera,nQtdConf
Nor)

Local lRet := (nQtde>0)


Local nQtdConf := 0
Local nQtdTot := 0
Local nPos := 0
Local aAux := {}
Local cOcorr := "000014"
Local aTelaAnt := VTSave(00,00,VTMaxRow(),VTMaxCol())
Local cCodMotivo := ''
Local cTxtMotivo := Space(50)
Local nQtdDiver := 0

If lRet

If lWmsLote .And. Rastro(cProduto)

nPos := aScan(aPrdSYS,{|x| x[1] == cProduto .and. x[2] == cLoteCtl})

Else

nPos := aScan(aPrdSYS,{|x| x[1] == cProduto})

EndIf

If aPrdSYS[nPos][3] < aPrdSYS[nPos][4]+(nQtde*nConver)


DLVTAviso('VA063Qtd','A qtd. ultrapassa a qtd. do Lote de
Conferencia!')
//nQtde:= 0
//lRet := .F.

acMenuItens := {"Sobra de Mercadoria","Outro Motivo"}


alSelectableItens := {.T., .T.}

DLVTCabec("QTD MAIOR - MOTIVO", .F., .F., .T.)


nOpcao := VTACHOICE(1, 0, 7, 19,
acMenuItens, alSelectableItens,/*"U_VIX"*/)

Do Case
Case nOpcao == 1
cOcorr := '000015'
Case nOpcao == 2
cOcorr := '000016'

// Limpa a tela anterior


VTClear()
DLVTCabec("DIGITE O MOTIVO", .F., .F., .T.)
//@ 01, 00 VTSay "Quant. a Enderecar ?"
@ 02, 00 VtGet cTxtMotivo Picture "@!" VALID
(Len(ALLTRIM(cTxtMotivo)) > 5)

VTRead

If !Empty(cTxtMotivo)
FwPutSX5(/*cFlavour*/, "ZZ", cOcorr, cTxtMotivo,
cTxtMotivo/*cTextoEng*/, cTxtMotivo/*cTextoEsp*/, /*cTextoAlt*/)
EndIf
EndCase

aNotasOrig := VA063GetNfs(AllTrim(SDB->DB_DOC),SDB->DB_PRODUTO,SDB-
>DB_LOTECTL,SDB->DB_NUMLOTE,SDB->DB_LOCAL)
nQtdDiver := aPrdSYS[nPos][4]+(nQtde*nConver) - aPrdSYS[nPos][3]
//Chama rotina para verificar a autorização do lider
If U_VIXA065(SDB->DB_DOC,SDB->DB_ORIGEM,cOcorr,aNotasOrig,nQtdDiver)
nQtde := 0
lRet := .F.
VTClear()
VTRestore(00,00,VTMaxRow(),VTMaxCol(),aTelaAnt)

Else
nQtde := 0
lRet := .F.
//Restaura a tela anterior
// VTClear()
// VTRestore(00,00,VTMaxRow(),VTMaxCol(),aTelaAnt)

EndIf

// solicitar autorização somente para registro do LOG (criar um novo


motivo de sobra de mercadoria)

EndIf

If lRet

If nQtdNorma > 0

//If aPrdSYS[nPos][4]+(nQtde*nConver)-aPrdSYS[nPos][5]-
aPrdSYS[nPos][6] > nQtdNorma

If nQtdConfNor+(nQtde*nConver) > nQtdNorma

DLVTAviso('VA063Qtd','A qtd. ultrapassa a norma do


pallet!')
nQtde:= 0
lRet := .f.

EndIf

EndIf

EndIf

EndIf

Return lRet

/*
ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
±±ÚÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄ¿±±
±±³Fun‡„o ³VA063EtBur| Autor ³ Alex Egydio ³Data³12.02.2007³±±
±±ÃÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄ´±±
±±³Descri‡„o ³ Valida a quantidade ³±±
±±ÃÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´±±
±±³Parametros³ ³±±
±±ÀÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ±±
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß*/
Static Function VA063EtBurra(nTipo,cEtBurra,aEtBurra,cEtSugest)

Local lRet := !Empty(cEtBurra)

cEtBurra := alltrim(cEtBurra)

If SubStr(cEtBurra,1,1) == "B"
cEtBurra := AllTrim(SubStr(cEtBurra,2,Len(cEtBurra)))
Else
cEtBurra := AllTrim(cEtBurra)
EndIf

If lRet

If nTipo == 1

SZS->(dbSetOrder(1))
If SZS->(dbSeek(xFilial("SZS")+cEtBurra))

If Empty(SZS->ZS_PROD) .or. aScan(aEtBurra,{|x| Alltrim(x[1]) ==


Alltrim(cEtBurra)}) > 0

If aScan(aEtBurra,{|x| x[1] == cEtBurra}) > 0 .and.


Empty(cEtSugest)

DLVTAviso('VA063EtBurra','Etiqueta Já Utilizada 1!')


lRet := .f.

ElseIf !Empty(cEtSugest) .and. Alltrim(cEtBurra) <>


Alltrim(cEtSugest)

DLVTAviso('VA063EtBurra','Etiqueta Invalida, Favor


aglutinar o Produto!')
lRet := .f.

EndIf

Else

DLVTAviso('VA063EtBurra','Etiqueta Já Utilizada 2!')


lRet := .f.

EndIf

Else

DLVTAviso('VA063EtBurra','Etiqueta Invalida!')
lRet := .f.

EndIf

ElseIf nTipo == 2

If aScan(aEtBurra,{|x| x[1] == cEtBurra}) == 0

DLVTAviso('VA063EtBurra','Etiqueta Invalida!')
lRet := .f.
EndIf

EndIf

EndIf

If !lRet
cEtBurra := Space(TamSx3("ZS_CODIGO")[1]+1)
EndIf

Return lRet

/*
ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
±±ÚÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄ¿±±
±±³Fun‡„o ³WMSV070CON| Autor ³ Alex Egydio ³Data³12.02.2007³±±
±±ÃÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄ´±±
±±³Descri‡„o ³ Consulta produtos conferidos ³±±
±±ÃÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´±±
±±³Parametros³ ExpA1 = vetor dos produtos ja conferidos ³±±
±±ÀÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ±±
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß*/
Static Function VA063JaConf(cDocto,aPrdSYS)

Local aCab := {"Produto","Quantidade","U.M"}


Local aSize := {Len(SDB->DB_PRODUTO),Len(aCab[2]),Len(aCab[3])}
Local aTelaAnt := VTSave(00,00,VTMaxRow(),VTMaxCol())
Local aJaConf := {}
Local cWmsUMI := ""
Local nPos
Local i
Local nQuant
Local cUM

//Monta Vetor de Já Conferidos


For i:= 1 to Len(aPrdSYS)

If aPrdSYS[i][4] > 0

//Verifica a necessidade de converter para a segunda unidade de medida!


cWmsUMI := AllTrim(SuperGetMv('MV_WMSUMI',.F.,'1'))
nQuant := 0

//Posiciona no cadastro de produtos


SB1->(dbSetOrder(1))
SB1->(dbSeek(xFilial("SB1")+aPrdSYS[i][1]))

// --- Se parametro MV_WMSUMI = 4, utilizar U.M.I. informada no SB5


If cWmsUMI == '4'
SB5->(DbSetOrder(1))
If SB5->(MsSeek(xFilial('SB5')+aPrdSYS[i][1]))
cWmsUMI := SB5->B5_UMIND
EndIf
EndIf

If cWmsUMI == "2"
nQuant := ConvUM(aPrdSYS[i][1],aPrdSYS[i][4],0,2)
cUM := SB1->B1_SEGUM
EndIf

If nQuant == 0
nQuant := aPrdSYS[i][4]
cUM := SB1->B1_UM
EndIf

nPos := aScan(aJaConf,{|x| x[1] == aPrdSYS[i][1]})

If nPos == 0

aAdd(aJaConf,{aPrdSYS[i][1],nQuant,cUM})

Else

aJaConf[nPos] += nQuant

EndIf

EndIf

Next

//Ordena por codigo de produto


aJaConf := aSort(aJaConf,,,{|x, y| x[1] < y[1]})

If Len(aJaConf) > 0

VTClear()

@ 00, 00 VTSay PadR("Lote",VTMaxCol())


@ 01, 00 VTSay PadR(cDocto,VTMaxCol())

VTaBrowse(02,00,VTMaxRow()-2,VTMaxCol(),aCab,aJaConf,aSize)
VTRestore(00,00,VTMaxRow(),VTMaxCol(),aTelaAnt)

Else

DLVTAviso('VA063JaConf','Nenhum produto conferido...')

EndIf

Return

/*
ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
±±ÚÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄ¿±±
±±³Fun‡„o ³VA063LibVol| Autor³ Alex Egydio ³Data³12.02.2007³±±
±±ÃÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄ´±±
±±³Descri‡„o ³Libera Volumes para Endereçamento atravez da etiqueta ³±±
±±ÃÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´±±
±±³Parametros³ ³±±
±±ÀÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ±±
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
*/
Static Function VA063LibVol(cDocto,aEtBurra,aRecSDB,aPrdSYS)
Local cStatExec := SuperGetMV('MV_RFSTEXE',.F.,'1') //-- DB_STATUS
indincando Atividade Executada
Local aTelaAnt := VTSave(00,00,VTMaxRow(),VTMaxCol())
Local cEtBurra := Space(TamSx3("ZS_CODIGO")[1]+1)
Local lRet := .t.
Local nPos := 0

If Len(aEtBurra) > 0

While lRet .and. Empty(cEtBurra)

//-- Escolha do Produto a ser Conferido


DLVTCabec(,.F.,.F.,.T.)
@ 02,00 VTSay PadR('Etiqueta Burra',VTMaxCol())
@ 03,00 VTGet cEtBurra Picture "@!" Valid
VA063EtBurra(2,@cEtBurra,aEtBurra)
VTRead

lRet := VA063ESC(aRecSDB,"C",@cEtBurra)

If lRet .and. Empty(cEtBurra)


Loop
EndIf

EndDo

If lRet .and. !Empty(cEtBurra)

lRet := (DLVTAviso('Etiqueta','Deseja Reimprimir a etiqueta


'+cEtBurra+'?', {'Sim','Nao'}) == 1)

// lRet := (DLVTAviso('Etiqueta','Deseja liberar a etiqueta


'+cEtBurra+'?', {'Sim','Nao'}) == 1)

If lRet

nPos := aScan(aEtBurra,{|x| x[1] == cEtBurra})

//If !Empty(aEtBurra[nPos][2]) .or. aEtBurra[nPos][3]

VA063LibEti(cEtBurra,@aEtBurra,aRecSDB,@aPrdSYS)

// Else

// DLVTAviso('VA063LibVol','Não é possivel liberar este


tipo de volume!')

// EndIF

EndIf

EndIf

Else

DLVTAviso('VA063LibVol','Não existem volumes a serem liberados!')

EndIf
//Restaura a tela anterior
VTClear()
VTRestore(00,00,VTMaxRow(),VTMaxCol(),aTelaAnt)

Return

/*
ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
±±ÚÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄ¿±±
±±³Fun‡„o ³VA063LibEti| Autor³ Ihorran Milholi ³Data³28.10.2013³±±
±±ÃÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄ´±±
±±³Descri‡„o ³Libera etiquetas para endereçamento ³±±
±±ÃÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´±±
±±³Parametros³ ³±±
±±ÀÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ±±
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
*/
Static Function VA063LibEti(cEtBurra,aEtBurra,aRecSDB,aPrdSYS)

Local aArea := GetArea()


Local nQtdEnd := 0
Local nQtdEtiq := 0
Local cNumSeq := ""
Local nPosEti := 0
Local aCloneSDB := {}
Local cIdMovto := ""
Local cEndereco
Local i
Local x
Local aAux
Local nPos
Local cImpre := Space(TAMSX3("CB5_CODIGO")[1])
Local cCopias := "01"
Local aEtiqImp := {}

lOCAL lRetrab := .f.


Local cRomaneio := ""
Local cProduto := ""
Local cSeq := ""
Local cAliasSDB := GetNextAlias()
Local cAlias := GetNextAlias()
Local cStage := ""
Local aEtUMA := {}

SZS->(dbSetOrder(1))
If SZS->(dbSeek(xFilial("SZS")+cEtBurra))

// Cria uma nova etiqueta e atrela a este produto.


cRomaneio := SZS->ZS_DOC
cProduto := SZS->ZS_PROD

AADD(aEtUMA,cEtBurra)

DbSelectArea("SB1")
DbSetOrder(1)
SB1->(DbSeek(xFilial("SB1")+cProduto))
cEndereco := u_EndUMA(cProduto,SZS->ZS_LOCAL)

DbSelectArea("SZS")
DbsetOrder(1)

// Selecione a Impressora
cImpre := SeleIMP()

If Empty(cImpre)
Return
End If

For i := 1 to len(aEtUMA)

if SZS->(DbSeek(xFilial("SZS") + aEtUMA[i]))

AADD(aEtiqImp,{SB1->B1_COD,;
SB1->B1_DESC,;
SB1->B1_UM,;
nQtdEnd,;
cEndereco,;
aEtUMA[i],;
SZS->ZS_LOCAL})

End if
Next

//Localizado no VIXR021

U_VIX21UMA(aEtiqImp,cImpre,"1",cRomaneio)

EndIf

Static Function VA063LoadEtq(aRecSDB,aPrdSYS,aLoteSYS,aEtBurra)

Local lRet := .T.


Local nX := 0

VtAlert('Aguarde... Contando produtos.',cCadastro,.T.,1000,3)

For nX := 1 to Len(aRecSDB)

//Seta no registro a conferir


SDB->(dbGoTo(aRecSDB[nX][2]))
cProduto := SDB->DB_PRODUTO

//Trava registro para mudanças em outros processos


If SoftLock("SDB")

If lWmsLote .And. Rastro(cProduto)

nPos := aScan(aPrdSYS,{|x| x[1] == SDB->DB_PRODUTO .and.


x[2] == SDB->DB_LOTECTL})
cLote:= SDB->DB_LOTECTL
Else

nPos := aScan(aPrdSYS,{|x| x[1] == SDB->DB_PRODUTO})


cLote:= Space(TamSx3("DB_LOTECTL")[1])

EndIf

If nPos == 0

//-- Inclui produto no array aTotPrdSY


aAdd(aPrdSYS,{SDB->DB_PRODUTO,cLote,SDB->DB_QUANT,SDB-
>DB_QTDLID,SDB->DB_YQTAVAR,SDB->DB_YQTLIBE,{SDB->(Recno())}})

nPos := Len(aPrdSYS)

Else

aPrdSYS[nPos][3] += SDB->DB_QUANT
aPrdSYS[nPos][4] += SDB->DB_QTDLID
aPrdSYS[nPos][5] += SDB->DB_YQTAVAR
aPrdSYS[nPos][6] += SDB->DB_YQTLIBE

aAdd(aPrdSYS[nPos][7],SDB->(Recno()))

EndIf

//-- Inclui lote no array aLoteSYS, para validacao apos a


digitacao do lote
If !Empty(SDB->DB_LOTECTL)
aAdd(aLoteSYS,{SDB->DB_PRODUTO,SDB->DB_LOTECTL})
EndIf

SZS->(dbSetOrder(2))
If SZS->(dbSeek(xFilial("SZS")+SDB->DB_DOC+SDB->DB_SERIE+SDB-
>DB_CLIFOR+SDB->DB_LOJA+SDB->DB_ORIGEM+SDB->DB_PRODUTO+SDB->DB_LOCAL+SDB-
>DB_LOTECTL+SDB->DB_NUMLOTE))

While SZS->(!Eof()) .and. SZS->ZS_FILIAL+SZS-


>ZS_DOC+SZS->ZS_SERIE+SZS->ZS_CLIFOR+SZS->ZS_LOJA+SZS->ZS_ORIGEM+SZS->ZS_PROD+SZS-
>ZS_LOCAL+SZS->ZS_LOTECTL+SZS->ZS_NUMLOTE == ;
xFilial("SZS")+SDB->DB_DOC+SDB->DB_SERIE+SDB-
>DB_CLIFOR+SDB->DB_LOJA+SDB->DB_ORIGEM+SDB->DB_PRODUTO+SDB->DB_LOCAL+SDB-
>DB_LOTECTL+SDB->DB_NUMLOTE

If SZS->ZS_STATUS == "1" .OR. (SZS->ZS_STATUS ==


"3" .AND. SZS->ZS_QUANT < SDB->DB_QUANT )

//Inclui registros no vetor de controle de


etiquetas
//lRetrab := iif(!
Empty(Posicione("SB5",1,xFilial("SB5")+SZS->ZS_PROD,"B5_YRETRAB")) .and. SDB-
>DB_ORIGEM == "Z54",.t.,.f.)
lRetrab := .f.
nPosEti := aScan(aEtBurra,{|x| x[1] ==
ALLTRIM(SZS->ZS_CODIGO)})
cStage := VA063GetStage(SZS->ZS_IDOPERA)

If !Empty(cStage)
//aPrdSYS[nPos][6] += SZS->ZS_QUANT

EndIf

If nPosEti == 0

aAdd(aEtBurra,{Alltrim(SZS-
>ZS_CODIGO),cStage,lRetrab,{}})

nPosEti := Len(aEtBurra)

EndIf

//Inclui registros no vetor..


If aScan(aEtBurra[nPosEti][4],{|x| x[1] == SZS-
>ZS_PROD}) == 0

aAdd(aEtBurra[nPosEti][4],{SZS-
>ZS_PROD,SZS->ZS_QUANT,SZS->ZS_IDOPERA})

EndIf

EndIf

SZS->(dbSkip())

EndDo

EndIf

Else

//-- Destrava os Registros Utilizados


dbSelectArea("SDB")
MaDestrava(aRecSDB)

//Caso não consiga travar o registro o sistema deverá


//sair da conferencia por segurança
VA063Abandona(aRecSDB)

lRet := .f.

VtAlert('Houve um erro ao selecionar os produtos para


conferencia',cCadastro,.T.,1000,3)

Exit

EndIf

Next nX

Return lRet

Static Function SeleIMP()

Local aArea := GetArea()


Local lPen := .F.
Local cAlias := GetNextAlias()
Local aCab := {}
Local aSize := {}
Local nPos := {}
Local aItens := {}
Local aImpressora := {}
Local aTela
Local cCodImpres := ""

VTSave Screen To aTela

BEGINSQL ALIAS cAlias

SELECT CB5.CB5_CODIGO ,
CB5.CB5_DESCRI ,
CB5.CB5_SERVER ,
CB5.CB5_PORTIP
FROM %Table:CB5% CB5
WHERE CB5.CB5_FILIAL = %xFilial:SZH%
AND CB5.D_E_L_E_T_ = ''
AND CB5.CB5_SERVER <> ''

EndSql

While (cAlias)->(!EOF())
lPen := .T.
AADD(aImpressora,{ (cAlias)->CB5_CODIGO,(cAlias)->CB5_DESCRI,(cAlias)-
>CB5_SERVER,(cAlias)->CB5_PORTIP })
(cAlias)->(DbSkip())
EndDo

aCab := {"Codigo","Impressora","Server","Porta"}
aSize:= {6,15,12,04}
nPos := 1

If Len(aImpressora) > 0
// Solicite ao Usuario o codigo da transportadora
DLVTCabec("Impressoras", .F., .F., .T.)

@ 01, 00 VTSay "Selecione a Imp:"


nPos := VTaBrowse(03,0,7,40,aCab,aImpressora,aSize,/*Funcao p/ tratar
as teclas*/,nPos)

// pega o codigo da impressora


If nPos > 0
cCodImpres := aImpressora[nPos][1]
End If

End IF

RestArea(aArea)
VTRestore Screen From aTela

Return cCodImpres

/*
ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
±±ÚÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄ¿±±
±±³Fun‡„o ³VA063GetInfProd| Autor³ Ihorran Milholi ³Data³28.10.2013³±±
±±ÃÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄ´±±
±±³Descri‡„o ³Rotina para recuperar informaçõe do produto ³±±
±±ÃÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´±±
±±³Parametros³ ³±±
±±ÀÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ±±
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß*/

Static Function
VA063GetInfProd(cServic,cDoc,cSerie,cCliFor,cLoja,cOrigem,cProduto,cLocal,cLoteCtl,
cNumLote)

//SDB->DB_DOC,SDB->DB_SERIE,SDB->DB_CLIFOR,SDB->DB_LOJA,SDB->DB_ORIGEM,SDB-
>DB_PRODUTO,SDB->DB_LOCAL,,SDB->DB_LOTECTL,SDB->DB_NUMLOTE

Local cAlias := GetNextAlias()


Local cTarefEnd := AllTrim(GetNewPar("MV_YTAREND","009"))
Local lRetrab := .f. //iif(!Empty(Posicione("SB5",1,xFilial("SB5")
+cProduto,"B5_YRETRAB")) .and. cOrigem == "Z54",.t.,.f.)
Local aAux := {0,lRetrab,"","",Space(TamSX3("DB_IDOPERA")
[1]),Space(TamSX3("DB_IDMOVTO")[1]),0}
Local aAuxRet := {}
Local cServErro := AllTrim(GetNewPar("MV_YSRVERR","015"))

/*
nQtdNorma := aAux[1]
lRetrab := aAux[2]
cStage := aAux[3]
cNorma := aAux[4]
ID de Oper := aAux[5]
*/

//Depois verifica um endereço final


BeginSql Alias cAlias

SELECT TOP 1 SDB.DB_LOCAL, SDB.DB_ENDDES, SDB.DB_ESTDES, SDB.DB_QUANT,


SDB.DB_IDOPERA, SDB.DB_PRODUTO
, SDB.DB_IDMOVTO, SDB.DB_RECEMB, SDB.DB_SERVIC

FROM %table:SDB% SDB

WHERE SDB.DB_FILIAL = %xFilial:SDB%


AND SDB.DB_SERVIC = %Exp:cServic%
AND SDB.DB_DOC = %Exp:cDoc%
AND SDB.DB_SERIE = %Exp:cSerie%
AND SDB.DB_CLIFOR = %Exp:cCliFor%
AND SDB.DB_LOJA = %Exp:cLoja%
AND SDB.DB_PRODUTO = %Exp:cProduto%
AND SDB.DB_ORIGEM = %Exp:cOrigem%
AND SDB.DB_LOCAL = %Exp:cLocal%
AND SDB.DB_LOTECTL = %Exp:cLoteCtl%
AND SDB.DB_NUMLOTE = %Exp:cNumLote%
AND SDB.DB_ESTORNO = %Exp:''%
AND SDB.DB_ATUEST = %Exp:'N'%
AND SDB.DB_TAREFA = %Exp:cTarefEnd%
AND SDB.DB_ORDATIV = %Exp:'01'%
AND SDB.DB_IDOPERA NOT IN ( SELECT SZS.ZS_IDOPERA
FROM %table:SZS% SZS
WHERE SZS.%NotDel%
AND SZS.ZS_FILIAL =
%xFilial:SZS%
AND SZS.ZS_DOC =
SDB.DB_DOC
AND SZS.ZS_SERIE =
SDB.DB_SERIE
AND SZS.ZS_CLIFOR =
SDB.DB_CLIFOR
AND SZS.ZS_LOJA =
SDB.DB_LOJA
AND SZS.ZS_ORIGEM =
SDB.DB_ORIGEM
AND SZS.ZS_PROD =
SDB.DB_PRODUTO
AND SZS.ZS_LOTECTL =
SDB.DB_LOTECTL
AND SZS.ZS_NUMLOTE =
SDB.DB_NUMLOTE
AND SZS.ZS_LOCAL =
SDB.DB_LOCAL
AND SZS.ZS_NUMSEQ =
SDB.DB_NUMSEQ
AND SZS.ZS_IDMOVTO =
SDB.DB_IDMOVTO
AND SZS.ZS_IDDCF =
SDB.DB_IDDCF
AND ( SZS.ZS_STATUS <>
%Exp:'1'%
OR SZS.ZS_QUANT=
SDB.DB_QUANT))
AND SDB.%NotDel%

ORDER BY SDB.DB_IDOPERA

EndSql

(cAlias)->(dbGoTop())
If (cAlias)->(!Eof()) .and. (cAlias)->(!Bof())

aAux[1] := iif(lRetrab,0,iif((cAlias)->DB_SERVIC == cServErro,0,


(cAlias)->DB_QUANT))
aAux[3] := VA063GetStage((cAlias)->DB_IDOPERA)
aAux[4] := Posicione('DC2',1,xFilial('DC2')+(cAlias)-
>DB_RECEMB,'DC2_DESNOR')
aAux[4] := AllTrim(Replace(aAux[4],"NORMA",""))
aAux[5] := (cAlias)->DB_IDOPERA
aAux[6] := (cAlias)->DB_IDMOVTO
aAux[7] := iif(lRetrab,0,iif((cAlias)->DB_SERVIC == cServErro,0,
(cAlias)->DB_QUANT))

DC2->(dbSetOrder(1))
If aAux[7] > 0 .and. DC2->(dbSeek(xFilial("DC2")+(cAlias)->DB_RECEMB))

aAux[7] := DC2->DC2_LASTRO*DC2->DC2_CAMADA
EndIf

EndIf
(cAlias)->(dbCloseArea())

Return(aAux)

/*
ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
±±ÚÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄ¿±±
±±³Fun‡„o ³VA063GetStage | Autor³ Ihorran Milholi ³Data³06.11.2013³±±
±±ÃÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄ´±±
±±³Descri‡„o ³Rotina para recuperar STAGE a ser endereçado o produto ³±±
±±ÃÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´±±
±±³Parametros³ ³±±
±±ÀÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ±±
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß*/
Static Function VA063GetStage(cIDOpera)

Local cAliasAti := GetNextAlias()


Local cStage := ""

//Recupera os endereços stage disponiveis para este endereço


BeginSql Alias cAliasAti

SELECT SDB.DB_LOCAL, SDB.DB_ENDDES, SDB.DB_IDOPERA,


SDB.DB_ORDATIV, SDB.DB_PRODUTO, SDB.DB_ESTDES, COALESCE(ZU_STAGE01,'') ZU_STAGE01
FROM %table:SDB% SDB
LEFT JOIN %table:SZU% SZU ON SZU.%notdel%
AND SZU.ZU_FILIAL = SDB.DB_FILIAL
AND SZU.ZU_LOCAL = SDB.DB_LOCAL
AND SDB.DB_ENDDES BETWEEN SZU.ZU_ENDINI
AND SZU.ZU_ENDFIN
AND SDB.DB_ESTDES BETWEEN SZU.ZU_ESTINI
AND SZU.ZU_ESTFIN
WHERE SDB.DB_FILIAL = %xFilial:SDB%
AND SDB.DB_ESTORNO = %Exp:''%
AND SDB.DB_ATUEST = %Exp:'N'%
AND SDB.DB_IDOPERA = %Exp:cIDOpera%
AND SDB.%notdel%
ORDER BY SDB.DB_IDOPERA DESC

EndSql

(cAliasAti)->(dbGoTop())

If (cAliasAti)->(!Eof()) .AND. !Empty((cAliasAti)->ZU_STAGE01)


cStage := (cAliasAti)->ZU_STAGE01
EndIf

(cAliasAti)->(dbCloseArea())

Return cStage

/*
ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
±±ÚÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄ¿±±
±±³Fun‡„o ³VA063AvarValid | Autor³ Ihorran Milholi ³Data³06.11.2013³±±
±±ÃÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄ´±±
±±³Descri‡„o ³Rotina para validação da avaria com autorização do lider ³±±
±±ÃÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´±±
±±³Parametros³ ³±±
±±ÀÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ±±
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß*/
Static Function VA063AvarValid(nQtdAvar,nQtde,aRecSDB)

Local lRet := .f.


Local cOcorr := "000014"
Local aTelaAnt := VTSave(00,00,VTMaxRow(),VTMaxCol())

If nQtdAvar == 0

lRet := .t.

ElseIf nQtde >= nQtdAvar

aNotasOrig := VA063GetNfs(AllTrim(SDB->DB_DOC),SDB->DB_PRODUTO,SDB-
>DB_LOTECTL,SDB->DB_NUMLOTE,SDB->DB_LOCAL)

//Chama rotina para verificar a autorização do lider


If u_VIXA065(SDB->DB_DOC,SDB->DB_ORIGEM,cOcorr,aNotasOrig,nQtdAvar)

lRet := .t.

Else

lRet := .f.
nQtdAvar:= 0

//Restaura a tela anterior


VTClear()
VTRestore(00,00,VTMaxRow(),VTMaxCol(),aTelaAnt)

EndIf

ElseIf nQtdAvar > nQtde

lRet := .f.
nQtdAvar:= 0

VtAlert('Quantidade de Avaria maior que a quantidade do


produto!',cCadastro,.T.,1000,3)

//Restaura a tela anterior


VTClear()
VTRestore(00,00,VTMaxRow(),VTMaxCol(),aTelaAnt)

EndIf

Return(lRet)

// LEANDRO
Static Function LiberarCQ(cDocto,cProduto,nSldLiber)
Local aLibera := {}
Local cLocCQ := SuperGetMV('MV_CQ', .F., '98')
Local cArmazDes := "01"
Local cLocDest := PadR("INSPECAO", TamSX3('D3_LOCALIZ') [1])
Local cAliasSD7 := GetNextAlias()
Local lRet := .T.
Local cAreaSDB := SDB->(GetArea())

DbSelectArea("SD7")
DbSetOrder(1)
DbGoTop()

xcQuery := " SELECT SD7.R_E_C_N_O_ , D7_NUMERO, D7_SALDO "


xcQuery += " - COALESCE((SELECT SUM(D7_QTDE) FROM " + RetSqlName("SD7") +
" A WHERE A.D_E_L_E_T_ = ' '"
xcQuery += " AND A.D7_FILIAL = SD7.D7_FILIAL AND A.D7_TIPO =
'1' "//LIBERAÇÃO
xcQuery += " AND A.D7_PRODUTO = SD7.D7_PRODUTO AND A.D7_LOCAL =
SD7.D7_LOCAL AND A.D7_NUMERO = SD7.D7_NUMERO"
xcQuery += " AND A.D7_DOC = SD7.D7_DOC AND A.D7_TIPOCQ =
SD7.D7_TIPOCQ AND A.D7_SERIE = SD7.D7_SERIE"
xcQuery += " AND A.D7_FORNECE = SD7.D7_FORNECE AND A.D7_LOJA =
SD7.D7_LOJA), 0) "

xcQuery += " + COALESCE((SELECT SUM(D7_QTDE) FROM " + RetSqlName("SD7") +


" A WHERE A.D_E_L_E_T_ = ' '"
xcQuery += " AND A.D7_FILIAL = SD7.D7_FILIAL AND A.D7_TIPO =
'6' "//ESTORNO
xcQuery += " AND A.D7_PRODUTO = SD7.D7_PRODUTO AND A.D7_LOCAL =
SD7.D7_LOCAL AND A.D7_NUMERO = SD7.D7_NUMERO"
xcQuery += " AND A.D7_DOC = SD7.D7_DOC AND A.D7_TIPOCQ =
SD7.D7_TIPOCQ AND A.D7_SERIE = SD7.D7_SERIE"
xcQuery += " AND A.D7_FORNECE = SD7.D7_FORNECE AND A.D7_LOJA =
SD7.D7_LOJA), 0) D7_SALDO "

xcQuery += " FROM " + RetSqlName("SD3") + " SD3 "


xcQuery += " JOIN " + RetSqlName("SD7") + " SD7 ON SD7.D7_FILIAL = "+
ValToSql( xFilial("SD7") )
xcQuery += " AND SD7.D_E_L_E_T_ = '' AND SD7.D7_NUMSEQ = SD3.D3_NUMSEQ
AND SD3.D3_COD = SD7.D7_PRODUTO AND SD7.D7_LOCAL = SD3.D3_LOCAL"
xcQuery += " WHERE "
xcQuery += " SD3.D3_FILIAL = " + ValToSql( xFilial("SD3") )
xcQuery += " AND SD3.D_E_L_E_T_ = '' "
xcQuery += " AND SD3.D3_DOC = " +ValToSql( cDocto )
xcQuery += " AND SD7.D7_TIPO = '0' "// 6=Estorno
xcQuery += " AND SD7.D7_LOCAL = " + ValToSql( cLocCQ )
xcQuery += " AND SD7.D7_PRODUTO = " + ValToSql( cProduto )
xcQuery += " ORDER BY D7_NUMERO "

DbUseArea(.T., "TOPCONN", TCGenQry(,,xcQuery),cAliasSD7 , .F., .T.)


(cAliasSD7)->(dbGoTop())

nTotPed := 0
While !(cAliasSD7)->(Eof())
nTotPed += (cAliasSD7)->D7_SALDO
(cAliasSD7)->(DbSkip())
EndDo

If !(cAliasSD7)->(Eof())
If nTotPed < nSldLiber
VTAlert("Não ha saldo suficiente no armazem " +
cLocCQ,"Atencao",.T.,4000,3)
Return .T.
EndIf
EndIF

(cAliasSD7)->(DbGoTop())
If !(cAliasSD7)->(Eof())
While !(cAliasSD7)->(Eof())
lSdl98 := .T.

SD7->(dbGoTo((cAliasSD7)->R_E_C_N_O_))

If nSldLiber == 0
Exit
EndIf

If (cAliasSD7)->D7_SALDO == 0
(cAliasSD7)->(DbSkip())
Loop
EndIf

aLibera := {}
nQdtEnder := Min((cAliasSD7)->D7_SALDO, nSldLiber)
nSldLiber -= nQdtEnder

aAdd(aLibera,{ {"D7_TIPO" ,1
,Nil},; // 1=Libera o item do CQ
{"D7_DATA" ,dDataBase
,Nil},;
{"D7_NUMSEQ" ,SD7->D7_NUMSEQ
,Nil},;
{"D7_QTDE" ,nQdtEnder
,Nil},;
{"D7_OBS" ,"Lib. WMS VIXA063"
,Nil},;
{"D7_QTSEGUM" ,0
,Nil},;
{"D7_MOTREJE" ,""
,Nil},;
{"D7_LOCDEST" ,cArmazDes
,Nil},;
{"D7_LOCALIZ" ,cLocDest
,Nil},;
{"D7_SALDO" ,NIL
,Nil},;
{"D7_SALDO2" ,NIL
,Nil},;
{"D7_ESTORNO" ,NIL
,Nil}})

//{"D7_LOCAL" ,"98"
,Nil},;
//{"D7_PRODUTO" ,SD7-
>D7_PRODUTO ,Nil},;
lMsErroAuto := .F.
MSExecAuto({|x,y,z| MATA175(x,y)},aLibera,4)

If lMsErroAuto
//DisarmTransaction()
VTAlert("Houve um erro na rotina, favor tentar
novamente","Atenção.",.T.,4000,3)
//MOSTRAERRO()
lRet := .F.
Exit
Else

EndIf

(cAliasSD7)->(DbSkip())

EndDo

EndIf

(cAliasSD7)->(dbCloseArea())

RestArea(cAreaSDB)

Return lRet

Static Function EnderFalta(cDocto, cProduto, nSldLiber)


Local cLocCQ := SuperGetMV('MV_CQ', .F., '98')
Local aCabSDA := {}
Local aItem := {}
Local _aItensSDB := {}
Local cAliasSDA := GetNextAlias()
Local cDestLocal := SuperGetMV('MV_YENDFAL', .F., PadR("FALTA RECEBIMEN",
TamSX3('DB_LOCALIZ') [1]))
Local lRet := .T.

xcQuery := " SELECT SDA.R_E_C_N_O_ SDARECNO, D7_NUMERO, D7_SALDO, DA_SALDO "


xcQuery += " FROM " + RetSqlName("SD3") + " SD3 "
xcQuery += " JOIN " + RetSqlName("SD7") + " SD7 ON SD7.D7_FILIAL = "+
ValToSql( xFilial("SD7") )
xcQuery += " AND SD7.D_E_L_E_T_ = '' AND SD7.D7_NUMSEQ = SD3.D3_NUMSEQ
AND SD3.D3_COD = SD7.D7_PRODUTO AND SD7.D7_LOCAL = SD3.D3_LOCAL "
xcQuery += " JOIN " + RetSqlName("SDA") + " SDA ON SDA.DA_FILIAL = "+
ValToSql( xFilial("SDA") )
xcQuery += " AND SDA.D_E_L_E_T_ = '' AND SDA.DA_DOC = SD7.D7_NUMERO AND
SDA.DA_PRODUTO = SD7.D7_PRODUTO AND SDA.DA_LOCAL = '01' "
xcQuery += " WHERE "
xcQuery += " SD3.D3_FILIAL = " + ValToSql( xFilial("SD3") )
xcQuery += " AND SD3.D_E_L_E_T_ = '' "
xcQuery += " AND SD3.D3_DOC = " +ValToSql( cDocto )
xcQuery += " AND SD7.D7_TIPO = '0' "// 6=Estorno
xcQuery += " AND SD7.D7_LOCAL = " + ValToSql( cLocCQ )
xcQuery += " AND SD7.D7_PRODUTO = " + ValToSql( cProduto )
xcQuery += " AND SDA.DA_SALDO > 0 "
xcQuery += " ORDER BY D7_NUMERO "

DbUseArea(.T., "TOPCONN", TCGenQry(,,xcQuery),cAliasSDA , .F., .T.)


(cAliasSDA)->(dbGoTop())
// db_iddcf vs. d7 para validar se a baixa já foi feita.
If (cAliasSDA)->(!EOF())

dbSelectArea("SBE")
SBE->(dbSetOrder(1))
SBE->(DbSeek(xFilial("SBE")+"01"+cDestLocal))

dbSelectArea("SDA")
SDA->(dbSetOrder(1))
SDA->(DbGoTo((cAliasSDA)->SDARECNO))

aCabSDA := { {"DA_PRODUTO" ,SDA->DA_PRODUTO


,NIL},;
{"DA_LOCAL" ,SDA->DA_LOCAL
,NIL},;
{"DA_NUMSEQ" ,SDA->DA_NUMSEQ
,NIL},;
{"DA_DOC" ,SDA->DA_DOC
,NIL},;
{"DA_SERIE" ,SDA->DA_SERIE
,NIL},;
{"DA_CLIFOR" ,SDA->DA_CLIFOR
,NIL},;
{"DA_LOJA" ,SDA->DA_LOJA
,NIL}}

aItem := { {"DB_ITEM" ,StrZero(1,TAMSX3("DB_ITEM")


[1]),NIL},;
{"DB_DATA" ,dDataBase
,NIL},;
{"DB_LOCALIZ" ,cDestLocal
,NIL},;
{"DB_TIPO" ,"D"
,NIL},;
{"DB_ESTORNO" ,PadR("
",TamSx3("DB_ESTORNO")[1]),NIL},;
{"DB_QUANT" ,SDA->DA_SALDO
/*nSldLiber*/ ,NIL}}

aAdd(_aItensSDB,aItem)

lMsErroAuto := .F.
//Realiza o endereçamento
MSExecAuto({|x,y,z| mata265(x,y,z)},aCabSDA,_aItensSDB,3)

If lMsErroAuto
lRet := .F.
MostraErro()
Else
//Alert("Ok")
Endif

EndIf

(cAliasSDA)->(dbCloseArea())
Return lRet

Static Function GeraPedDev(xError)

Local aArea := GetArea()


Local aAreaSB2 := SB2->(GetArea())
Local _cAliasTMP := GetNextAlias()
Local _cAliasDCN := GetNextAlias()
Local aCabec := {}
Local aItem := {}
Local aItDcn := {}
Local aItens := {}
Local aDcn := {}
Local cItem := '00'
Local cMensPedido := ''
Local cNumPedido := ''
Local lRet := .T.
Local lRetSZT := .T.
Local cDestLocal := PadR("FALTA RECEBIMEN", TamSX3('C6_LOCALIZ') [1])
Local cTipoPed := ""
BeginSql Alias _cAliasTMP

SELECT SZT.R_E_C_N_O_ SZTRECNO, ZT_FILIAL, ZT_DATA, ZT_HORA, ZT_DOC,


ZT_ORIG, ZT_OCORR, ZT_MOTIVO, ZT_QUANT, ZT_CUSTO, ZT_UMA, ZT_PRODUTO, ZT_FORNECE,
ZT_LOJA, ZT_CUSTO,
Z53_TRANSP, F1_TRANSP, F1_TIPO, F1_FORNECE, F1_LOJA,
F1_TPFRETE, D1_DOC, D1_SERIE, D1_ITEM, D1_COD, D1_QUANT, D1_VUNIT, D1_LOTECTL,
D1_NUMSEQ, A2_COD, A2_LOJA, A2_CGC
FROM %Table:Z53% Z53
JOIN %Table:Z54% Z54 ON Z54_FILIAL = Z53_FILIAL AND Z54_NUM = Z53_NUM
AND Z54.%NotDel%
JOIN %Table:SF1% SF1 ON F1_FILIAL = %xFilial:SF1% AND F1_DOC = Z54_DOC
AND F1_SERIE = Z54_SERIE AND F1_FORNECE = Z54_FORN AND F1_LOJA = Z54_LOJA AND
SF1.%NotDel%
JOIN %Table:SD1% SD1 ON D1_FILIAL = F1_FILIAL AND D1_DOC = F1_DOC AND
D1_SERIE = F1_SERIE AND D1_FORNECE = F1_FORNECE AND D1_LOJA = F1_LOJA AND
SD1.%NotDel%
JOIN %Table:SZT% SZT ON ZT_FILIAL = %xFilial:SZT% AND ZT_DOC = Z54_NUM
AND ZT_PRODUTO = D1_COD AND SZT.%NotDel%
LEFT JOIN %Table:SA2% SA2 ON A2_FILIAL = %xFilial:SA2% AND A2_COD =
Z53_TRANSP AND SA2.%NotDel%
WHERE
Z53_FILIAL = %xFilial:Z53%
AND Z53_NUM = %Exp:cDocto%
AND ZT_ORIG = 'Z54'
AND ZT_OCORR IN ('000005','000014')
AND ZT_PEDIDO = ' '
ORDER BY ZT_OCORR, F1_FORNECE, D1_COD
EndSql

If (_cAliasTMP)->(EOF())
(_cAliasTMP)->(dbCloseArea())
Return(.T.)
EndIf

(_cAliasTMP)->(dbGoTop())
While (_cAliasTMP)->(!EOF())
cItem := '00'
aCabec := {}
aItem := {}
aItens := {}
aDcn := {}
aItDcn := {}
aRecSZT := {} // Listagem das ocorrencias
que geraram o Pedido
aRecDCN := {}
_cOcorrencia := (_cAliasTMP)->ZT_OCORR
_cFornecedor := (_cAliasTMP)->F1_FORNECE
_cProduto := (_cAliasTMP)->D1_COD
_nSaldoPrd := (_cAliasTMP)->ZT_QUANT
_cTransp := (_cAliasTMP)->F1_TRANSP
cMensPedido := "DEV ROMANEIO " + (_cAliasTMP)->ZT_DOC + " - " +
ALLTRIM(cUserName)

IF _cOcorrencia == "000005" .OR. (_cAliasTMP)->F1_TPFRETE == "C"


// FALTA DE MERCADORIA ou FRETE CIF DEVOLVE PRO FORNECEDOR
If (_cAliasTMP)->F1_TIPO == 'N'
cTipoPed := "D"
cForneced := (_cAliasTMP)->F1_FORNECE
cLoja := (_cAliasTMP)->F1_LOJA
ElseIf (_cAliasTMP)->F1_TIPO == 'D'
cTipoPed := "B"
DbSelectArea("SA1")
SA1->(DbSetOrder(3)) // A1_FILIAL + A1_CGC
SA1->(DbSeek( xFilial("SA1") + (_cAliasTMP)->A2_CGC ))
cForneced := SA1->A1_COD
cLoja := SA1->A1_LOJA
ElseIf (_cAliasTMP)->F1_TIPO == 'B'
cTipoPed := "D"
cForneced := (_cAliasTMP)->F1_FORNECE
cLoja := (_cAliasTMP)->F1_LOJA
EndIf
ElseIf _cOcorrencia == "000014" .AND. (_cAliasTMP)->F1_TPFRETE ==
"F" // PRODUTO AVARIADO e FRETE FOB É "VENDA" PRA TRANSPORTADORA
cTipoPed := "B"
cForneced := (_cAliasTMP)->A2_COD
cLoja := (_cAliasTMP)->A2_LOJA
Else
If (_cAliasTMP)->F1_TIPO == 'N' .Or. (_cAliasTMP)->F1_TIPO == 'B'
cTipoPed := "D"
cForneced := (_cAliasTMP)->F1_FORNECE
cLoja := (_cAliasTMP)->F1_LOJA
If (_cAliasTMP)->F1_TIPO == 'B'
cForneced := (_cAliasTMP)->A2_COD
cLoja := (_cAliasTMP)->A2_LOJA
EndIf
ElseIf (_cAliasTMP)->F1_TIPO == 'D'
cTipoPed := "B"
cForneced := (_cAliasTMP)->A2_COD
cLoja := (_cAliasTMP)->A2_LOJA
EndIf
EndIf

aAdd(aCabec, {"C5_FILIAL" , FwCodFil()


,Nil})
aAdd(aCabec, {"C5_TIPO" , cTipoPed
,Nil}) // Tipo de pedido
aAdd(aCabec, {"C5_CLIENTE" , cForneced
,Nil}) // Codigo do fornecedor
aAdd(aCabec, {"C5_LOJACLI" , cLoja
,Nil}) // Loja do fornecedor
aAdd(aCabec, {"C5_EMISSAO" , dDatabase
,Nil}) // Data de emissao
aAdd(aCabec, {"C5_TIPLIB" , "1"
,Nil}) // Tipo de Liberacao
aAdd(aCabec, {"C5_PBRUTO" , 0
,Nil}) //
aAdd(aCabec, {"C5_PESOL" , 0
,Nil}) //
aAdd(aCabec, {"C5_YSTATUS" , "3"
,Nil}) // Estacionado
aAdd(aCabec, {"C5_YOBS" , cMensPedido
,Nil}) //
aadd(aCabec, {"C5_CONDPAG" ,"099"
,Nil})
aadd(aCabec, {"C5_NATUREZ" ,"11101"
,Nil})
aadd(aCabec, {"C5_TPFRETE" ,"S"
,Nil}) // Sem frete, orientação do Fiscal
aAdd(aCabec, {"C5_TRANSP" , _cTransp
,Nil}) // Transportadora
aAdd(aCabec, {"C5_INDPRES" , '1'
,Nil}) // Presenca Comprador

aCabec := FWVetByDic( aCabec, 'SC5' )

While (_cAliasTMP)->(!Eof())

// Quando mudar de ocorrencia, deve finalizar e iniciar um novo


pedido
If (_cAliasTMP)->ZT_OCORR <> _cOcorrencia .OR. (_cAliasTMP)-
>F1_FORNECE <> _cFornecedor
Exit
EndIf

// Quando terminou o saldo da ocorrencia para o produto, nao


precisa percorrer os N registros da SD1
If (_cAliasTMP)->ZT_OCORR == _cOcorrencia .AND. (_cAliasTMP)-
>F1_FORNECE == _cFornecedor .AND. _cProduto == (_cAliasTMP)->D1_COD .AND.
_nSaldoPrd == 0
Exit
EndIf

// O mesmo produto pode estar em varios itens de NF's diferentes,


por isso deve controlar o saldo
If _cProduto <> (_cAliasTMP)->D1_COD
_nSaldoPrd := (_cAliasTMP)->ZT_QUANT
EndIf

cItem := SOMA1(cItem)
aItem := {}
aItDcn := {}
nQtd := MIN(_nSaldoPrd,(_cAliasTMP)->D1_QUANT)
_nSaldoPrd := _nSaldoPrd - nQtd
//cTES := MaTesInt(2,MV_PAR05,MV_PAR01,MV_PAR02,'C',
(_cAliasTMP)->B1_COD)
aAdd(aItem, {"C6_FILIAL" , FwCodFil()
,Nil})
aAdd(aItem, {"C6_ITEM" , cItem
,Nil}) // Numero do Item no Pedido
aAdd(aItem, {"C6_PRODUTO" , (_cAliasTMP)->ZT_PRODUTO
,Nil}) // Codigo do Produto
If cTipoPed == "D" // Para devolução preenche os campos da
NF origem
aAdd(aItem, {"C6_NFORI" ,(_cAliasTMP)->D1_DOC
,Nil})
aAdd(aItem, {"C6_SERIORI" ,(_cAliasTMP)->D1_SERIE
,Nil})
aAdd(aItem, {"C6_ITEMORI" ,(_cAliasTMP)->D1_ITEM
,Nil})
EndIf
aAdd(aItem, {"C6_QTDVEN" , nQtd
,Nil}) // Quantidade Vendida
aAdd(aItem, {"C6_PRUNIT" , (_cAliasTMP)->D1_VUNIT
,NIL}) // PRECO DE LISTA
aAdd(aItem, {"C6_PRCVEN" , (_cAliasTMP)->D1_VUNIT
,Nil}) // Preco Unitario Liquido
aAdd(aItem, {"C6_VALOR" , Round((_cAliasTMP)->D1_VUNIT *
nQtd,2) ,Nil}) // Valor Total do Item
aAdd(aItem, {"C6_ENTREG" , dDataBase
,Nil}) // Data da Entrega
aAdd(aItem, {"C6_OPER" , "52"
,Nil}) // Tipo de Entrada/Saida do Item

//avaria
aAdd(aItem, {"C6_OPER" , "01"
,Nil}) // Tipo de Entrada/Saida do Item

//aAdd(aItem, {"C6_TES" , cTES


,Nil}) // Tipo de Entrada/Saida do Item
aAdd(aItem, {"C6_QTDLIB" , 0
,Nil}) // Quantidade Liberada
aAdd(aItem, {"C6_LOCAL" , "01"
,Nil}) // Local
aAdd(aItem, {"C6_LOCALIZ" , cDestLocal
,Nil}) // Endereco

aAdd(aItens, aItem)
aAdd(aRecSZT,(_cAliasTMP)->SZTRECNO)

// Vetor com as informações necessarias para atualizar a


ocorrencia na tabela DCN
aAdd(aItDcn, {"DCN_PROD" , (_cAliasTMP)->ZT_PRODUTO
,Nil}) // DCN_PROD
aAdd(aItDcn, {"DCN_NUMSEQ" , (_cAliasTMP)->D1_NUMSEQ
,Nil}) // DCN_NUMSEQ
aAdd(aItDcn, {"DCN_DOC" , (_cAliasTMP)->D1_DOC
,Nil}) // DCN_DOC
aAdd(aItDcn, {"DCN_OCORR" , (_cAliasTMP)->ZT_OCORR
,Nil}) // DCN_DOC
aAdd(aDcn, aItDcn)

(_cAliasTMP)->(dbSkip())
EndDo

Pergunte("MTA410",.F.) //Carrega as variaveis com os parametros


da execauto
lMSErroAuto := .F.
MSExecAuto({|x,y| MATA410(x,y)},aCabec,aItens,3)

If lMsErroAuto
xError := MostraErro("\system\","VIXA063_Erro_Pedido.log")
// cria o arquivo de erro e armazena o erro.
lRet := .F.
lRetSZT := .F.
Else
cNumPedido := SC5->C5_NUM

// Atualiza o registro das ocorrencias com o numero do pedido


gerado
For _nZ := 1 To Len(aRecSZT)
dbSelectArea("SZT")
SZT->(dbGoTo(aRecSZT[_nZ]))
RecLock("SZT",.F.)
SZT->ZT_PEDIDO := cNumPedido
SZT->(MsUnlock())
// lRetSZT := .T.
Next _nZ

// Faz a Liberação do Pedido - Empenho do estoque


U_LibPedido(cNumPedido)

EndIf

EndDo

If lRetSZT

// Percorre novamente todos os itens com divergencia


// Atualiza e encerra ocorrencia na DCN
BeginSql Alias _cAliasDCN

SELECT DCN.R_E_C_N_O_ DCNRECNO, ZT_PEDIDO, D1_NUMSEQ, C6_ITEM


FROM %Table:DCN% DCN
JOIN %Table:SZT% SZT ON SZT.%NotDel% AND ZT_DOC = DCN_YLOTER AND
ZT_PRODUTO = DCN_PROD AND ZT_OCORR = CASE WHEN DCN_OCORR = '0001' THEN '000005'
ELSE '000014' END
JOIN %Table:SD1% SD1 ON D1_FILIAL = %xFilial:SD1% AND SD1.%NotDel
% AND D1_DOC = DCN_DOC AND D1_COD = ZT_PRODUTO AND D1_NUMSEQ = DCN_NUMSEQ
JOIN %Table:SC6% SC6 ON C6_FILIAL = %xFilial:SC6% AND SC6.%NotDel
% AND C6_NUM = ZT_PEDIDO AND C6_PRODUTO = ZT_PRODUTO
WHERE
DCN_FILIAL = %xFilial:DCN%
AND DCN_YLOTER = %Exp:cDocto%
AND ZT_ORIG = 'Z54'
AND ZT_OCORR IN ('000005','000014')
AND DCN_ACAO = ' '
AND ZT_PEDIDO <> ' '
EndSql

(_cAliasDCN)->(dbGoTop())
While (_cAliasDCN)->(!EOF())

dbSelectArea("DCN")
DCN->(dbGoTo((_cAliasDCN)->DCNRECNO))
RecLock("DCN",.F.)
DCN->DCN_ACAO := '2' // 1=Doc. Entrada;2=Doc.
Saida;3=Movimento Interno
DCN->DCN_STATUS := '3' // 1=Ocorrencia
Registrada;2=Ocorrencia em Aguardo;3=Ocorrencia Encerrada
DCN->DCN_DTFIM := dDatabase
DCN->DCN_HRFIM := TIME()
DCN->DCN_YPED := (_cAliasDCN)->ZT_PEDIDO
DCN->DCN_YITPED := (_cAliasDCN)->C6_ITEM
DCN->(MsUnlock())

(_cAliasDCN)->(dbSkip())
EndDo
(_cAliasDCN)->(dbCloseArea())
EndIf

(_cAliasTMP)->(dbCloseArea())

RestArea(aAreaSB2)
RestArea(aArea)

Return lRet

Static Function EnvWorkflow(cDocto, xError)

Local cHTML := ''


Local cAssunto := ''
Local cDestino :=
SuperGetMv("VIX063DEST",,'leandro.maffioletti@fortbras.com.br')
//SUPERGETMV('MV_Y410RES', .F., 'csantos@ambralogistica.com.br')
Local cOBS := ''
Local cAlias := GetNextAlias()

Default xError := ""

BeginSQL Alias cAlias

COLUMN ZT_DATA AS DATE


COLUMN Z53_DTAG AS DATE

SELECT DISTINCT ZT_DATA, ZT_HORA, ZT_MOTIVO, ZT_USER, ZT_USERLIB,


ZT_PRODUTO, ZT_QUANT, ZT_CUSTO, B1_DESC, ZT_DOC,
Z53_NOMETR, Z53_DTAG, C5_NUM, C6_QTDVEN, C6_VALOR, C6_NOTA
FROM %Table:SZT% SZT
JOIN %Table:Z53% (NOLOCK) Z53 ON Z53_FILIAL = %xFilial:Z53% AND Z53_NUM
= ZT_DOC AND Z53.%NotDel%
JOIN %Table:Z54% (NOLOCK) Z54 ON Z54_FILIAL = %xFilial:Z54% AND Z54_NUM
= ZT_DOC AND Z54.%NotDel%
JOIN %Table:SF1% (NOLOCK) SF1 ON F1_FILIAL = %xFilial:SF1% AND F1_DOC =
Z54_DOC AND F1_SERIE = Z54_SERIE AND F1_FORNECE = Z54_FORN AND F1_LOJA = Z54_LOJA
AND SF1.%NotDel%
JOIN %Table:SD1% (NOLOCK) SD1 ON D1_FILIAL = F1_FILIAL AND D1_DOC =
F1_DOC AND D1_SERIE = F1_SERIE AND D1_FORNECE = F1_FORNECE AND D1_LOJA = F1_LOJA
AND D1_COD = ZT_PRODUTO AND SD1.%NotDel%
LEFT JOIN %Table:SC5% (NOLOCK) SC5 ON C5_FILIAL = %xFilial:SC5% AND
C5_NUM = ZT_PEDIDO AND SC5.%NotDel%
LEFT JOIN %Table:SC6% (NOLOCK) SC6 ON C6_FILIAL = %xFilial:SC6% AND
C6_NUM = C5_NUM AND C6_PRODUTO = ZT_PRODUTO AND SC6.%NotDel%
JOIN %Table:SB1% (NOLOCK) SB1 ON B1_FILIAL = %xFilial:SB1% AND B1_COD =
ZT_PRODUTO AND SB1.%NotDel%
WHERE ZT_FILIAL = %xFilial:SZT%
AND ZT_ORIG = 'Z54'
AND ZT_DOC = %Exp:cDocto%
AND SZT.%NotDel%

EndSQL

If (cAlias)->(EOF())
(cAlias)->(dbCloseArea())
Return
EndIf

If !Empty(xError)
cAssunto := 'Erro Checkin de Produtos. Romaneio nº: ' +cDocto
Else
cAssunto := 'Divergências Checkin de Produtos. Romaneio nº: '
+cDocto
EndIF
cOBS := ""
cHTML := '<HTML>'
cHTML += '<script language="JavaScript"></script>'
cHTML += '<TITLE>Produtos com Divergência no Checkin</TITLE>'
cHTML += '<body bgcolor="#FFFFFF">'
cHTML += '<font color="black" face="Verdana" size="3"><b>Romaneio nº: ' +
cDocto + ' - '+ DTOC((cAlias)->ZT_DATA)+ '</b></font><br><br>'
cHTML += '<font color="black" face="Verdana" size="2"><b>Transportadora: ' +
(cAlias)->Z53_NOMETR + ' </b></font><br><br>'
//cHTML += '<font color="black" face="Verdana"
size="2"><b>'+cOBS+'</b></font><br><br>'
If !Empty(xError)
cHTML += '<font color="black" face="Verdana" size="2"><b>Erro check-in!
</b></font><br>'
cHTML += '<font color="black" face="Verdana" size="3"><b>Abaixo segue
relatório de inconsistência gerada durante o processo para tratativa das
divergências para o check-in do romaneio.</b></font><br><br>'
cHTML += '<font color="black" face="Verdana" size="3"><b>'
cHTML += '<dd><dl>'+ xError +'</dd></dl>'
cHTML += '</b></font><br><br>'
cHTML += '<font color="black" face="Verdana"
size="3"><b>ATENÇÃO!</b></font><br><br>'
cHTML += '<font color="black" face="Verdana" size="3"><b>Após a solução
do incidente demonstrado no relatório, tentar finalizar o recebimento
novamente.</b></font><br><br>'
Else
cHTML += '<font color="black" face="Verdana" size="2"><b>Itens:
</b></font><br>'
cHTML += '<table border="1" cellpadding="10" cellspacing="1"
width="737" height="50">'
cHTML += '<tr>'
cHTML += '<td bgcolor="#99CCFF"><p align="left"><font size="1"
face="Verdana"><b>Data Ocorr</b></font></td>'
cHTML += '<td bgcolor="#99CCFF"><p align="left"><font size="1"
face="Verdana"><b>Hora</b></font></td>'
cHTML += '<td bgcolor="#99CCFF"><p align="left"><font size="1"
face="Verdana"><b>Ocorrencia</b></font></td>'
cHTML += '<td bgcolor="#99CCFF"><p align="left"><font size="1"
face="Verdana"><b>Operad.</b></font></td>'
cHTML += '<td bgcolor="#99CCFF"><p align="left"><font size="1"
face="Verdana"><b>Lider</b></font></td>'
cHTML += '<td bgcolor="#99CCFF"><p align="left"><font size="1"
face="Verdana"><b>Produto</b></font></td>'
cHTML += '<td bgcolor="#99CCFF"><p align="left"><font size="1"
face="Verdana"><b>Descrição</b></font></td>'
cHTML += '<td bgcolor="#99CCFF"><p align="left"><font size="1"
face="Verdana"><b>Pedido</b></font></td>'
cHTML += '<td bgcolor="#99CCFF"><p align="left"><font size="1"
face="Verdana"><b>Qtd</b></font></td>'
cHTML += '<td bgcolor="#99CCFF"><p align="left"><font size="1"
face="Verdana"><b>Vlr Tot</b></font></td>'
cHTML += '</tr>'

While !(cAlias)->(EOF())
cHTML += '<tr>'
cHTML += '<td><p align="left"><font size="1"
face="Verdana">'+DTOC((cAlias)->ZT_DATA)+'</font></p></td>'
cHTML += '<td><p align="left"><font size="1"
face="Verdana">'+(cAlias)->ZT_HORA+'</font></p></td>'
cHTML += '<td><p align="left"><font size="1"
face="Verdana">'+ALLTRIM((cAlias)->ZT_MOTIVO)+'</font></p></td>'
cHTML += '<td><p align="left"><font size="1"
face="Verdana">'+UsrRetName((cAlias)->ZT_USER)+'</font></p></td>'
cHTML += '<td><p align="left"><font size="1"
face="Verdana">'+UsrRetName((cAlias)->ZT_USERLIB)+'</font></p></td>'
cHTML += '<td><p align="left"><font size="1"
face="Verdana">'+(cAlias)->ZT_PRODUTO+'</font></p></td>'
cHTML += '<td><p align="left"><font size="1"
face="Verdana">'+(cAlias)->B1_DESC+'</font></p></td>'
cHTML += '<td><p align="left"><font size="1"
face="Verdana">'+(cAlias)->C5_NUM+'</font></p></td>'
cHTML += '<td><p align="left"><font size="1"
face="Verdana">'+ALLTRIM(TRANSFORM((cAlias)->ZT_QUANT,PesqPict("SC6","C6_QTDVEN")))
+'</font></p></td>'
cHTML += '<td><p align="left"><font size="1"
face="Verdana">'+ALLTRIM(TRANSFORM((cAlias)->ZT_CUSTO,PesqPict("SC6","C6_VALOR")))
+'</font></p></td>'
cHTML += '</tr>'
(cAlias)->(DbSkip())
EndDo
EndIf
cHTML += '</table>'
cHTML += '<BR>'
cHTML += '<font size="1" color="#007FFF" face="Verdana">Este e-mail é
automático. Não Responda esta mensagem.</font>'
cHTML += '<BR>'
cHTML += '</body>'
cHTML += '</HTML>'

If u_EnvEmail(cDestino,cAssunto,cHtml)

//MsgInfo("E-mail com dados do corte do pedido enviado")

Else
//MsgAlert('Problemas ao enviar email com dados do corte do pedido')

Endif

(cAlias)->(dbCloseArea())

Return

Você também pode gostar