lunes, 10 de diciembre de 2007

Documentación Técnica de la Solución

Hola!
Me gustaría poder generar una documentación técnica del código fuente de mi aplicación y que quede escrita de tal forma que parezca a la ayuda del msdn o la del TechNet. Esto es posible mediante el uso del SandCastle y una herramienta que provee una interfaz gráfica que lo hace utilizable me refiero al SHFB Sandcastla Help File Builder.

Generar documentación técnica de mi código

Sandcastle es una herramienta que Microsoft distribuye de manera gratuita y su utilización es fundamental para generar documentación conceptual y técnica de las librerías de nuestras soluciones escritas en .Net Framework; Para crear la documentación técnica, Sandcastle toma básicamente un archivo .dll y un archivo de comentarios .xml, se apoya en la reflection y genera un archivo con un formato similar a la documentación técnica del MSDN y TechNet. La utilización de Sandcastle es muy compleja porque carece de Interfaz Gráfica de Usuario por tal razón su utilización nos remite a la línea de comandos, dichos comandos son molestos de escribir y ejecutar; y aunque se pueden crear archivos .bat que automaticen la tarea vale la pena mencionar que la creación de éstos demanda mucho tiempo y en consecuencia dinero.

Para dar respuesta a la complejidad de uso del Sandcastle, en los últimos meses aparece publicado el Sandcastle Help File Builder SHFB quien presenta una GUI que encapsula la complejidad de la secuencia de comandos que originalmente trae el Sandcastle. El proceso Team Build del Team Foundation Sever de Team System tiene la característica de poder incorporar scripts que se ejecutan durante el Build, dichos scripts podrían referenciar el SHFB para que genere automáticamente la documentación técnica de la solución y si se desea, que posteriormente haga un despliegue de la documentación en formato HTML directamente sobre el Team Portal de Team System. La escritura de estos scripts de Team Build tampoco es fácil pero se espera que en diciembre el equipo de Microsoft distribuya un CTP que facilite dicho proceso.

El SHFB genera la documentacion en formato CHM, un sitio web con un indice entre otros formatos, si hay varias dll se crea un nodo principal en el índice que referencia dicha dll

