GARANTIR DESCONTO

Fórum List index out of bounds(2). Por que está dando isso??? #289657

27/07/2005

0

Bom dia, pessoal!!!

Estou com o seguinte problema.
Tenho um relatório onde eu uso um DBLookupComboBox só pra lista uns dados que eu preciso para filtrar no relatório.
Neste DBLookupComboBox estão aparecendo apenas dois dados.
Tenho o seguinte código quando eu clico em Gerar:

cdsAteRea.Close;
cdsAteRea.CommandText := ´select SERVICO, DESCR_RESULTADO, ´ +
´count(DESCR_RESULTADO) as TOTAL ´ +
´from ORDEM_SERVICO ´ +
´where DATA between :P_DATAINI and :P_DATAFIN ´ +
´and COD_CASA = :P_CODCASA ´ +
´group by SERVICO, DESCR_RESULTADO ´ +
´order by SERVICO, DESCR_RESULTADO´;
cdsAteRea.Params[0].AsDateTime := StrToDate(medtDataIni.Text);
cdsAteRea.Params[1].AsDateTime := StrToDate(medtDataFin.Text);
cdsAteRea.Params[2].AsInteger := StrToInt(dbedtCodCasa.Text);
cdsAteRea.Open;

Quando eu gero uma vez, selecinando o primeiro dado do DBLookupComboBox, o relatório é gerado perfeitamento.
Quando eu vou gerar escolhendo o segundo dado do DBLookupComboBox, me retorna o seguinte erro: List index out of bounds(2). Não descobri porque esta me dando esse erro.

cdsAteRea.Close;
cdsAteRea.CommandText := ´select SERVICO, DESCR_RESULTADO, ´ +
´count(DESCR_RESULTADO) as TOTAL ´ +
´from ORDEM_SERVICO ´ +
´where DATA between :P_DATAINI and :P_DATAFIN ´ +
´and COD_CASA = :P_CODCASA ´ +
´group by SERVICO, DESCR_RESULTADO ´ +
´order by SERVICO, DESCR_RESULTADO´;
cdsAteRea.Params[0].AsDateTime := StrToDate(medtDataIni.Text);
cdsAteRea.Params[1].AsDateTime := StrToDate(medtDataFin.Text);
[color=red:3aaeb4500e]cdsAteRea.Params[2].AsInteger := StrToInt(dbedtCodCasa.Text);[/color:3aaeb4500e] //Aqui que gera o ERRO!!!
cdsAteRea.Open;


Alguém pode me ajudar???

Desde já agradeço-lhes...

Cristiano Mário


Cristianojedi

Cristianojedi

Responder

Posts

27/07/2005

Cristianojedi

Ninguém pode me ajudar???

Massuda, Kotho, Rjun, Gandhalf, etc, etc, etc...

Cristiano


Responder

Gostei + 0

27/07/2005

Cristianojedi

Pessoal,

Estou precisando muito dessa ajuda...

Ninguém nunca passou por isso???

Ajude-me quem puder....

Cristiano Mário


Responder

Gostei + 0

27/07/2005

Rjun

Tente usar ParamByName em vez de param[].

cdsAteRea.CommandText := ´select SERVICO, DESCR_RESULTADO, ´ + 
´count(DESCR_RESULTADO) as TOTAL ´ + 
´from ORDEM_SERVICO ´ + 
´where DATA between :P_DATAINI and :P_DATAFIN ´ + 
´and COD_CASA = :P_CODCASA ´ + 
´group by SERVICO, DESCR_RESULTADO ´ + 
´order by SERVICO, DESCR_RESULTADO´; 

cdsAteRea.ParamByName(´P_DATAINI´).AsDateTime := StrToDate(medtDataIni.Text); 
cdsAteRea.ParamByName(´P_DATAFIN´).AsDateTime := StrToDate(medtDataFin.Text); 
cdsAteRea.ParamByName(´P_CODCASA´).AsInteger := StrToInt(dbedtCodCasa.Text); 
cdsAteRea.Open; 
try
  // seu código
finally
  cdsAteRea.Close;
end;



Responder

Gostei + 0

27/07/2005

Cristianojedi

Agora está dando o erro:

cdsAteRea: Paramenter ´P_CODCASA´ not found.

