Problemas com DbSetRelation()

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Grings
Usuário Nível 3
Usuário Nível 3
Mensagens: 340
Registrado em: 18 Ago 2004 13:51

Problemas com DbSetRelation()

Mensagem por Grings »

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
josenilson
Usuário Nível 1
Usuário Nível 1
Mensagens: 46
Registrado em: 14 Set 2004 10:58

Mensagem por josenilson »

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)
Avatar do usuário
gvc
Colaborador
Colaborador
Mensagens: 1270
Registrado em: 23 Ago 2005 10:57

Mensagem por gvc »

Após a atualização do arquivo, dê um dbseek nos arquivos relacionados.

Faça o teste.
Grings
Usuário Nível 3
Usuário Nível 3
Mensagens: 340
Registrado em: 18 Ago 2004 13:51

Mensagem por Grings »

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
Usuário Nível 1
Mensagens: 46
Registrado em: 14 Set 2004 10:58

Mensagem por josenilson »

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.
Grings
Usuário Nível 3
Usuário Nível 3
Mensagens: 340
Registrado em: 18 Ago 2004 13:51

Mensagem por Grings »

É 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.
Avatar do usuário
gvc
Colaborador
Colaborador
Mensagens: 1270
Registrado em: 23 Ago 2005 10:57

Mensagem por gvc »

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.
Responder