Cómo instalarlo?

  1. Descarga e instala el HtmlHelp:
    [http://go.microsoft.com/fwlink/?linkid=14188]
  2. Descarga e instala el Sandcastle de Microsoft: [http://www.microsoft.com/downloads/details.aspx?FamilyID=E82EA71D-DA89-42EE-A715-696E3A4873B2&displaylang=en],
  3. Descarga e instalael Sandcastle Help File Builder:
    [http://www.codeplex.com/SHFB/Release/ProjectReleases.aspx?ReleaseId=8261]

Una prueba de funcionamiento

1) Asegurate de tener el archivo xml de comentarios
en la carpeta bin de tu proyecto, busca la dll que quieres documentar, el nombre de la dll debe existir tambien con la extension xml por ejemplo Negocios.dll debe tener el archivo de comentarios Negocios.xml, de no ser así se puede crear fácilmente desde visual studio de la siguiente manera,
1. Clic derecho sobre el proyecto/propiedades
2. En la pestaña generar bajo la region Resultado das clic sobre el la caja de verificación:
Archivo de documentación XML
3. Guardar cambios y luego clic derecho sobre el proyecto/volver a generar

Abre el SHFB
1. Clic en Proyecto/Nuevo proyecto
2. Clic en el botón Add, navega hasta las ubicacion de los dos archivos el .dll y el .xml
3. Clic en documentación/Build Project

Listo!

miércoles, 31 de octubre de 2007

Consultas contra el Directorio Activo desde SQL Server

grHola, ahora el "chicharron" es que el cliente quiere mantener una tabla de la base de datos de Sql Server 2005 Express, actualizada con la informacion de los usuarios del directorio activo, y pues tecnicamente, esto puede ser hecho directamente con queryes sobre el directorio activo, gracias al uso del bondadoso protocolo LDAP (Lightweight Directory Access Protocol o Protocolo de acceso liviano al Directorio), este protocolo de capa 7 del modelo OSI nos permite a nivel de aplicacion acceder a la informacion de la base de datos del directorio activo y para ello se requiere conocer una cuenta que pertenezca al dominio y obviamente el nombre o direccion IP del controlador de dominio o nombre o IP del servidor replica del directorio activo.

Sera que se pueden consultar los datos del directorio activo desde SQL Server y de la misma forma como se hacen queries estandar?, La respuesta es si y acontinuacion les dire como.
Para ello, debemos crear y configurar un servidor enlazado (Linked Server) cuya fuente de datos apuntara hacia el Directorio activo utilizando el proveedor ADsDSObject, y luego impersonamos el acceso al servidor con cualquier cuenta que pertenezca al directorio activo

1. Cree el procedimiento almacenado con el siguiente script:


-- Procedimiento para crear/borrar un servidor enlazado hacia el directorio activo
-- autor: eider mauricio aristizabal erazo
-- Para que las consultas LDAP funcionen:
-- El servidor de Sql Server debe estar instalado en un pc que pertenezca al dominio
-- Ejemplo de consulta en el directorio activo (Una vez se haya creado el servidor enlazado)
-- SELECT * FROM OpenQuery(ENLACE_DA, 'SELECT * FROM ''LDAP://IP.CONTROLADOR.DE.DOMINIO'' ')

CREATE PROCEDURE [dbo].[USP_ENLAZAR_DIRECTORIO_ACTIVO]
AS
BEGIN

IF ((SELECT COUNT(*) FROM MASTER.DBO.SYSSERVERS WHERE SRVNAME = 'ENLACE_DA') > 0)
BEGIN
EXEC sp_dropserver 'ENLACE_DA', 'droplogins'
SELECT 'EL SERVIDOR [ENLACE_DA] HA SIDO ELIMINADO'
END
ELSE
BEGIN
EXEC sp_addlinkedserver
@server = 'ENLACE_DA',
@provider = 'ADsDSOObject',
@srvproduct = 'ADsDSOObject',
@datasrc ='ADsDSOObject'

EXEC sp_addlinkedsrvlogin
'ENLACE_DA',
'false',
null,
null,
null

SELECT 'EL SERVIDOR ENLAZADO [ENLACE_DA] HA SIDO CREADO'
END
END


2. Ejecute el procedimiento almacenado que acaba de crear (Asegúrese que el resultado el procedimiento retorne el mensaje 'EL SERVIDOR ENLAZADO [ENLACE_DA] HA SIDO CREADO'):


USE [BASE_DE_DATOS]
GO

DECLARE @return_value int

EXEC
@return_value = [dbo].[USP_ENLAZAR_DIRECTORIO_ACTIVO]

SELECT
'Return Value' = @return_value
GO


3. Impersonalizar el acceso al servidor:
En el Sql Server Management Studio, navegue hasta la ubicacion, Server Objects/Linked Servers y dele clic derecho propiedades a ENLACE_DA, aparece la ventana Linked server properties - ENLACE_DA seleccione la pestaña Security y escoja la opcion Be Made using this security context, escribe un usuario del dominio bajo la sintaxis midiominio\usuario_del_dominio
Tambien se puede impersonar con el comando:


USE [BASE_DE_DATOS]
GO
EXEC
sp_addlinkedsrvlogin @rmtsrvname = N'ENLACE_DA', @locallogin = NULL , @useself = N'False', @rmtuser = N'dominio\usuario', @rmtpassword = N'password del usuario'


4. Haga una consulta del Directorio Activo:

--Primer Ejemplo
SELECT
*
FROM
OpenQuery(
ENLACE_DA,
'SELECT * FROM ''LDAP://IP.CONTROLADOR.DE.DOMINIO'''
)

--Segundo Ejemplo
SELECT
sAMAccountName, cn, displayName, mail, info, department, homephone, manager
FROM
OpenQuery(
ENLACE_DA,
'SELECT
info, sAMAccountName, cn, displayName, manager, homephone, department, company, title, samaccounttype, mail FROM ''LDAP://IP.CONTROLADOR.DE.DOMINIO'''
)


Finalmente, para ver una lista completa de los campos validos del directorio activo abra la linea de comandos y ejecute el comando:
CSVDE -f DatosDelDominio.csv

abra el archivo utilizando Microsoft Excel y sitúese sobre la primera fila, note que ésta contiene todos los campos válidos que se pueden utilizar en las consultas LDAP contra el directorio activo.
En mi caso aparecen 293 campos, genial si o que?


accountExpires

adminCount

appSchemaVersion

auditingPolicy

badPasswordTime

badPwdCount

c

cn

co

codePage

cOMClassID

comment

company

countryCode

creationTime

dc

deliveryMechanism

department

description

directReports

displayName

distinguishedName

DN

dNSHostName

dNSProperty

dnsRecord

dNSTombstoned

driverName

driverVersion

dSCorePropagationData

extensionName

flags

forceLogoff

frsComputerReference

frsComputerReferenceBL

fRSFileFilter

fRSMemberReference

fRSMemberReferenceBL

fRSPrimaryMember

fRSReplicaSetGUID

fRSReplicaSetType

fRSRootPath

fRSStagingPath

fRSVersionGUID

fRSWorkingPath

fSMORoleOwner

givenName

gPCFileSysPath

gPCFunctionalityVersion

gPCMachineExtensionNames

gPCUserExtensionNames

gPLink

gPOptions

groupType

homeMDB

homeMTA

homePhone

info

initials

installUiLevel

instanceType

internetEncoding

ipsecData

ipsecDataType

ipsecFilterReference

ipsecID

ipsecISAKMPReference

ipsecName

iPSECNegotiationPolicyAction

ipsecNegotiationPolicyReference

iPSECNegotiationPolicyType

ipsecNFAReference

ipsecOwnersReference

isCriticalSystemObject

keywords

l

lastLogoff

lastLogon

lastLogonTimestamp

lastSetTime

lastUpdateSequence

legacyExchangeDN

localeID

localPolicyFlags

location

lockoutDuration

lockOutObservationWindow

lockoutThreshold

logonCount

logonHours

machineArchitecture

mail

mailNickname

managedBy

managedObjects

manager

mAPIRecipient

masteredBy

maxPwdAge

mDBUseDefaults

member

memberOf

middleName

minPwdAge

minPwdLength

mobile

modifiedCount

modifiedCountAtLastProm

msDS-AllowedToDelegateTo

msDS-AllUsersTrustQuota

msDS-Behavior-Version

mS-DS-CreatorSID

ms-DS-MachineAccountQuota

msDs-masteredBy

msDS-PerUserTrustQuota

msDS-PerUserTrustTombstonesQuota

msDS-TombstoneQuotaFactor

msExchALObjectVersion

msExchExpansionServerName

msExchHideFromAddressLists

msExchHomeServerName

msExchMailboxGuid

msExchMailboxSecurityDescriptor

msExchMasterAccountSid

msExchMobileMailboxFlags

msExchPFTreeType

msExchPoliciesIncluded

msExchRecipientDisplayType

msExchRecipientTypeDetails

msExchRequireAuthToSendTo

msExchUserAccountControl

msExchUserCulture

msExchVersion

msieee80211-Data

msieee80211-DataType

msieee80211-ID

msiFileList

msiScriptName

msiScriptPath

mSMQDependentClientServices

mSMQDigests

mSMQDsServices

mSMQEncryptKey

mSMQOSType

mSMQRoutingServices

mSMQServiceType

mSMQSignCertificates

mSMQSignKey

mSMQSites

msNPAllowDialin

msRTCSIP-ArchiveDefault

msRTCSIP-ArchiveDefaultFlags

msRTCSIP-ArchiveFederationDefault

msRTCSIP-ArchiveFederationDefaultFlags

msRTCSIP-BackEndServer

msRTCSIP-DefPresenceSubscriptionTimeout

msRTCSIP-DefRegistrationTimeout

msRTCSIP-DefRoamingDataSubscriptionTimeout

msRTCSIP-DomainName

msRTCSIP-EnableBestEffortNotify

msRTCSIP-EnableFederation

msRTCSIP-EnterpriseServices

msRTCSIP-FederationEnabled

msRTCSIP-FrontEndServers

msRTCSIP-GlobalSettingsData

msRTCSIP-InternetAccessEnabled

msRTCSIP-MaxNumOutstandingSearchPerServer

msRTCSIP-MaxNumSubscriptionsPerUser

msRTCSIP-MaxPresenceSubscriptionTimeout

msRTCSIP-MaxRegistrationTimeout

msRTCSIP-MaxRoamingDataSubscriptionTimeout

msRTCSIP-MinPresenceSubscriptionTimeout

msRTCSIP-MinRegistrationTimeout

msRTCSIP-MinRoamingDataSubscriptionTimeout

msRTCSIP-NumDevicesPerUser

msRTCSIP-OptionFlags

msRTCSIP-PoolAddress

msRTCSIP-PoolDisplayName

msRTCSIP-PoolType

msRTCSIP-PoolVersion

msRTCSIP-PrimaryHomeServer

msRTCSIP-PrimaryUserAddress

msRTCSIP-SearchMaxRequests

msRTCSIP-SearchMaxResults

msRTCSIP-TrustedServerFQDN

msRTCSIP-TrustedServerVersion

msRTCSIP-UserEnabled

name

nextRid

nTMixedDomain

objectCategory

objectClass

objectGUID

objectSid

objectVersion

operatingSystem

operatingSystemServicePack

operatingSystemVersion

otherHomePhone

otherMailbox

ou

packageFlags

packageName

packageType

pager

physicalDeliveryOfficeName

portName

primaryGroupID

printBinNames

printCollate

printColor

printDuplexSupported

printEndTime

printerName

printKeepPrintedJobs

printLanguage

printMaxResolutionSupported

printMaxXExtent

printMaxYExtent

printMediaReady

printMediaSupported

printMemory

printMinXExtent

printMinYExtent

printOrientationsSupported

printPagesPerMinute

printRate

printRateUnit

printShareName

printSpooling

printStaplingSupported

printStartTime

priority

priorSetTime

productCode

protocolSettings

proxyAddresses

publicDelegates

publicDelegatesBL

pwdHistoryLength

pwdLastSet

pwdProperties

replUpToDateVector

reportToOriginator

repsFrom

revision

rIDAllocationPool

rIDAvailablePool

rIDManagerReference

rIDNextRID

rIDPreviousAllocationPool

rIDSetReferences

rIDUsedPool

sAMAccountName

sAMAccountType

serverName

serverReference

serverReferenceBL

serverState

serviceBindingInformation

serviceClassName

serviceDNSName

serviceDNSNameType

servicePrincipalName

shortServerName

showInAddressBook

showInAdvancedViewOnly

sn

st

streetAddress

subRefs

systemFlags

targetAddress

telephoneNumber

textEncodedORAddress

title

uASCompat

uNCName

upgradeProductCode

url

userAccountControl

userCertificate

userParameters

userPrincipalName

uSNChanged

uSNCreated

versionNumber

versionNumberHi

versionNumberLo

wellKnownObjects

whenChanged

whenCreated

wWWHomePage




Es todo, asi de facil!....




Salu2 desde Cali, Colombia

viernes, 26 de octubre de 2007

Un código en JavaScript para impedir que una caja de texto tenga espacios al principio y al final

Hola

Esta mañana me salió la niña de calidad con que no quería ver espacios ni delante ni detrás del texto que se escribe en un TextBox de la página web para la cual estoy trabajando, después de analizar el caso esta fue la solución que implementé y probé en Internet Explorer 7.0


<
script
language="javascript"
type="text/javascript">



function textoSinEspacios(cadena, evt)

{

if(evt.keyCode == 32 && cadena.length==0) return
false;


if(evt.keyCode == 32 && cadena.length > 2 && cadena.charAt(cadena.length-1) == ' ') return
false;


return
true;

}

</script>


 

¿Cómo aplicarla?

Esto lo apliqué en ASP.net pero tambien funciona sobre controles HTML estándar y para ello agrégale estos atributos a la caja de texto:

onKeyDown="return textoSinEspacios(this.value, event)" OnContextMenu="return false;"

así quedaria para un webcontrol en asp.net:
<
asp:TextBox
ID="txtNombre"
runat="server"
onKeyDown="return textoSinEspacios(this.value, event)"


OnContextMenu="return false;"></asp:TextBox>


 


 

¿Cómo funciona?


Para evitar espacios vacios al principio:

Teniendo en cuenta que el codigo ASCII del espacio es el 32 se puede validar que cuando la lonjitud de la cadena que el usuario escribe en la caja de texto sea cero y si el caracter que acaba de presionar es 32 entonces que retorne un false.

Para evitar espacios vacios al final:
Si la lonjitud de la cadena es mayor que dos y el penultimo carácter es un espacio entonces que retorne false de lo contrario siempre retorna true.

miércoles, 3 de octubre de 2007

Un query que funciona en ORACLE


 


 


 

Modelo de datos: Una persona puede tener una o muchas mascotas.


 

CREATE TABLE PERSONA(


ID NUMBER NOT NULL PRIMARY KEY,


NOMBRE VARCHAR2(100)

)


 

CREATE TABLE MASCOTA (


ID NUMBER NOT NULL PRIMARY KEY,


ID_PERSONA NUMBER REFERENCES PERSONA (ID),


EDAD NUMBER,


NOMBRE VARCHAR2(100)

)


 

--Poblar la tabla Personas

INSERT INTO PERSONA(ID,NOMBRE) VALUES ( 1,'Ronal');

INSERT INTO PERSONA(ID,NOMBRE) VALUES ( 2,'Mauricio');

INSERT INTO PERSONA(ID,NOMBRE) VALUES ( 3,'Luisca');


 

--Poblar la tabla mascotas

INSERT INTO MASCOTA(ID,ID_PERSONA,EDAD,NOMBRE) VALUES ( 1, 1, 13,'osa');

INSERT INTO MASCOTA(ID,ID_PERSONA,EDAD,NOMBRE) VALUES ( 2, 1, 5,'karen');

INSERT INTO MASCOTA(ID,ID_PERSONA,EDAD,NOMBRE) VALUES ( 10, 2, 20,'Tata');

INSERT INTO MASCOTA(ID,ID_PERSONA,EDAD,NOMBRE) VALUES ( 11, 2, 7,'Conguito');

INSERT INTO MASCOTA(ID,ID_PERSONA,EDAD,NOMBRE) VALUES ( 3, 1, 2,'Sapito');

INSERT INTO MASCOTA(ID,ID_PERSONA,EDAD,NOMBRE) VALUES ( 20, 3, 3,'Piojo');

INSERT INTO MASCOTA(ID,ID_PERSONA,EDAD,NOMBRE) VALUES ( 21, 3, 3,'Pioja');

INSERT INTO MASCOTA(ID,ID_PERSONA,EDAD,NOMBRE) VALUES ( 22, 3, 3,'liendra');


 

--Ejecutar el query que saca las mascotas mas jóvenes por persona

SELECT

    P.ID AS ID_PERSONA

    ,P.NOMBRE AS NOMBRE_PERSONA

    ,M.ID AS ID_MASCOTA

    ,M.NOMBRE AS NOMBRE_MASCOTA

    ,M.EDAD AS EDAD

FROM     

    MASCOTA M

    INNER JOIN PERSONA P ON (M.ID_PERSONA = P.ID)

WHERE

    M.EDAD = (

     SELECT MIN(MH.EDAD)

     FROM     MASCOTA MH

     WHERE MH.ID_PERSONA = P.ID

    )

ORDER BY

    ID_PERSONA, ID_MASCOTA


 

--El resultado es el siguiente

ID_PERSONA

NOMBRE_PERSONA

ID_MASCOTA

NOMBRE_MASCOTA

EDAD

1

Ronal

3

Sapito

2

2

Mauricio

11

Conguito

7

3

Luisca

20

Piojo

3

3

Luisca

21

Pioja

3

3

Luisca

22

Liendra

3

miércoles, 6 de junio de 2007

Controlando el teclado extenido en C# .Net

Para los desarrolladores, que en algún momento se van a encontrar con algunas de las siguientes piedras en el camino:

¿Cómo le hago para presionar con código la tecla CAPS LOCK (MAYUS), NUM LOCK, etc.?

¿Cómo le hago para saber si las teclas CAPS LOCK (MAYUS), NUM LOCK, etc. están presionadas?

Pues aquí está la solución para estos cuestionamientos!......

1) Adicionemos un formulario a nuestro proyecto
en el código fuente utilizamos las siguiente librería:

using System.Runtime.InteropServices;


2) Importamos las dos API que siguen:
La primera GetKeyState nos sirve para saber cual es la tecla que se ha presionado
La segunda keybd_event nos sirve para presionar una tecla

