Saltar al contenido principal
Versión: Siguiente

GET DOCUMENT PROPERTIES

GET DOCUMENT PROPERTIES ( doc ; bloqueado ; invisible ; creado el ; creado a las ; modificado el ; modificado a las )

ParámetroTipoDescripción
docTextNombre del documento
bloqueadoBooleanBloqueado (True) o no bloqueado (False)
invisibleBooleanInvisible (True) o visible (False)
creado elFechaFecha de creación
creado a lasHoraHora de creación
modificado elFechaFecha de la última modificación
modificado a lasHoraHora de la última modificación

Descripción

El comando GET DOCUMENT PROPERTIES devuelve información sobre el documento cuyo nombre o ruta se pasa en documento.

Después de la llamada:

  • bloqueado devuelve True si el documento está bloqueado. Un documento bloqueado no puede modificarse.
  • invisible devuelve True si el documento está oculto.
  • creado el y creado a las devuelven la fecha y hora de creación del documento.
  • modificado el y modificado a las devuelven la fecha y hora de la última modificación del documento.

Ejemplo

Usted ha creado una base de documentación y quiere exportar todos los registros creados en la base a un documento en disco. Como la base se actualiza regularmente, usted quiere escribir un algoritmo de exportación que cree o recree cada documento en el disco si el documento no existe o si el registro correspondiente ha sido modificado después de que el documento fue grabado por última vez. Por lo tanto, usted debe comparar la fecha y la hora de la modificación del documento (si la hay) con su registro correspondiente. Para ilustrar este ejemplo, utilizamos la siguiente tabla:

En lugar de guardar una fecha y una hora en cada registro, puede guardar un “marcador” que exprese el número de segundos transcurridos entre una fecha anterior arbitraria (en este ejemplo utilizamos el 1 de enero de 1995 a las 00:00:00) y la fecha y la hora en la que se guardó el registro.

En nuestro ejemplo, el campo [Documentos]Marcador_creacion contiene el marcador de creación del registro y el campo [Documentos]Marcador_modificacion contiene el marcador de la última modificación del registro.

El método de proyecto TimeStamp calcula el marcador de tiempo para una fecha y horas específicas o para la fecha y hora actual si no se pasan parámetros:

  // Método de proyecto TimeStamp
  // TimeStamp { ( date ; Time ) } -> Entero largo
  // TimeStamp { ( date ; Time ) } -> Número de segundos desde el 1 de enero de 1995
 
 var $1;$vdDate : Date
 var $2;$vhTime : Time
 var $0 : Integer
 
 If(Count parameters=0)
    $vdDate:=Current date
    $vhTime:=Current time
 Else
    $vdDate:=$1
    $vhTime:=$2
 End if
 $0:=(($vdDate-!01/01/95!)*86400)+$vhTime

Nota: utilizando este método, puede codificar todas las fechas y las horas desde 01/01/95 a las 00:00:00 a 01/19/2063 a las 03:14:07 lo que cubre el intervalo de enteros largos de 0 a 2^31 menos uno.

Por el contrario, los métodos de proyecto Time stamp to date y Time stamp to time permiten extraer la fecha y la hora almacenadas en un marcador:

  // Método de proyecto Time stamp to date
  // Time stamp to date ( Long ) -> Date
  // Time stamp to date ( Time stamp ) -> Extracted date
 
 var $0 : Date
 var $1 : Integer
 
 $0:=!01/01/95!+($1\86400)
 
  // Método de proyecto Time stamp to time
  // Time stamp to time ( Entero largo) -> Fecha
  // Time stamp to time ( Time stamp ) -> Fecha extraída
 
 var $0 : Time
 var $1 : Integer
 
 $0:=Time(Time string(†00:00:00†+($1%86400)))

Para asegurar que los marcadores de los registros se actualicen correctamente, sin importar la manera en que son creados o modificados, debemos aplicar esta regla utilizando el trigger de la tabla [Documentos]:

  // Trigger de la tabla [Documentos]
 Case of
    :(Trigger event=Save New Record Event)
       [Documents]Creation Stamp:=Time stamp
       [Documents]Modification Stamp:=Time stamp
    :(Trigger event=Save Existing Record Event)
       [Documents]Modification Stamp:=Time stamp
 End case

