Manual de scripts

Anuncio
 Manual de scripts
Velneo V7 7.10
Scripts
Descripción
Velneo V7 ha integrado en el núcleo de su plataforma la ejecución de scripts. Esto supone una apertura de la plataforma a estándares como EcmaScript
y a otros lenguajes de programación como QML y JavaScript. Esta integración es completa y se puede apreciar en múltiples ámbitos de trabajo como
procesos o fórmulas. Para conseguir esta integración se ha desarrollado un completo API que incluye un conjunto de clases que aportan objetos y
funciones adicionales para facilitar el uso de objetos Velneo V7 y nuevos objetos en estos lenguajes.
Clases
Directorio de scripts
Editor de scripts
Lenguajes
Clases
Clases
Descripción
Para conseguir la integración de Velneo V7 con múltiples lenguajes se ha desarrollado un completo API que incluye un conjunto de clases que aportan
objetos y funciones adicionales para facilitar el uso de objetos V7 y de nuevos objetos en estos lenguajes.
API
El API de Velneo V7 para scripts contempla las siguientes clases:
Lista de clases
Clases de info de V7
VProjectInfo
VObjectInfo
VTableInfo
Clases de ventana
VMainWindow
VMdiView
Clases de entorno de ejecución
VApp
VRoot
Clases de datos
VRegister
VRegisterList
VQuery
Clases de disco
VDir
VFile
VFileInfo
VTextFile
VXmlWriter
Funciones
Funciones globales
Clase
VProjectInfo
VProjectInfo
Descripción
Este objeto contiene la información de un proyecto. Tiene funciones para obtener sus propiedades básicas, sus tablas, sus objetos y los proyectos de los
que hereda.
Las funciones de tablas y de objetos que empiezan por “all” nos devuelven todas sus tablas u objetos, incluyendo las de sus proyectos heredados. Las
otras solo las suyas propias.
Funciones
Funciones generales
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// Devuelve el identificador del proyecto
String id()
// Devuelve el alias del proyecto
String alias()
// Devuelve el tipo de proyecto (ver enumeraciones)
Number type()
// Devuelve el nombre del proyecto
String name()
// Devuelve la versión del proyecto
String version()
// Devuelve la fecha y hora de último cambio del proyecto
Date saved()
// Devuelve el número de historia del proyecto
Number history()
Funciones de tablas
1
2
3
4
5
6
7
8
9
10
11
12
13
// Devuelve el número de tablas del proyecto de datos
Number tableCount()
// Devuelve el objeto VTableInfo de una tabla
// ‐ szIdPrimeroTabla = Identificador de una tabla
VTableInfo tableInfo( String szIdPrimarioTabla )
// Devuelve el objeto VTableInfo de una tabla
// ‐ nIndex es el nº ordinal de la tabla en el proyecto de datos
VTableInfo tableInfo( Number nIndex )
// Devuelve el número total de tablas de todos los proyectos (incluidos los heredados)
Number allTableCount()
14
15
16
17
// Devuelve el objeto VTableInfo de una tabla
// ‐ nIndex es el nº ordinal de la tabla entre todas las tablas de todos los proyectos
VTableInfo allTableInfo( Number nIndex )
Funciones de objetos
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// Devuelve el número de objetos de un tipo
// Esta función incluye sólo el proyecto en curso
// ‐ nObjectType = Tipo de objeto (ver enumeración en la clase ObjectInfo)
Number objectCount( Number nObjectType )
// Devuelve un objeto ObjectInfo de un tipo y del número de orden de la lista
// Esta función incluye sólo el proyecto en curso
// ‐ nObjectType = Tipo de objeto (ver enumeración en la clase ObjectInfo)
// ‐ nObjectIndex = Número de orden del objeto en la lista de objetos de ese tipo VObjectInfo objectInfo( Number nObjectType, Number nObjectIndex )
// Devuelve un objeto ObjectInfo del proyecto en curso de un tipo y un identificador
// Esta función incluye sólo el proyecto en curso
// ‐ nObjectType = Tipo de objeto (ver enumeración en la clase ObjectInfo)
// ‐ szIdPrimario = Identificador del objeto VObjectInfo objectInfo( Number nObjectType, String szIdPrimario )
// Devuelve el número de objetos de un determinado tipo
// Esta función incluye objetos de todos los proyectos (incluidos los heredados)
// ‐ nObjectType = Tipo de objeto (ver enumeración en la clase ObjectInfo)
Number allObjectCount( Number nObjectType )
21
22
23
24
25
26
27
Number allObjectCount( Number nObjectType )
// Devuelve un objeto ObjectInfo de un tipo y un identificador
// Esta función incluye objetos de todos los proyectos (incluidos los heredados)
// ‐ nObjectType = Tipo de objeto (ver enumeración en la clase ObjectInfo)
// ‐ nObjectIndex = Número de orden del objeto en la lista de objetos de ese tipo
VObjectInfo allObjectInfo( Number nObjectType, Number nObjectIndex )
Funciones de herencia
1
2
3
4
5
6
// Devuelve el número de proyectos heredados del proyecto en curso
Number legacyProjectCount()
// Devuelve un objeto VProjectInfo
// ‐ nIndex = Número de orden del proyecto en la lista de proyectos heredados
VProjectInfo legacyProjectInfo( Number nIndex )
Enumeraciones
Enum de tipos de proyectos
1
2
TypeDat = 0 Proyecto de datos
TypeApp = 1 Proyecto de aplicación
Ejemplos
Ejemplo de funciones generales
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
////////////////////////////////////////////////////////////
// Mostrar los datos del proyecto en curso
var proyecto = theApp.mainProjectInfo();
var info = proyecto_datos( proyecto );
alert( "El proyecto principal tiene la siguiente información: \n\n" + "Id = " + info[0] + "\n" + "Alias = " + info[1] + "\n" + "Tipo = " + info[2] + "\n" + "Nombre = " + info[3] + "\n" + "Versión = " + info[4] + "\n" + "Ultimo cambio = " + info[5] + "\n" + "Nº historia = " + info[6] );
////////////////////////////////////////////////////////////
// Almacenar datos generales de un proyecto
// proyecto = Proyecto del que se extraerá la información
function proyecto_datos( proyecto )
{ var datos = new Array();
datos[0] = proyecto.id();
datos[1] = proyecto.alias();
datos[2] = proyecto.type();
datos[3] = proyecto.name();
datos[4] = proyecto.version();
datos[5] = proyecto.saved();
datos[6] = proyecto.history();
return( datos );
}
Ejemplo de funciones de objetos y de herencia
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
////////////////////////////////////////////////////////////
// Mostrar los datos de los proyectos heredados
var proyecto = theApp.mainProjectInfo();
var msg = "";
var resultado = proyectos_info( proyecto );
alert( msg, "Información de herencia" );
////////////////////////////////////////////////////////////
// Almacenar datos generales de un proyecto
// proyecto = Proyecto del que se extraerá la información
function proyectos_info( proyecto )
{ // Se compone el mensaje final a mostrar
msg += "Proyecto heredado: " + proyecto.name() + " (" + proyecto.alias() + ")" + "\n" + "Nº tablas: " + proyecto.objectCount( VObjectInfo.TypeTable) + "; " + "\n" + 19
20
21
22
23
24
25
26
27
28
29
30
31
32
"Nº tablas estáticas: " + proyecto.objectCount( VObjectInfo.TypeStaticTable) + "; " + "\n" + "Nº esquemas: " + proyecto.objectCount( VObjectInfo.TypeScheme) + "\n\n";
alert ( proyecto.name() );
// Se analiza si el proyecto tiene otros proyectos heredados
var num_pry_heredados = proyecto.legacyProjectCount();
// Por cada proyecto heredado se ejecuta la función de forma reentrante hasta procesar todos los proyectos
for ( var x=0; x<num_pry_heredados; x++ )
{
var proyecto_heredado = proyecto.legacyProjectInfo( x );
resultado = proyectos_info( proyecto_heredado );
}
}
Clase
VObjectInfo
VObjectInfo
Descripción
Los objetos de esta clase contienen la informacion de la estructura de un objeto V7.
Se pueden ver sus propiedades, tanto los datos que contienen como información de su nombre, tipo, tabla asociada (si tiene), tipo de objeto
referenciado, etc. Para obtener el valor que contiene una propiedad primero debemos mirar el tipo de dato para usar la funcion adecuada. Por ejemplo
si el tipo de dato es Uint16 usar la funcion propertyDataToInt( nProp )
También se pueden obtener otros VObjectInfo de sus subobjetos y de los objetos referenciados por sus propiedades.
Funciones
Funciones generales
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// Devuelve el identificador de un objeto. Por ejemplo, "AUTOEXEC"
String id()
// Devuelve el identificador con referencia de un objeto. Por ejemplo, "VJS_APP/AUTOEXEC"
String idRef()
// Devuelve el nombre o descripción del objeto
// Si no le pasamos parámetros devuelvo el nombre del idioma en curso
// Si le resolvemos el idioma o el idioma y país nos devuelve del nombre para ese idioma y país
// ‐ nLenguaje = Código Qt del idioma
// ‐ nPais = Código Qt del país
String name()
String name( int nLenguaje, int nPais = 0 )
// Devuelve el código de tipo de objeto. Ver enum de tipos de objejos
Number type()
// Devuelve true si el objeto es una vista de datos
Boolean isDataView()
Funciones de entrada
1
2
3
4
5
// Devuelve el tipo de entrada. Ver enum de tipos de entrada/salida
Number inputType()
// Devuelve el objeto VTableInfo correspondiente a la tabla de entrada
VTableInfo inputTable()
Funciones de salida
1
// Devuelve el tipo de salida. Ver enum de tipos de entrada/salida
2
3
4
5
Number outputType()
// Devuelve el objeto VTableInfo correspondiente a la tabla de salida
VTableInfo outputTable()
Funciones de subobjetos
1
2
3
4
5
6
7
8
9
10
11
12
13
// Devuelve el número de subobjetos de un objeto de un tipo
// ‐ nSubType = Ver enum de tipos de objetos
Number subObjectCount( Number nSubType )
// Devuelve un objeto VObjectInfo de un subobjeto de un tipo y un identificador
// nSubType = Ver enum de tipos de objetos
// ‐ szIdSubObject = Identificador del subobjeto
VObjectInfo subObjectInfo( Number nSubType, String szIdSubObject )
// Devuelve un objeto VObjectInfo de un subobjeto de un tipo y un número de orden del subobjeto
// ‐ nSubType = Ver enum de tipos de objetos
// ‐ szIdSubObject = Número de orden del subobjeto en la lista
VObjectInfo subObjectInfo( Number nSubType, Number nSubObject )
Enumeraciones
Enum de tipo de entrada/salida
1
2
3
IONone = 0 Ninguno
IORecord = 1 Ficha
IOList = 2 Lista
Enum de tipos de objeto
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
TypeTable = 00 Tabla
TypeField = 01 Campo
TypeIndex = 02 Indice
TypeIndexPart = 03 ParteIndice
TypePluralBind = 04 Enlace plural
TypeUpdate = 05 Actualización
TypeUpdateComponent = 06 Componente de actualización
TypeVariable = 09 Variable
TypeStaticTable = 10 Tabla estática
TypeStaticTableItem = 11 Ítem de tabla estática
TypeTrigger = 12 Trigger
TypePicture = 13 Dibujo
TypeGrid = 14 Rejilla
TypeGridCol = 15 Columna de rejilla
TypeTree = 16 Árbol
TypeCasillero = 17 Casillero
TypeForm = 18 Formulario
TypeControl = 19 Control de formulario
TypeSubcontrol = 20 Subcontrol de formulario
TypeMultiView = 21 MultiVista
TypeLogicPrinter = 22 Impresora lógica
TypeReport = 23 Informe
TypeReportSection = 24 Sección de informe
TypeReportControl = 25 Control de informe
TypeReportGrouping = 26 Agrupamiento de informe
TypeReportCalcution = 27 Cálculo de informe
TypeQuery = 28 Búsqueda
TypeQueryComponent = 29 Componente de búsqueda
TypeFilterGlass = 30 Lupa
TypeFinder = 31 Localizador
TypeFinderIndex = 32 Indice del localizador
TypeBasket = 33 Cesta
TypeProcess = 34 Proceso
TypeFunction = 35 Función
TypeEventConnection = 37 Conexión de evento
TypeEventSlot = 38 Manejador de evento
TypeInstruction = 39 Instrucción de proceso
TypeDll = 40 Dll
TypeAction = 41 Acción
TypeMenu = 42 Menú
TypeToolbar = 43 Toolbar
TypeActionLauncher = 44 Lanzador de acción
TypeListPipe = 45 Tubo de lista
TypeRecordPipe = 46 Tubo de ficha
TypeTcpProtocol = 47 Protocolo TCP
TypeConstant = 51 Constante
TypeFrame = 52 Marco
TypeDock = 53 Dock
TypeFormBlock = 54 Bloc de formularios
TypeDrop = 55 Drop
TypeQueue = 56 Cola de procesos
TypeScheme = 57 Esquema
TypeSchemeItem = 58 Item de esquema
TypeDllFunction = 60 Función Dll
TypeInsertion = 61 Insertar en
TypeSerialPort = 62 Dispositivo serie
TypeDllFunctionParam = 63 Parámetro de función Dll
TypeAttachedFile = 64 Fichero adjunto
TypeSvgImage = 65 SVG
TypeSvgControl = 66 Control SVG
TypeSubindexator = 67 Subindexador
TypeIntercomunicator = 68 Intercomunicador del TCP
TypeStyleCondition = 69 Condición de estilo
TypeViewFlow = 70 ViewFlow
TypeListAlternator = 71 Alternador de lista
TypeComboView = 72 ComboView
TypeListView = 73 ListView
TypeQmlList = 74 Lista QML
TypeUserRole = 75 UserRole de QML
TypeAuxModel = 76 AuxModel de lista QML
TypeAdvancedGrid = 77 Rejilla
TypeAdvancedGridCol = 78 Columna de rejilla
TypeAdvancedGridBand = 79 Banda de cabecera de rejilla
TypeQmlForm = 80 Formulario QML
TypeNone = ‐1 No definido
Ejemplos
Ejemplo de información del objeto de la vista en curso
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
////////////////////////////////////////////////////////////
// Información del objeto de la vista en curso
// Se coge el root (objeto) de la vista en curso
var root = theMainWindow.currentView().root();
// Se crea el objeto VObjectInfo de la vista en curso
obj = root.objectInfo();
// Se muestra la información del objeto
msg = "El objeto en curso tiene la siguiente información:" + "\n\n" + "Id: " + obj.id() + "\n" + "IdRef: " + obj.idRef() + "\n" + "Name: " + obj.name() + "\n" + "Tipo: " + obj.type() + "\n" + "¿Es vista de datos? " + obj.isDataView() + "\n";
// Si tiene tabla asociada se añade al mensaje
if ( obj.inputTable().name() != "" )
msg += "\n" + "Tabla asociada: " + obj.inputTable().name() + "\n";
// Si tiene tabla destino se añade al mensaje
if ( obj.outputTable().name() != "" )
msg += "\n" + "Tabla destino: " + obj.outputTable().name() + "\n";
// Si es una rejilla se muestra el número de columnas
if ( obj.type() == VObjectInfo.TypeGrid )
msg += "\n" + "Es una rejilla y tiene " + obj.subObjectCount( 15 ) + " columnas";
// Mostrar la información
alert( msg );
Clase
VTableInfo
VTableInfo
Descripción
Los objetos de esta clase contienen la información de la estructura de una tabla. Tiene funciones generales de la tabla, como ver su Id o su tipo, y
funciones para obtener información de sus subobjetos: campos, índices y enlaces plurales. También nos permite obtener otros VTablaInfo de las tablas
enlazadas como maestros o enlaces plurales.
Funciones
Funciones de tabla
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
// Devuelve el identificador (Id) de la tabla
String id()
// Devuelve el idRef (Alias_Aplicación/Id_Tabla) de la tabla
String idRef()
// Devuelve el nombre plural de la tabla
String name()
// Devuelve el nombre plural de la tabla en el idioma configurado
// Si no se especifican valores asume el idioma en curso
// El código de país es opcional
// ‐ nLenguage = Código del idioma (Ver tabla de idiomas en documentación de Qt)
// ‐ nPais = Código del país (Ver tabla de idiomas en documentación de Qt)
String name( Number nLenguage, Number nPais = 0 )
// Devuelve el nombre singular de la tabla
String singleName()
// Devuelve el nombre singular de la tabla en el idioma configurado
// Si no se especifican valores asume el idioma en curso
// El código de país es opcional
// ‐ nLenguage = Código del idioma (Ver tabla de idiomas en documentación de Qt)
// ‐ nPais = Código del país (Ver tabla de idiomas en documentación de Qt)
String singleName( Number nLenguage, Number nPais = 0 )
// Devuelve el código de tipo de tabla
// Ver enum de tipos de tablas
Number type()
// Devuelve true si la tabla reside en memoria
Boolean isInMemory()
// Devuelve la longitud en bytes del registro de la tabla
Number registerLength()
Funciones de campos
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// Devuelve el número de campos del registro de la tabla
Number fieldCount()
// Devuelve el identificador (Id) del campo
// ‐ nCampo = Número de campo, el primero es el 0
String fieldId( Number nCampo )
// Nombre del campo
// ‐ nCampo = Número de campo, el primero es el 0
String fieldName( Number nCampo )
// Devuelve el tipo de campo
// Ver enum de tipos de campo
// ‐ nCampo = Número de campo, el primero es el 0
Number fieldType( Number nCampo )
// Devuelve el tipo de objeto de un campo objeto
// Ver enum de tipos de campos objeto
// ‐ nCampo = Número de campo, el primero es el 0
Number fieldObjectType( Number nCampo )
// Devuelve el tamaño en bytes de los caracteres que admite el buffer del campo
// Por ejemplo un campo Alfa40 de 2 bytes tiene un buffer 3 caracteres
// ‐ nCampo = Número de campo, el primero es el 0
Number fieldBufferLen( Number nCampo )
// Devuelve el nº de decimales de un campo numérico
// ‐ nCampo = Número de campo, el primero es el 0
Number fieldDecimals( Number nCampo )
// Devuelve true si el campo numérico es con signo
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
// Devuelve true si el campo numérico es con signo
// ‐ nCampo = Número de campo, el primero es el 0
Boolean fieldIsSigned( Number nCampo )
// Devuelve el valor mínimo de un campo numérico
// ‐ nCampo = Número de campo, el primero es el 0
Number fieldMinimumValue( Number nCampo )
// Devuelve el valor máximo de un campo numérico
// ‐ nCampo = Número de campo, el primero es el 0
Number fieldMaximumValue( Number nCampo )
// Devuelve el tipo de enlace del campo
// Ver enum de tipos de enlaces de campo
// ‐ nCampo = Número de campo, el primero es el 0
Number fieldBindType( Number nCampo )
// Devuelve el identificador (Id) de la tabla enlazada
// ‐ nCampo = Número de campo, el primero es el 0
String fieldBoundedTableId( Number nCampo )
// Devuelve un objeto de la clase VTableInfo de la tabla enlazada
VTableInfo fieldBoundedTableInfo( Number nPlural )
// Devuelve el identificar (Id) del campo padre de una tala submaestra
// ‐ nCampo = Número de campo, el primero es el 0
String fieldParentFieldId( Number nCampo )
// Devuelve el número de campo del campo padre de una tala submaestra
// ‐ nCampo = Número de campo, el primero es el 0
Number fieldParentFieldNumber( Number nCampo )
Funciones de índices
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// Devuelve el número de índices de la tabla
Number indexCount()
// Devuelve el identificador del índice
// ‐ nIndex = Número de orden del índice, el primer valor es el 0
String indexId( Number nIndex )
// Devuelve el nombre del índice
// ‐ nIndex = Número de orden del índice, el primer valor es el 0
String indexName( Number nIndex )
// Devuelve el identificador del índice
// ‐ nIndex = Número de orden del índice, el primer valor es el 0
Number indexType( Number nIndex )
Funciones de enlaces plurales
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// Devuelve el número de enlaces plurales de la tabla
Number pluralCount()
// Devuelve el identificador (Id) del plural
// ‐ nPlural = Número de orden del plural, el primero valor es el 0
String pluralId( Number nPlural )
// Devuelve el nombre del plural
// ‐ nPlural = Número de orden del plural, el primero valor es el 0
String pluralName( Number nPlural )
// Devuelve el identificador (Id) de la tabla enlazada (maestra)
// ‐ nPlural = Número de orden del plural, el primero valor es el 0
String pluralBoundedTableId( Number nPlural )
// Devuelve un objeto de la clase VTableInfo de la tabla enlazada (maestra)
// ‐ nPlural = Número de orden del plural, el primero valor es el 0
VTableInfo pluralBoundedTableInfo( Number nPlural )
// Devuelve el identificador (Id) del índice de la tabla enlazada (maestra)
// ‐ nPlural = Número de orden del plural, el primero valor es el 0
String pluralBoundedIndexId( Number nPlural )
// Devuelve un objeto de la clase VObjectInfo del índice de la tabla enlazada (maestra)
// ‐ nPlural = Número de orden del plural, el primero valor es el 0
VObjectInfo pluralBoundedIndexInfo( Number nPlural )
Funciones de localizadores por Id
1
2
3
4
5
6
7
8
// Devuelve el número de campo de un identificador
// ‐ szIdPrimarioCampo = Identificador del campo
Number findField( String szIDPrimarioCampo )
// Devuelve el número del índice de un identificador
// ‐ szIdPrimarioIndice = Identificador del índice
Number findIndex( String szIDPrimarioIndice )
9
10
11
// Devuelve el número del enlace plural de un identificador
// ‐ szIdPrimarioIndice = Identificador del enlace plural
Number findPlural( String szIDPrimarioHist )
Enumeraciones
Enum de tipos de tablas
1
2
3
4
TypeMaster = 0 Maestra
TypeHistorical = 1 Histórica
TypeMasterSub = 2 Submaestra
TypeMasterTree = 3 Arbolada
Enum de tipos de campo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
FieldTypeAlpha256 = 00 Alfa 256
FieldTypeAlpha128 = 01 Alfa 128
FieldTypeAlpha64 = 02 Alfa 64
FieldTypeAlpha40 = 03 Alfa 40
FieldTypeAlphaLatin1 = 04 Alfa Latin1
FieldTypeAlphaUtf16 = 05 Alfa Utf16
FieldTypeNumeric = 06 Numérico
FieldTypeDate = 07 Fecha
FieldTypeTime = 08 Hora
FieldTypeDateTime = 09 Tiempo (fecha y hora)
FieldTypeBool = 10 Booleano
FieldTypeObject = 11 Objeto
FieldTypeFormulaNumeric = 12 Fórmula numérica
FieldTypeFormulaAlfa = 13 Fórmula alfabética
FieldTypeFormulaDate = 14 Fórmula fecha
FieldTypeFormulaDateTime = 15 Fórmula tiempo (fecha y hora)
FieldTypeVirtualBind = 18 Puntero virtual
Enum de tipos de campos objeto
1
2
3
4
5
ObjectTypePicture = 0 Imagen
ObjectTypeText = 1 Texto
ObjectTypeRichText = 2 RichText (texto enriquecido)
ObjectTypeBinary = 3 Binario
ObjectTypeFormula = 4 Fórmula dinámica
Enum de tipos de enlaces de campo (bindType)
1
2
3
4
5
6
7
8
BindTypeNone = 0 Ninguno
BindTypeMaster = 1 Tabla maestra
BindTypeStatic = 2 Tabla estática
BindTypeIndirectReal = 3 Indirecto real
BindTypeIndirectVirtual = 4 Indirecto virtual
BindTypeSingularPluralPos = 5 Singular de plural por posición
BindTypeSingularPluralIndex = 6 Singular de plural por índice
BindTypeAdjacentSibling = 7 Hermano contiguo
Enum de tipos de índices
1
2
3
4
5
IndexTypeSingleKey = 0 Clave unica
IndexTypeWords = 1 Palabras
IndexTypeMultiKey = 2 Multiples claves
IndexTypeAcceptRepeat = 3 Acepta repetidas
IndexTypeWordParts = 4 Trozos de palabras
Ejemplos
Ejemplo de eliminación de todos los plurales de un registro de la tabla de entidades
1
2
3
4
5
6
7
8
9
10
11
12
////////////////////////////////////////////////////////////
// Eliminar todos los plurales de la tabla entidades de vbase
// Confirmar la eliminación de los plurales de la entidades
if ( confirm( "¿Desea eliminar todos los datos históricos de " + theRegisterIn.fieldToString( "NAME" ) + "?", { // Se crea la transacción
theRoot.beginTrans( "Eliminación de los plurales de " + theRegisterIn.fieldToString( "NAME" ) );
// Se analiza la tabla de entidades para recorrer sus plurales
ti = theRegisterIn.tableInfo();
numPlurales = ti.pluralCount();
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
numTotalReg = 0;
for ( x=0; x<numPlurales; ++x )
{
// Obtenemos el Id del plural
pluralId = ti.pluralId( x );
// Cargamos la lista de registro por ese plural
listaPlurales = theRegisterIn.loadPlurals( pluralId );
numReg = listaPlurales.size()
if ( numReg > 0 )
{
// Si la lista de plurales tiene registros se eliminan numTotalReg += numReg;
for ( y=0; y<numReg; ++y )
{
// Cogemos el registro plural
regPlural = listaPlurales.readLockingAt( y );
regPlural.deleteRegister();
}
}
}
// Se finaliza la transacción
theRoot.commitTrans();
alert( "Se han eliminado " + numTotalReg + " registros en " + numPlurales + " plurales" );
}
Clase
VMainWindow
VMainWindow
Descripción
Este objeto nos da acceso a las funciones de manejo de la ventana principal de la aplicación. Está disponible en procesos de scripts ejecutados en primer
plano.
Funciones
Funciones generales
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
// Devuelve el título de la ventana
String title()
// Cambia el título de la ventana
// ‐ szTitle = Texto del nuevo título de la ventana
void setTitle( String szTitle )
// Devuelve la hoja de estilo (CSS) que se está aplicando a la ventana
String styleSheet()
// Cambia la hoja de estilo (CSS) que se aplicará a la ventana
// ‐ szCssText = Texto con el CSS a aplicar
void setStyleSheet( String szCssText )
// Devuelve true si la ventana es visible
Boolean isVisible()
// Devuelve true si la ventana está a pantalla completa
Boolean isFullScreen()
// Devuelve true si la ventana está maximizada
Boolean isMaximized()
// Devuelve true si la ventana está minimizada
Boolean isMinimized()
// Muestra la ventana
void show()
// Oculta la ventana
void hide()
// Visualiza la ventana en modo a pantalla completa
void showFullScreen()
// Visualiza la ventana en modo maximizada
void showMaximized()
// Visualiza la ventana en modo minimizada
void showMinimized()
// Visualiza la ventana en modo normal
void showNormal()
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
// Devuelve la posición x de la ventana (esquina superior izquierda)
Number x()
// Devuelve la posición y de la ventana (esquina superior izquierda)
Number y()
// Devuelve el ancho en píxels de la ventana
Number width()
// Devuelve el alto en píxels de la ventana
Number height()
// Mueve la ventana a la posición especificada
// ‐ x = Posición horizontal en píxeles
// ‐ y = Posición vertical en píxeles
void move( Number x, Number y )
// Modifica el tamaño de la ventana
// ‐ nWidth = Ancho de la ventana en píxels
// ‐ nHeight = Alto de la ventana en píxels
void resize( Number nWidth, Number nHeight )
// Personaliza los botones y la barra de título de la ventana
// ‐ nFlags = Ver enum de personalización de la ventana (flags combinables) void customizeWindowHint( Number nFlags )
Funciones de docks
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// Devuelve true si el dock está visible
// ‐ szIdPrimarioDock = Identificador del dock
Boolean isDockVisible( String szIdPrimarioDock )
// Muestra el dock
// ‐ szIdPrimarioDock = Identificador del dock
void showDock( String szIdPrimarioDock )
// Oculta el dock
// ‐ szIdPrimarioDock = Identificador del dock
void hideDock( String szIdPrimarioDock )
// Devuelve true si el dock está flotante
// ‐ szIdPrimarioDock = Identificador del dock
Boolean isDockFloating( String szIdPrimarioDock )
// Fija el dock como flotante
// ‐ szIdPrimarioDock = Identificador del dock
// ‐ bSet = True para activarlo como flotante, false para desactivarlo como flotante
void setDockFloating( String szIdPrimarioDock, Boolean bSet )
// Modifica las características del dock
// ‐ szIdPrimarioDock = Identificador del dock
// ‐ nFeatures = Ver enum de features del dock (flags combinables)
void setDockFeatures( String szIdPrimarioDock, Number nFeatures )
Funciones de barra de menú
1
2
3
4
5
6
7
8
// Devuelve true si la barra de menú está visible
Boolean isMenuBarVisible()
// Muestra la barra de menú
void showMenuBar()
// Oculta la barra de menú
void hideMenuBar()
Funciones de acciones
1
2
3
// Ejecuta una acción (de cualquier proyecto)
// ‐ szIdRefAction = IdRef de una acción (proyecto/identificado), ejemplo: "VJS_APP/VDIR"
void runAction( String szIdRefAction )
Funciones de barra de estado
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// Devuelve true si la barra de estado está visible
Boolean isStatusBarVisible()
// Muestra la barra de estado
void showStatusBar()
// Oculta la barra de estado
void hideStatusBar()
// Devuelve el mensaje que se está mostrando en la barra de estado
String currentMessageStatusBar()
// Limpia el mensaje que se está mostrando en la barra de estado
void clearMessageStatusBar()
// Muestra un mensaje en la barra de estado
// ‐ szMsg = Mensaje de texto a mostrar en la barra de estado
// ‐ nMiliSegsTimeout = Tiempo en milisegundos que estará visible, por defecto 0 = no se oculta el mensaje
void showMessageStatusBar( String szMsg, Number nMiliSegsTimeout = 0 )
// Devuelve true si está visible el grip de cambio de tamaño de la ventana
Boolean isSizeGripEnabledStatusBar()
// Habilta o deshabilita el grip de cambio de tamaño de la ventana
// ‐ bSet = True para habilitar el grip de la cambio de tamaño, false para deshabilitar
void setSizeGripEnabledStatusBar( Boolean bSet )
Funciones de la vista central
1
2
3
4
5
6
7
8
9
// Devuelve el modo de interfaz de documento de la ventana
Number bootMode()
// Fijar el modo de interfaz de documento de la ventana
// ‐ nMode = Ver enum de modos de interfaz de documento de la ventana
void setBootMode( Number nMode )
// Devuelve el número de vistas abierta
Number viewsCount()
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// Devuelve el número ordinal de la vista en curso
VMdiView currentView()
// Hace visible la siguiente vista
void nextView()
// Hace visible la vista previa
void prevView()
// Cierra la vista en curso
void closeCurrentView()
// Cierra todas las vistas
void closeAllViews()
// Aplica el interfaz MDI en cascada
void mdiCascade()
// Aplica el interfaz MDI en mosaico
void mdiTile()
Enumeraciones
Enum de modos de interfaz de documento de la ventna
1
2
3
TAB = 0
MDI = 1
SDI = 2
Enum de personalización de ventana (flags combinables)
1
2
3
4
5
HintTitle = 0x01 Sin título
HintSystemMenu = 0x02 Sin menú del sistema
HintMinimizeButton = 0x04 Sin botón minimizar
HintMaximizeButton = 0x08 Sin botón maximizar
HintCloseButton = 0x10 Sin botón cerrar
Enum de features del dock (flags combinables)
1
2
3
4
Cerrable = 0×01
Movible = 0×02
Flotable = 0×04
Barra de titulo vertical = 0×08
Ejemplos
Ejemplo de cómo conseguir tener 1 opción de menú abierta una vez
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
////////////////////////////////////////////////////////////
// Busca una vista con el título y si la encuentra la habilita
// Si no la encuentra ejecuta la acción
// El proceso recibe 2 parámetros a través de las variables locales
// TITULO = Título de la pestaña
// ACCION = Acción a ejecutar
var numVistas = theMainWindow.viewsCount();
var ejecutar = true;
for ( i=0; i<numVistas + 1; i++ )
{
var vista = theMainWindow.currentView()
if ( vista.title() == theRoot.varToString( "TITULO" ) )
{
ejecutar = false;
} else {
theMainWindow.nextView();
}
}
// Si no se ha encontrado se lanza la acción para abrir la vista y se retorna true (para seguir)
if ( ejecutar == true )
{
theMainWindow.runAction( theRoot.varToString( "ACCION" ) );
}
Clase
VMdiView
VMdiView
Descripción
Un objeto de esta clase representa a una de las vistas centrales de la ventana principal. Algunas de las funciones sólo están disponibles cuando el modo
de interfaz de la VMainWindow es MDI.
Se puede coger el VRoot que contiene la vista si no es una vista genérica.
Funciones
Funciones generales
1
2
3
// Devuelve el tipo de vista
// Ver enum de tipos de vistas Number type()
Funciones de información de la ventana
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// Devuelve el título de la ventana
String windowTitle()
// Devuelve el script CSS que se está aplicando a la vista
String styleSheet()
// Devuelve true si la vista no está visible
Boolean isVisible()
// Devuelve la posición x de la ventana
Number x()
// Devuelve la posición y de la ventana
Number y()
// Devuelve el ancho en pixels de la ventana
Number width()
// Devuelve el alto en pixels de la ventana
Number height()
Funciones de manipulación de la ventana
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// Cambia el título de la ventana
// ‐ szTitle = Texto del título de la ventana
void setWindowTitle( String szTitle )
// Cambia el script CSS que se aplicará a la vista
// ‐ szCSS = Texto del script CSS
void setStyleSheet( String szCSS )
// Hace visible la vista
void show()
// Oculta la vista
void hide()
// Fija el foco en la ventana
void setFocus()
// Cierra la ventana
void close()
// Fuerza el repintado de la ventana salvo que esté oculta o las actualizaciones desactivadas
void repaint()
// Actualiza la ventana
// No produce un repintado inmediato para reducir el flicker
void update()
Funciones de la ventana sólo en modo MDI
1
2
3
4
5
// Mueve la ventana a la posición x, y
// ‐ x = Posición horizontal en pixeles de la esquina superior izquierda de la ventana
// ‐ y = Posición vertical en pixeles de la esquina superior izquierda de la ventana
void move( Number x, Number y )
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// Modifica el tamaño de la ventana
// ‐ nWidth = Nuevo ancho en pixeles de la ventana
// ‐ nHeight = Nuevo alto en pixeles de la ventana
void resize( Number nWidth, Number nHeight )
// Devuelve true si la ventana está maximizada
Boolean isMaximized()
// Devuelve true si la ventana está minimizada
Boolean isMinimized()
// Muestra la ventana maximizada
void showMaximized()
// Muestra la ventana minimizada
void showMinimized()
// Muestra la ventana normal
void showNormal()
// Coloca la ventana en la posición más baja de la pila de ventanas
void lower()
// Coloca la ventana en la posición más alta de la pila de ventanas
void raise()
Funciones sólo para vistas de datos
1
2
// Devuelve un objeto de la clase VRoot que representa a la vista dentro de la ventana
VRoot root()
Enumeraciones
Enum de tipos de vistas
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
TypeGeneric = 00 Genérica
TypeForm = 01 Formulario
TypeGrid = 02 Rejilla
TypeCasillero = 03 Casillero
TypeTree = 04 Arbol
TypeMultiView = 05 MultiVista
TypeMultiViewTree = 06 MultiVista en modo árbol
TypeFormBlock = 07 Bloc de formularios
TypeReportPreview = 08 Vista previa de informe
TypeViewFlow = 10 ViewFlow
TypeListAlternator = 11 Alternador de lista
TypeComboView = 12 ComboView
TypeListView = 13 ListView
TypeQmlList = 14 Lista QML
TypeAdvancedGrid = 15 Rejilla avanzada
TypeQmlForm = 16 Formulario QML
Ejemplos
Ejemplo de análisis del contenido de la vista en curso
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
////////////////////////////////////////////////////////////
// Ejemplo de análisis del contenido de la vista en curso
// Se obtiene la vista en curso
var view = theMainWindow.currentView();
if ( view )
{
// Cogemos el objeto "root" de la vista
var root = view.root();
if ( root )
{
// Cogemos el contenido del root: ficha, lista o ninguno
var rootContent = root.content();
if ( rootContent )
{
if ( root.objectInfo().inputType() == VObjectInfo.IORecord )
{
// Si el contenido es un registro
alert( "Contenido: ficha del registro " + rootContent.fieldToString( "ID" ) + " ‐ " + rootContent.field
}
else if ( root.objectInfo().inputType() == VObjectInfo.IOList )
{
// Si el contenido es una lista
alert( "Contenido: lista de " + rootContent.listSize() + " registros de la tabla " + rootContent.tableI
}
29
30
31
32
33
34
35
36
37
}
else
alert( "Contenido ninguno" );
}
else
alert( "No es vista de datos" );
}
else
alert( "No hay ninguna vista" );
Clase
VApp
VApp
Descripción de la clase
Este clase representa a la aplicacion. Dispone de funciones para ver información de sus proyectos, acceso a variables globales, constantes, utilidades de
base de datos, disco, etc.
El objeto theApp
Todos los scripts están conectados a un objeto global y único que representa a la aplicación cuyo nombre es theApp.
Herencia
Hay que tener en cuenta que la aplicación da acceso al proyecto principal con el que se ha arrancado la aplicación y todos sus objetos heredados lo que
permite el acceso y uso de cualquier objeto de la aplicación desde cualquier script.
Funciones
Funciones generales
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// Devuelve el nombre del navegador en curso (vClient, vWebClient)
String exeName()
// Emite un pitido a través del altavoz del sistema
void beep()
// Devuelve el código del idioma en curso
Number currentLanguageCode()
// Devuelve el código ISO (639) del idioma en curso
String currentLanguageIsoCode()
// Devuelve el nombre del idioma en curso (en inglés)
String currentLanguageName()
// Devuelve el código de país en curso
Number currentCountryCode()
// Devuelve el código ISO (3166) del país en curso
String currentCountryIsoCode()
// Devuelve el nombre del país en curso
String currentCountryName()
// Devuelve el caracter de separador decimal en curso (un string de un byte)
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
String currentDecimalPoint()
// Devuelve el código del idioma del sistema
Number sysLanguageCode()
// Devuelve el código ISO (639) del idioma del sistema
String sysLanguageIsoCode()
// Devuelve el nombre del idioma del sistema (en inglés)
String sysLanguageName()
// Devuelve el código de país del sistema
Number sysCountryCode()
// Devuelve el código ISO (3166) del país del sistema
String sysCountryIsoCode()
// Devuelve el nombre del país del sistema
String sysCountryName()
// Devuelve el caracter de separador decimal del sistema (un string de un byte)
String sysDecimalPoint()
// Devuelve el nombre de la máquina (host)
String sysMachineName()
Funciones de proyectos
1
2
3
4
5
6
// Devuelve el objeto VProjectInfo del proyecto principal en curso
VProjectInfo mainProjectInfo()
// Devuelve un objeto VProjectInfo del proyecto con el alias especificado
// ‐ szAlias = Alias del proyecto o nombre del fichero en disco
VProjectInfo projectInfo( String szAlias )
Funciones de variables globales
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// Devuelve el valor de una variable global de tipo:
String globalVarToString( String szIdRefVar ) // Alfabética
Number globalVarToDouble( String szIdRefVar ) // Numérica con decimales
Number globalVarToInt( String szIdRefVar ) // Numérica sin decimales
Boolean globalVarToBool( String szIdRefVar ) // Booleano
DateTime globalVarToDateTime( String szIdRefVar ) // Fecha y tiempo
Date globalVarToDate( String szIdRefVar ) // Fecha
Time globalVarToTime( String szIdRefVar ) // Tiempo (hora)
// Devuelve true si la variable global está vacía
// Las numéricas se asumen vacías con el valor 0
// ‐ szIdRefVar = IdRef de la variable ("ALIASPROYECTO/IDVARIABLE)
Boolean IsglobalVarEmpty( String szIdRefVar )
// Asigna el valor a la variable global, según el tipo:
void setGlobalVar(String szIdRefVar, String szValor) // Alfabética
void setGlobalVar(String szIdRefVar, double dValor) // Numérica con decimales
void setGlobalVar(String szIdRefVar, int nValor ) // Numérica entera
void setGlobalVar(String szIdRefVar, Boolean bValor ) // Booleana
void setGlobalVar(String szIdRefVar, DateTime dt ) // Fecha y tiempo
void setGlobalVar(String szIdRefVar, Date date ) // Fecha
void setGlobalVar(String szIdRefVar, Time time ) // Tiempo (hora)
Funciones de constantes
1
2
// Devuelva el contenido de una constante
String constant( String szIdRef )
Funciones de herramientas de base de datos
1
2
3
4
5
6
7
8
// Regenera el área de datos de la tabla indicada en el primer parámetro
// Si indicamos true en el 2º parámetro se mostrará la barra de progreso
// Esta función lanzada sobre tablas en memoria siempre devuelve false
Boolean regenDataArea( String idRefTabla, Boolean bProgressDialog )
// Regenera los índices de tabla indicada en el primer parámetro
// Si indicamos true en el 2º parámetro se mostrará la barra de progreso
Boolean regenIndexes( String idRefTabla, Boolean bProgressDialog )
Funciones de DOS (Sistema operativo de disco)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
// Copia un fichero. Devuelve true si la copia finaliza correctamente
Boolean copyFile( String szFileName, String szNewName )
// Devuelve true si el fichero existe y está legible
Boolean existsFile( String szFileName )
// Elimina un fichero del disco. Devuelve true si finaliza correctamente
Boolean removeFile( String szFileName )
// Renombra un fichero del disco. Devuelve true si finaliza correctamente
Boolean renameFile( String szFileName, String szNewName )
// Crea un enlace simbólico (acceso directo o shortcut) a un fichero o directorio
Boolean linkFile( String szFileName, String szLinkName )
// Cambia el path en curso. Devuelve true si el cambio finaliza correctamente
Boolean setCurrentPath( String szPath )
// Devuelve el path de:
String currentPath() // Directorio en curso (por defecto donde se ejecuta vClient)
String homePath() // Directorio home (por defecto el del usuario)
String rootPath() // Directorio raíz (p.e. C:/)
String tempPath() // Directorio temporal
// Elimina del path los separadores "/" o "\" redundantes y los unifica a "/"
String cleanPath( String szPath )
// Carga las unidades de disco del sistema. Devuelve true si finaliza correctamente
Boolean loadDrives()
// Devuelve el número de unidades de disco del sistema
Number drivesCount()
// Devuelve un objeto VFileInfo para el unidades del índice cargado
VFileInfo driveAt( Number nIndex )
Ejemplos
Ejemplo de funciones generales
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
////////////////////////////////////////////////////////////
// Ejemplo de funciones generales
// Si el componente ejecutado es vClient se emite un pitido
if ( theApp.exeName() == "vClient" ) {
theApp.beep();
}
// Se muestra el nombre del componente en ejecución
alert( "Componente en ejecución: " + theApp.exeName() );
// Mostrar info local en curso
alert( "Información local en curso" + "\n" + "\n" +
"Código del idioma = " + theApp.currentLanguageCode() + "\n" +
"Código ISO del idioma = " + theApp.currentLanguageIsoCode() + "\n" +
"Nombre del idioma = " + theApp.currentLanguageName() + "\n" +
"Código del país = " + theApp.currentCountryCode() + "\n" +
"Código ISO del país = " + theApp.currentCountryIsoCode() + "\n" +
"Nombre del país = " + theApp.currentCountryName() + "\n" +
"Separador decimal = " + theApp.currentDecimalPoint() );
// Mostrar info local del sistema
alert( "Información local del sistema" + "\n" + "\n" +
"Código del idioma = " + theApp.sysLanguageCode() + "\n" +
"Código ISO del idioma = " + theApp.sysLanguageIsoCode() + "\n" +
"Nombre del idioma = " + theApp.sysLanguageName() + "\n" +
"Código del país = " + theApp.sysCountryCode() + "\n" +
"Código ISO del país = " + theApp.sysCountryIsoCode() + "\n" +
"Nombre del país = " + theApp.sysCountryName() + "\n" +
"Separador decimal = " + theApp.sysDecimalPoint() + "\n" +
"Nombre de la máquina = " + theApp.sysMachineName() );
Ejemplo de funciones de variables globales
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
////////////////////////////////////////////////////////////
// Ejemplo de funciones de variables globales
// Almacenamos los valores en variables globales
theApp.setGlobalVar( "VJS_DAT/VAR_GLO_ALF", "ABC" );
theApp.setGlobalVar( "VJS_DAT/VAR_GLO_NUM", 123.45 );
theApp.setGlobalVar( "VJS_DAT/VAR_GLO_TMP", "2012/05/03 08:31:18" );
theApp.setGlobalVar( "VJS_DAT/VAR_GLO_FCH", "2012/05/04" );
theApp.setGlobalVar( "VJS_DAT/VAR_GLO_HOR", "09:53:23" );
// Se comprueba si la variable global alfabética está vacía
alert( "¿Está vacía la variable global alfabética? " +
theApp.isGlobalVarEmpty( "VJS_DAT/VAR_GLO_ALF" ) );
// Recuperamos y mostramos el valor de las variables globales
alfabetica = theApp.globalVarToString( "VJS_DAT/VAR_GLO_ALF" );
numero_decimal = theApp.globalVarToDouble( "VJS_DAT/VAR_GLO_NUM" );
numero_entero = theApp.globalVarToInt( "VJS_DAT/VAR_GLO_NUM" );
tiempo = theApp.globalVarToDateTime( "VJS_DAT/VAR_GLO_TMP" );
fecha = theApp.globalVarToDate( "VJS_DAT/VAR_GLO_FCH" );
hora = theApp.globalVarToTime( "VJS_DAT/VAR_GLO_HOR" );
alert( "Valor de las variables globales: \n" + alfabetica + "\n" +
numero_decimal + "\n" + numero_entero + "\n" +
tiempo + "\n" + fecha + "\n" + hora );
Ejemplo de funciones de constantes
1
2
3
////////////////////////////////////////////////////////////
// Se muestra un mensaje con el texto de una constante
alert( theApp.constant( "VJS_DAT/MSG_ERR_ID" ) );
Ejemplo de funciones de DOS (Sistema operativo de disco)
1
2
3
4
5
6
7
8
9
10
11
12
////////////////////////////////////////////////////////////
// Ejemplos varios de las funciones de disco
// Se preparan las variables con los nombres de ficheros
fileFrom = "/fichero.txt";
fileTo = "/fichero.txt.bck";
// Si existe el fichero destino se elimina
if ( theApp.existsFile( fileTo) )
{
if ( confirm( "¿Desea eliminar el fichero " + fileTo + "?", "Confirmar" ) )
{
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
theApp.removeFile( fileTo);
}
}
// Si existe el fichero se copia
if ( theApp.existsFile( fileFrom ) )
{
if ( theApp.copyFile( fileFrom, fileTo) )
{
alert( "Se ha copiado el fichero correctamente", "Notificación" );
// Se crea un acceso directo al fichero origen
theApp.linkFile( fileFrom, fileFrom + ".lnk" );
// Se renombra el fichero copiado
theApp.renameFile( fileTo, fileTo + "1" );
} else {
alert( "No se ha copiado el fichero correctamente", "Notificación" );
}
} else {
alert( "No se ha encontrado el fichero " + fileFrom, "Aviso" );
}
// Cambiamos el directorio en curso
if ( theApp.setCurrentPath( theApp.rootPath() + "/instancias" ) )
{
alert( "Se ha cambiado el path en curso", "Notificación" );
}
// Mostrar los path de los directorios
alert( "Estos son los directorios de trabajo:" + "\n" +
"En curso: " + theApp.currentPath() + "\n" +
"Root: " + theApp.rootPath() + "\n" +
"Home: " + theApp.homePath() + "\n" +
"Temp: " + theApp.tempPath() );
// Limpieza de un path
alert( theApp.cleanPath( "//instancias\\app\datos//2012", "Senda" ) );
// Revisar las unidades de disco del sistema operativo
var drivesNumber =0;
var drivesList = "";
theApp.loadDrives();
for ( i=0; i{
drive = theApp.driveAt( i );
drivesNumber++;
drivesList += drive.path() + "\n";
}
alert( "Se han encontrado " + drivesNumber.toString() + " unidades de disco: \n\n" +
drivesList );
Ejemplo de funciones de herramientas de base de datos
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
////////////////////////////////////////////////////////////
// Ejemplo de regeneración del área de datos e índices de todas las tablas
// Confirmamos si desea regenerar área de datos, índices o todos
var regenAreaDatos = confirm( "¿Desea regenerar el área de datos de todas las tablas?", "Confirmación" );
var regenIndexes = confirm( "¿Desea regenerar los índices de todas las tablas?", "Confirmación" );
// Si hay algo que regenerar se leen todas las tablas de la aplicación incluídas las heredadas
if ( regenAreaDatos || regenIndexes )
{
var msgErrors = "";
var mainProject = theApp.mainProjectInfo();
for( var nIndex=0; nIndex < mainProject.allTableCount(); nIndex++ )
{
var tableInfo = mainProject.allTableInfo( nIndex );
var table = tableInfo.idRef();
// Sólo se regenera el área de datos de las tablas en disco
if ( tableInfo.isInMemory() == false )
{
if ( !theApp.regenDataArea( table, true ))
{
msgErrors += "Falló la regeneración del área de datos de la tabla " + table + "\n";
}
}
// Se regeneran los índices de todas las tablas sean en disco o en memoria
if ( !theApp.regenIndexes( table, true ))
{
msgErrors += "Falló la regeneración de índices de la tabla " + table + "\n";
}
}
// Mensaje final del resultado de las regeneraciones
if (msgErrors.length == 0)
{
alert( "El proceso de regeneración ha finalizado correctamente", "Notificación" );
} else {
40
41
42
alert( "Se han producido los siguientes errores: \n" + msgErrors, "¡Atención!" );
}
}
Clase
VRoot
VRoot
Descripción
La clase VRoot representa a un ejecutor de objeto y es creado automáticamente por V7. Dispone de funciones para ver o modificar las variables locales
del objeto y de sistema, obtener información del objeto (API), transacciones, etc.
Veamos algunos ejemplos:
Ejecutamos un proceso JavaScript desde una acción: el objeto theRoot representa el ejecutor del proceso en V7.
Próximas versiones: Tenemos un formulario con un manejador de evento en lenguaje JavaScript: El objeto theRoot del manejador de evento
representa al ejecutor del formulario.
Próximas versiones: Si el objeto V7 es una vista de datos (rejilla, formulario…) estará disponible el objeto dataView que sirve para coger la ventana
que representa el formulario o la vista de datos.
El objeto theRoot
Los scripts están conectados al objeto V7 que los ejecuta. Al ejecutarse el script se crea un objeto que representa al objeto V7 en ejecución, este objeto
se denomina theRoot.
El objeto theRoot representa al objeto en ejecución en curso. Representará a un objeto diferente dependiendo de donde estés, si estás en un proceso
será el proceso y si estás en un evento representa al formulario. También puedes obtener otros objetos root del interfaz.
Funciones
Funciones de API del objeto
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// Devuelve un objeto de la clase VObjectInfo que representa al objeto manipulado con la clase VRoot
VObjectInfo objectInfo()
// Devuelve el tipo del objeto manipulado con la clase VRoot
// Ver enum de tipos de objeto en la clase VObjectInfo
Number objectType()
// Devuelve el nombre del objeto manipulado con la clase VRoot
String objectName()
// Devuelve el tipo de entrada (ninguno, ficha o lista) del objeto manipulado con la clase VRoot
// Ver enum de tipos de entrada/salida en la clase VObjectInfo
Number inputType()
// Devuelve el tipo de salida (ninguno, ficha o lista) del objeto manipulado con la clase VRoot
// Ver enum de tipos de entrada/salida en la clase VObjectInfo
Number outputType()
Funciones de variables locales
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// Devuelve el valor de una variable local según el tipo
// ‐ szId = Identificador de la variable local
String varToString( String szId ) // Variable alfabética
double varToDouble( String szId ) // Variable numérica (con decimales)
Number varToInt( String szId ) // Variable numérica (entero)
Boolean varToBool( String szId ) // Variable booleana DateTime varToDateTime( String szId ) // Variable tiempo (fecha y hora)
Date varToDate( String szId ) // Variable fecha
Time varToTime( String szId ) // Variable hora
// Asigna el contenido a una variable local según el tipo
// ‐ szId = Identificador de la variable local
void setVar( String szId, String szValor ) // Variable alfabética
void setVar( String szId, double dValor ) // Variable numérica (con decimales)
void setVar( String szId, int nValor ) // Variable numérica (entero)
void setVar( String szId, Boolean bValor ) // Variable booleana
void setVar( String szId, QDateTime dt ) // Variable tiempo (fecha y hora)
void setVar( String szId, QDate date ) // Variable fecha
void setVar( String szId, QTime time ) // Variable hora
Funciones de variables de sistema
1
2
3
// Devuelve el número de registros de la lista del objeto
Number listSize()
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// Devuelve la posición del registro actual en la lista de registros del objeto
Number listPos()
// Devuelve la página en curso (Informes)
Number currentPage()
// Devuelve el número de páginas (Informe)
Number lastPage()
// Devuelve el nombre del usuario
String userName()
// Devuelve el path del directorio de caché del cliente
String clientCachePath()
// Devuelve true si el usuario en vAdmin está configurado como supervisor
Boolean isAdministrator()
Funciones de transacciones
1
2
3
4
5
6
7
8
9
10
11
12
// Inicia una transacción
// Devuelve true si la transacción se ha iniciado satisfactoriamente
// ‐ szTitulo = Título de la transacción que se visualiza en el visor de transacción de vAdmin
Boolean beginTrans( String szTitulo )
// Devuelve true si hay una transacción en curso
Boolean existTrans()
// Finaliza una transacción
// Devuelve true si la transacción ha finalizado satisfactoriamente
// Al finalizar la transacción se dar por válidas todas las operaciones realizadas en la base de datos todas las operac
// Al finalizar un proceso si hay una transacción abierta se cierra automáticamente como si se hubiese ejecutado esta f
13
14
15
16
17
Boolean commitTrans()
// Aborta una transacción y deshace todas sus operaciones
// Devuelve true si todas las operaciones de la transacción se han deshecho satisfactoriamente
Boolean rollbackTrans()
Funciones de vista de datos
1
2
3
4
5
6
7
8
9
10
11
// Devuelve VRegister, VRegisterList o Nulo
// El objeto que devuelve depende del origen del objeto representado por la clase VRoot
Object content()
// Devuelve el widget del objeto representado por la clase VRoot.
// ‐ szIDCompuestoControl = Identificador compuesto (Alias_Proyecto/Id_control)
Widget getWidget( String szIDCompuestoControl );
// Devuelve el tipo de vista
// Ver el enum de tipos de vista de la clase VMdiView
Number viewType()
Funciones de formulario
1
2
3
4
5
6
7
8
9
10
11
// Guarda el registro y cierra el formulario
// Equivale a pulsar el botón aceptar del formulario
void accept()
// Guarda el registro y mantiene abierto el formulario
// Equivale a pulsar el botón aceptar sin cerrar del formulario
void acceptNoClose()
// Cierra el formulario sin guardar el registro
// Equivale a pulsar el botón cancelar del formulario
void cancel()
Ejemplos
Ejemplo de múltiples transacciones
1
2
3
4
5
6
7
8
9
10
11
12
13
////////////////////////////////////////////////////////////
// Ejemplo de múltiples transacciones
// Se crea un registro vacío en memoria y se le asigna la tabla
var reg = new VRegister( theRoot );
reg.setTable( "vbaseUsuariosDat/USR" );
// Se ejecuta un bucle para dar 10 altas en 10 transacciones diferentes
for ( var i=0; i < 10; ++i )
{
// Se crea una transaccióname
if ( theRoot.beginTrans( "Alta de usuario. Transacción " + i ) )
{
13
14
15
16
17
18
19
20
21
22
23
24
25
26
{
// Se modifican los datos
reg.setField( "NAME", "Usuario_" + i );
// Se crea el registro
reg.addRegister();
// Se añaden el registro a la lista de salida
theRegisterListOut.append( reg );
// Se cierra la transacción
theRoot.commitTrans();
}
}
Clase
VRegister
VRegister
Descripción
Los objetos de esta clase representan una ficha de una tabla.
Los register pueden ser creados:
Automaticamente por v7 como VRegisterIn y VRegisterOut al inicio de un script lanzado desde uno o varios objetos V7 con entrada o salida ficha.
Desde otro objeto en javascript como con la funcion readAt de la clase VRegisterList que devuelve un VRegister.
Dispone de funciones para gestionar los contenidos de los campos por identificador simple o compuesto y por número de campo. Además se pueden
ver los contenidos previos de los campos, cuando se leyó la ficha.
Tambien dispone de una funciones para obtener la subclase del tipo VTableInfo que nos da informacion api de la tabla y de sus campos, indices e
historicos para ver las propiedades de estos objetos como por ejemplo el tipo de un campo, su identificador o su numero de decimales.
Para edición tenemos funciones de alta, baja y modificación asi como de control de errores.
Y al más puro estilo v7 las funciones de navegante.
Los objetos theRegisterIn, theRegisterOut y theRegister
Si el proceso JavaScript tiene una tabla asociada de origen ficha el script tendrá conectado un objeto de la clase VRegister denominado theRegisterIn
que se crea automáticamente con el registro de entrada.
Si el proceso tiene asociada una tabla destino de destino ficha el script tendrá conectado un objeto de la clase VRegister denominado theRegisterOut
que se crea automáticamente vacío y que podrá contener el registro de salida.
En las fórmulas que son lanzadas desde un origen de ficha de tabla, como por ejemplo un contenido inicial, el script tendrá conectado un objeto de la
clase VRegister denominado theRegister que se crea automáticamente con el registro que alimenta la fórmula. Desde este objeto podemos ejecutar
funciones de lectura de información pero no de escritura ya que las fórmulas no disponen de esa característica.
Constructor
1
2
3
// Devuelve un objeto VRegister inicializado
// Debe ejecutarse la función setTable() para asignarle la tabla
VRegister( theRoot )
Funciones
Funciones de inicialización
1
2
3
4
5
6
// Asigna la tabla al objeto VRegister creado con el constructor
// Devuelve true si ha podido asignar la tabla correctamente
// Una vez ejecutada es equivalente a crear una ficha en memoria de la tabla
// ‐ szIdRefTable = IdRef de la tabla
// ‐ bInitContenidos = Por defecto asume el valor true. Si se indica false no se dispararán los contenidos iniciales
Boolean setTable( const QString& szIdRefTable, bool bInitContenidos = true )
Funciones de API del objeto
1
2
// Devuelve un objeto VTableInfo de la tabla del registro
VTableInfo tableInfo()
Funciones de contenido de campos por identificador
1
2
3
4
5
6
7
8
// Devuelve el contenido de un campo en función del tipo
// La precisión en JavaScript de los números con decimales es la de tipo "double"
// El identificador de campo compuesto permite especificar campos de la tabla y de las enlazadas
// ‐ szIDCompuestoCampo = Identificador del campo
String fieldToString( String szIDCompuestoCampo ) // Campos alfanuméricos
Number fieldToDouble( String szIDCompuestoCampo ) // Campos numéricos (con decimales)
Number fieldToInt( String szIDCompuestoCampo ) // Campos numéricos (enteros)
Boolean fieldToBool( String szIDCompuestoCampo ) // Campos booleanos 9
10
11
12
13
14
15
16
17
18
19
20
21
DateTime fieldToDateTime( String szIDCompuestoCampo ) // Campos tiempo (fecha y hora)
Date fieldToDate( String szIDCompuestoCampo ) // Campos fecha
Time fieldToTime( String szIDCompuestoCampo ) // Campos hora
// Devuelve true si el campo está vacío
// Un campo numérico está vacío si su valor es 0
// Un campo alfabético está vacío si la longitud del contenido es 0
// ‐ szIDCompuestoCampo = Identificador del campo
Boolean isFieldEmpty( String szIDCompuestoCampo )
// Devuelve true si el contenido del campo ha sido modificado
// ‐ szIDCompuestoCampo = Identificador del campo
Boolean isFieldModified( String szIDCompuestoCampo )
Funciones de contenido de campos por número de campo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// Devuelve el contenido de un campo en función del tipo
// La precisión en JavaScript de los números con decimales es la de tipo "double"
// ‐ nCampo = Número de campo. El primero campo es el 0
String fieldToString( Number nCampo ) // Campos alfabéticos
double fieldToDouble( Number nCampo ) // Campos numéricos (con decimales)
Number fieldToInt( Number nCampo ) // Campos numéricos (enteros)
Boolean fieldToBool( Number nCampo ) // Campos booleanos
DateTime fieldToDateTime( Number nCampo ) // Campos tiempo (fecha y hora)
Date fieldToDate( Number nCampo ) // Campos fecha
Time fieldToTime( Number nCampo ) // Campos hora
// Devuelve true si el campo está vacío
// Un campo numérico está vacío si su valor es 0
// Un campo alfabético está vacío si la longitud del contenido es 0
// ‐ nCampo = Número de campo. El primero campo es el 0
Boolean isFieldEmpty( Number nCampo )
// Devuelve true si el contenido del campo ha sido modificado
// ‐ nCampo = Número de campo. El primero campo es el 0
Boolean isFieldModified( Number nCampo )
Funciones de contenido old de campos por identificador
1
2
3
4
5
6
7
8
9
10
11
12
// Devuelve el contenido anterior a la modificación de un campo en función del tipo
// El valor old es diferente al valor del campo si ha sido modificado pero aún se ha guardado la información en disco
// La precisión en JavaScript de los números con decimales es la de tipo "double"
// El identificador de campo compuesto permite especificar campos de la tabla y de las enlazadas
// ‐ szIDCompuestoCampo = Identificador del campo
String oldFieldToString( String szIDPrimarioCampo ) // Campos alfabéticos
double oldFieldToDouble( String szIDPrimarioCampo ) // Campos numéricos (con decimales)
Number oldFieldToInt( String szIDPrimarioCampo ) // Campos numéricos (enteros)
Boolean oldFieldToBool( String szIDCompuestoCampo ) // Campos booleanos DateTime oldFieldToDateTime( String szIDPrimarioCampo ) // Campos tiempo (fecha y hora)
Date oldFieldToDate( String szIDPrimarioCampo ) // Campos fecha
Time oldFieldToTime( String szIDPrimarioCampo ) // Campos hora
Funciones de contenido old de campos por número de campo
1
2
3
4
5
6
7
8
9
10
11
// Devuelve el contenido anterior a la modificación de un campo en función del tipo
// El valor old es diferente al valor del campo si ha sido modificado pero aún se ha guardado la información en disco
// La precisión en JavaScript de los números con decimales es la de tipo "double"
// ‐ nCampo = Número de campo. El primero campo es el 0
String oldFieldToString( Number nCampo ) // Campos alfabéticos
double oldFieldToDouble( Number nCampo ) // Campos numéricos (con decimales)
Number oldFieldToInt( Number nCampo ) // Campos numéricos (enteros)
Boolean oldFieldToBool( Number nCampo ) // Campos booleanos
DateTime oldFieldToDateTime( Number nCampo ) // Campos tiempo (fecha y hora)
Date oldFieldToDate( Number nCampo ) // Campos fecha
Time oldFieldToTime( Number nCampo ) // Campos hora
Funciones de modificación de campos por identificador
1
2
3
4
5
6
7
8
9
10
// Modifica el valor de un campo en función del tipo
// La precisión en JavaScript de los números con decimales es la de tipo "double"
// ‐ szIDPrimarioCampo = Identificador del campo
void setField( String szIDPrimarioCampo, String szText ) // Campos alfabéticos
void setField( String szIDPrimarioCampo, double dValor) // Campos numéricos (con decimales)
void setField( String szIDPrimarioCampo, int nValor ) // Campos numéricos (enteros)
void setField( String szIDPrimarioCampo, Boolean bValor ) // Campos booleanos
void setField( String szIDPrimarioCampo, DateTime dateTime ) // Campos tiempo (fecha y hora)
void setField( String szIDPrimarioCampo, Date date ) // Campos fecha
void setField( String szIDPrimarioCampo, Time time ) // Campos hora
Funciones de modificación de campos por número de campo
1
2
3
// Modifica el valor de un campo en función del tipo
// La precisión en JavaScript de los números con decimales es la de tipo "double"
// ‐ nCampo = Número de campo. El primero campo es el 0
4
5
6
7
8
9
10
void setField( Number nCampo, String szText ) // Campos alfabéticos
void setField( Number nCampo, double dValor) // Campos numéricos (con decimales)
void setField( Number nCampo, int nValor ) // Campos numéricos (enteros)
void setField( Number nCampo, Boolean bValor ) // Campos booleanos
void setField( Number nCampo, DateTime dateTime ) // Campos tiempo (fecha y hora)
void setField( Number nCampo, Date date ) // Campos fecha
void setField( Number nCampo, Time time ) // Campos hora
Funciones de estado
1
2
3
4
5
// Devuelve true si el registro existe
Boolean exist()
// Devuelve true si alguno de los campos del registros ha sido modificado
Boolean isModified()
Funciones de operaciones de disco
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// Da del alta el registro en la base de datos
Boolean addRegister()
// Modifica el registro en la base de datos
Boolean modifyRegister()
// Elimina el registro en la base de datos
Boolean deleteRegister()
// Devuelve true si la operación de base de datos ha finalizado satisfactoriamente
Boolean isOK()
// Devuelve el número de error producido en la operación de base de datos
// Ver enum de errores de operaciones de base de datos
Number errorNumber()
// Devuelve el texto del mensaje de error
String errorMessage()
Funciones de navegante
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// Devuelve una lista de registros del enlace plural del registro actual
// Equivale al comando cargar plurales y a navegar a histórico de uno
// ‐ szIDHistorico = Identificador del plural
VRegisterList loadPlurals( String szIDHistorico )
// Devuelve el registro de un campo enlace a maestro
// Equivale al comando cargar maestro y a navegar a maestro
// ‐ szIDPrimarioCampo = Identificador del campo con enlace a tabla maestra
VRegister readMaster( String szIDPrimarioCampo )
// Devuelve el registro de un campo enlace a maestro con bloqueo
// Al ser con bloqueo nos permite realizar operaciones de base de datos sobre el registro
// Equivale al comando cargar maestro y a navegar a maestro
// ‐ szIDPrimarioCampo = Identificador del campo con enlace a tabla maestra
VRegister readLockingMaster( String szIDPrimarioCampo )
Funciones de variables locales
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// Devuelve el valor de una variable local en función del tipo
// ‐ szID = Identificador de la variable local
String varToString( String szID ) // Variables alfabéticas
double varToDouble( String szID ) // Variables numéricas (con decimales)
Number varToInt( String szID ) // Variables numéricas (enteros)
Boolean varToBool( String szID ) // Variables booleanas
DateTime varToDateTime( String szID ) // Variables tiempo (fecha y hora)
Date varToDate( String szID ) // Variables fecha
Time varToTime( String szID ) // Variables hora
// Asigna un valor a la variable local según el tipo
// ‐ szID = Identificador de la variable local
void setVar( String szID, String szValor ) // Variable alfabética
void setVar( String szID, double dValor ) // Variable numérica (con decimales)
void setVar( String szID, int nValor ) // Variable numérica (entero)
void setVar( String szID, Boolean bValor ) // Variable booleana
void setVar( String szID, DateTime dt ) // Variable tiempo (fecha y hora)
void setVar( String szID, Date date ) // Variable fecha
void setVar( String szID, Time time ) // Variable hora
Funciones de variables de sistema
1
2
3
// Devuelve el tamaño de registros de una lista
Number listSize()
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// Devuelve la posición del registro en la lista de registros
Number listPos()
// Devuelve el número de la página en curso de un informe
Number currentPage()
// Devuelve el número de páginas de un informe
Number lastPage()
// Devuelve el nombre del usuario en curso
String userName()
// Devuelve el path del directorio de caché de la aplicación
String clientCachePath()
// Devuelve true si el usuario tiene marcado en vAdmin el check Supervisor
Boolean isAdministrator()
Funciones de ejecución
1
2
3
// Ejecuta un proceso V7 o JavaScript
// ‐ szIdRefProcess = IdRef del proceso "Alias_proyecto/ID_proceso"
Boolean runProcess( String szIdRefProcess )
Enumeraciones
Enum de errores de operaciones de base de datos
1
2
3
4
5
6
7
8
9
10
ErrorNone = 0 OK, sin errores
ErrorUnknown = 1 Error de registro desconocido
ErrorTransUnknown = 2 Error: No hay transacción en curso
ErrorAddReg = 3 Error en alta
ErrorDeleteReg = 4 Error en baja
ErrorModifyReg = 5 Error en modificación
ErrorRead = 6 Error de lectura
ErrorReadLocking = 7 Error lectura con bloqueo
ErrorNullDir = 8 Error dirección de ficha nula
ErrorIndexOutOfRange = 9 Error index fuera de rango
Ejemplos
Ejemplo de altas de registros con varias transacciones
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
////////////////////////////////////////////////////////////
// Ejemplo de altas de registros con varias transacciones
// Se crea una transacción
if ( theRoot.beginTrans( "Transacción 1 ‐ Crear registros desde vJavaScript" ) )
{
// Se crea un registro vacío en memoria y se le asigna una tabla
var reg = new VRegister( theRoot );
if ( reg.setTable( "vbaseUsuariosDat/USR_GRP" ) )
{
for ( var i=0; i < 10; ++i )
{
// Se modifican los datos
reg.setField( "NAME", "VJS ‐ Nuevo grupo de usuarios " + i );
// Se crea el registro
reg.addRegister();
// Se añaden los registros a la lista de salida
theRegisterListOut.append( reg );
}
}
// Se cierra la primera transacción
theRoot.commitTrans();
}
// Se crea una transacción
if ( theRoot.beginTrans( "Transacción 2 ‐ Crear registros desde vJavaScript" ) )
{
// Se crea un registro vacío en memoria y se le asigna una tabla
var reg = new VRegister( theRoot );
if ( reg.setTable( "vbaseUsuariosDat/USR_GRP" ) )
{ for ( var i=0; i < 10; ++i )
{
// Se modifican los datos
reg.setField( "NAME", "VJS ‐ Nuevo grupo de usuarios " + i );
// Se crea el registro
reg.addRegister();
42
43
44
45
46
47
48
// Se añaden los registros a la lista de salida
theRegisterListOut.append( reg );
}
}
// Se cierra la segunda transacción
theRoot.rollbackTrans();
}
Ejemplo de eliminación de registros encontrados en una búsqueda
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
////////////////////////////////////////////////////////////
// Ejemplo de eliminación de registros encontrados en una búsqueda
// Se importa la clase para usar sus funciones
importClass( "VQuery" );
// Se crea el objeto búsqueda
var bus = new VQuery( theRoot );
bus.setQuery( "VJS_APP/USR_GRP_ENT_NAM");
// Se alimentan los paŕametros de búsqueda
var des = prompt( "Desde", "VJS" );
var has = prompt( "Desde", "VJSzzzzzzzzzzzzz" );
bus.setVar( "NOM_DES", des );
bus.setVar( "NOM_HAS", has );
// Se ejecuta la búsqueda y los registros encontrados se añaden a la salida
if ( bus.exec() )
{
// Obtenemos de la búsqueda la lista de registros a eliminar
var lis = bus.result();
var numReg = lis.listSize();
// Se crea una transaccióname
if ( theRoot.beginTrans( "Eliminar registros desde vJavaScript" ) )
{
for ( var i=0; i < numReg; ++i )
{
// Obtenemos el registro de la lista a eliminar
var reg = lis.readLockingAt( i );
// Se crea el registro
reg.deleteRegister();
}
} }
alert( "Se han eliminado satisfactoriamente " + numReg + " registros" );
Ejemplo de navegación a maestros y a plurales
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
////////////////////////////////////////////////////////////
// Ejemplo de navegación a maestros y a plurales
// Se importa la clase para usar sus funciones
importClass( "VQuery" );
// Se crea el objeto búsqueda
var bus = new VQuery( theRoot );
bus.setQuery( "vbaseApp/ENT");
// Se ejecuta la búsqueda y los registros encontrados se añaden a la salida
if ( bus.exec() )
{
// Obtenemos de la búsqueda la lista de entidades
var lisEnt = bus.result();
// Navegamos a las direcciones de las entidades
lisDir = lisEnt.loadPlurals( "DIR_ENT" );
// Navegamos a maestros para obtener los países de las direcciones
lisPai = lisDir.loadMasters( "PAI" );
// Se añaden los registros a la lista de salida
theRegisterListOut.append( lisPai );
}
Clase
VRegisterList
VRegisterList
Descripción
Los objetos de esta clase representan una lista de fichas de una tabla. Dispone de funciones de manejo de la lista y sus items pudiendose obtener
objetos de la clase VRegister por index, en modos lectura y lectura con bloqueo si vamos a modificar.
Las funciones del navegante devuelven otro objeto clase VRegisterList con la lista del maestro o historico.
La funcion sort está sobrecargada pudiendo llevar varios pares de parametros campo y bDescendente.
Objetos theRegisterListIn y theRegisterListOut
Si el proceso JavaScript tiene una tabla asociada de origen lista el script tendrá conectado un objeto de la clase VRegisterList denominado
theRegisterListIn que se crea automáticamente con la lista de registros de entrada.
Si el proceso tiene asociada una tabla destino de destino lista el script tendrá conectado un objeto de la clase VRegisterList denominado
theRegisterListOut que se crea automáticamente vacío y que podrá contener la lista de registros de salida.
Constructor
1
2
3
// Devuelve un objeto VRegisterList inicializado
// Debe ejecutarse la función setTable() para asignarle la tabla
VRegisterList( theRoot )
Funciones
Funciones de inicialización
1
2
3
4
5
// Asigna la tabla al objeto VRegisterList creado con el constructor
// Devuelve true si ha podido asignar la tabla correctamente
// Una vez ejecutada es equivalente a crear una cesta de la tabla
// ‐ szIdRefTable = IdRef de la tabla
Boolean setTable( String szIdRefTable )
Funciones de API de tabla
1
2
// Devuelve un objeto VTableInfo de la tabla de la lista de registros
VTableInfo tableInfo();
Funciones de lista e ítems
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// Devuelve el número de registros de la lista
Number size()
// Devuelve la posición del registro en curso de la lista
Number pos()
// Limpia la lista de registros
// Equivale al comando de instrucción "Cesta: Limpiar"
void clear()
// Invierte el orden de los registros de la lista
void invert()
// Ordena la lista de registros por los campos indicados
// Se puede ordenador por múltiples campos separados por comas
// ‐ szIdCompuestoCampo = Identificador del campo de la tabla o de sus enlazadas
// ‐ bDescendente = True para indicar orden descendente, por defecto es false
void sort( String szIdCompuestoCampo, Boolean bDescendente, ... )
// Añade un registro a la lista
// Equivale al comando de instrucción "Cesta: Añadir ficha a la cesta"
// ‐ register = Objeto de la clase VRegister
void append( VRegister register )
// Añade una lista de registros a la lista
// Equivale al comando de instrucción "Cesta: Añadir lista a la cesta" 27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
// ‐ registerList = Objeto de la clase VRegisterList
void append( VRegisterList registerList )
// Cruza la lista de registros con la lista en curso
// En la lista en curso sólo quedarán los registros coincidentes
// Equivale al comando de instrucción "Cesta: Cruzar la lista de la cesta"
// ‐ registerList = Objeto de la clase VRegisterList
void cross( VRegisterList registerList )
// Quita de la lista el registro
// Esto no eliminar el registro de la base de datos, sólo de la lista
// Equivale al comando de instrucción "Cesta: Quitar ficha de la cesta"
// ‐ register = Objeto de la clase VRegister
void remove( VRegister register )
// Quita de la lista los registros de la lista que se pasa
// En la lista en curso quedarán los registros no coincidentes
// Esto no elimina los registros de la base de datos, sólo los de la cesta
// ‐ registerList = Objeto de la clase VRegisterList
void remove( VRegisterList registerList )
// Quita de la cesta el registro de la posición indicada
// Esto no eliminar el registro de la base de datos, sólo de la lista
// ‐ nIndex = Número de posición del registro en la lista
void removeAt( Number nIndex )
// Devuelve un objeto de clase VRegister con el registro de la posición seleccionada
// ‐ nIndex = Número de posición del registro en la lista
VRegister readAt( Number nIndex )
// Devuelve un objeto de clase VRegister bloqueado con el registro de la posición seleccionada
// Al estar bloqueado se podrán realizar operaciones de base de datos contra el registro
// ‐ nIndex = Número de posición del registro en la lista
VRegister readLockingAt( Number nIndex )
Funciones de navegante
1
2
3
4
5
6
7
8
9
10
// Devuelve una lista de registros del enlace plural de la lista de registros actual
// Equivale al comando cargar plurales y a navegar a histórico de todos
// ‐ szIDHistorico = Identificador del plural
VRegisterList loadPlurals( String szIDHistorico )
// Devuelve la lista de registros maestros del campo enlace a maestro
// Devuelve los maestros sin repetición, aunque varios registros apunten al mismo maestro sólo lo devuelve una vez
// Equivale al comando cargar maestros y a navegar a maestros
// ‐ szIDPrimarioCampo = Identificador del campo con enlace a tabla maestra
VRegisterList loadMasters( String szIDPrimarioCampo )
Funciones de ejecución
1
2
3
// Ejecuta un proceso V7 o JavaScript
// ‐ szIdRefProcess = IdRef del proceso "Alias_proyecto/ID_proceso"
Boolean runProcess( String szIdRefProcess )
Funciones de variables locales
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// Devuelve el valor de una variable local en función del tipo
// ‐ szID = Identificador de la variable local
String varToString( String szID ) // Variables alfabéticas
double varToDouble( String szID ) // Variables numéricas (con decimales)
Number varToInt( String szID ) // Variables numéricas (enteros)
Boolean varToBool( String szID ) // Variables booleanas
DateTime varToDateTime( String szID ) // Variables tiempo (fecha y hora)
Date varToDate( String szID ) // Variables fecha
Time varToTime( String szID ) // Variables hora
// Asigna un valor a la variable local según el tipo
// ‐ szID = Identificador de la variable local
void setVar( String szID, String szValor ) // Variable alfabética
void setVar( String szID, double dValor ) // Variable numérica (con decimales)
void setVar( String szID, int nValor ) // Variable numérica (entero)
void setVar( String szID, Boolean bValor ) // Variable booleana
void setVar( String szID, DateTime dt ) // Variable tiempo (fecha y hora)
void setVar( String szID, Date date ) // Variable fecha
void setVar( String szID, Time time ) // Variable hora
Funciones de variables de sistema
1
2
3
4
5
6
7
8
// Devuelve el tamaño de registros de una lista
Number listSize()
// Devuelve la posición del registro en la lista de registros
Number listPos()
// Devuelve el número de la página en curso de un informe
Number currentPage()
9
10
11
12
13
14
15
16
17
18
19
20
// Devuelve el número de páginas de un informe
Number lastPage()
// Devuelve el nombre del usuario en curso
String userName()
// Devuelve el path del directorio de caché de la aplicación
String clientCachePath()
// Devuelve true si el usuario tiene marcado en vAdmin el check Supervisor
Boolean isAdministrator()
Ejemplos
Ejemplo de navegación a plurales y maestros
1
2
3
4
5
6
7
8
9
10
11
12
////////////////////////////////////////////////////////////
// Ejemplo de navegación a plurales y maestros
// Recibimos una lista de países y devolvemos una lista de entidades
// Se carga el histórico de direcciones de los países
var lisDir = theRegisterListIn.loadPlurals( "DIR_PAI" );
// Se cargan las entidades de las direcciones
var lisEnt = lisDir.loadMasters( "ENT" );
// Se alimenta la lista de salida con las entidades cargadas
theRegisterListOut.append( lisEnt );
Ejemplo de recorrer lista eliminando fichas
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
////////////////////////////////////////////////////////////
// Ejemplo de recorrer lista eliminando fichas
// Abrimos la transacción
if ( theRoot.beginTrans( "Recorrer lista eliminando fichas de " + theRegisterListIn.tableInfo().name() ) )
{
// Se recorre la lista de entrada
var numReg = theRegisterListIn.size();
var numRegDel = 0;
var msgError = "";
for ( var x=0; x<numReg; ++x )
{
// Se lee el registro con bloqueo para poder modificar
var reg = theRegisterListIn.readLockingAt( x );
if ( reg.isOK() )
{
reg.deleteRegister();
if ( reg.isOK() )
numRegDel += 1;
else
msgError += " ‐ " + reg.fieldToString( "NAME" )+ "\n";
}
}
// Finalizamos la transacción
// Si no realizamos explícitamente el commitTrans() V7 lo hace automaticamente
theRoot.commitTrans();
}
// Se preparar el mensaje final con el restulado y se visualiza
var msg = "Se han eliminado " + numRegDel + " " + theRegisterListIn.tableInfo().name() + "\n\n"
if ( msgError != "" )
msg += "No se han podido eliminar los siguientes registros: " + "\n" + msgError;
alert( msg );
Clase
VQuery
VQuery
Descripción
La clase VQuery nos permite ejecutar objetos búsqueda. Construimos un objeto VQuery pasandole el objeto VRoot en curso y le indicamos la búsqueda
a ejecutar con la función setQuery. Una vez inicializado el objeto ya podemos usar el resto de funciones (salvo result): le pasamos contenido a las
variables locales de la búsqueda con setVarLocal (si lo requiere) y la ejecutamos con la función exec. Ahora ya podemos recoger los resultados con la
función result, que nos devuelve un objeto de la clase VRegisterList con el cual podemos operar.
Constructor
1
2
3
// Crea una instancia de objeto de la clase VQuery
// Debe ejecutarse la función setQuery() para asignarle la búsqueda
VQuery( theRoot )
Funciones
Funciones de inicialización
1
2
3
// Fija la búsqueda que se asocia al objeto
// ‐ szIdRefQuery = IdRef (Alias_Proyecto/Id_Búsqueda) de la búsqueda
void setQuery( String szIdRefQuery )
Funciones de API del objeto
1
2
// Devuelve el objeto VObjectInfo correspondiente a la búsqueda asignada al objeto VQuery
VObjectInfo objectInfo()
Funciones de variables locales
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// Devuelve el valor de una variable local según el tipo
// ‐ szID = Identificador de la variable local
String varToString( String szID ) // Variable alfabética
Number varToDouble( String szID ) // Variable numérica (con decimales)
Number varToInt( String szID ) // Variable numérica (entero)
Boolean varToBool( String szID ) // Variable booleana DateTime varToDateTime( String szID ) // Variable tiempo (fecha y hora)
Date varToDate( String szID ) // Variable fecha
Time varToTime( String szID ) // Variable hora
// Asigna un valor a la variable local según el tipo
// ‐ szID = Identificador de la variable local
void setVar( String szID, String szValor ) // Variable alfabética
void setVar( String szID, double dValor ) // Variable numérica (con decimales)
void setVar( String szID, int nValor ) // Variable numérica (entero)
void setVar( String szID, Boolean bValor ) // Variable booleana
void setVar( String szID, DateTime dt ) // Variable tiempo (fecha y hora)
void setVar( String szID, Date date ) // Variable fecha
void setVar( String szID, Time time ) // Variable hora
Funciones de operaciones
1
2
3
4
5
// Ejecuta la búsqueda y devuelve true si finaliza correctamente
Boolean exec()
// Devuelve un objeto VRegisterList con la lista de registro encontrados en la búsqueda
VRegisterList result()
Ejemplos
Ejemplo de búsqueda sin parámetros
1
2
3
4
5
6
////////////////////////////////////////////////////////////
// Ejemplo de búsqueda sin parámetros
// Se importa la clase para usar sus funciones
importClass( "VQuery" );
7
8
9
10
11
12
13
14
15
16
// Se crea el objeto búsqueda
var bus = new VQuery( theRoot );
bus.setQuery( "vbaseUsuariosApp/USR_GRP_NOM");
// Se ejecuta la búsqueda y los registros encontrados se añaden a la salida
if ( bus.exec() )
{
// Le pasamos los resultados a la lista de salida
theRegisterListOut.append( bus.result() );
}
Ejemplo de búsqueda con parámetros
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
////////////////////////////////////////////////////////////
// Ejemplo de búsqueda con parámetros
// Se importa la clase para usar sus funciones
importClass( "VQuery" );
// Se crea el objeto búsqueda
var bus = new VQuery( theRoot );
bus.setQuery( "VJS_APP/USR_GRP_ENT_NAM");
// Se alimentan los paŕametros de búsqueda
bus.setVar( "NOM_DES", "VJS" );
bus.setVar( "NOM_HAS", "VJSzzzzzzzzzzzzzzz" );
// Se ejecuta la búsqueda y los registros encontrados se añaden a la salida
if ( bus.exec() )
{
// Le pasamos los resultados a la lista de salida
theRegisterListOut.append( bus.result() );
}
Clase
VDir
VDir
Descripción
La clase VDir proporciona acceso a las estructuras de directorios y sus contenidos.
Un VDir se utiliza para manipular los nombres de sendas, acceso a la información sobre las sendas y los ficheros y manipular el sistema de archivos
subyacente.
VDir usa “/” como un separador universal de directorios de la misma manera que “/” se utiliza como un separador de ruta en URLs. Si siempre utiliza
“/” como separador de directorio, VDir traducirá las sendas para cumplir con el sistema operativo subyacente.
Un VDir puede apuntar a un directorio utilizando una ruta absoluta o relativa. Las rutas absolutas comienzan con el separador de directorio
(opcionalmente precedido por una especificación de unidad en Windows). Los nombres relativos de archivo comienzan con un nombre de directorio o
un nombre de archivo.
Constructor
1
2
3
// Crea una instancia de objeto de la clase VDir
// ‐ szFileName = Nombre o path del fichero
VDir( String szFileName )
Funciones
Funciones generales
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// Devuelve el nombre del directorio, por ejemplo "vbase" // No se debe confundir con el path "/instancias/vbase"
// Si el directorio no tiene nombre, por ejemplo el raíz devuelve ""
String dirName()
// Devuelve true si el directorio existe y false si no existe
Boolean exists()
// Devuelve true si el path es absoluto
Boolean isAbsolute()
// Devuelve true si el path es relativo
// En Linux y Mac es relativo si el path no comienza por "/"
Boolean isRelative()
// Devuelve true si el directorio es legible
// Un valor false no garantiza que los ficheros no sean accesibles Boolean isReadable()
// Devuelve true si es el directorio raíz
// Si es un enlace simbólico del directorio raíz devolverá false
// Para enlaces simbólicos usar la función canonicalPath()
23
Boolean isRoot()
Funciones de path
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// Devuelve el path del directorio
String path()
// Devuelve el path canonica, sin enlaces simbólicos ni "." o ".." redundantes
// Si el sistema no tiene enlaces simbólicos la función equivale a absolutePath()
// Si el canonical path no existe la función no devuelve nada
String canonicalPath()
// Devuelve el path absoluto (empieza con "/" o con la letra del dispositivo)
// Puede contener enlaces simbólicos pero no "." o ".." redundates o múltiples separadores
String absolutePath()
// Convierte el path del directorio en un path absoluto
// Si ya es absoluto no hace nada
// Devuelve true si la conversión se ha realizado
Boolean makeAbsolute()
// Devuelve el path de un fichero
// ‐ szFileName = Nombre o path del fichero
String filePath( String szFileName )
// Devuelve el path de un fichero relativo al directorio
// szFileName = Nombre o path del fichero
String relativeFilePath( String szFileName )
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
// Devuelve el path absoluto de un fichero en un directo
// No se verifica si el fichero existe en el directorio
// No se elimina del path los separadores múltiples o "." o ".." redundantes
// szFileName = Nombre o path del fichero
String absoluteFilePath( String szFileName )
// Cambia el directorio del objeto VDir
// Devuelve true si el directorio existe y es legible, en caso contrario false
// El cambio de directorio no se produce si devuelve false
// Usar cd("..") es equivalente a usar la función cdUp()
// szDirName = Nombre o path del directorio
Boolean cd( String szDirName )
// Cambia el directorio del objetos VDir al directorio padre
// Devuelve true si el directorio existe y es legible, en caso contrario false
// El cambio de directorio no se produce si devuelve false
// Usar cdUp() es equivalente a usar la función cd("..") Boolean cdUp()
Funciones de operaciones con directorios
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// Crear un directorio
// Devuelve true si se ha podido crear el nuevo directorio
// szDirName = Nombre o path del directorio
Boolean mkdir( String szDirName )
// Crear los directorios inexistentes de un path
// Devuelve true si ha podido crear todo el path del directorio
// Se crean todos los subdirectorios necesario para crear el directorio
// szDirPath = Path del directorio
Boolean mkpath( String szDirPath )
// Elimina un directorio
// El directorio debe estar vacío para poder eliminarlo
// Devuelve true sin finaliza correctamente
// szDirName = Nombre o path del directorio
Boolean rmdir( String szDirName )
// Elimina un path (directorio y subdirectorios).
// Devuelve true si finaliza correctamente
// szDirPath = Path del directorio Boolean rmpath( String szDirPath )
Funciones de ficheros del directorio
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// Devuelve true si el fichero existe
// szFilename = Nombre o path del fichero
Boolean exists( String szFileName )
// Carga en el objeto la lista de ficheros y subdirectorio del directorio en curso
// szNameFilter = Nombre del filtro
// nFilters = Ver enum de tipos de filtros
// nSortFlags = Ver enum de tipos de ordenación
Boolean load( StringList& aszNameFilters, Number nFilters = QDir::NoFilter, Number nSortFlags = QDir::NoSort )
Boolean load( Number nFilters = QDir::NoFilter, Number nSortFlags = QDir::NoSort )
// Refresca en el objeto directorio la lista de ficheros y subdirectorios
void refresh()
// Devuelve del nº de ficheros y directorios cargados con load()
Number count()
// Devuelve un objeto VFileInfo correspondiente al nº de elemento de la lista
// nIndex = Número de orden del fichero en la lista cargada de ficheros del directorio
VFileInfo entryAt( Number nIndex )
// Elimina un fichero o directorio
// Devuelve true si finaliza correctamente
// szFilename = Nombre o path del fichero
Boolean remove( String szFileName )
// Renombra un fichero o directorio
// Devuelve true si finaliza correctamente
// szOldname = Nombre o path del del fichero a cambiar
// szNename = Nombre o path del nuevo para el fichero
Boolean rename( String szOldName, String szNewName )
Enumeraciones
Enum de flags de filtros
1
2
3
FilterDirs = 0x001 Sólo directorios que cumplan el filtro
FilterFiles = 0x002 Solo ficheros
FilterDrives = 0x004 Lista de dispositivos (se ignora en Linux) 3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
FilterDrives = 0x004 Lista de dispositivos (se ignora en Linux) FilterNoSymLinks = 0x008 No incluir en la lista los enlaces simbólicos (accesos directos)
FilterAllEntries = FilterDirs | FilterFiles | FilterDrives Incluye en la lista directorios, ficheros, dispositiv
FilterReadable = 0x010 Incluye los directorios o ficheros que tienen acceso de lectura
FilterWritable = 0x020 Incluye los directorios o ficheros que tienen acceso de escritura
FilterExecutable = 0x040 Incluye los ficheros que tienen acceso de ejecución
FilterModified = 0x080 Incluye sólo los ficheros que han sido modificados (ignorado en Unix)
FilterHidden = 0x100 Incluye los ficheros ocultos
FilterSystem = 0x200 Incluye los ficheros del sistema
FilterAllDirs = 0x400 Todos los directorios, sin aplicar filtros
FilterCaseSensitive = 0x800 El filtro es sensible a mayúsculas y minúsculas
FilterNoDotAndDotDot = 0x1000 No incluye en la lista las entradas "." y "..", directorios en curso y padre
FilterNoDot = 0x2000 No incluye en la lista la entrada ".", el directorio en curso
FilterNoDotDot = 0x4000 No incluye en la lista la entrada "..", el directorio padre
FilterNone = ‐1 Sin filtro
Enum de flags de ordenación
1
2
3
4
5
6
7
8
9
10
11
SortName = 0x00 Ordenado por nombre
SortTime = 0x01 Ordenado por fecha de última modificación
SortSize = 0x02 Ordenado por tamaño
SortUnsorted = 0x03 No ordenado
SortDirsFirst = 0x04 Los directorios al principio, después los ficheros
SortReversed = 0x08 Orden inverso
SortIgnoreCase = 0x10 Ignorar mayúsculas
SortDirsLast = 0x20 Los ficheros al principio, después los directorios
SortLocaleAware = 0x40 Ordenado según la configuración local
SortType = 0x80 Ordenado por extensión
SortNone = ‐1 No ordenado por defecto
Ejemplos
Ejemplo de uso de las funciones de la clase VDir
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
////////////////////////////////////////////////////////////
// Ejemplo de las funciones de la clase VDir
// Para poder usar la clase VDir y sus funciones hay que importarla primero
importClass( "VDir" );
// Lo primero que hay que hacer es crear un objeto VDir con un directorio o vacío
var dir = new VDir();
// En caso de crear el objeto VDir sin un directorio es necesario asignar un path
dir.cd( "/Instancias/001" );
alert( "Se ha cambiado la senda del objeto directorio a " + dir.path() )
// Convertir el path del direcotorio en path absoluto
if ( dir.makeAbsolute() )
alert( dir.path() + " ya era un path abosluto" );
// Cargar la lista de ficheros y directorios
dir.load();
alert( "¿Existe el directorio " + dir.path() + "? " + dir.exists() + "\n" + "¿El directorio es el raíz? " + dir.isRoot() + "\n" + "¿El directorio es legible? " + dir.isReadable() + "\n" + "¿El directorio es absoluto? " + dir.isAbsolute() + "\n" + "¿El directorio es relativo? " + dir.isRelative() + "\n" + "Este directorio tiene " + dir.count() + " ficheros y directorios.");
// Se crea un directorio
bOk = dir.mkdir( "/" + "new" );
if ( bOk )
// Se elimina el directorio
dir.rmdir( "/" + "new" );
// Se crean los directorios y subidrectorios necesarios
bOk = dir.mkpath( "/backup/files/txt" );
if ( bOk )
// Se elimina el path completo
dir.rmpath( "/backup/files/txt" );
Clase
VFile
VFile
Descripción
Esta clase representa a un fichero binario y disponemos de funciones para consultar sus características, modificarlas así como crear, leer o escribir un
fichero binario en disco.
Constructor
1
2
3
// Crea una instancia de objeto de la clase VFile
// ‐ szFileName = Nombre o path del fichero
VFile( String szFileName )
Funciones
Funciones de información del fichero
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// Devuelve true si el fin de fichero ya ha sido leído
Boolean atEnd()
// Devuelve el código de estado del fichero
// Ver enum de errores de fichero
Number error()
// Devuelve true si el fichero existe
Boolean exists()
// Devuelve el nombre del fichero
String fileName()
// Devuelve true si el fichero sólo puede ser manipulado secuencialmente
Boolean isSequential()
// Devuelve el valor de los permisos del fichero
// El valor devuelto es la suma (OR) de los valores de los permisos
// Ver enum de permisos del fichero
Number permissions()
// Devuelve la posición en curso del fichero
// Se corresponde con la posición del último dato escrito o leído
// Si el fichero está cerrado o es secuencial devuelve cero.
Number pos()
// Devuelve el tamaño del fichero
Number size()
// Devuelve el path absoluto del fichero o directorio del enlace simbólico o acceso directo
// Devuelve una cadena vacía si el fichero no es un enlace simbólico o acceso directo
String symLinkTarget()
Funciones de operaciones sobre el fichero
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// Cierra el fichero
// Antes de cerrarlo ejecuta flush
void close()
// Hace una copia del fichero en curso con otro nombre o path
// Devuelve true si la copia ha podido realizarse con éxito
// ‐ szNewName = Path donde se almacenará la copia del fichero
Boolean copy( String szNewName )
// Guarda en disco los buffers de datos del fichero
// Devuelve true si ha podido realizarse con éxito
Boolean flush()
// Crear un acceso directo (Windows) o enlace simbólico (Unix)
// Devuelve true si se creado con éxito
// ‐ szLinkName = Nombre o path completo del enlace
Boolean link( String szLinkName )
// Abre el fichero con los modos especificados
// Los modos de apertura son combinables
// Se pueden especificar varios separados por "|"
// ‐ nMode = Ver enum de modos de apertura del fichero
Boolean open( Number nMode )
// Elimina el fichero en curso
// Devuelve true si se ha eliminado correctamente
Boolean remove()
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
// Renombra el fichero en curso
// Devuelve true si ha podido renombrarse correctamente.
// Si el fichero con el nombre szNewName ya existe devuelve false
// ‐ szNewName = Nombre o path nuevo para el fichero
Boolean rename( String szNewName )
// Cambia el tamaño del fichero
// Devuelve true si ha posido realizarse correctamente
// ‐ nSize = Valor en bytes del nuevo tamaño del fichero
Boolean resize( Number nSize )
// Fija la posición en curso del fichero
// Devuelve true si se ha posicionado correctamente
// Para fichero secuenciales devuelve el valor false
// Si la posición es posterior al fin de fichero, el fichero no se extiende, si se escribe en esa posición sí se extien
// ‐ nOffset = Número en bytes que representa la nueva posición del fichero
Boolean seek( Number nOffset )
// Fija los permisos del fichero
// Se pueden especificar múltiples permisos de forma combinada, separados por "|"
// Devuelve true si la asignación de permisos ha finalizado correctamente
// ‐ nPermissions = Ver enum de permisos del fichero
Boolean setPermissions( Number nPermissions )
// Fija el estado del fichero al valor a sin errores "ErrorNone".
void unsetError()
Funciones para el buffer del fichero
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// Devuelve el tamaño del buffer en bytes
Number bufferSize()
// Fija el tamaño del buffer en bytes
// ‐ nSize = Tamaño del buffer en bytes
void setBufferSize( Number nSize )
// Devuelve el número de bytes leídos que será el tamaño del buffer o menos
// Si el fichero está posicionado al final devolverá 0
Number readBuffer()
// Graba el buffer en el disco
// ‐ nBytes = Número de bytes del buffer a escribir, es opcional, si no se especifica asume el tamaño del buffer
Number writeBuffer( Number nBytes = ‐1 )
// Se usa para leer byte a byte el buffer
// Devuelve el valor del byte (entre 0 y 255) de la posición del buffer seleccionada
// ‐ nIndex = Posición del buffer
Number bufferAt( Number nIndex )
// Se usa para escribir byte a byte en el buffer
// ‐ nIndex = Posición del buffer en la que se escribirá
// ‐ nValue = Valor de 0 a 255 a escribir en la posición del buffer
void setBufferAt( Number nIndex, Number nValue )
Enumeraciones
Enum de modos de apertura del fichero
1
2
3
4
5
6
7
8
OpenModeNotOpen = 0x0000 No está abierto
OpenModeReadOnly = 0x0001 Abierto para lectura
OpenModeWriteOnly = 0x0002 Abierto para escritura
OpenModeReadWrite = OpenModeReadOnly | OpenModeWriteOnly Abierto para lectura/escritura
OpenModeAppend = 0x0004 Abierto para escribir al final del fichero, sin borrar el contenido existente
OpenModeTruncate = 0x0008 Abierto para escritura truncando. Si no existe y si existe se borra su contenido antes de
OpenModeText = 0x0010 Se abre en modo texto. Al leer el fin de línea se convierte al carácter "\n" y al escribi
OpenModeUnbuffered = 0x0020 No se utiliza buffer para el fichero
Enum de errores de fichero
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
ErrorNone = 00 Ok, no se ha producido ningún error
ErrorRead = 01 Se ha producido un error al leer del fichero
ErrorWrite = 02 Se ha producido un error al escribir en el fichero
ErrorFatal = 03 Se ha producido un error fatal
ErrorResource = 04 Se ha producido un error en el recurso
ErrorOpen = 05 No ha sido posible abrir el fichero
ErrorAbort = 06 Se ha abortado la operación sobre el fichero
ErrorTimeOut = 07 Se ha producido un error de timeout
ErrorUnspecified = 08 Se ha producido un error no especificado
ErrorRemove = 09 No ha sido posible eliminar el fichero
ErrorRename = 10 No ha sido posible renombrar el fichero
ErrorPosition = 11 La posición del fichero no puede ser modificada
ErrorResize = 12 No es posible redimensionar el fichero
ErrorPermissions = 13 No tiene permisos de acceso al fichero
ErrorCopy = 14 No se podido copiar el fichero
Enum de permisos del fichero
1
2
3
4
5
6
7
8
9
10
11
12
PermissionReadOwner = 0x4000 El propietario puede leer el fichero
PermissionWriteOwner = 0x2000 El propietario puede escribir en el fichero
PermissionExeOwner = 0x1000 El propietario puede ejecutar el fichero
PermissionReadUser = 0x0400 El usuario puede leer el fichero
PermissionWriteUser = 0x0200 El usuario puede escribir en el fichero
PermissionExeUser = 0x0100 El usuario puede ejecutar el fichero
PermissionReadGroup = 0x0040 El grupo de usuarios puede leer el fichero
PermissionWriteGroup = 0x0020 El grupo de usuarios puede escribir en el fichero
PermissionExeGroup = 0x0010 El grupo de usuarios puede ejecutar el fichero
PermissionReadOther = 0x0004 Todos pueden leer el fichero
PermissionWriteOther = 0x0002 Todos pueden escribir en el fichero
PermissionExeOther = 0x0001 Todos pueden ejecutar el fichero
Ejemplos
Ejemplo de creación de un fichero de texto
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
////////////////////////////////////////////////////////////
// Ejemplo de creación de un fichero de texto
// Para usar las funciones de la clase VFile primero hay que importarla
importClass( "VFile" );
// Se declara el objeto fichero
var fi = new VFile( "/buffer.txt" );
// Se abre el fichero de escritura (si no existe se crea y si existe se limpia)
if ( fi.open( VFile.OpenModeWriteOnly||VFile.OpenModeTruncate) )
{
// Se llena el buffer con las 26 letras del abecedario
for( var x=0; x<26; ++x )
{
fi.setBufferAt( x, 65+x );
}
// Se graba el buffer
fi.writeBuffer( 26 );
// Se cierra el fichero
fi.close();
}
else
// Si no ha sido posible abrir el fichero se muestra error
alert( "No se pudo abrir el ficher " + fi.fileName(), "Error" );
Clase
VFileInfo
VFileInfo
Descripción
Los objetos de esta clase contienen la información de un fichero de disco. Tiene funciones generales para obtener información de la senda, el fichero y
sus permisos además de permitir alterar algunas características del fichero.
Funciones
Funciones del path
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
// Devuelve el path absoluto del fichero incluyendo el nombre del fichero
String absoluteFilePath()
// Devuelve el path absoluto del fichero sin incluir el nombre del fichero
String absolutePath()
// Devuelve el nombre del fichero sin incluir la senda ni la extensión
// El nombre son todos los caracteres hasta el primero punto "."
// Por ejemplo de "/tmp/archive.tar.gz" devolvería "archive"
String baseName()
// Devuelve el nombre del enlace al fichero
// EN Mac OS X devuelve el nombre del enlace, en otras plataformas devuelve una cadena vacía String bundleName()
// Devuelve el path de la senda absoluta de un enlace simbólico del fichero incluyendo el nombre
// Si el fichero no existe devuelve una cadena vacía
String canonicalFilePath()
// Devuelve el path de la senda absoluta de un enlace simbólico del fichero sin incluir el nombre
// Si el fichero no existe devuelve una cadena vacía
String canonicalPath()
// Devuelve el nombre completo del fichero incluyendo la extensión sin la senda del path
// Por ejemplo de "/tmp/archive.tar.gz" devolvería "archive.tar"
String completeBaseName()
// Devuelve todas las extensiones del fichero
// Por ejemplo, de "/tmp/archive.tar.gz" devuelve "tar.gz"
String completeSuffix()
// Devuelve el nombre del fichero excluyendo la senda
// Por ejemplo, de "/tmp/archive.tar.gz" devuelve "archive.tar.gz"
String fileName()
// Devuelve el nombre del fichero incluyendo el path tanto si es absoluto o relativo
String filePath()
// Devuelve el nombre del grupo del fichero
// Sólo para sistemas Unix
String group()
// Devuelve el código (Id) del grupo del fichero
44
45
// Sólo para sistemas Unix
Number groupId()
Funciones de información
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// Devuelve true si el path apunta a una senda absoluta
Boolean isAbsolute()
// Devuelve true si el path apunta a un enlace (simbólico o paquete)
Boolean isBundle()
// Devuelve true si el path apunta a un directorio
Boolean isDir()
// Devuelve true si el path apunta a un fichero ejecutable
Boolean isExecutable()
// Devuelve true si el path apunta a un fichero o a un enlace simbólico
Boolean isFile()
// Devuelve true si el path apunta a un fichero o directorio oculto
Boolean isHidden()
// Devuelve true si el path apunta a un fichero que puede ser leído
Boolean isReadable()
// Devuelve true si el path apunta a un senda relativa
Boolean isRelative()
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
Boolean isRelative()
// Devuelve true si el path apunta al directorio raíz o a un enlace simbólico del mismo
Boolean isRoot()
// Devuelve true si el path apunta a un enlace simbólico
Boolean isSymLink()
// Devuelve true si el path apunta a un fichero en el que se puede escribir
Boolean isWritable()
// Devuelve true si el fichero existe
Boolean exists()
// Devuelve true si el cacheado del fichero está habilitado
Boolean caching()
// Devuelve la fecha y hora de creación del fichero
// En sistemas Unix esta fecha cambia tanto en la creación como si hay modificación de permisos, por ejemplo
DateTime created()
// Devuelve la fecha y hora de la última modificación del fichero
DateTime lastModified()
// Devuelve la fecha y hora de la última vez que el fichero fue leído o tuvo un acceso
DateTime lastRead()
Funciones de asignación
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
// Convertir el path del fichero en un senda absoluta
// Devuelve true si la conversión ha finalizado correctamente
// Si el path ya era absoluto devuelve false
Boolean makeAbsolute()
// Devuelve el nombre del propietario del fichero
String owner()
// Devuelve el código (Id) del propietario del fichero
Number ownerId()
// Devuelve el path del fichero
String path()
// Chequea los permisos del fichero y devuelve true si el fichero los tiene
// ‐ permissions = Ver enum de tipos de permisos del fichero en la clase VFile
Boolean permission( Number permissions )
// Devuelve el valor de los permisos del fichero
// El valor devuelto es la suma (OR) de los valores de los permisos
// Ver enum de permisos del fichero
Number permissions()
// Refresca la información del fichero
void refresh()
// Estable si el sistema tendrá caché de la información del fichero
// ‐ bEnable = True para que el sistema haga caché de la información del fichero
void setCaching( Boolean bEnable )
// Fija el fichero o directorio al que apuntará el objeto
// ‐ szFilePath = Path del fichero o directorio
void setFile( String szFilePath )
// Devuelve el tamaño del fichero en bytes
Number size()
// Devuelve la extensión del fichero String suffix()
// Devuelve el path absoluto del fichero apuntado por el enlace simbólico o acceso directo
String symLinkTarget()
Ejemplos
Ejemplo de lectura de los ficheros del directorio raíz del sistema
1
2
3
4
5
6
7
8
9
10
11
12
13
14
////////////////////////////////////////////////////////////
// Ejemplo de lectura de los ficheros del directorio raíz del sistema
// Para poder usar la clase VDir y sus funciones hay que importarla primero
importClass( "VDir" );
// Ss crear un objeto VDir con el directorio temporal de la aplicación
var dir = new VDir( theApp.rootPath() );
// Cargar la lista de ficheros y directorios
dir.load();
// Se inicializan las variables de trabajo
var filesNumber =0;
15
16
17
18
19
var totalSize = 0;
var filesList = "";
// Se recorren todos los ficheros del directorio
for ( i=0; i<dir.count(); i++ )
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
{
// Se lee el fichero (Se obtiene un objeto VTableInfo)
file = dir.entryAt( i );
// Si es fichero se acumulan sus datos
if ( file.isFile() ) {
filesNumber++;
totalSize += file.size();
filesList += dir.entryAt( i ).filePath(file.path() ) + "\n";
}
}
// Se visualizan los datos de todos los ficheros del directorio
alert( "En el directorio raíz (" + dir.path() + ")" + "\n" + "Se han encontrado " + filesNumber.toString() + " ficheros: \n\n" + filesList + "\n" + "El tamaño total de los ficheros es " + totalSize.toString() + " bytes." );
Clase
VTextFile
VTextFile
Descripción
Esta clase representa a un fichero de texto y disponemos de funciones para consultar sus características, modificarlas así como crear, leer o escribir un
fichero de texto en disco.
Constructor
1
2
3
// Crea una instancia de objeto de la clase VTextFile
// ‐ szFileName = Nombre o path del fichero de texto
VTextFile( String szFileName )
Funciones
Funciones generales
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// Devuelve la codificación que se aplicará al fichero
void codec()
// Fijar el codec para codificar los datos que escriben
// Aplicar esta función sobre el objeto VTextFile creado antes de escribir
// Por defecto se crea con code UTF‐8
// ‐ szCodecName = Ver lista de nombres de códigos (escribir entrecomillado)
void setCodec( String szCodecName );
// Devuelve true si el fin de fichero ha sido leído
Boolean atEnd()
// Cierre el fichero
void close()
// Devuelve el código numérico del error
Number error()
// Devuelve true si el fichero existe
Boolean exists()
// Devuelve el nombre del fichero
String fileName()
// Fuerza que se guarden todos los buffers a disco
void flush()
// Abre el fichero
// ‐ nMode = Ver enum de modo de apertura
Boolean open( Number nMode )
// Devuelve el código numérico de los permisos
Number permissions()
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
// Devuelve la posición actual del fichero
Number pos()
// Devuelve el contenido completo de todo el fichero
String readAll()
// Devuelve el contenido de una línea
// ‐ nMaxLen = Longitud máxima a devolver, por defecto 0 = hasta fin de línea
String readLine( Number nMaxlen=0 )
// Fija la posición del fichero. Devuelve true si el posicionamiento finaliza correctamente
// ‐ nOffset = Valor numérico de la posición
Boolean seek( Number nOffset )
// Fija los permisos del fichero
// ‐ nPermissions = Ver enum de permisos de un fichero Boolean setPermissions( Number nPermissions )
// Devuelve el tamaño en bytes del fichero
Number size()
// Fija el error del fichero al valor del enum VFile::NoError
void unsetError()
// Grabar una cadena de texto en la posición en curso
// ‐ szTexto = Texto a grabar
void write( String szText )
Lista de nombres de códigos
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
"Apple Roman"
"Big5"
"Big5‐HKSCS"
"CP949"
"EUC‐JP"
"EUC‐KR"
"GB18030‐0"
"IBM 850"
"IBM 866"
"IBM 874"
"ISO 2022‐JP"
"ISO 8859‐1 to 10"
"ISO 8859‐13 to 16"
"Iscii‐Bng, Dev, Gjr, Knd, Mlm, Ori, Pnj, Tlg, and Tml"
"JIS X 0201"
"JIS X 0208"
"KOI8‐R"
"KOI8‐U"
"MuleLao‐1"
"ROMAN8"
"Shift‐JIS"
"TIS‐620"
"TSCII"
"UTF‐8"
"UTF‐16"
"UTF‐16BE"
"UTF‐16LE"
"UTF‐32"
"UTF‐32BE"
"UTF‐32LE"
"Windows‐1250 to 1258"
"WINSAMI2"
Ejemplos
Ejemplos de creación de un fichero de texto
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
////////////////////////////////////////////////////////////
// Ejemplo de creación de un fichero de texto
// Para usar las funciones de la clase VFile primero hay que importarla
importClass( "VTextFile" );
importClass( "VFile" );
// Se declara el objeto fichero
var fi = new VTextFile( "/TextFile.txt" );
// Se abre el fichero en modo escritura. Crea si no existe o limpia si existe
if ( fi.open( VFile.OpenModeWriteOnly | VFile.OpenModeTruncate) )
{
// Se llena el buffer con las 26 letras del abecedario
for( var x=0; x<30; ++x )
{
fi.write( "Línea " + x + " de texto a grabar" + "\n" );
}
// Se cierra el fichero
fi.close();
}
else
// Si no ha sido posible abrir el fichero se muestra error
alert( "No se pudo abrir el ficher " + fi.fileName() + ", error " + fi.error(), "Error" );
Ejemplos de lectura de un fichero de texto
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
////////////////////////////////////////////////////////////
// Ejemplo de lectura de un fichero de texto
// Para usar las funciones de la clase VFile primero hay que importarla
importClass( "VTextFile" );
importClass( "VFile" );
// Se declara el objeto fichero
var fi = new VTextFile( "/TextFile.txt" );
// Se abre el fichero en modo de sólo lectura
if ( fi.open( VFile.OpenModeReadOnly ) )
{
// Leer todo el fichero
alert( "Tamaño del fichero = " + fi.size() + " bytes" );
// Leer todo el fichero
alert( fi.readAll() );
// Como hemos leído todo el fichero estamos posicionados al final
// Para volver a leer el fichero línea a línea nos posicionamos al princicipio
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
fi.seek( 0 );
// Recorremos el fichero línea a línea guardando su contenido
var txt = "";
while ( fi.atEnd() == false )
{
txt += fi.readLine();
} // Mostramos la variable con todo el contenido del fichero
alert( txt );
// Se cierra el fichero
fi.close();
}
else {
// Si no ha sido posible abrir el fichero se muestra error
alert( "No se pudo abrir el ficher " + fi.fileName() + ", error " + fi.error(), "Error" );
}
Clase
VXmlWriter
VXmlWriter
Descripción
Esta clase representa un objeto XML y nos permite generar un fichero XML con el contenido de una lista.
¿Cómo crear un fichero XML desde una lista de registros?
Para empezar hay que contruir el objeto VXmlWriter con new pasándole como parámetro un objeto de la clase VRegisterList.
El codec por defecto es “UTF­8″. Para cambiarlo por ejemplo a UTF­16, llamar a la funcion setCodec( “UTF­16″ ). Hay una lista de los codecs
disponibles más abajo.
Si no se usa la función setDocType(“mytype”) no se incluirá la cabecera opcional .
Por defecto el texto es formateado con saltos de linea e indentación. Para cancelarlo usar la función setAutoFormatting( false ). Con la función
setAutoFormattingIndent( nSpacesOrTabs ) ajustamos el número de espacios o tabs de indentación. Si usamos valores positivos para n representan
espacios y si son negativos tabs. Por defecto la indentación son 4 espacios.
Con la función addInitialTag( “tag”) le añadimos uno o varios tags, llamando varias veces a la función, que envuelven a los registros de la lista. Lo
normal es usar una con el nombre de la tabla.
Con la función setRowTag( “tag” ) le decimos la etiqueta que ha de envolver a cada registro. Si no se usa por defecto es “row”.
A continuación con las funciones addField( “tagCol”, “IDCOMPUESTOCAMPO”) y addFormula( “tagCol”, “Formula” ) le añadimos tantas columnas
como queramos por registro.
Y ya solo nos queda llamar a la función writeFile( “file.xml” ); para que nos lo escriba en disco.
Constructor
1
2
3
// Crea una instancia de objeto de la clase VXmlWriter
// ‐ registerList = Objeto de lista de registros que alimentará el objeto
VXmlWriter( VRegisterList registerList )
Funciones
Funciones de inicialización
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
// Fija el tipo de documento
// ‐ szType = Texto que identifica el tipo de documento XML
void setDocType( String szType )
// Fijar el codec para codificar los datos que escriben
// Aplicar esta función sobre el objeto VTextFile creado antes de escribir
// Por defecto se crea con code UTF‐8
// ‐ szCodecName = Ver lista de nombres de códigos (Escribir entrecomillado)
void setCodec( String szCodecName )
// Fija si se aplica o no formato automático
// Por defecto el texto es formateado con saltos de linea e indentación
// Por defecto la indentación son 4 espacios
// ‐ bSet = True para aplicar autoforma y false para cancelarlo
void setAutoFormatting( Boolean bSet )
// Ajusta el número de espacios o tabs de indentación
// Si usamos valores positivos para nSpacesOrTabs representan espacios
// Si usamos valores negativos para nSpacesOrTabs representan tabs.
void setAutoFormattingIndent( Number nSpacesOrTabs )
// Se añade uno o varios tags, llamando varias veces a la función
// Estos tags envuelven los registros de la lista
// Lo normal es usar una etiqueta con el nombre de la tabla
// ‐ szTag = Etiqueta (Normalmente el nombre de la tabla)
void addInitialTag( String szTag )
// Fijamos la etiqueta que envuelve a cada registro
// Si no se aplica esta función el valor por defecto de la etiqueta es "row"
// ‐ szTag = Etiqueta (Por defecto es row)
void setRowTag( String szTag )
// Permite añadir tantas columnas como campos definamos
// ‐ szTag = Etiqueta de la columna (Por ejemplo el ID del campo
// ‐ szIdCampoCompuesto ‐ Identificador del campo de la tabla o de las relacionadas
35
36
// ‐ szIdCampoCompuesto ‐ Identificador del campo de la tabla o de las relacionadas
void addField( String szTag, String szIdCampoCompuesto )
Funciones de operaciones
1
2
3
4
5
6
7
// Graba en disco el fichero XML
// Devuelve true si la generación ha finalizado correctamente
// ‐ szPath = Path o senda del fichero a generar
writeFile( String szPath )
// Devuelve un String con el XML generado
String writeToString()
Funciones de información
1
2
// Devuelve la codificación que se aplicará al fichero
void codec()
Lista de nombres de codecs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
"Apple Roman"
"Big5"
"Big5‐HKSCS"
"CP949"
"EUC‐JP"
"EUC‐KR"
"GB18030‐0"
"IBM 850"
"IBM 866"
"IBM 874"
"ISO 2022‐JP"
"ISO 8859‐1 to 10"
"ISO 8859‐13 to 16"
"Iscii‐Bng, Dev, Gjr, Knd, Mlm, Ori, Pnj, Tlg, and Tml"
"JIS X 0201"
"JIS X 0208"
"KOI8‐R"
"KOI8‐U"
"MuleLao‐1"
"ROMAN8"
"Shift‐JIS"
"TIS‐620"
"TSCII"
"UTF‐8"
"UTF‐16"
"UTF‐16BE"
"UTF‐16LE"
"UTF‐32"
"UTF‐32BE"
"UTF‐32LE"
"Windows‐1250 to 1258"
"WINSAMI2"
Ejemplos
Ejemplo de exportación de una lista de registros a XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
////////////////////////////////////////////////////////////
// Exportar una lista de registros a xml
// Se importa la clase para usar sus funciones
importClass( "VQuery" );
importClass( "VXmlWriter" );
// Se crea el objeto búsqueda
var bus = new VQuery( theRoot );
bus.setQuery( "vbaseUsuariosApp/USR_GRP_NOM" );
// Se ejecuta la búsqueda
if ( bus.exec() )
{
// Se crea el objeto XML con la lista de registros de entrada
var xml = new VXmlWriter( bus.result() );
// Se fija el tipo de documento
xml.setDocType( "vXML" );
// Se añade como etiqueta de documento, el nombre de la tabla
xml.addInitialTag( "USR_GRP" );
// Se añade la etiqueta de registro
xml.setRowTag( "row" );
// Se añaden los campos de la tabla
28
29
30
31
32
xml.addField( "Código", "ID" );
xml.addField( "Nombre", "NAME" );
xml.addField( "Usuario alta", "ALT_USR.NAME" );
// Grabar el fichero en disco
33
34
35
36
37
xml.writeFile( theApp.rootPath() + "/USR_GRP" + ".xml" );
}
// Se muestra un mensaje confirmando la exportación
alert( "Se han exportado satisfactoriamente " + bus.result().size() + " grupos de usuarios", "Información" );
Ejemplo de exportación a XML de los registros buscados de cualquier tabla
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
////////////////////////////////////////////////////////////
// Exportar a XML todos los campos de los registros buscados en una tabla //
// Este script es ejecutado desde otro proceso que le pasa la búsqueda a ejecutar (Variable local BUS)
// Una vez ejecutada la búsqueda se exportan todos los registros encontrados en la búsqueda
// Se exportan todos los campos de la tabla
// Se importa la clase para usar sus funciones
importClass( "VQuery" );
importClass( "VXmlWriter" );
// Se crea el objeto búsqueda
var bus = new VQuery( theRoot );
bus.setQuery( theRoot.varToString( "BUS" ) );
// Se ejecuta la búsqueda
if ( bus.exec() )
{
// Se obtiene el VRegisterList de la búsqueda
var lista = bus.result();
// Se crea el objeto VTableInfo para obtener la información de la tabla
var ti = lista.tableInfo();
// Se crea el objeto XML con la lista de registros de entrada
var xml = new VXmlWriter( lista );
// Se añade como etiqueta de documento, el nombre de la tabla
xml.addInitialTag( ti.id() );
// Se añade la etiqueta de registro
xml.setRowTag( "row" );
// Se recorren los campos y se añaden las columnas al XML
for ( col=0; col < ti.fieldCount(); ++col )
{
xml.addField( ti.fieldName( col ), ti.fieldId( col ) );
}
// Grabar el fichero en disco
xml.writeFile( theApp.rootPath() + "/" + ti.id() + ".xml" );
}
// Se muestra un mensaje confirmando la exportación
alert( "Se han exportado satisfactoriamente " + lista.size() + " " + ti.name(), "Información" );
Funciones
Globales
Funciones globales
Descripción
Estas funciones de interfaz ayudan a la interacción con el usuario de la aplicación.
Sintaxis
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// Muestra un mensaje en un cuadro de diálogo con el botón Aceptar
// ‐ szMensaje = Mensaje a mostrar
// ‐ szTitulo = Texto opcional para mostrar en el título del cuadro de diálogo
void alert( String szMensaje, [String szTitulo] )
// Muestra un cuadro de diálogo de confirmación
// ‐ szPregunta = Texto que se mostrará al usuario
// ‐ szTitulo = Texto opcional para mostrar en el título del cuadro de diálogo
Boolean confirm( String szPregunta, [String szTitulo] )
// Muestra un cuadro de diálogo solicitando la introducción de un dato
// ‐ szLabel = Texto descriptivo del dato a introducir
// ‐ szContIni = Valor opcional que puede mostrar el dato a introducir
// ‐ szTitulo = Texto opcional para mostrar en el título del cuadro de diálogo
String prompt( String szLabel, [String szContIni], [String szTitulo] )
Ejemplo
Ejemplo de uso de las funciones globales
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
////////////////////////////////////////////////////////////
// Cálculo del factorial de un número
// Confirmación de que se quiere ejecutar el proceso
if ( confirm("¿Seguro que desea calcular el factorial de un número?", "Confirmación") )
{
// Pedir el número a calcular
var numero = parseInt( prompt("Número a calcular", 10, "Cálculo de factural") );
// Se muestra el resultado del cálculo realizado
alert( "El factorial del número " + formatNumber( numero ) + " es " + formatNumber( factorial( numero ) ), }
// Calcula el factorial de un número
// ‐ num = Número del que se desea calcular el factorial
function factorial( num )
{
var factorial = 1;
for ( x=1; x<num+1; ++x)
{
factorial = factorial * x;
}
return( factorial );
}
// Formatear un número
// ‐ num = Número a formatear (admite decimales)
// ‐ prefix = Texto de prefijo a aplicar
// ‐ postfix = Texto de sufijo a aplicar
function formatNumber( num, prefix, postfix )
{
prefix = prefix || '';
postfix = postfix || '';
num += '';
var splitStr = num.split( '.' );
var splitLeft = splitStr[0];
var splitRight = splitStr.length > 1 ? ',' + splitStr[1] : '';
var regx = /(\d+)(\d{3})/;
while ( regx.test( splitLeft ) ) {
splitLeft = splitLeft.replace( regx, '$1' + '.' + '$2' );
}
return prefix + splitLeft + splitRight + postfix;
}
// Quitar el formato a un número
// ‐ num = Número a quitar el formateo
55
56
57
58
59
function unformatNumber( num )
{
return num.replace( /([^0‐9\,\‐])/g,'' )*1;
}
Directorio de scripts
Directorio de scripts
Descripción
Cada proyecto de Velneo V7 contiene un directorio donde podemos crear una estructura de carpetas y guardar en ellas los ficheros de scripts: QML,
JavaScript, … y sus ficheros auxiliares.
Al ejecutar una aplicación con vClient, vWebClient o vDataClient, se cargan tambien los directorios de scripts de cada proyecto de la aplicación.
Scripts reutilizables
Un mismo fichero QML o JavaScript se puede usar desde distintos objetos V7. Además, hay distintos tipos de objetos V7 que los usan como procesos,
lista QML y formulario QML. Un mismo fichero QML o JavaScript puede ser usado en objetos con distintas entradas y salidas, tabla y/o ficha/lista,
controlando el programador mediante las funciones API de los objetos de entrada/salida que nos da vJavaScript. Tambien se puede asumir que un
fichero QML o JavaScript tiene una tabla de entrada y/o salida determinadas, con el nivel de abstraccion deseado en cada fichero script.
Para introducir en un objeto V7 la propiedad “Fichero script” en el edit disponemos de un botón que nos presenta un árbol con los directorios de
scripts del proyecto en curso y de sus proyectos heredados.
Velneo V7 incorpora también editores de codigo fuente para los distintos lenguajes soportados.
Se puede usar “import” en los ficheros fuente QML para importar otros ficheros QML, JavaScript o carpetas enteras contenidas en los directorios
scripts del proyecto y heredados.
Editor de scripts
Editor de scripts
Descripción
En el componente de edición vDevelop se ha integrado un editor de scripts para facilitar la edición de los ficheros de script que se almacenan en el
directorio de scripts. El editor contempla las siguientes funcionalidades:
Coloreado de código
Como podemos ver en la imagen superior el editor contempla coloreado de código en función del lenguaje.
Autocompletar para clases y objetos
Autocompletar para funciones, señales y métodos
Autocompletar para enums de parámetros de funciones
Ayuda con los parámetros de funciones
Configuración del editor
Destacar la última opción que permite dejar configurado por defecto el tamaño de zoom que se aplicará al código cuando es editado. Para guardar el
tamaño deseado, primero debemos seleccionar el zoom deseado y luego ejecutar esta opción.
Toolbar del editor
Como vemos la toolbar incluye los botones de:
Configuración
Verificación de sintaxis de script correcta. Es recomendable verificar antes de ejecutar
Botones para copiar, cortar y pegar
Botones para deshacer y rehacer
Combo de selección manual del zoom
Botones para aumentar o disminuir el zoom
Botones para imprimir el script o guardarlo en disco en formato PDF
Toolbar de búsqueda
Con esta toolbar se pueden buscar textos en el script editado y movernos hacia adelante o hacia atrás de los ocurrencias encontradas.
Lenguajes
Lenguajes
Descripción
JavaScript
QML
Lenguajes
JavaScript
JavaScript
Descripción
Es posible crear en Velneo V7 procesos y fórmulas JavaScript para ser usados en el desarrollo de aplicaciones.
¿Qué objetos de Velneo V7 permiten la ejecución de JavaScript?
Lista QML
Formulario QML
Procesos JavaScript
Fórmulas JavaScript
¿Qué funciones de JavaScript están soportadas en Velneo V7?
En los scripts de JavaScript podremos usar:
Todo el conjunto de funciones soportadas en Qt 4.7 y que dan soporte al estándar EcmaScript­262
Todas las funciones implementadas en el nuevo API
A tener en cuenta
Por tratarse de funciones específicas del navegador, no estarán disponibles:
Funciones del DOM (Manejador de objetos del documento)
Funciones del BOM (Manejador de objetos del navegador)
JavaScript
Procesos
Procesos JavaScript
Descripción
Se ha añadido una nueva propiedad “Lenguaje” a los procesos. Las opciones disponibles son: V7 y JavaScript.
Los procesos con lenguaje JavaScript tienen las mismas propiedades que los procesos V7 salvo que en lugar del árbol de instrucciones disponemos de
un fichero de texto, en el cual escribiremos nuestro programa JavaScript.
Según el tipo de Entrada y el tipo de Salida dispondremos de distintos objetos:
Entrada
Ficha: VRegisterIn
Lista: VRegisterListIn
Salida
Ficha: VRegisterOut
Lista: VRegisterListOut
Por ejemplo en un proceso con entrada ficha y salida lista dispondremos de dos objetos: VRegisterIn con la ficha de entrada y VRegisterListOut con la
lista de salida.
Para ilustrarlo vamos a ver una comparativa del mismo proceso en V7 y en JavaScript con las siguientes tablas:
Partimos de una persona y cargamos su plural de repartos.
Cargamos las películas de los repartos.
Le pasamos las películas a la lista de salida.
Ordenamos la salida por año de mayor a menor.
Versión V7
Versión JavaScript
JavaScript
Fórmulas
Fórmulas JavaScript
Descripción
El lenguaje JavaScript ha sido implementado en las fórmulas de Velneo V7. Cualquier propiedad tipo fórmula de cualquier objeto puede ahora ser
escrita en V7 o JavaScript, independientemente del lenguaje de las otras fórmulas. Lo mismo sucede con los campos tipo fórmula dinámica que ahora
pueden escribirse en V7 o JavaScript.
En el nuevo editor de fórmulas, más simple y eficaz, disponemos de un combobox, situado en la toolbar superior, donde podemos seleccionar el
lenguaje deseado: V7 o JavaScript. Los asistentes como “Insertar campo” tienen en cuenta el lenguaje seleccionado e insertan el texto con la sintaxis
adecuada.
Por ejemplo, al insertar el campo NAME con lenguaje V7 será:
1
#NAME
y con JavaScript será:
1
vreg.fieldToString(“NAME”)
En el ejemplo se puede observar que en JavaScript ya elige el asistente automáticamente la función vreg.fieldToString de la clase VRegister según el
tipo de campo, decimales, signo, etc.
Las fórmulas JavaScript tienen conectado un objeto “vreg” de la clase VRegister a traves del cual se tiene acceso al contenido de los campos, variables
locales, globales y de sistema. Solo está disponible el juego de funciones de lectura, no el de modificación como en procesos, pués el objetivo de las
fórmulas es obtener un valor. También tienen conectado el objeto VApp, la aplicación.
Descargar