miércoles, 10 de octubre de 2012

Buscar bloqueos en BD oracle

Como saber si tiene alguna query  que este bloquenado la BD? aqui esta la forma de saberlo.

select object_name, session_id,oracle_username, a.* from v$locked_object a, dba_objects b where a.object_id = b.object_id

jueves, 23 de agosto de 2012

Opciones de Cascada en Hibernate

Algo importante al utilizar las cascadas de hibernate en los hbm


  • none - do not do any cascades, let the users handles them by themselves. 
  • save-update - when the object is saved/updated, check the assoications and save/update any object that require it (including save/update the assoications in many-to-many scenario). 
  • delete - when the object is deleted, delete all the objects in the assoication. 
  • delete-orphan - when the object is deleted, delete all the objects in the assoication. In addition to that, when an object is removed from the assoication and not assoicated with another object (orphaned), also delete it. 
  • all - when an object is save/update/delete, check the assoications and save/update/delete all the objects found. 
  • all-delete-orphan - when an object is save/update/delete, check the assoications and save/update/delete all the objects found. In additional to that, when an object is removed from the assoication and not assoicated with another object (orphaned), also delete it.

miércoles, 18 de abril de 2012

Crear Procedures en Oracle

Como crear un procedimiento que realice un update en BD oracle?

Se crea un procedure con nombre NOMBRE_PROCEDURE que recibe 3 parametros de entrada y retorna 2 parametros de salida.

- variableUno: lista de ids que se les debe hacer el update
- variableDos: valor que se debe setear en algun campo a actualizar
- variableTres: alguna condicion adicional que debe cumplir
- salidaUno: String que recoge todo lo que se actualizó
- salidaDos: Entero que retorna un codigo que permite comprobar que todo fue bien.


CREATE OR REPLACE PROCEDURE NOMBRE_PROCEDURE(
variableUno IN VARCHAR2,
variableDos IN VARCHAR2,
variableTres IN NUMBER,
salidaUno OUT NUMBER,
salidaDos OUT VARCHAR2
)
IS
TYPE ref1 IS REF CURSOR;
listaIds ref1;
indiceRecorrer NUMBER;

BEGIN
-- variableUno es un string separado por | donde se define una lista de ids ('1','2','3',...'n')
OPEN listaIds FOR SELECT t.* FROM TABLE(FN_SPLIT(variableUno,'|')) t;

LOOP
FETCH listaIds into indiceRecorrer;
EXIT WHEN listaIds%NOTFOUND;

--realizamos alguna accion
UPDATE TABLA_ACTUALIZAR SET ALGUN_CAMPO_ACTUALIZAR = variableDos WHERE ID_ACTUALIZAR = indiceRecorrer AND ALGUNA_COLUMNA_CONDICION = variableTres;

--recogo los ids actualizados (indiceRecorrer)
salidaUno := salidaUno || to_char(indiceRecorrer) || ',';

END LOOP;
salidaDos := 0; -- fuera del procedure se comprueba si salidaDos es == 0 entonces todo ha ido bien, sino ha sucedido algun error.

COMMIT;

EXCEPTION
WHEN OTHERS THEN
salidaDos := -1000;
DBMS_OUTPUT.PUT_LINE('SE PRODUJO UN ERROR EN EL PROCESO, SE REALIZARA UN ROLLBACK.' || SQLCODE || SQLERRM);
ROLLBACK;
RAISE;

END NOMBRE_PROCEDURE;
/

lunes, 22 de agosto de 2011

Expresiones Regulares

Dejo link de 10 expresiones regulares muy utiles para las validaciones web

http://web.ontuts.com/snippets/10-expresiones-regulares-imprescindibles-en-desarrollo-web/

-validar url
-validar emailhttp://www.blogger.com/img/blank.gif
-comprobar seguridad de contraseña
-validar numero de telefono
-validar numero de tarjeta de credito
-validar codigo postal
-validar ip
-otros......

Para entender que hace cada uno de los caracteres que se incluyen en cada expresion revisar la documentacion de wikipedia

http://es.wikipedia.org/wiki/Expresi%C3%B3n_regular

jueves, 23 de diciembre de 2010

String a Date en Java

Les dejo un metodo que transforma un String a un Date en Java.



private final static SimpleDateFormat FECHANORMAL = new SimpleDateFormat("d/M/y");

