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

(Resolvido) Erro "multiple rows in singleton"


robinhocne

Pergunta

Bom vou explicar do inicio.

Eu queria que no meu programa, na hora que fazesse a consulta pelo pesquisa do cadastro dos alunos e que estivesse alguma parcela em atraso, iria aparecer aparecer o nome e codigo do aluno(a) em marrom, ai fiz os seguintes procedimentos:

Banco de dados : Firebird

Acesso ao banco atraves de IbDatabase, IbTransaction e IbQuery

No cadastro de pesquisa, no DbGrid (DbgPes) onde mostra os dados da busca, no evento OnDrawColumnCell eu coloquei os seguintes dados para mostrar em marrom:

if ( ( DtmIza.QryIza.FieldByName('Vencimento').AsDateTime < Date() ) and
       ( DtmIza.QryIza.FieldByName('Vencimento').AsString <> '' ) ) then
      DbgPes.Canvas.Font.Color:= clMaroon;

   DbgPes.DefaultDrawDataCell(Rect, DbgPes.Columns[DataCol].Field, State);
e no cadastro onde eu faço a pesquisa do aluno(a) eu coloquei os seguintes dados:
procedure Tfrmalunos.spbpesClick(Sender: TObject);
begin
 with vcpo do
      begin
         clear;
         add ('A.Nome');
         add ('A.Codigo');
         add ('A.Cpf');
         add ('A.Processo');
         Add ('A.CnhEntregue');
         Add ('(SELECT L.Vencimento FROM Lancamento L WHERE L.Aluno=A.Codigo AND EXTRACT( MONTH FROM L.Vencimento ) <= EXTRACT( MONTH FROM CURRENT_DATE ) ) AS Vencimento' );
      end;
   with vvlr do
      begin
         clear;
         add ('Nome');
         add ('Codigo');
         add ('Cpf');
         add ('Processo');
      end;
   with TFrmPesAluno.create (application) do
      begin
         try
            tabela := 'alunos A';
            camporetorno := 'codigo';
            showmodal;
         finally
            free;
      end;
   end;
   if (retorno<> '') then
      begin
   inherited;
         LeRegistro();

O LeRegistro é um procedimento que eu faço para a pesquisa, mas o importante:

Add ('(SELECT L.Vencimento FROM Lancamento L WHERE L.Aluno=A.Codigo AND EXTRACT( MONTH FROM L.Vencimento ) <= EXTRACT( MONTH FROM CURRENT_DATE ) ) AS Vencimento' );

pois é aqui que ele busca no cadastro de lancamento se o vencimento é menos ou igual do decorrente dia, ai ele vai mostrar i nome em vermelho!.

Mas sei qual é o erro e tenho duas saidas, mas tentei as duas e não consegui nada!

Esse erro: Erro "multiple rows in singleton" está aparecendo por causa que nos lancamentos ele lança assim, pega a quantidade de parcelas a ser gereda e monta todas com seus respectivos valors, e tipo se ele lanço outra parcela de outro valor, ele busca o Historico do começo, tipo se ele lancei duas parcelas ele fica assim: 1ªParcela, 2ªParcela, depois ele lanço mais uma parcela ai ele fica assim:1ªParcela, então quer dizer ele faz a busca e monta como 3ªParcela, por isso que dá esse erro.

Então o primeiro em questão, como eu mudaria isso para dar esse erro nessa pesquisa aqui, pois eu vou ter que mudar as formas de historicos, mas eu já estou com o programa rodando e não tem como mudar todos os historicos, pois já são muitos, então como burlo isso para parar de dar erro.

Link para o comentário
Compartilhar em outros sites

18 respostass a esta questão

Posts Recomendados

  • 0
erro: Erro "multiple rows in singleton"

Erro " múltiplas linhas encontradas em seleção ".

Solução:

Este erro acontece quando você tentar pôr valores múltiplos onde o sistema

espera ver só um. Quando você faz uma declaração de atualização, a seleção da

declaração que vem atrás da palavra ' é esperado que set' resulte em um valor.

Se a declaração selecionada que você está usando resulta em mais de um valor,

você adquirirá este erro.

ou seja, o seu erro está na sua declaração