public partial class frmTeclas : Form
{
[DllImport("user32.dll")]
public static extern int GetKeyState(byte nVirtKey);
[DllImport("user32.dll")]
static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, UIntPtr dwExtraInfo);
.
.
.

}


3) Definimos las teclas que deseamos controlar (Ver nota al final del documento):

byte NUMLOCK_KEY = 0X90;
byte CAPS_KEY = 0x14;
Nota: Estas definiciones se colocan debajo de las importaciones de las dll

4) Creamos dos funciones útiles para controlar el teclado

//Retornar el estado de una tecla
private bool KeyStatus(byte KeyCode)
{
return (GetKeyState(KeyCode) == 1);
}

//Enviar una senal de presion para (teclado extendido)
private void PresionarTecla(byte KeyCode)
{
const int KEYEVENTF_EXTENDEDKEY = 0x1;
const int KEYEVENTF_KEYUP = 0x2;
keybd_event(KeyCode, 0x45, KEYEVENTF_EXTENDEDKEY, (UIntPtr)0);
keybd_event(KeyCode, 0x45, KEYEVENTF_EXTENDEDKEY KEYEVENTF_KEYUP,
ntPtr)0);
}




5) Aquí es probando, inserta un botón en fu formulario y dale doble clic y colócale el código como sigue:

