Convertir List a DataTable

public DataTable ConvertToDataTable<T>(IList<T> data)
    {
        PropertyDescriptorCollection properties =
           TypeDescriptor.GetProperties(typeof(T));
        DataTable table = new DataTable();
        foreach (PropertyDescriptor prop in properties)
            table.Columns.Add(prop.Name, Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType);
        foreach (T item in data)
        {
            DataRow row = table.NewRow();
            foreach (PropertyDescriptor prop in properties)
                row[prop.Name] = prop.GetValue(item) ?? DBNull.Value;
            table.Rows.Add(row);
        }
        return table;

    }

Leer y Escribir colas MQ Series en C#

Lo primero es tener instalado el cliente de MQSeries… Una vez instalado la siguiente clase permite conectar, escribir y leer de una Cola MQ

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using IBM.WMQ;
using ClienteMQ_Core.Util;
namespace ClienteMQ_Core.Logic
{
/// <summary>
/// Clase que contiene la logica de conexion y
/// ===============================================================
/// </summary>
public class ConectorMQ
{
MQQueueManager queueManager;
MQQueue queue;
MQMessage queueMessage;
MQPutMessageOptions queuePutMessageOptions;
MQGetMessageOptions queueGetMessageOptions;
static string QueueName;
static string QueueManagerName;
static string ChannelInfo;
string channelName;
string transportType;
string connectionName;
string message;
/// <summary>
/// Conecta a MQ SERIES
/// ===============================================================================
/// </summary>
/// <param name=”strQueueManagerName”></param>
/// <param name=”strQueueName”></param>
/// <param name=”strChannelInfo”></param>
/// <returns></returns>
public string ConnectMQ(string strQueueManagerName, string strQueueName,string strChannelInfo)
{
QueueManagerName = strQueueManagerName;
QueueName = strQueueName;
ChannelInfo = strChannelInfo;
char[] separator = { ‘/’ };
string[] ChannelParams;
ChannelParams = ChannelInfo.Split(separator);
channelName = ChannelParams[0];
transportType = ChannelParams[1];
connectionName = ChannelParams[2];
String strReturn = “”;
try
{
queueManager = new MQQueueManager(QueueManagerName,
channelName, connectionName);
strReturn = “Connected Successfully”;
}
catch (MQException exp)
{
throw new ClienteMQException(exp);
}
return strReturn;
}
/// <summary>
/// Escribe un mensaje en la cola MQ conectada
/// ===============================================================================
/// </summary>
/// <param name=”strInputMsg”></param>
public void WriteMsg(string strInputMsg)
{
try
{
queue = queueManager.AccessQueue(QueueName,
MQC.MQOO_OUTPUT + MQC.MQOO_FAIL_IF_QUIESCING);
message = strInputMsg;
queueMessage = new MQMessage();
queueMessage.WriteString(message);
queueMessage.Format = MQC.MQFMT_STRING;
queuePutMessageOptions = new MQPutMessageOptions();
queue.Put(queueMessage, queuePutMessageOptions);
}
catch (MQException MQexp)
{
throw new ClienteMQException(MQexp);
}
catch (Exception exp)
{
throw new ClienteMQException(exp);
}
}
/// <summary>
/// Lee un mensaje de la cola seleccionada
/// ===============================================================================
/// </summary>
/// <returns></returns>
public string ReadMsg()
{
String strReturn = “”;
try
{
queue = queueManager.AccessQueue(QueueName,
MQC.MQOO_INPUT_AS_Q_DEF + MQC.MQOO_FAIL_IF_QUIESCING);
queueMessage = new MQMessage();
queueMessage.Format = MQC.MQFMT_STRING;
queueGetMessageOptions = new MQGetMessageOptions();
queue.Get(queueMessage, queueGetMessageOptions);
strReturn = queueMessage.ReadString(queueMessage.MessageLength);
}
catch (MQException MQexp)
{
throw new ClienteMQException(MQexp);
}
catch (Exception exp)
{
throw new ClienteMQException(exp);
}
return strReturn;
}
}
}

Suerte 🙂

Trabajar con appSetting en los archivos .config

Los archivos .config son un muy buen lugar para guardar información que no queremos que quede “en duro” y que nos sirve para parametrizar nuestra aplicación. Normalmente tenemos valores del tipo

<add key=”Llave” value=”valor”/>

Pero que pasa si queremos modificar en tiempo de ejecución dichos valores?

bueno lo podemos hacer de la siguiente manera.

Para leer usamos una clase del namespace System.Configuration

string miValor = ConfigurationManager.AppSettings[“llave”];

Para agregar un nuevo valor pordemos usar los siguiente

Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
config.AppSettings.Settings.Add(“llave”, “valor”);
config.Save(ConfigurationSaveMode.Modified);

y para actualizar un valor lo siguiente.

Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
config.AppSettings.Settings[“llave”].Value = “Nuevo Valor”
config.Save(ConfigurationSaveMode.Modified);

🙂

 

 

 

Microsoft JScript runtime error: Object doesn’t support this property or method con Dev Express

Estoy en un proyecto que usa DevExpress 9.3 y tuve el siguiente error al probar desde IE 8

Microsoft JScript runtime error: Object doesn’t support this property or method

en uno de los archivos dinámicos que genera DevEpress. Pero desde otro equipo no se daba.

