Mas Inconsistencias

132 views
Skip to first unread message

Ivan Jaramillo Gonzalez

unread,
Dec 23, 2021, 1:30:15 AM12/23/21
to Comunidad de Visual Foxpro en Español
Revisando en el Foro de la Comunidad, Encontre un Articulo escrito en el Año 2,006, Traducido por El Maestro Luis Maria, que trata de un Ctrl. de Auditoria a las Tablas de FoxPro, para los Eventos de Adición, Modificación y Eliminación. 
Lo transcribi tal y como aparece en el Articulo y me Genera un Log de Error al Utilizarse, y ademas Nó me deja modificar la estructura de las Tablas de Ejemplo, porque saca el Error 
citado en Mi Anterior Consulta, y Aqui por Ninguna parte estoy usando Buffering, Por Favor, Alguien que me Asesore, Realmente Nó se que esta Pasando!

Ivan Jaramillo Gonzalez
Indusoftware & Redes

Eduardo Armonti

unread,
Dec 23, 2021, 6:08:32 AM12/23/21
to publice...@googlegroups.com

 

Si te sirve este código.

Es el que trabajo en un colegio.

Va tomando las acciones realizadas por los preceptores y al final del dia cuando cierran el programa, ese envía solito un mail con las actividades. (para saber que moquito se hecharon)

 

 

 

*    programa de auditoria (refleja los eventos del usuario en alta baja y cambio)

PROCEDURE log_ingreso_sistema

                SET DATE BRITISH

                SET CENTURY ON

                * lineas de separación

                LOCAL linea_espacio,linea_estrella

                linea_espacio = CHR(13)

                linea_estrella = REPLICATE("*",94) + CHR(13)

                *arma la cadena

                TEXT TO cadena TEXTMERGE NOSHOW FLAGS 2 PRETEXT 2 

                               <<linea_espacio>>

                               <<linea_estrella>>

                               <<DTOC(DATE())>> - <<LEFT(TIME(),5)>> hs. - APERTURA DE SESIÓN - USUARIO: <<v_usuarioactual>><<CHR(13)>>

                               <<linea_estrella>>

                ENDTEXT

                =guardar_log(cadena)

ENDPROC

 

**********************************************************************************************

PROCEDURE log_salida_sistema

                SET DATE BRITISH

                SET CENTURY ON

                * lineas de separación

                LOCAL linea_espacio,linea_estrella

                linea_espacio = CHR(13)

                linea_estrella = REPLICATE("*",94) + CHR(13)

                *arma la cadena

                TEXT TO cadena TEXTMERGE NOSHOW FLAGS 2 PRETEXT 2 

                               <<linea_espacio>>

                               <<linea_estrella>>

                               <<DTOC(DATE())>> - <<LEFT(TIME(),5)>> hs. - CIERRE DE SESIÓN - USUARIO: <<v_usuarioactual>><<CHR(13)>>

                               <<linea_estrella>>

                ENDTEXT            

                =guardar_log(cadena)

ENDPROC

 

**********************************************************************************************

PROCEDURE log_ingreso

                LPARAMETERS pnomformulario

                SET DATE BRITISH

                SET CENTURY ON

                * lineas de separación

                LOCAL linea_espacio,linea_vacia,linea_raya

                linea_espacio = CHR(13)

                linea_raya = "+" + REPLICATE("-",93) + CHR(13)

                linea_vacia = "|" + CHR(13)

                *arma la cadena             

                TEXT TO cadena TEXTMERGE NOSHOW FLAGS 2 PRETEXT 2 

                               <<linea_espacio>>

                               <<linea_raya>>

                               | <<DTOC(DATE())>> - <<LEFT(TIME(),5)>> hs. - INGRESO AL FORMULARIO <<ALLTRIM(pnomformulario)>>

                               <<linea_vacia>>

                ENDTEXT

                =guardar_log(cadena)

ENDPROC

 

**********************************************************************************************

PROCEDURE log_alta_sancion

                LPARAMETERS pidregistro,pnomalumno,pfecha,pparte,pcantidad,pmotivo

                SET DATE BRITISH

                SET CENTURY ON

                *arma la cadena             

                TEXT TO cadena TEXTMERGE NOSHOW FLAGS 2 PRETEXT 2 

                               +---ALTA reg:<<ALLTRIM(pidregistro)>><<CHR(13)>>

                               |   alumno: <<ALLTRIM(pnomalumno)>><<CHR(13)>>

                               |   fecha: <<DTOC(pfecha)>> parte nº <<ALLTRIM(pparte)>><<CHR(13)>>

                               |   cant: <<ALLTRIM(STR(pcantidad,5,2))>> - motivo: <<ALLTRIM(pmotivo)>><<CHR(13)>>

                ENDTEXT

                =guardar_log(cadena)

ENDPROC

 

**********************************************************************************************

PROCEDURE log_alta_inasistencia

                LPARAMETERS pnomalumno,pidregistro,pfecha,pcantidad,pmotivo

                SET DATE BRITISH

                SET CENTURY ON

                *arma la cadena             

                TEXT TO cadena TEXTMERGE NOSHOW FLAGS 2 PRETEXT 2 

                               +---ALTA reg:<<ALLTRIM(pidregistro)>><<CHR(13)>>

                               |   alumno: <<ALLTRIM(pnomalumno)>><<CHR(13)>>

                               |   fecha: <<DTOC(pfecha)>><<CHR(13)>>

                               |   cant: <<ALLTRIM(STR(pcantidad,5,2))>> - motivo: <<ALLTRIM(pmotivo)>><<CHR(13)>>

                ENDTEXT

                =guardar_log(cadena)

ENDPROC

 

**********************************************************************************************

