Buscar

viernes, 10 de junio de 2011

Buscar texto en un Store Procedure (SP) de SQL

Este script lo realicé para buscar un texto dentro de la definición de un store procedure (sp) y nos lista los nombres de los Sp que contienen esa palabra

hay que cambiar el texto a buscar en la parte

set @PalabraABuscar = 'Texto a buscar'

Espero lo disfruten :)

------Comienza código --------

SET NOCOUNT ON
DECLARE @PalabraABuscar nvarchar(500)
DECLARE @Encontrado int
DECLARE @Nombre nvarchar(100)
DECLARE @Id int

CREATE TABLE #Tmp_Encontrados(
Nombre nvarchar(500) NULL,
pos int null)

set @PalabraABuscar = 'Texto a buscar'


DECLARE Cursor_Objeto CURSOR FOR
SELECT object_id,name FROM sys.objects WHERE type in (N'P', N'PC')

OPEN Cursor_Objeto;

FETCH NEXT FROM Cursor_Objeto
INTO @Id, @Nombre;

WHILE @@FETCH_STATUS = 0
BEGIN
set @Encontrado=0

SELECT @Encontrado= charindex(@PalabraABuscar,smsp.definition)
FROM
sys.all_objects AS sp
LEFT OUTER JOIN sys.database_principals AS ssp ON ssp.principal_id = ISNULL(sp.principal_id, (OBJECTPROPERTY(sp.object_id, 'OwnerId')))
LEFT OUTER JOIN sys.sql_modules AS smsp ON smsp.object_id = sp.object_id
LEFT OUTER JOIN sys.system_sql_modules AS ssmsp ON ssmsp.object_id = sp.object_id
LEFT OUTER JOIN sys.assembly_modules AS amsp ON amsp.object_id = sp.object_id
LEFT OUTER JOIN sys.assemblies AS asmblsp ON asmblsp.assembly_id = amsp.assembly_id
LEFT OUTER JOIN sys.procedures AS spp ON spp.object_id = sp.object_id
WHERE sp.name=@Nombre

IF @Encontrado > 0
BEGIN
INSERT INTO #Tmp_Encontrados VALUES(@Nombre,@Encontrado)
END

FETCH NEXT FROM Cursor_Objeto
INTO @Id, @Nombre;
END
CLOSE Cursor_Objeto;
DEALLOCATE Cursor_Objeto;


SET NOCOUNT OFF
SELECT * FROM #Tmp_Encontrados
DROP TABLE #Tmp_Encontrados

----Termina Código -------

viernes, 12 de marzo de 2010

Cambiar reslucion a una imagen en C#

He tenido algunos problemas cuando intento insertar imágenes en crystal report que tienen una resolución mayor a 100 ppp, por lo tanto este código lee la imagen y la convierte a una resolución de 100 ppp para poderla usar en los reportes del Crystal:

public static byte[] imageToByteArray(string Ruta)
        {
            try
            {
                Image imageIn = Image.FromFile(Ruta);
                MemoryStream ms = new MemoryStream();


                Bitmap bmPhoto = new Bitmap(imageIn);
                bmPhoto.SetResolution(100, 100);
                bmPhoto.Save(ms, imageIn.RawFormat);

                return ms.ToArray();
            }
            catch
            {
                return new byte[0]; 
            }
        }
Este es el enlace a la forma como lo hacia antes.

Saber cual es la impresora por defecto c#

Este código busca la impresora por defecto en el sistema y devuelve el nombre, para que lo podamos utilizar desde Cristal Report o desde cualquier reporteador

!-- code formatted by http://manoli.net/csharpformat/ -->
public static string  GetImpresoraDefecto()
        {
         for (int i = 0; i < PrinterSettings.InstalledPrinters.Count; i++)
            {
                PrinterSettings a = new PrinterSettings();
                a.PrinterName = PrinterSettings.InstalledPrinters[i].ToString();
                if (a.IsDefaultPrinter)
                {
                   return   PrinterSettings.InstalledPrinters[i].ToString();

                }
            }
            return "";
        }
desde Cristal Report se utiliza de la siguinte manera:

rpt.PrintOptions.PrinterName = GetImpresoraDefecto();

espacio de nombres:
using System.Drawing.Printing;

Exportar DataTable a Excel

Este código sirve para guardar un DataTable en un Excel, yo lo utilizo para agregar la función de exportar a Excel en la aplicaciones donde utilizo Grids, ya que utilizo una versión del TDBGrid que no le funciona bien el exportar a.


public static void  ExportarExcelDataTable(DataTable dt,string RutaExcel)
        {
            const string FIELDSEPARATOR = "\t"; 
            const string ROWSEPARATOR = "\n";
            StringBuilder output = new StringBuilder();     
            // Escribir encabezados    
            foreach (DataColumn dc in dt.Columns)    
            {        
                output.Append(dc.ColumnName);
                output.Append(FIELDSEPARATOR);    
            }
            output.Append(ROWSEPARATOR); 
            foreach (DataRow item in dt.Rows)    
            {        
                foreach (object value in item.ItemArray)        
                {            
                    output.Append(value.ToString().Replace('\n',' ').Replace('\r',' ').Replace('.',','));            
                    output.Append(FIELDSEPARATOR);        
                }       
                // Escribir una línea de registro        
                output.Append(ROWSEPARATOR);    
            }   
            // Valor de retorno    
           // output.ToString();
            StreamWriter sw = new StreamWriter(RutaExcel);
            sw.Write(output.ToString()); 
            sw.Close();
        }

miércoles, 2 de diciembre de 2009

Comprimir archivos en .NET (Zip o UnZip)

Muchas veces he necesitado comprimir archivos desde mi aplicación, y lo hacia con una clase que hace tiempo encontré en la red, hoy buscando un componente me encuentro con esta pagina que ofrece un componente para comprimir y descomprimir archivos, tiene varios ejemplos en diferentes lenguajes y la verdad lo veo muy completo y muy fácil de usar y fuera de eso es gratis (Ms-PL)

Link:
DotNetZip Library

lunes, 30 de noviembre de 2009

Eval en C#

Cuando trabajaba con vb había una función llamada Eval, que a mi parecer era muy útil; cuando empecé a trabajar con c# note que esta función no existía en este lenguaje, entonces me puse a la tarea de buscar algo parecido en c# y esto fue lo que encontré, en este link
http://weblogs.asp.net/datagridgirl/archive/2004/04/19/115900.aspx


public static string Eval(string Text)
{
//http://weblogs.asp.net/datagridgirl/archive/2004/04/19/115900.aspx Microsoft.JScript.Vsa.VsaEngine myEngine = Microsoft.JScript.Vsa.VsaEngine.CreateEngine();
return Microsoft.JScript.Eval.JScriptEvaluate(Text, myEngine).ToString(); ;
}


Lo que hace la funcion es recibir un string y lo evalua devoliendo el resultado ejemplo Eval(“56+60”) devuleve 116
Espacio de nombres

Microsoft.JScript.Vsa.VsaEngine

Espero les sea de utilidad

martes, 30 de junio de 2009

Ocultar un Tab (TabPage) en C#

Hace un tiempo me pusieron la tarea de ocultar una pestaña de un tab (un TabPage) cuando deschequiaran o mostrarlo cuando chequiaran un chekBox; entonces fue cuando me di cuenta que la propiedad Hide no sirve para nada. Y me puse a buscar como hacer esto, di con la pagina de Microsoft donde en la parte de comentarios dice “el método Hide de TabPage no ocultará la ficha. Para ocultar la ficha, debe quitar el control TabPage de la colección TabControl.TabPages”.
Asi que está es la forma como se oculta un Tab de un control Tab en C#:

if(chkimpresion.Cheked)
{
tabControl1.TabPages.Add(Impresion);//Impresión es el nombre que le dí al tab cuando lo cree. Y aquí lo muestro.
}
else
{
tabControl1.TabPages.Remove(Impresion);//Aquí se oculta.
}

Link
http://msdn.microsoft.com/es-es/library/system.windows.forms.tabpage(VS.80).aspx

Espero les sirva.

lunes, 8 de junio de 2009

Saber que usuario ingresa, borra o actualiza registros en sql (Auditoria en Sql SUSER_SNAME())

Muchas veces necesitamos saber el nombre de inicio de sesión de la persona que esta ejecutando una consulta de insert, update o delete en SQL, ya sea para hacer auditorias o para validar accesos a nuestras aplicaciones para obtener este inicio de sesión simplemente utilizamos el comando SUSER_SNAME(), un ejemplo de su uso es cuando queremos hacer tablas de auditoria, ósea saber quien ingresa, borra, o actualiza registros en una tabla especifica.
Yo lo hago con un trigger de la siguiente manera:

