Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Besouro

Problema de lógica

Recommended Posts

E ai galera, to com um probleminha aqi de lógica...

 

O cidadão faz a inscrição pro evento. Pode ter dois no mesmo dia, ou seja, o cidadao pode se inscrever em dois eventos no mesmo dia, um de manha e um de tarde. Existem eventos que ocupam dois turnos. Portanto tem q dar erro se der qualquer choque de horario. Mas se o cara se inscrever pra dias diferentes, independento dos turnos a inscricao tem q ser realizada.

if ($turno_c == "mt") { //se o turno for de manha e de tarde verifica se o cara tem outro evento nesta data, se tiver avisa que a inscriçao nao foi feita.

$consulta = "SELECT candidato, data FROM candidatos WHERE candidato = '$cpf_cad' AND data = '$data_c'"; 



} else { //se o turno for de manha OU de tarde verifica se o cara tem outro evento nesta data e no turno que ele tá pedindo OU se ele ta inscrito num turno integral, se tiver avisa que a inscriçao nao foi feita.

$consulta = "SELECT candidato, data, turno FROM candidatos WHERE candidato = '$cpf_cad' AND data = '$data_c' AND turno = '$turno_c' OR turno = 'mt'"; 

}

 

O que está acontecendo é que se o cara tenta uma data diferente, sendo com turnos iguais, a inscriçao nao é feita, e deveria ser feita. Algum sugestao ai?

 

valeu pessoal

 

Besouro

Compartilhar este post


Link para o post
Compartilhar em outros sites

E ai galera, to com um probleminha aqi de lógica... ta de brincadeira você isso e um pepino manero :P

isso nao e problema de logica isso e modelagem de banco meu velho

 

modelagem basica

 

um tabela candidato

 

um eventos

 

id int 11

eventos varchar 255

horarios

 

periodo int 11

1 manha

2 tarde

3 noite

 

 

um tabela inscricao

 

eventos

id_do cara

 

 

seria manero você criar uma interface so com curso que ele pode entrar :)

 

 

tipo evento de hj

excluido para ele qual evento ele não pode participar :) :P

 

a ideia e nao fazer o usuario pensar

Compartilhar este post


Link para o post
Compartilhar em outros sites

olha se isto ajuda, verifica se existe algum turno

