Consulta SQL usando tabela dinâmica

Hoje quero falar sobre tecnologia, mas especificamente sobre consultas a banco de dados utilizando a linguagem SQL.

Durante meu curso de Sistemas de Informação, na disciplina de Banco de Dados, tive um professor que era extremamente entusiasta dessa ferramenta, não sem razão. É possível fazer muita coisa com ela, sabendo usar corretamente. A maioria dos que usam SQL não passa dos SELECTs, INNER JOINs, LEFT JOINs e assim por diante, mas ela oferece muito mais do que isso. Uma analogia que me satisfaz é dizer que SQL compara-se a um canivete suíço, se você não sabe usar, vai utilizá-lo somente para cortar outros objetos, mas se explorá-lo um pouco mais, vai descobrir que ele só não fala porque precisaria de baterias :D.

Vamos imaginar a seguinte situação: você tem uma tabela com todas as vendas realizadas pela empresa, com a seguinte disposição (vamos chamá-la de ITEM_VENDA):

---------------------------------------------------
| Produto | Quantidade | Valor       | Data       |
---------------------------------------------------
| P1      |       1,00 |      350,00 | 05/01/2017 |
| P2      |       1,00 |     1200,00 | 09/01/2017 |
| P1      |       3,00 |      900,00 | 25/01/2017 |
| P1      |       2,00 |      500,00 | 01/02/2017 |
| P1      |       5,00 |     1300,00 | 04/02/2017 |
| P2      |       3,00 |     3000,00 | 04/02/2017 |
| P2      |       3,00 |     2900,00 | 16/02/2017 |
| P2      |       1,00 |     1100,00 | 17/02/2017 |
| P2      |      10,00 |    10000,00 | 20/02/2017 |
---------------------------------------------------

Temos dois produtos (P1 e P2) que foram vendidos nos dois primeiros meses de 2017, com valores distintos. O gerente de vendas precisa saber quanto foi vendido de cada produto em cada mês do ano, para fazer uma comparação. A estrutura do relatório deverá ser:

-----------------------------------------------------------
| Produto | Quant_Jan | Valor_Jan | Quant_Fev | Valor_Fev |
-----------------------------------------------------------

Existem diversas formas de montar o relatório, mas a que mais me agrada é a utilização de tabelas dinâmicas, que são criadas em tempo de execução. Para o Microsofr SQL Server, o script seria:

WITH ITEM_JAN AS (
 SELECT Produto, SUM(Quantidade) AS Quant_Jan, SUM(Valor) AS Valor_Jan
 FROM ITEM_VENDA
 WHERE Month(Data) = 1
 GROUP BY Produto
), ITEM_FEV AS (
 SELECT Produto, SUM(Quantidade) AS Quant_Fev, SUM(Valor) AS Valor_Fev
 FROM ITEM_VENDA
 WHERE Month(Data) = 2
 GROUP BY Produto
)

SELECT ITEM_JAN.Produto, Quant_Jan, Valor_Jan, Quant_Fev, Valor_Fev
FROM ITEM_JAN
 INNER JOIN ITEM_FEV ON ITEM_JAN.Produto = ITEM_FEV.Produto
ORDER BY ITEM_JAN.Produto

O resultado da consulta seria:

-----------------------------------------------------------
| Produto | Quant_Jan | Valor_Jan | Quant_Fev | Valor_Fev |
-----------------------------------------------------------
| P1      |      4,00 |   1250,00 |      7,00 |   1800,00 |
| P2      |      1,00 |   1200,00 |     17,00 |  17000,00 |
-----------------------------------------------------------

Explicando resumidamente, o que fiz foi criar duas tabelas (ITEM_JAN e ITEM_FEV) dinamicamente, ou seja, elas não existem no banco de dados, apenas na memória, enquanto o script está sendo executado. Porém, ao construir a string, o SQL Management Studio interpreta como se as tabelas realmente existissem, apresentando-as na lista suspensa do autocompletar.

Outro detalhe é que usei INNER JOIN, porque houve venda de todos os produtos nos dois meses selecionados. Porém, poderia ter feito com OUTER JOIN, assim, se em um determinado mês o produto P1 não tenha sido vendido e no mês seguinte foi a vez de P2 não vender, ainda assim eles seriam apresentados no relatório, com quantidade e valor NULL (também podemos fazer um tratamento para quando isto ocorrer, apresentar zero, para facilitar a manipulação).

