CONTEÚDO
- Visão Geral
- Exemplo de utilização
- Tabelas utilizadas
01. VISÃO GERAL
Em alguns cenários específicos o sistema necessita que os campos FILORIG estejam preenchidos e existe a possibilidade desses campos estarem vazios em virtude do registro ser mais antigo que a criação da coluna.
Este rdmake realiza a gravação do campo E5_FILORIG de acordo com a filial de origem do título (E1_FILORIG ou E2_FILORIG), filtrando as movimentações cujo registro possua o E5_TIPODOC igual a 'VL', 'VM','BA','CP','LJ','V2' ou E5_TIPODOC = 'ES'.
Somente serão afetados os registros em que o campo E5_FILORIG não possui gravação.
Caso a baixa tenha registros nas tabelas FK1, FK2 e FK5, os campos FK1_FILORI, FK2_FILORI e FK5_FILORI também terão as gravações corrigidas.
02. EXEMPLO DE UTILIZAÇÃO
O Rdmake foi desenvolvido através do que foi especificado na "Visão geral", sendo disponibilizada a correção somente para este cenário. Caso seja encontrado outros cenários a função de usuário está disponível nesta documentação para personalização. IMPORTANTE!
Como utilizar:
Sugerimos que a execução seja feita primeiramente em um ambiente de homologação e, somente após ser validado, executar em um ambiente de produção.
1 - Realize um backup da base de dados;
2 - Copiar o exemplo do rdmake abaixo e compilar no ambiente a ser processado;
3 - No programa inicial no SmartClient, preencha "U_FIXE5FORIG" e clique em "OK";
4 - Clicar em "Finalizar";
5 - Na mensagem para confirmação da rotina, clicar em "Sim";
6 - Após a execução, será exibida a mensagem de PROCESSAMENTO FINALIZADO. Clicar em OK;
7 - Se clicar em "Não", a rotina não será processada e será exibida a mensagem de PROCESSAMENTO CANCELADO;
Serão atualizados somente os registros que possuam o E5_TIPODOC igual a 'VL', 'VM','BA','CP','LJ','V2'' ou E5_TIPODOC = 'ES'.
Para os registros que possuam o E5_MOVFKS = 'S', os campos FK1_FILORI, FK2_FILORI e FK5_FILORI serão preenchidos com o conteúdo dos campos E1_FILORIG/E2_FILORIG.
RDKAME ##INCLUDE "PROTHEUS.CH" #INCLUDE "APWIZARD.CH" Static __oQrySE5 := NIL //------------------------------------------------------------------------------- /*/{Protheus.doc} FIXE5FORIG FIX para gravar o E5_FILORIG, FK1_FILORI, FK2_FILORI e FK5_FILORI, com base no conteudo dos campos E1_FILORIG/E2_FILORIG do título. @return nil @author totvs @since 10/12/2020 @version P12 /*/ //------------------------------------------------------------------------------- User Function FIXE5FORIG() Private oWizard Private lOk := .T. oWizard := APWizard():New( "Assistente para Ajuste de base." ,"Atenção!" ,; "",; "Este assistente tem como finalidade acertar o campo FILORIG da tabela SE5 (não preenchidos) "; +CHR(10)+CHR(13)+"com o conteúdo do campo E1_FILORIG/E2_FILORIG."; +CHR(10)+CHR(13)+"- Somente rodar este ajuste em modo exclusivo!"; +CHR(10)+CHR(13)+"- Realizar backup do banco de dados antes da atualização."; +CHR(10)+CHR(13)+"- Rodar a atualização primeiramente em base de homologação.",; {|| .T.}, {|| Processa({|lEnd| lOk := FinExecFix(),Iif(lOk,MSGINFO("PROCESSAMENTO FINALIZADO !!","PROCESSO"),MSGINFO("PROCESSAMENTO CANCELADO !!","PROCESSO")) }),.T.},,,,,) ACTIVATE WIZARD oWizard CENTERED WHEN {||.T.} Return //------------------------------------------------------------------------------- /*/{Protheus.doc} FinExecFix Grava campo E5_FILORIG em branco para os registros baixados. @return lRet, Lógico indicado se a query foi executada corretamente @author totvs @since 10/12/2020 @version P12 /*/ //------------------------------------------------------------------------------- Static Function FinExecFix() Local aArea As Array Local cEmpUlt As Character Local lRet As Logical Local aRetSM0 Local nInc As Numeric aArea:= GetArea() lRet := .F. If MsgYesNo("A base de dados será alterada após esta confirmação! Tem certeza que deseja atualizá-la?") lRet := .T. cEmpUlt := "" OpenSM0() SM0->(dbGotop()) aRetSM0 := FWLoadSM0() For nInc := 1 To Len( aRetSM0 ) If aRetSM0[nInc][1] <> cEmpUlt RpcSetType(3) RpcSetEnv( aRetSM0[nInc][1], aRetSM0[nInc][2] ) FnE5Filori() RpcClearEnv() If __oQrySE5 <> NIL __oQrySE5:Destroy() EndIf __oQrySE5 := NIL Endif cEmpUlt := aRetSM0[nInc][1] Next Endif RestArea(aArea) Return(lRet) //------------------------------------------------------------------------------- // FK5BUSCA //Função para localizar FK5 a partir do movimento SE5 //------------------------------------------------------------------------- Static Function FK5BUSCA(cChave, lEstorno) Local uRet := "" Local cQuery := "" Default cChave := '' Default lEstorno := .F. cQuery := "SELECT FK5.FK5_IDMOV URET" cQuery += "FROM "+RetSqlName("SE5")+" SE5 " cQuery += "INNER JOIN "+RetSqlName("FKA")+" FKA1 ON FKA1.FKA_FILIAL = SE5.E5_FILIAL AND FKA1.FKA_IDORIG = SE5.E5_IDORIG " cQuery += " LEFT JOIN "+RetSqlName("FKA")+" FKA2 ON FKA2.FKA_FILIAL = FKA1.FKA_FILIAL AND FKA2.FKA_IDPROC = FKA1.FKA_IDPROC " cQuery += "INNER JOIN "+RetSqlName("FK5")+" FK5 ON FK5.FK5_FILIAL = FKA2.FKA_FILIAL AND FKA2.FKA_TABORI = 'FK5' AND FK5.FK5_IDMOV = FKA2.FKA_IDORIG " If lEstorno cQuery += "AND FK5.FK5_TPDOC = 'ES' " Else cQuery += "AND FK5.FK5_TPDOC <> 'ES' " EndIf cQuery += "WHERE " cQuery += "SE5.E5_FILIAL || SE5.E5_PREFIXO || SE5.E5_NUMERO || SE5.E5_PARCELA || SE5.E5_TIPO || SE5.E5_CLIFOR || SE5.E5_LOJA || SE5.E5_SEQ = '" + cChave + "'" If lEstorno cQuery += "AND SE5.E5_TIPODOC = 'ES' " Else cQuery += "AND FK5.FK5_TPDOC <> 'ES' " EndIf cQuery += "AND SE5.D_E_L_E_T_ = ' '" cQuery := ChangeQuery(cQuery) uRet := MpSysExecScalar(cQuery,"URET") Return uRet //------------------------------------------------------------------------------- //FnE5Filori //Grava campo E5_FILORIG em branco para os registros baixados. //------------------------------------------------------------------------------- Static Function FnE5Filori() As Logical Local cQry1 As Character Local cAlias1 As Character Local cIdMovFK5 As Character Local lRet As Logical Local lEstorno As Logical Local nTamSE5 As Numeric cQry1 := "" cAlias1 := "" cIdMovFK5 := "" lRet := .F. lEstorno := .F. nTamSE5 := Len(Alltrim(xFilial("SE5"))) //Query para buscar registros inconsistentes na tabela SE5 If __oQrySE5 == Nil cQry1 := "SELECT SE5.R_E_C_N_O_ RECSE5,E5_MOVFKS MOVFKS, E2_FILIAL FILIAL, E2_FILORIG FILORIG, SE2.R_E_C_N_O_ RECSE " cQry1 += "FROM " + RetSqlName("SE5") + " SE5 " cQry1 += "INNER JOIN " + RetSqlName("SE2") + " SE2 " cQry1 += "ON " If nTamSE5 > 0 cQry1 += "SUBSTRING(SE5.E5_FILIAL,1," + Str(nTamSE5) + ") = SUBSTRING(SE2.E2_FILORIG,1," + Str(nTamSE5) + ") AND " EndIf cQry1 += "E5_PREFIXO = E2_PREFIXO " cQry1 += "AND E5_NUMERO = E2_NUM " cQry1 += "AND E5_PARCELA = E2_PARCELA " cQry1 += "AND E5_TIPO = E2_TIPO " cQry1 += "AND E5_CLIFOR = E2_FORNECE " cQry1 += "AND E5_LOJA = E2_LOJA " cQry1 += "AND E5_NATUREZ = E2_NATUREZ " cQry1 += "AND SE2.D_E_L_E_T_ = ' ' " cQry1 += "AND SE2.E2_FILORIG <> ' ' " cQry1 += "WHERE E5_FILORIG = ' ' AND SE5.D_E_L_E_T_ = ' ' " cQry1 += "AND ((E5_RECPAG = 'P' AND E5_TIPODOC IN ('VL','VM','BA','CP','LJ','V2')) OR (E5_RECPAG = 'R' AND E5_TIPODOC = 'ES')) " cQry1 += "UNION " cQry1 += "SELECT SE5.R_E_C_N_O_ RECSE5,E5_MOVFKS MOVFKS, E1_FILIAL FILIAL, E1_FILORIG FILORIG, SE1.R_E_C_N_O_ RECSE " cQry1 += "FROM " + RetSqlName("SE5") + " SE5 " cQry1 += "INNER JOIN " + RetSqlName("SE1") + " SE1 " cQry1 += "ON " If nTamSE5 > 0 cQry1 += "SUBSTRING(SE5.E5_FILIAL,1," + Str(nTamSE5) + ") = SUBSTRING(SE1.E1_FILORIG,1," + Str(nTamSE5) + ") AND " EndIf cQry1 += "E5_PREFIXO = E1_PREFIXO " cQry1 += "AND E5_NUMERO = E1_NUM " cQry1 += "AND E5_PARCELA = E1_PARCELA " cQry1 += "AND E5_TIPO = E1_TIPO " cQry1 += "AND E5_CLIFOR = E1_CLIENTE " cQry1 += "AND E5_LOJA = E1_LOJA " cQry1 += "AND E5_NATUREZ = E1_NATUREZ " cQry1 += "AND SE1.D_E_L_E_T_ = ' ' " cQry1 += "AND SE1.E1_FILORIG <> ' ' " cQry1 += "WHERE E5_FILORIG = ' ' AND SE5.D_E_L_E_T_ = ' ' " cQry1 += "AND ((E5_RECPAG = 'R' AND E5_TIPODOC IN ('VL','VM','BA','CP','LJ','V2')) OR (E5_RECPAG = 'P' AND E5_TIPODOC = 'ES')) " cQry1 := ChangeQuery(cQry1) __oQrySE5 := FWPreparedStatement():New(cQry1) EndIf cQry1 := __oQrySE5:GetFixQuery() cAlias1 := MpSysOpenQuery(cQry1) DbGotop() While (cAlias1)->(!Eof()) SE5->(dbGoto( (cAlias1)->RECSE5 )) Reclock("SE5",.F.) SE5->E5_FILORIG := (cAlias1)->FILORIG MsUnlock() If (cAlias1)->MOVFKS == "S" If SE5->E5_TABORI =="FK2" FK2->(dbSetOrder(1)) If FK2->(dbSeek(SE5->E5_FILIAL+SE5->E5_IDORIG)) If Empty(FK2->FK2_FILORI) Reclock("FK2",.F.) FK2->FK2_FILORI := (cAlias1)->FILORIG MsUnlock() EndIf EndIf lEstorno := ( SE5->E5_RECPAG == "R" .And. SE5->E5_TIPODOC = 'ES' ) ElseIf SE5->E5_TABORI =="FK1" FK1->(dbSetOrder(1)) If FK1->(dbSeek(SE5->E5_FILIAL+SE5->E5_IDORIG)) If Empty(FK1->FK1_FILORI) Reclock("FK1",.F.) FK1->FK1_FILORI := (cAlias1)->FILORIG MsUnlock() EndIf EndIf lEstorno := ( SE5->E5_RECPAG == "P" .And. SE5->E5_TIPODOC = 'ES' ) EndIf cIdMovFK5 := FK5BUSCA(SE5->(E5_FILIAL+E5_PREFIXO+E5_NUMERO+E5_PARCELA+E5_TIPO+E5_CLIFOR+E5_LOJA+E5_SEQ),lEstorno) FK5->(dbSetOrder(1)) If FK5->(dbSeek(SE5->E5_FILIAL+cIdMovFK5)) If Empty(FK5->FK5_FILORI) Reclock("FK5",.F.) FK5->FK5_FILORI := (cAlias1)->FILORIG MsUnlock() EndIf EndIf EndIf (cAlias1)->(DbSkip()) EndDo If Select(cAlias1) > 0 (cAlias1)->(DBCloseArea()) lRet := .T. EndIf Return(lRet) |
---|
03. TABELAS UTILIZADAS
Este Rdmake realiza a correção nas tabelas SE5, FK1, FK2 e FK5 nos cenários descritos no tópico "Exemplo de utilização".