domingo, 23 de septiembre de 2007

Como saber si un usuario pertenece a un rol específico en CRM

Con esta validación sabemos si el usuario que esta actualmente logeado en CRM pertenece a un rol en específico, mas abajo vienen todas las funciones que utilice y que ademas por separado las podemos utilizar par otras cosas, como por ejemplo, saber el GUID o Todos los roles a los que pertenece, den una leída espero les sea muy útil.

if(currentUserHasRole('GICSA Administrador Cuentas por Cobrar')){
alert("Pertenece a GICSA Administrador Cuentas por Cobrar");
}else{
alert("No pertenece GICSA Administrador Cuentas por Cobrar");
}

Función para obtener el GUID del Usuario actual

function getUserId(){
try {
var command = new RemoteCommand("SystemUser", "WhoAmI", "/MSCRMServices/"); var oResult = command.Execute();
if (oResult.Success) {
return oResult.ReturnValue.UserId;
}
}
catch(e) {
alert("Error while retrieving userid.");
}
return null;}

Función que obtiene los roles del usuario actual

function getUserRoles(userId){
try {
var command = new RemoteCommand("UserManager", "GetUserRoles"); command.SetParameter("userIds", "" + userId + "");
var oResult = command.Execute();
if (oResult.Success) {
return oResult.ReturnValue;
}
}
catch(e)
{
alert("Error while retrieving roles.");
}
return null;}

Función que busca si el usuario UserId tiene un rol específico

function userHasRole(userId, roleName){
result = getUserRoles(userId);
if (result != null) {
var oXml = new ActiveXObject("Microsoft.XMLDOM");
oXml.resolveExternals = false;
oXml.async = false;
oXml.loadXML(result);
roleNode = oXml.selectSingleNode("/roles/role[name='" + roleName + "']");
if (roleNode != null) {
if (roleNode.selectSingleNode("roleid[@checked='true']") != null)
return true;
}
}
return false;
}

Función para saber si un usuario actual tiene un rol específico
- devuelve true,false

function currentUserHasRole(roleName){
var userId = getUserId();
return userHasRole(userId, roleName);
}

Saludos

Agregar un Archivo .JS con JavaScript

Si deseas poder usar funciones que tengas en un archivo .js, tan solo basta con agregar estas líneas y listo.

var script = document.createElement('script');
script.language = 'javascript';
script.src = 'MisFunciones.js';
document.getElementsByTagName('head')[0].appendChild(script);
var f = function(){
alert("cargando JS");
if (event.srcElement.readyState == "loaded")
var data=hola("Miguel"); // alguna funcion de MisFunciones.js
alert(data);
}
script.attachEvent("onreadystatechange", f);

Saludos!!

viernes, 21 de septiembre de 2007

Como Obtener el rol de un usuario de CRM

Hola mis queridos CRM'eros, espero que como yo algun día ocupen estas funciones para obtener el rol de el usuario que esta logeado en crm y alguna operación ejecuta un WS.


//Para obtener el Guid Id del usuario que ejecuta el WS.
WhoAmIRequest userRequest = new WhoAmIRequest();
WhoAmIResponse userResp = (WhoAmIResponse)
oCrmService.Execute(userRequest);
userResp.UserId;
string UserRole=GetRole(userResp.UserId;)


private String GetRole(Guid UserID) {
CrmService oCrmService = new CrmService();
oCrmService.Credentials = System.Net.CredentialCache.DefaultCredentials;
QueryExpression qe = new QueryExpression();
qe.EntityName = "role";
qe.ColumnSet = new AllColumns();
LinkEntity le = new LinkEntity();
le.LinkFromEntityName = "role";
le.LinkFromAttributeName = "roleid";
le.LinkToEntityName = "systemuserroles";
le.LinkToAttributeName = "roleid";

LinkEntity le2 = new LinkEntity();
le2.LinkFromEntityName = "systemuserroles";
le2.LinkFromAttributeName = "systemuserid";
le2.LinkToEntityName = "systemuser";
le2.LinkToAttributeName = "systemuserid";
ConditionExpression ce = new ConditionExpression();
ce.AttributeName = "systemuserid";
ce.Operator = ConditionOperator.Equal;
ce.Values = new object[]{UserID};

le2.LinkCriteria = new FilterExpression();
le2.LinkCriteria.Conditions = new ConditionExpression[]{ce};

le.LinkEntities = new LinkEntity[]{le2};
qe.LinkEntities = new LinkEntity[]{le};

BusinessEntityCollection bec = oCrmService.RetrieveMultiple(qe);
if (bec.BusinessEntities.Length > 0) {
return ((role)bec.BusinessEntities[0]).name.ToString();
}
else
throw new Exception("User not found");
}


