[firebase-br] Order By DT_LANC alterando ordem natural p/2 == mm DT_LANC

Carlos H. Cantu listas em warmboot.com.br
Ter Fev 10 11:24:15 -03 2015


Acho que está funcionando por "pura coincidência" :)

No Firebird, os registros são inseridos na primeira página de dados
que tiver espaço para eles, portanto, não há como garantir que eles
estejam armazenados fisicamente na sequência em que foram inseridos.

Em bancos relacionais, a única forma de se garantir uma determinada
ordem em um resultset é através do order by.

[]s
Carlos H. Cantu
www.FireBase.com.br - www.firebirdnews.org
www.warmboot.com.br - blog.firebase.com.br

MAR> Bom dia Cantú,


MAR> Bastou criar um índice no ficheiro CAIXA por DT_LANC e o problema ficou resolvido. !


MAR> Mas, salvo melhor opinião não deveria ser necessário criar o
MAR> indice, porque dentro da ordenação, repetindo-se o valor da
MAR> DT_LANC, deveria ser respeitada a ordem natural da criação dos registos.
MAR> Na circunstância, no meu programa que cria estes registos tenho esse cuidado. 
MAR> Como se trata de um processamento batch(For Select...Do...),
MAR> agrupo/somo os totais a débito e a crédito e só depois, quando
MAR> acaba este ciclo,  faço os lançamentos: o 1.º a débito e o 2.º a
MAR> crédito, logo, como a data de lançamento é exactamente a mesma a
MAR> (ex:"2015-02-02"-[campo do tipo DATE]) deveria respeitar a
MAR> ordenação natural, a ordem porque foram criados enquanto a for a
MAR> mesma, sem que haja hipóteses de ser criado 1.º Crédito e só
MAR> depois o Débito, porque não está subordinado a condições. 
MAR> É imperativa: primeiro Debita depois Credita. 
MAR> Estarei errado? Não me parece, mas por agora está resolvido e em
MAR> produção. Na primeira oportunidade vou testar a sua sugestão.
MAR> Obrigado

MAR> Com os meus melhores cumprimentos
MAR> O Secretário Geral da ACRA
MAR> Mário Agostinho  Reis

MAR> Esta mensagem contém informação de natureza confidencial e é
MAR> exclusivamente dirigida ao(s) destinatário(s) indicado(s). Se, por engano,
MAR> receber este email agradecemos que não o copie nem o reenvie e que nos
MAR> notifique do ocorrido através do email de resposta. 

MAR> No dia 10 de fevereiro de 2015 às 10:16, Carlos H. Cantu
MAR> <listas em warmboot.com.br> escreveu:

MAR> Se vc seguiu o exemplo da firebase, deve ter um campo (ex: DEB_CRED)
MAR>  que identifica se o lançamento retornado é crédito (C) ou débito (D).
MAR>  
MAR>  No caso, bastaria no select que vc chamou a SP usar um order by como
MAR>  abaixo:
MAR>  
MAR>  select ....
MAR>  order by DT_LANC ASC, DEB_CRED DESC
MAR>  
MAR>  Isso fará com que sejam listados primeiro os débitos e depois os
MAR>  créditos (apesar que particularmente eu prefiro o contrário).
MAR>  
MAR>  Agora, se a sua intenção é listar na ordem em que os lançamentos foram
MAR>  inseridos na base de dados, isso só será possível se vc tiver um
MAR>  campo que armazene a data+hora da inserção, ou mesmo um
MAR>  autoincremento, e no select ordene por ele, pois diferente do que
MAR>  acontece em uma base de dados "desktop", em bases relacionais não
MAR>  existe "ordem natural de inserção".
MAR>  
MAR>  []s
MAR>  Carlos H. Cantu
MAR>  www.FireBase.com.br - www.firebirdnews.org
MAR>  www.warmboot.com.br - blog.firebase.com.br
MAR>  
 MR>> Prezados Companheiros,
MAR>  
 MR>> Tenho uma St.Proc FluxodeCaixa que nada mais é do que uma adaptação da
 MR>> ST.FluxoCaixa publicada pela Firebase que deve ser do V.conheciemnto.
MAR>  
 MR>> O problema consiste na alteração da ordem.
 MR>> Quando introduzo a ordem necessária, "Order By DT_LANC", para 2
 MR>> registos, exactamente com mesma DT_LANC, o 1.º a Débito(na ordem
 MR>> natural) e o 2.º a Crédito, sai primeiro o registo a Crédito e o segundo
 MR>> a Débito
 MR>> quando necessito exactamente do contrário.
 MR>> Alguém te uma ideia do que poderá estar a passar-se e de como resolver?
MAR>  
 MR>> M/Selects
 MR>> 1.º: c/order by como necessário
 MR>>   for select ap.DT_LANC, ap.FORNEC_ID, ap.DT_DOC, ap.NO_DOC,
 MR>>              ap.DESCRITIVO, ap.valor, ap.mv_id
 MR>>       from caixa ap
 MR>>       where (ap.DT_LANC between :inicio and :fim)
 MR>>       and ap.accao!='EST'
 MR>>       Order By ap.DT_LANC -- Com esta linha altera a ordem
 MR>>       INTO :DT_LANC, :FORNEC_ID, :DT_DOC, :NO_DOC, :descritivo, :valor,
 MR>> :WID
MAR>  
 MR>> 2.º S/order by
 MR>>  for select ap.DT_LANC, ap.FORNEC_ID, ap.DT_DOC, ap.NO_DOC,
 MR>>              ap.DESCRITIVO, ap.valor, ap.mv_id
 MR>>       from caixa ap
 MR>>       where (ap.DT_LANC between :inicio and :fim)
 MR>>       and ap.accao!='EST'
 MR>>        INTO :DT_LANC, :FORNEC_ID, :DT_DOC, :NO_DOC, :descritivo, :valor,
 MR>> :WID
 MR>> ______________________________________________
 MR>> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
 MR>> Para saber como gerenciar/excluir seu cadastro na lista, use:
 MR>> http://www.firebase.com.br/fb/artigo.php?id=1107
 MR>> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
MAR>  

MAR>  
MAR>  ______________________________________________
MAR>  FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
MAR>  Para saber como gerenciar/excluir seu cadastro na lista, use:
MAR> http://www.firebase.com.br/fb/artigo.php?id=1107
MAR>  Para consultar mensagens antigas: http://firebase.com.br/pesquisa
MAR>  





Mais detalhes sobre a lista de discussão lista