Por que que quando eu selecino o primeiro dado do DBLoockupComboBox funciona perfeitamente e quando eu seleciono o segundo dado do DBLoockupComboBox e peço pra gerar de novo da esse erro???

Cristiano


Responder

Gostei + 0

27/07/2005

Rjun

Onde que está esse código? Dentro de qual evento? Coloque um trecho maior do código, onde aparece desde a hora que ele é iniciado(após voce fazer a seleção no combobox) até a hora que você termina a operação.


Responder

Gostei + 0

27/07/2005

Cristianojedi

procedure TFrmRelAteRea.btnGerarClick(Sender: TObject);
begin
cdsAteRea.Close;
cdsAteRea.CommandText := ´select SERVICO, DESCR_RESULTADO, ´ +
´count(DESCR_RESULTADO) as TOTAL ´ +
´from ORDEM_SERVICO ´ +
´where DATA between :P_DATAINI and :P_DATAFIN ´ +
´and COD_CASA = :P_CODCASA ´ +
´group by SERVICO, DESCR_RESULTADO ´ +
´order by SERVICO, DESCR_RESULTADO´;
cdsAteRea.Params.ParamByName(´P_DATAINI´).AsDateTime := StrToDate(medtDataIni.Text);
cdsAteRea.Params.ParamByName(´P_DATAFIN´).AsDateTime := StrToDate(medtDataFin.Text);
cdsAteRea.Params.ParamByName(´P_CODCASA´).AsInteger :=
StrToInt(dbedtCodCasa.Text);
cdsAteRea.Open;
if cdsAteRea.IsEmpty then
begin
Application.MessageBox(´Não existem dados para estas especificações.´,
´Informação...´, MB_OK + MB_ICONINFORMATION);
Abort;
end;
rvpAteRea.SetParam(´RECEPCAO´, ´COM TRIAGEM´);
rvpAteRea.SetParam(´CASA´, dblcbCasa.Text);
rvpAteRea.SetParam(´DATAINI´, medtDataIni.Text);
rvpAteRea.SetParam(´DATAFIN´, medtDataFin.Text);
rvpAteRea.ExecuteReport(´rptAteRea´);
finally
cdsAteRea.Close;
end;
end;
end;


Responder

Gostei + 0

27/07/2005

Rjun

Não sei dizer o motivo do erro. Fiz uma alteração no seu código. Teste assim, embora seja algo que eu não goste muito.

var
  ComandoSQL: string;
begin
  ComandoSQL = ´select SERVICO, DESCR_RESULTADO, ´ +
       ´count(DESCR_RESULTADO) as TOTAL ´ +
       ´from ORDEM_SERVICO ´ +
       ´where DATA between ¬s and ¬s ´ +
       ´and COD_CASA = ¬d ´ +
       ´group by SERVICO, DESCR_RESULTADO ´ +
       ´order by SERVICO, DESCR_RESULTADO´;

  cdsAteRea.CommandText = Format(ComandoSQL, [medtDataIni.Text, medtDataIni.Text, StrToInt(dbedtCodCasa.Text)]);

  cdsAteRea.Open;
  try
    if cdsAteRea.IsEmpty then
    begin
      Application.MessageBox(´Não existem dados para estas especificações.´, ´Informação...´, MB_OK + MB_ICONINFORMATION);
      Abort;
    end;

    rvpAteRea.SetParam(´RECEPCAO´, ´COM TRIAGEM´);
    rvpAteRea.SetParam(´CASA´, dblcbCasa.Text);
    rvpAteRea.SetParam(´DATAINI´, medtDataIni.Text);
    rvpAteRea.SetParam(´DATAFIN´, medtDataFin.Text);
    rvpAteRea.ExecuteReport(´rptAteRea´);
  finally
    cdsAteRea.Close;
  end;
end;



Responder

Gostei + 0

27/07/2005

Cristianojedi

Rjun,

Consegui tirar o erro.

Como eu passava um parâmetro na Query que estava ligada ao ClientDataSet, eu tirei o parâmetro lá de dentro e coloquei na mão mesmo, no código.
Aí eu dei umas testadas aqui e aparentemente deu certo. Posso selecionar qualquer dado dentro do DBLoockupComboBox que está gerando o relatório.

Muito obrigado pelas dicas...

Abraço!!!

Cristiano Mário


Responder

Gostei + 0

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

Aceitar