Saludos!!!

miércoles, 15 de agosto de 2007

De vuelta Solomon 5.5

Creo que se podran dar cuenta de que mi blog parecía olvidado, y bueno ni hablar de que nuevamente no pude a asistir a la reunión de la comunidad .net, pero en mi intento por tomar este camino como una cultura me he topado con nuevo conocimiento y nuevas oportunidades de aprender más cosas interesantes, y bueno por lo que les quiero compartir un poco de ese conocimiento.


Aqui vamos con un poco de solomon, y nada mejor como el saber como utilizar sus SolomonObjects, que verdaderamente ahhhh... como nos resuelven la vida evitandonos la pena y sufrimiento de tener que meterle mano directamente a las bases de datos, que eso sinceramente da mucho miedo, ya que culquier paso en falso es casi letal para la integridad de dicha información.


Todo empezó con el requerimiento de importar las recepciones de ordenes de compra desde un archivo de texto, y bueno todo esto implicaba hacer una transaccion por cada orden de compra con sus respectivas partidas y obviamente generar el lote por el conjunto de ordenes de compra, a lo cual sentí que mi vida se complicaria demasiado...jajaja, y ante dicha exageración de mi parte se me aparecio mi pepe grillo (mi amigo Luis Garcés) y me comento de que escucho los SolomonObjects o COM objects de solomon, eran casi casi leyenda urbana, jajaja!! y bueno me paso un instalador de eso de los SolomonObjects y bueno ante esa simbolica ayuda de su parte, pude aprender a ejecutar las pantallas llenarlas y hacer las transacciones debidas, y bueno les compartire el codigo completo de aplicación para que se den una idea de como abrir los objetos y manejar esos tan compliados grids.


Aqui les va todo comentado de la mejor manera posible:


'Declaración de Controles de Solomon
Public gblnSaving As BooleanPrivate
ctrlPOCurr As SIVControl ' declarando el control para asignarle el numero de orden de compra
Private ctrlPartCurr As SIVControl 'declarando el control de numero de partida a buscar
Private ctrlqty As SIVControl 'declarando el control para asignarle la cantidad recibida
Private ctrlrcptctrlqty As SIVControl 'declarando el control de cantidad control
Private ctrlrcptctrlamt As SIVControl 'declarando el control de costo control
Private crtldrtot As SIVControl 'Declarando el control de Cantidad control del lote
Private ctrlctrltot As SIVControl ' Declarando el control de Costo control del lote
Private sivTBCurr As New SIVToolbar
Private sivApp As SIVApplication

Private Sub cmdCancel_Click()
Call screenexit("", "")
End Sub

Private Sub Form_Load()
Call ApplInit
Call ScreenInit
End Sub
Private Sub Form_Unload(Cancel As Integer)
Call screenexit("", "")
End Sub

Private Sub cmdEjecuta_Click()
'Declaracion de variables a utilizar para guardar las recepciones recibidas en el Archivo de texto
Dim strMyAppEXE As String 'pantalla a abrir
Dim pathEXE As String 'ruta de la pantalla a abrir
Dim strDataEntity As String 'Para guardar el valor de la entidad del grid
Dim blnRecordFound As Boolean 'Para saber si hay datos en el grid
Dim blnMatch As BooleanDim strPart As String 'El numero de Partida a buscar en el grid
Dim strPO As String 'El numero de orden de compra le ida en el archivo
Dim strqty As String 'El valor de la cantidad recibida a asignar
Dim auxstrPO As StringDim Articulo As String
Dim pathFile As String
Dim IDCompania As String
Dim sFile As String
Dim PathAccess As String
Dim LoginFile As String

