Árvore de páginas

Versões comparadas

Chave

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


01. DADOS GERAIS

Produto:

Solucoes_totvs
SolucaoTOTVS Prestadores de Serviços Terceirização

Solucoes_totvs_cross
SolucaoCross

Solucoes_totvs_parceiros
SolucaoParceiros

Solucoes_totvs_parceirosexptotvs
SolucaoParcsExpsTOTVS

Linha de Produto:

Linhas_totvs
LinhaLinha Protheus

Segmento:

Segmentos_totvs
SegmentoServiços

Módulo:Prestadores de Serviços
Função:TECR894 - Termo de entrega
País:Brasil
Ticket:Não há.
Requisito/Story/Issue (informe o requisito relacionado) :DSERSGS-11271


02. SITUAÇÃO/REQUISITO

A rotina de geração de termo de entrega de uniformes não possui ponto de entrada para que haja maior flexibilidade na customização dos documentos gerados.

03. SOLUÇÃO

Desenvolvido o ponto de entrada At894Doc, sendo possível customizar conforme a necessidade.

Aviso
titleImportante

É altamente recomendado que um desenvolvedor ADVPL manipule e compile a função abaixo para garantir melhor funcionamento do requisito.

...

A função abaixo deve ser copiada e colada em um arquivo

...

".PRW" com nome "At894Doc" e compilada no ambiente.

Para facilitar, no código abaixo existem 3 trechos com "/*/--ADICIONAR CAMPOS AQUI-- /*/", esses trechos informam os locais onde devem ser adicionados os campos desejados, seguindo a lógica onde primeiramente precisam estar na Query SQL (para buscar as informações no banco), logo mais abaixo, para cada campo novo na query deve ser criado uma posição nova no array(aDadosImp) iniciando na posição 5, logo temos aDadosImp[1][5]... aDadosImp[1][6] e assim consecutivamente. Mais abaixo devemos adicionar cada campo no OLE_SetDocumentVar(oWord, "VARIAVEL_CAMPO" , aDadosImp[nCountA, "POSICAO_CAMPOS"]), onde a VARIAVEL_CAMPO define o conteúdo da variável presente no documento modelo, e POSICAO_CAMPOS é a posição onde esse registro se encontra no array aDadosImp.

Aviso
titleImportante

Recomendamos que um desenvolvedor ADVPL manipule e compile a função abaixo para garantir o funcionamento do requisito. O arquivo TECR894.ch esta disponível para download na aba "Demais Informações"

Bloco de código
languagetext
#INCLUDE 'TOTVS.CH'
#INCLUDE 'MSOLE.CH'
#INCLUDE 'TECR894.CH'
 
Static aItens   := {} //Array com os itens de Reimpressão selecionados
 
//------------------------------------------------------------------------------
/*/{Protheus.doc} At894Doc
IMpressão do Termo de entrega/*/
//------------------------------------------------------------------------------
User Function At894Doc()
Local lOk           := .F.
Local aSays         := {}
Local aButtons      := {}
Local aParams       := {}
Local cFuncDe       := TXC->TXC_CODTEC
Local cFuncAte      := TXC->TXC_CODTEC
Local cPathServer   := Alltrim(SuperGetMv("MV_TECPATH"))    //Diretorio que estao os DOTS originais

If Len(PARAMIXB) > 0
	/* *********************************************************
	Estrutura do array para impressão
	aItens :=	{
					CÓDIGO_ATENDENTE (CARACTER),
					NOME_ATENDENTE (CARACTER),
					CPF_ATENDENTE (CARACTER),
					{
						CÓDIGO_UNIFORME (CARACTER),
						DESCRIÇÃO_UNIFORME (CARACTER),
						QUANTIDADE_UNIFORME (CARACTER),
						DATA_VALIDADE_UNIFORME (CARACTER),
					}
				}
	********************************************************* */
	aItens := PARAMIXB[1]
EndIf

//Parametros para seleção utilizados na impressão
aAdd(aParams, {3, STR0001   , 1, {STR0002, STR0003}, 90,, .T.})     //-- MV_PAR01
aAdd(aParams, {3, STR0004   , 1, {STR0005, STR0006}, 90,, .T.})     //-- MV_PAR02
aAdd(aParams, {3, STR0007   , 1, {STR0008, STR0009}, 100,, .T.})    //-- MV_PAR03
 
