Página 1 de 1

Múltiplos "SET RELATION" com a mesma tabela

Enviado: 28 Dez 2023 09:03
por clodoaldomonteiro
Bom dia,
Tenho a seguinte questão com Set Relation, que é fazê-lo duas vezes com a mesma tabela, por exemplo:
- A Tabela Diario tem os campos [NumLanc, ContaDeb, ContaCred, Valor].
- A tabela Conta tem os campos [Conta, Descricao, xxx, yyy]

E queria saber se funcionaria:

Código: Selecionar todos

   DbUseArea( .T., "DBFCDX" , "Conta.dbf", "cDeb", .t. )  //Abre Compartilhado numa nova área e novo Alias
   Set Index To ("Conta.cdx")

   DbUseArea( .T., "DBFCDX" , "Conta.dbf", "cCred", .t. )  //Abre Compartilhado numa nova área e novo Alias
   Set Index To ("Conta.cdx")

   DbUseArea( .T., "DBFCDX" , "Diario.dbf", "Dia", .t. )
   Set Relation;
    To ContaDeb Into cDeb,;
    To ContaCred Into cDrec 

   Do While !Eof()
      ? cDeb->Descricao //é uma coisa
      ? cCred->Descricao //é outra coisa
      ...
      ...
      Skip
   Enddo
Essa seria a melhor maneira de obter o resultado positivo para cada conta da tab Diario?
Abraços.

Múltiplos "SET RELATION" com a mesma tabela

Enviado: 28 Dez 2023 16:59
por JoséQuintas
No SQL isso é normal.
Em DBF nunca usei, mas sendo áreas diferentes, teoricamente seria aceito.

Se seguir o esquema do SQL, seria criar temporário pra tudo.

Se a intenção é apenas reduzir fonte, ainda tem o uso de função:

Código: Selecionar todos

@ 1, 1 SAY DescricaoConta( ctadeb )
@ 2, 1 SAY DescricaoConta( ctacre )
Mas se trabalhar com temporário, já fica meio caminho andado pra SQL.
Ou até DBF + ADO + ADS pra usar comando SQL e ficar mais rápido.
(ou ADS + SQL diretamente pelo harbour, mas precisa pesquisar sobre o assunto)

E tem array, hasharray, temporário do harbour em memória, etc.

Está mais pra escolher qual solução vai adotar do que outra coisa.

Como é coisa de governo, é de se imaginar que pode ter muita informação, vai ter que pensar em uso de memória/disco/tempo.

Lembrando: SET RELATION pode não ser confiável, porque entram registros deletados.

Múltiplos "SET RELATION" com a mesma tabela

Enviado: 28 Dez 2023 20:55
por clodoaldomonteiro
Fim de ano tem muito registro a processar e estou ajustando minha rotina de gerar os lançamentos do Diário, pra montar os Razões.

Vi que tem muito código errado, tipo função que verifica se tabela tá aberta, muda o índice e mais, isso no meio do Do While, tal que quando refiz uma pequena parte, o tempo cai de 4 segundo para menos de 1 seg, isso com o uso do Set Relation.

Sempre dá pra melhorar o código, basta se esforçar e ir testando coisas novas, ou antigas que não conhecia.

PS. Terminei por achar uma falha ao usar Ascan() / Array, que é muito lento, pois não é indexado, vou mudar pra uma tabela DBF indexada.
Sem a rotina de busca, o tempo fica em 3 segundos.

Abraços.