'strqty = "2" 'asignando al valor de la cantidad recibida para pruebas
'strPart = "00002" 'asignando una partida para pruebas
'strPO = "000042" 'asignando un numero de ordende compra para pruebas
LoginFile = "xPathsApp\Login.txt"
'LoginFile = "Login.txt"
'pathEXE = "C:\Sol55\Solomon\PO\"
pathEXE = App.Path & "\"strMyAppEXE = "0401000.exe"
'pathFile = App.Path & "\PathImportRC.txt"
pathFile = "xPathsApp\PathImportRC.txt"
On Error GoTo errorFile2
Open pathFile For Input As #3 Input #3,
PathAccess Close #3
sFile = PathAccess & "RC" & Trim(bpes.CpnyID) & ".txt"
On Error GoTo errorOpen
Open sFile For Input As #1
Input #1, strPO, strPart, Articulo, strqty, IDCompania
If If strPO <> "NO.Orden" Or strPart <> "LineaReferencia" Or Articulo <> "Articulo" Or strqty <> "Cantidad_Recepcionada" Or IDCompania <> "IDCompania" Then
MsgBox "El archivo " & sFile & " no tiene el formato correcto", vbCritical, "Confirmation"
Close #1
Exit Sub
Else
Dim User, Pass As String 'Dim val As String
On Error GoTo errorOpen2
Open LoginFile For Input As #2
Input #2, User, Pass Close #2
On Error GoTo LOGIN_ERR
sivTBCurr.Login Trim(bpes.DBServer), Trim(bpes.DBNameSystem), Trim(bpes.CpnyID), User, Pass '"VMW2K", "TESTSISTEMA", "002", "SYSADMIN", ""
sivTBCurr.InitializeMode = False
On Error GoTo STARTAPP_ERR
Set sivApp = sivTBCurr.StartApplication(pathEXE & strMyAppEXE)
' Loop until the end of file is reached.
Do While Not EOF(1) ' Read data into variables.
On Error GoTo Closefile
Input #1, strPO, strPart, Articulo, strqty, IDCompania
If strPO <> Empty And strPart <> Empty And Articulo <> Empty And strqty <> Empty And IDCompania = Trim(bpes.CpnyID) Then ' pregunta si es la primera orden de compra a cargar
If (auxstrPO = Empty) Then
Set ctrlPOCurr = sivApp.Controls("cponbr") 'el control del numero de orden de compra
On Error GoTo STARTAPP_ERR: ctrlPOCurr = strPO 'numero de Orden de compra
End If '(auxstrPO = Empty) Then ' pregunta si es una nueva orden de compra, si lo es la guarda If (strPO <> auxstrPO And auxstrPO <> Empty) Then
Call CuadraValoresRecepcion ''Crea un nuevo documento sobre el batch guardado
Dim strEntityDoc As String
strEntityDoc = sivApp.Controls("crcptnbrh").Properties("Level")
sivApp.New
strEntityDoc ''Carga la nueva orden de compra para agregar al batch
Set ctrlPOCurr = sivApp.Controls("cponbr") 'el control del numero de orden de compra
On Error GoTo STARTAPP_ERR: ctrlPOCurr = strPO 'numero de Orden de compra
End If '(strPO <> auxstrPO And auxstrPO <> Empty) ''Asigna el valor al auxiliar para poder hacer las validaciones anteriores
auxstrPO = strPO 'para obtener el valor de la entidad para el nivel del grid
Set ctrlPartCurr = sivApp.Controls("cpolineref") 'Control del Campo de numero de partida de la orden de compra
strDataEntity = ctrlPartCurr.Properties("Level") 'Para ubicarse en el primer registro del grid blnRecordFound = (sivApp.First(strDataEntity) = sivRecFndFound) 'Este ciclo se ejecuta mientras encuentra la partida o hasta que termine de leer el grid
Do Until blnMatch Or (Not blnRecordFound) 'Compara el contenido del control ("cpolineref") Control del Campo de numero de partida de la orden de compra
blnMatch = (ctrlPartCurr = strPart) 'si el contenido del control no es igual al que se busca entonces
If Not blnMatch Then 'avanza al siguiente registro
blnRecordFound = (sivApp.Next(strDataEntity) = sivRecFndFound)
End If 'Not blnMatch
Loop 'Until
blnMatch Or (Not blnRecordFound) 'si encontro la partida
If blnMatch Then 'Asigna el valor a surtir
Set ctrlqty = sivApp.Controls("cqty") 'tomando el valor del control de cantidad recibida
ctrlqty = strqty 'asignando la cantidad recibida obtenida por el archivo
blnMatch = False
End If
Else
GoTo Closefile2
End If 'strPO <> Empty Or strPart <> Empty Or Articulo <> Empty Or strqty <> Empty Loop ' Loop Not EOF End If 'strPO <> "NO.Orden" Or strPart <> "LineaReferencia" Or Articulo <> "Articulo" Or strqty <> "Cantidad_Recepcionada"
Call CuadraValoresRecepcion MsgBox "Lote No." & sivApp.Controls("cbatnbrb") & " Importado con éxito"
'sivApp.Quit
'sivTBCurr.Logout 'elimina el archivo una vez copiado
Close #1
Dim myFSO, f
Set myFSO = CreateObject("Scripting.FileSystemObject")
On Error Resume Next
Set f = myFSO.GetFile(sFile)
f.Delete sivApp.Visible = True
Call screenexit("", "")


