[firebase-br] Duvida Select
Paulo Sérgo Feix
paulinhofeix em gmail.com
Ter Set 9 12:11:08 -03 2014
Rodrigo eu não recomendo usar este esquema numa tabela que vai receber
muitos registro
Nos meus sistemas que eu tenho em 3 camada faço desta forma, somente para
cadastros
function TDMCon_Server.RetornaID(Tabela, Campo: string): Integer;
begin
FDAux.Close();
FDAux.SQL.Text := 'SELECT MAX (' + Campo + ') FROM ' + Tabela;
FDAux.Open();
Result := FDAux.Fields[0].AsInteger + 1;
end;
e no BeforeUpdateRecor do DataSetProvider eu chamo ele
if UpdateKind = ukInsert then
begin
if SourceDS = FDCiudad then
DeltaDS.FieldByName('ID_CIUDAD').NewValue :=
DMCon_Server.RetornaID('CCIUDAD','ID_CIUDAD');
end;
Passo o nome da tabela e o campo.
Já nas tabelas como compra pedido venda caixa banco etc... uso sequencial
Em 9 de setembro de 2014 10:57, Sandro Souza <escovadordebits em gmail.com>
escreveu:
> Bom dia/tarde/noite Rodrigo.
>
> Necessita realmente de uma tabela de números de pedido? Porque não utilizar
> simplesmente uma sequence/gerador?
>
> Bom, independente disso, você poderia testar o seguinte SELECT?
>
> SELECT FIRST 1
> A.NUMPEDIDO
> FROM
> NUMPEDIDOS A
> WHERE
> (A.USADO = '') AND
> NOT EXISTS(SELECT B.NUMPEDIDO FROM PEDIDOS B WHERE B.NUMPEDIDO =
> A.NUMPEDIDO);
>
> Caso não haja um índice para a coluna USADO da tabela NUMPEDIDOS, crie-o,
> como no exemplo abaixo:
>
> CREATE INDEX IX_NUMPEDIDOS_USADO ON NUMPEDIDOS(USADO);
>
> Acredito que já deva existir um índice para a coluna NUMPEDIDO da tabela
> PEDIDOS, até porque eu imagino que seja a chave primária dessa tabela. Mas
> caso ainda não haja, crie-o também.
>
> Imagino também que você esteja preenchendo a coluna USADO da tabela
> NUMPEDIDOS com algum valor assim que usa um dos números de pedido.
>
> Ainda acho que seria muito melhor usar uma sequence ( = generator), mas
> cada caso é um caso.
>
> Espero ter ajudado mais que atrapalhado. :D
>
> Em 9 de setembro de 2014 11:41, Rodrigo <firebase em dominioinf.com.br>
> escreveu:
>
> > Bom dia a todos.
> >
> > Fiz um select e ele esta funcionando, porém esta muito lento, pois ha
> > muitos registros no banco de dados.
> >
> > select N.NUMPEDIDO AS NUMPEDIDO from numpedidos N where N.USADO = '' and
> > (SELECT COUNT(*) FROM PEDIDOS WHERE NUMPEDIDO=N.NUMPEDIDO) = 0
> >
> > nesse select retorno o proximo numero de pedido, porem esse numero nao
> > pode repetir na tabela pedidos, entao
> > faço uma pesquisa para verificar se ele ja nao esta sendo usado. Percebi
> > que nesses selects não usam os indices criados. Por isso talvez fique
> lento.
> >
> > Tentei fazer assim:
> >
> > select N.NUMPEDIDO AS NUMPEDIDO from numpedidos N where N.USADO = '' and
> > N.NUMPEDIDO NOT IN (SELECT NUMPEDIDO FROM PEDIDOS)
> >
> > Funciona mais rapido porem nao retorna os mesmos resultados do que o
> outro
> > select acima.
> >
> > Existe alguma forma de melhorar esse select, ou uma forma de ele usar os
> > indices criados ?
> >
> > Grato
> >
> >
> > ______________________________________________
> > FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> > Para saber como gerenciar/excluir seu cadastro na lista, use:
> > http://www.firebase.com.br/fb/artigo.php?id=1107
> > Para consultar mensagens antigas: http://firebase.com.br/pesquisa
> >
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use:
> http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>
--
Paulinho Sérgio Feix
Mais detalhes sobre a lista de discussão lista