Add ('(SELECT L.Vencimento FROM Lancamento L WHERE L.Aluno=A.Codigo AND EXTRACT( MONTH FROM L.Vencimento ) <= EXTRACT( MONTH FROM CURRENT_DATE ) ) AS Vencimento' );
experimente:
Add ('(SELECT distinct L.Vencimento FROM Lancamento L WHERE L.Aluno=A.Codigo AND EXTRACT( MONTH FROM L.Vencimento ) <= EXTRACT( MONTH FROM CURRENT_DATE ) ) AS Vencimento' );

abraço

Link para o comentário
Compartilhar em outros sites

  • 0
erro: Erro "multiple rows in singleton"

Erro " múltiplas linhas encontradas em seleção ".

Solução:

Este erro acontece quando você tentar pôr valores múltiplos onde o sistema

espera ver só um. Quando você faz uma declaração de atualização, a seleção da

declaração que vem atrás da palavra ' é esperado que set' resulte em um valor.

Se a declaração selecionada que você está usando resulta em mais de um valor,

você adquirirá este erro.

ou seja, o seu erro está na sua declaração

Add ('(SELECT L.Vencimento FROM Lancamento L WHERE L.Aluno=A.Codigo AND EXTRACT( MONTH FROM L.Vencimento ) <= EXTRACT( MONTH FROM CURRENT_DATE ) ) AS Vencimento' );
experimente:
Add ('(SELECT distinct L.Vencimento FROM Lancamento L WHERE L.Aluno=A.Codigo AND EXTRACT( MONTH FROM L.Vencimento ) <= EXTRACT( MONTH FROM CURRENT_DATE ) ) AS Vencimento' );

abraço

Amigo obrigado pela ajuda, mas continua o mesmo erro! :unsure:

Link para o comentário
Compartilhar em outros sites

  • 0
Este erro acontece quando você tentar pôr valores múltiplos onde o sistema

espera ver só um

Se voce estiver usando mais de uma tabela para fazer o select, tente usar o inner join

outras informações:

http://www.delphifaq.com/faq/databases/interbase/f738.shtml

http://www.ibphoenix.com/main.nfs?a=ibphoe...=ibp_sps_delphi

abraço

Link para o comentário
Compartilhar em outros sites

  • 0
(...)

experimente:

