Múltiplos "SET RELATION" com a mesma tabela

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
clodoaldomonteiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 821
Registrado em: 30 Dez 2006 13:17
Localização: Teresina-PI
Contato:

Múltiplos "SET RELATION" com a mesma tabela

Mensagem 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.
At. Clodoaldo Monteiro
Linguagens: Clipper / Harbour
Área de Atuação: Sistemas de gestão para Prefeituras Municipais
Fones: (86)3223-0653, 98859-0236
www.simplesinformatica.com.br
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Múltiplos "SET RELATION" com a mesma tabela

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
clodoaldomonteiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 821
Registrado em: 30 Dez 2006 13:17
Localização: Teresina-PI
Contato:

Múltiplos "SET RELATION" com a mesma tabela

Mensagem 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.
At. Clodoaldo Monteiro
Linguagens: Clipper / Harbour
Área de Atuação: Sistemas de gestão para Prefeituras Municipais
Fones: (86)3223-0653, 98859-0236
www.simplesinformatica.com.br
Responder