dúvida? SELECT

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Glauco Cruz Costa
Usuário Nível 3
Usuário Nível 3
Mensagens: 102
Registrado em: 15 Dez 2005 22:02
Localização: Brasília/DF
Contato:

dúvida? SELECT

Mensagem por Glauco Cruz Costa »

Olá, amigos clipeiros.
Como vocês podem ver, hoje estou com bastante dúvidas.
Essa agora, é com relação ao comando index on.
Gostaria de saber se ele funciona bem desse modo:
Na seqüência:
Estando em rede.
Coloco:

USE MATRICULA ALIAS MATRI SHARED NEW
USE PRIMEIRA ALIAS PRIME SHARED NEW
USE RETORNO ALIAS RETOR SHARED NEW

Depois, em cada procedimento prg separado (para chamar com DO):

PROCEDURE MAT OU MAT.PRG
SELECT MATRI
...
PROCEDURE PRI OU PRI.PRG
SELECT PRIME
...
PROCEDURE RET OU RET.PRG
SELECT RETOR
...

Gostaria de saber, então, se isso funciona corretamente, ou se deve ser de outro jeito, ou, ainda, se funciona, mas há um jeito melhor.
Obrigado. :-o
rbonotto
Usuário Nível 3
Usuário Nível 3
Mensagens: 253
Registrado em: 06 Mai 2005 18:52

Mensagem por rbonotto »

Eu usaria assim:

SELE 0
USE MATRICULA ALIAS MATRI SHARED NEW

SELE 0
USE PRIMEIRA ALIAS PRIME SHARED NEW

SELE 0
USE RETORNO ALIAS RETOR SHARED NEW

De resto Ok,
Glauco Cruz Costa
Usuário Nível 3
Usuário Nível 3
Mensagens: 102
Registrado em: 15 Dez 2005 22:02
Localização: Brasília/DF
Contato:

Mensagem por Glauco Cruz Costa »

rbonotto escreveu:Eu usaria assim:

SELE 0
USE MATRICULA ALIAS MATRI SHARED NEW

SELE 0
USE PRIMEIRA ALIAS PRIME SHARED NEW

SELE 0
USE RETORNO ALIAS RETOR SHARED NEW

De resto Ok,

Não compreendi. Poderia me explicar?
Obrigado.
Avatar do usuário
gvc
Colaborador
Colaborador
Mensagens: 1270
Registrado em: 23 Ago 2005 10:57

Mensagem por gvc »

Quando vc coloca SELECT 0 e abre um arquivo, ele é aberto na próxima área livre.
Como vc esta utilizando o NEW na abertura do arquivo, isso tb é feito (funciona igual).

Dentro do seu sistema, após abrir o arquivo, após usar o comando SELECT <apelido/área>, estará trabalhando com a área em que ele foi aberto.
Se necessário, vc pode usar <apelido>-><campo> ou <apelido>->(<função>). Isso faz com que vc não tenha que mudar de área para trabalhar com o banco de dados.
Ex.
cliente->(dbseek(xcodigo)) = Faz a pesquisa na área CLIENTE com o dbseek procurando pelo conteúde da variável XCODIGO.

cliente->codigo = Conteúdo do campo codigo da área CLIENTE.
Glauco Cruz Costa
Usuário Nível 3
Usuário Nível 3
Mensagens: 102
Registrado em: 15 Dez 2005 22:02
Localização: Brasília/DF
Contato:

Mensagem por Glauco Cruz Costa »

gvc escreveu:Quando vc coloca SELECT 0 e abre um arquivo, ele é aberto na próxima área livre.
Como vc esta utilizando o NEW na abertura do arquivo, isso tb é feito (funciona igual).

Dentro do seu sistema, após abrir o arquivo, após usar o comando SELECT <apelido/área>, estará trabalhando com a área em que ele foi aberto.
Se necessário, vc pode usar <apelido>-><campo> ou <apelido>->(<função>). Isso faz com que vc não tenha que mudar de área para trabalhar com o banco de dados.
Ex.
cliente->(dbseek(xcodigo)) = Faz a pesquisa na área CLIENTE com o dbseek procurando pelo conteúde da variável XCODIGO.

cliente->codigo = Conteúdo do campo codigo da área CLIENTE.
Mas, do jeito que eu botei não é a mesma coisa? Veja:

USE MATRICULA ALIAS MATRI SHARED NEW
USE PRIMEIRA ALIAS PRIME SHARED NEW
USE RETORNO ALIAS RETOR SHARED NEW