Add ('(SELECT distinct L.Vencimento FROM Lancamento L WHERE L.Aluno=A.Codigo AND EXTRACT( MONTH FROM L.Vencimento ) <= EXTRACT( MONTH FROM CURRENT_DATE ) ) AS Vencimento' );
Amigo obrigado pela ajuda, mas continua o mesmo erro! :unsure:
RobinhoCne, não tem como retornar um valor só. Ou melhor, algumas vezes podem haver mais que um valor - mesmo com a sugestão do Jhonas de usar distinct. Veja que você está buscando em lançamentos, as parcelas do aluno (A.Codigo) onde o mês (Month) do vencimento (L.Vencimento) seja menor ou igual (<=) ao mês atual. Agora perceba o óbvio: se o cara está dois meses atrasado, quantas linhas (parcelas) serão retornadas? (espero que você tenha respondido 2 - duas). Bom, o distinct, faria com que fosse trazido apenas uma ocorrência dos valores de cada coluna em uma linha retornada, logo, havendo duas datas diferentes, não tem como aparecer apenas uma linha como resposta. Se você colocar no lugar de distinct a expressão First 1, você estará dizendo para retornar apenas a primeira linha. Neste caso você não dever mais ter o erro mencionado. Entretanto, também não é o resultado que espera ter para o seu programa, não é?! Mas você pode fazer isto apenas para testar. ;) Sou obrigado a dizer este tipo de dúvida aparece por conta do modo como você está programando. Se você elaborasse uma consulta SQL de modo "tradicional", facilmente poderia utilizar o JOIN conforme o Jhonas sugeriu, e o "problema" estaria rapidamente solucionado, porque não haveria a necessidade de entender a forma como você usa estes procedimentos (com o LeRegisto). Quando você diz: "O LeRegistro é um procedimento que eu faço para a pesquisa, mas o importante: ..."; Não é verdade. O procedimento é importante sim, porque para este caso, por exemplo, faz-se necessário entender como seu procedimento funciona para saber como sugerir uma alteração nestes seus parâmetros de modo a tentar resolver a questão. Mas ele é desconhecido pela maioria dos que acessam o forum. Como eu já tive que ver este procedimento em outras oportunidades, eu arriscaria dizer que você poderia fazer do seguinte modo:
procedure Tfrmalunos.spbpesClick(Sender: TObject);
begin
with vcpo do
      begin
         clear;
         add ('A.Nome');
         add ('A.Codigo');
         add ('A.Cpf');
         add ('A.Processo');
         Add ('A.CnhEntregue');
         Add ('L.Vencimento);
      end;
   with vvlr do
      begin
         clear;
         add ('Nome');
         add ('Codigo');
         add ('Cpf');
         add ('Processo');
      end;
   with TFrmPesAluno.create (application) do
      begin
         try
            tabela := 'alunos A left join Lancamento L on (L.Aluno = A.Codigo and extract(month from L.Vencimento ) <= extract(month from current_date))';
            camporetorno := 'codigo';
            showmodal;
         finally
            free;
      end;
   end;
   if (retorno<> '') then
      begin
   inherited;
         LeRegistro();

Se não funcinar, paciência. Se funcinar, tente entender, pois poderá precisar de algo parecido futuramente.

Ao meu ver, ainda haverá um erro de "lógica" a ser verificado. Pense da seguinte maneira, se o cara deixa de pagar Nov (11) e Dez (12) e você estiver fazendo a consulta em janeiro. Vai aparecer algum pagamento em aberto?

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0
(...)

experimente:

Add ('(SELECT distinct L.Vencimento FROM Lancamento L WHERE L.Aluno=A.Codigo AND EXTRACT( MONTH FROM L.Vencimento ) <= EXTRACT( MONTH FROM CURRENT_DATE ) ) AS Vencimento' );
Amigo obrigado pela ajuda, mas continua o mesmo erro! :unsure:
RobinhoCne, não tem como retornar um valor só. Ou melhor, algumas vezes podem haver mais que um valor - mesmo com a sugestão do Jhonas de usar distinct. Veja que você está buscando em lançamentos, as parcelas do aluno (A.Codigo) onde o mês (Month) do vencimento (L.Vencimento) seja menor ou igual (<=) ao mês atual. Agora perceba o óbvio: se o cara está dois meses atrasado, quantas linhas (parcelas) serão retornadas? (espero que você tenha respondido 2 - duas). Bom, o distinct, faria com que fosse trazido apenas uma ocorrência dos valores de cada coluna em uma linha retornada, logo, havendo duas datas diferentes, não tem como aparecer apenas uma linha como resposta. Se você colocar no lugar de distinct a expressão First 1, você estará dizendo para retornar apenas a primeira linha. Neste caso você não dever mais ter o erro mencionado. Entretanto, também não é o resultado que espera ter para o seu programa, não é?! Mas você pode fazer isto apenas para testar. ;) Sou obrigado a dizer este tipo de dúvida aparece por conta do modo como você está programando. Se você elaborasse uma consulta SQL de modo "tradicional", facilmente poderia utilizar o JOIN conforme o Jhonas sugeriu, e o "problema" estaria rapidamente solucionado, porque não haveria a necessidade de entender a forma como você usa estes procedimentos (com o LeRegisto). Quando você diz: "O LeRegistro é um procedimento que eu faço para a pesquisa, mas o importante: ..."; Não é verdade. O procedimento é importante sim, porque para este caso, por exemplo, faz-se necessário entender como seu procedimento funciona para saber como sugerir uma alteração nestes seus parâmetros de modo a tentar resolver a questão. Mas ele é desconhecido pela maioria dos que acessam o forum. Como eu já tive que ver este procedimento em outras oportunidades, eu arriscaria dizer que você poderia fazer do seguinte modo:
procedure Tfrmalunos.spbpesClick(Sender: TObject);
begin
with vcpo do
      begin
         clear;
         add ('A.Nome');
         add ('A.Codigo');
         add ('A.Cpf');
         add ('A.Processo');
         Add ('A.CnhEntregue');
         Add ('L.Vencimento);
      end;
   with vvlr do
      begin
         clear;
         add ('Nome');
         add ('Codigo');
         add ('Cpf');
         add ('Processo');
      end;
   with TFrmPesAluno.create (application) do
      begin
         try
            tabela := 'alunos A left join Lancamento L on (L.Aluno = A.Codigo and extract(month from L.Vencimento ) <= extract(month from current_date))';
            camporetorno := 'codigo';
            showmodal;
         finally
            free;
      end;
   end;
   if (retorno<> '') then
      begin
   inherited;
         LeRegistro();
Se não funcinar, paciência. Se funcinar, tente entender, pois poderá precisar de algo parecido futuramente. Ao meu ver, ainda haverá um erro de "lógica" a ser verificado. Pense da seguinte maneira, se o cara deixa de pagar Nov (11) e Dez (12) e você estiver fazendo a consulta em janeiro. Vai aparecer algum pagamento em aberto? Abraços
Bom em questão desse probelma acho que não vai ser.
Ao meu ver, ainda haverá um erro de "lógica" a ser verificado. Pense da seguinte maneira, se o cara deixa de pagar Nov (11) e Dez (12) e você estiver fazendo a consulta em janeiro. Vai aparecer algum pagamento em aberto?
Mas em questão apareceu assim nesse tipo de procedimento que você me passou, Esse tipo de consulta é feito automatico, para que quando mostra os nomes dos alunos apresentado na pesquisa, para quem tiver parcela em atraso apareca o nome em vermelho, mas esta aparecendo se a pessoa tem duas parcelas vencida aparace o nome duas vezes ou tres dependendo das parcelas em atrasos. Na primeira opção do First 1 retorna o nome em vermelho, bom a principio é isso que eu quero, uqe retorna não importando quantas parcelas que estão em atraso, pois assim, o nome em vermelho indicaria que seja devedor. Mas o que está acontecendo agora seria, que eu tenho dois tipos de lancamentos, um de promissorias e outro de cheques, então note que:
Add ('(SELECT First 1 L.Vencimento FROM Lancamento L WHERE L.Aluno=A.Codigo and L.Pagamento is not null AND EXTRACT( MONTH FROM L.Vencimento ) <= EXTRACT( MONTH FROM CURRENT_DATE ) ) AS Vencimento');

acrescentei o L.Pagamento is not nulque seria para mostrar só os que estão com os pagametos nulos, ma sem caso dos lancamentos dos cheques mesmo eles estando com a data de pagamento preenchida ele aparece em vermelho! o que seria? :mellow:

Link para o comentário
Compartilhar em outros sites

  • 0
Mas o que está acontecendo agora seria, que eu tenho dois tipos de lancamentos, um de promissorias e outro de cheques, então note que:

Add ('(SELECT First 1 L.Vencimento FROM Lancamento L WHERE L.Aluno=A.Codigo and L.Pagamento is not null AND EXTRACT( MONTH FROM L.Vencimento ) <= EXTRACT( MONTH FROM CURRENT_DATE ) ) AS Vencimento');
acrescentei o L.Pagamento is not nul que seria para mostrar só os que estão com os pagametos nulos, ma sem caso dos lancamentos dos cheques mesmo eles estando com a data de pagamento preenchida ele aparece em vermelho! o que seria? :mellow:
Difícil ter certeza. O melhor seria você depurar o programa e, antes da execução da consulta, verificar como está sua SQL. Então, pegar ela e jogar no IBExpert para ir mexendo e ver onde está o erro. Mas, tente mudar o código que pinta seu DBGrid, para testar por not IsNull:
if not DtmIza.QryIza.FieldByName('Vencimento').IsNull and
   (DtmIza.QryIza.FieldByName('Vencimento').AsDateTime < Date) then
      DbgPes.Canvas.Font.Color:= clMaroon;

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0
Mas o que está acontecendo agora seria, que eu tenho dois tipos de lancamentos, um de promissorias e outro de cheques, então note que:

Add ('(SELECT First 1 L.Vencimento FROM Lancamento L WHERE L.Aluno=A.Codigo and L.Pagamento is not null AND EXTRACT( MONTH FROM L.Vencimento ) <= EXTRACT( MONTH FROM CURRENT_DATE ) ) AS Vencimento');
acrescentei o L.Pagamento is not nul que seria para mostrar só os que estão com os pagametos nulos, ma sem caso dos lancamentos dos cheques mesmo eles estando com a data de pagamento preenchida ele aparece em vermelho! o que seria? :mellow:
Difícil ter certeza. O melhor seria você depurar o programa e, antes da execução da consulta, verificar como está sua SQL. Então, pegar ela e jogar no IBExpert para ir mexendo e ver onde está o erro. Mas, tente mudar o código que pinta seu DBGrid, para testar por not IsNull:
if not DtmIza.QryIza.FieldByName('Vencimento').IsNull and
   (DtmIza.QryIza.FieldByName('Vencimento').AsDateTime < Date) then
      DbgPes.Canvas.Font.Color:= clMaroon;
Abraços
Bom acho que agora deu certo implemetei assim e ficou sem problemas.
Add ('(SELECT First 1 L.Vencimento FROM Lancamento L WHERE L.Aluno=A.Codigo and L.Pagamento is null AND EXTRACT( MONTH FROM L.Vencimento ) <= EXTRACT( MONTH FROM CURRENT_DATE ) ) AS Vencimento');

Então essa parte está resolvida, deu certo em questão da busca, mas tenho outra coisa que eu não acrescentei aqui é que quando for isso para que no edit onde aparece o nome do aluno em vermelho!

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

  • 0
Mas o que está acontecendo agora seria, que eu tenho dois tipos de lancamentos, um de promissorias e outro de cheques, então note que:

Add ('(SELECT First 1 L.Vencimento FROM Lancamento L WHERE L.Aluno=A.Codigo and L.Pagamento is not null AND EXTRACT( MONTH FROM L.Vencimento ) <= EXTRACT( MONTH FROM CURRENT_DATE ) ) AS Vencimento');
acrescentei o L.Pagamento is not nul que seria para mostrar só os que estão com os pagametos nulos, ma sem caso dos lancamentos dos cheques mesmo eles estando com a data de pagamento preenchida ele aparece em vermelho! o que seria? :mellow:
Difícil ter certeza. O melhor seria você depurar o programa e, antes da execução da consulta, verificar como está sua SQL. Então, pegar ela e jogar no IBExpert para ir mexendo e ver onde está o erro. Mas, tente mudar o código que pinta seu DBGrid, para testar por not IsNull:
if not DtmIza.QryIza.FieldByName('Vencimento').IsNull and
   (DtmIza.QryIza.FieldByName('Vencimento').AsDateTime < Date) then
      DbgPes.Canvas.Font.Color:= clMaroon;
Abraços
Bom acho que agora deu certo implemetei assim e ficou sem problemas.
Add ('(SELECT First 1 L.Vencimento FROM Lancamento L WHERE L.Aluno=A.Codigo and L.Pagamento is null AND EXTRACT( MONTH FROM L.Vencimento ) <= EXTRACT( MONTH FROM CURRENT_DATE ) ) AS Vencimento');
Então essa parte está resolvida, deu certo em questão da busca, mas tenho outra coisa que eu não acrescentei aqui é que quando for isso para que no edit onde aparece o nome do aluno em vermelho!
oche!! :wacko: :mellow: :blink: fiquei sem enteder agora! Até ontem estava funcionado tudo normal, mas hoje comecou a dar esse erro aqui :
Dynamic Sql Error
Sql Error code = -104
Token uknown - line 1, char 73
1.
Esse erro dá acho que é por causa desse 1 do First 1, ai eu tirei, e imendei e dá erro no L., veja os codigos:
begin
 with vcpo do
      begin
         clear;
         add ('A.Nome');
         add ('A.Codigo');
         add ('A.Cpf');
         add ('A.Processo');
         Add ('A.CnhEntregue');
         Add ('(SELECT First 1 L.Vencimento FROM Lancamento L WHERE L.Aluno=A.Codigo and L.Pagamento is null AND EXTRACT( MONTH FROM L.Vencimento ) <= EXTRACT( MONTH FROM CURRENT_DATE ) ) AS Vencimento');
      end;
   with vvlr do
      begin
         clear;
         add ('Nome');
         add ('Codigo');
         add ('Cpf');
         add ('Processo');
      end;
   with TFrmPesAluno.create (application) do
      begin
         try
            tabela := 'alunos A';
            camporetorno := 'codigo';
            showmodal;
         finally
            free;
      end;
   end;
   if (retorno<> '') then
      begin
   inherited;

Link para o comentário
Compartilhar em outros sites

  • 0
Até ontem estava funcionado tudo normal, mas hoje comecou a dar esse erro aqui :

Dynamic Sql Error
Sql Error code = -104
Token uknown - line 1, char 73
1.

Esse erro dá acho que é por causa desse 1 do First 1, ai eu tirei, e imendei e dá erro no L.,

Robinhcne, este erro você vai ter que tentar verificar por si só.

Coloque um break-point antes de a sua procedure LeRegistro abrir a query, de modo que você possa inspecionar o conteúdo da propriedade SQL. Se há um erro na query durante a execução, este erro estará na cláusula sql montada e inserida nesta propriedade. (já lhe expliquei como fazer isto, há um tempinho)

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0
Até ontem estava funcionado tudo normal, mas hoje comecou a dar esse erro aqui :

Dynamic Sql Error
Sql Error code = -104
Token uknown - line 1, char 73
1.

Esse erro dá acho que é por causa desse 1 do First 1, ai eu tirei, e imendei e dá erro no L.,

Robinhcne, este erro você vai ter que tentar verificar por si só.

Coloque um break-point antes de a sua procedure LeRegistro abrir a query, de modo que você possa inspecionar o conteúdo da propriedade SQL. Se há um erro na query durante a execução, este erro estará na cláusula sql montada e inserida nesta propriedade. (já lhe expliquei como fazer isto, há um tempinho)

Abraços

Sim, ok Micheus, mas o meu programa não está dando para executar pelo delphi, só estou execuntado pelo o executavel!

Link para o comentário
Compartilhar em outros sites

  • 0
Sim, ok Micheus, mas o meu programa não está dando para executar pelo delphi, só estou execuntado pelo o executavel!
Então, parece que você tem um problema sério!

Não tenho como lhe ajudar.

Abraços

estou passando os dados do meu form da pesquisa:

private
    indice : integer;
       procedure AppEventsMessage(var Msg: TMsg; var Handled: Boolean);
  public
    tabela, camporetorno : string;
  end;

var
  frmpesquisa: Tfrmpesquisa;

implementation

{$R *.dfm}

{ Tfrmpesquisa }

uses funcoes, fprincipal, fdtmiza, FPadrao;

procedure Tfrmpesquisa.efetuaconsulta;
var instrucaosql:string; a:integer;
begin
   indice := rboidx.ItemIndex;
   instrucaosql:= 'select ';
   for a:= 0 to vcpo.count -1 do
      begin
         instrucaosql := instrucaosql+vcpo[a]+', ';
      end;
   instrucaosql:= copy (instrucaosql,1,length(instrucaosql) -2);
   instrucaosql:= instrucaosql + ' from ' + tabela + ' order by ' + vcpo[rboidx.itemindex];
      with dtmiza.qryiza do
         begin
            close;
            sql.Clear;
            sql.add (instrucaosql);
            open;
         end;
      txtloc.text := '';
      txtloc.setfocus;
end;

procedure Tfrmpesquisa.txtlocChange(Sender: TObject);
begin
   if (length (trim(txtloc.Text))=0) then
      begin
         dtspes.dataset.First;
      end;
   if (dtspes.dataset.Fields[indice].datatype=ftstring) then
      begin
         dtspes.DataSet.Locate(dtspes.DataSet.fields[indice].fieldname,txtloc.Text,[lopartialkey, locaseinsensitive]);
      end
   else if (((dtspes.dataset.Fields[indice].datatype=ftdatetime)
             or (dtspes.DataSet.Fields[indice].datatype=ftdate)) and edata(txtloc.Text)) then
      begin
         dtspes.dataset.Locate(dtspes.DataSet.Fields[indice].FieldName,strtodate(txtloc.Text),[locaseinsensitive]);
      end
   else
      begin
         if (enumero(txtloc.Text)) then
            begin
              dtspes.DataSet.Locate(dtspes.DataSet.Fields[indice].FieldName,strtofloat(txtloc.Text),[locaseinsensitive]);
            end;
      end;

end;



procedure Tfrmpesquisa.cboidxChange(Sender: TObject);
begin
    efetuaconsulta();
end;

procedure Tfrmpesquisa.dbgpesDblClick(Sender: TObject);
begin
   retorno := dtmiza.qryiza.fieldvalues [camporetorno];
   close;
end;

procedure Tfrmpesquisa.FormShow(Sender: TObject);
begin
   with rboidx do
      begin
         items.assign (vvlr);
         itemindex :=0;
      end;
end;

procedure Tfrmpesquisa.spbfecClick(Sender: TObject);
begin 
   close;
end;

procedure Tfrmpesquisa.rboidxClick(Sender: TObject);
begin
    efetuaconsulta();
end;

procedure Tfrmpesquisa.SpbOkClick(Sender: TObject);
begin
   retorno := dtmiza.qryiza.fieldvalues [camporetorno];
   close;
end;


procedure Tfrmpesquisa.AppEventsMessage(var Msg: TMsg; var Handled: Boolean);
var
  Sentido: SmallInt;
  WndClass :array[0..128] of char;
begin
  if Msg.message = WM_MOUSEWHEEL then
    begin
       GetClassName(Msg.hwnd, WndClass, SizeOf(WndClass)-1);
       if StrComp(WndClass, 'TDBGrid') = 0 then
          begin
             Msg.message := WM_KEYDOWN;
             Msg.lParam := 0;
             Sentido := HiWord(Msg.wParam);
             if Sentido > 0 then
             Msg.wParam := VK_UP
         else
             Msg.wParam := VK_DOWN;
         end;
    End;
end;




procedure Tfrmpesquisa.LimpaCampos;
VAR A:INTEGER;
BEGIN
   FOR A := 0 TO COMPONENTCOUNT-1 DO
      BEGIN
         IF (COMPONENTS [A] IS TEDIT) THEN (COMPONENTS [A] AS TEDIT).TEXT := '';
         IF (COMPONENTS [A] IS TMASKEDIT) THEN (COMPONENTS [A] AS TMASKEDIT).TEXT := '';
         IF (COMPONENTS [A] IS TMEMO)  THEN (COMPONENTS [A] AS TMEMO).TEXT := '';
         IF (COMPONENTS [A] IS TCOMBOBOX) THEN (COMPONENTS [A] AS TCOMBOBOX).TEXT := '';
         IF (COMPONENTS [A] IS TCHECKBOX) THEN (COMPONENTS [A] AS TCHECKBOX).CHECKED := FALSE;
         IF (COMPONENTS [A] IS TRADIOBUTTON) THEN (COMPONENTS [A] AS TRADIOBUTTON).CHECKED :=FALSE;
      END;


end;



procedure Tfrmpesquisa.dbgpesDrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumn;
  State: TGridDrawState);
