Árvore de páginas

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.
MATA681 - Apontamento de Produção baseado no Roteiro de Operações

SFCA316 - Apontamento Modelo 2 - SIGASFC


Linha de Produto:

Protheus

Segmento:

Manufatura

Módulo:

SIGAPCP - Planejamento e Controle da Produção

Parâmetro(s):

NomeTipoDescriçãoObrigatórioReferênciaaVetorArray of Record Array contendo os valores para o Apontamento de ProduçãoXnOpcNuméricoOpção escolhida: 3) Inclusão 5) Estorno 7) EncerramentoXDescrição:

Esta rotina possibilita a inclusão do apontamento de produção, estorno do apontamento de produção e encerramento da ordem de produção,  na rotina Produção baseado no Roteiro de Operações, de forma automática.

Observações:

O parâmetro AUTREFUGO pode ser preenchido na execução da rotina automática de Apontamento, quando o MV_DIGIPER estiver configurado como S.

Para apontamentos manuais, ao informar uma quantidade de perda é aberta uma tela para que sejam informadas as perdas.

Na rotina automática, para informar as perdas, deve ser informado o parâmetro AUTREFUGO e um array com as informações das perdas. Este array corresponde as informações da tela que é aberta de forma manual.

Para mais detalhes sobre este parâmetro, verificar o EXEMPLO 2.

Os parâmetros INDEXAUTRECNO podem ser preenchidos na execução da rotina automática de Apontamento, quando informada a opção 5 - Estorno.

Na rotina automática, para indicar qual registro deve ser estornado, deve ser informado o parâmetro INDEX ou AUTRECNO.

O parâmetro INDEX indica qual o índice da SH6 (Movimentos da Produção) deverá ser usado pela rotina automática para selecionar o registro a ser estornado. Os campos do índice devem estar no array enviado no EXECAUTO.

O parâmetro AUTRECNO indica qual o R_E_C_N_O_ do registro que a rotina automática deve estornar.

Para mais detalhes sobre estes parâmetros, verificar o EXEMPLO 3.

O parâmetro AUTRECNO pode ser preenchido na execução da rotina automática de Apontamento, quando informada a opção 7 - Encerramento.

Na rotina automática, para indicar qual registro deve ser encerrado, deve ser informado o parâmetro AUTRECNO.

O parâmetro AUTRECNO indica qual o R_E_C_N_O_ do registro que a rotina automática deve encerrar.

Para mais detalhes sobre este parâmetro, verificar o EXEMPLO 4.

Programa Fonte:MATA681.PRW Sintaxe:

MATA681 - Apontamento de Produção baseado no Roteiro de Operações ( < aVetor>, < nOpc> ) --> nil

Retorno: nil(nulo)

SIGASFC - Chão de Fábrica


Descrição:

A rotina automática, para apontamentos do módulo de Chão de Fábrica, permite incluir um apontamento de produção, iniciar um apontamento de produção, finalizar um apontamento de produção e abandonar um apontamento de produção.

Observações:

Cada opção (Incluir Apontamento, Iniciar Apontamento, Finalizar Apontamento e Abandonar Apontamento) deve instanciar o seu respectivo modelo, setando a operação da ação desejada.

Incluir Apontamento

oModel := FWLoadModel( "SFCA314" ) //Instanciar o modelo

oModel:SetOperation( 3 ) //Setar a operação da ação Incluir Apontamento

Iniciar Apontamento

oModel := FWLoadModel( "SFCA319" ) //Instanciar o modelo

oModel:SetOperation( 3 ) //Setar a operação da ação Iniciar Apontamento

Finalizar Apontamento

oModel := FWLoadModel( "SFCA314" ) //Instanciar o modelo

oModel:SetOperation( 4 ) //Setar a operação da ação Finalizar Apontamento

Abandonar Apontamento

oModel := FWLoadModel( "SFCA319" ) //Instanciar o modelo

oModel:SetOperation( 4 ) //Setar a operação da ação Abandonar Apontamento


Para que o apontamento seja realizado corretamente, é necessário criar as seguintes variáveis PRIVATE:

  • Private lExAutSFC := .T.
  • Private cTipApon 

A variável cTipApon deve ser carregada da seguinte forma:

  • Incluir Apontamento: cTipApon := ' ' (branco)
  • Iniciar Apontamento: cTipApon := 'I'
  • Finalizar Apontamento: cTipApon := 'F'
  • Abandonar Apontamento: cTipApon := 'A'


Para mais detalhes sobre cada uma das opções, verificar os exemplos.

Programa Fonte:SFCA314.PRW, SFCA319.PRW
Bloco de código
title
Bloco de código
titleExemplo:
linenumberstrue
//------------------------------- EXEMPLO 1  ------------------------------------
// Incluir Apontamento
//-------------------------------------------------------------------//
#INCLUDE "RWMAKE.CH" 
#INCLUDE "TBICONN.CH" 

User Function RMATA681() 
Local aVetor := {} 
Local dData
Local nOpcUser Function SFCIncApo()
Local lRet     := .T.
Local cMsgErro := ''
Local aErro    := 3 {}

Local cOper

PRIVATE lMsErroAuto := .F. 

PREPAREPrivate ENVIRONMENTcTipApon EMPRESA "99" FILIAL "01" MODULO "COM" TABLES "SH6"

