lunes, 12 de noviembre de 2007

Leer una imágen de Sql y guardar imágen en Sql

Una vez más con algo para leer y guardar imágenes en sql, con estas 2 fuciones que les pongo a continuación podemos convertir la imágen en un objeto image de sql y también lo podemos leer el campotipo image y obtener la imágen, y la podemos almacenar en un archivo temporal por si deseamos guardar la misma imágen.


#Region "Función Image2SqlImage"
Public Function Image2SqlImage(ByVal File As Object) As Byte()
Try
Dim ruta As New FileStream(File, FileMode.OpenOrCreate, FileAccess.ReadWrite)
Dim binario(ruta.Length) As Byte
ruta.Read(binario, 0, ruta.Length)
ruta.Close()
Return binario
Catch
Return Nothing
End Try
End Function
#End Region
#Region "Función sqlImagen2Image"
Public Function sqlImagen2Image(ByVal FieldImage As Object) As Bitmap
Try
Dim bits As Byte() = CType(FieldImage, Byte())
Dim memorybits As New MemoryStream(bits)
Dim bitmap As New Bitmap(memorybits)
bitmap.Save("C:\TempRMSImage.tmp")
Return bitmap
Catch EX As Exception
Return Nothing
End Try
End Function
#End Region

Saludos mis queridos amigos y lectores, espero les sea útil.

Encriptar y desencriptar una cadena .Net

Hola Amigos, aqui estoy de nuevo, con unas funciones que me parecen muy útiles para cuando queramos encriptar y desencriptar una cadena de texto, que podríamos usar para cuando guardamos las cadenas de conexión de una base de datos, o alguna contraseña que no queremos que sea vista, no es la super seguridad pero es funcional.

#Region "Función Encrypt"
'Encripta cadenas de texto
Public Function Encrypt(ByVal string_encriptar As String) As String
Dim R As Integer
Dim I As Integer
R = Len(Trim(string_encriptar))
For I = 1 To R
Mid(string_encriptar, I, 1) = Chr(Asc(Mid(string_encriptar, I, 1)) - 2)
Next I
Dim b As Byte() = System.Text.ASCIIEncoding.ASCII.GetBytes(string_encriptar)
Dim encryptedConnectionString As String = Convert.ToBase64String(b)
Return encryptedConnectionString
End Function
#End Region

#Region "Función UnEncrypt"
'Desencripta cades de texto encriptadas por Encrypt
Public Function UnEncrypt(ByVal string_desencriptar As String) As String
Dim R As Integer
Dim i As Integer
Dim b As Byte() = Convert.FromBase64String(string_desencriptar)
Dim decryptedConnectionString As String = System.Text.ASCIIEncoding.ASCII.GetString(b)
R = Len(Trim(decryptedConnectionString))
For i = 1 To R
Mid(decryptedConnectionString, i, 1) = Chr(Asc(Mid(decryptedConnectionString, i, 1)) + 2)
Next i
Return decryptedConnectionString
End Function
#End Region

Saludos espero les sea muy útil.

lunes, 22 de octubre de 2007

Get User Role For CRM from .Net App.

//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) {
//Guid userid = new 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");
// return "";
}

How to do a Read Only Form into CRM

How to do a Read Only Form into CRM, this sample was designed for the validation of the field oStatus, but you can change this validation for other :

Para Hacer una Forma de solo lectura para CRM, este ejemplo fue hecho en base a una validación de oStatus, pero se puede hacer para cualquier otra validación:

var oStatus = crmForm.all.gicsa_statusultimus;
if (typeof(oStatus) != "undefined" && oStatus != null)
{
if (oStatus.value > 2 && crmForm.FormType != 3)
{ window.navigate("

VbCurrency Words en español para RMS.

Amigos, he tratado de cambiar el idioma del VbCurrencyWords a español, pero no he podido saber cómo agregar una dll a RMS, pero tan pronto lo sepa, seguro se los comparto.

I had been trying to change the english lenguage to spanish of de vbCurrencyWords but I can't and, Microsoft support said this:

SCOPE:I understand that you wanted to covert the amount in English to Spanish and you're looking for ways to have this done.

ENVIRONMENT:Product Line: Microsoft Retail Management

Topic: Point Of Sale or Store Operations

Version: 2.0

Application Language: English (US)

Database: SQL Server 2005Server

OS: Windows Server 2003



ASSESSMENT:Customization and/or dealing with *.dll files is already beyond our support boundaries. In addition to that, the only supported language version is English. I do hope you understand our situation on this one. The best thing I could do for you is to provide you the following information that might point you to the right direction:

viernes, 5 de octubre de 2007

Por una mejor cultura,programación en 3 capas

Hola mis queridos lectores, como no compartir esto que se vuelto una cultura, un standar, parte de las mejores prácticas de Desarrollo y es esto conocido como la programación en 3 capas.
Al igual que con aplicaciones de dos capas, una aplicación de tres capas se puede actualizar de manera vertical o de manera horizontal y a mi parecer es mucho mejor por la facilidad que nos da para darle mantenimiento.
Al seleccionar una estrategia horizontal, se puede actualizar toda o parte de una capa y dejar las otras capas como están. El código actualizado puede utilizar características de interoperabilidad para accesar el código que no se ha cambiado. Después, se pueden actualizar las otras capas gradualmente e integrarlas a la aplicación.

Otra característica que es importante mencionar de una arquitectura de tres capas es que nos permite aprovechar las habilidades especializadas que podamos tener los desarrolladores involucrados en el proyecto, y podemos trabajar paralelamente. Por ejemplo, un desarrollador o equipo pueden trabajar en los componentes modulares de interfaz de usuario mientras que otros desarrolladores actualizan y ajustan componentes en las capas de lógica de negocios y acceso a datos.
Aquí les dejo una imágen de una arquitectura de programación en 3 capas.

Saludos espero les halla quedado claro la ventaja de esto.

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!!