Ir para conteúdo
Fórum Script Brasil
  • 0

Problemas Com Instrução Sql


robinhocne

Pergunta

Olá pessoal,

Estou querendo buscar em uma instrução SQL os seguintes dados, quer dizer usei desse tipo para buscar só um tipo de categoria para cada dbgrid, pois uso um dbgrid para "A" e "B", esses são um dos codigos, essa instrução deu certo, mas....

With DtmIza.QryAluPraB do
      Begin
         Close;
         Sql.Clear;
         Sql.Add ('Select P.Aluno, P.Instrutor, P.Data, P.Horario, P.Categoria, P.Aluno From Praticas P,'
                  +'Instrutores I Where P.Aluno=' + TxtMat.Text +
                   'AND P.Categoria= ''B'' AND P.Status=1 AND I.Codigo=P.Instrutor ORDER BY P.Data, P.Horario');
         Open;
      end;
mas... Fiz esse procedimento no banco de dados para informar as ordens das aulas:
SET TERM ^;

CREATE PROCEDURE STPCSLAUL (
    palu numeric(6,0))
returns (
    pord numeric(3,0),
    pins numeric(2,0),
    pdat date,
    phor time,
    pcat char(2))
as
BEGIN
   pOrd = 0;
   FOR Select P.Instrutor, P.Data, P.Horario, P.Categoria
       From Praticas P, Instrutores I
       Where P.Aluno=:pAlu AND P.Status=1 AND
       I.Codigo=P.Instrutor ORDER BY P.Data, P.Horario
       INTO :pIns, :pDat, :pHor, :pCat
   DO
   BEGIN
      pOrd = :pOrd + 1;
      SUSPEND;
   END
END;
Essa parte é relacionado com este tópico que eu abri e resolvi, mas eu tenho que mostar da mesma maneira na tabela de aulas, mas no DbGridA (para moto) e no DbGridB (para carro), essa é á busca referente ao tópico resolvido:
procedure Tfrmpraticas.ConsultaAula;
var aulasCarro, aulasMoto : integer;
Begin
   With QryPra do
     Begin
        Close;
        Sql.Clear;
        Sql.Add ( 'SELECT * FROM stpCslAul( ' + txtcod.Text + ' );' );
        Open;
     end;

   aulasCarro := 0;
   aulasMoto  := 0;

   while ( not qryPra.Eof ) do
   begin
      if ( Trim( qryPra.FieldByName( 'pCat' ).AsString ) = 'A' ) then
      begin
         Inc( aulasMoto );
      end
      else
      begin
         Inc( aulasCarro );
      end;

      if ( aulasMoto <= 15 ) then
      begin
         txtMoto.Text := IntToStr( aulasMoto );
         Edit1.Text   := '0';
      end
      else
      begin
         txtMoto.Text := '15';
         Edit1.Text   := IntToStr( aulasMoto - 15 );
      end;

      if ( aulasCarro <= 15 ) then
      begin
         txtCarro.Text := IntToStr( aulasCarro );
         Edit2.Text   := '0';
      end
      else
      begin
         txtCarro.Text := '15';
         Edit2.Text   := IntToStr( aulasCarro - 15 );
      end;
      qryPra.Next;
   end;

end;

Então gostaria de saber como posso fazer para atribuir nesses codigos acima para o DbGridA e para o DbGridB, sendo que eu busco no meu Procedimento stpCslAul?

Link para o comentário
Compartilhar em outros sites

3 respostass a esta questão

Posts Recomendados

  • 0

robinhocne, você me deu um nó nas idéias. :D

Se eu entendi (e não tenho certeza disto), você quer fazer a mesma consulta SQL que você utiliza para trazer os dados para o DBGridA e DBGridB, porém ao invés de o SELECT ser sobre a tabela Praticas, seria sobre o resultado retornado por sua procedure STPCSLAUL. Será que acertei? :huh:

Bom, se for isto, não há nada mais simples do que trocar o nome Praticas por STPCSLAUL nas suas consultas, bem como o nome dos respectivos campos:

With DtmIza.QryAluPraB do
Begin
    Close;
    Sql.Clear;
    Sql.Add ('Select P.pAlu, P.pIns, P.pDat, P.pHor, P.pCat, P.pAlu');
    Sql.Add ('From stpCslAul(' + txtcod.Text + ') P, Instrutores I');
    Sql.Add ('Where P.pAlu = ' + TxtMat.Text);
    Sql.Add ('  AND P.Categoria = ''B''');
    Sql.Add ('  AND I.Codigo = P.Instrutor');
    Sql.Add ('ORDER BY P.pDat, P.pHor');
    Open;
end;

o "P.Status=1" sai da cláusula WHERE da consulta, porque você já o filtrou na sua procedure.

Em teoria seria isto. Mas você tem que conferir.

Caso, nesta condição, você não queira passar o parâmetro para a função, então você vai ter que ver um meio de resolver isto.

Dicas:

- tente não economizar muito no nome das procedures, parâmetros e variáveis. Só olhando para o nome da procedure não daria para adivinhar o que ela faz, não é verdade?! Ou, então, coloque um comentário no início indicando a que se propõe a mesma.

- Principalmente, nesta aplicação que você está dando (utilizá-la em consulta - retornando várias linhas), facilitaria muito se você tivesse utilizado os mesmos nomes dos campos obtidos da tabela. Na sua consulta, iria bastar apenas trocar o nome da tabela de Práticas para o da procedure;

