Qlikview Proyecto
Qlikview Proyecto
Qlikview Proyecto
QV Enterprise
Noviembre 2005
QV Versión 7.0 Español
Indice
1. INTRODUCCIÓN ......................................................................................................................... 6
1.1. ACERCA DE ESTE CURSO ........................................................................................................... 6
1.2. ARCHIVOS DE DATOS EMPLEADOS EN EL CURSO........................................................................ 7
1.3. INSTALACIÓN ............................................................................................................................ 7
1.4. GUARDAR ARCHIVOS ................................................................................................................ 7
1.5. FORMATO DE TEXTO DEL MATERIAL DE CURSO ......................................................................... 8
6. ARCHIVOS FUENTE................................................................................................................. 26
6.1. LA BASE DE DATOS DE LOS PEDIDOS ........................................................................................ 26
6.2. CREACIÓN DE UNA CONEXIÓN ODBC ..................................................................................... 27
10. EJERCICIOS............................................................................................................................. 54
14. EJERCICIOS............................................................................................................................. 66
17. INCLUDE................................................................................................................................... 78
19. EJERCICIOS............................................................................................................................. 87
21. EJERCICIOS............................................................................................................................. 95
1. Introducción
1.3. Instalación
Hallará estos archivos en el CD del curso, o por otros medios que su
instructor le facilite. Cuando ejecute el programa de instalación, los
archivos se instalarán en el directorio: C:\QlikView\ QlikView
Training\ QVCourse_EnterpriseScript a menos que especifique un
directorio distinto.
SQL SELECT
CustomerID,
Load
Editor de Script
Salesperson
QVCourse_EntScr.qvw
Cada una de estas secciones puede incluir una o más Reglas de Negocio
para ayudar al desarrollador a comprender y crear la funcionalidad más
adecuada y las características más útiles para el usuario de este
documento QlikView.
Ejecutar Script
Ejecuta el script, cierra el diálogo Editor de Script y abre la
página Propiedades de Hoja: Campos.
Depurar
Inicia la ejecución de script en el Depurador. El depurador
busca errores en el script. Cada sentencia de script puede ser
monitorizada y los valores de las variables examinados a la
vez que se ejecuta el script.
Imprimir Pestaña
Le permite imprimir los contenidos de la pestaña actualmente
activa.
Cortar
Corta el texto de script seleccionado y lo almacena en el
Portapapeles.
Copiar
Copia el texto de script seleccionado.
Pegar
Pega el texto de script almacenado en el Portapapeles.
Buscar
Busca en el script la cadena de texto especificada en la
pestaña actual únicamente.
Visor de Tablas
Muestra el visor gráfico de tablas de los datos actuales.
El menú EDITAR tiene todos los comandos necesarios para editar los
contenidos del panel de edición de texto. Además de los comandos
hbaituales de selección, copiado, corte e inserción de texto, hallará las
funciones Insertar Archivo que se emplea para insertar un archivo de
script, así como Buscar/Reemplazar que le permite buscar cadenas de
texto específicas.
La página Datos
Los comandos del grupo Base de Datos se utilizan para crear una
conexión y seleccionar campos de una fuente de datos. Si está
utilizando una DBMS comercial, puede emplear ODBC o OLE DB
como interfaz entre QlikView y la base de datos.
OLE DB: Marque esta alternativa para acceder a las bases de datos
mediante OLE DB.
ODBC Marque esta alternativa si desea acceder a las bases de datos
mediante ODBC.
Las opciones del grupo Datos desde Archivos se emplean para generar
las sentencias de script de Carga necesarias para leer los datos desde los
archivos.
La página Funciones
Haga clic en el botón Pegar una vez que haya seleccionado el nombre
de función que necesite. La función se introducirá en el script, en la
posición actual del cursor.
Página Configuración
5.2. Sintaxis
En esta sección, analizaremos las sentencias de script más comunes
(connect, select, load) para identificar y cargar datos en QlikView.
Cada una de ellas puede generarse mediante el uso de asistentes.
Practicaremos esto en las próximas secciones, pero antes vamos a
considerar diversos ejemplos de tales sentencias, cómo y dónde pueden
utilizarse en un script de carga QlikView.
5.3. Connect
La sentencia connect se emplea para establecer una conexión con una
base de datos mediante una interfaz ODBC o OLE DB. Una vez
establecida dicha conexión, ésta se utiliza entre tanto no se defina una
nueva sentencia connect. Se pueden definir múltiples sentencias
connect en un mismo script de carga QlikView, pero sólo puede haber
una conexión abierta a la vez.
Ejemplos de connect:
ODBC connect to
[COSQL01;DATABASE=SALESDATA;Trusted_Connection=Yes];
5.4. Select
La sentencia SQL select se utiliza para identificar campos y tablas que
han de cargarse desde la conexión actual a la base de datos. Se puede
utilizar cualquier sentencia select que sea válida, pero tenga en cuenta
que los drivers ODBC pueden imponer ciertas limitaciones de sintaxis a
una conexión de base de datos en particular. Asimismo, las sentencias
select no pueden hacer uso de la funcionalidad QlikView dentro de la
sentencia.
Ejemplos de select:
5.5. Load
La sentencia Load puede cargar datos según diversos métodos:
Ejemplos de load:
Load
A, B, A*B+D as E
Resident tab1;
Load * Inline
[CatID, Category
0,Regular
1,Occasional
2,Permanent];
Load
RecNo() as A, rand() as B
Autogenerate(10000);
Ejemplo de as:
Load
Capital as Capital city,
Cntry as Country,
Pop as Population
from Country.csv (ansi, txt…
Ejemplo de alias:
donde
mapname es el nombre de una tabla con un mapa de correspondencias
cargada anteriormente, que contenga uno o más pares de nombres de
campo, tanto antiguos como nuevos.
Nota: Tanto rename field como rename fields son formas admitidas,
sin diferencia alguna en el efecto final que producen.
FieldMap:
Mapping select oldnames, newnames from datadict;
Rename fields using FieldMap;
6. Archivos fuente
En una primera parte del curso, cargaremos datos de tres fuentes
diferentes, de acuerdo al plan de proyecto inicial. Los datos principales
provendrán de una base de datos en Access, denominada QWT. Para
estos datos, añadiremos tablas desde hojas de cálculo en Excel y desde
un archivo de texto en formato DIF, que se ha extraido de un sistema
AS/400.
5. Pulse Seleccionar.
ODBC CONNECT TO
[EnterpriseScript;DBQ=Datasources\QWT.mdb];
Customers:
SQL SELECT
Address,
City,
CompanyName,
ContactName,
Country,
CustomerID,
Fax,
Phone,
PostalCode,
StateProvince
FROM Customers;
Shippers:
SQL SELECT
ShipperID,
CompanyName as Shipper
FROM Shippers;
Categories:
SQL SELECT
CategoryID,
CategoryName,
Description
FROM Categories;
Orders:
Load
CustomerID,
EmployeeID,
Freight,
OrderDate,
Year(OrderDate) as Year,
Month(OrderDate) as Month,
Day(OrderDate) as Day,
OrderID,
ShipperID;
Order_Details:
SQL SELECT
OrderID,
ProductID,
Quantity,
UnitPrice,
UnitPrice*Quantity*(1-Discount) as NetSales
FROM `Order Details`;
SET ThousandSep=',';
SET DecimalSep='.';
SET MoneyThousandSep=',';
SET MoneyDecimalSep='.';
SET MoneyFormat='$#,##0.00;($#,##0.00)';
SET TimeFormat='h:mm:ss TT';
SET DateFormat='M/D/YYYY';
SET TimestampFormat='M/D/YYYY h:mm:ss[.fff] TT';
SET
MonthNames='Jan;Feb;Mar;Apr;May;Jun;Jul;Aug;Sep;Oc
t;Nov;Dec';
SET DayNames='Mon;Tue;Wed;Thu;Fri;Sat;Sun';
ODBC CONNECT TO
[EnterpriseScript;DBQ=DATASOURCES\QWT.mdb];
Customers:
SQL SELECT
Address,
City,
CompanyName,
ContactName,
Country,
CustomerID,
Fax,
Phone,
PostalCode,
StateProvince
FROM Customers;
Shippers:
SQL SELECT
ShipperID,
CompanyName as Shipper
FROM Shippers;
/* Products Table comments */
Products:
SQL SELECT
CategoryID,
ProductID,
ProductName,
QuantityPerUnit,
SupplierID,
UnitCost,
UnitsInStock,
UnitsOnOrder
FROM Products;
Categories:
SQL SELECT
CategoryID,
CategoryName,
Description
FROM Categories;
Orders:
Load
CustomerID,
EmployeeID,
Freight,
OrderDate,
Year(OrderDate) as Year,
Month(OrderDate) as Month,
Day(OrderDate) as Day,
OrderID,
ShipperID;
Order_Details:
SQL SELECT
OrderID,
ProductID,
Quantity,
UnitPrice,
UnitPrice*Quantity*(1-Discount) as NetSales
FROM `Order Details`;
9.1. Empleados
Tomamos los datos sobre los empleados del archivo Excel EmpOff.xls
y la hoja de cálculo Employee (empleado) en la carpeta DataSources
(Fuentes de Datos). Primero abrimos el archivo Excel y echamos un
vistazo a su contenido.
9.2. Oficinas
Los datos relativos a las oficinas de la compañía también se toman del
archivo Excel: EmpOff.xls pero de la hoja de cálculo Office (Oficina),
que es la segunda hoja de cálculo del archivo Excel EmpOff.xls.
9.3. Proveedores
Los datos sobre los proveedores se tomarán de un archivo DIF llamado
suppliers.dif (carpeta DataSources). Este formato es en cierto modo
diferente, como podrá observar si echa un vistazo al archivo en un
editor de texto normal, por ejemplo en el Bloc de notas. El archivo DIF
tendrá el siguiente aspecto:
TABLE
0,1
"EXCEL"
VECTORS
0,30
""
TUPLES
0,9
""
DATA
0,0
""
-1,0
BOT
1,0
"SupplierID"
1,0
"CompanyName"
1,0
"ContactName"
1,0
"Address"
1,0
"City"
1,0
Employee:
Load
EmpID as EmployeeID,
[Last Name],
[First Name],
Title,
[Hire Date],
Year([Hire Date]) as [Employee Hire Year],
Office,
Extension,
[Reports To],
[Year Salary]
FROM Datasources\EmpOff.xls (biff, embedded labels,
table is [Employee$]);
Office:
Load
Office,
Address,
[Postal Code],
City,
StateProvince,
Phone,
Fax,
Country
Figura 21. Todos los valores posibles tienen una frecuencia mayor que 1
Office:
Load
Office,
Address as OfficeAddress,
[Postal Code] as OfficePostalCode,
City as [Sales Office],
StateProvince as OfficeStateProvince,
Phone as OfficePhone,
Fax as OfficeFax,
Country as OfficeCountry
FROM Datasources\EmpOff.xls (biff, embedded labels,
table is [Office$]);
10. Ejercicios
1. Use el botón Exportar Estructura situado en el diálogo Propiedades de
Documento: Tablas para exportar la estructura de tabla desde su documento
QlikView.
2. Cree un nuevo documento QlikView, y cargue los datos desde las tablas que
exportó en el paso 1.
Sales_Person:
Load
EmployeeID,
[Last Name],
[First Name],
Title as SalesTitle
Resident Employee;
9. Guarde el documento.
Figura 23. Las tablas de clave sintética vistas desde el Visor de Tablas
Efectúe los siguientes cambios en las líneas de script que sirven para
cargar los campos First Name y Last Name para que el script que carga
las dos tablas implicadas ahora sea así:
Employee:
Load
EmpID as EmployeeID,
[First Name] & ' ' & [Last Name] as Name,
[Last Name],
[First Name],
Title,
[Hire Date],
Year([Hire Date]) as [Employee Hire Year],
Office,
Extension,
[Reports To],
[Year Salary]
FROM Datasources\EmpOff.xls (biff, embedded
labels, table is [Employee$]);
Sales_Person:
Load
EmployeeID,
Name as [SalesPerson],
Title as SalesTitle
Resident Employee
Where
Left(Title,3) = 'Sal'
OR Title = 'President';
EmployeeID as EmployeeSales,
Sales_Person:
Load
EmployeeID,
EmployeeID as SalesPersonID,
Name as [SalesPerson],
Title as SalesTitle
Resident Employee
Where
Exists(EmployeeSales,EmployeeID);
Nota 1:
El juego de caracteres correcto para este archivo es OEM. Los archivos
creados en Windows tienen ANSI como juego de caracteres estándar.
Macintosh usa el juego de caracteres MAC. A veces, como en este caso,
se pueden utilizar otros juegos de caracteres al importar datos desde
otros ordenadores. En tal caso, OEM quizá sea el más común. Este
juego de caracteres se emplea por ejemplo en OS/2 y DOS. Si usted
especifica un juego de caracteres indebido, existe el riesgo de que se
pierdan algunos caracteres, o que se interpreten de manera incorrecta.
Nota 2:
QlikView asocia campos con el mismo nombre. Si dos tablas tienen
varios campos en común, QlikView puede crear claves complejas para
poder asociar las tablas (véase tablas de clave sintética).
Qualify *;
Unqualify SupplierID;
8. Una vez que la tabla Suppliers haya sido cargada, debemos incluir
la siguiente sentencia, para que todos los campos cargados tras ésta
no tengan el cualificador de tabla.
Unqualify *;
Qualify *;
Unqualify SupplierID;
suppliers:
Load
SupplierID,
CompanyName,
ContactName,
Address,
City,
PostalCode,
Country,
Phone,
Fax
FROM Datasources\suppliers.dif (oem, dif, embedded
labels);
Unqualify *;
Las dos tablas se asociarán a través del campo común OrderID (ID de
pedido). El problema surge cuando deseamos saber el número exacto de
OrderID únicos. Es 1000, 200 o 1200? Nosotros sabemos, por la
información que tenemos, que la respuesta correcta es 1000 OrderID
únicos, pero para QlikView no está tan claro.
En este caso, QlikView buscará una tabla principal. Puede ser que elija
la correcta, pero en muchos casos el programa tendrá que optar por una
al azar.
Load
…,
OrderID,
OrderID as OrderIDCount,
…
from Order.xls (…);
Expresión Resultado
Total Count(Vendedor) 4
Total Count(VendedorDistinto) 3
Total Count(Artículo) 4
Total Count(ArtículoDistinto) 2
Num(Cantidad) 4
Sum(Cantidad) 900
14. Ejercicios
1. Modifique el script en su documento QlikView de forma que incluya un
campo llamado CuentaIDProducto, basado en el campo ProductID. El
nuevo campo se utilizará para producir la Medida Clave (Key Measure)
requerida: Total Productos Vendidos tal y como se detalla en nuestro plan
de proyecto.
Quarters:
Load * Inline [
Month, Quarter
1,Q1
2,Q1
3,Q1
4,Q2
5,Q2
6,Q2
7,Q3
8,Q3
9,Q3
10,Q4
11,Q4
12,Q4];
Como puede ver una carga inline contiene los nombres de campo y los
datos encerrados entre corchetes ([]). También observe que los nombres
de campo se sitúan en la primera línea, y los valores de datos van
separados por comas. La tabla introducida en el script asocia meses
numéricos con el correspondiente trimestre. Cuando ejecutamos el
script, se genera un nuevo campo (Quarter).
Consejo: Las tablas inline también se pueden generar por medio del
Asistente Inline que se abre pulsando un botón del grupo Datos Inline en
el editor de script.
Quarters:
Load
rowno() as Month,
'Q' & Ceil(rowno()/3) as Quarter
Autogenerate(12);
Una tabla mapping debe contener dos columnas, la primera con valores
comparativos y la segunda con los valores de correspondencia que se
desee. Hay que nombrar las dos columnas, pero los nombres no tienen
especial relevancia en sí mismos. Los nombres de columna no tienen
conexión con los nombres de campo de las tablas regulares. Cuando las
tablas mapping se usan para mapear un determinado valor o expresión,
ese valor será comparado con los valores de la primera columna de la
tabla mapping. Si se encuentra, el valor original será reemplazado por el
correspondiente valor en la segunda columna de la tabla mapping. Si no
se encuentra, no se efectuará reemplazo alguno.
La sintaxis es la siguiente:
mapping ( load statement | select statement )
Quarters_Map:
Mapping Load …
La sintaxis es:
applymap( 'mapname', expr, [ , defaultexpr ] )
applymap('Quarters_Map',num(Month(OrderDate))) as
Quarter,
5. Primero, haremos uso del Asistente para Tablas para abrir el archivo
Budget.xls situado en el directorio Datasources.
Budget_Actual_S1:
CROSSTABLE(BudgetYear, Amount, 2)
Load
*
FROM
Datasources\Budget.xls (biff, header is line,
embedded labels, table is [Sheet2$], filters(
Replace(1, top, StrCnd(null))
));
12. Cree una nueva hoja, haciendo clic en el botón Añadir Hoja , en
la barra de herramientas Diseño, o seleccionando Añadir Hoja en el
menú Diseño.
Si piensa en una tabla cruzada como en unos datos que tienen valores a
modo de campos, entonces una tabla genérica tendría los campos a
modo de valores. Hemos visto ya cómo cambiar los datos de una tabla
cruzada a datos estándar. Ahora veremos cómo pasar los datos
genéricos a datos estándar.
Budget_Actual:
Generic Load
Office,
BudgetYear,
Metric,
Amount
Resident
Budget_Actual_S1;
4. Ahora puede añadir los campos Actual cost, Actual rev., Budget cost
y Budget rev. a su diseño.
17. Include
Es posible incluir archivos en el script que contengan script o partes de
un script. Ahora veremos cómo se hace esto y cómo podemos hacer uso
de aplicaciones más avanzadas con este fin, sin tener que escribir nada
directamente en el script.
LOAD
EmpID as EmployeeID,
IF((ord("First Name") >= 65 AND ord("First Name") <=
90), chr(ord("First Name")+32),
IF((Left("First Name",1)='Ä' OR Left("First
Name",1)='ä'), chr(97),
IF((Left("First Name",1)='Å' OR Left("First
Name",1)='å'), chr(97),
IF((Left("First Name",1)='Ö' OR Left("First
Name",1)='ö'), chr(111),Left("First Name",1)))))&
IF((ord("Last Name") >= 65 AND ord("Last Name") <=
90), chr(ord("Last Name")+32),
IF((Left("Last Name",1)='Ä' OR Left("First
Name",1)='ä'), chr(97),
IF((Left("Last Name",1)='Å' OR Left("First
Name",1)='å'), chr(97),
IF((Left("Last Name",1)='Ö' OR Left("First
Name",1)='ö'), chr(111), Left("Last Name",1)))))&
IF((ord(Right("Last Name",1)) >= 65 AND
ord(Right("Last Name",1)) <= 90), chr(Right("Last
Name",1))+32,
IF((Right("Last Name",1)='Ä' OR Left("First
Name",1)='ä'), chr(97),
IF((Right("Last Name",1)='Å' OR Left("First
Name",1)='å'), chr(97),
IF((Right("Last Name",1)='Ö' OR Left("First
Name",1)='ö'), chr(111), Right("Last Name",1)))))&
'@'&
IF(Office=1,'stockholm.se',
IF(Office=2,'lund.se',
IF(Office=3,'paris.fr',
IF(Office=4,'nice.fr','seattle.com')))) as "e-mail"
FROM datasources\empoff.xls(ansi, biff, embedded
labels, table is [Employee$]);
cual lleva a una sentencia load compleja, que genera una nueva tabla
lógica con dos campos. Cargaremos EmployeeID y el nuevo campo e-
mail, dándonos el primero de ellos el enlace con el resto de la
estructura.
La sentencia load crea una firma compuesta por la primera letra del
primer nombre, y la primera y última letras del último nombre.
También asegura que no haya letras mayúsculas en la firma, sólo
minúsculas. Las letras extranjeras (del Sueco), por ejemplo å, Å, ä, Ä, ö
y Ö también se eliminan. Siguiendo a la firma se inserta @, seguido de
la dirección apropiada del servidor. Esta última vendrá determinada por
la oficina en la que trabajen los empleados.
$(Include=datasources\Email.txt)
6. Ejecute el script.
Donde:
<tabla> es una tabla con etiqueta de script, ya cargada, residente.
<nombre_de_archivo> se interpreta de manera similar a los nombres de
las sentencias load, por ejemplo las sentencias directory.
Los campos de la <lista de campos > pueden ser renombrados
utilizando sintaxis as estándar.
Customers:
Load
Address,
City,
CompanyName,
ContactName,
Country,
CustomerID,
Fax,
Phone,
PostalCode,
StateProvince
FROM Datasources\customers.qvd (qvd);
Customers:
buffer (stale after 7 days) SELECT
Address,
City,
CompanyName,
ContactName,
Country,
CustomerID,
Fax,
Phone,
PostalCode,
StateProvince
FROM Customers;
19. Ejercicios
1. Modifique el script en su documento QlikView para emplear una carga qvd
buffer en las tablas Orders y Order_Details.
¾ Unir
¾ Agregación
¾ Ordenar por
¾ Previo (acceder a los datos desde el registro previamente
cargado)
¾ Variables
OrdersByYear_Source:
Load
CustomerID,
OrderID,
Year
RESIDENT
Orders
Where
Year = 2003 or Year = 2004; /*only load 2 years*/
Aquí empleamos una carga Left Join porque sólo queremos enlazar los
pedidos cargados basados en la cláusula Where que especificamos en la
carga anterior. Necesitamos asegurarnos de que el campo OrderID esté
incluido en esta carga para que entronque con los registros de la tabla
OrdersByYear_Source con la que estamos enlazando. En QlikView, el
comportamiento de unión establecido por defecto es una unión externa
completa (“a full outer join”). Por lo tanto, si no hay campos que se
correspondan entre las dos tablas unidas, obtendrá un producto
Cartesiano de los registros. Puesto que estamos especificando OrderID
en ambas tablas, y estamos especificando Left, sólo los registros que se
correspondan con OrderID incluidos en la tabla OrdersByYear_Source
serán incluidos. Metemos el campo NetSales porque eso es
12. Añada una nueva hoja al diseño y denomínela Sales Change. Añada
todos los campos de la tabla OrdersByYear_Source. Observe que
todos estos campos son campos clave. ¿Sabría explicar por qué?
OrdersByYear:
Load
CustomerID,
Year,
sum(NetSales) as NetSalesByYear
RESIDENT
OrdersByYear_Source
Group by
CustomerID,Year;
5. Ejecute el script.
Sales_Change:
Load
CustomerID,
NetSalesByYear,
If(CustomerID = Previous(CustomerID),
If(NetSalesByYear > Previous(NetSalesByYear),
'UP','DOWN'),null()) as SalesChangeIndicator,
If(CustomerID = Previous(CustomerID),
NetSalesByYear - Previous(NetSalesByYear),
null()) as SalesChangeAmt
RESIDENT
OrdersByYear
Order by
CustomerID,Year;
9. Ejecute el script.
OrdersByYear_Source:
Load
CustomerID,
OrderID,
Year
RESIDENT
Orders
Where
Year = $(vCurrentFullYear) - 1 or Year =
$(vCurrentFullYear); /*only load 2 years*/
5. Ejecute el script.
9. Ejecute el script.
21. Ejercicios
En este ejercicio nos vamos a tomar un respiro en cuanto a escritura de script y
vamos a crear una tabla simple utilizando campos de la tabla Sales_Change que
cargamos en la sección anterior. La tabla simple incorporará gráficos QlikView
para suministrar una pista visual que indique la dirección de los cambios (hacia
arriba o hacia abajo).
If(SalesChangeIndicator =
'DOWN','qmem://<bundled>/BuiltIn/arrow_s_r.png',
'qmem://<bundled>/BuiltIn/cross.png'))
Etiquete esta expresión con una cadena dinámica, incluyendo los años de
comparación de Sales Change. Pista: utilice la variable vCurrentFullYear
que ya creamos en el script de carga.
22.1. Concatenación
Concatenación automática
Si los nombres de campo y el número de campos de dos o más tablas
cargadas son exactamente iguales, QlikView automáticamente
concatenará los resultados de las distintas sentencias load o select en
una tabla.
Ejemplo:
Reglas:
Concatenación forzada
Si dos o más tablas no tienen exactamente el mismo conjunto de
campos, aún es posible obligar a QlikView a concatenar las dos tablas.
Esto se realia mediante el prefijo concatenate en el script, el cual
concatena una tabla con otra nombrada o con la tabla lógica creada en
último lugar.
Ejemplo:
Reglas:
Impedir la concatenación
Si dos tablas poseen el mismo conjunto de campos y por tanto se
concatenarían normalmente de forma automática, puede evitar la
concatenación mediante el prefijo noconcatenate. Esta sentencia
impide la concatenación con cualquier otra tabla lógica existente que
tenga los mismos campos.
La sintaxis es:
noconcatenate ( loadstatement | selectstatement )
Ejemplo:
Ejemplo
En nuestros datos, se nos ha suministrado un conjunto adicional de
empleados nuevos que aún no están contenidos en el archivo
EmpOff.xls. Para incluir estos datos, necesitamos modificar nuestro
script de carga.
3. Dado que el nuevo formato de datos del archivo encaja con nuestro
primer archivo, solo necesitamos cambiar la fuente de los datos.
5. Ejecute el script.
Employee:
Load
EmpID as EmployeeID,
[First Name] & ' ' & [Last Name] as Name,
[Last Name],
[First Name],
Title,
[Hire Date],
Year([Hire Date]) as [Employee Hire Year],
Office,
Extension,
[Reports To],
[Year Salary]
FROM Datasources\Emp*.xls (biff, embedded labels,
table is [Employee$]);
REM Employee:
concatenate (Employee) Load
EmpID as EmployeeID,
[First Name] & ' ' & [Last Name] as Name,
[Last Name],
[First Name],
Title,
[Hire Date],
Year([Hire Date]) as [Employee Hire Year],
Office,
Extension,
[Reports To],
[Year Salary]
FROM Datasources\Employees_New.xls (biff, embedded
labels, table is [Employee$]);
9. Como ejercicio opcional, puede que quiera tratar de determinar por qué
a los empleados listados en el archivo Employees_New.xls no se les
asignó dirección de correo electrónico (el campo e-mail es nulo para
estos empleados). ¿Qué necesita para corregir este problema?
23. Seguridad
La seguridad informática es un elemento importante en este curso. Los
documentos QlikView a menudo contienen información confidencial y
es esencial saber cómo impedir el acceso a usuarios no autorizados.
Para mayor claridad, puede ser útil emplar otros niveles de acceso, por
ejemplo NINGUNO. Este siempre recibirá el tratamiento de “ningún
acceso”.
Script Oculto
Un script oculto es un área del script de código que está protegida por
contraseña. Siempre se ejecuta antes del script estándar durante una
recarga.
Section Access;
Access01:
Load * Inline
[USERID, PASSWORD, ACCESS
Demo, User, User
Demo, Admin, Admin];
Section Application;
3. Pulse Aceptar.
Section Access;
Access01:
Load * Inline
[USERID, PASSWORD, ACCESS, COMPUTER
Demo, User, User, Course1
Demo, Admin, Admin, Course2];
Section Application;
COMPUTER SERIAL
Course1 2300 2394 7111 8000
Course2 2300 2394 7111 8001
Access02:
Load
COMPUTER,
SERIAL
FROM Datasources\Access02.txt (ansi, txt,
delimiter is '\t', embedded labels);
Section Application;
5. Pulse Aceptar.
*,*,Admin,Course2]
dónde
condition es una expresión lógica que puede ser evaluada
comoverdadera o falsa.
Section Access;
IF vSecureType = 'BASIC' THEN
Access01:
Load * Inline
[USERID, PASSWORD, ACCESS, COMPUTER
Demo, User, User, Course1
Demo, Admin, Admin, Course2
*,*,Admin,Course2];
Access02:
Load
COMPUTER,
SERIAL
FROM Datasources\Access02.txt (ansi, txt, delimiter
is '\t', embedded labels);
Section Application;
ELSE /* 'DATA' Security Access */
END IF
3. Pulse Aceptar.
Access01:
Load
[USERID],
[ACCESS],
SP /* Connecting field for data reduction */
FROM Datasources\SalesSecurity.txt (ansi, txt,
delimiter is '\t', embedded labels);
Section Application;
Access_Application:
Load
upper(SP) as SP, /* Connecting field for data
reduction */
[SalesPerson]
FROM Datasources\SalesInitials.txt (ansi, txt,
delimiter is '\t', embedded labels);
END IF
6. Pulse Aceptar.
24. Ejercicios
En este ejercicio, nos aseguraremos de que es posible realizar una recarga de líneas
de comando desatendida, independientemente del método de seguridad de acceso
empleado en el script.
1. Haga los cambios que considere necesarios en el script para permitir que se
abra el número de SERIE registrado en la computadora Curso2, ejecute el
script y guarde este documento QlikView, sin tener en consideración si el
método de seguridad empleado es el ‘BÁSICO’ o el de ‘DATOS’.
25. Depuración
Cuando se realizan cambios en el script, a veces es difícil encontrar los
errores. QlikView cuenta con un depurador de errores de script que le
ayudará a identificar los errores cometidos en su script.
Haga clic en Finalizar Aquí para salir del depurador. Los datos que se
hayan cargado se conservarán en QlikView.
10. un número con ',' como separador decimal y '.' como separador de
miles, dando por sentado que ni el separador decimal ni el separador
de miles está establecido en '.'
Los números empleados para fecha y hora son los valores del número
de días que han transcurrido después del 30 de diciembre de 1899.
QlikView es por tanto compatible con el sistema de fecha 1900
empledo por Microsoft Excel paraWindows, Lotus 1-2-3 y otros
programas, entre el 1 de marzo de 1900 y el 28 de febrero de 2100.
Fuera de este marco de tiempo QlikView utiliza el mismo sistema de
fecha extrapolado con la ayuda del calendario Gregoriano, el cual está
considerado como un estándar en el mundo occidental en la actualidad.
Ejemplo:
o vice versa
Section Access;
Access01:
Load * Inline
[USERID, PASSWORD, ACCESS, COMPUTER
Demo, User, User, Course1
Demo, Admin, Admin, Course2
*,*,Admin,Server,Course2];
/*
UnComment following statement AFTER adding correct
serial number in Access02.txt file
*/
REM Access02:
Load
COMPUTER,
SERIAL
FROM Datasources\Access02.txt (ansi, txt, delimiter is '\t',
embedded labels);
Section Application;
Access01:
Load
[USERID],
'*' as SERIAL, /* Needed for command line user */
[ACCESS],
SP /* Connecting field for data reduction */
FROM Datasources\SalesSecurity.txt (ansi, txt, delimiter is
'\t', embedded labels);
Section Application;
Access_Application:
Load
SET ThousandSep=',';
SET DecimalSep='.';
SET MoneyThousandSep=',';
SET MoneyDecimalSep='.';
SET MoneyFormat='$#,##0.00;($#,##0.00)';
SET TimeFormat='h:mm:ss TT';
SET DateFormat='M/D/YYYY';
SET TimestampFormat='M/D/YYYY h:mm:ss[.fff] TT';
SET
MonthNames='Jan;Feb;Mar;Apr;May;Jun;Jul;Aug;Sep;Oct;Nov;Dec';
SET DayNames='Mon;Tue;Wed;Thu;Fri;Sat;Sun';
/* Quarters comments */
rem Quarters_Map:
Mapping Load * Inline [
Month, Quarter
1,Q1
2,Q1
3,Q1
4,Q2
5,Q2
6,Q2
7,Q3
8,Q3
9,Q3
10,Q4
11,Q4
12,Q4];
Quarters_Map:
Mapping Load
rowno() as Month,
'Q' & Ceil(rowno()/3) as Quarter
Autogenerate(12);
Customers:
buffer (stale after 7 days) SELECT
Address,
City,
CompanyName,
ContactName,
Country,
CustomerID,
Fax,
Phone,
PostalCode,
StateProvince
FROM Customers;
rem Customers:
Load
Address,
City,
CompanyName,
ContactName,
Country,
CustomerID,
Fax,
Phone,
PostalCode,
StateProvince
FROM Datasources\customers.qvd (qvd);
Products:
SQL SELECT
CategoryID,
ProductID,
ProductName,
QuantityPerUnit,
SupplierID,
UnitCost,
UnitsInStock,
UnitsOnOrder
FROM Products;
Categories:
SQL SELECT
CategoryID,
CategoryName,
Description
FROM Categories;
Orders:
buffer (stale after 1 days) Load
CustomerID,
EmployeeID,
EmployeeID as EmployeeSales,
Freight,
OrderDate,
OrderDate as CountOrderDate,
Year(OrderDate) as Year,
Month(OrderDate) as Month,
date(monthstart(OrderDate),'MMM-YYYY') as [Rolling
Month],
applymap('Quarters_Map',num(Month(OrderDate))) as
Quarter,
Day(OrderDate) as Day,
OrderID,
ShipperID;
Employee:
Load
EmpID as EmployeeID,
[First Name] & ' ' & [Last Name] as Name,
[Last Name],
[First Name],
Title,
[Hire Date],
Year([Hire Date]) as [Employee Hire Year],
Office,
Extension,
[Reports To],
[Year Salary]
FROM Datasources\Emp*.xls (biff, embedded labels, table is
[Employee$]);
REM Employee:
concatenate (Employee) Load
EmpID as EmployeeID,
[First Name] & ' ' & [Last Name] as Name,
[Last Name],
[First Name],
Title,
[Hire Date],
Year([Hire Date]) as [Employee Hire Year],
Office,
Extension,
[Reports To],
[Year Salary]
FROM Datasources\Employees_New.xls (biff, embedded labels,
table is [Employee$]);
Office:
Load
Office,
Address as OfficeAddress,
[Postal Code] as OfficePostalCode,
Qualify *;
Unqualify SupplierID;
suppliers:
Load
SupplierID,
CompanyName,
ContactName,
Address,
City,
PostalCode,
Country,
Phone,
Fax
FROM Datasources\suppliers.dif (oem, dif, embedded labels);
Unqualify *;
$(Include=datasources\email.txt)
///$tab Sales Person
/* Sales Person Table comments */
Sales_Person:
Load
EmployeeID,
EmployeeID as SalesPersonID,
Name as [SalesPerson],
Title as SalesTitle
Resident Employee
Where
Exists(EmployeeSales,EmployeeID);
///$tab Sales Change
/*
Load and Join Order data based on
vCurrentFullYear variable setting
*/
OrdersByYear_Source:
Load
CustomerID,
OrderID,
Year
RESIDENT
Orders
Where
Year = $(vCurrentFullYear) - 1 or Year =
$(vCurrentFullYear); /*only load 2 years*/
NetSales
RESIDENT
Order_Details;
OrdersByYear:
Load
CustomerID,
Year,
sum(NetSales) as NetSalesByYear
RESIDENT
OrdersByYear_Source
Group by
CustomerID,Year;
///$tab Budget/Result
Budget_Actual_S1:
CROSSTABLE(BudgetYear, Amount, 2)
Load
*
FROM
Datasources\Budget.xls (biff, header is line, embedded
labels, table is [Sheet2$], filters(
Replace(1, top, StrCnd(null))
));
Budget_Actual:
Generic Load
Office,
BudgetYear,
Metric,
Amount
Resident
Budget_Actual_S1;
DROP TABLE Budget_Actual_S1;