Olá galera! Criei um programa para gerar uma consiliação contábil, mas tenho que ler os históricos dos lançamentos e achar o código do fornecedor neles, a função que fiz abaixo funciona perfeitamente com o matches, mas ainda acho q está muito lento, poderia ser um pouco mais rápido, coloque o campo TABCTB.complemento como chave, mas não mudou nada na velocidade, alguém tem alguma ideia? Código: FOR EACH TABCTB WHERE TABCTB.nr_lote = TABCTB_LOTE.nr_lote AND TABCTB.cd_empresa = TABCTB_LOTE.cd_empresa EXCLUSIVE-LOCK. FOR EACH TTCAD. IF TABCTB.complemento matches ("*" + STRING(TTCAD.cd_cadastro) + '-' + SUBSTRING(STRING(TTCAD.fantasia),1,5) + "*") THEN DO: ASSIGN TABCTB.codfor = TTCAD.cd_cadastro TABCTB.cd_contabil = TTCAD.cd_contabil. END. END. END.
Outra tentativa, também, seria: Código: FOR EACH TABCTB WHERE TABCTB.nr_lote = TABCTB_LOTE.nr_lote AND TABCTB.cd_empresa = TABCTB_LOTE.cd_empresa EXCLUSIVE-LOCK. FOR EACH TTCAD. IF INDEX(TABCTB.complemento, STRING(TTCAD.cd_cadastro) + '-' + SUBSTRING(STRING(TTCAD.fantasia),1,5)) > 0 THEN DO: ASSIGN TABCTB.codfor = TTCAD.cd_cadastro TABCTB.cd_contabil = TTCAD.cd_contabil. END. END. END. É bom rodar sem o matches, só para ter certeza que é ele que deixou lento, pois derrepente é o for each sem fields, ou o índice...
Para esse tipo de pesquisa utilize sempre begins (no seu caso não dá) ou contains (word-index como foi citado). O matches não vai utilizar indice, ou mesmo se utilizar terá de varrer a tabela inteira, só é indicado se a tabela não for tão grande.
Sim, mas mesmo assim ele sempre está varrendo a tabela ttcad inteira para cada passagem do primeiro foreach, o que no frigir dos ovos dá no mesmo. Vai ser a qtde de registros do 1º foreach X a qtde do 2º, e dependendo das qtdes envolvidas vai ficar lento mesmo. Acho que daria para colocar um word-index, como foi sugerido por outro colega, nesse campo complemento e pesquisar diretamente os registros, o que iria dar uma otimizada, é claro que estou dizendo tudo isto supondo como é a estrutura na qual ele está trabalhando, e não apresentando um solução para o caso. Ele faria somente um for each na ttcad (que talvez seja uma temp-table) e pesquisaria os registros devidos na tabctb, e pronto. Novamente supondo que ele possa incluir esse indice, pois se não puder mexer na estrutura do DB, aí são outros 500.