- quando alterando o código dinamicamente, o uso de várias linhas com SQL.Add, pode resultar numa melhor disposição das instruções SQL de modo a facilitar a visualização da mesma. Não parece que a leitura da instrução SQL do exemplo que postei fica mais fácil? Inclusive, se você observar, na sua consulta aparece P.Aluno duas vezes. Isto é proposital ou foi por acaso mesmo (eu mantive na "conversão")

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Micheus era desse tipo que eu queria, mas do jeito que você me passou não estava dando meio certo, então eu fiz dois procedimentos no banco de dados para filtrar as categorias de carro e moto, e dois procedimentos na tabela para consultar as aulas de carros e outra para moto:

Procedure para carro no banco de dados:

CREATE PROCEDURE FILTROAULACARRO (
    palu numeric(6,0))
returns (
    pord numeric(3,0),
    pins numeric(2,0),
    pdat date,
    phor time,
    pcat char(2))
as
BEGIN
   pOrd = 0;
   FOR Select P.Instrutor, P.Data, P.Horario, P.Categoria
       From Praticas P, Instrutores I
       Where P.Aluno=:pAlu AND P.Status=1 AND P.Categoria= 'B' AND
       I.Codigo=P.Instrutor ORDER BY P.Data, P.Horario
       INTO :pIns, :pDat, :pHor, :pCat
   DO
   BEGIN
      pOrd = :pOrd + 1;
      SUSPEND;
   END
END;
Procedure para carro no programa:
procedure Tfrmalunos.ContaAulasCarro;
var aulasCarro, aulasMoto : integer;
begin
 With DtmIza.QryAluPraB do
     Begin
        Close;
        Sql.Clear;
        Sql.Add ( 'SELECT * FROM FiltroAulaCarro( ' + TxtMat.Text + ' );' );
        Open;
     end;

   aulasCarro := 0;

   while ( not DtmIza.QryAluPraB.Eof ) do
   begin
      if ( Trim( DtmIza.QryAluPraB.FieldByName( 'pCat' ).AsString ) = 'B' ) then
      begin
         Inc( aulasCarro );
      end;

   if ( aulasCarro <= 15 ) then
      begin
         txtCarro.Text := IntToStr( aulasCarro );
         TxtExCarro.Text   := '0';
      end
      else
      begin
         txtCarro.Text := '15';
         TxtExCarro.Text   := IntToStr( aulasCarro - 15 );
      end;
      DtmIza.QryAluPraB.Next;
   end;
end;
Procedure para moto no banco de dados:
CREATE PROCEDURE FILTROAULAMOTO (
    palu numeric(6,0))
returns (
    pord numeric(3,0),
    pins numeric(2,0),
    pdat date,
    phor time,
    pcat char(2))
as
BEGIN
   pOrd = 0;
   FOR Select P.Instrutor, P.Data, P.Horario, P.Categoria
       From Praticas P, Instrutores I
       Where P.Aluno=:pAlu AND P.Status=1 AND P.Categoria= 'A' AND
       I.Codigo=P.Instrutor ORDER BY P.Data, P.Horario
       INTO :pIns, :pDat, :pHor, :pCat
   DO
   BEGIN
      pOrd = :pOrd + 1;
      SUSPEND;
   END
END;
Procedure para moto no programa:
procedure Tfrmalunos.ContaAulasMoto;
var aulasCarro, aulasMoto : integer;
Begin
   With DtmIza.QryAluPraA do
     Begin
        Close;
        Sql.Clear;
        Sql.Add ( 'SELECT * FROM FiltroAulaMoto( ' + TxtMat.Text + ' );' );
        Open;
     end;

   aulasMoto  := 0;

   while ( not DtmIza.QryAluPraA.Eof ) do
   begin
      if ( Trim( DtmIza.QryAluPraA.FieldByName( 'pCat' ).AsString ) = 'A' ) then
      begin
         Inc( aulasMoto );
      end;
      if ( aulasMoto <= 15 ) then
      begin
         txtMoto.Text := IntToStr( aulasMoto );
         TxtExMoto.Text   := '0';
      end
      else
      begin
         txtMoto.Text := '15';
         TxtExMoto.Text   := IntToStr( aulasMoto - 15 );
      end;
      DtmIza.QryAluPraA.Next;
   end;
end;

O procedimento no banco de dados ficou para filtrar as aulas de moto e carro e atribuir contagem, e no delphi para atribuir no programas nos edits e nos dbgrids. Ok Resolvido!

Editado por robinhocne
Link para o comentário
Compartilhar em outros sites

  • 0
Micheus era desse tipo que eu queria, mas do jeito que você me passou não estava dando meio certo
robinhocne, e provavelmente este não deu certo porque eu acabei me atrapalhando com o lance do nome das colunas. Observe que utilizei o nome errado na cláusula WHERE, está:

Sql.Add (' AND P.Categoria = ''B''');

e deveria ser:

Sql.Add (' AND P.pCat = ''B''');

então eu fiz dois procedimentos no banco de dados para filtrar as categorias de carro e moto, e dois procedimentos na tabela para consultar as aulas de carros e outra para moto:
faça a alteração e mantenha apenas uma procedure - vai ficar mais correto.

Abraços

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,2k
×
×
  • Criar Novo...