PROCEDURE log_cambio_inasistencia

                LPARAMETERS pnomalumno,pidregistro,pfecha,pcantidadnew,pcantidadold,pmotivonew,pmotivoold

                SET DATE BRITISH

                SET CENTURY ON            

                *arma la cadena             

                TEXT TO cadena TEXTMERGE NOSHOW FLAGS 2 PRETEXT 2 

                               +---CAMBIO reg:<<ALLTRIM(pidregistro)>><<CHR(13)>>

                               |   alumno: <<ALLTRIM(pnomalumno)>><<CHR(13)>>

                               |   fecha: <<DTOC(pfecha)>><<CHR(13)>>

                               |      Antes cant: <<ALLTRIM(STR(pcantidadold,5,2))>> - motivo: <<ALLTRIM(pmotivoold)>><<CHR(13)>>

                               |      Ahora cant: <<ALLTRIM(STR(pcantidadnew,5,2))>> - motivo: <<ALLTRIM(pmotivonew)>><<CHR(13)>>

                ENDTEXT

                =guardar_log(cadena)

 

**********************************************************************************************

PROCEDURE log_cambio_calificacion

                LPARAMETERS pidregistro,pnomalumno,pnomcurso,pnommateria,ptexto

                SET DATE BRITISH

                SET CENTURY ON

                *arma la cadena             

                TEXT TO cadena TEXTMERGE NOSHOW FLAGS 2 PRETEXT 2 

                               +---CAMBIO reg:<<ALLTRIM(pidregistro)>><<CHR(13)>>

                               |   alumno: <<ALLTRIM(pnomalumno)>> - curso: <<ALLTRIM(pnomcurso)>><<CHR(13)>>

                               |   materia: <<ALLTRIM(pnommateria)>><<CHR(13)>>

                               |      Modific: <<ptexto>><<CHR(13)>>

                ENDTEXT

                =guardar_log(cadena)

ENDPROC

 

**********************************************************************************************

PROCEDURE log_baja_sancion

                LPARAMETERS pidregistro,pnomalumno,pfecha,pparte,pcantidad,pmotivo

                SET DATE BRITISH

                SET CENTURY ON

                *arma la cadena             

                TEXT TO cadena TEXTMERGE NOSHOW FLAGS 2 PRETEXT 2 

                               +---BAJA reg:<<ALLTRIM(pidregistro)>><<CHR(13)>>

                               |   alumno: <<ALLTRIM(pnomalumno)>><<CHR(13)>>

                               |   fecha: <<DTOC(pfecha)>> parte nº <<ALLTRIM(pparte)>><<CHR(13)>>

                               |   cant: <<ALLTRIM(STR(pcantidad,5,2))>> - motivo: <<ALLTRIM(pmotivo)>><<CHR(13)>>

                ENDTEXT

                =guardar_log(cadena)

ENDPROC

 

**********************************************************************************************

PROCEDURE log_baja_inasistencia

                LPARAMETERS pnomalumno,pidregistro,pfecha,pcantidad,pmotivo

                SET DATE BRITISH

                SET CENTURY ON

                *arma la cadena             

                TEXT TO cadena TEXTMERGE NOSHOW FLAGS 2 PRETEXT 2 

                               +---BAJA reg:<<ALLTRIM(pidregistro)>><<CHR(13)>>

                               |   alumno: <<ALLTRIM(pnomalumno)>><<CHR(13)>>

                               |   fecha: <<pfecha>><<CHR(13)>>

                               |   cant: <<ALLTRIM(pcantidad)>> - motivo: <<ALLTRIM(pmotivo)>><<CHR(13)>>

                ENDTEXT

                =guardar_log(cadena)

ENDPROC

 

**********************************************************************************************

PROCEDURE log_consulta

                LPARAMETERS pnomconsulta

                SET DATE BRITISH

                SET CENTURY ON

                *arma la cadena             

                TEXT TO cadena TEXTMERGE NOSHOW FLAGS 2 PRETEXT 2

                               +---CONSULTA <<ALLTRIM(pnomconsulta)>><<CHR(13)>>

                ENDTEXT

                =guardar_log(cadena)

ENDPROC

 

**********************************************************************************************

PROCEDURE log_impresion

                LPARAMETERS pnomreporte

                SET DATE BRITISH

                SET CENTURY ON

                *arma la cadena             

                TEXT TO cadena TEXTMERGE NOSHOW FLAGS 2 PRETEXT 2

                               +---REPORTE <<ALLTRIM(pnomreporte)>><<CHR(13)>>

                ENDTEXT

                =guardar_log(cadena)

ENDPROC

 

**********************************************************************************************

PROCEDURE log_salida

                LPARAMETERS pnomformulario

                SET DATE BRITISH

                SET CENTURY ON

                * lineas de separación

                LOCAL linea_vacia,linea_raya

                linea_raya = "+" + REPLICATE("-",93) + CHR(13)

                linea_vacia = "|" + CHR(13)

                *arma la cadena             

                TEXT TO cadena TEXTMERGE NOSHOW FLAGS 2 PRETEXT 2

                               <<linea_vacia>>

                               | <<DTOC(DATE())>> - <<LEFT(TIME(),5)>> hs. - SALIDA DEL FORMULARIO <<pnomformulario>>

                               <<linea_raya>>

                ENDTEXT

                =guardar_log(cadena)

ENDPROC

 

**********************************************************************************************

PROCEDURE log_no_pudo_ingresar

                SET DATE BRITISH

                SET CENTURY ON

                * lineas de separación

                LOCAL linea_espacio,linea_estrella

                linea_espacio = CHR(13)

                linea_estrella = REPLICATE("*",94) + CHR(13)

                *arma la cadena

                TEXT TO cadena TEXTMERGE NOSHOW FLAGS 2 PRETEXT 2 

                               <<linea_espacio>>

                               <<linea_estrella>>

                               <<DTOC(DATE())>> - <<LEFT(TIME(),5)>> hs. - Usuario: <<v_usuarioactual>> - SE DENEGÓ EL INGRESO AL SISTEMA <<CHR(13)>>

                               <<linea_estrella>>

ENDTEXT

                =guardar_log(cadena)

ENDPROC

 

**********************************************************************************************

PROCEDURE guardar_log

                LPARAMETERS pcadena

                LOCAL archivo

                archivo = "c:\sistema004\datos\auditorias\auditoria " + ALLTRIM(DMY(DATE())) + ".txt"

                =STRTOFILE(pcadena,archivo,1)

ENDPROC

 