If ParamBox(aParams, STR0013)//'Parâmetros'
    // 
Bloco de código
languagetext
#INCLUDE 'TOTVS.CH'
#INCLUDE 'MSOLE.CH'
#INCLUDE 'TECR894.CH'

Static aItens	:= {} //Array com os itens de Reimpressão selecionados

//------------------------------------------------------------------------------
/*/{Protheus.doc} At894Doc
IMpressão do Termo de entrega/*/
//------------------------
    // Dialogo principal para parametrizacao
    // ------------------------------------------------------
User Function At894Doc()
Local lOk        	:= .F.
Local aSaysAAdd(aSays, STR0010)
    AAdd(aSays, STR0011)
    AAdd(aSays, STR0012 	:= {}
Local aButtons+ cPathServer)
    	:=AAdd(aButtons, {}
Local aParams    	:= {}
Local cFuncDe    	:= TXC->TXC_CODTEC
Local cFuncAte   	:= TXC->TXC_CODTEC
Local cPathServer	:= Alltrim(SuperGetMv("MV_TECPATH"))	//Diretorio que estao os DOTS originais

//Parametros para seleção utilizados na impressão
aAdd(aParams, {3, STR0001	, 1, {STR0002, STR0003}, 90,, .T.})		//-- MV_PAR01
aAdd(aParams, {3, STR0004	, 1, {STR0005, STR0006}, 90,, .T.})		//-- MV_PAR02
aAdd(aParams, {3, STR0007	, 1, {STR0008, STR0009}, 100,, .T.})	//-- MV_PAR03

If ParamBox(aParams, STR0013)//'Parâmetros'
	// 5, .T., {|| ParamBox(aParams, STR0013)}})
    AAdd(aButtons, {1, .T., {|o| lOk := .T.,o:oWnd:End()}})
    AAdd(aButtons, {2, .T., {|o| o:oWnd:End()}})
 
    FormBatch(STR0014, aSays, aButtons,,, 650)
 
    If lOk
        Processa({|lEnd| AtR894Prc(@lEnd,cFuncDe,cFuncAte,cPathServer)}, STR0015, STR0016, .T.)
    EndIf
EndIf
 
Return
 
//------------------------------------------------------------------------------
	/*/ Dialogo principal para parametrizacao
	// {Protheus.doc} AtR894Prc
Realiza a impressão do documento/*/
//--------------------------------------------------------------------------------------
	AAdd(aSays, STR0010)
	AAdd(aSays, STR0011)
	AAdd(aSays, STR0012 + cPathServer)
	AAdd(aButtons, {5, .T., {|| ParamBox(aParams, STR0013)}})
	AAdd(aButtons, {1, .T., {|o| lOk := .T.,o:oWnd:End()}})
	AAdd(aButtons, {2, .T., {|o| o:oWnd:End()}})

	FormBatch(STR0014, aSays, aButtons,,, 650)

	If lOk
		Processa({|lEnd| AtR894Prc(@lEnd,cFuncDe,cFuncAte,cPathServer)}, STR0015, STR0016, .T.)
	EndIf
EndIf

Return

//-------------------------------------------
Static Function AtR894Prc(lEnd,cFuncDe,cFuncAte,cPathServer)
Local cAliasQry  := ''
Local lContinua  := .T.
Local cArqModel  := ''
Local cExtension := ''
Local cPathDest  := ''
Local cDestino   := MV_PAR01
Local cSaveAs    := MV_PAR02
Local cVersWord  := MV_PAR03
Local aDadosImp  := {}
Local nCountA    := 0
Local nCountB    := 0
Local nPosA      := 0
Local lRHProt   := SuperGetMv("MV_GSXINT",.F., "2") == "2"
Local cArqTemp := ""
Local cNewFile := ""
Local cTempPath := GetTempPath()
 
// -----------------------------------
/*/{Protheus.doc} AtR894Prc
Realiza a impressão do documento

@author		Serviços
@since		11/06/2019
@version	P12.1.23
/*/
//---------------------
// TRATA A VERSAO DO MS WORD
// --------------------------------------------
If cVersWord == 1
    cArqModel := cPathServer + 'TECR894.DOT'
    //-------------
Static Function AtR894Prc(lEnd,cFuncDe,cFuncAte,cPathServer)
Local cAliasQry  := ''
Local lContinua  := .T.
Local cArqModel  := ''
Local cExtension := ''
Local cPathDest  := ''
Local cDestino   := MV_PAR01 
Local cSaveAs    := MV_PAR02
Local cVersWord  := MV_PAR03 
Local aDadosImp  := {}
Local nCountA    := 0
Local nCountB    := 0
Local nPosA      := 0
Local lRHProt	:= SuperGetMv("MV_GSXINT",.F., "2") == "2"
Local cArqTemp := ""
Local cNewFile := ""
Local cTempPath := GetTempPath()
 Se a versao do Ms Word for a 97/2003 nao permite
    //-- a saida do relatorio em PDF
    If cSaveAs == 1
        Aviso(STR0017, STR0018, {STR0019}, 2)//'Não é possível realizar a geração do documento no formato "PDF" para versao 97/2003 do Microsoft Word. O formato do documento será reajustado para "DOC"'
        cSaveAs := 2
    EndIf
Else
    cArqModel   := cPathServer + 'TECR894.DOTM'
EndIf
 
 
// ---------------------------------------
// VERIFICA SE O ARQUIVO "MODELO" EXISTE
// ---------------------------------------
If !File(cArqModel)
    lContinua := .F.
    Aviso(STR0017, STR0020 + cArqModel + STR0021, {STR0019}, 2)//'O arquivo ',' não existe! Entre em contato com o Administrador do sistema.'
EndIf
 
 
// --------------------------------------------
// TRATA AGRAVACAO VERSAO DO MS WORDEM DISCO
// --------------------------------------------
If cVersWord == 1
	cArqModel := cPathServer + 'TECR894.DOT'
	//-- Se a versao do Ms Word for a 97/2003 nao permite
	//-- a saida do relatorio em PDF
	If ---
If lContinua
    If cDestino == 2
        cExtension := If(cSaveAs == 1
		Aviso(STR0017, STR0018, {STR0019}, 2)//'Não é possível realizar a geração do documento no formato "PDF" para versao 97/2003 do Microsoft Word. O formato do documento será reajustado para "DOC"'
		cSaveAs := 2
	EndIf
Else
	cArqModel   := cPathServer + 'TECR894.DOTM'
EndIf


// ---------------------------------------
// VERIFICA SE O ARQUIVO "MODELO" EXISTE
// ---------------------------------------
If !File(cArqModel)
	lContinua := .F.
	Aviso(STR0017, STR0020 + cArqModel + STR0021'*.PDF', If(cVersWord == 1, '*.DOC', '*.DOCX'))
        cPathDest  := Alltrim(cGetFile(STR0022 + cExtension + '|' + cExtension +'|' , STR0023, 1, '', .T., GETF_LOCALHARD+GETF_RETDIRECTORY,.F.))
        If Empty(cPathDest)
            Aviso(STR0017, STR0024, {STR0019}, 2)//'O
 arquivo ',' não existe! Entre em contato com o Administrador do sistema.'
EndIf


// ---------------------------------------
// TRATA GRAVACAO EM DISCO
// ---------------------------------------
If lContinua
	If cDestino == 2
		cExtension := If(cSaveAs == 1, '*.PDF', If(cVersWord == 1, '*.DOC', '*.DOCX'))
		cPathDest  := Alltrim(cGetFile(STR0022 + cExtension + '|' + cExtension +'|' , STR0023, 1, '', .T., GETF_LOCALHARD+GETF_RETDIRECTORY,.F.))
		If Empty(cPathDest)
			Aviso(STR0017, STR0024 lContinua := .F.
        Else
            lContinua := ChkPerGrv(cPathDest)
            If !lContinua
                Aviso(STR0017, STR0025, {STR0019}, 2)
			lContinua := .F.
		Else
			lContinua := ChkPerGrv(cPathDest)
			If !lContinua
				Aviso(STR0017, STR0025, {STR0019}, 2)
			EndIf
		EndIf
	Endif
EndIf

            EndIf
        EndIf
    Endif
EndIf
 
 
// ------------------------------------------------
// TRANSFERE MODELO WORD DO SERVIDOR P/ ESTACAO
// ------------------------------------------------
If lContinua
	    If !CpyS2T(cArqModel, AllTrim(cTempPath))
		        lContinua := .F.
		        Aviso(STR0017, STR0026, {STR0019}, 2)
	    Else
		        // --------------------------------------------------------
		        // SE CONSEGUIU TRANSFERIR O ARQUIVO, RENOMEIA O MESMO
		        // PARA PREVENIR, EM CASO DE ERRO, O TRAVAMENTO DO ARQUIVO
		        // DE MODELO
		        // --------------------------------------------------------
		        cArqTemp  := GetNextAlias() + If(cVersWord == 1, '.dot', '.dotm')

		 
        FRename(AllTrim(cTempPath) + If(Right(AllTrim(cTempPath), 1) == '\', '', '\') + 'TECR894' + If(cVersWord == 1, '.dot', '.dotm'),;
				', '.dotm'),;
                AllTrim(cTempPath) + If(Right(AllTrim(cTempPath), 1) == '\', '', '\') + cArqTemp)

		 
        cArqTemp := AllTrim(cTempPath) + If(Right(AllTrim(cTempPath), 1) == '\', '', '\') + cArqTemp
 
	    EndIf
EndIf
 
// ------------------------------------------
// IMPRESSAO DO DOCUMENTO
// ------------------------------------------
If lContinua .And.
	If Empty(aItens)
		// ------------------------------------------
		// PROCESSA QUERY PARA IMPRESSAO DO DOCUMENTO
		// ------------------------------------------
		cAliasQry := GetNextAlias()
		BeginSQL Alias cAliasQry
			SELECT TXD.TXD_CODTEC, AA1.AA1_NOMTEC , SRA.RA_CIC, TXD.TXD_CODPRO, SB1.B1_DESC, TXD.TXD_QTDE, TXD.TXD_DTVAL /*/--ADICIONAR CAMPOS AQUI-- /*/
			  FROM %Table:TXD% TXD
		  	JOIN %Table:AA1% AA1
		    		ON AA1.AA1_FILIAL = %xFilial:AA1%
		   	AND AA1.AA1_CODTEC = TXD.TXD_CODTEC
		   	AND AA1.%NotDel%
		  	LEFT JOIN %Table:SRA% SRA
				    ON SRA.RA_FILIAL = %xFilial:SRA%
			   AND SRA.RA_MAT = AA1.AA1_CDFUNC
		   	AND SRA.%NotDel%
		  	JOIN %Table:SB1% SB1
		    		ON SB1.B1_FILIAL = %xFilial:SB1%
		   	AND SB1.B1_COD = TXD.TXD_CODPRO
			   AND SB1.%NotDel%
		 	WHERE TXD.TXD_FILIAL = %xFilial:TXD%
		   	AND TXD.TXD_CODTEC BETWEEN %Exp:cFuncDe% AND %Exp:cFuncAte%
		   	AND TXD.TXD_DTENTR <> ' '
		   	AND TXD.%NotDel%
		EndSQL
	
		If !(cAliasQry)->(Eof())
			While !(cAliasQry)->(Eof())
				nPosA := aScan(aDadosImp, {|x| x[1] == (cAliasQry)->TXD_CODTEC}) 
				If nPosA == 0
					aAdd(aDadosImp, {(cAliasQry)->TXD_CODTEC, (cAliasQry)->AA1_NOMTEC, IIF(lRHProt, Transform((cAliasQry)->RA_CIC, PesqPict('SRA', 'RA_CIC')), ""), {} {} /*/--ADICIONAR CAMPOS AQUI-- /*/})
					nPosA := Len(aDadosImp)
				EndIf
					aAdd(aDadosImp[nPosA, 4], {	 AllTrim((cAliasQry)->TXD_CODPRO),;
												AllTrim((cAliasQry)->B1_DESC),;
												Transform((cAliasQry)->TXD_QTDE, PesqPict('TXD', 'TXD_QTDE')),;
												DtoC(StoD((cAliasQry)->TXD_DTVAL)) })                               
				(cAliasQry)->(DbSkip())
			End
		Else
			lContinua := .F.
			(cAliasQry)->(DbSkip())MsgAlert(STR0029)
		EndEndIf
		
		(cAliasQry)->(DbSkipDbCloseArea())
	Else
		aDadosImp := aClone( aItens )
	EndIf

	For nCountA := 1 To Len(aDadosImp)
			//-- Arquivo que sera gerado:
			cNewFile := cPathDest + If(Right(cPathDest, 1) == '\', '', '\') + DtoS(dDataBase) + '_' + StrTran(Time(), ':', '') + '_TECR894' + StrTran(cExtension, '*', '')

			// --------------------------------------
			// ESTABELECE COMUNICACAO COM O MS WORD
			// --------------------------------------
			oWord := OLE_CreateLink()
			OLE_SetProperty(oWord, oleWdVisible, .F.)
			If oWord == "-1"
				Aviso(STR0017, STR0027, {STR0019}, 2)
				Exit
			Else

				// -----------------------------------
				// CARREGA MODELO
				// -----------------------------------
				OLE_NewFile(oWord, Alltrim(cArqTemp))

				// -------------------------------------------
				// REALIZA O PROCESSO DE MACRO SUBSTITUICAO
				// DOS CAMPOS DO MODELO WORD
				// ----------------------------------------------------
			OLE_SetDocumentVar(oWord, 'cNomeFunc'       , aDadosImp[nCountA, 2])
				OLE_SetDocumentVar(oWord, 'cNomeFunc'		, cCPF'            , aDadosImp[nCountA, 3])

			For nCountB := 1 To Len(aDadosImp[nCountA, 24])
				OLE_SetDocumentVar(oWord, 'cCPF'			, 'cCodigo' + AllTrim(Str(nCountB))     , aDadosImp[nCountA, 4, 3])

				For nCountB := 1 To Len(aDadosImp[nCountA, 4])nCountB, 1])                   
					OLE_SetDocumentVar(oWord, 'cCodigocDescr' + AllTrim(Str(nCountB))		      , aDadosImp[nCountA, 4, nCountB, 12])					
					OLE_SetDocumentVar(oWord, 'cDescrnQtde' + AllTrim(Str(nCountB)) 		)       , aDadosImp[nCountA, 4, nCountB, 23])
					OLE_SetDocumentVar(oWord, 'nQtdedDtValidade' + AllTrim(Str(nCountB))		 , aDadosImp[nCountA, 4, nCountB, 34])
			Next nCountB

			OLE_SetDocumentVar(oWord, 'dDtValidadenItens', + AllTrim(Str(nCountB))	, (Len(aDadosImp[nCountA, 4, nCountB, 4])]))))
				Next nCountBOLE_ExecuteMacro(oWord, "mcrUniformes")

			/*/--ADICIONAR CAMPOS AQUI-- /*/
			/*/--OLE_SetDocumentVar(oWord, 'nItens', AllTrim(Str(Len( **CAMPOS**           , aDadosImp[nCountA, 4]))))
				OLE_ExecuteMacro(oWord, "mcrUniformes")

	**nCAMPOS**])-- /*/

			//-- Atualiza os campos
				OLE_UpDateFields(oWord)

				//-- Determina a saida do relatorio:
				If cDestino == 1
					OLE_PrintFile(oWord, cNewFile,,, 1)
					Sleep(1000)
				Else
					OLE_SaveAsFile(oWord, cNewFile,,,, If(cSaveAs == 1, '17', NIL)) //--Parametro '17' salva em pdf
				Endif

				//--Fecha link com MS-Word
				OLE_CloseFile(oWord)
				OLE_CloseLink(oWord)
			EndIf

		End
		MsgInfo(STR0028)	Next nCountA

	ElseIf lContinua
		MsgAlertMsgInfo(STR0029STR0028)

	EndIf
	EndIf
EndIf 
//-- Exclui arquivo modelo na estacao:
FErase(cArqTemp)
 
//Limpa a Variavel
aItens := {}
 
Return
 
//------------------------------------------------------------------------------
/*/{Protheus.doc} ChkPerGrv
Checa permissao de gravacao na pasta indicada para geracao
do relatorio

@author		Serviços
@since		11/06/2019
@version	P12.1.23
/*/
//------------------------------------------------------------------------------
Static Function ChkPerGrv(cPath)
Local cFileTmp := CriaTrab(NIL, .F.)
Local nHdlTmp  := 0
Local lRet     := .F.
 
cPath   := AllTrim(cPath)
nHdlTmp := MSFCreate(cPath + If(Right(cPath, 1) <> '\', '\', '') + cFileTmp + '.TMP', 0)
If nHdlTmp <= 0
	    lRet := .F.
Else
	    lRet := .T.
	    FClose(nHdlTmp)
	    FErase(cPath + If(Right(cPath, 1) <> '\', '\', '') + cFileTmp + '.TMP')
EndIf
 
Return(lRet)


04. DEMAIS INFORMAÇÕES

...

View file
nametecr894.ch
height250

05. ASSUNTOS RELACIONADOS

...