//pesquisa por data e aluno
$consulta = "SELECT candidato, turno FROM candidatos WHERE candidato = '$cpf_cad' AND data = '$data_c'";
$sql = mysql_query($consulta);
$teste = true;//variável para ver se pode ou não cadastrar no evento
if(mysql_num_rows>0){//verifica se achou alguma linha
while($linha=mysql_fetch_array($sql)){
if($linha['turno']==$turno_c)//verifica se o turno coincide com algum que está no banco
  $teste = false;
}
if($teste)
//cadastra
else
//não pode cadastrar

claro que modelagem ajudaria bastante, como citado anteriormente

Compartilhar este post


Link para o post
Compartilhar em outros sites

Quanto a modelagem oq eu fiz foi criar outra tabela, pego o cpf do cara q ta em outra tabela e o turno e data do evento e coloco os dados do evento e do cara na mesma tabela, dae confere soh nesta tabela se o cara ja esta inscrito ou nao...

 

Acho que o problema está aqui, usando AND ou o OR :

 

$consulta = "SELECT candidato, data, turno FROM candidatos WHERE candidato = '$cpf_cad' AND data = '$data_c' AND turno = '$turno_c' OR turno = 'mt'";

Compartilhar este post


Link para o post
Compartilhar em outros sites

ola meu amigo besouro ^_^

 

seja gentil poste como esta a suas tabelas

 

 

e o case de uso :

 

tipo se o curso e diario ,e semanal e mensal ,quantos cursos ,nome do curso e por ai

 

adicione mais informação assim eu dou uma avaliada

 

programar e manero

mais se preparar para programar e uma arte UML -Diagrama de Caso de Uso :P

avalie as entradas de dados ,tela de usuario e por ai vai ( interface de usuario e por ai vai )

Compartilhar este post


Link para o post
Compartilhar em outros sites

e ai kakaroto

entao

 

tabelas:

"inscritos" -> dados do cara (nome, cpf, email etc)

"eventos" -> dados do evento (nome_evento, cidade, data, turno etc)

"candidatos" -> (id_evento, nome_evento, data, turno, cpf_inscrito) aqi une as outras duas tabelas, o cidadao q quer fazer parte do evento vai ter seu CPF cadastrado nesta tabela e os dados do evento junto.. por exemplo:

 

um cara cadastrado pro evento ficaria desse jeito:

 

id_evento: 17

CPF (tabela inscritos) : 69

data (tabela eventos): 10/10/2015

turno (tabela eventos): mt (manha e tarde)

 

e agora como resolver?

 

valeu

 

Besouro

Compartilhar este post


Link para o post
Compartilhar em outros sites

ok man.. aí vai:

 

CREATE TABLE IF NOT EXISTS `concursos_2` (
`id` int(11) NOT NULL auto_increment,
`nome` varchar(50) NOT NULL,
`cidade` varchar(50) NOT NULL,
`data_concurso` varchar(10) NOT NULL,
`horario_concurso` varchar(20) NOT NULL,
`turno` varchar(2) NOT NULL,
`local_reuniao` varchar(50) NOT NULL,
`data_reuniao` varchar(20) NOT NULL,
`horario_reuniao` varchar(20) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=18 ;

CREATE TABLE IF NOT EXISTS `inscritos` (
`id_inscritos` int(10) unsigned NOT NULL auto_increment,
`nome` varchar(100) NOT NULL,
`cpf` varchar(14) NOT NULL,
`rg` varchar(20) NOT NULL,
`nascimento` varchar(10) NOT NULL,
`email` varchar(50) NOT NULL,
`telefone` varchar(13) NOT NULL,
`celular` varchar(13) NOT NULL,
`blacklist` varchar(20) default 'Não',
PRIMARY KEY (`id_inscritos`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;

CREATE TABLE IF NOT EXISTS `candidatos` (
`id` int(11) NOT NULL auto_increment,
`id_concurso` int(11) NOT NULL,
`nome_concurso` varchar(50) NOT NULL,
`data` varchar(10) NOT NULL,
`turno` varchar(2) NOT NULL,
`candidato` varchar(11) NOT NULL,
`nota` varchar(1) default NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=132 ;

Compartilhar este post


Link para o post
Compartilhar em outros sites

data e data mesmo nao varchar :P

 

to mexendo aqui

 

SELECT inscritos.nome , inscritos.cpf , concursos.nome , concursos.turno , concursos.data_concurso
FROM inscritos
INNER JOIN candidatos ON inscritos.id_inscritos = candidatos.id_candidato
INNER JOIN concursos ON candidatos.id_concurso = concursos.id
WHERE concursos.turno =1
AND inscritos`.`cpf` = 911
AND concursos.data_concurso = '2010-04-07';

traduzindo a query de cima selecionar o camarada que tem o cpf==911 no turno da manha com uma data de concursos 07/04/2010


 

aonde você esta vendo concursos turno

 

turno 1 == manha

 

turno2 ==tarde

 

turno3 == manha e tarde

 


//dump do banco


-- phpMyAdmin SQL Dump
-- version 3.2.0.1
-- http://www.phpmyadmin.net
--
-- Servidor: localhost
-- Tempo de Geração: Abr 07, 2010 as 08:53 PM
-- Versão do Servidor: 5.1.36
-- Versão do PHP: 5.3.0

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";

--
-- Banco de Dados: `test`
--

-- --------------------------------------------------------

--
-- Estrutura da tabela `candidatos`
--

CREATE TABLE IF NOT EXISTS `candidatos` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `id_concurso` int(11) NOT NULL,
 `id_candidato` varchar(11) NOT NULL,
 `nota` varchar(1) DEFAULT NULL,
 PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;

--
-- Extraindo dados da tabela `candidatos`
--

INSERT INTO `candidatos` (`id`, `id_concurso`, `id_candidato`, `nota`) VALUES
(1, 18, '6', '5');

-- --------------------------------------------------------

--
-- Estrutura da tabela `concursos`
--

CREATE TABLE IF NOT EXISTS `concursos` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `nome` varchar(50) NOT NULL,
 `cidade` varchar(50) NOT NULL,
 `data_concurso` date NOT NULL,
 `horario_concurso` time NOT NULL,
 `turno` int(11) NOT NULL,
 `local_reuniao` varchar(50) NOT NULL,
 `data_reuniao` date NOT NULL,
 `horario_reuniao` time NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=19 ;

--
-- Extraindo dados da tabela `concursos`
--

INSERT INTO `concursos` (`id`, `nome`, `cidade`, `data_concurso`, `horario_concurso`, `turno`, `local_reuniao`, `data_reuniao`, `horario_reuniao`) VALUES
(18, 'modelando o banco de dados', 'rio de janeiro', '2010-04-07', '12:00:00', 1, 'no imasters', '2010-04-07', '14:00:00');

-- --------------------------------------------------------

--
-- Estrutura da tabela `inscritos`
--

CREATE TABLE IF NOT EXISTS `inscritos` (
 `id_inscritos` int(10) unsigned NOT NULL AUTO_INCREMENT,
 `nome` varchar(100) NOT NULL,
 `cpf` varchar(14) NOT NULL,
 `rg` varchar(20) NOT NULL,
 `nascimento` date NOT NULL,
 `email` varchar(50) NOT NULL,
 `telefone` varchar(13) NOT NULL,
 `celular` varchar(13) NOT NULL,
 `blacklist` varchar(20) DEFAULT 'Não',
 PRIMARY KEY (`id_inscritos`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;

--
-- Extraindo dados da tabela `inscritos`
--

INSERT INTO `inscritos` (`id_inscritos`, `nome`, `cpf`, `rg`, `nascimento`, `email`, `telefone`, `celular`, `blacklist`) VALUES
(6, 'kakaroto', '911', '134', '1986-07-21', 'kakaroto1500@gmail.com', '21 2671 6206', '', 'Não');

 

qualquer duvida poste novamente

 

te dei a faca e queijo ,agora me pirar e me come a faca :P

 

remover a aspas que esta na query que vai dar erro

SELECT inscritos.nome, inscritos.cpf, concursos.nome, concursos.turno, concursos.data_concurso
FROM inscritos
INNER JOIN candidatos ON inscritos.id_inscritos = candidatos.id_candidato
INNER JOIN concursos ON candidatos.id_concurso = concursos.id
WHERE concursos.turno =1
AND inscritos.cpf =911
AND concursos.data_concurso = '2010-04-07';

 

resultado dessa query

nome  cpf  nome  turno  data_concurso  
kakaroto 911 modelando o banco de dados 1 2010-04-07 

Compartilhar este post


Link para o post
Compartilhar em outros sites

dale kakaroto, algumas combinacoes nao tao funcionando,

tem q funcionar para todas as combinacoes possiveis, as q eu achei foram essas:

 

* individuo tentando se cadastrar para 1 evento no mesmo dia (o evento eh de manha e de tarde) ja estando cadastrado em outro q eh soh de manha ou soh de tarde no mesmo dia

* individuo ja cadastrado para 2 eventos no mesmo dia e tentando se cadastrar em outro q eh soh a tarde

* individuo ja cadastrado para 2 eventos no mesmo dia e tentando se cadastrar em outro q eh soh de manha

* individuo ja cadastrado para 2 eventos no mesmo dia e tentando se cadastrar em outro q eh outro dia

*individuo ja cadastrado para 1 eventos q eh de manha ou de tarde e tentando se cadastrar em outro q eh em dois turnos no mesmo dia

*individuo ja cadastrado para 1 evento nos dois turnos e tentando se cadastrar em outro q eh outro dia em qualquer turno

Compartilhar este post


Link para o post
Compartilhar em outros sites

eu sabia que você ia come a faca :P

 

 

pq você esta mostrando a tela para usuario com o evento no mesmo dia

 

ja que ele tem dois

pq você mostrou o mesmo dia

 

tipo no usuario kakaroto que esta ai

 

ele ser cadastrou no evento da manha

 

você so pode mostrar eventos para mim de tarde

 

e se você de um count no banco e for igual ==2

 

você mostrar so os proximos dias

 

vem come a faca de novo :P

 


SELECT inscritos.nome, inscritos.cpf, concursos.nome, concursos.turno, concursos.data_concurso
FROM inscritos
INNER JOIN candidatos ON inscritos.id_inscritos = candidatos.id_candidato
INNER JOIN concursos ON candidatos.id_concurso = concursos.id

AND concursos.data_concurso = '2010-04-07';

 

sacou a ideia

Compartilhar este post


Link para o post
Compartilhar em outros sites

e ai kkroto

 

mas tem q mostrar todos independente do cara ta inscrito nele

¬¬

 

 

ai a gente vai começar a discursão nossa :P

 

usuario entra no bar

la tem cerveja

cachaça

vinho

 

´pq você nao faz o select para ver a idade dele

e so exibi refrigerante :P ja que ele nao pode bebe

 

ja que você que exibi

e so fazer o select no banco e ver as condicao que você sabe

 

agora eu pergunto aonde esta a sua duvida ?

 

melhor tive uma ideia seu chato :P:)

 

no tem a tabela que eu te mandei la eu to cadastrado pela manha certo

manda um select no banco e pegar meu horario la

 

como na tabela eu to de manha certo

 

você exibi todos sendo que o da manha colocar disable :)

ser for a a tarde colocar disable a tarde

 

e so seguir a logica agora

 

 

 

sacou essa sugestão

Compartilhar este post


Link para o post
Compartilhar em outros sites

dois probleminhas, banco mal modelado e interface mal projetada

 

 

Não TEM que exibir os eventos independentemente. TEM que exibir apenas os possíveis SIM!

 

Projete, construa, RESTRINJA, habilite apenas as opções disponíveis. Pra que criar uma mensagem de erro sendo que eu posso impedir o erro de ser gerado?

 

Em Java por exemplo você só trata erros com Exceptions, ou seja, só é disparada uma mensagem de erro caso uma exceção ocorra, algo imprevisto que não estava coberto pela programação. No seu caso você está prevendo um caso de uso onde o usuário deseja se registrar num evento qual ele não pode comparecer. Se está prevendo, IMPEÇA que aconteça.

 

Se for possível refazer seu banco, sugiro uma modelagem similar a isto:

 

eventos

id                smallint    unsigned    primary key    auto_increment,
nome              varchar(15),
inicio            datetime,
fim               datetime,
cidade            varchar(30),
inicio_reuniao    datetime,
fim_reuniao       datetime,
cidade_reuniao    datetime

inscritos

cpf        bigint(11)    unsigned    primary key,
nome       varchar(30),
nascimento date,
rg         varchar(20),
telefone   bigint(10)    unsigned,
celular    bigint(10)    unsigned,
blacklist  varchar(20)

candidatos

id        int            unsigned    primary key    auto_increment,
candidato bigint(11)     unsigned,
id_evento smallint       unsigned

Você não precisa repetir as informações do evento na tabela candidatos, você pode referenciá-las com foreign keys e/ou linká-las com join.

No caso eu recomendo fortemente uma foreign key entre o evento e os candidatos, com a regra ON DELETE CASCADE

Compartilhar este post


Link para o post
Compartilhar em outros sites

Desculpe do banco que eu postei para você ,no meu você colocou somente datetime aonde botei date

fiz separado pq eu nao sei o nivel dele

 

por isso que esta separado

 

 

mal modelado desculpe ta de zueira no e :P

 

com relacao a interface ate concordo com você ,eu ja venho falando com ele sobre isso nos comentarios

 

desculpe seu comentario e 0 para mim deu no mesmo nao ajudou em nada o cara

 

falar ON CASCADE para ele e falar grego hj :P

Compartilhar este post


Link para o post
Compartilhar em outros sites

kakaroto meu post foi direcionado para o autor do tópico, não para você http://forum.imasters.com.br/public/style_emoticons/default/joia.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

kakaroto meu post foi direcionado para o autor do tópico, não para você http://forum.imasters.com.br/public/style_emoticons/default/joia.gif

 

Desculpe meu velho a manera de falar aquele tarado la em cima e fogo :P

 

mais o cara ta aprendendo , eu to mostrando para ele alguma ideia

o sistema no meu ver esta ok

 

para o nivel dele

 

e claro que eu nao avalie caso de uso afundo

 

mais o banco sugerido para ele ta otimo

com o tempo ele vai estudando e aprendendo mais no e todo mundo por ai que conhecer ON CASCADE nao :P

isso ainda e grego para o povo

 

Function entao ferrou entao

para mim esse topico esta fechado e o autor tem que ralar agora :P

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.