**********************************************************************************************

PROCEDURE enviar_mail_salida

                * envio de mail

                TRY

                               LOCAL lcSchema, loConfig, loMsg, loError, lcErr

                               lcErr = ""

                               lcSchema = "http://schemas.microsoft.com/cdo/configuration/"

                               * configuracion de la pagina de google

                               loConfig = CREATEOBJECT("Cdo.Configuration")

                               loConfig.fields.item(lcSchema + "smtpserver") = "smtp.gmail.com"

                               loConfig.fields.item(lcSchema + "smtpserverport") = 465  && o tambien 587

                               loConfig.fields.item(lcSchema + "sendusing") = 2

                               loConfig.fields.item(lcSchema + "smtpauthenticate") = .t.

                               loConfig.fields.item(lcSchema + "smtpusessl") = .t.

                               loConfig.fields.item(lcSchema + "sendusername") = "notas2...@gmail.com"

                               loConfig.fields.item(lcSchema + "sendpassword") = "Julio_solo_2008"

                               loConfig.fields.update

                               * configuracion del mensaje de correo

                               loMsg = CREATEOBJECT("CDO.Message")

                               loMsg.Configuration = loConfig

                               loMsg.from = "notas2...@gmail.com"

                               loMsg.to = "earm...@gmail.com"

                               loMsg.subject = "Salida del sistema Preceptoría 1.4"

                               loMsg.textbody = DTOC(DATETIME()) + " --> El usuario " + ALLTRIM(v_usuarioactual)+ " ha salido del sistema, en el nivel " + ALLTRIM(STR(v_nivelactual))

                               adjunto = "C:\Sistema004\Datos\Auditorias\auditoria " + ALLTRIM(DMY(DATE())) + ".txt"           

                               IF FILE(adjunto) THEN

                                               loMsg.addattachment(adjunto)

                               ENDIF

                               loMsg.send

                               archivo = "c:\sistema004\datos\auditorias\auditoria " + ALLTRIM(DMY(DATE())) + ".txt"

                               =STRTOFILE("  --> Se ha enviado un mensaje de email "+CHR(13),archivo,1)

 

                CATCH TO loError

                               WAIT "No se pudo emitir mail" WINDOW AT 20,20 NOWAIT

                               archivo = "c:\sistema004\datos\auditorias\auditoria " + ALLTRIM(DMY(DATE())) + ".txt"

                               =STRTOFILE("  --> Error, no se pudo emitir mail"+CHR(13),archivo,1)

                FINALLY

                               RELEASE loConfig

                               RELEASE loMsg

                               loConfig = .null.

                               loMsg = .null.

                ENDTRY                              

ENDPROC

 

 

 

 

 

 


Libre de virus. www.avast.com

Luis Maria Guayan

unread,
Dec 23, 2021, 3:13:45 PM12/23/21
to Comunidad de Visual Foxpro en Español
Hola, si te refieres al artículo:

-- Auditando eventos de inserción, modificación y eliminación en tablas de FoxPro --
https://comunidadvfp.blogspot.com/2014/09/auditando-eventos-de-insercion.html

Primero, que yo solo lo traduje, lo escribió Nancy Folsom.

Segundo, lo acabo de probar y funciona correctamente.

Debes crear los dos archivos PRGsAuditTrailExample.PRGAuditTableStoredProc.PRG

y luego desde la ventana de comandos ejecuta

DO AuditTrailExample

 Mira la DBC creada, y el código de los Procedimientos Almacenados generados.

Luis María Guayán
Tucumán, Argentina
_______________________________
Comunidad Visual FoxPro en Español
http://comunidadvfp.blogspot.com


Ivan Jaramillo Gonzalez

unread,
Dec 24, 2021, 1:33:42 PM12/24/21
to Comunidad de Visual Foxpro en Español
Hola Maestro, Le deseo Feliz Navidad a Usted y a todos sus seres queridos, que tengan unas Felices Fiestas y que el 2,022, sea un Año de exitos, en Cuanto a mi pregunta Maestro, a mi me Genero un Archivo .Err al Utilizarlo, la unica adaptación que le hice fue la Siguiente, y pienso que eso no Generaria Error

CLOSE DATABASES ALL
SET PATH TO 'F:\Aplicación_1.0\Data_Base_Odin'         ADDITIVE
SET PATH TO 'F:\Aplicación_1.0'                                 ADDITIVE
SET PATH TO 'F:\Aplicación_1.0\Programas'                 ADDITIVE
=        Asignación_Trigers_Tablas()
**********************************
FUNCTION Asignación_Trigers_Tablas
**********************************
IF        FILE(FULLPATH('Odin_Factoring.dbc'))
        SET DATABASE TO Odin_Factoring
ENDIF
Creación        =        'Nó'
IF         !FILE(FULLPATH('Ctrl_Auditoria_00.DBF'))
        Creación        =        'Sí'
ENDIF
=        Ctrl_Auditoria_Sistema(Creación)
IF Create_Stored_Procedure()
        IF FILE(FULLPATH('Ctrl_Auditoria_00.DBF'))
                CREATE TRIGGER ON Ctrl_Auditoria_00 FOR INSERT AS ;
                    ' '
            CREATE TRIGGER ON Ctrl_Auditoria_00 FOR DELETE AS ;
                      ' '
            CREATE TRIGGER ON Ctrl_Auditoria_00 FOR UPDATE AS ;
                      ' '
    ENDIF
        IF FILE(FULLPATH('Configuración_Aplicación_00.DBF'))
                CREATE TRIGGER ON Configuración_Aplicación_00 FOR INSERT AS ;
                    AuditTable()
            CREATE TRIGGER ON Configuración_Aplicación_00 FOR DELETE AS ;
                      AuditTable()
            CREATE TRIGGER ON Configuración_Aplicación_00 FOR UPDATE AS ;
                      AuditTable()
    ENDIF
        IF FILE(FULLPATH('Configuración_Aplicación_01.DBF'))
                CREATE TRIGGER ON Configuración_Aplicación_01 FOR INSERT AS ;
                    AuditTable()
            CREATE TRIGGER ON Configuración_Aplicación_01 FOR DELETE AS ;
                      AuditTable()
            CREATE TRIGGER ON Configuración_Aplicación_01 FOR UPDATE AS ;
                      AuditTable()
    ENDIF
  ENDIF