Var R : TRect;
begin
  inherited;

 If Not odd(DtsPes.DataSet.RecNo) Then // se for ímpar
   If Not (gdSelected in State) Then // se a célula não está selecionada
      begin
         DbgPes.Canvas.Brush.Color:=clSkyBlue; // define uma cor de fundo
         DbgPes.Canvas.FillRect(Rect); // pinta a célula
         DbgPes.DefaultDrawDataCell(rect,Column.Field,State); // pinta o texto padrão
      end;
   DbgPes.DefaultDrawDataCell(Rect, DbgPes.Columns[DataCol].Field, State);

end;

end.

então agora como eu posso resolver este tópico?

Link para o comentário
Compartilhar em outros sites

  • 0
então agora como eu posso resolver este tópico?

robinhocne, aparentemente, não consegui visualizar qual o problema através de um teste de mesa "virtual". O negócio é você tentar verificar a SQL que está sendo executada.

Como você parece ter dificuldades ainda no processo de depuração, faça o seguinte, nesta sua unit, na procedure efetuaconsulta, utilize a procedure ShowMessage para mostra a consulta montada antes de sua execução:

...
      with dtmiza.qryiza do
         begin
            close;
            sql.Clear;
            sql.add (instrucaosql);
            ShowMessage(instrucaosql);  // <===== AQUI
            open;
         end;