public static Date fecha2Date(String fechaString) throws ParseException {

Date fechaDate = null;
String fechaNormal = fechaString;
if (fechaNormal != null) {

fechaNormal = fechaNormal.trim();
fechaNormal = fechaNormal.replaceAll("-", "/"); // Aceptamos dd-mm-yyyy o dd/mm/yyyy
if (fechaNormal.indexOf('/') >= 0 && !"".equals(fechaNormal)) {

fechaDate = FECHANORMAL.parse(fechaNormal);
}

}


return fechaDate;
}

martes, 29 de junio de 2010

Formato de Celdas en EXCEL - tipo Numero - No Numero cientifico

Cuando se crean archivos excel desde paginas, siempre tengo problemas con los formatos de las celdas, por lo que he investigado y he podido encontrar una solucion aceptable.

cuando en las celda del excel (tabla html) que se va a exportar son numeros, por ejemplo:
<td>502682196768</td>

el resultado en excel de esto será

5,02682E+11

pero si le agregamos un estilo que interpreta excel nos mostrara como numero normal
es decir:

<td style='mso-number-format:0;'>502682196768</td>

502682196768

entonces la clave del formato esta en agregar lo siguiente a la celda.

style='mso-number-format:0;'


espero ayudar a muchos que tienen el mismo problema.

yo he navegado por muchos sitios y la mejor opcion que habia encontrado era agregar un espacio al numero para que éste no sea convertido a numero cientifico, pero esta solucion tenia como problema que los valores no se podia sumar o aplicar una formula sobre este.
ahora con la solucion que propongo si es posible agregar una formula de agregacion y que el resultado sea tambien un numero no cientifico.

TAN TAN.

martes, 23 de marzo de 2010

Leer Campo XML en SQL Server

Como podemos leer campo XML y filtrar por campos que estan dentro del XML

tenemos esta tabla




como ejemplo tenemos el siguiente XML:




para leer el campo XML de la tabla TabXML , en el campo XMLData, se hace de la siguiente forma

SELECT
ID,
D.C.value('@Nombre', 'Varchar(30)') as Nombre,
D.C.value('@Apellido', 'Varchar(30)') as Apellido,
D.C.value('@telefono', 'Varchar(10)') as Telefono,
D.C.value('@Email', 'Varchar(100)') as Email
FROM TabXML
CROSS APPLY XMLData.nodes('ROOT/VALORES') D(c) -- recuerda que XMLData es el nombre del campo donde esta el XML
WHERE D.c.value('@Nombre', 'varchar(30)') = 'Sergio'

este query mostrara el resultado , todas los registros en donde el nombre sea igual a 'Sergio'

ID Nombre Apellido Fono Email
1 Sergio Valenzuela 555444 Sergio.Valenzuela@engendro.cl
1 Sergio Apell2 555444 Sergio.Valenzuela@engendro.cl
1 Sergio Apell3 555444 Sergio.Valenzuela@engendro.cl

tambien es posible agregar campos de la tabla donde esta el campo XML
si existienran mas registros donde el campo Nombre del XML del campo XMLData sean 'Sergio', entonces mostrara mas registros.

/*************************************************************************

ejemplo Actualizado..... me confundí


DECLARE @TabXML TABLE (
ID INT,
DocXMLData XML
)
DECLARE @XML XML
SELECT @XML = '<ROOT><VALORES Nombre="Sergio" Apellido="Valenzuela" Fono="555444" Email="Sergio.Valenzuela@engendro.cl">
</VALORES>
<VALORES Nombre="Sergio" Apellido="Apell2" Fono="555444" Email="Sergio.Valenzuela@engendro.cl">
</VALORES>
<VALORES Nombre="Sergio" Apellido="Apell3" Fono="555444" Email="Sergio.Valenzuela@engendro.cl">
</VALORES>
<VALORES Nombre="Carlos" Apellido="Apell3" Fono="555444" Email="Sergio.Valenzuela@engendro.cl">
</VALORES>
</ROOT>'

INSERT INTO @TabXML
(
ID,
DocXMLData
)
VALUES
(
1,
@XML
)

SELECT tx.DocXMLData FROM @TabXML tx

SELECT --D.C.value(*)
ID,
D.C.value('@Nombre', 'Varchar(30)') as Nombre,
D.C.value('@Apellido', 'Varchar(30)') as Apellido,
D.C.value('@Fono', 'Varchar(10)') as Telefono,
D.C.value('@Email', 'Varchar(29)') as Email
FROM @TabXML
CROSS APPLY DocXMLData.nodes('ROOT/VALORES') D(c) -- recuerda que XMLData es el nombre del campo donde esta el XML
WHERE D.c.value('@Nombre', 'varchar(30)') = 'Sergio'


*************************************************************************/