ENDFUNC
*******************************
FUNCTION Ctrl_Auditoria_Sistema
*******************************
LPARAMETERS Creación
IF !TYPE('Creación')        =        'C'
        IF         !FILE(FULLPATH('Ctrl_Auditoria_00.DBF'))
                Creación        =        'Sí'
        ENDIF
ENDIF
IF Creación        =        'Sí'
        CREATE TABLE Ctrl_Auditoria_00        ;
                 (AuditId I NOT NULL AUTOINC NEXTVALUE 115 STEP 1, ;
                          Entity C(64) NOT NULL, ;
                      Action C(16) NOT NULL, ;
                      SOURCE M NOT NULL, ;
                      OldValues M NOT NULL, ;
                      NewValues M NOT NULL, ;
                      cUser C(64) NOT NULL, ;
                      Pk C(16) NOT NULL, ;
                      PkValue C(16) NOT NULL, ;
                      TIMESTAMP T NOT NULL)
    USE IN        Ctrl_Auditoria_00
        USE Ctrl_Auditoria_00        ALIAS        Ctrl_Auditoria_Aplicativa        EXCLUSIVE IN 0
        INDEX ON AuditId TAG AuditId CANDIDATE
ELSE
        Var_Ctrl        =        Ctrl_Exclusive('Ctrl_Auditoria_00.DBF',1)
ENDIF
RETURN ''
ENDFUNC
********************************
FUNCTION Create_Stored_Procedure
********************************
IF EMPTY(DBC())
        IF FILE(FULLPATH('ODIN_FACTORING.dbc'))
                SET DATABASE TO ODIN_FACTORING
        ELSE
                MESSAGEBOX('Se debe dar Un Contenedor de Datos Valido')
        ENDIF
ENDIF
IF FILE(FULLPATH('Procedimientos_Almacenados_Auditoria_Aplicación.Prg'))
        APPEND PROCEDURES FROM Procedimientos_Almacenados_Auditoria_Aplicación.Prg
        RETURN .T.
ELSE
        MESSAGEBOX('Nó Existe El Archivo de Procedimiento en El Path Vigente')
    RETURN .F.
ENDIF
ENDFUNC
***********************
FUNCTION Ctrl_Exclusive
***********************
LPARAMETERS Table_Name,Ctrl_Node
IF !EMPTY('Table_Name')
        Table_Name        =        ALIAS()
ENDIF
IF !VARTYPE(Ctrl_Node)=='N'
        Ctrl_Node = 0
ENDIF
LOCAL Ln_Handle, Ll_Ret
Ln_Handle = FOPEN(Table_Name,Ctrl_Node)
IF Ln_Handle = -1
   A_Devolver = .F.
ELSE
   A_Devolver = .T.
   =        FCLOSE(Ln_Handle)
ENDIF
RETURN A_Devolver
ENDFUNC

y cuando lo utilizo Maestro me Genera el Siguiente Archivo .Err