e tome nota da instrução SQL apresentada e, então, analise ela.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0
então agora como eu posso resolver este tópico?

robinhocne, aparentemente, não consegui visualizar qual o problema através de um teste de mesa "virtual". O negócio é você tentar verificar a SQL que está sendo executada.

Como você parece ter dificuldades ainda no processo de depuração, faça o seguinte, nesta sua unit, na procedure efetuaconsulta, utilize a procedure ShowMessage para mostra a consulta montada antes de sua execução:

...
      with dtmiza.qryiza do
         begin
            close;
            sql.Clear;
            sql.add (instrucaosql);
            ShowMessage(instrucaosql);  // <===== AQUI
            open;
         end;

e tome nota da instrução SQL apresentada e, então, analise ela.

Abraços

fiz da maneira que você me orientou, e aparece isso de mensagem:

select A.Nome, A.Codigo, A.Cpf, A.Processo, A.CnhEntregue, (SELECT First 1 L.Vencimento FROM Lancamento L WHERE

L.Aluno=A.Codigo and L.Pagamento is null AND EXTRACT (MONTH FROM L.Vencimento) <= EXTRACT(MONTH FROM

CURRENT_DATE)) AS Vencimento from alunos A order By A.Nome

e analisei e realmente não sei o que fazer, será que tem outro tipo de pesquisa para fazer dessa consulta em outra tabela?