PIVOT Dinamico SQL SERVER

Como podemos hacer un PIVOT dinamico en SQL Server??

Lo que vamos a hacer es crear un string que contenga la consulta que vamos a crear con la cantidad de valores que nosotros queramos en forma dinamica

me refiero si tenemos esto


para pivotear esto la documentacion dice que se debe hacer de la siguiente forma
link :
--------------------------------------
ejemplo link:
DaysToManufacture----AverageCost
0-----------------------------5.0885
1-----------------------------223.88
2-----------------------------359.1082
4-----------------------------949.4105

para pivotear

SELECT 'AverageCost' AS Cost_Sorted_By_Production_Days,
[0], [1], [2], [3], [4]
FROM
(SELECT DaysToManufacture, StandardCost
FROM Production.Product) AS SourceTable
PIVOT
(
AVG(StandardCost)
FOR DaysToManufacture IN ([0], [1], [2], [3], [4])
) AS PivotTable;


el resultado será

Cost_Sorted_By_Production_Days 0 1 2 3 4
AverageCost 5.0885 223.88 359.1082 NULL 949.4105

-----------------------------------------------------------

pero si se fijan ahi se debe incluir todos los valores de los dias, es decir que si existen 1000 dias se deben listar de 1 a 1000 días ([0], [1], [2], [3], [4]....[1000]), para hacer esto dinamico y si vemos que no solo pueden ser dias, sino, tipos de documentos, fechas, nombre, cuentas, etc, etc, recordar los nombre y escriibirlos uno a uno no es muy agradable entonces podemos hacer lo siguiente para crear dinamicamente el select que nos mostrará nuestro valores pivoteados tal como queremos.

continuando con mi ejemplo

el query que creará nuestro query es el siguiente:



DECLARE @Tipo VARCHAR(10) -- el largo 10 corresponde con el largo maximo del valor tipo que se pivoteara, si es mayor se debe aumentar
DECLARE @PVT VARCHAR(MAX)
DECLARE @PVT1 VARCHAR(MAX)
DECLARE @PVT2 VARCHAR(MAX)

SELECT @Tipo = MIN(Tipo) FROM TipoValor WHERE Tipo>'' -- select al menor tipo

SET @PVT1 = '' --en esta variable guardaremos los tipos entre comillas ''
SET @PVT2 = '' --en esta variable guardaremos los tipos entre corchetes []

--crearemos un ciclo para recorrer todos los tipos
WHILE NOT(@Tipo IS NULL)-- cuando se acaben los tipos de fechas
BEGIN
IF @PVT1 <> ''
SET @PVT1 = @PVT1 + ', '
SET @PVT1 = @PVT1+''''+@Tipo+'''' --tipos entre comillas

IF @PVT2 <> ''
SET @PVT2 = @PVT2 + ', '
SET @PVT2 = @PVT2+'['+@Tipo+']' --tipos entre corchetes

SELECT @Tipo = MIN(Tipo) FROM TipoValor WHERE Tipo > @Tipo --buscamos el siguente tipo de fechas mayor al anterior
END -- fin del ciclo

-- en la variable @PVT guadaremos como string el query del pivot
SELECT @PVT = 'SELECT Nombre,
'+@PVT2+ --tipos con corchetes
' FROM (SELECT
Nombre
Tipo,
Valor FROM
TipoValor WHERE
Tipo IN
( '+@PVT1+' )) as FEOC --tipos con comillas
PIVOT (MAX(Valor) -- el MAX es por si existe mas de un Tipo, se puede Sumar o agrgar cualquier funcion de agregacion
FOR Tipo IN (
'+@PVT2+' )) as P
GROUP BY
Nombre, '+@PVT2

SELECT @PVT -- Vemos el string donde esta el query del PIVOT completo

EXEC(@PVT) -- con el comando EXEC podemos ejecutar el string, que nos retornara el resultado que queremos


Todo esto nos deberia retornar los siguiente:



asi logramos agrupar por nombre, y pivoteamos el valor y los tipos, donde hay que notar el tipo T3 y que se repite para los nombre nom1 y nom3, donde podemos ver facilmente cuales típos y que valor tiene cada nombre

esta es la mejor opcion de mostrar la informacion, porque la otra opcion y que no es buena de mostrar es la siguiente

Select Nombre, Tipo, Valor from TipoValor order by Nombre

que mostrara algo asi como que no es lo optimo.

jueves, 10 de septiembre de 2009

Comando AT y Schtasks, crear o ejecutar tarea programada en otro equipo




Como podemos ejecutar una aplicacion en otra maquina?

Como podemos recargar nuestra aplicacion Qlikview en un equipo que no es nuestro(local)?

bueno, encontre estos dos comando que me solucionaron el problema

el primero AT:

AT nos permite crear, ver y borrar tareas programadas en un equipo remoto
por ejemplo

AT \\HOST HORA /interactive Comando(tarea) a ejecutar

AT \\192.168.1.2 12:00 /interactive "C:\Program Files\QlikView\Qv.exe" /r C:\QlikView\recarga.qvw"

AT: es el comando que permite agregar una tarea programada en otro equipo
si ejecutamos AT en la consola nos listara todas las tareas que se han agregado a la maquina local.
si ejecutamos AT \\HOST nos listara las tarea del HOST

\\HOST: es el nombre o IP de la maquina a la que queremos agregar la tarea programada

12:00: es la hora en que se ejecutara la tarea programada

/interactive: nos permite ver en primer plano la aplicacion o la tarea que se esta ejecutando, si omitimos este parametro se ejecutara en segundo plano.

"C:\Program Files\QlikView\Qv.exe" /r C:\QlikView\recarga.qvw": es la tarea que necesito que se ejecute, que en este caso es realizar la recarga de la aplicacion "recarga.qvw".

AT tiene algunos inconvenietes:
necesitas los permisos adecuados para poder agregar tareas en otra maquinas
cuando agrega una tarea el propietario de la tarea es el sistema y esto fue un gran problema, pues Qlikview tiene sus licencia por cada usuario del equipo, por lo que cuando intentaba hacer la recarga me pedia ingresar la licencia para el usuario del sistema.

Solucion?

finalmente el comando AT lo tuve que sustituir por el comando Schtasks que nos permite ejecutar en ese minuto una tarea programada en un equipo remoto.

significa que primero debemos crear en la maquina remota, con el usuario valido para qlikview, una tarea programada que no se debe ejecutar nunca por si solo, sino que cuando se le hace una llamada.
Con el comando Schtasks podemos realizar esto:

SCHTASKS /run /S \\192.168.1.2 /TN "Qv"

lo que ejecutara en el host 192.168.1.2 la tarea programada llamada "Qv"

/run: realiza la ejecucion de una tarea programada

/S \\HOST: indica que se ejecutara en ese host, si se omite se ejecutara en la maquina local

/tn "Qv": indica que se ejecutara la tarea programada llamada "Qv"

el comando SCHTASKS reemplazó al comando AT
ademas permite la ejecucion de una tarea programada /run, ademas de crear, borrar, terminar.

para mas info de este comando en SCHTASKS


para mas info de comando AT en AT

martes, 7 de julio de 2009

Archivo QVD - Qlikview

Los archivos QVD son archivos que almacenan datos que pueden ser de diferentes fuentes de datos, diferentes BD, archivos planos TXT, archivos Excel, etc.

Porqué utilizar archivos qvd?

-Son una forma de optimizar el tiempo de carga de los datos
-Permiten carga incremental
-Son recomendados por Qlikview (será una razón válida?)
-etc, ya se me ocurrirán

Cómo crear un archivo qvd?

en nuestro scrip :


//Nombre que le asignamos a la tabla
Nombre_Tabla:
//Permite carga desde la base de datos, permite las mismas intrucciones que se puedes
//realizar en la BD, notar que Antecede la palabra SQL antes de nuestro Select común
SQL SELECT *
FROM Nombe_Tabla_BD;

//Permite guardar la tabla antes cargada, notar que se debe indicar el nombre de la
//tabla que le asignamos a la tabla y no el nombre que tiene en la BD
STORE Nombre_Tabla
INTO Nombre_Archivo_QVD.qvd;
//es posible indicarle un directorio a esta ruta
//por ejemplo guardar en la carpeta ArchivosQVD
//INTO ArchivosQVD\Nombre_Archivo_QVD.qvd;


