Árvore de páginas


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)


04. DEMAIS INFORMAÇÕES

tecr894.ch

05. ASSUNTOS RELACIONADOS