Link para o comentário
Compartilhar em outros sites

  • 0

Bom, não sei o que eu faço estou totalmente sem rumo nesse tópico em referencia a esse tipo de erro, pois já tentei varias maneiras que peguei na internet e que peguei com amigos, gostaria de ver se tem como dar uma arrumada nessa linha:

tabela := 'alunos A left join Lancamento L on (L.Aluno = A.Codigo and extract(month from L.Vencimento ) <= extract(month from current_date))';

post5

pois nesse tipo de codigo ele aparece no grid todos as linhas, tipo se um aluno tem 4 promissorias vencidas ai aparece as 4 linha do mesmo nome da pessoa, queria ver e testei algumas vezes e não consegui resolver, queria ver se tem como juntar tudo para uma linha, pois o que eu quero é que se ele tem uma ou duas e assim por diante aparece só o nome em vermelho e não o todo de promissorias.

Link para o comentário
Compartilhar em outros sites

  • 0

Consegui resolver com ajuda de um amigo e consegui enteder um pouco mias....

tabela := 'alunos A join Lancamento L on (L.Aluno = A.Codigo and extract(month from L.Vencimento ) <= extract(month from current_date)) 
            group by A.Nome, A.Codigo, A.Cpf, A.Processo, A.CnhEntregue';
foi feito dessa maneira e ele agrupava todas as parcelas juntas, mas na hora de pintar as linhas do dbgrid ele não dava muito certo, ele me falou para colocar no Dbgrid de pesquisa um campo que informasse, mas ai acabamos colocando uma mensagem ao abrir o cadastro do aluno, se ele tiver debitos ai mostra a mesagem, fizemos uma função:
function ver_aluno(vcod: integer): Boolean; begin DtmIza.IBQuery1.Close; DtmIza.IBQuery1.SQL.Clear; DtmIza.IBQuery1.SQL.Add('select * from lancamento where aluno = :PCODI and vencimento < current_date'); DtmIza.IBQuery1.ParamByName('PCODI').AsInteger:=vcod; DtmIza.IBQuery1.Open; if not DtmIza.IBQuery1.IsEmpty then begin ShowMessage('Aluno(a) com parcelas em atrasos !'); Result:=False; end; Result:=True; end;
E ai no fim de cada pesquisa ele vai verificar:
...
   if (retorno<> '') then
      begin
   inherited;
         LeRegistro();
         if ver_aluno(StrToInt(txtmat.Text)) then
         begin
            SpbCanClick(Sender);
            Abort;
         end;

