Fórum If, then, else quem pode ajudar? #387667

30/09/2010

0

Amigos,

     O sistema é ESCOLAR preciso numerar os alunos que são matriculados no campo NUMERO, como vcs podem ver já estou conseguindo numerar, só que preciso colocar uma restrição na numeração, ou seja, quando formamos uma turma, exemplo 20 alunos todos eles recebem o seu numero, o qual será colocado no diário de classe, fichas, etc. Imagine que chegue um aluno no meio do ano, essa turma não pode mais ser renumerada, pois teria que trocar todos os documentos já preenchidos. Então o que preciso é fazer uma opção que mim permita ao matricular este aluno recem chegado, o sistema pegue o último número da tabela, ou seja, o número 20 +1, então esse aluno ficará fora da ordem alfabética será o 21.
  O objetivo é este ao criar uma turma, exemplo de 3 alunos, lembrado que os alunos sao inseridos um a cada vez, vejamos como deve ser:

ao inserir o aluno joão o campo numero(claro que aqui só fica o numero) ficaria assim;

1 - joao

ao inserir o aluno bete, o sistema organiza em ordem alfabetica e depois numera.

1 - Bete
2 - joao

ao inserir o aluno Antonio, o sistema organiza em ordem alfabetica e depois numera.

1 - Antonio
2 - Bete
3 - Joao

então chegará um momento que a minha turma já esta fechada para começar a trabalhar o ano, então supondo que no meio do ano chegue um aluno, não posso mais alterar o que já esta numerado, aí nesse caso pensei colocar o ELSE para ele NÃO MAIS organizar em ordem e NEM NUMERAR conforme o IF e sim pegar o ultimo número da tabela NUMERO que seria o 3 somar com mais 1 então o aluno que esta entranto no meio do ano seria o numero 4, exemplo, Abelardo, então gostaria que ficasse assim:

1 - Antonio
2 - Bete
3 - Joao
4 - Abelardo
  Pessoal fiz algumas mudanças, mas ainda não funciona, vejam como está:

procedure TFrmCadTurDisc.BtnSalvarAlunoClick(Sender: TObject);
var I : Integer;
begin

if RadioButton1.Checked then
begin
I := 1;
IBQryAlunoTurma.First;
while not DmDados.IBQryAlunoTurma.Eof do
begin
IBQryAlunoTurma.Edit;
IBQryAlunoTurma.FieldByName('numero').AsInteger := I;
IBQryAlunoTurma.Post;
IBQryAlunoTurma.Next;
Inc(I);
end;
end
else

if RadioButton2.Checked then
begin
IBQryAlunoTurma.Close;
IBQryAlunoTurma.SQL.Clear;
IBQryAlunoTurma.sql.add('SELECT MAX(numero)+1 FROM ALUNOTURMA WHERE ESCOLA = :ESCOLA and codigo_turma=:turma');

end;
end;
Osmar

Osmar

Responder

Posts

01/10/2010

Wilson Junior

Crie um campo, CHEGOU_APOS como CHAR(1) e para os alunos que foram cadastrados antes você atribui o valor N (Não), já para os alunos cadastrados depois você atribui o valor S (Sim). Mande organizar pelos campos Chegou_Apos e por Nome. Assim você já saberá até quem foi matriculado após o fechamento da turma.

Espero ter colaborado.
Responder

Gostei + 0

01/10/2010

Osmar

Bom dia Wilson,                         Olha eu preciso imprimir estes alunos com NOME e NUMERO apenas, ou seja, todos juntos os que já estão nas escola e os que chegaram depois, conforme já expliquei anteriormente.                        Agradeço a atençao.   Osmar.
Responder

Gostei + 0

01/10/2010

Eriley Barbosa

procedure TFrmCadTurDisc.BtnSalvarAlunoClick(Sender: TObject);
var
  I : Integer;
  Qry: TIBQuery;