CREATE TRIGGER [NombreTrigger]
ON Tabla
after insert
AS
Insert Into TablaAuditoria(Campo1,Campo2,Campo3,Usuario,Fecha)
Select Campo1,Campo2,Campo3, SUSER_SNAME(),getdate()
From Tabla

Con este trigger logro tener un registro de quien ingreso un registro a mi tabla y a que horas
Espero les sea útil

viernes, 22 de mayo de 2009

Recibir o leer correos por c# .net mediante pop3

Este resumen no está disponible. Haz clic en este enlace para ver la entrada.

martes, 12 de mayo de 2009

Imprimir en la impresora por defecto un reporte de Crystal Report en C#

Este código busca la impresora por defecto del equipo, y se la asigna a un reporte, para imprimirlo, sin necesidad de mostrar el reporte, ni de mostrar el cuadro de dialogo de impresión.

public void Imprimir()
{
string NombreImpresora = "";//Donde guardare el nombre de la impresora por defecto

//Busco la impresora por defecto
for (int i = 0; i < PrinterSettings.InstalledPrinters.Count; i++)
{
PrinterSettings a = new PrinterSettings();
a.PrinterName = PrinterSettings.InstalledPrinters[i].ToString();
if (a.IsDefaultPrinter)
{
NombreImpresora = PrinterSettings.InstalledPrinters[i].ToString();

}
}


rptReporte rpt = new rptReporte ();// Instancio el reporte


rpt.SetDataSource(Dt);//Asigno la fuente de datos a mi reporte.
rpt.PrintOptions.PrinterName =NombreImpresora; );//Asigno la impresora
rpt.PrintToPrinter(2, false, 0, 0); );//Imprimo 2 copias
}


Si necesitamos imprimir el reporte en una impresora especifica, simplemente asignamos el nombre de la impresora al reporte

rpt.PrintOptions.PrinterName =”ElNombreImpresora”;


Nombre de espacios utilizados

using System.Drawing.Printing;

lunes, 4 de mayo de 2009

Enviar email c# (outlook), con archivo adjunto

Esta funcion envia un correo desde c#, y adjunta un archivo, lo he probado con gmail y desde un servidor de correo empresarial, espero les sirva.

librerias


using System.Net;
using System.Net.Mail;
using System.Net.Mime;



class clsMail
{


public static bool Enviar()
{
//Ruta de archivo adjunto (Si lo lleva)
string PathFile = @"Z:\archivo.rar";

//Creo el mensaje del mail.
System.Net.Mail.MailMessage msg = new System.Net.Mail.MailMessage();

//Agrego los destinatarios, pueden ir varios
msg.To.Add("Paraquienvaelcorreo@empresa.com.co");

//Agrego la direccion del que manda el email, puede ser falsa o verdadera, pero si es falsa puede que el servidor de correo lo detecte como spam, tambien depende de las credenciales que se ponen mas abajo
msg.From = new MailAddress("jaas.jaas@gmail.com", "Jaas", System.Text.Encoding.UTF8);

//Pongo el asunto
msg.Subject = "Asunto" ;

//El tipo de codificacion del Asunto
msg.SubjectEncoding = System.Text.Encoding.UTF8;

//Escribo el mensaje Y su codificacion
msg.Body = "Mensaje del correo";
msg.BodyEncoding = System.Text.Encoding.UTF8;

//Especifico si va ha ser interpertado con HTML
msg.IsBodyHtml = false;

//Agrego el archivo que puse en la ruta anterior "PathFile", y su tipo.
Attachment Data = new Attachment(PathFile, MediaTypeNames.Application.Zip );

//Obtengo las propiedades del archivo.
ContentDisposition disposition = Data.ContentDisposition;
disposition.CreationDate = System.IO.File.GetCreationTime(PathFile);
disposition.ModificationDate = System.IO.File.GetLastWriteTime(PathFile);
disposition.ReadDate = System.IO.File.GetLastAccessTime(PathFile);
//Agrego el archivo al mensaje
msg.Attachments.Add(Data);

//Creo un objeto de tipo cliente de correo (Por donde se enviara el correo)
SmtpClient client = new SmtpClient();

//Si no voy a usar credenciales pongo false, Pero la mayoria de servidores exigen las credenciales para evitar el spam
//client.UseDefaultCredentials = false;

//Como voy a utilizar credenciales las pongo
client.Credentials = new System.Net.NetworkCredential("jaas.jaas@gmail.com", "Password");
//Si fuera gmail seria 587 el puerto, si es un servidor outlook casi siempre el puerto 25, yo utilizo un servidor propio de correo
//client.Port = 587;
client.Port = 25;

//identifico el cliente que voy a utilizar
client.Host = "Miservidor.com.co";

//Si fuera a utilizar gmail esto deberia ir en true, esto es un certificado de seguridad
//client.EnableSsl = true;
client.EnableSsl = false;


try
{
//Envio el mensaje
client.Send(msg);
return true;
}
catch (System.Net.Mail.SmtpException ex)
{
return false;
}
}

}

