Uso ha alguns anos com sucesso o Mediator para Mysql! O legal desse RDD, assim como de outros semelhantes, eh que eles nos dão a oportunidade de escolher se continuamos usando comando xbase ou sql. Comecei minha vida de programação com xbase e este eh para mim a oitava maravilha do mundo. Ocorre parece haver em nós um certo complexo de inferioridade qndo usamos comandos xbase e achamos q aqueles q usam comandos sql estão em outro nivel, outro patamar, que deixou coisas "velhas" e agora ta na "modernidade".
Pois bem! Resolvi trocar os comandos xbase em alguns relatorios para sql. O resultado foi destroso qndo testei em uma base de dados mediana. Sql comeu poeira: 52 segundos para mostrar o relatorio na tela! Ja qndo usei comandos xbase... 2 segundos! eh uma diferença enoooooormeeeeeee!
Pode ser pq eu nao domine sql... quem sabe! Pode ser tbm que tenha a ver como os meus Ãndices estao criados. Sinceramente, não sei. O que sei eh q de 52 segundos para apenas 2... eh de estranhar!
Em Sql
cQuery = "SELECT a00ecf.marecf, a00ecf.nrfecf, a00ecf.identi, " + ;
"SUM(a03ped.TOTPED) as Total " + ;
"FROM a03ped " + ;
"INNER JOIN a00ecf ON ( a03ped.ecfnrf=a00ecf.nrfecf ) " + ;
"WHERE a03ped.is_deleted = 'N' AND a03ped.flgcan='N' AND a03ped.datemi>='&vDataI_' AND a03ped.datemi<='&vDataF_'" + ;
"GROUP BY a03ped.ecfnrf"
GERA_TAB()
use &dbftmp as cQuery NEW SCROLLABLE
DbGoTop()
Do While !Eof()
nTotalGeral += total
@ PROW() + 01, 01 SAY NRFECF
@ PROW() , 23 SAY Left(MARECF,15)
@ PROW() , 45 SAY IDENTI
@ PROW() , 66 SAY Total Pict "@E 99,999,999.99"
DbSkip()
Enddo
Use
@ PROW() + 01, 50 SAY "Total --->>>"
@ PROW() , 65 SAY nTotalGeral Pict "@E 999,999,999.99"
Em xBase
aCampos := {}
aAdd( aCampos , { "NRFECF" , "C" , 21 , 0 } )
aAdd( aCampos , { "MARECF" , "C" , 15 , 0 } )
aAdd( aCampos , { "IDENTI" , "C" , 15 , 0 } )
aAdd( aCampos , { "TOTAL" , "N" , 15 , 2 } )
dbCreate( "mem:test", aCampos, "DBFCDX" , .T., "memarea" )
INDEX ON NRFECF TAG CHAVE1
SELECT PEDIDO
DBSETORDER(7)
DBGOTOP()
OrdScope( 0, Dtos(vDATAi) )
OrdScope( 1, Dtos(vDATAf) )
DBGOTOP()
Do While !Eof()
If FlgCan = "S"
DbSkip()
Loop
Endif
If EcfFab != pedido->ecfnrf
Select Ecf
DbSetOrder(2)
DbGoTop()
DbSeek( pedido->ecfnrf )
Endif
EcfFab = pedido->ecfnrf
Select MemArea
DbAppend()
replace NRFECF with pedido->ECFNRF ,;
MARECF with ecf->marecf ,;
IDENTI with ecf->identi ,;
TOTAL with pedido->TOTPED
Select Pedido
DbSkip()
Enddo
OrdScope( 0, nil )
OrdScope( 1, nil )
Select MemArea
DBSETORDER(1)
GOTO TOP
Do While !Eof()
xEcf = NrfEcf
xTotal = 0
@ PROW() + 01, 01 SAY NRFECF
@ PROW() , 23 SAY Left(MARECF,15)
@ PROW() , 45 SAY IDENTI
Do While xEcf = NrfEcf
xTotal = xTotal + Total
DbSkip()
Enddo
nTotalGeral += xtotal
@ PROW() , 66 SAY xTotal Pict "@E 99,999,999.99"
Enddo
Close memarea
dbDrop( "mem:test" ) // Free memory
@ PROW() + 01, 50 SAY "Total --->>>"
@ PROW() , 65 SAY nTotalGeral Pict "@E 999,999,999.99"
Indices
INDEX ON PEDIDO TAG CHAVE1
INDEX ON STR(CODCLI)+DTOS(DATEMI) TAG CHAVE2
INDEX ON FLGIMP TAG CHAVE3
INDEX ON STR(CODVED)+DTOS(DATEMI) TAG CHAVE4
INDEX ON STR(CODPRZ)+DTOS(DATEMI) TAG CHAVE5
INDEX ON STR(CODCLI)+DESCEND(STR(PEDIDO)) TAG CHAVE6
INDEX ON DTOS(DATEMI) TAG CHAVE7
INDEX ON ECFNRF+Dtos(EMIDAT)+Str(COONUM) TAG CHAVE8