CONTENIDO

  1. Visión general
  2. Ejemplo de utilización
  3. Tablas


01. VISIÓN GENERAL

En algunos escenarios específicos el sistema necesita que los campos FILORIG estén completados, pero existe la posibilidad de que estos campos estén vacíos porque el registro es más antiguo que la creación de la columna.

Este rdmake realiza la grabación del campo E5_FILORIG de acuerdo con la sucursal de origen del título (E1_FILORIG o E2_FILORIG), filtrando los movimientos cuyo registro tenga el E5_TIPODOC igual a  'VL', 'VM','BA','CP','LJ','V2' E5_TIPODOC = 'ES'

Solamente se considerarán los registros en los cuales el campo E5_FILORIG no esté grabado. 

Si la baja tuviera registros en las tablas FK1, FK2 y FK5, los campos FK1_FILORIFK2_FILORI y FK5_FILORI también tendrán las grabaciones corregidas.

02. EJEMPLO DE UTILIZACIÓN


IMPORTANTE

El Rdmake se desarrolló por medio de lo que se especificó en la "Visión general", poniéndose a disposición solamente la corrección para este escenario. Si se encuentran otros escenarios, la función de usuario está a disposición en esta documentación para personalización.


Cómo utilizar:


En primer lugar sugerimos que la ejecución se realice en un entorno de homologación y solamente después de haberse validado, ejecutar en un entorno de producción. 

       1 - Realice una copia de seguridad de la base de datos.

       2 - Copie el ejemplo del siguiente rdmake y compile en el entorno en el cual se procesará.

       3 - En el programa inicial del SmartClient, complete "U_FIXE5FORIG" y haga clic en "OK".

       4 - Haga clic en "Finalizar".

       5 - En el mensaje para confirmación de la rutina, haga clic en "Sí".

       6 - Después de la ejecución se mostrará el mensaje de PROCESAMIENTO FINALIZADO. Haga clic en OK.

       7 - Si hiciera clic en "No", la rutina no se procesará y se mostrará el mensaje de PROCESAMIENTO ANULADO.

Solamente se actualizarán los registros que tengan E5_TIPODOC igual a 'VL', 'VM','BA','CP','LJ','V2'' o E5_TIPODOC = 'ES'.

Para los registros que tengan E5_MOVFKS = ‘S’, los campos FK1_FILORI, FK2_FILORI y FK5_FILORI se completarán con el contenido de los campos E1_FILORIG/E2_FILORIG.


RDKAME


##INCLUDE "PROTHEUS.CH"
#INCLUDE "APWIZARD.CH"

Static __oQrySE5 := NIL

//-------------------------------------------------------------------------------
/*/{Protheus.doc} FIXE5FORIG

FIX para grabar E5_FILORIG, FK1_FILORI, FK2_FILORI y FK5_FILORI,
con base en el contenido de los campos E1_FILORIG/E2_FILORIG del título.

@return nil
@author totvs
@since 10/12/2020
@version P12
/*/
//-------------------------------------------------------------------------------

User Function FIXE5FORIG()

Private oWizard
Private lOk		:= .T.

oWizard := APWizard():New( "Asistente para ajuste de base." ,"Atención" ,;
"",;
"Este asistente tiene como finalidad ajustar el campo FILORIG de la tabla SE5 (no completados) ";
+CHR(10)+CHR(13)+"con el contenido del campo E1_FILORIG/E2_FILORIG.";
+CHR(10)+CHR(13)+"- ¡Solamente ejecutar este ajuste en modo exclusivo!";
+CHR(10)+CHR(13)+"- Realizar copia de seguridad de la base de datos antes de la actualización.";
+CHR(10)+CHR(13)+"- Primero ejecutar la actualización en base de homologación.",;
{|| .T.}, {|| Procesa({|lEnd| lOk := FinExecFix(),Iif(lOk,MSGINFO("¡PROCESAMIENTO FINALIZADO !","PROCESO"),MSGINFO("¡PROCESAMIENTO ANULADO !","PROCESO")) }),.T.},,,,,) 
			
ACTIVATE WIZARD oWizard CENTERED  WHEN {||.T.}

Return

//-------------------------------------------------------------------------------
/*/{Protheus.doc} FinExecFix
Graba campo E5_FILORIG en blanco para los registros descargados.

@return lRet, Lógico indicado si la query se ejecutó correctamente
@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("¡La base de datos se modificará después de esta confirmación! ¿Está seguro que desea actualizarla?")
	
		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
//Función para ubicar FK5 a partir del movimiento 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
//Graba campo E5_FILORIG en blanco para los registros descargados.
//-------------------------------------------------------------------------------
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 en la tabla 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. TABLAS

Este Rdmake realiza la corrección en las tablas SE5, FK1, FK2 y FK5 en los escenarios descritos en el tópico "Ejemplo de utilización".