-La primer instrucción permite obtener datos desde nuestra Base de Datos
-La segunda guardar la tabla obtenida en un archivo QVD Nombre_Archivo_QVD.qvd

Como podemos invocar nuestro archivo QVD generado?

Desde cualquier aplicacion QVW podemos invocar desde nuestro Script de la siguiente froma:


Nombre_Tabla:
LOAD *
FROM Nombre_Archivo_QVD.qvd (QVD);


Notar que podemos volver a cambiar el nombre de la tabla asignado en nuestra nueva aplicacion QVW

Pero qué son realmente los archivo QVD?

Son archivos que en su estructura interna mantinene la forma de un archivo XML


<qvdtableheader>
<qvbuildno>#numero#</qvbuildno>
<creatordoc></creatordoc>
<createutctime>#fecha#</createutctime>
<sourcecreateutctime></sourcecreateutctime>
<sourcefileutctime></sourcefileutctime>
<sourcefilesize>-1</sourcefilesize>
<staleutctime></staleutctime>
<tablename>#nombre qvd#</tablename>
<fields>
<qvdfieldheader>
<fieldname>#titulo columna 1#</fieldname>
<bitoffset>#?#</bitoffset>
<bitwidth>#?#</bitwidth>
<bias>#?#</bias>
<numberformat>
<type>#Tipo#</type>
<ndec>#?#</ndec>
<usethou>#?#</usethou>
<fmt>#formato#</fmt>
<dec>,</dec>
<thou></thou>
</numberformat>
<noofsymbols>#numero de simbolo ?#</noofsymbols>
<offset>#?#</offset>
<length>#largo#</length>
</qvdfieldheader>

....
...
..
.
ETC




Pero si son archivos Qvd generados y mantiene la info en su interior,No tendremos la información actualizada?

Es uno de los inconvenientes de esta forma de utilizar los datos en nuestras aplicaciones.

Posible solución para tener datos(Archivos QVD) actualizados?

Solucion 1:
Crear una tarea programada en windows que nos actualice los datos, extrayendo automaticamente los datos de la Base de Datos a nuestro archivos QVD sin nuestra intervención por ejemplo todos los días en la mañana, para que todos los días podamos usar los datos completos al día de ayer.

Solucion 2:
Actualizar manualmente los archivos QVD, podremos usar los datos actulizados recientemente, pero si nuestros datos es una base de datos muy grande o se manejan instrucciones sobre funciones, vistas, procedimientos almacenados, triggers, u otra, nuestra carga puede tardar mucho tiempo (horas).

miércoles, 15 de abril de 2009

Qlikview - Habilitar o Deshabilitar Expresion en Tabla o Graficos

Si tenemos 10 Expresiones y queremos ver solo 1 o 4 o 8, etc a traves de una macro podemos habilitar o deshabilitar la expresion, lo que nos permite tener 1 tabla o grafico con distintas expresiones y asi no tenemos que crean n tablas o graficos segun las expresiones que deseamos ver.

para esto cree un campo INLINE en el script que se llama Expression

LOAD * INLINE [
Expression '->nombre campo
Expresion1
Expresion2
Expresion3

];

y le aplique en las propiedades de documento->macros->Field Event Triggers cuando OnLoad y OnChange la siguiente macro TypeExpr


sub TypeExpr
'obtengo los campos que deseo ver
set val=ActiveDocument.Fields("Expression").GetSelectedValues
'instancio el grafico o tabla que deseo habilita o deshabilitar las expresiones
set chart = ActiveDocument.GetSheetObject("CH15")
set cp = chart.GetProperties
'reviso cuales expresiones estan seleccionadas
a1=0
a2=0
a3=0
for i=0 to val.Count-1
if a1=0 then
if val.Item(i).Text="Expresion1" then
a1=1
end if
end if
if a2=0 then
if val.Item(i).Text="Expresion3" then
a2=1
end if
end if
if a3=0 then
if val.Item(i).Text="Expresion2" then
a3=1
end if
end if
next
'si la expresion1 esta seleccionada
if a1=1 then
set expr0 = cp.Expressions.Item(0).Item(0).Data.ExpressionData
expr0.Enable = true
else
set expr0 = cp.Expressions.Item(0).Item(0).Data.ExpressionData
expr0.Enable = false
end if
'si la expresion2 esta seleccionada
if a2=1 then
set expr1 = cp.Expressions.Item(1).Item(0).Data.ExpressionData
expr1.Enable = true
else
set expr1 = cp.Expressions.Item(1).Item(0).Data.ExpressionData
expr1.Enable = false
end if
'si la expresion3 esta seleccionada
if a3=1 then
set expr2 = cp.Expressions.Item(2).Item(0).Data.ExpressionData
expr2.Enable = true
else
set expr2 = cp.Expressions.Item(2).Item(0).Data.ExpressionData
expr2.Enable = false
end if