miércoles, 22 de abril de 2009

Guardar fecha sin hora SQL

Muchas veces necesitamos guardar la fecha sin hora en una base de sql, el problema surge cuando utilizamos la función
 GETDATE () 
que nos devuelve la fecha y la hora o cuando nuestra aplicación envía la fecha con la hora, una forma de corregir esto es utilizar la función
 CONVERT 
de esta forma

set dateformat dmy;
select CONVERT (datetime,CONVERT(VARCHAR,GETDATE(),101),101)

Esto lo que hace es convertir la fecha a un texto con un formato sin hora y después vuelvo y lo convierto a un dato de tipo fecha por si necesito realizar operaciones con este dato.

martes, 21 de abril de 2009

Crear una sola instancia de un formulario en c#

Crear una sola instancia de un formulario en c#

Este código me lo encontré en una página, no me acuerdo cual, y me ha sido muy útil, su función es permitir solo una instancia del formulario abierta. Entonces si ya tenemos abierto un formulario, y lo volvemos a tratar de abrir, el mostrara el primer formulario abierto, en ves de crear una nueva instancia.

Uso:
Este código se debe copiar en cada formulario, que se desee dotar de esta funcionalidad
Y se reemplaza
Formulario
por el nombre de la clase del formulario.
private static Formulario m_FormDefInstance;
/// 
/// Crea una instancia unica del Formulario
/// 
/// Instancia por defecto
public static Formulario DefInstance
{
get
{
if (m_FormDefInstance == null  || m_FormDefInstance.IsDisposed)
m_FormDefInstance = new Formulario ();
return m_FormDefInstance;
}
set
{
m_FormDefInstance = value;
}
}

Para abrir el formulario se utiliza:

Formulario.DefInstance.Show();

lunes, 20 de abril de 2009

Redondeo por múltiplos(Excel, Sql)

En Excel existe una función para redondear por múltiplos, la función es MROUND(N;m), donde redondea n a el múltiplo de m mas cercano. Eso si tenemos el Análisis Toolpack., si no se puede utilizar la siguiente función
REDONDEAR(N/m;0)*m.
Ejemplo :
MROUND(5,3)
Resultado:
6

Esto es una función que hace lo mismo pero en SQL:
Uso:

select dbo.RoundMult(5,3)


CREATE FUNCTION [dbo].[RoundMult] (@Valor numeric(18,2),@Multiplo Numeric(18,2))
RETURNS nvarchar(50)
WITH EXECUTE AS CALLER
AS
BEGIN

declare @Residuo numeric(18,0)
DECLARE @ValASumar numeric(18,0)

set @Residuo=@Valor%@Multiplo

IF @Residuo=0
BEGIN
return @Valor
END
ELSE
set @ValASumar= @Multiplo-@Residuo
return @Valor+@ValASumar
END

Formatear texto SQL (Poner letra inicial en mayuscula)

Esta función sql muestra como poner la primera letra de cada palabra en mayúscula de un registro de nuestra base de datos, es muy útil, cuando los usuarios, ingresan los datos de manera desorganizada.

Uso:
Select [dbo].InitCap('TEXTO A FORMATEAR')
Resultado:
Texto A Formatear