Conclusão

Como mencionei anteriormente, não existe apenas uma forma de chegar ao mesmo resultado, depende do conhecimento e gosto do programador. Algumas opções consomem mais recursos que outros, mas podem ser mais fáceis de serem entendidas. Apenas um DBA (Database Administrator – administrador de banco de dados) poderá dizer qual é a melhor.

Bancos de dados são recursos altamente utilizados na indústria. Seria de grande utilidade que fossem introduzidos já no ensino fundamental, como forma de praticar os ensinamentos matemáticos da teoria de grupos.

Referências bibliográficas no Word

Gente.. esse post foi escrito há DOIS anos! Estava aqui nos rascunhos e eu tinha me esquecido completamente dele. 

Como o assunto é interessante, não podia deixar de compartilhar. Porém vou manter o texto como era para ser publicado na época. Situando: eu estava no quarto e último ano da faculdade, o que realmente me deu trabalho, em todos os sentidos. 

Depois de três anos de faculdade, enfim um ano que está me tirando do sério desde o início. A começar pela quantidade imensa de trabalhos que os professores andam dando. Isso sem contar situações inesperadas onde pessoas “esquecem” o que dizem e acabam nos prejudicando. Mas ao término do primeiro bimestre, pelo menos as coisas acabaram se acertando.

Para piorar a situação, como este é o último ano, as obrigações são bem maiores, estágio obrigatório (é, troquei de emprego, cansei da vida de suporte) e o temido TCC.

O ano não começou muito bem. Tivemos alguns problemas para formar a equipe e para acertar o tema do trabalho. Com estes detalhes definidos, só partir para campo, né? Ou melhor, para a programação. Ledo engano. Pesquisas, muita leitura, participação em apresentações de atividades relacionadas ao tema, enfim, muito trabalho a fazer.

Com tanta gente na equipe – este ano são cinco – fica difícil controlar formatação de documento. Muitas referências, padrões, coisas demais para nos preocuparmos. E vamos combinar, padronização de documento é algo bem chato quando não se tem paciência, que não é o meu caso. Mas dá para sofrer menos pensando um pouco mais.

Comecei a fazer a coleta de referências bibliográficas e formatação manualmente, com todo cuidado para não sair do padrão, de acordo com o tipo, etc. Mas a paciência que me sobra falta em muitos do grupo e no final a quantidade de retrabalho era absurda. Resultado: mais perda de tempo.

Eis então que o artigo Instalando referências ABNT no Word 2007, do blog TecnoSapiens iluminou todos os meus dias. Simples, fácil de instalar e pronto para usar.

O Word 2007 (e somente a partir dele), nativamente, oferece suporte para catalogação de referências bibliográficas, que podem ser utilizadas como citações através de referências cruzadas. Porém, os modelos disponíveis não correspondem às normas da ABNT. A instalação e utilização é simples, basta seguir os passos abaixo:

1. Baixe o arquivo deste link.

Este arquivo corresponde ao novo estilo para referências seguindo as normas da ABNT.

2. Salve o arquivo no caminho:

Para o Office 2007 ou 2010: %program files%\Microsoft Office\Office12\Bibliography\Style, onde %program files% é o diretório padrão de instalação de softwares no Windows (Arquivos de Programas para os sistemas em português). Office12 para 0 2007 e Office14 para o 2010.

Para o Office 2008 ou Mac: /Applications/Microsoft Office 2008/Microsoft Word.app/Contents/Resources/Style/

Pronto! O novo estilo já estará disponível para utilização. Os passos a seguir mostram como inserir as referências e como utilizar em citações.

 

3. Abra o Word.

Na guia Referências, altere o estilo para ABNT NBR 6023:2002.

referencias_abnt

4. Cadastre as referências.

Ainda na aba Referências, clique em Gerenciar fontes bibliográficas. Selecione o tipo da referência e preencha com os campos necessários. Nem todos os campos são obrigatórios, mas é importante preencher o máximo possível dos disponíveis. Também é bom ficar atento quanto às datas não definidas ou nomes de títulos. Obras com título e subtítulo devem ser informados no campo Título separados por dois pontos ( : ). Esses foi um dos macetes que só descobri tentando.

