Indices por Relacionamento
Enviado: 14 Jan 2015 10:32
Olá amigos,
O Clipper mais uma vez me surpreendendo! Então resolvi compartilhar com vocês.
Em relatórios, costumo usar índices temporários, uma vez que não acontecerá alterações nos dados da tabela, pois é só consulta, serão descartados. (Respeitando a aula me passada pelo amigo Rochinha na importância de índices, mesmo temporários, acompanhar os índices principais uma vez que utilizados em alterações). Bom mas continuando...
Em um relatório do Controle de Caixa, eu precisava separar documentos, por data e por situação/tipo (débito ou crédito) e ainda permitir ao usuário, escolher a ordem da listagem, por documento ou por emitente (alfabética), só que na tabela de CAIXA eu só armazeno o código ( COD_EMIT ).
Daí já fui logo pensando... -"Nossa, terei que criar uma tabela temporária, cópia da tabela CAIXA, porém com um campo EMITENTE para assim armazenar o nome. Mais tabelas temporárias, não!!" Então, pensei eu já relacionava a tabela CAIXA com CLIENTES para no DbEdit eu exibir o nome do EMITENTE, porque não tentar indexar por este relacionamento. Não é que deu certo!! Me preocupei se não ia bagunçar os índices nativos da tabela CLIENTES, mas não, está perfeito.
Vou tentar explicar mais durante o código...
Tentei deixar da forma mais clara possível, mas qualquer dúvida, estou a disposição.
Abraço aos amigos do fórum e VIVA o CLIPPER!!!
O Clipper mais uma vez me surpreendendo! Então resolvi compartilhar com vocês.
Em relatórios, costumo usar índices temporários, uma vez que não acontecerá alterações nos dados da tabela, pois é só consulta, serão descartados. (Respeitando a aula me passada pelo amigo Rochinha na importância de índices, mesmo temporários, acompanhar os índices principais uma vez que utilizados em alterações). Bom mas continuando...
Em um relatório do Controle de Caixa, eu precisava separar documentos, por data e por situação/tipo (débito ou crédito) e ainda permitir ao usuário, escolher a ordem da listagem, por documento ou por emitente (alfabética), só que na tabela de CAIXA eu só armazeno o código ( COD_EMIT ).
Daí já fui logo pensando... -"Nossa, terei que criar uma tabela temporária, cópia da tabela CAIXA, porém com um campo EMITENTE para assim armazenar o nome. Mais tabelas temporárias, não!!" Então, pensei eu já relacionava a tabela CAIXA com CLIENTES para no DbEdit eu exibir o nome do EMITENTE, porque não tentar indexar por este relacionamento. Não é que deu certo!! Me preocupei se não ia bagunçar os índices nativos da tabela CLIENTES, mas não, está perfeito.
Vou tentar explicar mais durante o código...
Código: Selecionar todos
*----------------* && RELATORIO DO CAIXA &&
PROCEDURE SCA0864
Save Screen to Rel0864
Sombra(12,09,18,63,tCorMold6,8)
Set Cursor On
nCodConta := 0
dData_Ini := Ctod("")
dData_Fim := Ctod("")
cSituacao := " "
cEntre_Dta := "N"
cResumido := "N"
cOrdem := "1"
cExpressao := ""
cConfirma := "N"
Do While .t.
**
** Monto a Tela para Solicitar as Opções **
**
@ 13,30 Say "(D)ébitos / (C)réditos / (A)mbos"
@ 14,30 Say "(S)im / (N)ão"
@ 15,30 Say "(S)im / (N)ão"
@ 16,30 Say "(1) Emitente / (2) Documento"
@ 17,30 Say "(S)im / (N)ão"
**
** Agora os GET´s **
**
@ 13,10 Say "Tipo Documento:" Get cSituacao Pict "!" Valid PROC_TIPO(cSituacao)
@ 14,10 Say "Entre Datas...:" Get cEntre_Dta Pict "!" Valid PROC_CTDTA(cEntre_Dta)
@ 15,10 Say "Totalizado....:" Get cResumido Pict "!" Valid cResumido$"SN"
@ 16,10 Say "Ordenado por..:" Get cOrdem Pict "!" Valid cOrdem$"12"
@ 17,10 Say "Confirma......:" Get cConfirma Pict "!" Valid cConfirma$"SN"
Read
If Lastkey() == 27 &&--> Para sair do Loop de Confirmação das Opções pelo Usuário e sair da Rotina
DBCLOSEALL()
Exit
EndIf
If cConfirma == "N"
Loop
EndIf
Exit
EndDo &&--> Loop caso o Usuário não Confirme as Opções
*
If Lastkey() == 27
Rest Screen From Rel0864
Return
Endif
*
* Aqui monto uma expressão para usar como condicional na criação do índice temporário
*
If cSituacao <> "A"
cExpressao := "CAIXA->TIPO == '" + cSituacao + "'" + " "
EndIf
If cEntre_Dta <> "N"
cExpressao := "CAIXA->DATA >= dData_Ini .and. CAIXA->DATA <= dData_Fim"
EndIf
*
Select 0
ABREARQ("CLIENTES", .t., "CLIENTES")
ORDSETFOCUS("CODIGO")
*
Select 0
ABREARQ("CAIXA", .t., "CAIXA")
Set Relation to COD_EMIT into CLIENTES &&-->Relaciomento da Tabela CAIXA com CLIENTES.
*
If cOrdem == "1" &&-->Ordem por Emitente (Alfabética)
*
Index on CLIENTES->NOME to &tLocal\TPCAIXA for &cExpressao &&--> E aqui usei o Índice relacionado
*
ElseIf cOrdem == "2" &&-->Ordem por Documento (Numérica)
*
Index on NOTA to &tLocal\TPCAIXA for &cExpressao
*
EndIf
Go Top
*
** Daqui para baixo monto o relatório.
*
Abraço aos amigos do fórum e VIVA o CLIPPER!!!