viernes, 29 de junio de 2007

El primer paso

Jajaja.. y mucho más jaja, ya voy a comenzar esto como una verdadera cultura y religión , borre lo anterior escrito debido a mi falta de uso, pero en fin a qui voy de nuevo, como me comence a internarme en este fabuloso mundo de las IT, ya que he descubierto que aveces el hecho de ser una empresa grande no significa que lleven o apliquen una metodología, o tengan estándares, pero bueno yo creo que esto depende mucho en cuanto al equipo de trabajo, porque no siempre se tiene un jefe el cual pueda preocuparse por todo ello, pero nosotros como desarrolladores, arquitectos , etc. creo que podemos tratar de hacer un feedback de todo los que sabemos, para poder tener yo creo que un mayor control sobre cualquier proyecto, porque esta semana del expertzone fue mut interesante y vi una conferencia en la cual pues un equipo de desarrollo nos comparte sus mejores practicas de desarrollo, y fue muy interesante y comentan mucho lo del feedback, porque hay veces que la empresa no tiene la capacidad para invertir en un curso o alguna capacitación para todos pero aquellos que lo tomen pueden difundir ese conocimiento dentro del equipo para tener conocimiento de aquellas herramientas, y eso es razonable, ya que es interesante poder tener un pool recursos, que en cualquier momento tengan la capacidad para realizar cualquier actividad, como tratar de ser un poco universales, y no monoactividad, bueno esas es mi opinión que seguro, no todos comparten pero pues espero susu comenterios porque para mi es muy interesante compartir todo esto y a lo mejor de sus comentarios puedo ampliar mi visión hacia esto y lo digo sinceramente, porque gracias a la ayuda de mis amigos Yazmín y Arturo, sus comentarios y todo el conocimiento que me han transmitido he podido enfocar mejor mis intereses hacia estas tecnologías y todo lo que podemos hacer con ellas, podría decir que ellos me ayudaron a incubarme para ser el pollito que apenas salir del cascarón y espero poder compartir muchas cosas que aprenda y he aprendido, y se los transmitire dentro de mis próximos posteos, cosas que me han sido muy útiles y me han ayudado mucho en mi trabajo.
Pero bueno, creo que llego la hora de despedirme porque tengo un poco de chamba..

Saludos!!