Jump to content
Fórum Script Brasil
  • 0

Problemas Com Instrução Sql


robinhocne

Question

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 to comment
Share on other sites

3 answers to this question

Recommended Posts

  • 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 to comment
Share on other 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!

Edited by robinhocne
Link to comment
Share on other 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 to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152k
    • Total Posts
      651.5k
×
×
  • Create New...