LOCAL  lcOldSetDbcTo, lcFldState,lcAlias,  lcSource, lcAction, lcUser, lcPk,  lcPkValue, lcNew, lcOld
Error in line 191 (record 3): Statement is not in a procedure.
STORE "" TO lcOld, lcNew
Error in line 192 (record 3): Statement is not in a procedure.
lcOldSetDbcTo = SET("Database")
Error in line 196 (record 3): Statement is not in a procedure.
IF SetDBC()
Error in line 197 (record 3): Statement is not in a procedure.
lcFldState        =         NVL( GETFLDSTATE(-1), "" )
Error in line 198 (record 3): Statement is not in a procedure.
lcUser                 =         SYS(0)
Error in line 199 (record 3): Statement is not in a procedure.
lcAction         =         GetAction( lcFldState )
Error in line 200 (record 3): Statement is not in a procedure.
lcAlias         =         ALIAS()
Error in line 201 (record 3): Statement is not in a procedure.
lcSource         =         GetCursorSource()
Error in line 202 (record 3): Statement is not in a procedure.
lcPk                 =         DBGETPROP(lcAlias, 'Table', 'PrimaryKey' )
Error in line 203 (record 3): Statement is not in a procedure.
lcPkValue         =         FieldNameToStringValue(lcPk)
Error in line 204 (record 3): Statement is not in a procedure.
ValuesToString(lcFldState, @lcOld, @lcNew)
Error in line 205 (record 3): Statement is not in a procedure.
INSERT INTO Ctrl_Auditoria_00         (Entity, Action, NewValues, OldValues, cUser,          Pk, PkValue, SOURCE, TIMESTAMP)                                  VALUES         (lcAlias, lcAction, lcNew, lcOld, lcUser,  lcPk, lcPkValue, lcSource, DATETIME())
Error in line 211 (record 3): Statement is not in a procedure.
USE IN SELECT('TableAudit')
Error in line 212 (record 3): Statement is not in a procedure.
SET DATABASE TO (lcOldSetDbcTo)
Error in line 213 (record 3): Statement is not in a procedure.
SELECT SELECT(lcAlias)
Error in line 214 (record 3): Statement is not in a procedure.
ENDIF
Error in line 215 (record 3): Statement is not in a procedure.
RETURN .T.
Error in line 216 (record 3): Statement is not in a procedure.
ENDFUNC
Error in line 217 (record 3): Nesting error.
LOCAL  lcOldSetDbcTo, lcFldState,lcAlias,  lcSource, lcAction, lcUser, lcPk,  lcPkValue, lcNew, lcOld
Error in line 377 (record 3): Statement is not in a procedure.
STORE "" TO lcOld, lcNew
Error in line 378 (record 3): Statement is not in a procedure.
lcOldSetDbcTo = SET("Database")
Error in line 382 (record 3): Statement is not in a procedure.
IF SetDBC()
Error in line 383 (record 3): Statement is not in a procedure.
lcFldState        =         NVL( GETFLDSTATE(-1), "" )
Error in line 384 (record 3): Statement is not in a procedure.
lcUser                 =         SYS(0)
Error in line 385 (record 3): Statement is not in a procedure.
lcAction         =         GetAction( lcFldState )
Error in line 386 (record 3): Statement is not in a procedure.
lcAlias         =         ALIAS()
Error in line 387 (record 3): Statement is not in a procedure.
lcSource         =         GetCursorSource()
Error in line 388 (record 3): Statement is not in a procedure.
lcPk                 =         DBGETPROP(lcAlias, 'Table', 'PrimaryKey' )
Error in line 389 (record 3): Statement is not in a procedure.
lcPkValue         =         FieldNameToStringValue(lcPk)
Error in line 390 (record 3): Statement is not in a procedure.
ValuesToString(lcFldState, @lcOld, @lcNew)
Error in line 391 (record 3): Statement is not in a procedure.
INSERT INTO Ctrl_Auditoria_00         (Entity, Action, NewValues, OldValues, cUser,          Pk, PkValue, SOURCE, TIMESTAMP)                                  VALUES         (lcAlias, lcAction, lcNew, lcOld, lcUser,  lcPk, lcPkValue, lcSource, DATETIME())
Error in line 397 (record 3): Statement is not in a procedure.
USE IN SELECT('TableAudit')
Error in line 398 (record 3): Statement is not in a procedure.
SET DATABASE TO (lcOldSetDbcTo)
Error in line 399 (record 3): Statement is not in a procedure.
SELECT SELECT(lcAlias)
Error in line 400 (record 3): Statement is not in a procedure.
ENDIF
Error in line 401 (record 3): Statement is not in a procedure.
RETURN .T.
Error in line 402 (record 3): Statement is not in a procedure.
ENDFUNC
Error in line 403 (record 3): Nesting error.
LOCAL  lcOldSetDbcTo, lcFldState,lcAlias,  lcSource, lcAction, lcUser, lcPk,  lcPkValue, lcNew, lcOld
Error in line 563 (record 3): Statement is not in a procedure.
STORE "" TO lcOld, lcNew
Error in line 564 (record 3): Statement is not in a procedure.
lcOldSetDbcTo = SET("Database")
Error in line 568 (record 3): Statement is not in a procedure.
IF SetDBC()
Error in line 569 (record 3): Statement is not in a procedure.
lcFldState        =         NVL( GETFLDSTATE(-1), "" )
Error in line 570 (record 3): Statement is not in a procedure.
lcUser                 =         SYS(0)
Error in line 571 (record 3): Statement is not in a procedure.
lcAction         =         GetAction( lcFldState )
Error in line 572 (record 3): Statement is not in a procedure.
lcAlias         =         ALIAS()
Error in line 573 (record 3): Statement is not in a procedure.
lcSource         =         GetCursorSource()
Error in line 574 (record 3): Statement is not in a procedure.
lcPk                 =         DBGETPROP(lcAlias, 'Table', 'PrimaryKey' )
Error in line 575 (record 3): Statement is not in a procedure.
lcPkValue         =         FieldNameToStringValue(lcPk)
Error in line 576 (record 3): Statement is not in a procedure.
ValuesToString(lcFldState, @lcOld, @lcNew)
Error in line 577 (record 3): Statement is not in a procedure.
INSERT INTO Ctrl_Auditoria_00         (Entity, Action, NewValues, OldValues, cUser,          Pk, PkValue, SOURCE, TIMESTAMP)                                  VALUES         (lcAlias, lcAction, lcNew, lcOld, lcUser,  lcPk, lcPkValue, lcSource, DATETIME())
Error in line 583 (record 3): Statement is not in a procedure.
USE IN SELECT('TableAudit')
Error in line 584 (record 3): Statement is not in a procedure.
SET DATABASE TO (lcOldSetDbcTo)
Error in line 585 (record 3): Statement is not in a procedure.
SELECT SELECT(lcAlias)
Error in line 586 (record 3): Statement is not in a procedure.
ENDIF
Error in line 587 (record 3): Statement is not in a procedure.
RETURN .T.
Error in line 588 (record 3): Statement is not in a procedure.
ENDFUNC
Error in line 589 (record 3): Nesting error.
LOCAL  lcOldSetDbcTo, lcFldState,lcAlias,  lcSource, lcAction, lcUser, lcPk,  lcPkValue, lcNew, lcOld
Error in line 749 (record 3): Statement is not in a procedure.
STORE "" TO lcOld, lcNew
Error in line 750 (record 3): Statement is not in a procedure.
lcOldSetDbcTo = SET("Database")
Error in line 754 (record 3): Statement is not in a procedure.
IF SetDBC()
Error in line 755 (record 3): Statement is not in a procedure.
lcFldState        =         NVL( GETFLDSTATE(-1), "" )
Error in line 756 (record 3): Statement is not in a procedure.
lcUser                 =         SYS(0)
Error in line 757 (record 3): Statement is not in a procedure.
lcAction         =         GetAction( lcFldState )
Error in line 758 (record 3): Statement is not in a procedure.
lcAlias         =         ALIAS()
Error in line 759 (record 3): Statement is not in a procedure.
lcSource         =         GetCursorSource()
Error in line 760 (record 3): Statement is not in a procedure.
lcPk                 =         DBGETPROP(lcAlias, 'Table', 'PrimaryKey' )
Error in line 761 (record 3): Statement is not in a procedure.
lcPkValue         =         FieldNameToStringValue(lcPk)
Error in line 762 (record 3): Statement is not in a procedure.
ValuesToString(lcFldState, @lcOld, @lcNew)
Error in line 763 (record 3): Statement is not in a procedure.
INSERT INTO Ctrl_Auditoria_00         (Entity, Action, NewValues, OldValues, cUser,          Pk, PkValue, SOURCE, TIMESTAMP)                                  VALUES         (lcAlias, lcAction, lcNew, lcOld, lcUser,  lcPk, lcPkValue, lcSource, DATETIME())
Error in line 769 (record 3): Statement is not in a procedure.
USE IN SELECT('TableAudit')
Error in line 770 (record 3): Statement is not in a procedure.
SET DATABASE TO (lcOldSetDbcTo)
Error in line 771 (record 3): Statement is not in a procedure.
SELECT SELECT(lcAlias)
Error in line 772 (record 3): Statement is not in a procedure.
ENDIF
Error in line 773 (record 3): Statement is not in a procedure.
RETURN .T.
Error in line 774 (record 3): Statement is not in a procedure.
ENDFUNC
Error in line 775 (record 3): Nesting error.
LOCAL  lcOldSetDbcTo, lcFldState,lcAlias,  lcSource, lcAction, lcUser, lcPk,  lcPkValue, lcNew, lcOld
Error in line 935 (record 3): Statement is not in a procedure.
STORE "" TO lcOld, lcNew
Error in line 936 (record 3): Statement is not in a procedure.
lcOldSetDbcTo = SET("Database")
Error in line 940 (record 3): Statement is not in a procedure.
IF SetDBC()
Error in line 941 (record 3): Statement is not in a procedure.
lcFldState        =         NVL( GETFLDSTATE(-1), "" )
Error in line 942 (record 3): Statement is not in a procedure.
lcUser                 =         SYS(0)
Error in line 943 (record 3): Statement is not in a procedure.
lcAction         =         GetAction( lcFldState )
Error in line 944 (record 3): Statement is not in a procedure.
lcAlias         =         ALIAS()
Error in line 945 (record 3): Statement is not in a procedure.
lcSource         =         GetCursorSource()
Error in line 946 (record 3): Statement is not in a procedure.
lcPk                 =         DBGETPROP(lcAlias, 'Table', 'PrimaryKey' )
Error in line 947 (record 3): Statement is not in a procedure.
lcPkValue         =         FieldNameToStringValue(lcPk)
Error in line 948 (record 3): Statement is not in a procedure.
ValuesToString(lcFldState, @lcOld, @lcNew)
Error in line 949 (record 3): Statement is not in a procedure.
INSERT INTO Ctrl_Auditoria_00         (Entity, Action, NewValues, OldValues, cUser,          Pk, PkValue, SOURCE, TIMESTAMP)                                  VALUES         (lcAlias, lcAction, lcNew, lcOld, lcUser,  lcPk, lcPkValue, lcSource, DATETIME())
Error in line 955 (record 3): Statement is not in a procedure.
USE IN SELECT('TableAudit')
Error in line 956 (record 3): Statement is not in a procedure.
SET DATABASE TO (lcOldSetDbcTo)
Error in line 957 (record 3): Statement is not in a procedure.
SELECT SELECT(lcAlias)
Error in line 958 (record 3): Statement is not in a procedure.
ENDIF
Error in line 959 (record 3): Statement is not in a procedure.
RETURN .T.
Error in line 960 (record 3): Statement is not in a procedure.
ENDFUNC
Error in line 961 (record 3): Nesting error.
LOCAL  lcOldSetDbcTo, lcFldState,lcAlias,  lcSource, lcAction, lcUser, lcPk,  lcPkValue, lcNew, lcOld
Error in line 1121 (record 3): Statement is not in a procedure.
STORE "" TO lcOld, lcNew
Error in line 1122 (record 3): Statement is not in a procedure.
lcOldSetDbcTo = SET("Database")
Error in line 1126 (record 3): Statement is not in a procedure.
IF SetDBC()
Error in line 1127 (record 3): Statement is not in a procedure.
lcFldState        =         NVL( GETFLDSTATE(-1), "" )
Error in line 1128 (record 3): Statement is not in a procedure.
lcUser                 =         SYS(0)
Error in line 1129 (record 3): Statement is not in a procedure.
lcAction         =         GetAction( lcFldState )
Error in line 1130 (record 3): Statement is not in a procedure.
lcAlias         =         ALIAS()
Error in line 1131 (record 3): Statement is not in a procedure.
lcSource         =         GetCursorSource()
Error in line 1132 (record 3): Statement is not in a procedure.
lcPk                 =         DBGETPROP(lcAlias, 'Table', 'PrimaryKey' )
Error in line 1133 (record 3): Statement is not in a procedure.
lcPkValue         =         FieldNameToStringValue(lcPk)
Error in line 1134 (record 3): Statement is not in a procedure.
ValuesToString(lcFldState, @lcOld, @lcNew)
Error in line 1135 (record 3): Statement is not in a procedure.
INSERT INTO Ctrl_Auditoria_00         (Entity, Action, NewValues, OldValues, cUser,          Pk, PkValue, SOURCE, TIMESTAMP)                                  VALUES         (lcAlias, lcAction, lcNew, lcOld, lcUser,  lcPk, lcPkValue, lcSource, DATETIME())
Error in line 1141 (record 3): Statement is not in a procedure.
USE IN SELECT('TableAudit')
Error in line 1142 (record 3): Statement is not in a procedure.
SET DATABASE TO (lcOldSetDbcTo)
Error in line 1143 (record 3): Statement is not in a procedure.
SELECT SELECT(lcAlias)
Error in line 1144 (record 3): Statement is not in a procedure.
ENDIF
Error in line 1145 (record 3): Statement is not in a procedure.
RETURN .T.
Error in line 1146 (record 3): Statement is not in a procedure.
ENDFUNC
Error in line 1147 (record 3): Nesting error.
LOCAL  lcOldSetDbcTo, lcFldState,lcAlias,  lcSource, lcAction, lcUser, lcPk,  lcPkValue, lcNew, lcOld
Error in line 1307 (record 3): Statement is not in a procedure.
STORE "" TO lcOld, lcNew
Error in line 1308 (record 3): Statement is not in a procedure.
lcOldSetDbcTo = SET("Database")
Error in line 1312 (record 3): Statement is not in a procedure.
IF SetDBC()
Error in line 1313 (record 3): Statement is not in a procedure.
lcFldState        =         NVL( GETFLDSTATE(-1), "" )
Error in line 1314 (record 3): Statement is not in a procedure.
lcUser                 =         SYS(0)
Error in line 1315 (record 3): Statement is not in a procedure.
lcAction         =         GetAction( lcFldState )
Error in line 1316 (record 3): Statement is not in a procedure.
lcAlias         =         ALIAS()
Error in line 1317 (record 3): Statement is not in a procedure.
lcSource         =         GetCursorSource()
Error in line 1318 (record 3): Statement is not in a procedure.
lcPk                 =         DBGETPROP(lcAlias, 'Table', 'PrimaryKey' )
Error in line 1319 (record 3): Statement is not in a procedure.
lcPkValue         =         FieldNameToStringValue(lcPk)
Error in line 1320 (record 3): Statement is not in a procedure.
ValuesToString(lcFldState, @lcOld, @lcNew)
Error in line 1321 (record 3): Statement is not in a procedure.
INSERT INTO Ctrl_Auditoria_00         (Entity, Action, NewValues, OldValues, cUser,          Pk, PkValue, SOURCE, TIMESTAMP)                                  VALUES         (lcAlias, lcAction, lcNew, lcOld, lcUser,  lcPk, lcPkValue, lcSource, DATETIME())
Error in line 1327 (record 3): Statement is not in a procedure.
USE IN SELECT('TableAudit')
Error in line 1328 (record 3): Statement is not in a procedure.
SET DATABASE TO (lcOldSetDbcTo)
Error in line 1329 (record 3): Statement is not in a procedure.
SELECT SELECT(lcAlias)
Error in line 1330 (record 3): Statement is not in a procedure.
ENDIF
Error in line 1331 (record 3): Statement is not in a procedure.
RETURN .T.
Error in line 1332 (record 3): Statement is not in a procedure.
ENDFUNC
Error in line 1333 (record 3): Nesting error.

Me podria por Favor Maestro Indicarme que estoy Haciendo Mal, y porque a mi Nó me Funciona, De Antemano Muchas Gracias

HernanCano

unread,
Dec 24, 2021, 3:49:25 PM12/24/21
to Comunidad de Visual Foxpro en Español
Iván:

Falta el PRG Procedimientos_Almacenados_Auditoria_Aplicación.

Estás usando la vble Creación como no declarada en Asignación_Trigers_Tablas, pero como parámetro local en Ctrl_Auditoria_Sistema. Como éso va en contravía de las buenas prácticas, es difícil entender tu escenario.

HernanCano

unread,
Dec 24, 2021, 3:54:58 PM12/24/21
to Comunidad de Visual Foxpro en Español
Si los comandos

LOCAL  lcOldSetDbcTo, lcFldState,lcAlias,  lcSource, lcAction, lcUser, lcPk,  lcPkValue, lcNew, lcOld
STORE "" TO lcOld, lcNew

(y en general todos los que aparecen en lo que indicas que te sale como error,)

no están en una procedure, es porque estás utilizando incorrectamente la información que se te proporciona.

Por ejm esos comandos no están centro de la función AuditTable().

Ivan Jaramillo Gonzalez

unread,
Dec 24, 2021, 4:13:05 PM12/24/21
to Comunidad de Visual Foxpro en Español
Buenas Tardes Maestro Hernan, Feliz Navidad y nUn Prospero Año 2,022, Para Usted y sus Seres Queridos,Aun Nó Entiendo que Pasa, yo Registro  la Vble Creación en  Asignación_Trigers_Tablas y la Paso como Parametro a la Función  Ctrl_Auditoria_Sistema, Hay Algo de Malo En Eso?, A Continuación El Código  Procedimientos_Almacenados_Auditoria_Aplicación