dData:=dDataBase
aVetor := {;
           {"H6_OP"	     ,"00000101001 " ,NIL},;
           {"H6_PRODUTO" ,"PA01 "        ,NIL},;
           {"H6_OPERAC"  ,"01":= ' ' //Obrigatório para identificar o tipo do apontamento do SFC - ' ' = Em branco - Incluir
Private lExAutSFC := .T. //Obrigatório para indentificar que está sendo chamado via EXECAUTO

    OpenSm0()
    RPCSetType(3)
    RPCSetEnv("99" , "01",,,"PCP",,,,,,)

    cOp        := PadR('00004801001',TamSX3("CYV_NRORPO")[1])           ,NIL},;//OP
    cIdOper       {"H6_RECURSO" ,"1":= PadR('0000000001',TamSX3("CYV_IDAT")[1])             ,NIL},;
   //ID OPERAÇÃO
    cSplit     {"H6_DTAPONT" ,dData:= PadR('00001',TamSX3("CYV_IDATQO")[1])                 ,NIL},;//SPLIT
    cMaq        {"H6_DATAINI" ,dData:= PadR('REC1',TamSX3("CYV_CDMQ")[1])           ,NIL},;
         //MAQUINA	

	cDataIniRe  {"H6_HORAINI" ,"19:11":= dDataBase        ,NIL},;
   //DATA INICIO REPORTE
	cTimeIniRe  := '14:00:00'   {"H6_DATAFIN" ,dData      //HORA    ,NIL},;
   INICIO REPORTE	
	cDataFimRe  := dDataBase        {"H6_HORAFIN" ,"19:20"  //DATA FIM REPORTE
    ,NIL},;
cTimeFimRe  := '15:00:00'        {"H6_PT"  //HORA FIM REPORTE
	cDatProd    ,'P':= dDataBase            ,NIL},;//DATA PRODUCAO
    
	cItem       {"H6_LOCAL"   ,"01"   := ' ' //ITEM
    cTurno      := '  ,NIL},;' //TURNO
    cDoc       {"H6_QTDPROD" ,7    := ' ' //Documento
    cSerieDoc   := ' '  ,NIL}} 

MSExecAuto({|x| mata681(x)},aVetor, nOpc) 

If lMsErroAuto 
    Mostraerro()
Else 
    Alert("ok")
EndIf

Return

//--------------------------- EXEMPLO 2  ----------------------------------------------------------------------------------//
//--------------------------- Exemplo de Perda ----------------------------------------------------------------------------//

#Include 'Protheus.ch'
#INCLUDE "RWMAKE.CH"
#INCLUDE "TBICONN.CH"
#INCLUDE "TOTVS.CH"

User Function rmata681()

Local xRotAuto := {}
Local aRefugos := {}
Local nI

PRIVATE lMsErroAuto := .F.

OpenSm0()
RPCSetType(3)
RPCSetEnv("99" , "01",,,"PCP",,,,,,)

dData := dDataBase 

cOp    //Série Documento
    cDeposito   := ' ' //Depósito
    cLoteSerie  := ' ' //Lote/Serie
    cValLote    := ' ' //Data Validade Lote

	cCodSetup   := ' ' //CODIGO SETUP
	cDataIniSe  := ' ' //DATA INICIO SETUP
	cDataFimSe  := ' ' //DATA FIM SETUP
	cTimeIniSe  := ' ' //HORA INICIO SETUP
	cTimeFimSe  := ' ' //HORA FIM SETUP

    cFerram     := ' ' //Ferramenta
    cOperador   := ' ' //Operador
    cEquipe     := PadR('Y0216101001',TamSX3("H6_OP")[1])
cProd       := PadR('4054-PA2'   ,TamSX3("H6_PRODUTO")[1])
cOperac     := PadR('10'         ,TamSX3("H6_OPERAC")[1])
cRec        := PadR('REC1'       ,TamSX3("H6_RECURSO")[1])
cDtIni      := dData
cHrIni      := '08:00:00'
cDtFim      := dData
cHrFim      := '08:10:00'
cPt         := PadR('P'          ,TamSX3("H6_PT")[1])
cLocal      := PadR('01'         ,TamSX3("H6_LOCAL")[1])
cQtdProd    := 1
cQtdPerd    := 1

xRotAuto := {;
            {"H6_FILIAL" 	, xFilial("SH6")  ,Nil},;
			{"H6_OP" 		, cOp	          ,Nil},;
			{"H6_PRODUTO"   , cProd  		  ,Nil},;
			{"H6_OPERAC" 	, cOperac 		  ,Nil},;
			{"H6_RECURSO"	, cRec	     	  ,Nil},;
			{"H6_DATAINI"	, cDtIni   	 	  ,Nil},;
			{"H6_HORAINI"	, cHrIni	 	  ,Nil},;
			{"H6_DATAFIN"	, cDtFim  	 	  ,Nil},;
			{"H6_HORAFIN"	, cHrFim	 	  ,Nil},;
			{"H6_PT"	    , cPt	   		  ,Nil},;
			{"H6_LOCAL"	    , cLocal	 	  ,Nil},;
			{"H6_QTDPROD"	, cQtdProd		  ,Nil},;
			{"H6_QTDPERD"	, cQtdPerd	 	  ,Nil};
            }

For nI := 1 To 2
 ' //Equipe

    //Posicionar no split para ativar o model
    DbSelectArea("CYY")
	CYY->(DbSetOrder(1))
	If CYY->(!DbSeek(xFilial("CYY")+cOp+cIdOper+cSplit))
		cMsgErro := "Split não cadastrado."
   		lRet := .F.
	Endif	

	If lRet
		If CYY->CYY_CDMQ != cMaq
			cMsgErro := "Máquina não pertence ao Id da Operação."         
			lRet := .F.
		EndIf
	EndIf

    If lRet
	    DbSelectArea("CY9")
	    CY9->(DbSetOrder(1))
	    If CY9->(!DbSeek(xFilial("CY9")+cOp+cIdOper))
	        cMsgErro := "Operação não cadastrada."
   		    lRet := .F.
	    EndIf
    EndIf

	If lRet .And. Empty(cOper)				
		cOper := CY9->CY9_CDAT
	EndIf

	If lRet .And. !Empty(cOper)				
	    If CY9->CY9_CDAT != cOper
			cMsgErro := "Operação não pertence ao Id da Operação."
			lRet := .F.
		EndIf
	EndIf	

	If lRet				
		// Instancia o modelo
		oModel := FWLoadModel( "SFCA314" )

		//Limpa variável de erro
		aErro := oModel:GetErrorMessage(.T.)
		aErro := {}

		oModel:SetOperation( 3 ) //Incluir apontamento
		
        If !oModel:Activate()   				
   			lRet := .F.
			aErro := oModel:GetErrorMessage()
     		If !Empty(aErro[6])
        		cMsgErro := oModel:GetErrorMessage()[6]
     		Else
				cMsgErro := "Ocorreram erros ao realizar o apontamento."
     		EndIf     								
		EndIf
	EndIf

	If lRet
		//MODELOS
		oModelCY0 := oModel:GetModel( "CY0DETAIL" )               //REFUGO
		oModelCYW     
 := oModel:GetModel( "CYWDETAIL" )   If nI == 1
        cRfProd //MAO        DE OBRA
		oModelCZ0 := PadR('4054-MP3'   ,TamSX3("BC_PRODUTO")[1])
oModel:GetModel( "CZ0DETAIL" )       Else
        cRfProd//FERRAMENTA
        oModelCZW := PadR('4054-MP4'   ,TamSX3("BC_PRODUTO")[1])
oModel:GetModel( "CZWDETAIL" )     EndIf

    cRfLocOrig      := PadR('01'         ,TamSX3("BC_LOCORIG")[1])
//GGF
			
		oModel:SetValue("CYVMASTER","CYV_NRORPO",cOp)        cRfTipo     //OP
    	oModel:= PadR('R'   SetValue("CYVMASTER","CYV_IDAT"  ,cIdOper) 	       ,TamSX3("BC_TIPO")[1])
    cRfMotivo//ID OPERAÇÃO
		oModel:SetValue("CYVMASTER","CYV_CDAT"  ,cOper)         := PadR('FH'  //OPERAÇÃO
        ,TamSX3("BC_MOTIVO")[1])
    cRfQuant	oModel:SetValue("CYVMASTER","CYV_IDATQO",cSplit)  	      //SPLIT
    := 1
 	oModel:SetValue("CYVMASTER","CYV_CDMQ"  ,cMaq)   
    aAdd(aRefugos, {;
    //MAQUINA	
	               {"BC_PRODUTO"  , cRfProdoModel:SetValue("CYVMASTER","CYV_DTRPBG",cDataIniRe)      //DATA  ,Nil},;
INICIO REPORTE                   {"BC_LOCORIG"  , cRfLocOrig    ,Nil},;
      	
		oModel:SetValue("CYVMASTER","CYV_HRRPBG",cTimeIniRe)      //HORA INICIO REPORTE

		//INFORMAÇÕES SETUP
		If !Empty(cCodSetup)
			oModel:SetValue("CYVMASTER","CYV_DTBGSU",cDataIniSe)  //DATA INICIO SETUP
             {"BC_TIPO"     , cRfTipo       ,Nil},;
     	oModel:SetValue("CYVMASTER","CYV_DTEDSU",cDataFimSe)  //DATA FIM SETUP
			oModel:SetValue("CYVMASTER","CYV_HRBGSU",cTimeIniSe)  //HORA INICIO SETUP
              {"BC_MOTIVO"   , cRfMotivo     ,Nil},;
	oModel:SetValue("CYVMASTER","CYV_HREDSU",cTimeFimSe)  //HORA FIM SETUP
			oModel:SetValue("CYVMASTER","CYV_CDSU",cCodSetup)     //CODIGO SETUP
		EndIf
             {"BC_QUANT"	
		//QUANTIDADES
		oModel:SetValue("CYVMASTER","CYV_QTATRP",1)    , cRfQuant      ,Nil};
    //QUANTIDADE REPORTADA			
		oModel:SetValue("CYVMASTER","CYV_QTATAP",1)               }//QUANTIDADE APROVADA
		oModel:SetValue("CYVMASTER","CYV_QTATRF",0)               //QUANTIDADE 
Next nI
REFUGADA 
		oModel:SetValue("CYVMASTER","CYV_QTATRT",0)               //QUANTIDADE RETRABALHADA
						
		If Len(aRefugos) > 0
!Empty(cItem)
			oModel:SetValue("CYVMASTER","CYV_CDACRP",cItem)          aAdd(xRotAuto, {"AUTREFUGO", aRefugos, Nil})
EndIf

msExecAuto({|x,y| MATA681(x,y)},xRotAuto,3)

If lMsErroAuto
	ALERT("ERRO NA INCLUSAO")
	Mostraerro()
Else
	ALERT("PROCESSAMENTO EFETUADO COM SUCESSO")
Endif

Return

//--------------------------- EXEMPLO 3.1----------------------------------------------------------------------------------//
//--------------------------- Exemplo de Estorno AUTRECNO------------------------------------------------------------------//

#Include 'Protheus.ch'
#INCLUDE "RWMAKE.CH"
#INCLUDE "TBICONN.CH"
#INCLUDE "TOTVS.CH"

User Function rEst681()

Local xRotAuto := {}

PRIVATE lMsErroAuto := .F.

OpenSm0()
RPCSetType(3)
RPCSetEnv("99" , "01",,,"PCP",,,,,,)

dData := dDataBase 

cOp         := PadR('Y0226201001',TamSX3("H6_OP")[1])
cProd       := PadR('19579-PA'   ,TamSX3("H6_PRODUTO")[1])
cOperac     := PadR('10'         ,TamSX3("H6_OPERAC")[1])
cRecno      := 140 //R_E_C_N_O_ que deseja estornar da SH6


xRotAuto := {;
            {"H6_FILIAL" 	, xFilial("SH6")  ,Nil},;
			{"H6_OP" 		, cOp	          ,Nil},;
			{"H6_PRODUTO"   , cProd  		  ,Nil},;
			{"H6_OPERAC" 	, cOperac 		  ,Nil},;
			{"AUTRECNO" 	, cRecno 		  ,Nil};
            }

msExecAuto({|x,y| MATA681(x,y)},xRotAuto,5)

If lMsErroAuto
	ALERT("ERRO NO ESTORNO")
	Mostraerro()
Else
	ALERT("ESTORNO EFETUADO COM SUCESSO")
Endif

Return

//--------------------------- EXEMPLO 3.1----------------------------------------------------------------------------------//
//--------------------------- Exemplo de Estorno INDEX---------------------------------------------------------------------//

#Include 'Protheus.ch'
#INCLUDE "RWMAKE.CH"
#INCLUDE "TBICONN.CH"
#INCLUDE "TOTVS.CH"

User Function rEst681()

Local xRotAuto := {}

PRIVATE lMsErroAuto := .F.

OpenSm0()
RPCSetType(3)
RPCSetEnv("99" , "01",,,"PCP",,,,,,)

dData := dDataBase 

nIndice     := 1 //Indice da SH6 que será utilizado

//Campos do índice 1
//H6_FILIAL+H6_OP+H6_PRODUTO+H6_OPERAC+H6_SEQ+DTOS(H6_DATAINI)+H6_HORAINI+DTOS(H6_DATAFIN)+H6_HORAFIN

cOp         := PadR('Y0226201001',TamSX3("H6_OP")[1])
cProd       := PadR('19579-PA'   ,TamSX3("H6_PRODUTO")[1])
cOperac     := PadR('10'         ,TamSX3("H6_OPERAC")[1])
cSeq        := PadR(' '          ,TamSX3("H6_SEQ")[1])
cDtIni      := dData
cHrIni      := '08:00:00'
cDtFim      := dData
cHrFim      := '08:10:00'

xRotAuto := {;
            {"H6_FILIAL" 	, xFilial("SH6")  ,Nil},;
			{"H6_OP" 		, cOp	          ,Nil},;
			{"H6_PRODUTO"   , cProd  		  ,Nil},;
			{"H6_OPERAC" 	, cOperac 		  ,Nil},;
			{"H6_SEQ"	    , cSeq	     	  ,Nil},;
			{"H6_DATAINI"	, cDtIni   	 	  ,Nil},;
			{"H6_HORAINI"	, cHrIni	 	  ,Nil},;
			{"H6_DATAFIN"	, cDtFim  	 	  ,Nil},;
			{"H6_HORAFIN"	, cHrFim	 	  ,Nil},;
            {"INDEX"	    , nIndice	 	  ,Nil};
            }

msExecAuto({|x,y| MATA681(x,y)},xRotAuto,5)

If lMsErroAuto
	ALERT("ERRO NO ESTORNO")
	Mostraerro()
Else
	ALERT("ESTORNO EFETUADO COM SUCESSO")
Endif

Return

//--------------------------- EXEMPLO 4  ----------------------------------------------------------------------------------//
//--------------------------- Exemplo de Encerramento----------------------------------------------------------------------//

#Include 'Protheus.ch'
#INCLUDE "RWMAKE.CH"
#INCLUDE "TBICONN.CH"
#INCLUDE "TOTVS.CH"

User Function rEnc681()

Local xRotAuto := {}

PRIVATE lMsErroAuto := .F.

OpenSm0()
RPCSetType(3)
RPCSetEnv("99" , "01",,,"PCP",,,,,,)

dData := dDataBase 

cOp         := PadR('Y0226201001',TamSX3("H6_OP")[1])
cProd       := PadR('19579-PA'   ,TamSX3("H6_PRODUTO")[1])
cOperac     := PadR('10'         ,TamSX3("H6_OPERAC")[1])
cRecno      := 142 //R_E_C_N_O_ que deseja encerrar da SH6


xRotAuto := {;
            {"H6_FILIAL" 	, xFilial("SH6")  ,Nil},;
			{"H6_OP" 		, cOp	          ,Nil},;
			{"H6_PRODUTO"   , cProd  		  ,Nil},;
			{"H6_OPERAC" 	, cOperac 		  ,Nil},;
			{"AUTRECNO" 	, cRecno 		  ,Nil};
            }

msExecAuto({|x,y| MATA681(x,y)},xRotAuto,7)

If lMsErroAuto
	ALERT("ERRO NO ENCERRAMENTO")
	Mostraerro()
Else
	ALERT("ENCERRAMENTO EFETUADO COM SUCESSO")
Endif

Return //ITEM
		EndIf
		If !Empty(cTurno)
			oModel:SetValue("CYVMASTER","CYV_CDTN",cTurno)             //TURNO
		EndIf
		If !Empty(cDoc)
			oModel:SetValue("CYVMASTER","CYV_NRDO",cDoc)               //Documento
		EndIf
		If !Empty(cSerieDoc)			
			oModel:SetValue("CYVMASTER","CYV_NRSR",cSerieDoc)          //Série Documento
		EndIf
		If !Empty(cDeposito)			
			oModel:SetValue("CYVMASTER","CYV_CDDP",cDeposito)          //Depósito
		EndIf
		If !Empty(cLoteSerie)			
			oModel:SetValue("CYVMASTER","CYV_CDLOSR",cLoteSerie)       //Lote/Serie
		EndIf
		If !Empty(cValLote)			
			oModel:SetValue("CYVMASTER","CYV_DTVDLO",cValLote)         //Data Validade Lote
		EndIf

		oModel:SetValue("CYVMASTER","CYV_DTRPED",cDataFimRe)      //DATA FIM REPORTE
		oModel:SetValue("CYVMASTER","CYV_HRRPED",cTimeFimRe)      //HORA FIM REPORTE
		oModel:SetValue("CYVMASTER","CYV_DTRP",cDatProd)          //DATA PRODUCAO
		
    EndIf

    If lRet
		//FERRAMENTA
		If !Empty(cFerram)
			oModelCZ0:SetValue("CZ0_CDFE",cFerram)
		EndIf

		//MAO DE OBRA
		If !Empty(cOperador)
      		oModelCYW:SetValue("CYW_CDOE",cOperador)
		EndIf
		If !Empty(cEquipe)   
      		oModelCYW:SetValue("CYW_CDGROE",cEquipe)
		EndIf
		If !Empty(cOperador) .Or. !Empty(cEquipe)    
   			oModelCYW:SetValue("CYW_DTBGRP",cDataIniRe)
   			oModelCYW:SetValue("CYW_HRBGRP",cTimeIniRe)
   			oModelCYW:SetValue("CYW_DTEDRP",cDataFimRe)
   			oModelCYW:SetValue("CYW_HREDRP",cTimeFimRe)
		EndIf

		// Valida o modelo
		If oModel:VldData()   				
   			If !oModel:CommitData()
     			lRet := .F.					
				aErro := oModel:GetErrorMessage()
     			If !Empty(aErro[6])
        			cMsgErro := oModel:GetErrorMessage()[6]
     			Else
					cMsgErro := "Ocorreram erros ao realizar o apontamento."
     			EndIf     								
			EndIf
		Else
   			lRet := .F.					
			aErro := oModel:GetErrorMessage()
     		If !Empty(aErro[6])
        		cMsgErro := oModel:GetErrorMessage()[6]
     		Else
				cMsgErro := "Ocorreram erros ao realizar o apontamento."
     		EndIf     											
		EndIf
	EndIf

    If !lRet
        ConOut( cMsgErro )
    Else
        ConOut( "Apontamento incluido com sucesso." )
    EndIf	

Return


//-------------------------------------------------------------------
// Iniciar Apontamento
//-------------------------------------------------------------------

User Function SFCIniApo() 

Local lRet     := .T.
Local cMsgErro := ''
Local aErro    := {}

PRIVATE lMsErroAuto := .F.

Private cTipApon  := 'I' //Obrigatório para identificar o tipo do apontamento do SFC - I = Iniciar
Private lExAutSFC := .T. //Obrigatório para indentificar que está sendo chamado via EXECAUTO

    OpenSm0()
    RPCSetType(3)
    RPCSetEnv("99" , "01",,,"PCP",,,,,,)

    cOp        := PadR('00004801001',TamSX3("CYV_NRORPO")[1]) //OP
    cIdOper    := PadR('0000000001',TamSX3("CYV_IDAT")[1])    //ID OPERAÇÃO
    cSplit     := PadR('00001',TamSX3("CYV_IDATQO")[1])       //SPLIT
    cMaq       := PadR('REC1',TamSX3("CYV_CDMQ")[1])          //MAQUINA	
    cDataIniRe := dDataBase 		                          //DATA INICIO REPORTE 
    cTimeIniRe := '10:30:00'                                  //HORA INICIO REPORTE

    //Posicionar no split para ativar o model
    DbSelectArea("CYY")
    CYY->(DbSetOrder(1))
    If CYY->(!DbSeek(xFilial("CYY")+cOp+cIdOper+cSplit))
	    cMsgErro := ("Split não cadastrado.")
	    lRet := .F.
    Endif		

	If lRet
		// Instancia o modelo
	    oModel := FWLoadModel( "SFCA319" )

		//Limpa variável de erro
		aErro := oModel:GetErrorMessage(.T.)
		aErro := {}

		oModel:SetOperation( 3 ) //iniciar apontamento
		If !oModel:Activate()   				
   			lRet := .F.
			aErro := oModel:GetErrorMessage()
     		If !Empty(aErro[6])
        	    cMsgErro := oModel:GetErrorMessage()[6]
     		Else
				cMsgErro := ("Ocorreram erros ao realizar o apontamento.") 
     	    EndIf     											
		EndIf
	EndIf

	If lRet
		oModel:SetValue("CYVMASTER","CYV_NRORPO",cOp)             //OP
        oModel:SetValue("CYVMASTER","CYV_IDAT"  ,cIdOper) 	      //ID OPERAÇÃO
        oModel:SetValue("CYVMASTER","CYV_IDATQO",cSplit)  	      //SPLIT
        oModel:SetValue("CYVMASTER","CYV_CDMQ"  ,cMaq)            //MAQUINA	
		oModel:SetValue("CYVMASTER","CYV_DTRPBG",cDataIniRe)      //DATA INICIO REPORTE         	
		oModel:SetValue("CYVMASTER","CYV_HRRPBG",cTimeIniRe)      //HORA INICIO REPORTE

		// Valida o modelo
		If oModel:VldData()   				
   			If !oModel:CommitData()
     			lRet := .F.					
				aErro := oModel:GetErrorMessage()
     			If !Empty(aErro[6])
        			cMsgErro := oModel:GetErrorMessage()[6]
     			Else
					cMsgErro := ("Ocorreram erros ao realizar o apontamento.")
     			EndIf     											
   			EndIf
		Else
   			lRet := .F.					
			aErro := oModel:GetErrorMessage()
     		If !Empty(aErro[6])
        		cMsgErro := oModel:GetErrorMessage()[6]
     		Else
				cMsgErro := ("Ocorreram erros ao realizar o apontamento.") 
     		EndIf     								
		EndIf
	EndIf

    If !lRet
        ConOut( cMsgErro )
    Else
        ConOut( "Início do Apontamento Realizado com Sucesso." )
    EndIf
	
Return 


//-------------------------------------------------------------------
// Finalizar Apontamento
//-------------------------------------------------------------------
User Function SFCFimApo()

Local lRet     := .T.
Local cMsgErro := ''
Local aErro    := {}

Local cOper

PRIVATE lMsErroAuto := .F.

Private cTipApon  := 'F' //Obrigatório para identificar o tipo do apontamento do SFC - F = Finalizar
Private lExAutSFC := .T. //Obrigatório para indentificar que está sendo chamado via EXECAUTO

    OpenSm0()
    RPCSetType(3)
    RPCSetEnv("99" , "01",,,"PCP",,,,,,)

    cOp        := PadR('00004801001',TamSX3("CYV_NRORPO")[1])           //OP
    cIdOper    := PadR('0000000001',TamSX3("CYV_IDAT")[1])              //ID OPERAÇÃO
    cSplit     := PadR('00001',TamSX3("CYV_IDATQO")[1])                 //SPLIT
    cMaq       := PadR('REC1',TamSX3("CYV_CDMQ")[1])                    //MAQUINA	
    cNRSQRP    := PadR('00000000000000000509',TamSX3("CYV_NRSQRP")[1])  //SERIAL DO APONTAMENTO

    cItem       := ' ' //ITEM
    cTurno      := ' ' //TURNO
    cDoc        := ' ' //Documento
    cSerieDoc   := ' ' //Série Documento
    cDeposito   := ' ' //Depósito
    cLoteSerie  := ' ' //Lote/Serie
    cValLote    := ' ' //Data Validade Lote

    cFerram     := ' ' //Ferramenta
    cOperador   := ' ' //Operador
    cEquipe     := ' ' //Equipe

    cDataFimRe  := dDataBase     //DATA FIM REPORTE
    cTimeFimRe  := '11:00:00'    //HORA FIM REPORTE
	cDatProd    := dDataBase     //DATA PRODUCAO

    //Posicionar no split para ativar o model
    DbSelectArea("CYY")
	CYY->(DbSetOrder(1))
	If CYY->(!DbSeek(xFilial("CYY")+cOp+cIdOper+cSplit))
		cMsgErro := "Split não cadastrado."
   		lRet := .F.
	Endif		

	If lRet
		If CYY->CYY_CDMQ != cMaq
			cMsgErro := "Máquina não pertence ao Id da Operação."         
			lRet := .F.
		EndIf
	EndIf

    If lRet
	    DbSelectArea("CY9")
	    CY9->(DbSetOrder(1))
	    If CY9->(!DbSeek(xFilial("CY9")+cOp+cIdOper))
	        cMsgErro := "Operação não cadastrada."
   		    lRet := .F.
	    EndIf
    EndIf

	If lRet .And. Empty(cOper)				
		cOper := CY9->CY9_CDAT
	EndIf

	If lRet .And. !Empty(cOper)				
	    If CY9->CY9_CDAT != cOper
			cMsgErro := "Operação não pertence ao Id da Operação."
			lRet := .F.
		EndIf
	EndIf

    If lRet 
		DbSelectArea("CYV")
		CYV->(DbSetOrder(1))
		If CYV->(!DbSeek(xFilial("CYV")+cNRSQRP))					
			cMsgErro := "Serial do apontamento de inicio não cadastrado."
			lRet := .F.
		Else
			cDataIniRe := CYV->CYV_DTRPBG  //DATA INICIO REPORTE
			cTimeIniRe := CYV->CYV_HRRPBG  //HORA INICIO REPORTE				
		EndIf
	EndIf

    If lRet				
		// Instancia o modelo
		oModel := FWLoadModel( "SFCA314" )

		//Limpa variável de erro
		aErro := oModel:GetErrorMessage(.T.)
		aErro := {}

		oModel:SetOperation( 4 ) //Finalizar apontamento
		
        If !oModel:Activate()   				
   			lRet := .F.
			aErro := oModel:GetErrorMessage()
     		If !Empty(aErro[6])
        		cMsgErro := oModel:GetErrorMessage()[6]
     		Else
				cMsgErro := "Ocorreram erros ao realizar o apontamento."
     		EndIf     								
		EndIf
	EndIf

	If lRet
		//MODELOS
		oModelCY0 := oModel:GetModel( "CY0DETAIL" )               //REFUGO
		oModelCYW := oModel:GetModel( "CYWDETAIL" )               //MAO DE OBRA
		oModelCZ0 := oModel:GetModel( "CZ0DETAIL" )               //FERRAMENTA
        oModelCZW := oModel:GetModel( "CZWDETAIL" )               //GGF
			
		oModel:SetValue("CYVMASTER","CYV_NRORPO",cOp)             //OP
    	oModel:SetValue("CYVMASTER","CYV_IDAT"  ,cIdOper) 	      //ID OPERAÇÃO
		oModel:SetValue("CYVMASTER","CYV_CDAT"  ,cOper)           //OPERAÇÃO
    	oModel:SetValue("CYVMASTER","CYV_IDATQO",cSplit)  	      //SPLIT
    	oModel:SetValue("CYVMASTER","CYV_CDMQ"  ,cMaq)            //MAQUINA	
	    oModel:SetValue("CYVMASTER","CYV_DTRPBG",cDataIniRe)      //DATA INICIO REPORTE         	
		oModel:SetValue("CYVMASTER","CYV_HRRPBG",cTimeIniRe)      //HORA INICIO REPORTE
         	
		//QUANTIDADES
		oModel:SetValue("CYVMASTER","CYV_QTATRP",1)               //QUANTIDADE REPORTADA			
		oModel:SetValue("CYVMASTER","CYV_QTATAP",1)               //QUANTIDADE APROVADA
		oModel:SetValue("CYVMASTER","CYV_QTATRF",0)               //QUANTIDADE REFUGADA 
		oModel:SetValue("CYVMASTER","CYV_QTATRT",0)               //QUANTIDADE RETRABALHADA
						
		If !Empty(cItem)
			oModel:SetValue("CYVMASTER","CYV_CDACRP",cItem)             //ITEM
		EndIf
		If !Empty(cTurno)
			oModel:SetValue("CYVMASTER","CYV_CDTN",cTurno)             //TURNO
		EndIf
		If !Empty(cDoc)
			oModel:SetValue("CYVMASTER","CYV_NRDO",cDoc)               //Documento
		EndIf
		If !Empty(cSerieDoc)			
			oModel:SetValue("CYVMASTER","CYV_NRSR",cSerieDoc)          //Série Documento
		EndIf
		If !Empty(cDeposito)			
			oModel:SetValue("CYVMASTER","CYV_CDDP",cDeposito)          //Depósito
		EndIf
		If !Empty(cLoteSerie)			
			oModel:SetValue("CYVMASTER","CYV_CDLOSR",cLoteSerie)       //Lote/Serie
		EndIf
		If !Empty(cValLote)			
			oModel:SetValue("CYVMASTER","CYV_DTVDLO",cValLote)         //Data Validade Lote
		EndIf

		oModel:SetValue("CYVMASTER","CYV_DTRPED",cDataFimRe)      //DATA FIM REPORTE
		oModel:SetValue("CYVMASTER","CYV_HRRPED",cTimeFimRe)      //HORA FIM REPORTE
		oModel:SetValue("CYVMASTER","CYV_DTRP",cDatProd)          //DATA PRODUCAO
		
    EndIf

    If lRet
		//FERRAMENTA
		If !Empty(cFerram)
			oModelCZ0:SetValue("CZ0_CDFE",cFerram)
		EndIf

		//MAO DE OBRA
		If !Empty(cOperador)
      		oModelCYW:SetValue("CYW_CDOE",cOperador)
		EndIf
		If !Empty(cEquipe)   
      		oModelCYW:SetValue("CYW_CDGROE",cEquipe)
		EndIf
		If !Empty(cOperador) .Or. !Empty(cEquipe)    
   			oModelCYW:SetValue("CYW_DTBGRP",cDataIniRe)
   			oModelCYW:SetValue("CYW_HRBGRP",cTimeIniRe)
   			oModelCYW:SetValue("CYW_DTEDRP",cDataFimRe)
   			oModelCYW:SetValue("CYW_HREDRP",cTimeFimRe)
		EndIf

		// Valida o modelo
		If oModel:VldData()   				
   			If !oModel:CommitData()
     			lRet := .F.					
				aErro := oModel:GetErrorMessage()
     			If !Empty(aErro[6])
        			cMsgErro := oModel:GetErrorMessage()[6]
     			Else
					cMsgErro := "Ocorreram erros ao realizar o apontamento."
     			EndIf     								
			EndIf
		Else
   			lRet := .F.					
			aErro := oModel:GetErrorMessage()
     		If !Empty(aErro[6])
        		cMsgErro := oModel:GetErrorMessage()[6]
     		Else
				cMsgErro := "Ocorreram erros ao realizar o apontamento."
     		EndIf     											
		EndIf
	EndIf

    If !lRet
        ConOut( cMsgErro )
    Else
        ConOut( "Apontamento FINALIZADO com sucesso." )
    EndIf	

Return


//-------------------------------------------------------------------
// Abandonar Apontamento
//-------------------------------------------------------------------
User Function SFCAbaApo() 

Local lRet     := .T.
Local cMsgErro := ''
Local aErro    := {}

PRIVATE lMsErroAuto := .F.

Private cTipApon  := 'A' //Obrigatório para identificar o tipo do apontamento do SFC - A = Abandonar
Private lExAutSFC := .T. //Obrigatório para indentificar que está sendo chamado via EXECAUTO

    OpenSm0()
    RPCSetType(3)
    RPCSetEnv("99" , "01",,,"PCP",,,,,,)

    cOp        := PadR('00004801001',TamSX3("CYV_NRORPO")[1])           //OP
    cIdOper    := PadR('0000000001',TamSX3("CYV_IDAT")[1])              //ID OPERAÇÃO
    cSplit     := PadR('00001',TamSX3("CYV_IDATQO")[1])                 //SPLIT
    cMaq       := PadR('REC1',TamSX3("CYV_CDMQ")[1])                    //MAQUINA	
    cNRSQRP    := PadR('00000000000000000508',TamSX3("CYV_NRSQRP")[1])  //SERIAL DO APONTAMENTO

    //Posicionar no split para ativar o model
	DbSelectArea("CYY")
	CYY->(DbSetOrder(1))
	If CYY->(!DbSeek(xFilial("CYY")+cOp+cIdOper+cSplit))
        cMsgErro := "Split não cadastrado."	    
   	    lRet := .F.
	Endif		

	If lRet
		If CYY->CYY_CDMQ != cMaq
			cMsgErro := "Máquina não pertence ao Id da Operação."         
			lRet := .F.
		EndIf
	EndIf
		
	If lRet
		DbSelectArea("CYV")
		CYV->(DbSetOrder(1))
		If CYV->(!DbSeek(xFilial("CYV")+cNRSQRP))					
			cMsgErro := "Serial do apontamento de inicio não cadastrado."
			lRet := .F.
		EndIf
	EndIf

	If lRet
		// Verificar se apontamento selecionado está iniciado
		If !(!CYV->CYV_LGRPEO .AND. CYV->CYV_TPSTRP == '1')
			cMsgErro := "Somente apontamentos iniciados podem ser abandonados."
			lRet := .F.
		EndIf
	EndIf					
					
	If lRet
		// Instancia o modelo
		oModel := FWLoadModel( "SFCA319" )

		//Limpa variável de erro
		aErro := oModel:GetErrorMessage(.T.)
		aErro := {}

		oModel:SetOperation( 4 ) //abandonar apontamento
		If !oModel:Activate()   				
   			lRet := .F.
			aErro := oModel:GetErrorMessage()
    		If !Empty(aErro[6])
    			cMsgErro := oModel:GetErrorMessage()[6]
    		Else
				cMsgErro := "Ocorreram erros ao realizar o apontamento."
    		EndIf     								
		EndIf
	EndIf

	If lRet
		oModel:SetValue('CYVMASTER','CYV_CDUSOE', CYV->CYV_CDUSRP) //Usuário do Estorno
		oModel:SetValue('CYVMASTER','CYV_DTEO'  , DATE())          //Data do Estorno
		oModel:SetValue('CYVMASTER','CYV_LGRPEO', .T.)             //Apontamento Estornado

		// Valida o modelo
		If oModel:VldData()   				
   			If !oModel:CommitData()
     		    lRet := .F.					
				aErro := oModel:GetErrorMessage()
     			If !Empty(aErro[6])
        			cMsgErro := oModel:GetErrorMessage()[6]
     			Else
				    cMsgErro := "Ocorreram erros ao realizar o apontamento."
     			EndIf     								
   			EndIf
		Else
   		    lRet := .F.					
			aErro := oModel:GetErrorMessage()
     		If !Empty(aErro[6])
        		cMsgErro := oModel:GetErrorMessage()[6]
     		Else
			    cMsgErro := "Ocorreram erros ao realizar o apontamento."
     		EndIf     								
		EndIf
	EndIf					
	
	If !lRet
        ConOut( cMsgErro )
    Else
        ConOut( "Apontamento ABANDONADO com sucesso." )
    EndIf				

Return