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 algum momento, houve uma não conformidade em não gravar o campo E5_FILORIG na baixa de títulos a receber e a pagar. Este rdmake realiza o preenchimento do campo E5_FILORIG com o conteúdo dos campos de acordo com a filial de origem do título (E1_FILORIG e ou E2_FILORIG, para os registros que possuam ), filtrando as movimentações cujo registro possua o E5_TIPODOC = igual a 'VL', 'VM','BA','CP','LJ','V2' ou E5_TIPODOC = 'ES'.
02. EXEMPLO DE UTILIZAÇÃO
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
Card documentos |
---|
Informacao | O Rdmake foi desenvolvido através do que foi especificado na |
---|
|
Card documentos |
---|
Informacao | O Rdmake foi realizado através do problema reportado na issue citada no tótico "Visão geral", sendo disponibilizado disponibilizada a correção somente para este cenário. Caso seja encontrado outros cenários a função de usuário esta está disponível nesta documentação para personalização. |
---|
Titulo | 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 1 - Realize um backup da base de dados dados;
2 - Em um ambiente de homologação execute o SmartclientCopiar 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' ou , '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.
...
...
...
...
...
##INCLUDE "PROTHEUS.CH"
#INCLUDE "APWIZARD.CH"
Static __oQrySE5 := NIL
//-------------------------------------------------------------------------------
/*/{Protheus.doc} FIXE5FORIG
|
|
---|
...
...
...
...
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 |
|
---|
...
...
...
__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
|
|
---|
...
...
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".
HTML |
---|
<!-- esconder o menu -->
<style>
div.theme-default .ia-splitter #main {
margin-left: 0px;
}
.ia-fixed-sidebar, .ia-splitter-left {
display: none;
}
#main {
padding-left: 10px;
padding-right: 10px;
overflow-x: hidden;
}
.aui-header-primary .aui-nav, .aui-page-panel {
margin-left: 0px !important;
}
.aui-header-primary .aui-nav {
margin-left: 0px !important;
}
</style>
|