private void button1_Click(object sender, EventArgs e)
{
if (KeyStatus(CAPS_KEY) == true)
MessageBox.Show("CAPS: Estado Activo");
else
MessageBox.Show("CAPS: Estado Inactivo");

PresionarTecla(NUMLOCK_KEY);
}



Nota:
Una referencia completa del teclado ASCII
http://es.wikipedia.org/wiki/ASCII

Articulo por: Eider Mauricio Aristizábal Erazo.

lunes, 14 de mayo de 2007

Entrar al Sitio de Sharepoint con la URL http://Intranet

Hola!.
Despues de un gran trabajo de instalacion, configuracion e implementacion de tu sitio de SharePoint haz decidido hacer el lanzamiento pero.... no estas conforme con la url de acceso http://ProductionServer/Default.aspx pues te encantaria que encambio los usuarios tuvieran que escribir http://Intranet
Pues estas en el lugar apropiado para solucionar este incidente!




Receta para colocar un alias al servidor





1. Abrir la consola de Administracion de DNS


debes iniciar sesion en un equipo con Windows Server 2003 y hacer clic en el menu Inicio/Herramientas Administrativas/DNS

Aparece la consola de Administracion de DNS




2. Crear un alias

Expanda el arbol que aparece a la izquierda y navegue hasta el nodo zonas de busqueda directa (Forward Lookup Zones)

