Selecionar registros no dbedit
Moderador: Moderadores
-
robenfatti
- Usuário Nível 1

- Mensagens: 6
- Registrado em: 02 Mai 2008 22:31
Selecionar registros no dbedit
Caros amigos,...
Como fãço pra selecionar registros do dbf usando dbedit?
Grato.
Como fãço pra selecionar registros do dbf usando dbedit?
Grato.
Re: Selecionar registros no dbedit
Eu uso um "macete" que talvez seja o que você procura. Seguinte: um cliente desejava selecionar registros ALEATÓRIOS num DBF (DBEdit ou Tbrowse), algo que não dava pra resolver com INDEX ou SCOPE ou outros. Era um trabalho digamos "manual".
A intenção? Por exemplo, mandar determinados registros pra impressão, ou deletar um conjunto de registros, ou alterar o preço de um conjunto de produtos etc.
O que eu fiz:
. criei um campo no DBF, chamado MARCADO, type Caracter, tamanho 1.
. criei um índice desse campo.
. na função de usuário do DBEdit ou Tbrowse, setei a tecla TAB (chr 9) para alternar o valor desse campo entre "1" (selecionado) e "0" (não selecionado).
O usuário então marca os registros desejados, um a um, e em seguida tecla digamos F5, para deletar o conjunto de registros marcados ou para alterar preços. O programa faz o seguinte (note que são só exemplos simplificados. Dá pra fazer qualquer coisa com os registros selecionados):
A intenção? Por exemplo, mandar determinados registros pra impressão, ou deletar um conjunto de registros, ou alterar o preço de um conjunto de produtos etc.
O que eu fiz:
. criei um campo no DBF, chamado MARCADO, type Caracter, tamanho 1.
. criei um índice desse campo.
. na função de usuário do DBEdit ou Tbrowse, setei a tecla TAB (chr 9) para alternar o valor desse campo entre "1" (selecionado) e "0" (não selecionado).
O usuário então marca os registros desejados, um a um, e em seguida tecla digamos F5, para deletar o conjunto de registros marcados ou para alterar preços. O programa faz o seguinte (note que são só exemplos simplificados. Dá pra fazer qualquer coisa com os registros selecionados):
Código: Selecionar todos
* DELEÇÃO
use arquivo
inde on marcado tag marcado to arquivo
set inde to arquivo
do whil .t.
seek "1"
if !found()
exit
endi
* bloqueia registro RLOCK()
delete
endd
useCódigo: Selecionar todos
* CORREÇÃO DE PREÇOS
use arquivo
inde on marcado tag marcado to arquivo
set inde to arquivo
do whil .t.
seek "1"
if !found()
exit
endi
* bloqueia registro RLOCK()
repl preco with round(preco*1,10,2)
repl marcado with "0"
* desbloqueia registro - UNLOCK
endd
useCódigo: Selecionar todos
*Na função de usuário:
lk=lastkey()
*...
if lk=9
* bloqueia o registro RLOCK()
repl marcado with iif(marcado="1","0","1")
* desbloqueia registro - UNLOCK
*...
Editado pela última vez por Eolo em 06 Jan 2009 17:28, em um total de 1 vez.
Re: Selecionar registros no dbedit
Em REDE, a coisa dá uma complicada, porque pode ter mais de um usuário querendo "marcar" o mesmo registro, e você não pode por exemplo deixar o usuário A desmarcar o registro marcado pelo usuario B, ou deixar o usuário C deletar um registro que o usuário A marcou para imprimir...
Eu resolvi essa "marcação em grupo" criando vários campos (marcado1, marcado2 etc), um para cada EXE rodando na rede. E, no caso da deleção, tomo alguns cuidados a mais. Mas é simples.
Eu resolvi essa "marcação em grupo" criando vários campos (marcado1, marcado2 etc), um para cada EXE rodando na rede. E, no caso da deleção, tomo alguns cuidados a mais. Mas é simples.
-
robenfatti
- Usuário Nível 1

- Mensagens: 6
- Registrado em: 02 Mai 2008 22:31
Re: Selecionar registros no dbedit
Ola amigos...
Não formulei bem a minha dúvida, mas de qquer forma vcs me responderam a dúvida q teria em seguida, vou exemplificar o problema:
O cliente tem uma locadora de equipamentos, tenho um DBF com todos equipamentos cadastrados, em determinada situação o cliente quer saber quais equipamentos estão locados (fora do estoque) e no dbedit quero mostrar somente os locados, tipo "data de retorno" em branco. Não estou conseguindo inserir esse "if" no dbedit.
Será q consegui explicar?
Roberto
Não formulei bem a minha dúvida, mas de qquer forma vcs me responderam a dúvida q teria em seguida, vou exemplificar o problema:
O cliente tem uma locadora de equipamentos, tenho um DBF com todos equipamentos cadastrados, em determinada situação o cliente quer saber quais equipamentos estão locados (fora do estoque) e no dbedit quero mostrar somente os locados, tipo "data de retorno" em branco. Não estou conseguindo inserir esse "if" no dbedit.
Será q consegui explicar?
Roberto
- alaminojunior
- Colaborador

