Tenho um sistema de orçamentos em que abro os DBFs de cabeçalho, clientes e ítens no ínicio da rotina, relaciono-os com DbSetRelation() e visualizo-os com Tbrowse, mudo de índice conforme a coluna, gerencio a edição e impressão nessa mesma rotina. Quando incluo um novo orçamento chamo outro browse para escolher o cliente, as áreas e índices são salvos no início da rotina de busca e restauradas no final. Ocorre que depois que incluo um orçamento perco a relação com o DBF de clientes, o ponteiro vai para o final do arquivo, tenho que sair da rotina e entrar novamente para reestabelecer as relações. Como posso resolver isso ? Grato!
Grings
Problemas com DbSetRelation()
Moderador: Moderadores
-
josenilson
- Usuário Nível 1

- Mensagens: 46
- Registrado em: 14 Set 2004 10:58
verifique se vc esta fechando e abrindo novamente o arquivo de clientes. Pq, quando isso acontece, a relação entre os DBF´s é perdida, mesmo que vc salve a área e os indices da tabela de clientes.
Exemplo:
Use tabcli.dbf alias CLIENTES New Index Indcod
Use taborcam.dbf alias ORCAMENTO New Index IndOrc
Set Relation to codcli into CLIENTES
( Se voce fechar o arquivo taborcam.dbf ou o tabcli.dbf em algum ponto do seu sistema, o relacionamento acima será perdido, mesmo que mais tarde vc reabra as arquivos)
Exemplo:
Use tabcli.dbf alias CLIENTES New Index Indcod
Use taborcam.dbf alias ORCAMENTO New Index IndOrc
Set Relation to codcli into CLIENTES
( Se voce fechar o arquivo taborcam.dbf ou o tabcli.dbf em algum ponto do seu sistema, o relacionamento acima será perdido, mesmo que mais tarde vc reabra as arquivos)
Não, os arquivos são abertos uma única vez no início da rotina e estabelecidos os relacionamentos. Quando executo as rotinas de edição o ponteiro é deslocado para o cliente desejado, o código é inserido no DBF de cabeçalho e então, não sei porque, o ponteiro do DBF de clientes vai para o final do arquivo.
-
josenilson
- Usuário Nível 1

- Mensagens: 46
- Registrado em: 14 Set 2004 10:58
Vc já verificou se o relacionamento fica quebrado mesmo?
Faz o seguinte (sugestão):
No teu fonte, depois dos comandos Append Blank, Replace, Commit, utilize a função DbRelation() para verificar se a relação ainda está ativa.
Utilize a função IndexKey() para verificar se os indices do arquivo de clientes estão reposicionados corretamente.
Se estiver tudo ok, depois do comando Commit, tenta usar a função DbSkip( 0 ) ou o comando Skip 0. Isso faz com que o ponteiro seja reposiconado no mesmo registro e com isso, os relacionamentos também serão atualizados.
Lembre que quando se dar um comando Append Blank numa tabela mestre (orcamento), o ponteiro da tabela detalhe (clientes) se posiciona no final do arquivo mesmo, pq o campo de relacionamento (codcli) fica momentaneamente vazio.
Faz o seguinte (sugestão):
No teu fonte, depois dos comandos Append Blank, Replace, Commit, utilize a função DbRelation() para verificar se a relação ainda está ativa.
Utilize a função IndexKey() para verificar se os indices do arquivo de clientes estão reposicionados corretamente.
Se estiver tudo ok, depois do comando Commit, tenta usar a função DbSkip( 0 ) ou o comando Skip 0. Isso faz com que o ponteiro seja reposiconado no mesmo registro e com isso, os relacionamentos também serão atualizados.
Lembre que quando se dar um comando Append Blank numa tabela mestre (orcamento), o ponteiro da tabela detalhe (clientes) se posiciona no final do arquivo mesmo, pq o campo de relacionamento (codcli) fica momentaneamente vazio.
É exatamente este o problema, quando dou um Append o ponteiro de clientes vai para o final do arquivo e descontrola o relacionamento. Não adianta posicionar o ponteiro de clientes no código que consta no cabeçalho, ele volta para o final. Agora, se digito um código válido e não faço a pesquisa letra-a-letra, funciona corretamente.
Uma coisa que vc pode fazer é não utilizar o DBSETRELATION para verificar a tabela de clientes.
Como é um orçamento, vc só necessita verificar e pesquisar o cliente para saber se ele é cadastrado no ínicio do orçamento.
Faça a sua função de pesquisa com o DBSEEK para procurar o cliente por código e se necessário, por nome.
Como é um orçamento, vc só necessita verificar e pesquisar o cliente para saber se ele é cadastrado no ínicio do orçamento.
Faça a sua função de pesquisa com o DBSEEK para procurar o cliente por código e se necessário, por nome.