então agora posso falar e concluir que está concluido esse tópico....

Agradeço a paciencia de todos....

Link para o comentário
Compartilhar em outros sites

  • 0

já tive esse problema :angry:

você precisa mais condições pra sua consulta, paa evitar que ela traga mais de um registro

vou dar um exemplo:

O select abaixo

após a clausula WHERE

eu estava usando apenas a condicao 'ac.ano'

e eu via a mesma mensagem que você via. <_<

então eu dei mais condições para a minha consulta ficar mais especifica.

acrescentei mais condicoes na clausula WHERE e não deu mais a msg

*********************************

(

select distinct

(a.codcbo)

from

tabfun a

inner join acumulos ac

on(ac.tabfun=a.codfun)

inner join cadfunc c

on(ac.codfun=c.codfun)

where

ac.codfun=fu.codfun

and

ac.ano =2008

and

ac.mes =2) as cbo,

***************************

:ninja:

espero ter ajudado :rolleyes:

Link para o comentário
Compartilhar em outros sites

  • 0
já tive esse problema :angry:

você precisa mais condições pra sua consulta, paa evitar que ela traga mais de um registro

vou dar um exemplo:

O select abaixo

após a clausula WHERE

eu estava usando apenas a condicao 'ac.ano'

e eu via a mesma mensagem que você via. <_<

então eu dei mais condições para a minha consulta ficar mais especifica.

acrescentei mais condicoes na clausula WHERE e não deu mais a msg

*********************************

(

select distinct

(a.codcbo)

from

tabfun a

inner join acumulos ac

on(ac.tabfun=a.codfun)

inner join cadfunc c

on(ac.codfun=c.codfun)

where

ac.codfun=fu.codfun

and

ac.ano =2008

and

ac.mes =2) as cbo,

***************************

:ninja:

espero ter ajudado :rolleyes:

Nessa condição ele traria um mesmo dado, mas na hora de pintar o grid que não daria certo, mas valeu pela dica

estou utilizando da ultima maneira que eu fiz.

ok, resolvido

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,4k
×
×
  • Criar Novo...