Página 1 de 2
Escolher campo(field)
Enviado: 15 Jun 2012 17:22
por braz
Ola Pessoal, boa tarde.
Estou com dificuldade para criar uma rotina para um relatorio que só contenha os campos que eu escolher.
Por exemplo, criei uma rotina para eu imprimir ao os campos selecionados pelo usuario de um arquivo tambem selecionado pelo usuario.
Tipo assim:
Qual arquivo voce quer listar? CLIENTES
Entao criei um arquivo que conterá os campos desse arquivo, no caso CLIENTES.
O usuario irá marcar com um 'x' quais os campos que ele quer listar deste arquivo.
Até aqui tudo bem.
Como faço para listar os registros somente desses campos que foram selecionados do arquivo CLIENTES ?
Desde ja agradeço a sempre boa vontade de voces, abraços
Escolher campo(field)
Enviado: 15 Jun 2012 17:34
por HASA
Boa tarde pode ser assim:
cCAMPO = "RAZAO" && campo escolhido.
e imprima
@ 10, 10 say FIELD->&cCAMPO
HASA
Escolher campo(field)
Enviado: 15 Jun 2012 17:40
por billy1943
Para o que você quer, precisará do seguinte:
a) saber trabalhar bem com matrizes para criar o arquivo temporário que terá os campos escolhidos
b) usar algumas funções não-Clipper, tais como: AFIELDSX, AFTYPESX, AFLENSX e AFDECIX, que estão na SUPER.LIB
c) usar também a função AFIELDS, do Clipper;
d) dominando as funções citadas, você poderá criar o arquivo desejado,com os campos escolhidos
e) não esquecer que também terá de pensar nos índices para acessar esse arquivo
Escolher campo(field)
Enviado: 16 Jun 2012 21:19
por ANDRIL
Tenho esta rotina em anexo onde escolho em um DBF os campos para o relatorio. Veja se te serve, possivelmente sera necessario algumas adaptações mais já da para ter uma idéia.
Abraços.
Escolher campo(field)
Enviado: 19 Jun 2012 09:22
por braz
Ola Andril, obrigado por responder, sou iniciante em programação então não consegui utilizar a sua rotina.
Eu fiz uma, so que não consigo achar o tamanho do campo para dar o espaço necessario para impressão do proximo campo, veja se pode me ajudar:
Código: Selecionar todos
funct re_persona
SAVE SCREEN TO TELA_anterior
core=setcolor()
do while .t.
tela_fol()
xcodigo=' '
xnome=space(35)
titu=space(40)
CCC='S'
arq=' '
MESANO=SPACE(7)
fonte=0
@4,2 say 'Tecle <enter> p/ visualizar '
@06,10 to 16,75
@06,26 say ' Impressao de Relatorio Personalizado '
set escape on
@08,12 SAY 'COD.EMPRESA..:'GET xcodigo PICT '999' valid cad_empr_fol()
@10,12 get xnome pict '@!s35' when empt(xNOME)
@11,12 say 'Nome Arquivo:'GET arq PICT '@!'
@12,12 say 'Titulo do Relatorio:'get titu pict '@!'
@13,12 say 'Fonte da letra(18/19/80/140/160):'get fonte pict '999' valid(fonte>0)
@15,24 SAY 'Confirma a Emissao<S/N>'GET CCC PICT '@!'valid(ccc='S' .or. ccc='N')
READ
if lastkey()=27
exit
endif
IF CCC = 'N'
loop
ENDIF
ordem=1
SET DEVICE TO PRINT
if xcodigo = '001'
set print to relajl1.rtf
elseif xcodigo = '002'
set print to relajl2.rtf
elseif xcodigo = '003'
set print to relatk1.rtf
elseif xcodigo = '011'
set print to relatk2.rtf
endif
* dbcloseall()
sele 61
go top
locate for alltrim(nome)=alltrim(arq)
if !found()
loop
endif
arq=val(area)
sele (arq)
nomarq1 := {}
if !file( 'persona.DBF' )
aadd( nomarq1, { 'campo', 'C', 10, 0 } )
aadd( nomarq1, { 'sn', 'C', 1, 0 } )
aadd( nomarq1, { 'posicao', 'n', 2, 0 } )
dbcreate( 'persona.DBF', nomarq1 )
endi
sele 223
use persona
zap
l=10
x=1
sele (arq)
go top
f=fcount()
do while x < f
a=field(x)
sele 223
dbappend()
repl campo with a, posicao with x
sele (arq)
skip
x++
enddo
sele 223
go top
CR=SETCOLOR()
SETCOLOR('')
browse(1,10,20,40)
SETCOLOR(CR)
L=1
@l,1 say chr(fonte)
@L,1 SAY dono
@L+1,1 SAY xCOdigo+space(2)+substr(xNOme,1,35)+' '+' '+' '+empresas->cgc
@L+2,01 SAY 'ENDERECO:'+SPACE(2)+substr(empresas->endereco,1,30)+SPACE(2)+substr(empresas->cidade,1,12)+' Data: '+dtoc(date())
@L+3,1 SAY REPLICATE('=',78)
@L+4,30 SAY 'RELACAO DE EMPREGADOS'
@L+5,1 SAY REPLICATE('-',78)
*@l+5,1 say chr(15)
*@L+6,01 SAY CHR(15)
*SETPRC(9,1)
@l+7,1 say ''
SELE 223
GO TOP
DO WHILE !EOF()
IF sn $ 'xX'
@l+7,pCOL()+1 SAY CAMPO+' '
ENDIF
SKIP
ENDDO
x=1
sele 223
set filter to sn='x'
go top
DECLARE VETOR_CAMPOS[fcount()]
for x=1 to fcount()
vetor_campos[x]:=field(x)
skip
next
do while !eof()
if alltrim(field(x))=alltrim(persona->campo)
@l+1,pcol()+1 say &campo
x++
endif
sele 223
skip
enddo
sele 223
set filter to sn='x'
go top
*col():=1
l=4
sele (arq)
go top
do while !eof()
c=1
x=1
setpos(1,1)
sele 223
go top
do while !eof()
sele (arq)
if field(x)=alltrim(persona->campo)
p=persona->posicao
@l,col()+1 SAY fieldget(p)
else
p=1
endif
c=c+? <--- aqui preciso saber tamanho do campo
sele 223
skip
x++
enddo
sele (arq)
skip
l++
enddo
fclose('relacao.rtf')
set print to
set device to screen
if xcodigo = '001'
run ("wordpad relajl1.rtf")
elseif xcodigo = '002'
run ("wordpad relajl2.rtf")
elseif xcodigo = '003'
run ("wordpad relatk1.rtf")
elseif xcodigo = '011'
run ("wordpad relatk2.rtf")
endif
quit
Escolher campo(field)
Enviado: 19 Jun 2012 09:55
por ANDRIL
Substitua a linha por esta aqui e coloque esta funcao no seu prg.
c= c +
largCmp(p) + 1
Código: Selecionar todos
Function largCmp(p)
cmp=fieldput(p)
if valtype(fieldput(p) )=="C"
tamCmp=len(&cmp)
elseif valtype(fieldput(p))=="N"
tamCmp=len(str(&cmp))
else //logico
tamCmp+=1
endif
return tamCmp
Caso nao de certo tente ver os parametros mais creio que funfa normal.
Abraços
Escolher campo(field)
Enviado: 19 Jun 2012 15:19
por braz
Ola Andril obrigado novamente pela atenção, mas o largCmp(p) do campo está caindo no ELSE. Fica sempre como sendo largura do campo = 1.
Se nao me engano o valtype está dando 'U' = indefinido.
Caso tenha alguma outra forma de ver a largura do campo, eu agradeço. :{
Escolher campo(field)
Enviado: 19 Jun 2012 16:13
por ANDRIL
Acho que me perdi nos seus Do Whiles, tente colocar o
x que representa cada campo no seu loop.
c= c + largCmp(
x) + 1
Corrigi a funcao abaixo:
Código: Selecionar todos
Function largCmp(p)
cmp=fieldput(p)
if valtype(fieldput(p) )=="C"
tamCmp=len(&cmp)
elseif valtype(fieldput(p))=="N"
tamCmp=len(str(&cmp))
else //logico
tamCmp=1
endif
return tamCmp
Ate+
Escolher campo(field)
Enviado: 19 Jun 2012 17:56
por braz
Ola Andril,
Coloquei um wait'' na rotina Function largCmp(p), para parar a execução e a variavel CMP está ficando sempre NIL.
Porisso naõ funciona.
Abração
Escolher campo(field)
Enviado: 19 Jun 2012 21:26
por ANDRIL
braz escreveu:CMP está ficando sempre NIL
OK, acho que seja devido estar em outra area, alem do mais errei na função coloquei fieldput() quando na verdade era fieldget() "PRESSA!". Modifiquei a função novamente, vamos ver se vai...
Código: Selecionar todos
Function largCmp(p)
sele(area)
cmp=fieldget(p)
if valtype(fieldget(p) )=="C"
tamCmp=len(&cmp)
elseif valtype(fieldget(p))=="N"
tamCmp=len(str(&cmp))
else //logico
tamCmp=1
endif
sele 223
return tamCmp
ou tente assim
Código: Selecionar todos
Function largCmp()
parameters cmp
sele(area)
if valtype(&cmp )=="C"
tamCmp=len(&cmp)
elseif valtype(&cmp)=="N"
tamCmp=len(str(&cmp))
else //logico
tamCmp=1
endif
sele 223
return tamCmp
Continuamos tentando...
Escolher campo(field)
Enviado: 20 Jun 2012 09:19
por braz
Escolher campo(field)
Enviado: 20 Jun 2012 09:40
por alxsts
Olá!
Se você le o campo
por que não testar a variável, ao invés de chamar novamente (e várias vezes) FieldGet()? Poderia testar
E se o campo for date ou memo?
Escolher campo(field)
Enviado: 20 Jun 2012 10:16
por braz
Quanto a primeira indagação nao sei responder.
Mas a segunda, poderia colocar mais testes IF VALTYPE=='D' e 'M'. Bem lembrado :-Y
Escolher campo(field)
Enviado: 20 Jun 2012 21:58
por ANDRIL
braz escreveu:Aewww, agora sim
Upa que bom. Só ia tentar mais umas 1000 vezes.
alxsts escreveu:por que não testar a variável, ao invés de chamar novamente (e várias vezes) FieldGet()?
Concordo. A pressa é mesmo inimiga da perfeição! Ainda mais usando Ctrl+C e Ctrl+V.
alxsts escreveu:E se o campo for date ou memo?
Como não uso campo date e memo em meus sistemas, acabei por esquecer. Cabe ao colega ver essa necessidade.
Ate+
Escolher campo(field)
Enviado: 20 Jun 2012 22:57
por alxsts
Olá!
ANDRIL escreveu:Como não uso campo date e memo em meus sistemas, acabei por esquecer.
Nossa! Em se tratando de xBase, isso é inédito para mim. Mas seria só testar e converter para caracter. Por exemplo (dependendo de SET DATE)
No caso de campo memo, poderia imprimir um
preview do campo, por exemplo, os 15 primeiros caracteres:
Isso tornaria a rotina genérica.