Aproveitando o tópico...
Mario Isa, a sugestão que lhe enviei por e-mail sobre imprimir arquivo .doc com start deu certo?
Agora, ao Anderson:
Estava esquecendo da rotina que lhe prometi! Lembrei-me agora!
E vendo o tópico, lembrei que tinha alguma coisa aqui de acordo com a sugestão do Mário.
Não é com a função achoice(), mas sim com a função dbedit().
Mas a rotina é bem fácil de ser entendida. Só tive que comentá-la bem porque não sei qual a sua familiaridade com a dita cuja!
O que deve ser feito antes de compilar e linkar:
Criar um arquivo dbf chamado "movim.dbf", com a seguinte estrutura:
- Campo "LOJA", tipo Character, tamanho 2;
- Campo "PRODUTO", tipo Character, tamanho 6;
- Campo "ENTRADA", tipo Numeric, tamanho 11, com 2 decimais;
- Campo "SAIDA", tipo Numeric, tamanho 11, com 2 decimais.
Popular o arquivo "movim.dbf" com alguns registros.
Ou, se preferir, mudar no fonte de exemplo:
- O nome do arquivo "movim.dbf";
- Os nomes dos campos do arquivo;
- As máscaras de exibição dos campos;
- Os nomes dos cabeçalhos de cada campo.
- Os campos do índice, nome do índice e nome da tag.
Se bem que acho que é mais fácil criar um DBF com a estrutura acima e populá-lo. Aí você não precisará mudar nada no fonte!
Como usar:
Compilar e linkar o fonte de exemplo com o drive SIx2.
Ao executar, será exibido o browse com os campos do arquivo dbf.
O índice é "loja+produto" e parti do princípio que seja um índice único (se bem que não vem ao caso...).
Portanto, como exemplo, com o browse em exibição, se você digitar:
"04" -> Será filtrado somente os dados da loja "04";
"04000002" -> Será filtrado a linha da loja "04" que contenha o produto "000002".
A tecla "BackSpace" apaga do filtro o último caracter digitado.
A tecla "Ctrl+BackSpace" apaga do filtro tudo que foi digitado.
As teclas "Enter" e "Esc" abortam a função dbedit().
Está aí uma forma de você usar também este exemplo como uma lista de pesquisa. Para isto, basta reprogramar o "Esc" para ir ao final do arquivo (não selecionar nada) e o "Enter" apenas para abortar a dbedit(), ficando corrente a linha em que estava posicionado.
Se preferir, diga-me e lhe envio os arquivos por e-mail.
Espero que esta solução lhe ajude com seu problema.
Código: Selecionar todos
#include "sixnsx2.ch"
REQUEST SIXNSX
RDDSETDEFAULT("SIXNSX")
SET EXACT OFF
SET SCOREBOARD OFF
SET DATE FORMAT "dd/mm/yyyy"
SET CENTURY ON
SET EPOCH TO 1950
SET DELETED ON
SET WRAP ON
SETCANCEL(.t.)
// Estas tres linhas abaixo deverao
// estar na sua rotina de indexacao
USE movim NEW
INDEX ON movim->loja+movim->produto TAG movim1
DBCLOSEALL()
// Aqui e a rotina
CLS
USE movim INDEX movim NEW
SET ORDER TO TAG "movim1"
// Chama a funcao que prepara a lista da DBEDIT()
Lista()
DBCLOSEALL()
RETURN
************************************************************
// Funcao que prepara a lista da DBEDIT()
STATIC FUNCTION Lista()
LOCAL cField := {},; // Campos a serem exibidos
cMask := {},; // Mascara dos campos a serem exibidos
cHeader := {} // Cabecalho dos campos a serem exibidos
PRIVATE cFiltro := SPACE(0)
cField := {"movim->loja","movim->produto",;
"movim->entrada","movim->saida"}
cMask := {"","","@E 99,999,999.99","@E 99,999,999.99"}
cHeader := {"Loja","Produto"," Entrada"," Saida"}
(ALIAS())->(DBEDIT(4,10,(MAXROW() - 4),(MAXCOL() - 10),cField,;
"Edicao",cMask,cHeader,CHR(196),CHR(179)))
RETURN NIL
* Fim de [Lista]
* Fim do programa
************************************************************
// A funcao "Edicao()" devera estar no seu arquivo de funcoes
/*
Funcao Edicao()
Funcao executada para tratar excessoes da DBEDIT()
Parametro: pcModo
Parametro automatico que indica o estado da DBEDIT()
PARAMETRO pcModo A SER UTILIZADO NA FUNCAO
Na chamada de uma funcao do usuario pela DBEDIT():
0 = Pressionou teclas, mas nao ha pendencias
1 = O cursor foi para o inicio do arquivo
2 = O cursor foi para o fim do arquivo
3 = Nao ha registros na area de trabalho
4 = Houve uma excessao a ser tratada
No retorno da funcao do usuario a DBEDIT()
0 = Aborta a DBEDIT()
1 = Continua a DBEDIT()
2 = Forca leitura, exibicao e continuacao da DBEDIT()
*/
FUNCTION Edicao(pcModo)
LOCAL nRetModo := 1 // Forca a continuacao da DBEDIT()
@23,00 SAY SPACE(80) // Limpa a linha de mensagens
// Havendo caracteres digitados na variavel [cFiltro], exibe-os
IF !EMPTY(cFiltro)
@23,30 SAY cFiltro
// Nao havendo caracteres digitados na variavel [cFiltro],
// exibe, para o usuario, as teclas de navegacao
ELSE
@23,06 SAY "Use "+CHR(25)+CHR(24)+CHR(26)+CHR(27)+" End Home "+;
"PgDn PgUp Ctrl+End Ctrl+Home Ctrl+PgDn Ctrl+PgUp"
ENDIF
IF pcModo = 4 // Trata uma excessao da DBEDIT()
// Se pressionou uma tecla (espaco, A...Z, a...z, 0...9
// e alguns caracteres especiais, como +, -, (, ), etc),
// monta a variavel [cFiltro] que sera o filtro da SIx2
// OBS.: Nao trata o pressionamento das letras acentuadas
IF LASTKEY() >= 32 .AND. ;
LASTKEY() <= 126 // (espaco, A...Z, a...z, 0...9, etc.)
cFiltro := LTRIM(cFiltro)+CHR(LASTKEY())
IF (ALIAS())->(!DBSEEK(cFiltro))
TONE(900,1)
cFiltro := SUBSTR(cFiltro,1,LEN(ALLTRIM(cFiltro)) - 1)
ENDIF
(ALIAS())->(SX_SETSCOPE(0,cFiltro)) // Ativa o filtro
(ALIAS())->(SX_SETSCOPE(1,cFiltro))
(ALIAS())->(DBGOTOP())
nRetModo := 2 // Forca a leitura e continua a DBEDIT()
// Se pressionou <BackSpace>, apaga da variavel [cFiltro]
// o ultimo caracter digitado, refazendo ou desativando o
// filtro, coforme o caso
ELSEIF LASTKEY() = 8 // <BackSpace>
cFiltro := SUBSTR(cFiltro,1,LEN(ALLTRIM(cFiltro)) - 1)
// Enquanto ha caracteres na variavel [cFiltro] para
// serem filtrados, refaz o filtro
IF !EMPTY(cFiltro)
(ALIAS())->(SX_SETSCOPE(0,cFiltro))
(ALIAS())->(SX_SETSCOPE(1,cFiltro))
// Quando nao ha mais caracteres na variavel [cFiltro]
// (apagou tudo com <BackSpace>), desativa o filtro
ELSE
(ALIAS())->(SX_CLRSCOPE(0))
(ALIAS())->(SX_CLRSCOPE(1))
ENDIF
(ALIAS())->(DBGOTOP())
nRetModo := 2 // Forca a leitura e continua a DBEDIT()
// Se pressionou <CtrlBackSpace>, limpa todos os caracteres
// da variavel [cFiltro] e desativa o filtro
ELSEIF LASTKEY() = 127 // <CtrlBackSpace>
cFiltro := SPACE(0)
(ALIAS())->(SX_CLRSCOPE(0))
(ALIAS())->(SX_CLRSCOPE(1))
(ALIAS())->(DBGOTOP())
nRetModo := 2 // Forca a leitura e continua a DBEDIT()
// Se pressionou <Enter> ou <Esc>, limpa os caracteres da
// variavel [cFiltro], desativa o filtro e aborta a DBEDIT()
ELSEIF LASTKEY() = 13 .OR. ;
LASTKEY() = 27 // <Enter> ou <Esc>
cFiltro := SPACE(0)
(ALIAS())->(SX_CLRSCOPE(0))
(ALIAS())->(SX_CLRSCOPE(1))
(ALIAS())->(DBGOTOP())
nRetModo := 0 // Aborta a DBEDIT()
ENDIF
ENDIF
RETURN nRetModo
* Fim de [Edicao]