Tecnologias usadas:
Banco de
dados SQL Server 2005
Linguagem
de programação: C#.NET
Tecnologia:
ASP.NET
Stored
Procedure
Objetivo:
O meu objetivo é mostrar a todos vocês
leitores, como é fácil fazer passo a passo um sistema de enquete. As perguntas
são buscadas no banco de dados utilizando Stored Procedure junto com as
respostas.
Figuras e Solução:
Todas as figuras neste texto não é de
ilustração, ou seja, são figuras reais; buscadas da solução real. Todo o
software mostrado nestes passos, foi feito, comprovado e testado.
Projeto:
Vamos começar de camada debaixo para
cima, ou seja, da parte de acesso a dados para depois irmos à camada de
aplicação. O primeiro passo é mostrar como está o banco de dados, ou seja, tabela
e stored procedures. (Referência 1.1)
Referência
1.1
É importante dizer que, quando pensei
em fazer uma enquete; pensei em duas tabelas diferentes, uma apenas com as
perguntas e outra com as respostas. Lógico que, contendo uma chave com
co-relação entre tabelas.
Tabela TB_ENQUETE_PER
Note que, na tabela TB_ENQUETE_PER o campo CH_PER é a chave que não permite NULL e é AUTO-INCREMENTADO. O campo NO_PER
fica a descrição da pergunta, ou seja, propriamente a pergunta da enquete.
No campo DT_PER fica a data da pergunta para controle e o último campo ST_PER é o status da pergunta, isto é,
ativo ou inativo (0 ou 1) que no meu caso escolhi. Você pode colocar ‘A’ ou ‘I’
sem nenhum problema; lembrando que no momento de pegar as perguntas o status
deve ser correlativo.
Tabela TB_ENQUETE_RES
O campo CH_RES funciona como chave da tabela de resposta, auto-incremento e
não permite NULL. CH_PER é o campo relacionado a pergunta
cadastrado na tabela anterior, ou seja, cadastrado na tabela TB_ENQUETE_PER. Este é o campo
importante para relacionar a pergunta com as resposta. Lembro que, para cada
pergunta podem ter várias respostas.
No campo OPCAO_RES, posso colocar a descrição da resposta, por exemplo (Sim,
Não). O campo VOTOS_RES é para
computar os votos postados pelos usuários, ou seja, o número de votos para esta
opção escolhida.
Negócio
Em regra de negócio, é bom enfatizar
que um mesmo usuário não pode votar duas vezes no mesmo dia. Isso para, não
haver fraude de voto, nem mesmo de usuário querendo trapacear.
Portanto no sistema de enquete, deve
ser verificado o IP da máquina antes do voto ser computado. Caso o IP não for
achado, o mesmo deve ser inserido em uma tabela e depois computado o voto. Se o
mesmo usuário tentar votar no mesmo dia, essa verificação será feita novamente
e o IP será encontrado.
Para isso, construí uma outra tabela
para manter este controle. (Referência 1.2)
Referência
1.2
Tabela de IP
A tabela para guardar IP do usuário é
bem simples. O primeiro campo CH_IP é
auto-numérico e chave da tabela, não aceita NULL.
O segundo campo, IP é propriamente o
número do IP do usuário que está votando.
O campo DT_IP grava a data DD/MM/YYYY que o usuário votou. Esses dois
campos, DT_IP e IP são verificados diretamente antes de ocorrer a votação.
Stored Procedure
Foram feitas 4 (quatro) procedures para
toda essa aplicação, ou seja, para inserir, buscar, somar e verificar os dados
da enquete. Segue as mesmas:
Primeira Procedure
CREATE PROCEDURE [dbo].[ASPNETI_EXEMPLO1] AS SELECT PER.CH_PER, PER.NO_PER,
RES.OPCAO_RES FROM TB_ENQUETE_PER PER, TB_ENQUETE_RES RES WHERE PER.CH_PER = RES.CH_PER
AND ST_PER=1 |
Table 1.1
Nessa procedure (table 1.1) apenas
seleciono os campos de duas tabelas (TB_ENQUETE_PER
e TB_ENQUETE_RES). Os dados trazidos são: CH_PER, NO_PER, OPCAO_RES. A camada de apresentação busca nessa
procedure.
Segunda Procedure
CREATE PROCEDURE [dbo].[ASPNETI_EXEMPLO2] @OPCAO_RES AS VARCHAR(3) AS DECLARE @VOTO AS INT SET @VOTO = (SELECT VOTOS_RES FROM TB_ENQUETE_RES WHERE OPCAO_RES =
@OPCAO_RES AND CH_PER = (SELECT MAX(CH_PER) AS
CH_PER FROM TB_ENQUETE_RES)) SET @VOTO = @VOTO + 1 UPDATE TB_ENQUETE_RES SET
VOTOS_RES=@VOTO WHERE CH_PER = (SELECT MAX(CH_PER) AS
CH_PER FROM TB_ENQUETE_RES) AND OPCAO_RES = @OPCAO_RES |
Table 1.2
Na procedure (table 1.2) recebo como
parâmetro de entrada a opção escolhida pelo usuário, ou seja, (Sim ou Não).
Note que coloquei apenas VARCHAR(3). Caso suas opção tenham mais de três letras,
favor alterar esse número de caracter.
Depois, declarei a variável VOTO como
INT. É o número de votos contabilizados na tabela. No passo seguinte, fiz um
select pegando o número máximo de votos, somando mais um e atualizando na
tabela.
Esse select sempre pega a enquete
ativa, ou seja, a de chave com número maior.
Terceira Procedure
CREATE PROCEDURE [dbo].[ASPNETI_EXEMPLO3] @IP AS NVARCHAR(50) AS INSERT INTO TB_IP (IP, DT_IP) VALUES
(@IP,CONVERT(CHAR(10),GETDATE(),102)) |
Table 1.3
Na procedure (table 1.3) apenas faço o insert na tabela IP (TB_IP) o ip do usuário e a data no
formato (dd/mm/yyyy).
Quarta procedure
CREATE PROCEDURE [dbo].[ASPNETI_EXEMPLO4] @IP AS NVARCHAR(50) AS SELECT COUNT(CH_IP) AS CH_IP FROM TB_IP WHERE IP = @IP AND DT_IP =
CONVERT(CHAR(10),GETDATE(),102) |
Table 1.4
Na procedure (table 1.4) apenas faço um
select count no banco de dados e na tabela TB_IP
se o valor passado e o dia são iguais. Caso retornar 1, o usuário não pode
votar, se for 0, ele pode votar e depois é inserido o IP do mesmo no banco de
dados.
Com isso, eliminamos o problema do
usuário votar mais de uma vez no mesmo dia. Isso pode ser definido de outra
forma, por exemplo: um voto por mês, por semana e até por ano.
Bom, aqui eu termino a primeira parte
do artigo, com banco de dados. A segunda parte vem o software e interfaces de
acesso. Qualquer dúvida, favor entrar em contato ou comente o mesmo que
respondo.