Haga Clic derecho/Nuevo Alias (CNAME)... sobre el nodo correspondiente al dominio al cual pertenecen los usuarios de SharePoint

Aparece la ventana Registro de Nuevo Recurso, en el campo Nombre de Alias (Alias Name) escribes Intranet y en el campo Nombre de Dominio Completo y Calificado (FQDN) para un hot determinado [Fully qualified domain name (FQDN) for target host] das clic en el boton explorar y buscas el nombre del servidor donde se encuentra tu sitio de SharPoint y das clic en el boton Aceptar




3. Esperar

Ya puedes verificar que el alias sea reconocido, para esto, Inicio/Ejecutar CMD
Aparece la ventana de comandos y digitas el siguiente comando:
nslookup Intranet
este debe arrojar el nombre original de Intranet
Despues de un corto tiempo la tabla del DNS se actualiza
Si el comando
Ping Intranet
arroja resultados entonces cierra la ventana de comandos
listo tu sitio de SharePoint estara disponible con la url http://Intranet

Eider Mauricio Aristizabal
Desarrollador 5 Estrellas



jueves, 10 de mayo de 2007

Cambiar el lenguaje de un sitio de Windows Sharepoint Services 3.0

Hola!
Si estás leyendo esta página es muy probable que tu sitio de SharePoint WSS 3.0 se encuentre en un lenguaje distinto al que tu quieres por ejemplo tengo mi sitio de SharePoint en Ingles pero deseo cambiarlo a español y lo peor es que el sitio está lleno de información está en producción y está altamente personalizado, Instalaste el language pack en español pero no paso nada. Pues estas en el lugar apropiado para solucionar el incidente!