- Mensagens: 1717
- Registrado em: 16 Dez 2005 21:26
- Localização: Ubatuba - SP
Re: Selecionar registros no dbedit
Bom dia.
Nesse caso precisa filtrar antes o que vc quer mostrar com o dbedit.
Se você usa RDDCDX, pode fazer uso do comando "Set Scope To" para mostrar apenas os registros que satisfazem a sua condiçao.
Se vc não usa RDDCDX, e sim o NTX, que é padrão, daí terá de usar, ou Set Filter (lento) ou, usar índices condicionais.
Mas é perfeitamente possível e fácil, usar quaisquer um deles. Nos diga qual RDD vc usa no momento, para podermos te ajudar melhor.
Nesse caso precisa filtrar antes o que vc quer mostrar com o dbedit.
Se você usa RDDCDX, pode fazer uso do comando "Set Scope To" para mostrar apenas os registros que satisfazem a sua condiçao.
Se vc não usa RDDCDX, e sim o NTX, que é padrão, daí terá de usar, ou Set Filter (lento) ou, usar índices condicionais.
Mas é perfeitamente possível e fácil, usar quaisquer um deles. Nos diga qual RDD vc usa no momento, para podermos te ajudar melhor.
Compilador xHarbour 1.2.3 + Embarcadero C++ 7.30
MySQL c/ SQLRDD
HwGui + GTWVG
MySQL c/ SQLRDD
HwGui + GTWVG
- Pablo César
- Usuário Nível 7

- Mensagens: 5312
- Registrado em: 31 Mai 2006 10:22
- Localização: Curitiba - Paraná
Selecionar registros no dbedit
Se a questão é exibir poucos registros na tela no estilo DBEDIT ou TBROWSE, eu indicaria fazer uma varredura dos registros com certa condição armazenando em MATRIZ e logo exibir através de TBROWSE de VETOR. Inclusive daria para criar uma coluna para pre-seleção.
Um clip-abraço !
Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
- alaminojunior
- Colaborador

- Mensagens: 1717
- Registrado em: 16 Dez 2005 21:26
- Localização: Ubatuba - SP
Re: Selecionar registros no dbedit
Não tem necessidade nenhuma de mais trabalho, é só filtrar ( com Set Filter ou Scope ) que o serviço tá pronto.eu indicaria fazer uma varredura dos registros com certa condição armazenando em MATRIZ e logo exibir através de TBROWSE de VETOR.
Compilador xHarbour 1.2.3 + Embarcadero C++ 7.30
MySQL c/ SQLRDD
HwGui + GTWVG
MySQL c/ SQLRDD
HwGui + GTWVG
Re: Selecionar registros no dbedit
Não dá pra vislumbrar, na pergunta inicial, se são poucos ou muitos registros. Pra mim, essa não foi a questão apresentada. A questão é "selecionar registros".Se a questão é exibir poucos registros
Na dúvida, vamos lá: em rede, se o colega armazenar registros em uma matriz e aí resolver fazer alguma coisa com esses registros (deletar ou alterar), como iria ser? Ele marca os registros na matriz mas, enquanto isso, outros usuários estão fazendo o mesmo em outras estações... Bloquear o arquivo, talvez? Mas aí nenhum outro usuário consegue trabalhar. Como o Alamino disse, é só um trabalho a mais.
Confesso que não entendi a sugestão.
- Pablo César
- Usuário Nível 7

- Mensagens: 5312
- Registrado em: 31 Mai 2006 10:22
- Localização: Curitiba - Paraná
Selecionar registros no dbedit
Isto significa que é mais uma sugestão. Dá trabalho, sim. Mas não tanto. Não entende por quê ? Eu digo, fazer alterações ordenações, seleção de registros ou em elementos de matriz tem melhor desempenho do que direto no arquivo de dados diretamente, essa é a minha opinião, ja que trata tudo na memória. E ainda, tem a vantagem de que na edição dos registros, não precisar tratar na hora. Só precisa na hora de atualizar quando repassa para o arquivo de dados.Pablo César escreveu:eu indicaria
Uma vez que o programador tenha desenvolvido seu TBROWSE a contento, fica fácil para o futuro vir a reutilizar adpatando pouca coisa do código. Mas calma aí gente, essa é a minha opinião. Eu nunca disse que os colegas sugiriram estivessem ERRADOs. Eu por exemplo "detesto" utilizar SET FILTER e como o colega Eolo mencionou o Tbrowse é viavel, principalmente se tiver que marcar registros para realizar alguma operação de atualização no arquivo DBF, por exemplo deletar em bloco, replace em bloco, copiar... etc.
Um clip-abraço !
Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
- acelconsultoria
- Usuário Nível 3

