terça-feira, 28 de outubro de 2014

Como deletar linhas repetidas SQL Server de maneira fácil

Quem não precisou ainda certamente um dia vai precisar...
Apagar  linhas repetidas SQL Server usando CTE (Commom Table Expressions) é um jeito rápido e muito simples!
Vamos lá:


-- Cria uma tabela que terá as linhas duplicadas
Create Table Funcionarios (Id Int, Nome Varchar(100), Departmento Varchar(50))

-- Insere dados duplicados na tabela (Ids 1 e 4)
insert into Funcionarios values (1, 'João', '.Net')
insert into Funcionarios values (2, 'Arnaldo', '.NET')
insert into Funcionarios values (3, 'Alexandre', 'PHP')
insert into Funcionarios values (4, 'João', '.NET')
insert into Funcionarios values (5, 'Carlos', 'Designer')

-- Lista os registros repetidos considerando as colunas Nome e Departamento
With tblTemp as
(
Select ROW_NUMBER() Over(PARTITION BY Nome, Departmento ORDER BY Nome)
   As RowNumber,* FROM Funcionarios
)
-- Apaga as linhas repetidas, deixando apenas uma delas
Delete From tblTemp Where RowNumber >1

--Apaga a tabela de testes

Drop Table Funcionarios


Fácil né? Sem copias de tabelas, agrupamentos e etc.

quarta-feira, 10 de setembro de 2014

Zerar coluna identity SQL Server (Reset Identity)

Algumas vezes é preciso zerar os dados de uma tabela no SQL Server, e para não perder a sequência de IDs, as vezes também é preciso zerar o identity.

Ao invés de recriar a tabela, o simples comando CHECKIDENT pode fazer isso.

Funciona assim:

DBCC CHECKIDENT('NomeDaTabela', RESEED, 0)

Onde:

  • 'NomeDaTabela' é o nome da tabela que terá o identity reiniciado;
  • RESEED é o comando para reiniciar o identity;
  • 0 é o número para o qual você quer que a contagem recomece, no caso zero. Caso queira voltar para outro número, basta indicá-lo.
Nota: Neste exemplo o próximo número do identity será 1, caso queria que seja 101 por exemplo, atribua o valor 100.

Vamos ao exemplo?

1º) Vamos criar uma tabela de funcionários com identity na coluna Id [Funcionarios]:


CREATE TABLE [dbo].[Funcionarios](
[Id] [int] IDENTITY(1,1) NOT NULL, --Indica que a coluna será incremental de 1
[Nome] [varchar](100) NULL,
[Email] [varchar](200) NULL
 CONSTRAINT [PK_Usuario] PRIMARY KEY CLUSTERED (Id) 
)


2º) Vamos inserir alguns registros na tabela de funcionários:

INSERT INTO Funcionarios VALUES ('Ronaldo Luís Nazário de Lima', 'ronaldo.nazario@exemplo.com.br')
INSERT INTO Funcionarios VALUES ('David Luiz', 'david.luiz@exemplo.com.br')
INSERT INTO Funcionarios VALUES ('Edson Arantes do Nascimento', 'edson.pele@exemplo.com.br')

3º) Vamos checar os ids dos registros inseridos:

4º) Vamos checar o identity atual da tabela, utilizando o mesmo comando RESEED mas sem passar o parâmetro numérico.



5º) Vamos deletar os registros e fazer uma nova inserção, que terá o ID 4:

DELETE FROM [Funcionarios]
INSERT INTO Funcionarios VALUES ('Ronaldo Luís Nazário de Lima', 'ronaldo.nazario@exemplo.com.br')


6º) Como não queremos que a tabela comece do id 4, vamos apagar os registros novamente e zerar o seu Id:
DELETE FROM [Funcionarios]

DBCC CHECKIDENT('[Funcionarios]', RESEED, 0) --Repita o comando, porque na 1ª vez o SQL vai mostrar o identity atual

INSERT INTO Funcionarios VALUES ('Ronaldo Luís Nazário de Lima', 'ronaldo.nazario@exemplo.com.br')

SELECT * FROM [Funcionarios]




E é assim que é possível zerar o identity das tabelas do SQL Server.

Útil principalmente quando há revisão em dados e deseja manter Ids iguais entre diferentes ambientes, como de desenvolvimento e produção por exemplo.

segunda-feira, 7 de outubro de 2013

Google Analytics – Caminho da página e Título da página no mesmo relatório de conteúdo

 Por padrão não é possível extrair num mesmo relatório de conteúdo do Google Analytics a página e o título da página.