CREATE FUNCTION [dbo].[InitCap] ( @InputString nvarchar(255) )
RETURNS NVARCHAR(255)
AS
BEGIN
DECLARE @Index INT
DECLARE @Char CHAR(1)
DECLARE @PrevChar CHAR(1)
DECLARE @OutputString NVARCHAR(255)
SET @OutputString = LOWER(@InputString)
SET @Index = 1
WHILE @Index <= LEN(@InputString) BEGIN SET @Char = SUBSTRING(@InputString, @Index, 1) SET @PrevChar = CASE WHEN @Index = 1 THEN ' ' ELSE SUBSTRING(@InputString, @Index - 1, 1) END IF @PrevChar IN (' ', ';', ':', '!', '?', ',', '.', '_', '-', '/', '&', '''', '(') BEGIN IF @PrevChar != '''' OR UPPER(@Char) != 'S' SET @OutputString = STUFF(@OutputString, @Index, 1, UPPER(@Char)) END SET @Index = @Index + 1 END RETURN @OutputString END

viernes, 17 de abril de 2009

Insertar imágenes dinámicamente en Cristal Report con C# 2005

Insertar imágenes dinámicamente en Cristal Report
Muchas veces tenemos que insertar imágenes ennuestros reportes dependiendo el registro que estemos mostrando, una forma queme a funcionado muy bien es la siguiente.
Cuando diseñemos el reporte debemos insertar un campo de tipo System.Byte[] en el DataTable utilizadopara el diseño de nuestro reporte, en este campo meteremos la imagen entiempo de ejecución.


Este campo se inserta en el reporte y será dondemostraremos la imagen.



Para mostrar el reporte utilizamos lo siguiente, para llenarel campo creado.

public void CargarReporte()
{
DataTable Dt = new
DataTable();//Creo un DataTable que sera la fuente de datos de mi reporte.
Dt=clsOrdenTerceros.Get_InfoParaOrdenImpresa(NumOrden);//Lleno el DataTable

rptOrdenSalidaTercero rpt = new rptOrdenSalidaTercero();// instancio el reporte

Dt.Columns.Add("Ruta11",System.Type.GetType("System.Byte[]"));//Agrego la columna con el tipo de dato "System.Byte[]",donde guardare mi imagen.

Dt.Rows[0]["Ruta11"] = CargarImagen("C:\foto.jpg"));//Cargo La imagen

rpt.SetDataSource(Dt);//Asigno la fuente de datos a mi reporte.
}

Y esta es la función que carga la imagen.


public static Byte[]CargarImagen(string rutaArchivo)
{


if (rutaArchivo != "")
{

try
{

FileStream Archivo = new FileStream(rutaArchivo, FileMode.Open);//Creo el archivo
BinaryReader binRead = new BinaryReader(Archivo);//Cargo el Archivo en modo binario

Byte[] imagenEnBytes = new Byte[(Int64)Archivo.Length]; //Creo un Array de Bytes donde guardare la imagen

binRead.Read(imagenEnBytes,0, (int)Archivo.Length);//Cargo la imagen en el array de Bytes
binRead.Close();

Archivo.Close();

return imagenEnBytes;//Devuelvo la imagen convertida en un array de bytes

}


catch
{
return new Byte[0];
}

}

return new byte[0];

}



Espacio de nombre Usados


using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization;

lunes, 5 de enero de 2009

Eventos en Graficas (Chart) del producto DotNetCharting

Eventos en Graficas (Chart) del producto DotNetCharting

Este código permite capturar eventos como el onMouse y el clic en los chart creados
con donetcharting, para poder interactuar con las graficas creadas.


private void chart1_MouseMove(object sender, MouseEventArgs e)
{

HitTestInfo hit = this.chart1.HitTest(); // Aqui se optiene el ultimo evento ejecutado en el chart

if (hit.Object is Element) //Miro si es un elemento (Una sección de la barra en el chart)
{
Element el = (Element)hit.Object; //Creo un elemento para poder acceder a las propiedades de ese elemento y poder tomar decisiones

int pos1 = 0;

//Acceso a las propiedades del elemento seccionado para tomar dediciones
pos1 = el.ToolTip.IndexOf("Orden Produccion");
string Cod = el.ToolTip.Substring(8, pos1 - 9);

Codigo del evento……
}
}


El evento principal de este codigo es HitTestInfo hit = this.chart1.HitTest();

Que es donde se registra todos los eventos en todas las partes del chart (Solo queda
el ultimo evento); Este se puede utilizar en cualquier evento del Chart

Espacios Utilizados

using dotnetCHARTING.WinForms;

jueves, 26 de junio de 2008

Leer y modificar un XML desde C# .NET

Este código muestra una forma fácil de leer y modificar un
archivo XML desde .NET , utilizando un DataSet.

