SAP compro Sybase por 5.8 Billones de Dolares
16:34, Posted by Gustavo Monaco, No Comment
Link para referenciar un reporte desde un formulario
18:58, Posted by Gustavo Monaco, 3 Comments
Para referenciar un reporte desde una aplicación o página web, solo es necesario colocar este código en C# dentro del evento de click de un link o de un boton.
string script;
script = "window.open('http://192.168.x.x/ReportServer/Pages/ReportViewer.aspx?/Carpeta/NombreReporte&rc:parameters=False¶metro1=" + control1.SelectedValue + "¶metro2=" + control2.text + " ','popup','height=650,width=1000,hotkeys=no,menubar=no,resizable=yes, scrollbars=yes,status=yes,screenX=50,screenY=50,left=50,top=50');";
Page.ClientScript.RegisterStartupScript(e.GetType(), "window", script, true);
Si quieren mejorarlo un poquito, en el caso de un sistema o pagina web donde el servidor de reportes esta hospedado en el mismo server que el website, podemos obtener la direccion ip del server de esta forma, y asi no preocuparnos si su ip cambia:
string cUrl;
cUrl = Request.Url.GetLeftPart(UriPartial.Authority).ToString();
script = "window.open('" + cUrl + "/ReportServer/Pages/ReportViewer.aspx?/Carpeta/NombreReporte&rc:parameters=False¶metro1=" + control1.SelectedValue + "¶metro2=" + control2.text + " ','popup','height=650,width=1000,hotkeys=no,menubar=no,resizable=yes, scrollbars=yes,status=yes,screenX=50,screenY=50,left=50,top=50');";
Page.ClientScript.RegisterStartupScript(e.GetType(), "window", script, true);
Cualquier pregunta, escribanla en los comentarios o mandenme un correo.Espero les sirva este post!
Actualización: el usuario "Libros del Mono" en comentarios mejoro el código
Solo una observación, cambia
Page.ClientScript.RegisterStartupScript(e.GetType(), "window", script, true);
por
ScriptManager.RegisterStartupScript(ScriptManager1, GetType(), "ShowMsg", script, True);
en aplicaciones que usen controles AJAX es mejor hacer uso del ScriptManager para ejecutar eventos de JS en páginas .aspx
Gracias a Libros del Mono por su aporte
Indices y sus diferencias
5:47, Posted by Gustavo Monaco, No Comment
Recientemente en un curso de desarrollo de base de datos (2778A), dirigido a un par de DBA con mas de 5 años de experiencia con SQL (ella con 13 años y el con 4 años de experiencia...), les pregunte sobre el performance de los Indices y si conocian sus diferencias y aplicaciones, a lo que respondieron: "Si, los indices mejoran el performance, pero no sabemos como. y ¿existen varios tipos de indices?". Lo cual me llevo a darles una explicacion y crear este nuevo post.
Primero, un indice de base de datos es una estructura de datos que mejora la velocidad en operaciones de tablas (SELECT, UPDATE, DELETE, INSERT). En Microsoft SQL Server se manejan 2 tipos de indices: los CLUSTERED INDEX y los NONCLUSTERED INDEX. Un Clustered Index se refiere a un indice agrupado o fisico, como si de un diccionario se tratara, los datos se encuentran ordenados fisicamente en el disco por el criterio escogido, el cual generalmente es la clave primaria. Estos indices son los mas rapidos al momento de una busqueda, debido a que no solo estan ordenados fisicamente por una o varias columnas, sino que su valor es unico por cada registro. Por otra parte, los NonClustered Index son indices no agrupados, es decir, no ordenan fisicamente los datos. Por otra parte, se asemejan al apendice de un libro, donde se encuentran palabras o conceptos con su ubicacion en el libro, ya sea pagina, parrafo, linea, caracter... etc. Estos indices no agrupados, contienen su informacion en paginas separadas a los datos, las cuales son usadas al momento de la busqueda para ubicar los registros solicitados.
Luego completo la información con otro post.
Trigger DML - Definicion y notas importantes
22:53, Posted by Gustavo Monaco, No Comment
Pueden sonar similar, pero Tigger y Trigger distan mucho uno del otro. Aunque buscando similitudes, encontramos que ambos responden rápidamente ante estímulos exteriores.
Un trigger o desencadenador, es un objeto de la base de datos que se ejecuta o es desencadenado por un evento. Existen triggers DML (Data Manipulation Language) y DDL (Data Definition Language). En este artículo hablaremos de los Triggers DML.
Al hablar de DML, hablamos de eventos basados en la manipulación de datos, como lo que sucede cuando hacemos un INSERT, DELETE o UPDATE. La excelente funcionalidad que podemos encontrar en un trigger, es la capacidad de ejecutar scripts al suceder un evento en una tabla. Olvide mencionar que los triggers DML están atados a una tabla o vista.
CREATE TRIGGER trigger_name
ON table_name
AFTER INSERT
AS
BEGIN
SELECT B.Name + ' (' + C.FirstName + ' ' + C.LastName + ')' AS CreadoPor
FROM INSERTED A INNER JOIN [User] B ON (A.CreatedBy = B.UserId)
INNER JOIN Person C ON (B.PersonId=C.PersonId)
END
Como pueden ver en el ejemplo de código, se define un nombre para el trigger, luego se especifica la tabla sobre la cual va a actuar y se le especifica el evento. Hay dos tipos de eventos: AFTER (después) e INSTEAD OF (en vez de) y hay tres eventos INSERT (insertar), DELETE (borrar) y UPDATE (actualizar). Por lo tanto, podemos efectuar combinaciones dependiendo de nuestras necesidades como: AFTER INSERT, AFTER DELETE,INSTEAD OF INSERT, etc.
Ahora bien, si seguimos analizando el código, se puede observar que se está examinando la tabla INSERTED, la cual posee los registros que han sido insertados, es decir que no necesariamente posee la misma estructura de datos que la tabla principal. Por ejemplo, si se inserta un registro de 3 columnas en una tabla de 5 columnas, en INSERTED encontraremos solo las columnas insertadas. Esto no se puede apreciar muy bien cuando se crea un nuevo registro, sin embargo, es totalmente visible cuando hacemos una actualización. Verán que cuando se trata de un UPDATE, lo que realmente sucede es un DELETE y luego un INSERT, por lo que podemos sacar provecho de la tabla de INSERTED y la de DELETED. Como verán no existe una UPDATED.
Por lo tanto, al momento de trabajar con el evento de UPDATE, se puede trabajar con las tablas de DELETED e INSERTED simultáneamente, otorgando así, una capacidad increíble de Manipulación de Datos.
En un próximo post, conversaremos sobre los Trigger DDL. Gracias.
Recuperar datos de particiones perdidas o respaldando una particion completa con .dd (Dataset Definition)
12:02, Posted by Gustavo Monaco, One Comment
La razon de este articulo, es una serie de respaldos mal gestionados y formateos de maquinas sin pensar en todas las consecuencias, lo cual me llevo a aprender algo de informática forense y como funcionan los respaldos.
La idea sería analizar el disco con un programa como TestDisk, el cual te permite hacer una imagen de una particion, copiando a bajo nivel. Esta imagen la puedes guardar en cualquier parte, siempre evitando no tocar el sector del disco al que le estas tomando la imagen, claro...
TestDisk genera un archivo llamado image.dd, el cual no esta comprimido ni nada, es simplemente un Ctrl+C y Ctrl+V. Sim embargo, no se puede montar como caulquier .iso porque no todos los programas de imagenes lo soportan, asi que recomiendo MountImage Pro. Con este software, es posible montar la imagen como si fuera otro disco duro y explorar el archivo .dd como si fuera un volumen cualquiera.
No lo he probado con formateos a bajo nivel, supongo que no funciona, pero con formateos comunes, funciona perfectamente.
Nota Importante: mientras se hace una imagen a bajo nivel, NUNCA escribir en disco sobre el mismo sector al cual se le hace la imagen... no estoy seguro que sucede, pero tan facil que se cuelga y al reiniciar, no inicia.
Voy a seguir investigando al respecto, debido a que soy algo torpe y ya me ha tocado estudiar bastante con mis torpezas.
Gracias.
Matar los procesos de una Base de Datos en especial
21:56, Posted by Gustavo Monaco, No Comment
No se si a ustedes, pero personalmente, en varias ocaciones me ha sucedido que no puedo efectuar una tarea de "Restore" o alguna otra porque la base de datos esta en uso. Con este pequeño script es mas que suficiente para matar a todos esos procesos que impiden tu buena Administracion de la Base de Datos.
--------------------------------------------------------------------------
DECLARE @sql VARCHAR(MAX)
SET @sql = ''
SELECT @sql = @sql + 'KILL ' + CAST(spid AS VARCHAR(10)) + '; '
FROM master.dbo.sysprocesses
WHERE DB_NAME(DBID) = 'Database_name'
EXEC (@sql)
--------------------------------------------------------------------------
Note que Database_name significa el nombre de la base de datos que deseas dejar sin procesos =]