Eu precisava muito disso e consegui então resolvi compartilhar!

Vamos lá, com a história triste primeiro e depois o resultado...

No Google Analytics somente é possível extrair relatório por página ou título da página, um por vez, sem a chance de habilitar um dos dois como dimensão secundária.

Ou você tem por Página:



Ou por Título da página:


Não há, na lista de dimensões secundárias, uma opção para página ou título da página:


Mas se você precisa muito juntar estas duas informações num relatório, siga as seguintes instruções usando o navegador Google Chrome (único que testei) e terá sucesso:

1. Classifique o relatório por caminho da página, como se houvesse uma dimensão secundária para o título da página.


2. Como não existe a secunda dimensão que queremos, escolha Conteúdo > Nome do host.



3. Vá até a URL e repare que há dois segmentos nela: O pagePath e o hostname.


4. Agora ficou fácil né? Sim, basta trocar o hostname por pageTitle e mandar um Enter.


5. O resultado é este, caminho da página e o título da página no mesmo relatório de conteúdo.

terça-feira, 16 de abril de 2013

Converter várias linhas em uma string/varchar SQL Server

A dica da vez é sobre como converter várias linhas de um resultado de select por exemplo em uma linha só, separado por exemplo do ponto e virgula ";", no SQL Server.

O script é bem simples e pode ser transformado numa função que retorne string (varchar) para ser usada em outras queries.

No exemplo abaixo criei uma tabela de pessoas, com Id, Nome e Idade. No cenário quero recuperar numa única coluna e linha quais as pessoas com idade > 20, separadas por ponto e virgula.

Vamos lá?

--// Cria tabela de exemplo  num banco de dados do SQL Server
Create table Pessoas (Id Int Identity(1,1), Nome Varchar(100), Idade int)

--// Insere alguns valores na tabela para teste
Insert into Pessoas Values ('Andre', 20)
Insert into Pessoas Values ('Beatriz', 22)
Insert into Pessoas Values ('Carlos', 23)

--// Declara variável que receberá a lista (pode ser maior)
Declare @Result Varchar(200)

--// Inicia variável vazia por que varchar não concatena com null
Set @Result = ''

--// Seleciona cada registro que atende o select e concatena com a variável
Select @Result = @Result + Nome + '; '
  From Pessoas
 Where Idade > 20

--// Se houve resultado, retira o último caractere (;)
If @Result <> ''
Begin
   --// Retira o último caractere ";"
   Set @Result = SUBSTRING(@Result, 1, len(@Result)-1)
End

--// Retorna
Select @Result as Pessoas

No exemplo implementei ainda uma regra para tirar o ponto e virgula do final da variável. O resultado é o seguinte:
Resultado


Coisa simples, mas evita alguns loops, seja com cursor ou tabela temporária, que é a primeira coisa que pensamos diante de uma necessidade como essa.

Simples né? Espero que útil também!

segunda-feira, 15 de abril de 2013

Desabilitar temporariamente foreign key SQL Server

No SQL Server, algumas vezes é preciso alterar dados de tabelas relacionadas e com a existência de foreigns keys se torna uma tarefa impossível, porque quando você tenta fazer update na tabela 1 recebe erro por existirem dados relacionados na tabela 2 e vice e versa.

Para quem precisa, assim como eu eventualmente preciso, fica a dica para desabilitar foreign key temporariamente. (E tem que ser mesmo temporária hein!)

Nota: É possível desabilitar todas as foreign keys de uma vez ou alguma específica, conforme os exemplos:

Todas as foreigns keys
-- 1º) Desabilita TODAS as foreign key de uma tabela SQL Server
ALTER TABLE [NomeDaTabele] NOCHECK CONSTRAINT ALL

-- 2º) Habilita TODAS as foreign key de uma tabela SQL Server novamente
ALTER TABLE [NomeDaTabela] CHECK CONSTRAINT ALL


Uma foreign key específica
-- 1º) Desabilita uma foreign key específica de uma tabela SQL Server
ALTER TABLE [NomeDaTabela] NOCHECK CONSTRAINT [NomeDaConstraint]

-- 2º) Habilita uma foreign key específica de uma tabela SQL Server
ALTER TABLE [NomeDaTabela] CHECK CONSTRAINT [NomeDaConstraint]


Mais uma vez atento para não esquecer de habilitar a foreign key depois.

É isso aí, simples e objetivo! Espero que também seja útil!

sexta-feira, 7 de dezembro de 2012

Geolocation com HTML 5 e API Mapas do Google

