Enviado: 14 Fev 2008 16:21
Luciano, me chama depois das 19:00 que lhe faço uma demostração do TS.
Código: Selecionar todos
DBSELECTAREA(1)
DBUSEAREA(,,[A03PED],[PEDIDO], .T., [READONLY])
DBSETINDEX("A03PED")
DBSELECTAREA(2)
DBUSEAREA(,,[A16CLI],[CLIENTE], [READONLY])
DBSETINDEX("A16CLI")
DBSELECTAREA(3)
DBUSEAREA(,,[A16VED],[VENDEDOR], [READONLY])
DBSETINDEX("A16VED")
DBSELECTAREA(4)
DBUSEAREA(,,[A17EMP],[EMPRESA], [READONLY])
DBSETINDEX("A17EMP")
@ PROW() + 01, 00 SAY REPLICATE("-",79)
@ PROW() + 01, 00 SAY EMPRESA PICT "@!"
@ PROW() + 00, 69 SAY DATE()
@ PROW() + 01, 00 SAY USUARIO pict "@!"
@ PROW() + 00, 69 SAY "Pagina " + STRZERO(vPAGINA,3)
@ PROW() + 01, 00 SAY REPLICATE("-",79)
@ PROW() + 01, 00 SAY PADC(" RESUMO DE VENDAS POR CLIENTE ",79, "*")
@ PROW() + 01, 00 SAY REPLICATE("-",79)
@ PROW() + 01, 20 SAY "Emitidas entre " + DTOC(vDATAi) + " e " + DTOC(vDATAf)
@ PROW() + 01, 00 SAY REPLICATE("-",79)
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
GERA_DBF()
tmp1 = dbftmp
SELECT CLIENTE
DBSETORDER(1)
DBGOTOP()
COPY FIELDS CODIGO, NOMCLI TO C:\&tmp1 VIA 'DBFCDX'
USE C:\&tmp1 NEW VIA 'DBFCDX'
INDEX ON CODIGO TAG CHAVE1 TO C:\&tmp1
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
GERA_DBF()
tmp2 = dbftmp
SELECT VENDEDOR
DBSETORDER(1)
DBGOTOP()
COPY FIELDS CODIGO, NOMRDZ TO C:\&tmp2 VIA 'DBFCDX'
USE C:\&tmp2 NEW VIA 'DBFCDX'
INDEX ON CODIGO TAG CHAVE1 TO C:\&tmp2
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
GERA_DBF()
tmp3 = dbftmp
SELECT EMPRESA
DBGOTOP()
COPY FIELDS CODIGO, NOMRDZ TO C:\&tmp3 VIA 'DBFCDX'
USE C:\&tmp3 NEW VIA 'DBFCDX'
INDEX ON CODIGO TAG CHAVE1 TO C:\&tmp3
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
GERA_DBF()
SELECT PEDIDO
DBSETORDER(5)
DBGOTOP()
DBSEEK( DTOS(vDATAi), .T.)
COPY TO C:\&dbftmp WHILE DATEMI <= vDATAf FOR FLGCAN <> "S" VIA 'DBFCDX'
USE C:\&dbftmp NEW VIA 'DBFCDX'
INDEX ON STR(CODCLI)+DTOS(DATEMI) TAG CHAVE1 TO C:\&dbftmp
DBSETORDER(1)
GOTO TOP
DO WHILE !EOF()
xSOMA = 0
xCODIGO = CODCLI
SET RELATION TO CODCLI INTO &tmp1
@ PROW() + 01,05 SAY "Cliente " + StrZero(&tmp1->CODIGO,5) + " " + &tmp1->NOMCLI
@ PROW() + 01,00 SAY "Venda Emissao Vendedor Emitente Qtde Parc. 1o. Venc. Tot Pedido"
DO WHILE CODCLI = xCODIGO
@ PROW() + 01,00 SAY &dbftmp->PEDIDO PICT "@E 999,999"
@ PROW() ,08 SAY &dbftmp->DATEMI
SET RELATION TO CODVED INTO &tmp2, TO CODEMT INTO &tmp3
@ PROW() ,19 SAY &dbftmp->CODVED PICT "99"
@ PROW() ,22 SAY &tmp2->NOMRDZ PICT "@!"
@ PROW() ,34 SAY &dbftmp->CODEMT PICT "9"
@ PROW() ,36 SAY &tmp3->NOMRDZ PICT "@!"
@ PROW() ,48 SAY STRZERO(&dbftmp->QTDPAR,02)
@ PROW() ,56 SAY &dbftmp->VENPRI
@ PROW() ,70 SAY &dbftmp->TOTPED PICT "@E 99,999.99"
xSOMA = xSOMA + &dbftmp->TOTPED
DBSKIP()
ENDDO
vSOMA = vSOMA + xSOMA
@ PROW() + 01,42 SAY "Total deste CLIENTE -->>"
@ PROW() ,69 SAY xSOMA PICT "@E 999,999.99"
@ PROW() + 01,00 SAY REPLICATE("-",79)
ENDDO
@ PROW() + 02,45 SAY "** Totalizacao **"
@ PROW() ,66 SAY vSOMA PICT "@E 99,999,999.99"
@ PROW() + 03,00 SAY PADC("****** FIM DO RELATORIO ******",79)
Código: Selecionar todos
*****************************************************************************
************** Funcao : Gera Arquivo Temporario *******************
************** Inicio : 18/10/2004 *******************
************** Ult.Alter: 15/01/2003 *******************
*****************************************************************************
FUNCTION GERA_DBF
Local contafil := 1
SET DEFAULT TO C:\
PUBLIC dbftmp := space(8)
IF FILE('C:\rela0001.dbf')
dbftmp = 'rela' + strzero(contafil,4) +'.dbf'
DO WHILE FILE(dbftmp)
contafil = contafil + 1
dbftmp = "rela" + STRZERO(contafil,4) +'.dbf'
ENDDO
ELSE
dbftmp = 'rela0001.dbf'
ENDIF
dbftmp = 'rela' + strzero(contafil,4)
SET DEFAULT TO
RETURN .T.
Luciano, essa técnica de copiar os dados primeiramente para um dbf temporário é somente para os cadastros! Percebi que se num relatório de vendas, por exemplo, vc tiver que ir a cada registro pegar no cadastro de clientes o nome do cliente (no banco de vendas vc não guarda o nome do cliente, apenas o codigo deste), é muito demorado isso em Mysql. Se vc copiar todo o cadastro de cliente para um dbf temporário (mesmo que sejam 5.000 registros) e no relatório de vendas vc ir pegar o nome do cliente nesse dbf temporário, é mais rápido do que ir diretamente na tabela mysql de clientes.e se um arquivo tiver 500 mil registros, nao vai ficar lento ficar copiando toda hora ele do servidor para o C?
Se houver como jogar tudo isso dentro de uma sentença slq SERIA MUITO MELHOR e mais RÁPIDO!Vou bisbilhotar por aqui, e se encontrar te mando.
Como disse com uma sentença dá para gerar este relatorio, em sql mesmo, com tabela temporaria.
Se o MySQL não faz isso rápido, só pode ser por conta de algum problema na rede. Até porque, no SELECT você resgata só alguns campos. Nem precisa de todos. Pesquisas desse tipo TEM que ser rápidas. Pelo menos a ponto de dispensar esse tipo de artifício. Com folga.Janio escreveu:Luciano, essa técnica de copiar os dados primeiramente para um dbf temporário é somente para os cadastros! Percebi que se num relatório de vendas, por exemplo, vc tiver que ir a cada registro pegar no cadastro de clientes o nome do cliente (no banco de vendas vc não guarda o nome do cliente, apenas o codigo deste), é muito demorado isso em Mysql.
Código: Selecionar todos
...
cr1:= "select * from cdcli003 where clicod = "
cr2:= " order by clidat"
seek1:= str(clicod,7)
use (netname()) as cr1+seek1+cr2 new scrollable overwrite // este comando faz o select
...