'habilito o deshabilito las expresiones seleccionada
chart.SetProperties cp

end sub

miércoles, 25 de febrero de 2009

Qlikview - Include para VBscript

Utilizando el Qlikview necesito unificar para muchos archivos qvw el mismo Modulo (donde se agregan las subrutinas y las funciones), por lo que tengo que crear un archivo vbs, donde tenga todo lo que requiero y desde los archivos qvw tengo que llamar, incluir o importar estas funciones.

En VBscript no existe una instrucción donde yo pueda incluir desde un archivo vbs otro vbs.

Si tenemos el archivo1.vbs que imprime un mensaje "Hello Word"


sub HolaMundo
msgbox("Hello Word")
end sub


y queremos llamar desde otro archivo vbs(Archivo2.vbs) este mensaje, no existe una funcion como la de php por ejemplo
include("nombre.php");


ahora, buscando en la web encontre una solución a esto, pero tenemos que crear una subrutina que lo simule.

entonces debemos hacer lo siguiente, tenemos nuestras funciones o subrutinas en

archivo1.vbs



sub holaMundo
msgbox("Hello World")
end sub


entonces debemos agregar en nuestro qrchivo2.vbs lo siguienre para poder utilizar las funciones o subrutinas de Archivo1.vbs.
archivo2.vbs

Import "C:\Archivo1.vbs"

Sub Import(ByVal strFile)
Set objFs = CreateObject("Scripting.FileSystemObject")
Set WshShell = CreateObject("WScript.Shell")
strFile = WshShell.ExpandEnvironmentStrings(strFile)
file = objFs.GetAbsolutePathName(strFile)
Set objFile = objFs.OpenTextFile(strFile)
strCode = objFile.ReadAll
objFile.Close
ExecuteGlobal(strCode)
End Sub



Como yo estoy aplicando esto a Qlikview, realizo lo siguiente

creo el archivo1.vbs con todas las funciones y subrutinas y desde los archivos qlikview(qvw) agrego en el módulo lo que se debe agregar en el archivo2.vbs y asi puedo modificar una funcion en el archivo1.vbs y cambiara en todos los archivos Qlikview (qvw).


Asi soluciono mi problema de modificar todos los archivos con las mismas funcionalidades cada vez que se hace un cambio.






fuente: asp free.com <-- aqui

martes, 20 de enero de 2009

QlikView - Seleccion y Creación de carpeta

Para Seleccionar y Crear una carpeta en el sistema es necesario ralizar lo siguiente

BrowseForFolder = ""
Dim objSHL
Set objSHL = CreateObject("Shell.Application")
Dim objB4F
On Error Resume Next
Set objB4F = objSHL.BrowseForFolder(&H0,sPMT,&H0031,&H0011)
BrowseForFolder = objB4F.Self.Path
if (not objB4F is nothing) then
Dim fso, fldr
Set fso = CreateObject("Scripting.FileSystemObject")
Set fldr = fso.CreateFolder(BrowseForFolder&"\NombreCarpeta")
'Aqui agregar codigo donde se hace algo
'dentro de la carpeta creada
'como por ejemplo exportar todos los objetos
'de una hoja como xml
For i = lBound(Objects) To uBound(Objects)
id = Objects(i).GetObjectId
Objects(i).WriteXmlPropertiesFile BrowseForFolder&"\NombreCarpeta\ObjBM"&i&".xml"
next
'Mensaje de finalización
MyValue= MsgBox ("Process Export is sucessfull in "&BrowseForFolder&"\NombreCarpeta\*",64,"Export")
end if

lunes, 19 de enero de 2009

QlikView - NetworkDays

