Wednesday, October 26, 2011

Bem, é provável que já tenham precisado de importar dados de um ficherito de texto para uma tabela do sql server, se não precisou quando precisar já sabe quando acabar de ler este post :)

Tendo em conta que podem existir basicamente dois tipo de ficheiro txt ou csv vamos tentar criar uma solução que consiga lidar com essa situação.

BULK INSERT foi introduzido no SQL Server 7 e permite a interação com o bcp ( bulk copy program). Nas versões anteriores do SQL Server só era possível aceder ao bcp pela prompt.

Agora temos dois tipos de ficheiros:

TipoFicheiro=1(txtFile1.txt)

"Jose";"Fernandes";"20"
"Maria";Isabel";"21"
"Rui";"Costa";"10"

TipoFicheiro=2(txtFile2.txt)

Jose;Fernandes;20
Maria;Isabel;21
Rui;Costa;10


Tendo já os nossos ficheiro vou mostrar a syntax:
BULK INSERT tabelaTemp FROM 'c:txtFile1.txt' WITH(FIELDTERMINATOR= ' ";" ')
tabelaTemp -> table temporária de destino dos dados
FIELDTERMINATOR -> argumento que permite especificar qual o delimitador das colunas
BULK INSERT tabelaTemp FROM 'c:txtFile2.txt' WITH(FIELDTERMINATOR= ';')
Aqui a única diferença é o valor do argumento FIELDTERMINATOR

Para facilitar a reutilização vamos criar uma stored procedure, mas antes vou criar a tabela que vai receber os dados.
A tabela final e temporária:

CREATE TABLE TDados
(
ID int IDENTITY NOT NULL,
Nome varchar(50) NOT NULL,
SobreNome varchar(50) NOT NULL,
Idade int NOT NULL,
Valor int NOT NULL
)
go
CREATE TABLE TDados_TEMP
(
Nome varchar(50) NOT NULL,
SobreNome varchar(50) NOT NULL,
Idade int NOT NULL
)
go
e agora a nossa stored:



SET QUOTED_IDENTIFIER OFF
go
CREATE PROCEDURE SP_ImportaTxt 
@PathFicheiro varchar(100),
@Valor integer, 
@TipoFicheiro tinyint 
--Step 1:  BULK INSERT Statement
DECLARE @SQL varchar(2000) 
IF @TipoFicheiro = 1  
BEGIN   
-- formato válido: "M";"A";"10"   
SET @SQL = "BULK INSERT TDados_TEMP FROM '"+@PathFicheiro +"' WITH (FIELDTERMINATOR = '"";""') "
  END ELSE  BEGIN   -- formato válido: M;A;10   SET @SQL = "BULK INSERT TDados_TEMP FROM '"+@PathFicheiro +"' WITH (FIELDTERMINATOR = ';') "  END  --Step 2: Executar BULK INSERT statement EXEC (@SQL)  --Step 3: Inserir os dados na tabela finalINSERT TDados(Nome,SobreNome,Idade,Valor) SELECT  CASE WHEN @TipoFicheiro = 1 THEN SUBSTRING(Nome,2,DATALENGTH(Nome)-1)              ELSE Nome         END,         CASE WHEN @TipoFicheiro= 1 THEN SUBSTRING(SobreNome,1,DATALENGTH(SobreNome)-1)              ELSE SobreNome         END,         @Valor FROM TDados_TEMP  --Step 4: Empty temporary table TRUNCATE TABLE TDados_TEMP go

Tenha em atenção que devera verificar se SET QUOTED_IDENTIFIER é OFF, por causa das aspas....
Depois eh só chamar a stored:
EXEC SP_ImportaTxt 'c:txtFile1.txt',1,2
EXEC SP_ImportaTxt 'c:txtFile2.txt',2,15
E pronto és isto:D espero não ter nenhum BUG :)
Se quiseres saber mais sobre a sintaxe do BULK INSERT é só ir aqui.
Cumprimentos

Monday, October 17, 2011

sharepoit moss 2007 pages dont appear in navigation/site number limitation in sharepoint moss 2007

Recently we had a very strange problem in Sharepoint.
A customer reported that when creating a page that does not appear in the navigation.
After some research we found that Sharepoint is limited to 50 pages.
solution:

Change the following lines in web.config:
add name="GlobalNavSiteMapProvider" description="CMS provider for Global navigation" type="Microsoft.SharePoint.Publishing.Navigation.PortalSiteMapProvider, Microsoft.SharePoint.Publishing, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" NavigationType="Global" EncodeOutput="true" DynamicChildLimit="0" IncludePages="PerWeb" IncludeHeadings="true" IncludeAuthoredLinks="true" />
add name="CombinedNavSiteMapProvider" description="CMS provider for Combined navigation" type="Microsoft.SharePoint.Publishing.Navigation.PortalSiteMapProvider, Microsoft.SharePoint.Publishing, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" NavigationType="Combined" EncodeOutput="true" DynamicChildLimit="0" IncludePages="PerWeb" IncludeHeadings="true" IncludeAuthoredLinks="true" />
add name="CurrentNavSiteMapProvider" description="CMS provider for Current navigation" type="Microsoft.SharePoint.Publishing.Navigation.PortalSiteMapProvider, Microsoft.SharePoint.Publishing, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" NavigationType="Current" EncodeOutput="true" DynamicChildLimit="0" IncludePages="PerWeb" IncludeHeadings="true" IncludeAuthoredLinks="true" />
add name="CurrentNavSiteMapProviderNoEncode" description="CMS provider for Current navigation, no encoding of output" type="Microsoft.SharePoint.Publishing.Navigation.PortalSiteMapProvider, Microsoft.SharePoint.Publishing, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" NavigationType="Current" EncodeOutput="false" DynamicChildLimit="0" IncludePages="PerWeb" IncludeHeadings="true" IncludeAuthoredLinks="true" />

The parameter changes (in bold) is the DynamicChildLimit. When not specified the default is 50. I changed to "0" means unlimited.
Abraços

Windows Powershell Builder for SharePoint 2010 and Office 365

Seguindo os posts de meu amigo André Lage, vi que ele colocou um link de uma ferramenta muito útil que a microsoft disponibiliza.
Trata-se de uma ferramenta online (em Silverlight) que nos ajuda a gerar scripts de PowerShell para Sharepoint 2010 e Office 365.

Fica aqui o link:Windows Powershell Builder for SharePoint 2010 and Office 365
Manual: Windows PowerShell Command Builder Getting Started Guide

Abraços e obrigado André:)

Friday, October 7, 2011

Steve Jobs Patentes

Bem, com a notícia da morte de Steve Jobs surigiram diveras informações uma dela é o registo de 313 patentes
com o seu nome.
O site do NY Times tem uma excelente página sobre isso.
Vejam aqui:
http://www.nytimes.com/interactive/2011/08/24/technology/steve-jobs-patents.html