O HTML 5 traz bastante simplicidade: Geolocalização (Geolocation), LocalStorage (Armazenamento local), EditableConteúdo editável, PlaceHolders, Expressões regulares e etc.

Neste post vou escrever sobre a Geolocation. A propósito, se não autorizou o acesso à sua localização, volte e autorize para vê-la no mapa.


              

<< Sua geolocalização vai aparecer aqui >>

A Geolocation do HTML 5 recupera a localização do usuário, especificamente a longitude e a latitude do ponto de acesso à internet. Isso pode variar de rede à rede e das configurações que cada uma pode ter. Mas em situações normais, a localização do acesso será identifica.

Juntando a Geolocation com a API de mapas do Google, temos o resultado acima, que é a exibição da localização no mapa.

Vamos lá, aos códigos! Primeiros exemplos e comentários e depois todo código disponível para download.

Como vamos monta um mapa, é preciso fazer referência à API de Mapa do Google, linha 8. O parâmetro sensor=false indica que não estou usando a API a partir de aplicação com sensor, como um GPS de um Smartphone por exemplo:

É preciso criar as funções javascript para ordenar os acontecimentos, que são 3: Recuperação da localização, Montagem do mapa e tratamento de erros.

Primeiro criamos a que recupera a localização. Ela verifica se o Navegador suporta Geolocalização e em caso positivo segue para a montagem do mapa:
Depois, criamos a função que monta o mapa. Ela recebe os parâmetros de latitude e longitude do resultado da função que recupera a Geolocalização.

O objeto retornado, o position, tem as propriedades latitude e longitude, dentro de coords. Para a API de mapa do Google, precisamos apenas dessas duas informações:
No uso da API, podemos configurar opções, como altura (height), largura (width), tipo de mapa (MapTypeId) e etc. Para conhecer mais sobre esta API, o ideal é acessar a documentação completa on-line em https://developers.google.com/maps/documentation/javascript/.

Acima foi a função de sucesso. Abaixo a função de erro (quando não o navegador não suporta Geolocation):

É preciso também preparar os elementos que receberão as mensagens de sucesso ou erro e uma <div> que receberá o mapa da API do google. Veja o exemplo das mensagens:


Concluídos estes passos, basta chamar a função que recupera a Geolocalização, no caso a recuperaGeolocalizacao(). Pode ser no onclick de um botão ou no onload da página dentro da tag <body> , como no exemplo a seguir. A própria função se encarregará de montar o mapa ou mostrar o erro, a depender do resultado.


E é isso, o resultado é o local exibido no mapa. Se copiar a latitude e longitude e lançar no Google, o resultado é exatamente o mesmo. Teste!

Fica o código completo disponível para download aqui. Espero ter sido útil!

sábado, 1 de dezembro de 2012

Recortar imagens no photoshop com demarcadores

É muito comum precisar recortar imagens no photoshop. É muito comum também para os que não são especialista - como no meu caso - saber qual o melhor método para conseguir a melhor qualidade.

Vou deixar hoje uma dica de usar demarcadores no photoshop, ao invés de ferramentas de seleção.

Temos a imagem abaixo e queremos tirar dela o fundo branco para, por exemplo, fazer um .png com fundo transparente:



Umas das estratégias seria usar a ferramenta varinha mágica e clicar no espaço branco, conforme as imagens abaixo:



Com controle de tolerância, suavização de serrilhado e ajustes manuais com as ferramentas laços, podemos até ter bons resultados, mas tem outro jeito: utilizar a ferramenta caneta para marcar as áreas de corte do fundo da imagem:



Com a ferramenta caneta escolhida, clicamos ponto a ponto e marcamos as áreas de corte do fundo da imagem.


Note que a própria ferramenta tenta ajudar na criação das marcações, a partir do segundo clique, já traçando curvas automaticamente, o que muitas vezes acaba atrapalhando. Neste caso é preciso (no primeiro clique) cortar a ação automática dele, clicando em cima do segundo ponto com a tecla ALT pressionada:


Após terminar a marcação conforme desejado, termos o seguinte:

O marcador fica na aba Demarcadores e para utilizá-lo como seleção e recortar a imagem basta: 1º Selecionar camada da imagem; 2º Clicar no demarcardor segurando a tecla Control; 3º Inverter a seleção Ctrl + Shit + I e deletar.


Os resultados são as possibilidades de sobrepor imagens com recortes mais bem apurados:
 

Daí pra frente é com a imaginação e criatividade.

Espero que tenha sido útil!