begin
  if RadioButton1.Checked then
  begin
    I := 1;
    IBQryAlunoTurma.First;
    while not DmDados.IBQryAlunoTurma.Eof do
    begin
      IBQryAlunoTurma.Edit;
      IBQryAlunoTurma.FieldByName('numero').AsInteger := I;
      IBQryAlunoTurma.Post;
      IBQryAlunoTurma.Next;
      Inc(I);
    end;
  end
  else
    if RadioButton2.Checked then
    begin
      Qry := TIBQuery.Create(nil); {: cria uma instância do objeto}
      try
        Qry.Database := SeuIBDataBase;
        Qry.SQL.Add('SELECT MAX(numero)+1 FROM ALUNOTURMA WHERE ESCOLA = :ESCOLA and codigo_turma=:turma);
        Qry.Params[0].AsString := SeuCampo que Guarda a escola;
        Qry.Params[1].AsInteger := SeuCampo que Guarda o codigo da turma;
        Qry.Open;
        IBQryAlunoTurma.FieldByName('numero').AsInteger := Qry.Fields[0].AsInteger;
      finally
        FreeAndNil(Qry);  {: libera o objeto da memória}
      end;
    end;
end;
Responder

Gostei + 0

01/10/2010

Wilson Junior

O que lhe sugeri é incluir um campo a mais na sua tabela, assim ficará muito mais fácil para você imprimir.
PS: Tendo um campo na tabela não significa que o mesmo deve ser impresso.

Exemplo:
Numero Nome           Chegou_Apos
------ -------------- -----------
     1 Antonio        N
     2 Bete           N
     3 Joao           N
     4 Abelardo       S

Seu SQL:
SELECT
  CAST(0 AS INTEGER) AS Numero,
  Nome
FROM
  ALUNO_TURMA
ORDER BY
  Chegou_Apos,
  Nome


Após executar o SQL, faça o seu código antes de imprimir, mas somente esta parte.

I := 1;
IBQryAlunoTurma.First;
while not DmDados.IBQryAlunoTurma.Eof do
begin
  IBQryAlunoTurma.Edit;
  IBQryAlunoTurma.FieldByName('Numero').AsInteger := I;
  IBQryAlunoTurma.Post;
  IBQryAlunoTurma.Next;
  Inc( I );
end; 


Espero ter colaborado.
Responder

Gostei + 0

01/10/2010

Osmar

procedure TFrmCadTurDisc.BtnSalvarAlunoClick(Sender: TObject);
var
  I : Integer;
  Qry: TIBQuery;
begin
  if RadioButton1.Checked then
  begin
    I := 1;
    DmDados.IBQryAlunoTurma.First;
    while not DmDados.IBQryAlunoTurma.Eof do
    begin
      DmDados.IBQryAlunoTurma.Edit;
       DmDados.IBQryAlunoTurma.FieldByName('numero').AsInteger := I;
       DmDados.IBQryAlunoTurma.Post;
       DmDados.IBQryAlunoTurma.Next;
      Inc(I);
    end;
  end
  else
    if RadioButton2.Checked then
    begin
      Qry := TIBQuery.Create(nil); {: cria uma instância do objeto}
      try
        Qry.Database := SeuIBDataBase;
        Qry.SQL.Add('SELECT MAX(numero)+1 FROM ALUNOTURMA WHERE ESCOLA = :ESCOLA and codigo_turma=:turma);
        Qry.Params[0].AsString := SeuCampo que Guarda a escola;
        Qry.Params[1].AsInteger := SeuCampo que Guarda o codigo da turma;
        Qry.Open;
         DmDados.IBQryAlunoTurma.FieldByName('numero').AsInteger := Qry.Fields[0].AsInteger;
      finally
        FreeAndNil(Qry);  {: libera o objeto da memória}
      end;
    end;
end;
Responder

Gostei + 0

01/10/2010

Osmar

Bom dia Eriley,                      Desculpe, acho que na hora de colar o codigo eu mudei alguma coisa e cololei errado, mas na hora de inserir a sua dica fiz a correção, mas não compila esta travado, segue abaixo o codigo e a dica onde está travando.   procedure TFrmCadTurDisc.BtnSalvarAlunoClick(Sender: TObject);
var
  I : Integer;
  Qry: TIBQuery;
  if RadioButton1.Checked then
  begin
    I := 1;
    DmDados.IBQryAlunoTurma.First;
    while not DmDados.IBQryAlunoTurma.Eof do
    begin
      DmDados.IBQryAlunoTurma.Edit;
      DmDados.IBQryAlunoTurma.FieldByName('numero').AsInteger := I;
      Dmdados.IBQryAlunoTurma.Post;
      DmDados.IBQryAlunoTurma.Next;
      Inc(I);
    end;
  end
  else
    if RadioButton2.Checked then
    begin
      Qry := TIBQuery.Create(nil); {: cria uma instância do objeto}
      try
        Qry.Database := DmDados.IBDatabase;
(AQUI TRAVA)        Qry.IBQryAlunoTurma.SQL.Add('SELECT MAX(numero)+1 FROM ALUNOTURMA WHERE ESCOLA = :ESCOLA and codigo_turma=:turma);
        Qry.IBQryAlunoTurma.Params[0].AsString  := DmDados.IBQryAlunoTurmaESCOLA.AsString // que Guarda a escola;
        Qry.IBQryAlunoTurma.Params[1].AsInteger := DmDados.IBQryAlunoTurmaCODIGO_TURMA // que Guarda o codigo da turma;
        Qry.IBQryAlunoTurma.Open;
        Qry.IBQryAlunoTurma.FieldByName('numero').AsInteger := Qry.Fields[0].AsInteger;
      finally
        FreeAndNil(Qry);  {: libera o objeto da memória}
      end;
    end;
end;
Responder

Gostei + 0

01/10/2010

Eriley Barbosa

Você fez uma grande mistura, mas segue o código corrigido, acho que não precisa mexer em nada: procedure TFrmCadTurDisc.BtnSalvarAlunoClick(Sender: TObject);
var
  I : Integer;
  Qry: TIBQuery;
begin
  if RadioButton1.Checked then
  begin
    I := 1;
    DmDados.IBQryAlunoTurma.First;
    while not DmDados.IBQryAlunoTurma.Eof do
    begin
      DmDados.IBQryAlunoTurma.Edit;
      DmDados.IBQryAlunoTurma.FieldByName('numero').AsInteger := I;
      Dmdados.IBQryAlunoTurma.Post;
      DmDados.IBQryAlunoTurma.Next;
      Inc(I);
    end;
  end
  else
    if RadioButton2.Checked then
    begin
      Qry := TIBQuery.Create(nil); {: cria uma instância do objeto}
      try
        Qry.Database := DmDados.IBDatabase;
        Qry.SQL.Add('SELECT MAX(numero)+1 FROM ALUNOTURMA WHERE ESCOLA = :ESCOLA and codigo_turma=:turma');
        Qry.Params[0].AsString  := DmDados.IBQryAlunoTurmaESCOLA.AsString; // que Guarda a escola
        Qry.Params[1].AsInteger := DmDados.IBQryAlunoTurmaCODIGO_TURMA.AsInteger; // que Guarda o codigo da turma;
        Qry.Open;
        DmDados.FieldByName('numero').AsInteger := Qry.Fields[0].AsInteger;
        Dmdados.IBQryAlunoTurma.Post;
      finally
        FreeAndNil(Qry);  {: libera o objeto da memória}
      end;
    end;
end;
Responder

Gostei + 0

01/10/2010

Osmar

Eriley,      esta parando nesta linha.              DmDados.FieldByName('numero').AsInteger := Qry.Fields[0].AsInteger;     [Error] UCadTurDisc.pas(551): Undeclared identifier: 'FieldByName'   osmar
Responder

Gostei + 0

01/10/2010

Eriley Barbosa

Desculpe, troque por esta: DmDados.IBQryAlunoTurma.FieldByName('numero').AsInteger := Qry.Fields[0].AsInteger;
Responder

Gostei + 0

01/10/2010

Osmar

Eriley       Olha está compilando normal, então ao selecionar o RadioButton2 e clicar no botão salvar coloquei para debugar, e dá pau no post, esta é a mensagem:     'Not in edit mode', process stoped,       este é o select que está na IbqryAlunoTurma, a qual está Dmdados   Select *from ALUNOTURMA
where ESCOLA = :ESCOLA
  and codigo_turma=:turma     Osmar
Responder

Gostei + 0

01/10/2010

Eriley Barbosa

Altere o trecho de código abaixo: DmDados.IBQryAlunoTurma.Edit; DmDados.IBQryAlunoTurma.FieldByName('numero').AsInteger := Qry.Fields[0].AsInteger; DmDados.IBQryAlunoTurma.Post;
Responder

Gostei + 0

01/10/2010

Osmar

Eriley,         Cara agora funcionou beleza, não tenho como agradecer, estou a dois dias tentando resolver esse problema, mas, você sabe pouca expeiência.         Ficam aqui mais uma vez registrados os meus sinceros agradecimentos, porque pessoas como você e os outros que tentaram ajudar, tornam a internet um instrumento de grande interatividade e incentivo aos iniciantes em programação, ajudando assim na ampliação de seus conhecimentos.        Fica com Deus.     Osmar.
Responder

Gostei + 0

01/10/2010

Osmar

Eriley,         Olha o codigo está gravando e numerando, mas depois eu percebi um pequeno engano ou seja tem que ser feita uma rotina no if rbautomatico para que ele todas as vezes que for numerar reordenar a tabela em ordem alfabetica e depois numerar. Exemplo:    como está no momento, ao cadastrar o aluno PEDRO ele recebe o numero 1, ao cadastrar o aluno ANTONIO ele recebe numero 2, ou seja, ficaria:   1 PEDRO 2 ANTONIO   mas para ficar correto, estando habilitado o rbAUTOMATCO deveria ficar assim:   1 ANTONIO 2 PEDRO   lembro que os alunos são inseridos na turma um de cada vez, entao ao terminar de cadastrar a turma, TODOS os alunos deveriam esta em ordem alfabetica e respectivamente numerados em ordem crescente. Segue abaixo como está o codigo:         procedure TFrmCadTurDisc.BtnSalvarAlunoClick(Sender: TObject);
var
  I   : Integer;
  Qry : TIBQuery; begin
 
  If TForm(self).tag = 0 then
   DmDados.IBQryAlunoTurmaESCOLA.AsString := sEscola;   If dbEdtMatricula.Text = '' then
  begin
    ShowMessage('A Matrícula do Aluno deve ser Pesquisada!');
    Exit;
  end;    DmDados.IBQryAlunoTurmaCODIGO_TURMA.Value    := DmDados.IBQryTurmaCODIGO.Value;
   DmDados.IBQryAlunoTurmaNOME_ALUNO.AsString   := DmDados.IBQryAlunoNOME.AsString;
   DmDados.IBQryAlunoTurmaMATRICULA_ALUNO.Value := DmDados.IBQryAlunoMATRICULA.Value;    DmDados.IBQryAlunoTurma.Post;   if rbAutomatica.Checked then
  begin
    I := 1;
    DmDados.IBQryAlunoTurma.First;
    while not DmDados.IBQryAlunoTurma.Eof do
    begin
      DmDados.IBQryAlunoTurma.Edit;
      DmDados.IBQryAlunoTurma.FieldByName('numero').AsInteger := I;
      Dmdados.IBQryAlunoTurma.Post;
      DmDados.IBQryAlunoTurma.Next;
      Inc(I);
    end;
  end
  else
    if rbManual.Checked then
    begin
      Qry := TIBQuery.Create(nil); {: cria uma instância do objeto}
      try
        Qry.Database := DmDados.IBDatabase;
        Qry.SQL.Add('SELECT MAX(numero)+1 FROM ALUNOTURMA WHERE ESCOLA = :ESCOLA and codigo_turma=:turma order by NOME_ALUNO');
        Qry.Params[0].AsString  := DmDados.IBQryAlunoTurmaESCOLA.AsString; // que Guarda a escola
        Qry.Params[1].AsInteger := DmDados.IBQryAlunoTurmaCODIGO_TURMA.AsInteger; // que Guarda o codigo da turma;
        Qry.Open;
        DmDados.IBQryAlunoTurma.Edit;
        DmDados.IBQryAlunoTurma.FieldByName('numero').AsInteger := Qry.Fields[0].AsInteger;
        Dmdados.IBQryAlunoTurma.Post;
      finally
        FreeAndNil(Qry);  { libera o objeto da memória}
    end;
end;      PcAluno.ActivePageIndex := 0; end; end.
Responder

Gostei + 0

04/10/2010

Eriley Barbosa

 Mude o select que está na IbqryAlunoTurma, a qual está no Dmdados para:
 
Select *from ALUNOTURMA
where ESCOLA = :ESCOLA
and codigo_turma=:turma
order by NOME_ALUNO procedure TFrmCadTurDisc.BtnSalvarAlunoClick(Sender: TObject);
var
  I   : Integer;
  Qry : TIBQuery;
begin
 
  If TForm(self).tag = 0 then
   DmDados.IBQryAlunoTurmaESCOLA.AsString := sEscola;   If dbEdtMatricula.Text = '' then
  begin
    ShowMessage('A Matrícula do Aluno deve ser Pesquisada!');
    Exit;
  end;
  DmDados.IBQryAlunoTurmaCODIGO_TURMA.Value    := DmDados.IBQryTurmaCODIGO.Value;
  DmDados.IBQryAlunoTurmaNOME_ALUNO.AsString   := DmDados.IBQryAlunoNOME.AsString;
  DmDados.IBQryAlunoTurmaMATRICULA_ALUNO.Value := DmDados.IBQryAlunoMATRICULA.Value;   DmDados.IBQryAlunoTurma.Post;
  //Vamos ver se só o refresh resolve, caso contrario tem que abrir e fechar a query novamente
  DmDados.IBQryAlunoTurma.Refresh;
  //Se não funcionar descomente o código abaixo
  {DmDados.IBQryAlunoTurma.Close;
  DmDados.IBQryAlunoTurma.Open;}
  if rbAutomatica.Checked then
  begin
    I := 1;
    DmDados.IBQryAlunoTurma.First;
    while not DmDados.IBQryAlunoTurma.Eof do
    begin
      DmDados.IBQryAlunoTurma.Edit;
      DmDados.IBQryAlunoTurma.FieldByName('numero').AsInteger := I;
      Dmdados.IBQryAlunoTurma.Post;
      DmDados.IBQryAlunoTurma.Next;
      Inc(I);
    end;
  end
  else
    if rbManual.Checked then
    begin
      Qry := TIBQuery.Create(nil); {: cria uma instância do objeto}
      try
        Qry.Database := DmDados.IBDatabase;
        Qry.SQL.Add('SELECT MAX(numero)+1 FROM ALUNOTURMA WHERE ESCOLA = :ESCOLA and codigo_turma=:turma order by NOME_ALUNO');
        Qry.Params[0].AsString  := DmDados.IBQryAlunoTurmaESCOLA.AsString; // que Guarda a escola
        Qry.Params[1].AsInteger := DmDados.IBQryAlunoTurmaCODIGO_TURMA.AsInteger; // que Guarda o codigo da turma;
        Qry.Open;
        DmDados.IBQryAlunoTurma.Edit;
        DmDados.IBQryAlunoTurma.FieldByName('numero').AsInteger := Qry.Fields[0].AsInteger;
        Dmdados.IBQryAlunoTurma.Post;
      finally
        FreeAndNil(Qry);  { libera o objeto da memória}
      end;
    end;
   PcAluno.ActivePageIndex := 0;
end;      
Responder

Gostei + 0

04/10/2010

Osmar

Eriley,           Olha só funcionou descomentado conforme sua orientação, só que ao selecionar o rbManual ele trocou o numero 1, e o campo do numero do aluno que estava sendo inserido conforme seleção manual ele não conseguiu numerar.   procedure TFrmCadTurDisc.BtnSalvarAlunoClick(Sender: TObject);
var
  I   : Integer;
  Qry : TIBQuery; begin
    (*só irá cadastrar a Turma quando for inserção *)
  If TForm(self).tag = 0 then
   DmDados.IBQryAlunoTurmaESCOLA.AsString := sEscola;       (* verifica se o edit Ano está vazio *)
  If dbEdtMatricula.Text = '' then
  begin
    (* exibe uma mensagem de alerta para o usuário *)
    ShowMessage('A Matrícula do Aluno deve ser Pesquisada!');
    (* sai do bloco em execução ou seja pula os comandos abaixo *)
    Exit;
  end;    DmDados.IBQryAlunoTurmaCODIGO_TURMA.Value    := DmDados.IBQryTurmaCODIGO.Value;
   DmDados.IBQryAlunoTurmaNOME_ALUNO.AsString   := DmDados.IBQryAlunoNOME.AsString;
   DmDados.IBQryAlunoTurmaMATRICULA_ALUNO.Value := DmDados.IBQryAlunoMATRICULA.Value;    DmDados.IBQryAlunoTurma.Post;  //Vamos ver se só o refresh resolve, caso contrario tem que abrir e fechar a query novamente
  DmDados.IBQryAlunoTurma.Refresh;
  //Se não funcionar descomente o código abaixo
  DmDados.IBQryAlunoTurma.Close;
  DmDados.IBQryAlunoTurma.Open;
  if rbAutomatica.Checked then
  begin
    I := 1;
    DmDados.IBQryAlunoTurma.First;
    while not DmDados.IBQryAlunoTurma.Eof do
    begin
      DmDados.IBQryAlunoTurma.Edit;
      DmDados.IBQryAlunoTurma.FieldByName('numero').AsInteger := I;
      Dmdados.IBQryAlunoTurma.Post;
      DmDados.IBQryAlunoTurma.Next;
      Inc(I);
    end;
  end
  else     if rbManual.Checked then
    begin
      Qry := TIBQuery.Create(nil); {: cria uma instância do objeto}
      try
        Qry.Database := DmDados.IBDatabase;
        Qry.SQL.Add('SELECT MAX(numero)+1 FROM ALUNOTURMA WHERE ESCOLA = :ESCOLA and codigo_turma=:turma');
        Qry.Params[0].AsString  := DmDados.IBQryAlunoTurmaESCOLA.AsString; // que Guarda a escola
        Qry.Params[1].AsInteger := DmDados.IBQryAlunoTurmaCODIGO_TURMA.AsInteger; // que Guarda o codigo da turma;
        Qry.Open;
        DmDados.IBQryAlunoTurma.Edit;
        DmDados.IBQryAlunoTurma.FieldByName('numero').AsInteger := Qry.Fields[0].AsInteger;
        Dmdados.IBQryAlunoTurma.Post;
      finally
        FreeAndNil(Qry);  { libera o objeto da memória}
    end;
end;    BtnNovoAluno.Enabled     := not BtnNovoAluno.Enabled;
   BtnSalvarAluno.Enabled   := not BtnSalvarAluno.Enabled;
   BtnCancelarAluno.Enabled := not BtnCancelarAluno.Enabled;
   BtnExcluirAluno.Enabled  := not BtnExcluirAluno.Enabled;
   Panel10.Enabled          := false;
   Panel12.Enabled          := false;
   dbgAluno.Enabled         := true;
   dbEdtMatricula.Enabled   := true;
   dbEdtAluno.Enabled       := true;    dbEdtMatricula.Clear;
   dbEdtAluno.Clear;      (* fecha a Query - após gravaçao o DBGRID fica atualizado*)
   DmDados.IBQryAlunoTurma.Close;
    (* Reabre a Query - após gravaçao o DBGRID fica atualizado*)
   DmDados.IBQryAlunoTurma.Open;    PcAluno.ActivePageIndex := 0; end;
Responder

Gostei + 0

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

Aceitar