FUNCTION AuditTable()

  LOCAL ;
    lcOldSetDbcTo, lcFldState,lcAlias, ;
    lcSource, lcAction, lcUser, lcPk, ;
    lcPkValue, lcNew, lcOld
  STORE "" TO lcOld, lcNew
  *
  * La DBC de la tabla debe ser la actual para DbGetProp()
  *

  lcOldSetDbcTo = SET("Database")
  IF SetDBC() && Esto no trabaja para tablas libres

    lcFldState        =         NVL( GETFLDSTATE(-1), "" )
    lcUser                 =         SYS(0) && Quien lo hace...
    lcAction         =         GetAction( lcFldState ) && Que hace...
    lcAlias         =         ALIAS() && A quien...
    lcSource         =         GetCursorSource()

    lcPk                 =         DBGETPROP(lcAlias, 'Table', 'PrimaryKey' )
    lcPkValue         =         FieldNameToStringValue(lcPk)
    ValuesToString(lcFldState, @lcOld, @lcNew)

    INSERT INTO Ctrl_Auditoria_00        ;
            (Entity, Action, NewValues, OldValues, cUser,         ;
             Pk, PkValue, SOURCE, TIMESTAMP)                                 ;
             VALUES        ;
                      (lcAlias, lcAction, lcNew, lcOld, lcUser, ;
                      lcPk, lcPkValue, lcSource, DATETIME())
    USE IN SELECT('TableAudit')
    SET DATABASE TO (lcOldSetDbcTo)
    SELECT SELECT(lcAlias)
  ENDIF
  RETURN .T.
ENDFUNC
**************************************************
* Function ValuesToString( tcFldState, tcOld, tcNew )
* Pasar tcOld y tcNew por referencia.
* Por cada campo en el registro, verifico si ha cambiado.
* Si cambio, concateno los valores de los campos
* a los parametros tcOld y tcNew pasados.
**************************************************
FUNCTION ValuesToString( tcFldState, tcOld, tcNew )
  LOCAL lcFldState, lvOld, lvNew, lni, lcField
  *
  * Quito la bandera de eliminación de la cadena GetFldState
  *
  lcFldState = SUBSTR( tcFldState, 2 )
  tcOld = ""
  tcNew = ""
  FOR lni = 1 TO LEN( lcFldState )
    IF INLIST( SUBSTR(lcFldState, lni, 1), "2", "4" )
      *
      * Algo ha cambiado
      *
      lcField = FIELD(lni)
      lvOld = OLDVAL( lcField )
      lvNew = EVALUATE( lcField )
      *
      * Almaceno los valores anteriores
      *
      IF !ISNULL( lvOld ) && Ignore if .null.
        tcOld = tcOld + ;
          lcField + " = " + Stringify( lvOld ) + CHR(13)
      ENDIF
      *
      * Almaceno los nuevos valores
      *
      IF !ISNULL( lvNew ) && Ignoro si es nulo.
        tcNew = tcNew + ;
          lcField + " = " + Stringify( lvNew ) + CHR(13)
      ENDIF
    ENDIF && Si el registro ha cambiado
  ENDFOR && Por cada campo en el registro
  RETURN .T.
