Ajuda em Logica, gravar CheckBox selecionados no banco
Colegas desenvolvedores,
Preciso de um Grupo de CheckBox com as matérias que esta cadastradas no banco de dados, uso Firebird 2.0, onde tenho,
Matematica, Ingles, Portugues, Musica, Capoeira, etc e gravar no cadastro do aluno.
Dilema:
Eu pensei em criar uma tabela MATERIAS_DO_ALUNO com campos: matricula, idmateria, porem ainda não tenho a matricula do aluno para gravar,
onde poderá ter uma matéria ou várias por aluno.
Pensei em criar campos na prórpia tabela de cadastro do aluno, porem se essas márias aumentarem?
Para fazer uma consulta quem esta fazendo capoeira por exemplo teria que verificar campo_materia1, campo_materia_2, ... fica estranho
E como percorrer o Grupo de CheckBox e gravar os códigos das maérias no banco.
Se algume puder me dar alguma idéia eu agradeço,
Uso DelphiXE2 e dbexpress, grato
Paulo
Preciso de um Grupo de CheckBox com as matérias que esta cadastradas no banco de dados, uso Firebird 2.0, onde tenho,
Matematica, Ingles, Portugues, Musica, Capoeira, etc e gravar no cadastro do aluno.
Dilema:
Eu pensei em criar uma tabela MATERIAS_DO_ALUNO com campos: matricula, idmateria, porem ainda não tenho a matricula do aluno para gravar,
onde poderá ter uma matéria ou várias por aluno.
Pensei em criar campos na prórpia tabela de cadastro do aluno, porem se essas márias aumentarem?
Para fazer uma consulta quem esta fazendo capoeira por exemplo teria que verificar campo_materia1, campo_materia_2, ... fica estranho
E como percorrer o Grupo de CheckBox e gravar os códigos das maérias no banco.
Se algume puder me dar alguma idéia eu agradeço,
Uso DelphiXE2 e dbexpress, grato
Paulo
Paulo Freire
Curtidas 0
Respostas
Gustavo Bretas
05/01/2012
E ae Paulo, tudo certo?
Se não tem a matricula, como vc vai pesquisar quem esta cursando X matéria?
Agora se for o caso de um pré-cadastro, vc pode criar uma tabela para guardar os registros até que a matrícula seja efetuada, por exemplo, ALUNO_MATERIA_INTERESSE, o que acha?
Não te aconselho usar CheckListBox por que nela só tem como informar o nome da matéria, e sem o código vai complicar pra vc, tente usar clientdataset e grid, vc verá que fica mais fácil do que parece... rsrs!
Se não tem a matricula, como vc vai pesquisar quem esta cursando X matéria?
Agora se for o caso de um pré-cadastro, vc pode criar uma tabela para guardar os registros até que a matrícula seja efetuada, por exemplo, ALUNO_MATERIA_INTERESSE, o que acha?
Não te aconselho usar CheckListBox por que nela só tem como informar o nome da matéria, e sem o código vai complicar pra vc, tente usar clientdataset e grid, vc verá que fica mais fácil do que parece... rsrs!
GOSTEI 0
Wesley Yamazack
05/01/2012
Olá Paulo, bom estava vendo sua dúvida e surgiu uma dúvida.
O aluno já existe, mas não tem matricula é isso?
S : Particularmente eu uso um ID_Cliente ou IDCliente do tipo Integer, pois dependendo da Matricula ele aceita - ou letra por exemplo, e para questão de desempenho do banco chave primaria do Tipo Integer tem mais desempenho. Sendo assim você não se preocupa com a Matricula do aluno.
Segundo ponto, sobre usar CheckBox, recomendo você usar o ChekListbox, carregando as materias como mostro em um artigo meu : https://www.devmedia.com.br/post-16992-Adicionar-Items-CheckListBox-com-DataSet.html .
A estrutura da sua tabela de relacionamentos deveria ser a seguinte IDCliente e IDMateria, apenas isso, em um select você poderia fazer o seguinte pra descobrir as materias do aluno :
Outra dica, mas não muito aplicável seria você usar, os componentes DBCheckBox, porém amanha ou depois você incluindo alguma materia terá que mudar seu formulário e incluir esta nova materia, ou materias, e se for remover a mesma coisa, entende?
Dica estruturada sobre o código :
1 - Monte uma tela com a pesquisa de Cliente na parte superior, e o CheckListbox em abaixo.
2 - Ao selecionar um cliente, você deve carregar a lista de materias na qual ele esta matriculado.
3 - Você deve permitir alterar, ou incluir materias.
Vou te passar um código que fiz tem um tempo, mas funciona exatamente para o que você quer, tente adaptá-lo ok ? Não copie e cole simplesmente.
Observe que eu faço uma coisa não muito legal, que é excluir todos os registro daquele Cliente, e depois incluo tudo que você marcou, por exemplo, antes tinhamos 10 materias selecionadas, eu apago todas do relacionamento ClienteMateria, depois incluo a mesma no mesmo momento, ok ?
Bom acho que com isso já da pra você brinca um pouco.
Att,
Wesley Yamazack
www.lithic.com.br
O aluno já existe, mas não tem matricula é isso?
S : Particularmente eu uso um ID_Cliente ou IDCliente do tipo Integer, pois dependendo da Matricula ele aceita - ou letra por exemplo, e para questão de desempenho do banco chave primaria do Tipo Integer tem mais desempenho. Sendo assim você não se preocupa com a Matricula do aluno.
Segundo ponto, sobre usar CheckBox, recomendo você usar o ChekListbox, carregando as materias como mostro em um artigo meu : https://www.devmedia.com.br/post-16992-Adicionar-Items-CheckListBox-com-DataSet.html .
A estrutura da sua tabela de relacionamentos deveria ser a seguinte IDCliente e IDMateria, apenas isso, em um select você poderia fazer o seguinte pra descobrir as materias do aluno :
SELECT * FROM CLIENTE C, MATERIA M, CLIENTEMATERIA CM WHERE C.IDCLIENTE = CM.IDCLIENTE AND M.IDMATERIA = CM.IDMATERIA AND C.IDCLIENTE = :IDCLIENTE
Outra dica, mas não muito aplicável seria você usar, os componentes DBCheckBox, porém amanha ou depois você incluindo alguma materia terá que mudar seu formulário e incluir esta nova materia, ou materias, e se for remover a mesma coisa, entende?
Dica estruturada sobre o código :
1 - Monte uma tela com a pesquisa de Cliente na parte superior, e o CheckListbox em abaixo.
2 - Ao selecionar um cliente, você deve carregar a lista de materias na qual ele esta matriculado.
3 - Você deve permitir alterar, ou incluir materias.
Vou te passar um código que fiz tem um tempo, mas funciona exatamente para o que você quer, tente adaptá-lo ok ? Não copie e cole simplesmente.
procedure TFrmTamanhosSegmentos.Incluir_Atualizar_Tamanho(xCodSegmento: String);
Var
xQry: TSQLQuery;
I: Integer;
begin
Try
xQry:= TSQLQuery.Create(Self);
With xQry do
begin
SQLConnection := DM.Conexao;
SQL.Clear;
SQL.Add( DELETE FROM TAMANHOSSEGMENTOS WHERE CodSegmento = :CodSegmento );
Params.ParamByName(CodSegmento).AsString := xCodSegmento;
ExecSQL;
for I := 0 to ChckLstBxTamanho.Count - 1 do
begin
if ChckLstBxTamanho.Checked[I] then
begin
SQL.Clear;
SQL.Add( INSERT INTO TAMANHOSSEGMENTOS (CodSegmento, CodTamanho) );
SQL.Add( VALUES(:CodSegmento, :CodTamanho) );
Params.ParamByName(CodSegmento).AsString := xCodSegmento;
Params.ParamByName(CodTamanho).AsString := TTamanho(ChckLstBxTamanho.Items.Objects[I]).ID;
ExecSQL;
end;
end;
end;
Finally
FreeAndNil(xQry);
End;
end;
Observe que eu faço uma coisa não muito legal, que é excluir todos os registro daquele Cliente, e depois incluo tudo que você marcou, por exemplo, antes tinhamos 10 materias selecionadas, eu apago todas do relacionamento ClienteMateria, depois incluo a mesma no mesmo momento, ok ?
Bom acho que com isso já da pra você brinca um pouco.
Att,
Wesley Yamazack
www.lithic.com.br
GOSTEI 0
Paulo Freire
05/01/2012
Valeu Wesley, era que eu precisava.
GOSTEI 0
Wesley Yamazack
05/01/2012
Olá Paulo, que bom que resolveu!!!
Sucesso pra você, sempre que precisar conta com agente.
Um abraço.
Wesley Y
www.lithic.com.br
Sucesso pra você, sempre que precisar conta com agente.
Um abraço.
Wesley Y
www.lithic.com.br
GOSTEI 0