La función NetworkDays sirve para evaluar fechas tomando en cuenta dias laborales, es decir, de lunes a viernes y se utiliza de la siguiente manera.

como expresión o dimensión (calculada)


networkdays(fechaInicio,FechaFinal)-1


es decir si tenemos las siguientes fechas.
Viernes: 16-01-2009 a Lunes: 19-01-2009

si obtenemos la diferencia real es

'19-01-2009'-'16-01-2009' = 3 días (Sábado, Domingo, Lunes)


pero con la función

networkdays('16-01-2009','19-01-2009')-1 = 1 día (Viernes a Lunes)


notar que se debe restar por -1 pues la función toma la diferencia con las fecha de incio y final inclusive.

miércoles, 14 de enero de 2009

QlikView - Carga Incremental




Qlikview es una herramienta de bussines intelligence, que no utiliza cubos OLAP, por lo que utiliza una nueva metodologia creada por ellos mismos llamada, AQL, descrita en post anterior de Qlikview que maneja finalmente la Nube de Datos (Cloud Data).

Esta nube de datos se debe recargar para actualizar la información y poder manejarla en la aplicación.
La carga simple, en casos donde se manejan grandes cantidades de información se puede demorar un tiempo considerable, por lo que existen tecnicas para reducir este tiempo de racarga y se llama "Carga Incremental".

Elementos necesarios para la recarga
- Archivos QVD.
- En la tabla de la base de datos un campo con la fecha de la ultima actualizacion.

un ejemplo para recarga incremental en el script es el siguiente:

Si se desea hacer la carga incremental de la tabla [NombreTabla], por campo [UltimaActualizacion]


Let FechaActual = now();
//fecha donde se hizo la ultima recarga
Let UltimaRecarga = ReloadTime();

[NombreTabla]:
//hasta aqui se cargaran los registros nuevos
//que fueron insertados y los modificados
SQL SELECT
*
FROM
[NombreTabla] as NT
WHERE
NT.[UltimaActualizacion] >= $(UltimaRecarga)
AND NT.[UltimaActualizacion] < $(FechaActual);
//aqui se uniran los registros nuevos con los
//previamente cargados en los archivos qvd
CONCATENATE
LOAD * FROM [NombreTabla].qvd (qvd)
WHERE NOT EXISTS( [ClavePrimaria] );
//finalmente se eliminaran los que ya no existen
INNER JOIN
SQL SELECT [ClavePrimaria]
FROM [NombreTabla]
//if no se producjo ningun error
if ScriptError = 0 then
//se guarda el archivo QVD con los datos actualizados
STORE [NombreTabla]
INTO [NombreTabla].qvd;
//se actualiza la fecha de la ultima recarga
Let UltimaRecarga = FechaActual;
end if

martes, 18 de noviembre de 2008

MediaWiki con MSSQL Server 2005

MediaWiki con MSSQL Server 2005

1.- Descargar mediawiki download

2.- Decompimimos el contenido de la carpeta dentro de nuestro Servidor Web
/var/www/wiki


3.- Ingresamos a través de la URL a nuestra wiki para comenzar la instalación
http://localhost/wiki/index.php



4.- Configuramos los parametros de nuestro Wiki

4.1- Primer Problema no encuentra el driver para manejar la base de datos



4.2 Solucion: en la carpeta db existe el arhivo DatabaseMssql.php
/var/www/wiki/include/db/DatabaseMssql.php

Se debe copiar a
/var/www/wiki/include/DatabaseMssql.php

es decir una carpeta más abajo y además cambiar en archivo
/var/www/wiki/config/index.php

$ourdb['mssql']['fullname'] = 'MSSQL';
$ourdb['mssql']['havedriver'] = 0;
$ourdb['mssql']['compile'] = 'mssql not ready'; # Change to 'mssql' after includes/DatabaseMssql.php added;
$ourdb['mssql']['bgcolor'] = '#ffc0cb';
$ourdb['mssql']['rootuser'] = 'administrator';

Por

$ourdb['mssql']['fullname'] = 'MSSQL';
$ourdb['mssql']['havedriver'] = 0;
$ourdb['mssql']['compile'] = 'mssql';
$ourdb['mssql']['bgcolor'] = '#ffc0cb';
$ourdb['mssql']['rootuser'] = 'administrator';


5.- Ahora completar el contenido del formulario luego de la verificación de entorno.