ENDFUNC

**************************************************
* Function Stringify(tvValue)
* Tomo un tipo de valor y lo convierto a un valor
* pueda ser evaluado nuevamente a su tipo original.
**************************************************
*
* Definiciones para las partes de fechas
*
#DEFINE sYear STR( YEAR( tvValue ), 4, 0)
#DEFINE sMonth STR( MONTH( tvValue ), 2, 0)
#DEFINE sDay STR( DAY( tvValue ), 2, 0)
#DEFINE sHour STR( HOUR( tvValue ), 2, 0)
#DEFINE sMinute STR( MINUTE(tvValue ), 2, 0)
#DEFINE sSecond STR( SEC( tvValue ), 2, 0)
*
FUNCTION Stringify(tvValue)
  *
  LOCAL lcType, lcReturn
  lcType = VARTYPE(tvValue)
  DO CASE
    CASE lcType = "Y" && Currency
      lcReturn = ALLTRIM( STR( tvValue, 12, 4 ) )
    CASE lcType = "C" && Character
      lcReturn = "[" + ALLTRIM(tvValue) + "]"
    CASE lcType = "D" && Date
      lcReturn = "Date"
      * Set("Mark") no es soportado en el proveedor OLEDB
      * lcMark = Set("Mark") && Date separator
      lcMark = "/"
      lcReturn = "{^" + ;
        sYear + lcMark + ;
        sMonth + lcMark + ;
        sDay + "}"
    CASE lcType = "T" && DateTime
      * Set("Mark") no es soportado en el proveedor OLEDB
      * lcMark = Set("Mark") && Date separator
      lcMark = "/"
      lcReturn = "{^" + ;
        sYear + lcMark + ;
        sMonth + lcMark + ;
        sDay + " " + ;
        sHour + ":" + ;
        sMinute + ":" + ;
        sSecond + "}"
    OTHERWISE
      lcReturn = ALLTRIM( TRANSFORM(tvValue) )
  ENDCASE
  RETURN lcReturn
ENDFUNC
**************************************************
* Function GetAction
* ¿Se añadio el registro insertado, modificado o eliminado?
**************************************************
FUNCTION GetAction( tcFldState)
  LOCAL lcReturn
  DO CASE
    CASE EMPTY( CHRTRAN( tcFldState, "1", "" ) )
      lcReturn = ""
    CASE LEFT( tcFldState, 1 ) = "2"
      lcReturn = IIF( DELETED(), "Deleted", "Recalled" )
    CASE AT( "2", tcFldState ) > 0
      lcReturn = "Updated"
    CASE !EMPTY( CHRTRAN( tcFldState, "12", "" ) )
      lcReturn = "Inserted"
    OTHERWISE
      lcReturn = tcFldState
  ENDCASE
  RETURN lcReturn
ENDFUNC
**************************************************
* Function GetCursorSource()
* Retorna la(s) tabla(s) subyacente para ALIAS()
**************************************************
FUNCTION GetCursorSource()
  LOCAL lcReturn, lni
  lni = CURSORGETPROP("SourceType")
  DO CASE
    CASE lni = 1 && Vista Local
      lcReturn = CURSORGETPROP("Tables")
    CASE lni = 3 && Tabla VFP
      lcReturn = FULLPATH( DBF() )
    OTHERWISE
      lcReturn = ""
  ENDCASE
  RETURN lcReturn
ENDFUNC
**************************************************
* Function FieldNameToStringValue( tcField )
* Toma el nombre de campo y retorna el valor del
* campo como una cadena
**************************************************
FUNCTION FieldNameToStringValue( tcField )
  LOCAL lcField
  lcField = FIELD( tcField)
  IF EMPTY( lcField )
    RETURN ""
  ENDIF
  RETURN Stringify( EVALUATE( lcField ) )
ENDFUNC
**************************************************
* Function SetDBC()
**************************************************
FUNCTION SetDBC()
  LOCAL lcDBC
  lcDBC = CURSORGETPROP("Database")
  IF EMPTY(lcDBC)
    RETURN .F. && Esto no trabaja para tablas libres
  ENDIF
  SET DATABASE TO (lcDBC)
  RETURN .T.
ENDFUNC
**************************************************
* Final del código de seguimiento de la auditoria
**************************************************
Me podrias por favor orientar cual es el Error, De Antemano Muchas Gracias por tu Asesoria

HernanCano

unread,
Dec 25, 2021, 1:39:58 AM12/25/21
to Comunidad de Visual Foxpro en Español
>>> ...  yo Registro  la Vble Creación en  Asignación_Trigers_Tablas y la Paso como Parametro a la Función  Ctrl_Auditoria_Sistema, Hay Algo de Malo En Eso?....

La vble Creación puede cambiar dentro de Ctrl_Auditoria_Sistema... pero al no ser llamada con arroba -- es decir con Ctrl_Auditoria_Sistema(Creación)-- me queda la duda si realmente cambia (cuando debiera cambiar ---es decir dentro del IF).

Ahora: como todo empieza en Asignación_Trigers_Tablas, y ahí la vble es no-definida (no se declara ni pública no privada ni local), se considera privada en cuyo caso sí puede cambiar (dadas las malas prácticas de usar una vble así como parámetro local --como parámetro local no debiera cambiar, pero como privada/nodefinida sí --- lo cual indica programación confusa)....

Con programación confusa (malas prácticas) no se mete uno.....

>>> ... Me podrías por favor orientar cual es el Error...

Ya te dije:  ((mira la sgte imagen))

El maestro es Luis M Guayán.

borrable1.png


Reply all
Reply to author
Forward
0 new messages