Receta para cambiar el Idioma de un sitio ya creado de Ingles a Español


1. Instalar el Language Pack en español

En el sitio de la descarga, asegúrate deseleccionar el lenguaje Spansih



2. Instalar En el servidor el SQL Server Management Studio Express

3. Instalar el SQL Server Native Client

Clic aqui para ir al sitio de descarga

Una vez instalado, Abrir el Sql Server Management Studio Express y Conectarse a la instancia de SharePoint v3 con el canal named pipe, para esto, mirar en el registro (Inicio/Ejecutar Regedit) y navegar en la siguiente direccion:

HKEY_LOCAL_MACHINE
SOFTWARE
MicrosoftMicrosoft SQL Server
MICROSOFT##SSEE
MSSQLServer
SuperSocketNetLib
Np

Abrir la key llamada NamedPipe y copiar el contenido de esa key
Cierre el Editor de Registro de Windows.

4. Abra el sql server management studio express



Conectarse con los siguientes parametros:
Server Name: el named pipe que copiaste en la key NamedPipe del regedit
Autenticación: windows
Clic en Conectar


5. Cambiar el lenguaje


Navegar hasta la base de datos wss_content

Buscar la tabla dbo.webs y darle clic derecho abrir




Buscar el campo LANGUAGE y LOCALE y cambiarlos por el id del lenguaje en español tradicional es decir el 3082 el ingles Eu es el 1033

Esta tarea se puede hacer con un QUERY
UPDATE DBO.WEBS SET LANGUAGE = 3082, LOCALE = 3082
Cierre el SQL Server Management Studio Express.

6. Abra el sitio de SharePoint que estaba en Ingles

Hasta el momento hemos hecho la mayor parte del trabajo lo que sigue a continuación es revisar el sitio y mirar que algunos formularios tienen contenido en ingles, esto es por que cuando sitio del lenguaje anterior fue creado, el SharePoint generó unos formularios bajo los cuales incluyo el lenguaje Ingles por lo tanto, es necesario abrirlos con el SharePoint Designer y cambiar a mano el contenido de español a Ingles.


Eider Mauricio Aristizabal
Desarrollador 5 Estrellas