Há ainda um botão onde é possível informar os dados do autor, assim ele já deixa no padrão correto. Depois de confirmado, a citação ficará salva no Word e poderá ser usada em qualquer novo documento, aparecendo no campo Lista Mestra. Para usar no documento atual, clique em Copiar e confirme.

fonte_bibliografica

5. Insira citações através da referência cruzada.

Além da formatação dos dados da obra, o Word também formata a referência da citação. Para isso, basta inserir a referência cruzada, clicando em Inserir citação e selecionar a obra desejada. Dados como nome da obra, data e nome do autor podem ser ocultados (ao clicar sobre o texto inserido, o Word abre um menu para edição), dependendo do tipo de citação realizada (direta ou indireta). Uma vantagem é que utilizando a referência cruzada, o Word marca quais obras foram realmente referenciadas, permitindo que se exclua o que não for usado para criar uma outra lista de obras consultadas.

citacao

6. Crie a bibliografia.

Na parte do documento reservada à bibliografia, clique em Referências > Bibliografia e selecione o estilo desejado. A formatação dos campos (negrito, itálico, posições, etc.) são automaticamente configuradas pelo Word. Caso precise adicionar nova obra, basta cadastrar a fonte e atualizar a bibliografia.

bibliografia

Considerações:

O Word é uma mão na roda quando se sabe usá-lo corretamente. A lista de referências não é exceção. Porém, este estilo disponibilizado não é completo, alguns tipos de referências não funcionam ou não são formatados de forma correta. Além disso, a maioria das universidades/faculdades possui suas próprias diretrizes para elaboração de documentos científicos, com o intuito de especificar melhor o que a ABNT deixa vago. Eu mesma tive que alterar o arquivo para atender às diretrizes da minha faculdade. Portanto, mesmo que o programa faça boa parte do trabalho, é bom estudar a norma para ter uma noção e saber identificar problemas, para não chegar na apresentação e ficar com cara de pastel diante da banca avaliadora.

A falta de documentação explicando melhor os tipos ou até mesmo os não suportados é um problema. Dependendo do volume, pode ser que esta ferramenta venha a atrapalhar muito mais do que ajudar.

Um estudo da ferramenta, testes e simulações são recomendadas antes de iniciar o trabalho oficial.

E por último, novamente destaco a necessidade de estudar a norma ABNT e ficar por dentro das diretrizes do seu curso. Por mais que o trabalho seja automatizado, é sempre bom saber diferenciar o certo do errado. Com o tempo o olho se adapta e consegue identificar problemas com facilidade, mas para chegar lá é preciso fazer.

Oracle Java 7 no Debian Squeeze

Já tem algum tempo que eu tento acessar o site do Banco do Brasil pelo Iceweasel do Debian Squeeze, mas por causa da versão desatualizada do meu Java eu não conseguia. Tentei, não com tanto empenho, encontrar uma forma de voltar a funcionar, mas como eu tinha uma máquina virtual Windows, sempre ficava para depois. Só que eu cansei de esperar a máquina virtual abrir, já tenho pouca memória no notebook e ainda ter que compartilhar com a VM estava complicado.

Não sei de onde vêm esses insights, coisa rara de acontecer comigo ultimamente, mas hoje, não sei porque, não sei como, resolvi consultar a versão do Vuze e percebi que o Java era antigo. Então dei uma “googlada” e encontrei este tutorial, que reproduzo aqui:

# echo deb http://ppa.launchpad.net/webupd8team/java/ubuntu precise main > /etc/apt/sources.list.d/webupd8team-java.list
# echo deb-src http://ppa.launchpad.net/webupd8team/java/ubuntu precise main >> /etc/apt/sources.list.d/webupd8team-java.list
# apt-key adv –keyserver keyserver.ubuntu.com –recv-keys EEA14886
# apt-get update
# apt-get install oracle-java7-installer

No site original, os comandos “echo” estão com aspas, mas eu tive que editar o arquivo webupd8team-java.list porque deu erro justamente por causa delas.

O pacote de 93MB para instalação é baixado direto do site da Oracle (lindo!). Então é só esperar e ser feliz.

