none
Asignación de tickets (como entidad personalizada) en una cuenta desde el SDK RRS feed

  • Pregunta

  • Hola buenas.
    Tengo una entidad personalizada llamada Ticket relacionada con la entidad Cuenta y estoy creando un plugin desde el SDK de CRM 2011 para actualizar la información de tickets de la cuenta. El plugin debe consultar la información de los tickets en una base de datos de MySQL y asignar los tickets que pertenezcan a la Cuenta de Dynamics a modo de actualización. La idea es consultar los tickets relacionados con la Cuenta que activa el plugin, eliminarlos y posteriormente agregar los tickets obtenidos de la consulta de MySQL y agregarlos a la Cuenta para no repetir información.

    El código preliminar es el siguiente:

    protected void ExecutePreValidateCuentaUpdate(LocalPluginContext localContext) {
                if (localContext == null) {
                    throw new ArgumentNullException("localContext");
                }
    			// Conexion con la base de datos
    			String sqlSring = "Driver={MySQL ODBC 3.51 Driver};Port=3306;Server=127.0.0.1;Database=kayako_fusion;Uid=root;pwd=";
    			OdbcConnection conn = Conectar(sqlSring);
    			String query = "SELECT ticketid, ticketmaskid, fullname, subject, departmenttitle, ownerstaffname, " +
    				"tickettypetitle, ticketstatustitle, prioritytitle, totalreplies, e.email FROM swtickets t " +
    				"INNER JOIN swuseremails e ON t.userid = e.linktypeid WHERE 1 GROUP BY ticketid;";
    
    			// Aqui consulto los datos y los guardo en un DBDataReader
    			Desconectar(conn);
    			// 
    			// Obtain the execution context from the service provider.
    			IPluginExecutionContext context = localContext.PluginExecutionContext;
    			IOrganizationService service = localContext.OrganizationService;
    			//*ITracingService tracingService = localContext.TracingService;
    
    			// The InputParameters collection contains all the data passed in the message request.
    			if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity) {
    				// Obtain the target entity from the input parmameters.
    				Entity entity = (Entity)context.InputParameters["Target"];
    
    				//EntityReference pp = entity.GetAttributeValue("primarycontactid");
    				//tracingService.Trace(pp.LogicalName);
    				try {
    					// Eliminar los tickets de la cuenta
    					
    
    					// Agregar los tickets de la consulta a la cuenta
    
    				} catch (Exception ex) {
    					throw new InvalidPluginExecutionException("An error occurred in the plug-in.", ex);
    				}
    
    			}
            }
    
    		private OdbcConnection Conectar(String cadenaConexion) {
    			// Crear una nueva conexion con la base de datos
    			OdbcConnection conex = null;
    			try {
    				conex = new OdbcConnection();
    				conex.ConnectionString = cadenaConexion;
    				conex.Open();
    			} catch(Exception) {
    			}
    			return conex;
    		}
    
    		private void Desconectar(OdbcConnection conex) {
    			try {
    				conex.Close();
    			} catch(Exception) {
    			}
    		}
    
    		private DbDataReader ConsultarSQL(String query, OdbcConnection conex) {
    			try {
    				OdbcCommand odbcCmd = new OdbcCommand(query, conex);
    				return odbcCmd.ExecuteReader();
    			} catch (Exception e) {
    				//EndTransaction(false);
    				throw new Exception("Ha ocurrido un error durante una consulta: \r\n" + query, e);
    			}
    		}
    
    		private int EjecutarSQL(String sql, OdbcConnection conex) {
    			try {
    				OdbcCommand odbcCmd = new OdbcCommand(sql, conex);
    				return odbcCmd.ExecuteNonQuery();
    			} catch (Exception e) {
    				//EndTransaction(false);
    				throw new Exception("Ha ocurrido un error durante una consulta: \r\n" + sql, e);
    			}
    		}

    Ojalá puedan ayudarme pronto.

    viernes, 30 de noviembre de 2012 18:00

Todas las respuestas

  • Hola RobertX, no entiendo por donde va tu duda. En principio todo parece ok en tu código, solo te faltaría eliminar los tickets y volver a crearlos (esto lo deberías hacer con la SDK), para esto puedes revisar la SDK el método Delete y Create.

    Por otro lado, ten en cuenta que ese código no te funcionará con CRM Online, ya que no te permitirá conectarte desde el plugin al MySql. si es en un entorno on premise, ten en cuenta de registrar el plugin fuera del "SandBox", ya que sino no te dejará conectar tampoco.

    un saludo y suerte!


    Demian Adolfo Raschkovan Blog: http://crmtoall.blogspot.com

    lunes, 3 de diciembre de 2012 8:05
    Moderador
  • Hola RobertX

    Yo tampoco entiendo muy bien tu consulta, sin embargo, mirando el código te puedo dar algunas recomendaciones.

    1. Todo el código de la llamada a la BBDD de MySql, pásalo a un Servicio web, clase, etc etc etc. Pero no lo dejes en el Plugin. De esta forma, estas cubriendo la parte de conexión en diversos ambientes.

    2. Primero agrega los ticket, luego eliminaros. Ya que si pasa algo te podrías quedar sin ningun ticket.

    3. Mayor información si hay algún error del CRM te da el SoapException, agregalo en tu catch


    Salu2 Atilin | http://www.dexrm.com

    lunes, 3 de diciembre de 2012 9:05
  • Ok, creo que me faltó decir que soy nuevo en esto :P
    El plugin será para CRM 2011 onPremise el problema es que no sé como obtener los Tickets que ya existen en la Cuenta, me refiero al conjunto de Tickets que están relacionados con la Cuenta para actualizarlos en caso de ser necesario y posteriormente agregar los nuevos Tickets que hayan surgido. Checaré la documentación del SDK. Ahora, con respecto a la conexión, ¿cómo registro el plugin fuera del 'SandBox'?

    Gracias :)
    lunes, 3 de diciembre de 2012 15:04
  • Muchas gracias por tus recomendaciones, las tendré en cuenta. Pondré especial atención en el código de conexión y ejecución de consultas mediante un servicio web, estoy suponiendo que te refieres a abstraer el código para reutilizarlo posteriormente, corrígeme si me equivoco.

    Gracias.
    lunes, 3 de diciembre de 2012 15:11
  • Hola RobertX,

    Voy a ver si puedo generar algún doc con alguna ayuda rápida para búsquedas y demás, te aviso, ok?

    Para registrar el plugin fuera del sandbox, lo que debes de hacer es marcar en none en la section de "Insolation Mode" en el momento de resgitrar

    http://www.renauddumont.be/en/2011/crm-2011-enregistrer-un-plugin-a-laide-du-plugin-registration-tool


    Salu2 Atilin | http://www.dexrm.com

    lunes, 3 de diciembre de 2012 15:12
  • Exacto, tal cual como tu lo dices.



    Salu2 Atilin | http://www.dexrm.com

    lunes, 3 de diciembre de 2012 15:27
  • Estaré pendiente, en lo que sigo investigando. Realmente gracias, a pesar de la cantidad de información me ha sido difícil dar con lo que necesito. 
    lunes, 3 de diciembre de 2012 15:41