GET DOCUMENT PROPERTIES
GET DOCUMENT PROPERTIES* ( doc ; bloqueado ; invisible ; creado el ; creado a las ; modificado el ; modificado a las )
| Parámetro | Tipo | Descripción | |
|---|---|---|---|
| doc | Text | → | Nombre del documento | 
| bloqueado | Boolean | ← | Bloqueado (True) o no bloqueado (False) | 
| invisible | Boolean | ← | Invisible (True) o visible (False) | 
| creado el | Fecha | ← | Fecha de creación | 
| creado a las | Hora | ← | Hora de creación | 
| modificado el | Fecha | ← | Fecha de la última modificación | 
| modificado a las | Hora | ← | Hora de la última modificación | 
Descripción
l 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
 
 #DECLARE ($vdDate : Date ; $vhTime : Time) : Integer
 
 If(Count parameters=0)
    $vdDate:=Current date
    $vhTime:=Current time
 End if
 return (($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
 
#DECLARE ($timeStamp : Integer) : Date
return !01/01/95!+($timeStamp\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
 
#DECLARE ($timeStamp : Integer) : Time
return Time(Time string(?00:00:00?+($timeStamp %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
Propiedades
| Número de comando | 477 | 
| Hilo seguro | ✓ | 
| Modifica variables | error |