2. Qué es Lotus Script? Es un potente lenguaje que permite desarrollar aplicaciones orientado a Objetos. LotusScript y su conjunto de herramientas de desarrollo proporcionan un entorno de programación común para todas las aplicaciones de Lotus en todas las plataformas soportadas por el software Lotus (como Windows, AIX, Linux).
3. Ventajas de Lotus Script Superset of BASIC . Cross-platform. Object-oriented. Included in Lotus software applications. OLE support. Interoperabilitywithotherlanguages. IntegratedDevelopmentEnvironment LotusScriptlibraries Extendable through Lotus Software Extensions (LSXs)
4. Reglas de construcción Cada declaración de script esta compuesta de líneas de texto. Cada elemento de texto es una palabra clave de Lotus Script, operadores, identificadores, literales, o caracteres especiales. Puede incluir líneas en blanco sin que afecte el sentido. El texto en una línea puede iniciar del lado izquierdo. Dentro de una declaración, los elementos estarán separados por espacios en blanco o tabuladores. Espacios extras pueden ser usados para hacer una declaración más legible sin afectar su significado. Una declaración, a excepción de un bloque de sentencias, debe aparecer en una sola línea a menos que incluya el carácter de continuación de línea subrayado(_) precedidos por espacios en blanco. El carácter de continuación de línea (_) debe aparecer al final de una linea, precedido al menos de un espacio o tabulación. Una nueva línea marca el final de una declaración. Múltiples declaraciones en una línea deben ser separadas por (:).
5. Reglas para construcción de cadenas Una cadena en Lotus Script puede encerrarse en uno de los siguientes delimitadores: Un par de doble comillas (“” “”) “Esta es una cadena entre comillas” Un par de barras verticales (||) |esta es una cadena entre barras verticales| Con llaves abiertas y cerradas ({}) {esta es una cadena entre llaves} Cadenas encerradas entre barras verticales pueden separa múltiples líneas. |Una cadena en dos líneas|.
6. Reglas para construir identificadores Un identificador es el nombre que le da a una variable, constante, tipo, clase, función, procedimiento o propiedad. El primer carácter debe ser una letra mayúscula o minúscula. Los restantes caracteres deben ser letras, dígitos o el carácter subrayado. Un sufijo para los tipos de datos(%,&,!,#,@, o $) pueden estar al final, pero no es parte del identificador. El tamaño máximo es 40 caracteres, no incluye los sufijos. Los nombres pueden ser mayúsculas o minúsculas.
7. Tipos de datos Boolean True(1) o False(0) Byte 0 a 255 Integer Long Single Double Currency String
8. Tipos de datos Soporta los siguientes tipos de datos y estructuras: Array.- conjunto de elementos que tienen el mismo tipo de datos, puede tener hasta 8 dimensiones. List.- de una sola dimensión que tienen el mismo tipo de datos. Variant .- Un especial tipo de dato que puede contener valores escalares, arreglos, lista, u objetos de referencia. Variant.-puede ser también booleano o fechas. User-defined data type.- Tipo de datos definidos por el usuario. User-definedclass.- definición de clases . Objectreference.- Punteros a objetos de automatización OLE.
9. Conversión de tipos de dato Lotus Script implícitamente convierte de un tipo de dato a otro en las siguientes situaciones: Operaciones numéricas .- Operaciones con diferentes tipos de datos numéricos , Lotus Script convierte los valores a un mismo tipo de dato para evaluación. Paso de argumentos .- Cuando un argumento numérico es pasado por valor (byvalue) a un procedimiento, Lotus Script trata de convertir el valor si no es el tipo de dato esperado. Si el valor es más grande, la operación genera un error. Variables Variant.- Cuando un valor es contenido en una variable Variant, Lotus Script trata de convertir el valor a numérico o cadena dependiendo del contexto.
10. Conversión explícita de tipos de datos Lotus Script provee varias funciones para convertir explícitamente el valor de un tipo de dato: Cbool CByte Ccur Cdat CDbl Cint CLng CSng Cstr CVar
11. Automática conversión de tipos de datos. Se puede asignar un valor de un tipo de dato numérico a una variable de un tipo de dato numérico diferente. Puede ejecutar operaciones aritméticas o comparaciones que involucran diferentes tipos de datos numéricos. Puede incrementar el valor de una variable Variant de algún tipo numérico más allá de los límites permitidos del tipo de dato. Puede añadir o concatenar los valores de dos variables variant, uno de los cuales es cadena y el otro es numérico.
12. Constantes y variables Se puede manipula varios tipos de datos a través del uso de constantes y variables. Las constantes y variables tienen un alcance y tiempo de vida. El alcance se refiere al área en el cual un identificador puede ser referenciado. El límite se refiere al período durante el cual el identificador esta disponible en la aplicación. Cuando define una constante o variable, Lotus script asigna un alcance y tiempo de vida.
13. Alcance de las declaraciones. LS reconoce tres tipos de alcance: Módulo .- Una variable es declarada dentro de un módulo si esta fuera de algún procedimiento, clase o definición de tipo. Procedimiento.- Una variable es declarada dentro de un procedimiento, si es declarada dentro de una función, procedimiento o propiedad. Solamente dentro del procedimiento el nombre de la variable tiene significado. El nombre de la variable es visible en cualquier parte del procedimiento. Type o Class.- Una variable esta declarada dentro de un Tipo o Clase, el alcance esta dentro de la definición del tipo o clase.
14. Clases para acceder a la base de datos Domino Notes Session Notes Database Notes View Notes DocumentCollection Notes Document Notes Item
16. Clase NotesDatabase Permite acceder a la base de datos. Dimss as New NoteeSession Dimdb as NotesDatabase Set db = ss.CurrentDatabase
17. Clase NotesView Representa una vista o carpeta que contiene documentos. Dimss as New NotesSession Dimdb as Notesdatabase Dimview as NotesView Set db = ss.Currentdatabase Set view = db.GetView(“Nombre o Alias de una vista”)
18. Clase NotesDocumentCollection Representa una collección de documentos de las base de datos. Dimss as New NotesSession Dimdb as Notesdatabase Dimdc as NotesDocumentCollection Set db = ss.currentdatabase Set dc = db.UnprocessedDocument
19. Clase NotesDocument Representa un documento de la base de datos. Dimss as New NotesSession Dimdb as Notesdatabase Dimview as NotesView Dimdoc as NotesDocument Set db = ss.Currentdatabase Set view = db.GetView(“Nombre o Alias de una vista”) Set doc = view.GetFirstDocument
20. Clase NotesItem Permite acceder a un campo del documento. Dimss as New NotesSession Dimdb as NotesDatabase Dimview as NotesView Dimdoc as NotesDocument DimItem as NotesItem Set db = ss.Currentdatabase Set view = db.GetView(“Nombre Vista o carpeta”) Set doc = view.GetFirstDocument Set item = doc.GetFirstItem(“NombreCampos”)
21. Ejemplo de recorrer una vista. Dimss as New NotesSession Dimdb as NotesDatabase Dim View as NotesView Dimdoc as NotesDocument DimItem as NotesItem Set db = ss.CurrentDatabase ‘asocia a la variable db la actual base de datos Set view = db.GetView(“NombreVista”) ‘a la var. View asocia una de las vistas de la base de datos Set doc = view.GetFirstDocument ‘apunta al primer documento de la vista Whilenot(docisnothing) ‘determina si hay un documento asociado a la variable doc set item = doc.GetFirstItem(“Campo”) ‘obtiene en la variable Item el o los valores de un campo Forall x In Item.Values ‘es como un For para sacar los valores contenidos en la variable Item Msgbox x EndForall Set doc = view.GetNextDocument(doc) ‘permite avanzar al siguiente documento en la vista Wend
22. Modificar un campo en todos los documentos contenidos en una vista SUPONGAMOS QUE EXISTE EN LOS DOCUMENTOS CONTENIDOS EN UNA VISTA UN CAMPO LLAMADO ESTADO QUE NECESITAMOS CAMBIARLO A FINALIZADO. Dimss as New NotesSession Dimdb as NotesDatabase Dim View as NotesView Dimdoc as NotesDocument DimItem as NotesItem Set db = ss.CurrentDatabase ‘asocia a la variable db la actual base de datos Set view = db.GetView(“NombreVista”) ‘a la var. View asocia una de las vistas de la base de datos Set doc = view.GetFirstDocument ‘apunta al primer documento de la vista Whilenot(docisnothing) ‘determina si hay un documento asociado a la variable doc set item = doc.ReplaceItemValue(“Estado”,”Finalizado”) ‘Estado es el nombre del campo y Finalizado es el nuevo valor calldoc.save(false,false) Set doc = view.GetNextDocument(doc) ‘permite avanzar al siguiente documento en la vista Wend
23. Enviar por correo información de documentos que cambiaros de estado Vamos a cambiar el estado de los documento de la vista y vamos a notificar por correo a los creadores de los documentos que se ha realizado el cambio de estado. Dimss as New NotesSession Dimdb as NotesDatabase Dim View as NotesView Dimdoc as NotesDocument DimItem as NotesItem Set db = ss.CurrentDatabase ‘asocia a la variable db la actual base de datos Set view = db.GetView(“NombreVista”) ‘a la var. View asocia una de las vistas de la base de datos Set doc = view.GetFirstDocument ‘apunta al primer documento de la vista Whilenot(docisnothing) ‘determina si hay un documento asociado a la variable doc set item = doc.ReplaceItemValue(“Estado”,”Finalizado”) ‘Estado es el nombre del campo y Finalizado es el nuevo valor calldoc.save(false,false) dimdocMail as New NotesDocument(db) ‘decimos que vamos a crear un nuevo documento en la actual base de datos docMail.Form = “Memo” ‘ al nuevo documento le asociamos un formulario en esta caso el Memo que esta asoc. Al correo docMail.SendTo = doc.Authors(0) ‘Asocio al campo sendTo el autor del documento docMail.Subject = “Documento que cambio de estado” ‘asocio al campo Asunto(Subject) un texto docMail.Body = “Se ha modificado el documento ” & cstr(doc.Numero(0)) calldocMail.Send(false) ‘se envía el documento sin que se grabe en la base actual el mensaje TRUE hace que se grabe Set doc = view.GetNextDocument(doc) ‘permite avanzar al siguiente documento en la vista Wend
24. Borrar documentos que cumplen una condición Revisamos que el documento tenga un estado de Borrador y procedemos a borrar los documentos. Dimss as New NotesSession Dimdb as NotesDatabase Dim View as NotesView Dimdoc as NotesDocument Dimdocsig as NotesDocument DimItem as NotesItem Set db = ss.CurrentDatabase ‘asocia a la variable db la actual base de datos Set view = db.GetView(“NombreVista”) ‘a la var. View asocia una de las vistas de la base de datos Set doc = view.GetFirstDocument ‘apunta al primer documento de la vista Whilenot(docisnothing) ‘determina si hay un documento asociado a la variable doc ifdoc.Estado(0) = “Borrador” then set docsig = View.GetNextDocument(doc) doc.Remove(true) set doc = docsig else set doc = view.GetNextDocument(doc) endif Wend
25. Borrar documentos seleccionados en una vista Revisamos que el documento tenga un estado de Borrador y procedemos a borrar los documentos. Dimss as New NotesSession Dimdb as NotesDatabase Dimdc as NotesDocumentCollection Dimdoc as NotesDocument DimItem as NotesItem Set db = ss.CurrentDatabase ‘asocia a la variable db la actual base de datos Set dc = db.UnprocessedDocument ‘determina los documentos que están seleccionados en la vista ifdc.Count > 0 then ‘Count determina el número de documentos seleccionados en la vista for i = 1 todc.Count doc = dc.GetNthDocument(i) ‘ accesa al documento doc.Remove(true) ‘si es TRUE borra físicamente, si es False queda marcado para eliminación next Endif
28. Clase NotesUIDocument Representa el actual documento que se encuentra abierto en el área de trabajo. Dimws as New NotesUIWorkspace Dimuidoc as NotesDocument set uidoc = ws.CurrentDocument
29. Validar si un documento contiene información antes de grabar Supones que hay un documento abierto que contiene los campos Nombres, Apellidos, Cedula y EstadoCivil, se desea verificar que haya datos en los campos Nombres, Apellidos y Cedula. Esta validación la podemos hacer desde el evento QuerySave que tiene ya definidas las variables asociadas a la clase NotesUIDocument, hemos de suponer que se envía la acción de grabar desde un objeto Action que contiene el comando @command([FileSave]). Sub QuerySave(Source as NotesUIDocument, Continue as variant) IfSource.IsNewDocthen ‘verifico si el documento es nuevo o sea no ha sido grabado nunca. Dim Mensaje as string ifTrim(Source.FieldGetText(“Nombres”)) = “” then ‘FuncionTrim permite eliminar espacios en blanco Mensaje = “No ha ingresado los Nombres” Endif ifTrim(Source.FieldGetText(“Apellidos”)) = “” then if Mensaje = “” then Mensaje = “No ha ingresado los Apellidos” else Mensaje = Mensaje + chr(13) + “No ha ingresado los Apellidos” endif Endif ifTrim(Source.FieldGetText(“Cedula”)) = “” then ‘Identico la validación al campo Apellidos Endif if Mensaje <> “” then MsgBox Mensaje Continue = False ‘ Cuando Continue es FALSE detiene el proceso de grabado similar @failure endif Endif End Sub
30. Cómo evitar que un documento se Edite de acuerdo al valor de un campo? Supongamos que los documento van cambiando de estado y el estado final es Cerrado, entonces se desea evitar que un documento sea editado si el estado ya esta Cerrado. QueryModeChange( Source as NotesUIDocument , Continue as Variant ) ifnot(Source.IsNewDoc) then ‘verifico que el documento no sea nuevo ifSource.FieldGetText(“Estado”) = “Cerrado” then ‘verifico el estado del documento MsgBox “Documento no puede ser editado” Continue = false endif endif End Sub
31. Notificar al propietario de un documento que ha sido abierto y si es Editado creamos un documento con información al estilo log SE EJECUTA SOLO SI EL DOCUMENTO EXISTE SI NO EXISTE NO EJECUTA EL SCRIPT Sub Postopen(Source As Notesuidocument) ifnot(Source.IsNewDoc) then dimss as New NotesSession dimdb as NotesDatabase dimdoc as NotesDocument dimdocMail as NotesDocument set db = ss.Currentdatabase set doc = Source.Document ‘relaciono el documento del back-end con el doc editable set docMail = new NotesDocument(db) docMail.Form = “Memo” docMail.SendTo = doc.Authors(0) docMail.Subject = “Su documento ha sido abierto” docMail.Body = “El documento ha sido abierto el ” + cstr(now) + “ por el usuario” + ss.UserName calldocMail.send(false) endif EndSub
32. Creamos un documento LOG que indique que un documento ha sido editado SE EJECUTA SOLO SI EL DOCUMENTO EXISTE SI NO EXISTE NO EJECUTA EL SCRIPT Sub PostModeChange(Source As Notesuidocument) ifnot(Source.IsNewDoc) then ifSource.EditModethen dimss as New NotesSession dimdb as NotesDatabase dimdoc as NotesDocument dimdocLog as NotesDocument set db = ss.Currentdatabase set doc = Source.Document ‘relaciono el documento del back-end con el doc editable set docLog = new NotesDocument(db) docLog.Form = “LOG” docLog.QuienEdito = ss.UserName docLog.FechaApertura = now calldocLog.save(false,false) endif endif EndSub