- Mensagens: 231
- Registrado em: 10 Jan 2006 17:05
- Localização: Itápolis-SP
Re: Selecionar registros no dbedit
Essa é uma questão interessante... e se tem uma coisa que ainda não me deixa satisfeito no meu sistema é realmente essas rotinas pra marcação de registros para operação em bloco. Apesar de ter desenvolvido e estar funcionando sem problemas, penso que ainda pode ser melhorada ou reescrita.
Os problemas mais comuns:
- Mais de um usuário podem estar marcando registros diferentes na mesma tabela, em terminais diferentes, aí vai saber quem marcou o quê ?!!!
- Se cair a energia, e os registros permanecerem marcados. Aí, sem saber outro usuário entra na rotina, e sem saber que tal registro está marcado, manda executar determinada função. Aí, altera algum registro que não deveria ser alterado.
A maneira como tento "cercar" isso: Eu faço algo parecido com o Eolo: Tenho um campo dentro do DBF com o nome "CHAVE, C, 1" e outro "USUARIO, N, 3" com o código do usuário que está acessando, possibilitando que as seleções sejam específicas para cada usuário. Aí, dá pra separar o que o usuário 001 e 002 marcaram respectivamente, por exemplo. Já no caso do desligamento indevido, resolvo mandando um comando pra limpar todas as "marcações" antes de abrir o registro na tela pro usuário marcar.
E não é nada rápido operar assim !!! Alguém usa esse mesmo tipo de operação, mas de maneira melhor
Os problemas mais comuns:
- Mais de um usuário podem estar marcando registros diferentes na mesma tabela, em terminais diferentes, aí vai saber quem marcou o quê ?!!!
- Se cair a energia, e os registros permanecerem marcados. Aí, sem saber outro usuário entra na rotina, e sem saber que tal registro está marcado, manda executar determinada função. Aí, altera algum registro que não deveria ser alterado.
A maneira como tento "cercar" isso: Eu faço algo parecido com o Eolo: Tenho um campo dentro do DBF com o nome "CHAVE, C, 1" e outro "USUARIO, N, 3" com o código do usuário que está acessando, possibilitando que as seleções sejam específicas para cada usuário. Aí, dá pra separar o que o usuário 001 e 002 marcaram respectivamente, por exemplo. Já no caso do desligamento indevido, resolvo mandando um comando pra limpar todas as "marcações" antes de abrir o registro na tela pro usuário marcar.
E não é nada rápido operar assim !!! Alguém usa esse mesmo tipo de operação, mas de maneira melhor
Adm. Maickon Sato
Consultoria e Projetos
-------------------------------------------------------
Consultoria e Projetos
-------------------------------------------------------
Re: Selecionar registros no dbedit
Sato,Já no caso do desligamento indevido, resolvo mandando um comando pra limpar todas as "marcações" antes de abrir o registro na tela pro usuário marcar. E não é nada rápido operar assim !!! Alguém usa esse mesmo tipo de operação, mas de maneira melhor
Primeiro, hoje um no-break não é tão caro e é quase obrigatório ter. Independente disso, é preciso ter rotinas de verificação das gravações: se um processo é interrompido prematuramente, quando voltar a energia o seu sistema tem que saber que algo ficou pendente e que é preciso completar o processo interrompido.
Segundo, esse mecanismo que eu uso, do campo MARCADO, não é pro usuário marcar por exemplo 12.000 registros (estou exagerando, só pra exemplificar). Se é pra alterar um campo no DBF inteiro, é outra história... Então, o mecanismo é pra "poucos" registros. No meu caso, como eu tenho esse campo INDEXADO e desmarco usando com o SEEK, o processo de desmarcar digamos 100 ou 200 registros é quase instantâneo.
Por que o seu processo demora tanto?
Código: Selecionar todos
use arquivo
set inde to arquivo
set orde to 1
do whil .t.
seek "1"
if !found()
exit
endi
endd
use
Re: Selecionar registros no dbedit
Pablo, eu concordo que o processamento na memória é mais rápido.seleção de registros ou em elementos de matriz tem melhor desempenho do que direto no arquivo de dados diretamente, essa é a minha opinião, ja que trata tudo na memória. E ainda, tem a vantagem de que na edição dos registros, não precisar tratar na hora.
Mas não concordo com a segunda parte da sua observação. Em uma rede, com mais de um usário lidando com a mesma base de dados, como é que não precisa tratar na hora?! Lógico que tem! Imagina uma loja de aluguel de carros: o usuário UM está trabalhando com 10 veículos disponíveis [em um array], enquanto que todos os 10 veículos já foram alugados pelo usuário DOIS, que finalizou o processo antes que o usuário UM...
Estoque é um outro bom exemplo.
-
robenfatti
- Usuário Nível 1

- Mensagens: 6
- Registrado em: 02 Mai 2008 22:31
Re: Selecionar registros no dbedit
Obrigado a todos pelas dicas, vou fazer alguns testes com MATRIZ e um outro usando um DBF temporário.
Valeu.
Roberto
Valeu.
Roberto