Despues de mucho googlear el error se da en esa versión al estar instalado chrome framework.

Hay dos opciones para solucionarlo, desinstalar chrome framwork o actualizar DevExpress 10.2.3 o superior.

 

saludos

Cambiar colores en un RichTextBox

Estaba haciendo un editor xml y necesitaba resaltar pabras reservadas

lo hice con este pequeño snipet.

 

public void definirSintaxis()
{
txtXML.SelectAll();
txtXML.SelectionColor = Color.Black;
string cadena = txtXML.Text;
Configuraciones conf = new Configuraciones();
foreach(string valor in conf.sintaxis)
{
int posicion = 0;
int numero = 1;
while (numero != 0)
{
posicion = Convert.ToInt16(Strings.InStr(numero, txtXML.Text, valor));
if (posicion > 0)
{
txtXML.SelectionStart = posicion – 1;
txtXML.SelectionLength = valor.Length;
txtXML.SelectionColor = Color.Red;
numero += 1;
}
else
{
numero = 0;
}
}
}
txtXML.SelectionStart = txtXML.TextLength;
}

conf.sintaxis es un arreglo con las palabras que queria destacar

saludos 🙂

Crear Servicio JSonp y consumirlo con Jquery

A veces es necesario utilizar servicios jsonp para evitar problemas de Cross-Domain. Para eso tenemos que hacer una solución Web limpia y agregar un servicio WCF

Luego debo ir al WEB.config y preocuparme de la siguiente configuracion

 

<system.serviceModel>
 <behaviors>
 <endpointBehaviors>
 <behavior name="WsJsonBolsa.ServicioBolsaIframeAspNetAjaxBehavior">
 <enableWebScript />
 </behavior>
 </endpointBehaviors>
 <serviceBehaviors>
 <!-- Al pasar a producción, eliminar debugbehavior-->
 <behavior name="DebugBehavior">
 <serviceDebug includeExceptionDetailInFaults="true"/>
 </behavior>
 </serviceBehaviors>
 </behaviors>
 <bindings>
 <webHttpBinding>
 <binding name="webHttpBindingWithJsonP" crossDomainScriptAccessEnabled="true" />
 </webHttpBinding>
 </bindings>
 <serviceHostingEnvironment 
 multipleSiteBindingsEnabled="true" />
 <services>
 <service name="WsJsonBolsa.ServicioBolsaIframe" behaviorConfiguration="DebugBehavior">
 <endpoint address="" behaviorConfiguration="WsJsonBolsa.ServicioBolsaIframeAspNetAjaxBehavior"
 bindingConfiguration="webHttpBindingWithJsonP"
 binding="webHttpBinding" contract="WsJsonBolsa.ServicioBolsaIframe" />
 </service>
 </services>
 </system.serviceModel>

Una vez agregada la configuración, los servicios deben ser declarados así

 /// <summary>
 /// metodo de pruebas para revisar la visibilidad del servicio
 /// ==========================================================================
 /// </summary>
 /// <returns></returns>
 [OperationContract, WebGet(ResponseFormat=WebMessageFormat.Json)]
 public string pruebaServicio()
 {
 return "hola mundo";
 }

 

Para consumirlo en javascript debes referenciar a Jquery y agregar la ruta del servicio

Con el siguiente codigo llamas e

 var urlServicio = 'http://localhost/ServicioEjemplo.svc';
function obtenerFamilias() {
 var url = urlServicio + /pruebaServicio?callback=0;
 var c = 0;
 var familia;
$.ajax({
 url: url,
 dataType: 'jsonp',
 crossDomain: true,
 success: function (response) {
 alert(d.data);
 },
 error: function (e) {
 consola(e.message);
 }
 });
 }

Así llamas los métodos del servicio en ajax… Lo demás es creatividad personal.

 

suerte

Copiar un DataTable…

Para copiar un DataTable con todos sus datos se requiere lo siguiente.

DataTable nuevo = new DataTable();
nuevo = original.Clone();
foreach (DataRow row in original.Rows)
{
     nuevo.Rows.Add(row.ItemArray);
}

Lo dejo como post, ya que después se me olvida 😛

Añadir OwnerId en Dynamics CRM

Un pequeño código para asignar owner id en una entidad en CRM Dynamics en C#

if (serviceProvider == null)
{
throw new ArgumentNullException(“no se ha encontrado el contexto”);
}
try
{
//=====================================================================
IPluginExecutionContext context =
(IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
IOrganizationServiceFactory serviceFactory =
(IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
IOrganizationService servicio = serviceFactory.CreateOrganizationService(context.UserId);
//=====================================================================
Guid idEmpresa = context.PrimaryEntityId;
Guid idUsuario = context.UserId;
Account cuenta = servicio.Retrieve(Account.EntityLogicalName, idEmpresa, (new ColumnSet(true))).ToEntity<Account>();

if(cuenta.StateCode.Value.Equals(AccountState.Active))
{
AssignRequest request = new AssignRequest();
request.Target = new EntityReference(Account.EntityLogicalName, idEmpresa);
request.Assignee = new EntityReference(“systemuser”, idUsuario);
AssignResponse response = (AssignResponse)servicio.Execute(request);
}

}
catch (Exception ex)
{
throw new InvalidPluginExecutionException(“Error al ejecutar plugin”, ex);
}