Fórum Busca com mais de um dado #466683

12/01/2014

0

Olá pessoal.
Bom dia...

Tenho numa mesma tabela registros de alunos como segue:

Nome do Aluno, Número, Ano Letivo, Bimestre, Serie, Ativo_SN (Este último campo, se o aluno desistir, etc, coloca um não e ele nçao aparece mais como ativo

Normalmente os registros seguem uma numeração incremental.
Neste caso, preciso, de cada classe, os alunos sempre comecem do nº 1 (coloco a mão esse numero)
Exemplo. Nome do Aluno =Kathia Leite nº= 1 Ano Letivo=2014 Série 1ª Bimestre 1º
Para cada série os alunos sempre começam com nº1

Quando for inserir um registro novo, preciso comparar com os campos edit, se não vai repetir o nome, nem o numero do aluno na mesma (série) Tenho 3 série (1ª, 2ª e3ª)
Se o aluno for para outra série, o nome dele já está cadastrado, mas a série vai ser outra e o número tb (editar Registro).

O que preciso, quando estiver cadastrando em uma mesma série , que uma busca n~çao deixe cadastrar o mesmo aluno, com nº diferente, ou outro aluno com nº já usado por outro.

Como faço essa busca, para dar um alerta (show Message = nº já utilizado nesta série) ou ShowMessage (aluno já cadastrado nesta série)

Por locate não funciona muito bem.

Podem ajudar?

Grde abraço.
QQ ajuda é muito bem vinda.



Note que
Alexandre

Alexandre

Responder

Posts

12/01/2014

Marco Salles

O LOcate não funciona muito bem ????

Como assim que o Locate não funciona muito bem ???

como vc esta utilizando o Locate ?

qual a lógica que vc esta aplicando ??

[]sds
Responder

Gostei + 0

12/01/2014

Alexandre

Olá Salles
Boa tarde.

Desculpe o erro.
Expressei-me de form errada.

Comandos locate, sei como fazer.

O problema é que há variáveis a considerar e não estou acertando o codigo.

Para um campo só de verificação:

if frmPrincipal.TableCadAlunos.Locate('Nome_Aluno',EdNomeAluno.Text,[LOPARTIALKEY,LOCASEINSENSITIVE])then
begin
código... blá, blá, blá.
exit;
end;

Se colocar if frmPrincipal.TableCadAlunos.Locate('Nome_Aluno',EdNomeAluno.Text,[LOPARTIALKEY,LOCASEINSENSITIVE]) and .TableCadAlunos.Locate('Num_Aluno',EdNumAluno.Text,[] and rmPrincipal.TableCadAlunos.Locate('Serie',EdSerie.Text,[]);

Não funciona.

Preciso fazer um locate com mais de um campo de busca.
É isso.

Grde abraço e grato pela resposta
Responder

Gostei + 0

12/01/2014

Marco Salles

Olá Salles
Boa tarde.

Preciso fazer um locate com mais de um campo de busca.
É isso.

Grde abraço e grato pela resposta


A sintaxi é esta ...


TableCadAlunos.Locate('Num_Aluno';'Serie',VarArrayOf([EdNumAluno.Text,EdSerie.Text]),[**********])


***** Aqui é opcional ou deixar .. Pode escolher entre [LOPARTIALKEY,LOCASEINSENSITIVE]
Responder

Gostei + 0

13/01/2014

Alexandre

Olá Salles.
Bom dia...

Consegui explicar minha necessidade.
Vou adaptar.

Grde abraço e grato pela ajuda
Responder

Gostei + 0

13/01/2014

Alexandre

Olá Salles.
Boa tarde...

Coloquei assim:

if(frmPrincipal.TableCadAlunos.Locate('Nome_Aluno';'Num_Aluno',VarArrayOf([EdNomeAluno.Text,EdNum.Text])then
begin
Panel1.Caption:='Registro já exustente. "Verifique os demais campos (Número Aluno, Ano Letivo, Série e Bimestre';
exit;
end;

A sintaxe está dando erro. nos ':' (ponto e vírgula) .

Substitui por , e tb d[a erro.

A| msg é Not enough actual parameters.

Pode ajudar?

Grde abraço e grato pela resposta

Responder

Gostei + 0

13/01/2014

Marco Salles

então Axexander , tudo bem ?

O Correto é assi,

if(frmPrincipal.TableCadAlunos.Locate('Nome_Aluno;Num_Aluno',VarArrayOf([EdNomeAluno.Text,EdNum.Text]),[])then


so isso

[]sds
Responder

Gostei + 0

14/01/2014

Alexandre

Olá Salles
Bom dia...

Opa... Agora deu certo..... Muito bom
Grato pela ajuda.

Um excelente dia para vc e a todo pessoal do fórum
Responder

Gostei + 0

24/01/2014

Alexandre

Olá Salles.
Bom dia...

Usando sua sintaxe, ficou muito bom.
Fiz um if para cada aluno. São 20 no total

Abaixo a sintaxe que vc passou.
Coloquei "1" logo após varArrayOF, para direcionar uma para cada aluno assim e deu certo.

if(frmPrincipal.TableCadAlunos.Locate('num_aluno;Bimestre;Serie;Ano_Letivo;ativo_sn',VarArrayOf([1,ComboBimestre.Text,ComboSerie.Text,ComboAnoletivo.Text,'S']),[]))then
lblAluno_01.Caption:=frmprincipal.TableCadAlunos.fieldByName('nome_aluno').AsString;
lblAluno_01.Refresh;


if(frmPrincipal.TableCadAlunos.Locate('num_aluno;Bimestre;Serie;Ano_Letivo;ativo_sn',VarArrayOf([2,ComboBimestre.Text,ComboSerie.Text,ComboAnoletivo.Text,'S']),[]))then
lblAluno_02.Caption:=frmprincipal.TableCadAlunos.fieldByName('nome_aluno').AsString;
lblAluno_02.Refresh;

..... Até 20

Para carregar a media (nota final) de cada aluno, pensei em colocar depois de ativo_SN a media, (esse é o campo da tabela), na sintaxe.
O problema é que VarArrayOF deve conter um campo para ler, como os Combos (Ano Letivo, Série, Bimestre, Ativo_SN)
Aqui não terei um campo e sim uma nota na mesma tabela, referente à esse aluno.

Como ficaria a sintaxe para carregar da mesma tabela, a nota desse aluno, obedecendo aos critérios
já resolvido (Ano Letivo, Série, Bimestre?
Na tabela há esses campos e sua média (nota).

Pode ajudar?
Agradeço a resposta.

Responder

Gostei + 0

25/01/2014

Marco Salles

hummm

não seria o caso de somente carregar o que ja foi localizado ?????


frmprincipal.TableCadAlunos.fieldByName('OCampoDaTabelaReferenteaNOTA').AsString;

A partir do momento que vc esta utilizando o Locate , o Ponteiro que aponta para aquele registro da tabela ( o Registro tem as informações linha a linha da tabela)
é deslocado .. Logo vc le todas as informações referentes aquele Registro ...

[]sds
Responder

Gostei + 0

25/01/2014

Alexandre

Opa Salles.

Agradeço a resposta.
Funcionou.

Se puder esclarecer + uma questão, ajudaria bastante, pois nunca vi tanta "surra" junta.
Te agradeço a força.

Não deveria funcionar com campos Memo?
Há 2 problemas.

1º - Insiro uma vez e ele cria 4 registros.
2º Se clico em Localizar os campos Memo não são preenchidos. (estou usando varchar com 2100 caractéres cada)

Abaixo as procedures de localizar de acordo com os campos Combo (AnoLetivo, Série e Bimestre)

procedure TfrmMateria.btnLocalizarClick(Sender: TObject);
begin
if(frmPrincipal.TableConteudo.IsEmpty)then
begin
Panel1.Caption:='Tabela vazia.';
Panel1.Refresh;
exit;
end;

if(frmPrincipal.TableConteudo.Locate('Ano_letivo;Serie;Bimestre',VarArrayOf([ComboAnoLetivo.Text,ComboSerie.Text,ComboBimestre.Text]),[]))then
begin
Memo1.Lines.Text:=frmPrincipal.TableConteudo.fieldByname('conteudo_a').AsString;
Memo1.Lines.Text:=frmPrincipal.TableConteudo.fieldByname('conteudo_b').AsString;
ComboAnoLetivo.Text:=frmPrincipal.TableConteudo.fieldByname('ano_letivo').AsString;
ComboSerie.Text:=frmPrincipal.TableConteudo.fieldByname('serie').AsString;
ComboBimestre.Text:=frmPrincipal.TableConteudo.fieldByname('bimestre').AsString;
Panel1.Caption:='Conteúdo carregado.';
Panel1.Refresh;
end;
end;

procedure TfrmMateria.btnInserirClick(Sender: TObject);
var
a: string[15];
b: string[15];
c: string[15];
d: string[30];
begin
Panel1.Caption:='';
Panel1.Refresh;

a:=ComboAnoLetivo.Text;
b:=ComboSerie.Text;
c:=ComboBimestre.Text;
d:=' '+'Ano-'+a+' '+'Série-'+b+' '+'Bim-'+c;

if(Memo1.Text='')and(Memo2.Text='')then
begin
Panel1.Caption:='Preencha os campos para Inserir, ou Localize para Editar';
Panel1.Refresh;;
exit
end;

if MessageDLG('Deseja Inserir Registro em'+d+'?',mtconfirmation,[mbYes,mbNo],0)=mrYes then
begin
frmPrincipal.TableConteudo.Open;
frmprincipal.TableConteudo.Last;
frmprincipal.TableConteudo.Insert;
frmPrincipal.TableConteudo.fieldByName('ano_letivo').AsString:=ComboAnoLetivo.Text;
frmPrincipal.TableConteudo.fieldByName('serie').AsString:=ComboSerie.Text;
frmPrincipal.TableConteudo.fieldByName('bimestre').AsString:=ComboBimestre.Text;
frmPrincipal.TableConteudo.fieldByName('conteudo_A').AsString:=Memo1.Lines.Text;
frmPrincipal.TableConteudo.fieldByName('conteudo_B').AsString:=Memo2.Lines.Text;
frmPrincipal.TableConteudo.Post;
Panel1.Caption:='Se escolheu "Yes", registro salvo, se "No", não salvo';
Panel1.Refresh;
end;
end;



Responder

Gostei + 0

26/01/2014

Marco Salles

vamos por partes ...

de imediato verifiquei um erro em sua instrução

Memo1.Lines.Text:=frmPrincipal.TableConteudo.fieldByname('conteudo_a').AsString;
// ira apagar o que tyinha antes e definir um novo text
Memo1.Lines.Text:=frmPrincipal.TableConteudo.fieldByname('conteudo_b').AsString;


quando vc faz assim . vc subscreve o conteúdo anterior do Memo


veja a diferença

Memo1.Lines.Add(frmPrincipal.TableConteudo.fieldByname('conteudo_a').AsString);
//ira adicionar algo no que vc ja tem
Memo1.Lines.Add(frmPrincipal.TableConteudo.fieldByname('conteudo_b').AsString);


[]sds
Responder

Gostei + 0

27/01/2014

Alexandre

Olá Salles.

Isso era um erro que já tinha visto depois de postar (subscrever)
Já havia corrigido (Memo1 duas vezes)

O erro está bem na frente e a gente olha uma montanha de vezes e não vê nada.

Quanto ao outro problema, é o seguinte.
O IB expert (com Firebird) não mostra campos Blob. Só Char e Varchar.
No Varchar só cabia 255 caractéres e eu
precisava de 2100 cada Memo (1 e 2)

Fui testando todas aquelas configurações de campos e achei o seguinte.

Mudei o Collate desses campos para ISO8859_1 e os campos "engoliram" todos os 2100 caracteres.dos Memos
Está funcionando assim.... Mas estará correto???
Não dará algum problema quando o banco estiver + cheio???

Agradeço a dica.
Grde abraço e boa semana

Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar