01. DADOS GERAIS
| Produto: | TOTVS Prestadores de Serviços Terceirização
|
|---|---|
| Linha de Produto: | Linha Protheus |
| Segmento: | Serviç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
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.
Importante
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"
#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
//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'
// -----------------------------------------------------
// Dialogo principal para parametrizacao
// -----------------------------------------------------
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
//------------------------------------------------------------------------------
/*/{Protheus.doc} AtR894Prc
Realiza a impressão do documento/*/
//------------------------------------------------------------------------------
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()
// --------------------------------------------
// TRATA A VERSAO DO MS WORD
// --------------------------------------------
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 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 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, {STR0019}, 2)
lContinua := .F.
Else
lContinua := ChkPerGrv(cPathDest)
If !lContinua
Aviso(STR0017, STR0025, {STR0019}, 2)
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'),;
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. 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
(cAliasQry)->(DbSkip())
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, 'cCPF' , aDadosImp[nCountA, 3])
For nCountB := 1 To Len(aDadosImp[nCountA, 4])
OLE_SetDocumentVar(oWord, 'cCodigo' + AllTrim(Str(nCountB)) , aDadosImp[nCountA, 4, nCountB, 1])
OLE_SetDocumentVar(oWord, 'cDescr' + AllTrim(Str(nCountB)) , aDadosImp[nCountA, 4, nCountB, 2])
OLE_SetDocumentVar(oWord, 'nQtde' + AllTrim(Str(nCountB)) , aDadosImp[nCountA, 4, nCountB, 3])
OLE_SetDocumentVar(oWord, 'dDtValidade' + AllTrim(Str(nCountB)) , aDadosImp[nCountA, 4, nCountB, 4])
Next nCountB
OLE_SetDocumentVar(oWord, 'nItens', AllTrim(Str(Len(aDadosImp[nCountA, 4]))))
OLE_ExecuteMacro(oWord, "mcrUniformes")
/*/--ADICIONAR CAMPOS AQUI-- /*/
/*/--OLE_SetDocumentVar(oWord, **CAMPOS** , aDadosImp[nCountA, **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)
Else
MsgAlert(STR0029)
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/*/
//------------------------------------------------------------------------------
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)
