Árvore de páginas

Versões comparadas

Chave

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


CONTEÚDO

  1. Visão Geral
  2. Exemplo de utilização
  3. Tabelas utilizadas


01. VISÃO GERAL

Durante o processo de compensação em filiais diferentes da filial dos títulos, era realizada uma gravação incorreta na tabela FK7 (antes de Setembro de 2020). Essa gravação acabava impactando a sequência de baixa dos títulos envolvidos, gerando então o problema de não conseguir realizar o estorno corretamenteEm 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 correção da sequência de baixa das compensações afetadas pelo processo descrito acima.

Obs. O problema de gravação incorreta foi corrigido na issue DSERFINP-32706.

02. EXEMPLO DE UTILIZAÇÃO

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_FILORIFK2_FILORI e FK5_FILORI também terão as gravações corrigidas.

02. EXEMPLO DE UTILIZAÇÃO


Card documentos
InformacaoO Rdmake foi desenvolvido através do que foi especificado na
Card documentos
InformacaoO 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.
TituloIMPORTANTE!


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 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_FA340FIXFIXE5FORIG" e clique em "OK";

       4 - Na primeira tela apresentada, clique Clicar em "OKFinalizar";

       5 - Na segunda tela apresentada, informe o código do grupo de empresas do ambiente que deseja reparar. Será preciso informar também uma filial deste grupo de empresa, apenas para inicializar o ambiente (deixamos claro que a         reparação será feita para todas as filiais do grupo de empresas). Clique em "OK"

      6 - O processamento será executado, e ao ser finalizado, nenhuma tela será apresentada, apenas a mensagem "Atualização concluída." no console do appserver

      7 - Valide a gravação das compensações que foram reparadas no banco de dados e no sistema.

São cobertos os seguintes cenários (compensação/estorno):

  • Compensação de NF com PA sem impostos
  • Compensação de NF com PA com correção monetária
  • Compensação de parcial de NF com PA
  • Compensação de NF com PA com acréscimo/decréscimo
  • Compensação com retenção de PCC/IRRF

...

languagejava
themeMidnight
titleCódigo fonte:
collapsetrue

...

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
Bloco de código
languagejs
themeMidnight
firstline001
linenumberstrue
##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".


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>