Escolher campo(field)
Moderador: Moderadores
Escolher campo(field)
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
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)
Boa tarde pode ser assim:
cCAMPO = "RAZAO" && campo escolhido.
e imprima
@ 10, 10 say FIELD->&cCAMPO
HASA
cCAMPO = "RAZAO" && campo escolhido.
e imprima
@ 10, 10 say FIELD->&cCAMPO
HASA
Escolher campo(field)
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
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
O bom do computador é que ele resolve os problemas, sem nunca levantar nenhum.
Hoje atuo mais com Clipper 52E, e um pouquinho com XHarbour.
Hoje atuo mais com Clipper 52E, e um pouquinho com XHarbour.
Escolher campo(field)
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.
Abraços.
- Anexos
-
teste.prg- (3.28 KiB) Baixado 175 vezes
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
Escolher campo(field)
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:
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)
Substitua a linha por esta aqui e coloque esta funcao no seu prg.
c= c + largCmp(p) + 1
Caso nao de certo tente ver os parametros mais creio que funfa normal.
Abraços
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 tamCmpAbraços
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
Escolher campo(field)
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. :{
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)
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:
Ate+
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 Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
Escolher campo(field)
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
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)
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...braz escreveu:CMP está ficando sempre NIL
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 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 Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
Escolher campo(field)
Aewww, agora sim
Eu não coloquei como função, eu coloquei direto na rotina e retirei os '&' , usei o primeiro codigo.
Valeu Andril, muito obrigado, se alguem quizer a rotina completa é so pedir.
Abraços
-
alxsts
- Colaborador

- Mensagens: 3092
- Registrado em: 12 Ago 2008 15:50
- Localização: São Paulo-SP-Brasil
Escolher campo(field)
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?
Se você le o campo
Código: Selecionar todos
cmp=fieldget(p)Código: Selecionar todos
if valtype(cmp )=="C"[]´s
Alexandre Santos (AlxSts)
Alexandre Santos (AlxSts)
Escolher campo(field)
Quanto a primeira indagação nao sei responder.
Mas a segunda, poderia colocar mais testes IF VALTYPE=='D' e 'M'. Bem lembrado :-Y
Mas a segunda, poderia colocar mais testes IF VALTYPE=='D' e 'M'. Bem lembrado :-Y
Escolher campo(field)
Upa que bom. Só ia tentar mais umas 1000 vezes.braz escreveu:Aewww, agora sim
Concordo. A pressa é mesmo inimiga da perfeição! Ainda mais usando Ctrl+C e Ctrl+V.alxsts escreveu:por que não testar a variável, ao invés de chamar novamente (e várias vezes) FieldGet()?
Como não uso campo date e memo em meus sistemas, acabei por esquecer. Cabe ao colega ver essa necessidade.alxsts escreveu:E se o campo for date ou memo?
Ate+
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
-
alxsts
- Colaborador

- Mensagens: 3092
- Registrado em: 12 Ago 2008 15:50
- Localização: São Paulo-SP-Brasil
Escolher campo(field)
Olá! No caso de campo memo, poderia imprimir um preview do campo, por exemplo, os 15 primeiros caracteres: Isso tornaria a rotina genérica.
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)ANDRIL escreveu:Como não uso campo date e memo em meus sistemas, acabei por esquecer.
Código: Selecionar todos
Transform( cmp, "@E" )Código: Selecionar todos
Left( Memoread( cmp ), 15 ) + " ..."[]´s
Alexandre Santos (AlxSts)
Alexandre Santos (AlxSts)