Espacio de nombres “System.Data”

Archivo XML (Config.xml)
-----------------------------------------------------------
<?xml version="1.0" standalone="yes"?>
<config>
<asesor>
<cedula>123456</cedula>
<email>jaas.jaas@gmail.com</email>
</asesor>
</config>

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

Código:

using System.Data;

public
static void LeerYModificarXML()
{
/*********Para leer un valor*********************/

DataSet ds = new DataSet();//Se crea un dataset
ds.ReadXml("Config.xml");//Dirección del archivo xml
string Valor = ds.Tables["asesor"].Rows[0]["cedula"].ToString(); //Leemos el primer valor (Rows[0])

/*******Para Guardar un valor*******************/

ds.Tables["asesor"].Rows[0]["cedula"] = Valor; // Modificar un valor
ds.WriteXml("Config.xml"); // Guardamos las modificaciones

}

Copiar hojas de Excel con macros (VBA)

Este código copia una hoja de Excel a otro documento de Excel.
Este código nos resulto muy útil, cuando teníamos que generar reportes en Excel con macros, nosotros generábamos el reporte y copiábamos las hojas en otro Excel para que el usuario trabajara con el

Sub CopiarHoja(Hoja As Integer)
Dim AppExceldestino As Object
Set AppExceldestino = New Excel.Application
AppExceldestino.Workbooks.Add
AppExceldestino.Workbooks(1).Activate
Dim i As Integer
Application.CutCopyMode = False
For i = 1 To Hoja
ActiveWorkbook.Sheets(i).Activate
AppExceldestino.Sheets(i).Select
ActiveWorkbook.ActiveSheet.Range("A1:A1").Select 'se para en la primera fila
ActiveWorkbook.ActiveSheet.Range("A1:U65").Select 'se selecciona el rango de la hoja a copiar
ActiveWorkbook.ActiveSheet.Application.CutCopyMode = False
Selection.Copy 'se copia el rango selecionado
'Abro el destino y pego su contenido
AppExceldestino.ActiveWorkbook.ActiveSheet.Cells(1, 1).Select 'Selecciono la primera linea del documento nuevo
AppExceldestino.ActiveWorkbook.ActiveSheet.Paste 'Lo pego
ActiveSheet.Select
Selection.Copy
AppExceldestino.ActiveSheet.Paste
AppExceldestino.Visible = True
Next

AppExceldestino.Sheets(3).Delete
AppExceldestino.Sheets(1).Activate
AppExceldestino.ActiveWorkbook.SaveAs Filename:="Ruta", FileFormat:=xlNormal, _
Password
:="", WriteResPassword:="", ReadOnlyRecommended:=False, _
CreateBackup:=False 'Se guarda el archivo con el nombre "Ruta"
AppExceldestino.Workbooks.Close
' Se cierra
ActiveWorkbook.Sheets(1).ActivateActiveWorkbook.Activate

End Sub

martes, 24 de junio de 2008

crear citas en el Outlook desde C#

Esta es una función para crear citas en el Outlook desde C#.
para utilizar esta funcion se debe referenciar el espacio de nombre, Tambien se debe agregar a las referencias el objeto COM "Microsoft OutLook 11.0 Object Library"

using Outlook = Microsoft.Office.Interop.Outlook;

public static void CrearCita(string Asunto, string Comentario, string Ubicacion, DateTime FechaIni, DateTime FechaFin, int Aviso)
{

Outlook.Application outlookApp = (Outlook.Application)new Outlook.Application(); //Crea un objeto de OutLook Outlook.AppointmentItem Cita; //Instanciamos Un objeto de tipo Cita(AppointmentItem)

Cita = (Outlook.AppointmentItem)outlookApp.CreateItem(Microsoft.Office.Interop.Outlook.OlItemType.olAppointmentItem); Cita.Subject = Asunto;
Cita.Body = Comentario;
Cita.Location = Ubicacion;
Cita.Start = FechaIni;
Cita.End = FechaFin;
Cita.ReminderSet = true; //Para que saque el avisito de recordar cita
Cita.ReminderMinutesBeforeStart = Aviso; //El Tiempo antes de la cita que se recordará (Minutos)
Cita.BusyStatus = Microsoft.Office.Interop.Outlook.OlBusyStatus.olBusy; //Para que en el calendario salga el estado de ocupado
Cita.Save(); //Para guardar la cita

}