|
|
Línea 1: |
Línea 1: |
| {{Hierarchy header}} | | {{Hierarchy header}} |
| | | |
- | El GrialAttach permite relacionar archivos con cualquier registro de cualquier tabla troncal del sistema. Y posteriormente adjuntar, almacenar y recuperar estos archivos desde el servidor. | + | = El GrialAttach está OBSOLETO = |
| + | >>> Utilizar [[GrialFileStorage]] en su lugar |
| | | |
- | <blockquote>
| + | Antigua Pagina de Referencia: [[GrialAttach_Obsoleto]] |
- | [[image:GrialAttach.png|link=|El GrialAttach]]
| + | |
- | </blockquote>
| + | |
- | | + | |
- | ==Forma de Uso==
| + | |
- | | + | |
- | ===Inicializacion===
| + | |
- | | + | |
- | En el UserDocument_Show llamar a:
| + | |
- | | + | |
- | GrialAttach.Initialize GrialCont, "CORREO"'''
| + | |
- | | + | |
- | Donde el string “CORREO” representa el path para el almacenamiento de los archivos. El String no es arbitrario, debe estar configurado en la tabla SYS_FUNC_28_TAB_PATHS_STORAGE, campo SYSFUNC28_RELPATH
| + | |
- | | + | |
- | ===Traer Datos (preparar la Transacción)===
| + | |
- | | + | |
- | En el momento de preparar la transacción llamar a :
| + | |
- | | + | |
- | GrialAttach.SetFilters "SYS_FUNC_20", IDSysFunc20'''
| + | |
- | | + | |
- | Donde se indica 1) La tabla TRONCAL y el ID del registro al cual se han de adjuntar los archivos. Con esta información el GrialAttach prepara un query de consulta sobre la tabla SYS_FUNC_30 donde se encuentra la información de todos los adjuntos.
| + | |
- | | + | |
- | Luego ha de incluirse el GrialAttach en la carga de datos como se haría con cualquier [[GrialQuery]] o Control Registrado, por Ejemplo:
| + | |
- | | + | |
- | GrialCont.LoadData SysFunc20grq, SysFunc21grq, SysFunc21_scb, GrialAttach'''
| + | |
- | | + | |
- | Luego de la carga es posible limitar las acciones que el usuario puede realizar, por ejemplo:
| + | |
- | | + | |
- | With GrialAttach
| + | |
- | .AllowAddNew = Not ModoConsulta
| + | |
- | .AllowDelete = Not ModoConsulta
| + | |
- | .AllowUpdate = Not ModoConsulta
| + | |
- | End With
| + | |
- | | + | |
- | === BottomButton_Click ACEPTAR, Incorporar en la Transacción===
| + | |
- | | + | |
- | En el momento de grabar la transacción llamar a: ''GrialAttach.AppendToTransaction, ''como un detalle de la cabecera a la cual los archivos se adjuntan:
| + | |
- | <code>
| + | |
- | Txn.Add SF20Grq.Rst, “Name=SF20:ID_SYSFUNC20”
| + | |
- | Txn.Add SF21Grq.Rst, “ID_SYSFUNC21;RELA_SYSFUNC20”
| + | |
- | GrialAttach.AppendToTransaction Txn, "SF20"
| + | |
- | </code>
| + | |
- | | + | |
- | Mediante esta llamada el GrialAttach incorpora a la transacción el registro de la SYS_FUNC_30 con los cambios que haya realizado el usuario. '''El parámetro “SF20” es el NOMBRE DEL ITEM en la transacción que contiene el registro al cual se adjuntan los archivos'''.
| + | |
- | | + | |
- | Internamente,'''AppendToTransaction''' agrega a la transacción la grabación de la tabla SYS_FUNC_30 que contiene los nombres los archivos adjuntos.
| + | |
- | | + | |
- | En el ejemplo dado, el '''GrialAttach''' agregará internamente:
| + | |
- | | + | |
- | <code>
| + | |
- | GrialAttach.AppendToTransaction Txn, "SF20" ...
| + | |
- | 'Agrega internamente...
| + | |
- | '=> Txn.AddItem SYSFUNC30.Rst, “Header=SF20:ID_SYSFUNC30, RELA_TRONCAL”
| + | |
- | </code>
| + | |
- | | + | |
- | ===GRABAR los Datos (GrialCont.Apply Txn)===
| + | |
- | | + | |
- | <code>
| + | |
- | Txn.Add SF20Grq.Rst, “Name=SF20:ID_SYSFUNC20”
| + | |
- | Txn.Add SF21Grq.Rst, “ID_SYSFUNC21;RELA_SYSFUNC20”
| + | |
- | GrialAttach.AppendToTransaction Txn, "SF20"
| + | |
- | | + | |
- | GrialCont.Apply Txn
| + | |
- | If GrialCont.LastButton = BUTTON_NEW Then
| + | |
- | IDSysFunc20 = SqlArea.NewIDValue
| + | |
- | End If
| + | |
- | </code>
| + | |
- | | + | |
- | En el momento de grabar la transacción se grabará la referencia al nombre del archivo adjuntado, (tabla SYS_FUNC_30)
| + | |
- | | + | |
- | pero en este punto, los archivos '''aún no han sido enviados al servidor'''.
| + | |
- | | + | |
- | ===ENVIAR finalmente los archivos al Servidor===
| + | |
- | | + | |
- | Luego de grabar la transacción se procederá a enviar los archivos al servidor mediante la función '''StoreFiles'''.
| + | |
- | | + | |
- | Se debe pasar como parámetro a la función '''StoreFiles''', el ID del registro o el Nuevo ID en caso de alta
| + | |
- | | + | |
- | Los archivos quedarán asociadps (''attachados'') a ese ID.
| + | |
- | | + | |
- | If GrialCont.LastButton = BUTTON_NEW Then
| + | |
- | IDSysFunc20 = SqlArea.NewIDValue ' Recupero ID dado de alta
| + | |
- | End If
| + | |
- | 'almaceno attachments en el servidor
| + | |
- | GrialAttach.StoreFiles IDSysFunc20
| + | |
- | | + | |
- | Dentro de '''StoreFiles''' se envían (upload) los archivos nuevos y se eliminan del servidor los que el usuario haya eliminado del control GrialAttach.
| + | |
- | | + | |
- | La tabla SYS_FUNC_30 posee un campo SYSFUCN30_PENDIENTE que indica que proceso aplicarle a cada archivo.
| + | |
- | | + | |
- | En caso de algún error en la transferencia (por ejemplo: corte de conexión o no se puede leer el archivo), el campo SYSFUNC30_PENDIENTE quedara con un valor diferente de cero, indicando que aun debe procesarse ese archivo.
| + | |
- | | + | |
- | En caso de error, '''GrialAttach.StoreFiles''' le mostrará el error al usuario y retornará FALSE. '''GrialAttach.StoreFiles '''NO RAISEA UN ERROR, dado que la transacción (con otros datos importantes que el modulo maneje) '''''ya ha sido aplicada correctamente'''''.
| + | |
- | | + | |
- | Para reintentar el envío de archivos, el usuario debe ingresar nuevamente a la transacción y corregir el problema, por ejemplo: adjuntar el archivo correcto.
| + | |
- | | + | |
- | ==Métodos Adicionales==
| + | |
- | | + | |
- | ===Adjuntos Específicos, por ejemplo, Foto de un Legajo===
| + | |
- | | + | |
- | ====Ubicar y mostrar un adjunto especifico====
| + | |
- | | + | |
- | Luego de cargar los datos, se puede buscar una adjunto mediante un codigo especifico, recuperarlo y mostrarlo (una imagen en este ejemplo)
| + | |
- | | + | |
- | <code>
| + | |
- | 'Muestro la foto si esta adjunta
| + | |
- | img_foto = LoadPicture("") 'clear
| + | |
- | LbFileName = ""
| + | |
- | With GrialAttach
| + | |
- | If .SelectAttachment("FOTOPPAL") Then
| + | |
- | LbFileName = .SelectedAttachmentInfo 'Muestro info del adjunto
| + | |
- | Dim TempFile As String
| + | |
- | If .GetSelectedAttachmentFile(TempFile) Then 'Descargo el archivo
| + | |
- | On Error Resume Next
| + | |
- | img_foto = LoadPicture(TempFile)
| + | |
- | End If
| + | |
- | End If
| + | |
- | End With
| + | |
- | </Code>
| + | |
- | | + | |
- | El Método''' SelectAttachment '''selecciona uno de los adjuntos presentes, como parámetro se puede pasar un ID_SYSFUNC30 específico o un string para buscar (usando el campo SYSFUNC30_COD [string(10)])
| + | |
- | | + | |
- | La función '''SelectedAttachmentInfo '''devuelve un string descriptivo con la descripción del adjunto, el nombre del archivo original y el tamaño del archivo en KB. Es útil para mostrar en un label la información del archivo adjunto.
| + | |
- | | + | |
- | La función '''GetSelectedAttachmentFile(TempFileName) '''recupera el archivo seleccionado del servidor y retorna el path completo local donde se grabó el archivo recuperado en el parámetro '''TempFileName'''. Si no puede recuperar el archivo la función retorna FALSE.
| + | |
- | | + | |
- | ====Crear un adjunto con un código específico====
| + | |
- | | + | |
- | Para adjuntar un archivo con un codigo específico (“FOTOPPAL” en el ejemplo) se debe colocar un botón en el modulo y llamar a: '''GrialAttach.StartAttachByCode'''
| + | |
- | | + | |
- | Ejemplo:
| + | |
- | <code>
| + | |
- | Private Sub AdjuntarFotoCmd_Click()
| + | |
- | On Error GoTo ErrH
| + | |
- | 'Inicio un adjunto, con codigo "FOTOPPAL"
| + | |
- | If Not GrialAttach.StartAttachByCode("FOTOPPAL", “Foto Principal”) then
| + | |
- | Rem EL USUARIO CANCELO (No selecciono el archivo por ejemplo)
| + | |
- | End If
| + | |
- | Exit sub
| + | |
- | ErrH:
| + | |
- | MsgError GrialCont
| + | |
- | End Sub
| + | |
- | </code>
| + | |
- | | + | |
- | La función '''StartAttachByCode '''inicial el proceso de adjuntar un Nuevo archivo, si no encuentra el código en la lista, o inicia el proceso de reemplazar un adjunto si el código ya existiera.
| + | |
- | | + | |
- | El código siempre es único en la lista de adjuntos.
| + | |
- | | + | |
- | La función retorna FALSE si el usuario cancela el proceso.
| + | |
- | | + | |
- | | + | |
- | En caso seleccionar un archivo exitosamente, se dispara el evento '''GrialAttach_FileAttached. '''
| + | |
- | Este evento se puede utilizar para mostrar en pantalla el archivo adjunto, por ejemplo, si fuera una imagen.
| + | |
- | Por ejemplo:
| + | |
- | | + | |
- | <code>
| + | |
- | Private Sub GrialAttach_FileAttached()
| + | |
- | With GrialAttach
| + | |
- | If .SelectedAttachment_Value("SYSFUNC30_COD") = "FOTOPPAL" Then
| + | |
- | 'si est adjuntando la foto
| + | |
- | LbFileName = .SelectedAttachmentInfo
| + | |
- | img_foto = LoadPicture(.SelectedFileName)
| + | |
- | End If
| + | |
- | End With
| + | |
- | End Sub
| + | |
- | </code>
| + | |
- | | + | |
- | La Function '''SelectedAttachment_Value '''retorna el valor de cualquiera de los campos del registro de la SYS_FUNC_30 actualmente seleccionado en la lista de adjuntos. En este caso se usa para confirmar que el adjunto sea el del código específico (en este caso la foto principal)
| + | |
- | | + | |
- | ====Eliminar un adjunto con un código específico====
| + | |
- | | + | |
- | Por ultimo, si se desea incluir un botón para remover un adjunto específico se debe utilizar el metodo '''DeleteAttachment '''luego de ubicar el adjunto especifico mediante '''SelectAttachment'''.
| + | |
- | Por Ejemplo:
| + | |
- | | + | |
- | Private Sub RemoverFotoCmd _Click()
| + | |
- | With GrialAttach
| + | |
- | If .SelectAttachment("FOTOPPAL") Then
| + | |
- | .DeleteAttachment
| + | |
- | img_foto.Picture = LoadPicture("")
| + | |
- | LbFileName = ””
| + | |
- | End If
| + | |
- | End With
| + | |
- | | + | |
- | ===Cache de Descargas===
| + | |
- | | + | |
- | Cada vez que se descarga un archivo, el control guarda el nombre del archivo temporal descargado en un campo del recordset llamado “LOCAL_FILE”. Mientras el campo .SelectedAttachment_value(“LOCAL_FILE”) tenga valor, la función '''GetSelectedAttachmentFile''' devolverá ese archivo sin ir a buscarlo nuevamente al servidor.
| + | |
- | El campo “LOCAL_FILE” se limpia con cada carga del control GrialAttach (GrialCont.LoadData GrialAttach)
| + | |
- | | + | |
- | ===Descargar Todos los Archivos===
| + | |
- | | + | |
- | Para descargar todos los archivos adjuntos, se puede llamar a la function GetAllFiles que devuelve el número de archivos descargados correctamente. Ejemplo:
| + | |
- | | + | |
- | ' Me bajo todos los archivos adjuntos
| + | |
- | GrialAttach.GetAllFiles
| + | |
- | | + | |
- | ===Filtros para seleccionar un tipo de archivo===
| + | |
- | | + | |
- | Si se desea filtrar por tipo los archivos que el usuario ve al adjuntar, puede utilizar el método '''AddFileFilter. '''Este método adiciona filtros a la propiedad '''''FileFilters''''' (de tipo string).
| + | |
- | | + | |
- | Por Ejemplo:
| + | |
- | | + | |
- | <code>
| + | |
- | GrialAttach.AddFileFilter "Text Files","*.txt" 'Solo archivos txt
| + | |
- | </code>
| + | |
- | | + | |
- | Para restaurar el valor default: All Files (*.*) puede poner '''FileFilters = “”'''
| + | |
- | | + | |
- | ===Adjuntar un archivo manualmente===
| + | |
- | | + | |
- | Ejemplo:
| + | |
- | | + | |
- | SF30DEscri = "foto del usuario"
| + | |
- | SelectedFileName = “C:\FotoASubir.jpg”
| + | |
- | SF30Cod = “FOTO”
| + | |
- |
| + | |
- | 'Agrego adjunto
| + | |
- | ''' GrialAttach.AddFile SF30DEscri, SelectedFileName, SF30Cod
| + | |
- | | + | |
- | Donde:
| + | |
- | ;SF30DEscri: es la descripcion, por ejemplo: "foto de xxxx"
| + | |
- | ;SelectedFileName: es el path al archivo local
| + | |
- | ;SF30Cod: es un codigo para diferenciar el adjunto de otros adjuntos al mismo registro, por ejemplo: "FOTO"
| + | |
| [[Category: Manual de Programación|1]] | | [[Category: Manual de Programación|1]] |
| {{Hierarchy footer}} | | {{Hierarchy footer}} |