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' o 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_FILORI, FK2_FILORI y FK5_FILORI también tendrán las grabaciones corregidas.
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.IMPORTANTE
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) |
---|
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".