Continuará...

miércoles, 12 de marzo de 2008

QlikView 8




Qlikview 8 es una herramienta de Business Inteligent, creo el AQL que es la forma de relacionar la informacion, maneja una nube de datos(CLOUD DATA) que es donde carga la informacion que deseamos de diferentes fuentes de datos.

AQL maneja la informacion en memoria RAM, por lo que no necesita cubos OLAP para crear la muntidimensionalidad, sino crea los cubos dinamicamente en RAM.

CLOUD DATA la nube de datos es donde cargamos la informacion de las diferentes fuentes de datos, bases de datos, archivos diff, excel, txt, rtf.

Como crear una Funcion SQL SERVER 2005



Este es una funcion que he creado que sirve para retornar un periodo a partir del ingreso de una fecha.
ejemplo de uso:
dbo.funcDatePart('semester',Fecha)
dbo.funcDatePart('quarter',Fecha)
dbo.funcDatePart('year',Fecha)
dbo.funcDatePart('month',Fecha)


para esta funcion me apoyo en la funcion que trae por defecto sqlserver "datepart"
y agrego el periodo de semestres.

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
*nombre del esquema. nombre de la funcion
CREATE FUNCTION [dbo].[funcDatePart]
( *variable de entrada y tipo
@DateType varchar(10),
@Date Datetime
)
*tipo de variable que retornamos
RETURNS int
AS
BEGIN

DECLARE
*agregamos las variables que necesitemos para realizar la funcion
@Period int

SELECT @Period = (
CASE
WHEN @DateType = 'year' THEN datepart(year,@Date)
WHEN @DateType = 'month' THEN datepart(month,@Date)
WHEN @DateType = 'quarter' THEN datepart(quarter,@Date)
WHEN @DateType = 'semester' THEN
(CASE
WHEN datepart(month,@Date) between 1 and 6
THEN '1'
WHEN datepart(month,@Date) between 7 and 12
THEN '2'
END
)
ELSE
'0'
END)
*Retorno el valor
RETURN @Period

END

martes, 23 de octubre de 2007

Ubuntu 7.10 Gutsy Gibbon




Ya se lanzo la nueva version de Ubuntu 7.10 Gutsy Gibbon, el lanzamiento oficial segun el sitio oficial fue el 18 de Octubre de 2007, aqui le dejo la descarga del sitio oficial DESCARGA, ademas aprovecho de anotarles algunas de sus novedades

Trae incorporada por defecto el Bautizado Compiz Fusion, el Escritio grafico 3D

Kernel version 2.6.22

Ademas para los que poseen Laptop, trae una aplcacion que permite interactuar con mas de un monitor, es decir tu laptop mas la salida VGA que traen los Laptop. Ojo que es una aplicacion grafica se llama DisplayConfig

viernes, 10 de agosto de 2007

Restaurar Grub

Restauracion simple de Grub luego de "echartelo" por casualidad o de instalar windows despues de Linux

1. iniciamos el computador booteado con un live-cd de linux
2. iniciamos la consola como root
3. montamos nuestra paricion linux, directorio raiz "/"
3.1 creamos un directorio donde montarlo
root@nodo-laptop:~# mkdir /mnt/linux
3.2buscamos cual es nuestra particion linux
root@nodo-laptop:~# fdisk -l
3.3 montamos la particion (ext3 tipo de fichero, sda3 MI particion)
root@nodo-laptop:~# mount -t ext3 /dev/sda3 /mnt/linux
3.4 cambiamos al direcotrio raiz que montamos
root@nodo-laptop:~# chroot /mnt/linux
4. iniciamos la consola grub
root@nodo-laptop:~# grub
4.1 se debe ver algo asi
[ Minimal BASH-like line editing is supported. For
the first word, TAB lists possible command
completions. Anywhere else TAB lists the possible
completions of a device/filename. ]

grub>

5. buscamos cual es la particion con la que debe iniciar el grub
grub> find /boot/grub/stage1
5.1 el resultado debe ser algo asi
(hd0,2)
6. configuramos esa particion de inicio
grub> root (hd0,2)
7. configuramos el inicio
grub> setup (hd0)
8. salmos de consola grub
grub> quit
9. reiniciamos y listo aparece nuestro grub como gestor de arranque....


saludos a todos

Fuente:
blog primerashuellaslinux