Una vez implementado en la base, tenemos todo lo que necesitamos para escribir el método de proyecto CREATE DOCUMENTATION. Utilizamos GET DOCUMENT PROPERTIES y SET DOCUMENT PROPERTIES para administrar la fecha y hora de creación y modificación de los documentos.

  // Método de proyecto CREATE DOCUMENTATION
 
 C_STRING(255;$vsRuta;$vsDocRutaNombre;$vsDocNombre)
 var $vlDoc : Integer
 var $vbOnWindows;$vbDoIt;$vbBloqueados;$vbInvisible : Boolean
 var $vhDocRef;$vhCreadoalas;$vhModificadoalas : Time
 var $vdCreadoen;$vdModificadoen : Date
 
 If(Application type=4D Remote Mode)
  // Si se está corriendo 4D Client, guarda los documentos
  // localmente en el equipo Cliente donde se encuentra 4D Client
    $vsRuta:=Long name to path name(Application file)
 Else
  // De lo contrario, guardamos los documentos donde se ubica el archivo de datos
    $vsRuta:=Long name to path name(Data file)
 End if
  // Guardar los documentos en un directorio que llamamos arbitrariamente "Documentación"
 $vsRuta:=$vsRuta+"Documentación"+Char(Directory symbol)
  // Si este directorio no existe, lo crea
 If(Test path name($vsRuta)#Is a folder)
    CREATE FOLDER($vsRuta)
 End if
  // Establecer la lista de documentos existentes
  // porque tenemos que borrar los obsoletos, en otras palabras
  // los documentos cuyos registros correspondientes han sido borrados.
 ARRAY STRING(255;$asDocumento;0)
 DOCUMENT LIST($vsRuta;$asDocumento)
  // Selección de todos los registros de la tabla [Documentos]
 ALL RECORDS([Documentos])
  // Para cada registro
 $vlNbRegistros:=Records in selection([Documentos])
 $vlNbDocs:=0
 $vbOnWindows:=On Windows
 For($vlDoc;1;$vlNbRegistros)
  // Suponemos que tendremos que recrear el documento en disco
    $vbDoIt:=True
  // Calculo del nombre y ruta de acceso del documento
    $vsDocNombre:="DOC"+String([Documentos]Numero;"00000")
    $vsDocRutaNombre:=$vsRuta+$vsDocNombre
  // ¿Ya existe este documento?
    If(Test path name($vsDocRutaNombre+".HTM")=Is a document)
  // Si es así, eliminamos el documento de la lista de documentos
  // que pueden ser eliminados
       $vlElem:=Find in array($asDocumento;$vsDocNombre+".HTM")
       If($vlElem>0)
          DELETE FROM ARRAY($asDocumento;$vlElem)
       End if
  // ¿Se guardó el documento desúes de la última vez que se modificó el registro?
       GET DOCUMENT PROPERTIES($vsDocRutaNombre+".HTM";$vbBloq;$vbInvisible;$vdCreadoEn;$vhCreatedAt;
       $vdModificadoen;$vhModificadoalas)
       If(marcadorTiempos($vdModificadoen;$vhModificadoalas)>=[Documentos]Marcador_modificacion)
  // Si es así, no necesitamos crear nuevamente el documento
          $vbDoIt:=False
       End if
    Else
  // El documento no existe, colocar estas dos variables en cero de manera que
  // sepamos que tenemos que computarlos antes de fijar las propiedades finales
  // del documento
       $vdModificadoen:=!00/00/00!
       $vhModificadoalas:=†00:00:00†
    End if
  //¿Necesitamos crear nuevamente el documento?
    If($vbDoIt)
  // Si es así, incrementar el número de documentos actualizados
       $vlNbDocs:=$vlNbDocs+1
  // Eliminar el documento si ya existe
       DELETE DOCUMENT($vsDocRutaNombre+".HTM")
  // Y lo crea nuevamente
       If($vbOnWindows)
          $vhDocRef:=Create document($vsDocRutaNombre;"HTM")
       Else
          $vhDocRef:=Create document($vsDocRutaNombre+".HTM")
       End if
       If(OK=1)
  // Escriba acá los contenidos del documento
          CLOSE DOCUMENT($vhDocRef)
          If($vdModificadoen=!00/00/00!)
  // El documento no existía, definir los valores correctos para la fecha y hora de modificación
             $vdModificadoen:=Current date
             $vhModificadoalas:=Current time
          End if
  // Cambiar las propiedades del documento de manera que su fecha y hora de creación
  // sean iguales a la del registro correspondiente
          SET DOCUMENT PROPERTIES($vsDocRutaNombre+".HTM";$vbBloq;$vbInvisible;
          Marcador fecha([Documentos]Marcador_creacion);
          Marcador hora([Documentos]Marcador_creacion);
          $vdModificadoen;$vhModificadoalas)
       End if
    End if
  // Sólo para saber que está pasando
    SET WINDOW TITLE("Proceso del documento "+String($vlDoc)+" of "+String($vlNbRegistros))
    NEXT RECORD([Documentos])
 End for
  // Eliminación de documentos obsoletos, en otras palabras
  // aquellos que están en el array $asDocumento
 For($vlDoc;1;Size of array($asDocumento))
    DELETE DOCUMENT($vsRuta+$asDocumento{$vlDoc})
    SET WINDOW TITLE("Eliminación de documento obsoleto: "+Char(34)+$asDocumento{$vlDoc}+Char(34))
 End for
  // Listo
 ALERT("Número de documentos procesados: "+String($vlNbRegistros)+Char(13)+"Número de documentos actualizados: "
 +String($vlNbDocs)+Char(13)+"Número de documentos borrados: "+String(Size of array($asDocumento)))

Ver también

_o_Document creator
_o_Document type
SET DOCUMENT PROPERTIES