Ah, e não se esqueça de desinstalar a versão antiga, da Sun (a loirinha aqui esqueceu e achou que tinha feito algo errado).

# apt-get remove sun-java6-*

Depois é só fechar o browser, no meu caso o Iceweasel, e aproveitar.

Para consultar a versão:

$ java -version
java version “1.7.0_07″
Java(TM) SE Runtime Environment (build 1.7.0_07-b10)
Java HotSpot(TM) Server VM (build 23.3-b01, mixed mode)

e do JavaC…

$ javac -version
javac 1.7.0_07

Tudo bem que eu só consegui fazer isso agora que tenho um notebook novo, com Windows 8. Mas não penso em abandonar meu pequeno STi que me atura há cinco anos.

debian-logo

E para quem ainda não sabe, dia 4 deste mês foi lançada a versão 7.0 do Debian, cujo nome é Wheezy. Já estou animada para trocar a minha. Mais detalhes no site oficial do Debian.

É melhor simplificar

“Puedes hacer el software más complejo del mundo, pero si no es fácil de usar, vas a ser su único usuario.”

– @darylkoop
(Vía un RT de @bi0xid de @nacin)

Traduzindo: “Você pode fazer o software mais complexo do mundo, mas se não for fácil de usar, você será o único usuário.”

Fonte: Microsiervos

Desativar beep do alto-falante interno no Windows

Sabe aquele barulho irritante que o Windows faz quando emite uma mensagem de alerta ao usuário? Aquele beep emitido pelo alto-falante interno do PC? É de tirar qualquer um do sério. Principalmente porque ele geralmente acontece quando a gente menos espera.

Quem é programador sabe do sofrimento que é ouvir sequências desses beeps. Se você trabalha com pessoas ao redor, elas provavelmente vão gostar menos ainda.

Pesquisando um pouco na net, depois de sofrer semanas no trabalho com o barulho, encontrei esta dica: no Windows XP, clique com o botão direito sobre “Meu Computador” e em Propriedades. Na guia “Hardware”, selecione o botão “Gerenciador de dispositivos”.

Na tela que abrir, clique em “Exibir > Mostrar dispositivos ocultos”. Em “Drivers que não são plug and play”, localize a opção “Beep”, dê um clique com o botão direito do mouse e selecione “Desativar”.

Reinicie o computador e seja feliz!

Fonte: Explorando e aprendendo

Cantando em Prolog

Se tem uma raça de programador pior do que o bobo-alegre eu não conheço. Mas eu confesso: sou uma programadora boba-alegre.

Mas o que isso quer dizer?

Duas características principais de um programador bobo-alegre:

1. Bater palminhas quando chegam ao resultado esperado.

Sim, eu faço isso, por mais ridículo que seja, eu faço. Mas não é de maldade. Programar é como brincar de Lego, você junta as bibliotecas, procura uma função que faça o que você precisa, faz um esquema (algoritmo) e pronto! Se tudo correr bem (o que nem sempre acontece), você consegue fazer o seu código rodar.

Para quem é técnico em eletrônica (como eu), já deve ter passado pela emoção de fazer um pisca-pisca. Ver aqueles dois leds piscando é a maior emoção do mundo! Compilar um código sem erros então? Dá vontade de chorar de amoção.. =)

O legal está no fato de você saber que realmente aprendeu algo, isso não tem preço. É por isso que eu comemoro.

2. Conversar com o código.

Euzinha bato altos papos com as linhas, variáveis. São praticamente minhas amigas. Quanto mais eu vou programando, mais amigos eu faço.

Tudo bem que tem certas horas que um ou outro resolve encrencar comigo e esconder o jogo, mas nada que um jeitinho não resolva.

Explicado? Às vezes nem eu mesma entendo. Só sei que gosto de programação e é isso que me faz feliz no trabalho.

Tá, mas o que tudo isso tem a ver com o título desse post?

Simples. Nas aulas de Inteligência Artificial, estamos estudando Prolog. Um paradigma, digamos, ímpar. A tarefa desta semana era fazer um código que “cantasse” a música do elefante (sabe, aquela que incomoda a gente?).

