Relacionar dois ou mais bancos de dados

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Josmar dos Santos
Usuário Nível 3
Usuário Nível 3
Mensagens: 277
Registrado em: 11 Jan 2006 18:36
Localização: Botucatu-SP

Relacionar dois ou mais bancos de dados

Mensagem por Josmar dos Santos »

Pessoal, como que faz para relacionar dois ou mais arquivos ao mesmo tempo ?
Exemplo: Orçamento -> relacionar-se com Clientes.dbf e Contas a Receber.dbf. No NG, o comando mais próximo desse resultado que estou querendo obter seria o "set relation", mas nem tenho idéia de como se coloca esse comando em um conjunto de programaçao. O exemplo do NG achei eu muito complexo.
Para ser mais claro, explico melhor: Orçamento através do codigo busca o Cliente.dbf trazendo o codigo e o nome do mesmo, que também irá se relacionar com o Contas a Receber.dbf que somente irá rastrear se há débitos.
Gostaria de saber se os colegas poderiam me dar algumas dicas sobre esse comando e se há outras maneiras de fazer tal procedimento. Aguardo alguns exemplos no tópico. Em ocasiões passadas andei buscando alguma coisa sobre esse assunto, mas não tive sucesso.
Um abraço a todos
fuiiii
:xau
Avatar do usuário
gvc
Colaborador
Colaborador
Mensagens: 1270
Registrado em: 23 Ago 2005 10:57

Re: Relacionar dois ou mais bancos de dados

Mensagem por gvc »

O set relation funciona para o que vc quer, mas eu FORTEMENTE não usar esse comando.
Eu particularmente uso pesquisas on line para recuperar os dados de outros arquivos.
É que o set relation parece ser bem lento, amarra os arquivos e se vc esquecer de desativar, vai ter problemas com os outros arquivos.

No orçamento vc tem o código do cliente, dbseek no arquivo de clientes.
Como vc já tem o número do orçamento, dbseek no arquivo de itens e while para recuperar os itens do orçamento.
Com o código do cliente e No. do orçamento, dbseek no arquivo de parcelamento e while para recuperar as parcelas.
Se vc quer saber a divida do cliente, dbseek no arquivo de contas a pagar.
"TRS-80/Sincler/Apple/PC - Clipper Winter 85, tlink 1.0 [pc 10 MHz - 640K] {NEZ 8000 2Kb RAM}"
{POG - Programação Orientada a Gambiarra}
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Re: Relacionar dois ou mais bancos de dados

Mensagem por alxsts »

Olá!

Josmar:

Sei que pouca gente usa essa técnica. Normalmente se faz no braço mesmo...
Preparei uma rotina mas não testei. Veja se consegue adaptar para o que você precisa.

Código: Selecionar todos

PROCEDURE Teste()

   USE CReceb NEW ALIAS CReceb
   USE cliente NEW INDEX cliente
   USE Orcam NEW INDEX Orcam

   DBSETRELATION("Cliente", {|| Orcam->cdcli},"Orcam->cdcli")      // Cliente->( DbSeek( Orcam->cdcli ) )
   DBSETRELATION("CReceb",  {|| Orcam->cdcli},"Orcam->cdcli")    // CReceb->( DbSeek( Orcam->cdcli ) )

   ORCAM->( DbGoTop() ) // já faz o seek em cliente e creceb

   WHILE ! Orcam-( Eof() )

      // Procemdimentos
      If CReceb->( ! Eof() )
      
         // Cliente tem título em aberto; tratar

      Endif

      Orcam->( DbSkip() )

   ENDDO

   DbCloseAll()

   RETURN 
//-----------------------------------------------------------------
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
billy1943
Usuário Nível 4
Usuário Nível 4
Mensagens: 570
Registrado em: 12 Mai 2009 17:33
Localização: Bauru-SP

Re: Relacionar dois ou mais bancos de dados

Mensagem por billy1943 »

Em primeiro lugar, você precisa ter um campo de mesma natureza,espécie e tamanho, que exista em todos os arquivos que irão se relacionar, por exemplo: código do cliente.

Depois, defina qual será o arquivo que será tratado de forma sequencial, sendo que os demais serão acessados por um campo desse arquivo, de forma aleatória/randomica, para o qual devem existir índices próprios para o campo que servirá de índice.

Aí, é só construir um "do while ! eof()" do arquivo sequencial e ir acessando os arquivos de leitura e gravando o(s) arquivos de saída. Não esqueça de usar os "aliases" corretamente. O comando SKIP ou função DBSKIP() somente se aplicará no arquivo lido de forma sequencial.

Antigamente, nos meus tempos de COBOL, chamavamos isso de "balance line".
O bom do computador é que ele resolve os problemas, sem nunca levantar nenhum.
Hoje atuo mais com Clipper 52E, e um pouquinho com XHarbour.
Responder