Fórum SQLQuery do DBX e unidirecional? #231663

12/05/2004

0

Oi gente

Estou tendo um problema com o SQLQuery do dataset. Por um motivo particular eu nao posso usar o ClientDataSet.
Eu executo uma query com o SQLQuery e consigo dar um SQLQuery.First ou um SQLQuery.Next, mas nao consigo dar um SQLQuery.Last porque ele diz que o SQLQuery e unidirecional. Mas eu nao achei nenhuma propriedade para mudar ele pra bidirecional. alguem pode me dar um help?

Rafael


Colutti

Colutti

Responder

Posts

12/05/2004

Macario

Ola programdor, bom dia.


Veja so, quando se usa Componentes unidirecional, não se trabalha com ponteiros.

Digamos que vc efetue esta instrução

[color=green:317779769f]
Select * from clientes where ID_CLI < 100
[/color:317779769f]

em uma tabela com 10000 registros. A sua query trara para a maquina cliente apenas os 100 correspondentes.

por isso no motivo de nao poder dar um last ja que nao esta conectado diretamente a tabela

espero ter ajudado.


Responder

Gostei + 0

12/05/2004

Jackson Gomes

se for no Delphi 6, use o SQLClientDataset. Ser for no Delphi 7, use o SimpleDataset. Ambos são bidirecionais.


Responder

Gostei + 0

12/05/2004

Colutti

oi Macario

Isso eu ja sabia, o que eu queria dizer e que mesmo sendo unidirecional ele deveria ir para o ultimo registro sim, mas nao seria possivel voltar para o primeiro registro. No exemplo que vc me passou:

Select * from clientes where ID_CLI < 100

quando eu desse um SQLQuery.Last ele nao deveria ir pro registro numero 100? Porque que quando eu uso o NEXT eu consigo navegar nos registros e chegar no ultimo entao? Existe alguma funcao do tipo SQLQuery.GotoRow, para ir pra uma determinada linha?

Jackson:

Eu estou usando o Delphi 7 ... sera que pelo fato deste componente ser descendente de TDataSet nao provocaria um lentidao nao? Existe alguma perda de performance?

Rafael


Responder

Gostei + 0

12/05/2004

Thematrix:reloaded

Oi Colutti,

desculpa a intromissão, mas...

vc desistiu do IBO? Pq vc está tentando agora a DBX? Já tentou usar IBX?

Para trabalhar com Interbase, o IBX (principalmente o mais atualizado , pra baixá-lo vá em www.interbase-br.com), não é tão rápido quanto o IBO, mas não é tão lento quanto o BDE ou BDX, e vc também pode ter um objeto IBQuery, sem essecialmente estar ligado a um Dataset.

É apenas um opinião, valeu?


Responder

Gostei + 0

12/05/2004

Colutti

oi TheMatrix:Reloaded

de jeito nenhum ... nao desisti nao. Mas eu estou a frente de um projeto e tenho que tentar convercer meus diretores a comprarem o ibo .. para isso eu tenho que entender as outras tecnologias ... principalmente seus defeitos ...
eu conheco o IBX, mas encontrei algum problemas em que ele nao pode me ajudar ... posso estar enganado, mas o IBX peca muito em movimentacao no dataset ...
mas .. muito obrigado pela sua preocupacao ...


rafael


Responder

Gostei + 0

12/05/2004

Thematrix:reloaded

Véio,


eu tenho uns 40 sistemas desenvolvidos com IBX, e nunca tive problema algum.

Na verdade, só tem um momento que o IBX ou BDE são lentos:
- quando vc abre a tabela e executa um .LAST, no resto é tudo legal (no IBX!)
Não conheço o IBO, na verdade já peguei uma versão demo, mas a exigência de ter componentes proprietários não me animou muito.

Mesmo assim,boa sorte em sua empreitada! :wink:


Responder

Gostei + 0

12/05/2004

Colutti

TheMatrix:Reloaded

40 ? Po tu trabalha pra caramba hein! :)

o problema e que quando eu dou um recordcount antes eu tenho que dar um fetchall, alem disso como vc faz pra dar um Next?
eu usei FindNext e ele sempre retorna falso? Como vc faz pra ir pro proximo registro?
quer trocar umas ideias por email? tecnologia1@prolink.inf.br ...

rafael


Responder

Gostei + 0

12/05/2004

Aroldo Zanela

TheMatrix:Reloaded 40 ? Po tu trabalha pra caramba hein! :) o problema e que quando eu dou um recordcount +antes eu tenho que dar um fetchall, alem disso como vc faz pra dar um Next++? eu usei FindNext e ele sempre retorna falso? Como vc faz pra ir pro proximo registro? quer trocar umas ideias por email? tecnologia1@prolink.inf.br ... rafael

Colega,

Tenho poucas aplicações com Firebird e usei IBX sem nenhum problema. Realmente existem alguns complicadores em se trabalhar com POO e apesar do Delphi ser uma linguagem híbrida, ainda nos causa algumas dúvidas, bem como, utilzar OO e mapeamento para bancos relacionais. No caso com o FB eu fiz da maneira mais ´tradicional´ e nas situações citadas eu resolveria com: + Select count(*) from tabela e ++ método Next do objeto instanciado.


Responder

Gostei + 0

13/05/2004

Colutti

Oi Zanella

O problema e esse ... eu nao concordo em usar Count() em uma query somente para pegar o total de registros ...
Imagina um query com varios joins, inner join e coisa parecida ... ter que fazer um count e no minimo um pecado.
Sobre o Next ... tudo bem que o next va pro proximo registro. Mas eu realmente queria usar o FindNext para me retornar se existe um proximo registro.
Ai vc poderia me dizer pra fazer algo do tipo

function FindNext : Boolean
begin
if not sqlquery.EOF then begin
sqlquery.next;
result := true;
end
else begin
result := false;
end;
end;

o problema e que o EOF so funciona se eu der um FetchAll ... isso e absurdo tambem .. estes sao exemplos do que eu acho que nao funciona.
Como vc faz pra varrer todos os registros retornados por uma query?

Rafael


Responder

Gostei + 0

13/05/2004

Aroldo Zanela

Colega,

O método next dos objetos IBX funcionam de forma idêntica ao BDE e ADO, veja o exemplo:

procedure TForm1.NotaFiscaldeSada1Click(Sender: TObject);
var Arquivo: TextFile;
    Registro: String;
begin


  if not sdNFS.Execute then exit;

  ibqSelecao.Close;
  ibqSelecao.ParamByName(´INICIO´).AsDate   := dtpInicio.Date;
  ibqSelecao.ParamByName(´TERMINO´).AsDate  := dtpTermino.Date;
  ibqSelecao.Open;

  AssignFile(Arquivo, sdNFS.FileName);
  ReWrite(Arquivo);
  nSequencia := 0;

  while not ibqSelecao.Eof do
  begin
    Registro := ...
    WriteLn(Arquivo, Registro);
    ibqSelecao.Next;
  end;

  CloseFile(Arquivo);

  ShowMessage(´Processamento concluído com sucesso.´);
end;


Quanto ao método RecordCount, é necessário utilizar um método Last para se obter a quantidade de linhas no objeto.


Responder

Gostei + 0

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

Aceitar