Desafio extra, já que eu perdi muitas aulas e nem um simples if-then-else eu sabia fazer. Mas desafio é desafio e é isso que me anima.

Depois de alguns minutos e da super ajuda do Pai dos Internautas e Programadores Aflitos Google, eis que surge o código abaixo:

cante(Y):-cante(1,Y).
cante(X,Y):-X=<Y,
	(Z is X mod 2,
	(Z=1 -> impar(X); par(X)),
	 X1 is X+1, 
	 cante(X1,Y)).

impar(X):-write(X), (X is 1 -> write(' elefante incomoda muita gente\n');
				write(' elefantes incomodam muita gente\n')).

par(X):-write(X), write(' elefantes'), not(incomoda(X)), write(' muito mais\n').

incomoda(Y):-incomoda(1,Y).
incomoda(X,Y):-X=<Y,
	(write(' incomodam'),
	X1 is X+1,
	incomoda(X1,Y)).

O código é simples, usa recursividade para a contagem dos elefantes e outro laço recursivo para a impressão dos “incômodos”.
Para executar o código, basta chamar a função cante() passando como argumento a quantidade de “elefantes” desejada.

That’s it!

Nova saga com meu laptop + Linux

Pessoas são interessantes. Mais engraçadas que interessantes. Particularmente eu não entendo muito do comportamento humano, acho que é por isso que eu tenho tanta tendência a fazer psicologia. Quem sabe um dia, depois do trauma de passar quatro anos em uma faculdade de tecnologia e estar recuperada eu pense com mais interesse no assunto (o que eu não duvido que demore muito).

Dizem por aí que as pessoas mudam, se colocadas em um ambiente transformador, que ofereça condições que levem uma pessoa a se adaptar. Mas particularmente eu acredito que adaptação não é sinônimo de mudança. A essência da pessoa não muda, muito menos suas características mais marcantes.

A minha característica mais marcante é a teimosia (veja meu perfil no Twitter). Quem convive comigo sabe que quando eu coloco algo na cabeça, dificilmente alguém consegue tirar. E é por isso que neste exato momento eu estou instalando o Debian no meu laptop, o que me faz ter que esperar 2 horas, 9 minutos e 50 segundos para baixar os pacotes, porque a imagem é netinst e minha rede é de 1MB apenas. Isso me dá um tempo bom para escrever este post, tempo aliás que ultimamente anda me faltando.

Tudo começou quando meu Windows 7 começou a dar tela azul (acreditem!). Provavelmente peguei um dos milhares de virus que circulam na rede da faculdade. A dúvida então era se eu reinstalava o Windows 7, fazia downgrade para o XP (meu filhote só tem 2GB de RAM e eu sou muito consumista), ou como alternativa instalaria uma distribuição Linux. Como eu gosto de coisas desafiadoras, escolhi o Linux.

Minha distro favorita é o Debian. Quando conheci o apt-get install foi paixão à primeira vista. Não sou usuária de alto nível, mas sou curiosa. Consegui um DVD com um amigo, mas a imagem era para processadores 64 bits, coisa que o meu coitadinho Dual Core não é. O jeito foi instalar o Kubuntu que estava na mão mesmo.

Um mês e alguns dias depois, ainda não satisfeita, pois como disse acima eu sou teimosa, e com alguns problemas com o Kubuntu, como o touchpad que não funcionava ao retornar da hibernação e o VirtualBox que insistia em dar pau, eu resolvi mudar de vez para o Debian, agora de verdade. E como, novamente, não gosto de coisas fáceis, não tinha um DVD-R para gravar a imagem e as tentativas de fazer um pendrive bootável não surtiram sucesso. Nem mesmo com a ajuda do Marcellus Pereira, com todo seu conhecimento. Resultado: depois de quase dois dias de briga com a imagem, cá estou eu instalando o Debian com um CD milagrosamente achado na empresa.

Neste exato momento, a instalação informa que faltam 1 hora, 10 minutos e 15 segundos para o fim. O que ainda me daria tempo para mais um post. Assuntos não me faltam. Tempo? Esse sim anda me tirando do sério. Ah, e meu TCC também, aliás, um dos próximos assuntos a postar aqui, se tudo der certo.

O jeito é sair e tomar um café enquanto a instalação termina.