Depois, em cada procedimento prg separado (para chamar com DO) ou no próprio prg:

PROCEDURE MAT OU MAT.PRG
SELECT MATRI
...
PROCEDURE PRI OU PRI.PRG
SELECT PRIME
...
PROCEDURE RET OU RET.PRG
SELECT RETOR
...

A cláusula NEW está abrindo cada um em uma nova área, não é? Ou dá pau assim?
Stanis Luksys
Colaborador
Colaborador
Mensagens: 1329
Registrado em: 18 Jun 2005 03:04
Localização: São Paulo
Contato:

Mensagem por Stanis Luksys »

Olá,

Eu abriria cada arquivo no procedimento em que será usado, afinal num ambiente de rede você estaria brindo diversas vezes o mesmo arquivo sem que ele nem mesmo estaje sendo utilizado...

Algo assim:


PROCEDURE MAT OU MAT.PRG
USE MATRICULA ALIAS MATRI SHARED NEW
...
PROCEDURE PRI OU PRI.PRG
USE PRIMEIRA ALIAS PRIME SHARED NEW
...
PROCEDURE RET OU RET.PRG
USE RETORNO ALIAS RETOR SHARED NEW


Observação: não chame seu procedimento com

DO RET

e sim com:

RET()


Faloooo
Stanis Luksys
sites.google.com/hblibs

Apoiar e se utilizar de projetos opensource não é uma questão de boicote, mas sim de liberdade.
Utilize, aprimore e distribua.
Glauco Cruz Costa
Usuário Nível 3
Usuário Nível 3
Mensagens: 102
Registrado em: 15 Dez 2005 22:02
Localização: Brasília/DF
Contato:

Mensagem por Glauco Cruz Costa »

Stanis Luksys escreveu:Olá,

Eu abriria cada arquivo no procedimento em que será usado, afinal num ambiente de rede você estaria brindo diversas vezes o mesmo arquivo sem que ele nem mesmo estaje sendo utilizado...

Algo assim:


PROCEDURE MAT OU MAT.PRG
USE MATRICULA ALIAS MATRI SHARED NEW
...
PROCEDURE PRI OU PRI.PRG
USE PRIMEIRA ALIAS PRIME SHARED NEW
...
PROCEDURE RET OU RET.PRG
USE RETORNO ALIAS RETOR SHARED NEW


Observação: não chame seu procedimento com

DO RET

e sim com:

RET()


Faloooo

Ah! Veja bem se entendi.
Então não precisa se preocupar com o SELECT, não é? É só ir usando o USE nos procedimentos, mesmo que ele se repita.
Então, por exemplo, eu posso usar:
Em um procedimento
USE REGISTRO SHARED NEW
Em outro procedimento
USE REGISTRO INDEX MATRICULA SHARED NEW
Assim, eu também evitaria abrir indexes desnecessários para tal rotina.
É isso mesmo?
...
Quando ao DO. É só para no caso de o procedimento ser um outro arquivo .prg. Isso daria algum problema?
Avatar do usuário
gvc
Colaborador
Colaborador
Mensagens: 1270
Registrado em: 23 Ago 2005 10:57

Mensagem por gvc »

1 - Vc pode abrir os arquivos uma vez no sistema e usar nele todo.
- Dentro da procedure/função só os arquivos que serão usados.

2 - Sempre que vc abrir um DBF, vc deve abrir os NTX correspondentes. Se o sistema esta em rede, pode ser atualizado por outro usuário e o que vc lê pode não ser mais realidade.

3 - Se vc abrir dentro da procedure/função, tenha como norma fechar os arquivos ao terminar o módulo que os abriu. Assim quando chamar outra vez a abertura do DBF, não vai receber mensagem que o arquivo já esta aberto. Tente trabalhar com essa regra: Só abra arquivos necessários ao processo. O arquivo fica aberto somente o tempo necessário para o processo. Não fique abrindo e fechando um arquivo dentro de um processo, isso consome tempo do processo e sua rotina fica lenta.

4 - Se vc usar MAKEFILE para compilar seus PRG, todas as chamadas serão para procedimento e função. vc não terá que usar DO <processo>.

5 - Se vc esta com um arquivo aberto e manda abrir com o mesmo ALIAS, vc recebe mensagem de erro. Não é prática comum, mas vc pode abrir o mesmo DBF com ALIAS diferentes.
Glauco Cruz Costa
Usuário Nível 3
Usuário Nível 3
Mensagens: 102
Registrado em: 15 Dez 2005 22:02
Localização: Brasília/DF
Contato:

Mensagem por Glauco Cruz Costa »

gvc escreveu:1 - Vc pode abrir os arquivos uma vez no sistema e usar nele todo.
- Dentro da procedure/função só os arquivos que serão usados.

2 - Sempre que vc abrir um DBF, vc deve abrir os NTX correspondentes. Se o sistema esta em rede, pode ser atualizado por outro usuário e o que vc lê pode não ser mais realidade.

3 - Se vc abrir dentro da procedure/função, tenha como norma fechar os arquivos ao terminar o módulo que os abriu. Assim quando chamar outra vez a abertura do DBF, não vai receber mensagem que o arquivo já esta aberto. Tente trabalhar com essa regra: Só abra arquivos necessários ao processo. O arquivo fica aberto somente o tempo necessário para o processo. Não fique abrindo e fechando um arquivo dentro de um processo, isso consome tempo do processo e sua rotina fica lenta.

4 - Se vc usar MAKEFILE para compilar seus PRG, todas as chamadas serão para procedimento e função. vc não terá que usar DO <processo>.

5 - Se vc esta com um arquivo aberto e manda abrir com o mesmo ALIAS, vc recebe mensagem de erro. Não é prática comum, mas vc pode abrir o mesmo DBF com ALIAS diferentes.
Questão 5

Mas, mesmo se for assim?:
USE REGISTRO ALIAS REG SHARED NEW

Agora, se eu chamar os procedimentos com
SELECT REG
vai dar problema?
Ele não iria assumir o new não?
Avatar do usuário
acelconsultoria
Usuário Nível 3
Usuário Nível 3
Mensagens: 231
Registrado em: 10 Jan 2006 17:05
Localização: Itápolis-SP

Glauco...

Mensagem por acelconsultoria »

Bem, pelo que eu entendi, vc quer atribuir uma área (SELECT) à um banco de dados (DBF) e chamá-lo pelo nome (ALIAS), correto ???

No meu sistema utilizo uma função para verificar se o arquivo está sendo utilizado por outro usuário antes de prosseguir, mas enfim, vamos ao problema principal.

Resumindo, funciona assim:

USE ESTOQUE NEW
SET INDEX TO EST001, EST002

USE CLIENTES NEW
SET INDEX TO CLI001, CLI002

USE FINANCE NEW
SET INDEX TO FIN001

Assim, quando eu executo:

SELE ESTOQUE - seleciono a área estoque
SELE CLIENTES - seleciono a área cliente
SELE FINANCE - seleciono a área finance

Meu sistema não é gigantesco, possui apenas cerca de 90 bancos de dados. Não abro todos de uma vez, só os que necessito para cada módulo que está sendo executado, ou seja, cerca de 5 a 10 por vez. Apenas quando o sistema executa o fechamento financeiro, apurando os demonstrativos contábeis gerenciais, que chego a utilizar 30 tabelas simultaneamente.

Nunca tive problemas no meu sistema, funciona perfeitamente.

Mas, volto a repetir, apenas ilustrei basicamente. Não se esqueça de tratar as aberturas de arquivos levando em consideração a rede.

Abraços...
Maickon Sato
Acel Consultoria e Projetos
Avatar do usuário
gvc
Colaborador
Colaborador
Mensagens: 1270
Registrado em: 23 Ago 2005 10:57

Mensagem por gvc »

Se vc colocar USE <arquivo> vc esta abrindo o arquivo na área de trabalho atual.
Se vc colocar USE <arquivo> NEW vc esta abrindo o arquivo na próxima área de trabalho.
Se vc colocar SELECT <nome/número>, esta passando a usar a área com o nome/número que já deve estar aberto.
SELECT 0 coloca vc na próxima área que não tenha um arquivo aberto.
Stanis Luksys
Colaborador
Colaborador
Mensagens: 1329
Registrado em: 18 Jun 2005 03:04
Localização: São Paulo
Contato:

Mensagem por Stanis Luksys »

Olá,

Eu não acho proveitoso utilizar áreas pelos numeros ou letras...

Seria mais vantajoso sempre abrir com a cláusula NEW e depois chamar a área pelo nome do arquivo ou seu apelido, caso o tenha criado com a cláusula ALIAS...
Stanis Luksys
sites.google.com/hblibs

Apoiar e se utilizar de projetos opensource não é uma questão de boicote, mas sim de liberdade.
Utilize, aprimore e distribua.
Responder