Fórum Ordenação ClientDataSet... #244392
26/07/2004
0
preciso fazer uma ordenação num determinado número de registros de uma tabela, mas esta ordenação não pode ser passada via SQL, isto é, a ordenação é um campo inexistante na tabela..
assim :
Tenho um sequencial 00000001, 00000002, 0000003. (no banco)
No meio destes números pra ser mais preciso antes da segunda casa, na hora da impressão do sequencial eu adiciono três caracteres aleatórios :
007250000001, 001980000002, 009760000003.
Se eu ordenar por sequencial irá aparecer assim :
007250000001
001980000002
009760000003
mas preciso que apareça no rel assim :
001980000002
007250000001
009760000003
ordenada pelo sequencial adicionado os três caracteres..
lembrando não armazeno no banco de dados os três caracteres..
agradeço a atenção de todos
Cabelo
Cabelo
Curtir tópico
+ 0Posts
26/07/2004
Rafs
Entendi que vc faz a inclusão destes três caracteres aleatórios imediatamente antes da impressão, sendo assim, sería necessário ter conhecimento de como vc efetua a impressão.
Porém se vc puder incluir estes três caracteres a ponto de serem visíveis pelo ClientDataSet, vc só precisará criar um índice na coluna que deseja ordenar e no ClientDataSet apontar o IndexFieldNames (ou IndexName) para o índice criado. Desta forma vc terá os seus dados ordenados como deseja.
Para qualquer dúvida, a disposição.
Gostei + 0
26/07/2004
Cabelo
Não entendi o que quis dizer, vc está me dizendo que preciso incluir estes três caracteres no banco de dados?? Ou seria uma outra tabela que contivesse os valores aplicados??
Cabelo
Gostei + 0
26/07/2004
Rafs
Não quis me referir a você alterar no banco de dados, mas sim alterar localmente.
Ao utilizar o ClientDataSet é criado um cache dos dados que foram solicitados ao banco de dados, correto. Neste caso você podería incluir estes três caracteres localmente para depois efetuar a ordenação e a impressão conforme você deseja.
Acredito que sería nestes moldes:
-Resgataría os dados do banco de dados através do ClientDataSet
-Alteraría os registros, incluindo os três caracteres no campo desejado, no ClientDataSet
-Criaría o índice para o referido campo (IndexDefs)
-Ordenaría o ClientDataSet pelo índice criado (IndexFieldNames ou IndexName)
-Emitiría o relatório.
Apesar de ser um pouco trabalhoso, acredito que resolverá o seu problema.
Se vc puder me detalhar como vc emite o relatório (se linca direto com o ClientDataSet ou conecta a outro componente), talvez possamos descobrir uma forma mais fácil e prática de inserir estes caracteres e ordená-los corretamente.
Gostei + 0
27/07/2004
Cabelo
Como faria para inserir no cache do client, os caracteres, acho que é só isso que falta..
eu tinha imaginado exatamente isso, só não sei como executar..
agradeço sua atenção..
Cabelo
Gostei + 0
27/07/2004
Rafs
Um exemplo de código sería o seguinte:
var lRegistro: String; begin ... ... ClientDataSet.First; while not ClientDataSet.Eof do begin lRegistro := ClientDataSet.FieldByName(´NomeCampo´).AsString; ClientDataSet.Edit; ClientDataSet.FieldByName(´NomeCampo´).AsString := Copy(lRegistro,1,2)+CaracteresGerados+Copy(lRegistro,3,6); ClientDataSet.Post; ClientDataSet.Next; end; ... ... end;
Declare a variável [i:383f866247]lRegistro[/i:383f866247] para poder alterar o conteúdo do ClientDataSet.
[i:383f866247]CaracteresGerados[/i:383f866247] será os caracteres que vc deverá gerar para incluir no campo desejado
Com o comando [b:383f866247]Copy[/b:383f866247] você inserirá os caracteres na posição que deseja (após a segunda casa, conforme no seu exemplo)
Pela sua primeira mensagem, entendi que o campo seja string.
Depois de atualizar o ClientDataSet, você precisará criar o índice e indexar o ClientDataSet pelo índice criado.
ClientDataSet.IndexDefs.Add(´NomeIndice´,´NomeCampo´,[]); ClientDataSet.IndexFieldNames := ´NomeCampo´;
Desta forma você terá a ordenação que deseja.
:)
Gostei + 0
27/07/2004
Cabelo
O método Post no clientdataset não irá alterar o banco de dados? Pq com a TQuery do BDE no Delphi 5, quando vc utiliza o método Post, ele altera os dados na base..
Cabelo
Gostei + 0
27/07/2004
Rafs
O método Post do ClientDataSet irá alterar somente os valores locais da máquina, mas não alterarão os dados do BD. Pois o ClientDataSet realiza um cache dos dados na máquina local. Para alterar os dados do BD, vc precisará chamar o método ApplyUpdates, por isso que coloquei para vc em [b:22869d16d2]hipótese alguma[/b:22869d16d2] chamar este método, senão o BD será alterado.
A TQuery do BDE não realiza cache dos dados, isto é, não armazena os dados na máquina local, assim, quando é chamado o método Post a TQuery se encarrega de atualizar o BD imediatamente.
Gostei + 0
28/07/2004
Cabelo
Vou tentar aqui..
Cabelo
Gostei + 0
28/07/2004
Cabelo
Fiz exatamente o quê vc sugeriu, mas não funcionou..
Ainda não resolvi o problema..
Cabelo
Gostei + 0
29/07/2004
Rafs
Você podería detalhar o que aconteceu? Se não ordenou corretamente ou se houve algum erro.
Fiz um teste rápido aqui, porém funcionou..
Gostei + 0
29/07/2004
Uildenei
cds.IndexFieldNames:=´CAMPO´;
desde que esse campo nao seja calculado
Uildenei
Gostei + 0
29/07/2004
Cabelo
Ele simplesmente não fez a ordenação corretamente..
O problema é que o campo é string..
e pela ordenação a partir de uma string, a ordenação acaba saindo errada..
se fosse integer, ordenaria corretamente..
Cabelo
Gostei + 0
29/07/2004
Rafs
Primeiro vc deverá atualizar a tabela com os caracteres desejados para depois indexar
Se vc quiser eu lhe mando o teste que fiz.
Um detalhe que esqueci de mencionar, o tamanho do campo no BD deve permitir receber os três caracteres a mais que você irá inserir, pois o ClientDataSet respeita este aspecto. Isto é, o campo deve ter 11 caracteres de tamanho, senão quando vc inserir os três caracteres o sistema irá ´capar´ os três últimos.
Gostei + 0
29/07/2004
Cabelo
Exatamente o quê eu havia imaginado..
O problema é o seguinte..
Além de inserir os três caracteres, eu devo ainda inserir alguns caracteres em braco, para separar o código, para facilitar a digitação caso seja necessário..
Aí eu teria que ter uma campo com 25 caracteres, e meu sequancial seria de somente 15..
Além do mais.. não posso mudar o banco de dados, pois esta tabela é usada mais adiante no sistema, e é necessário que tenha somente 15 caracteres..
Eu tive uma idéia de criar um campo calculado, mas não deu certo, e como o colega uildinei mencionou não é possível realizar este evento em campos calculados..
Não sei o quê eu faço..
Como vou resolver este problema, sendo que além de tudo não posso usar uma tabela temporária..
Cabelo
Gostei + 0
29/07/2004
Rafs
Vou dar uma pensada em casa e vejo se consigo alguma idéia para ajudar com seu ´probleminha´.
Mas para me ajudar, detalhe como vc faz desde a seleção na tabela até a apresentação no relatório. Quem sabe possa surgir alguma idéia que supra as suas necessidades, diferente do que estamos trabalhando. :)
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)