Referencia a Campos

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

joserubenildosilva
Usuário Nível 1
Usuário Nível 1
Mensagens: 30
Registrado em: 15 Abr 2008 11:21
Localização: cuiaba-mt

Referencia a Campos

Mensagem por joserubenildosilva »

Ola!
estou com um problema ao rodar meu programa no xharbour.
aparentemente esta tudo ok, porem percebi que quando faço referencia a um campo da tabela e nao colocar o alias ele da erro com se nao tivesse encotrado.
ex:
SELE CLIENTE
@ 0,0 SAY CODIGO // Retorna erro
mas se eu fizer assm
@ 0,0 say CLIENTE->CODIGO. // Nao da erro

o que fazer. para resolver isso.
Percebi isso em relatorio e gravação. Mas nao eh sempre isso

abraços
MARCELOG
Usuário Nível 4
Usuário Nível 4
Mensagens: 546
Registrado em: 15 Mar 2005 16:54
Localização: Divinópolis/MG

Mensagem por MARCELOG »

Olá,
na primeira situação, o sistema entende que você está fazendo referência a uma variável chamada CODIGO.
Como código (a variável) não foi declarada ou existe, o erro ocorre.
Para resolver o prblema veja o comando FIELD/MENVAR para declaração de campos e variáveis.
Eu, particularmente, nunca usei, pois gosto de fazer referência ao alias (o nome que vem antes do ->) para tornar o código mais legível.

MarceloG
Água mole em pedra dura tanto bate que até espirra!
Avatar do usuário
Luciano Bonfim
Usuário Nível 3
Usuário Nível 3
Mensagens: 414
Registrado em: 23 Ago 2007 09:34
Localização: Rio de Janeiro / São Paulo
Contato:

Mensagem por Luciano Bonfim »

mas nesse caso como existe um capo no DBF cliente chamado código, teia que funcionar. o que pode estar acontecendo é vc ter um funçäo entre a abertura do arquivo e a chamada do campo que está abrindo outro arquivo ... por isso o erro...

em minhas funcoes eu costumo sempre salvar o nome do arquivo que estava aberto na entrada e abri-lo novamente na saida...
Muito Obrigado,

Luciano Bonfim de Azevedo
www.bonfim.com.br
luciano@bonfim.com.br
www.linkedin.com/in/lucianobonfim
Skype : lucianobonfim
MARCELOG
Usuário Nível 4
Usuário Nível 4
Mensagens: 546
Registrado em: 15 Mar 2005 16:54
Localização: Divinópolis/MG

Mensagem por MARCELOG »

Olá,
é que os conflitos e omissões são resolvidos em favor de variáveis.
Veja isso (tá em 'ingleis', mais e daí, dá prá entender).

FIELD
Declare database field names
------------------------------------------------------------------------------
Syntax

FIELD <idField list> [IN <idAlias>]

Arguments

<idField list> is a list of names to declare as fields to the
compiler.

IN <idAlias> specifies an alias to assume when there are unaliased
references to the names specified in the <idField list>. Unaliased
references to variables in <idField list> are treated as if they are
preceded by the special field alias (FIELD->).

Description

The FIELD statement declares the names of database fields to the
compiler, and optionally supplies an implicit alias for each name. This
allows the compiler to resolve references to variables with no explicit
alias--by implicitly assuming the specified <idAlias>. Only explicit,
unaliased references to the specified fields in the <idField list> are
affected. The FIELD statement, like all declarations, has no effect on
references made within macro expressions or variables.

The FIELD statement neither opens a database file nor verifies the
existence of the specified fields. It is useful primarily to ensure
correct references to fields whose accessibility is known at runtime.
Attempting to access the fields when the associated database is not in
USE will cause an error.

The scope of the FIELD declaration is the procedure or function in which
it occurs, or the entire program (.prg) file if the declaration precedes
all PROCEDURE or FUNCTION declarations and the /N compiler option is
specified.

FIELD statements, like other declarations, must precede any executable
statements in the procedure or function definition or the program (.prg)
file if the declaration has filewide scope.

FIELD used with the /W compiler option performs compile-time checking
for undeclared variables.

For more information on variable declarations and scoping, refer to the
Variables section in the "Basic Concepts" chapter of the Programming and
Utilities Guide.

Examples

. This user-defined function includes statements to declare
database field names in both the current and Employee work areas:

FUNCTION DisplayRecord
FIELD CustNo, OrderNo, Salesman
FIELD EmpName, EmpCode IN Employee
USE Employee NEW
USE Orders NEW
//
? CustNo // Refers to Orders->CustNo
? EmpName // Refers to Employee->EmpName
//
CLOSE Orders
CLOSE Employee
RETURN NIL

No seu caso, deve ser:

FIELD CODIGO IN CLIENTE

MarceloG
Água mole em pedra dura tanto bate que até espirra!
joserubenildosilva
Usuário Nível 1
Usuário Nível 1
Mensagens: 30
Registrado em: 15 Abr 2008 11:21
Localização: cuiaba-mt

Mensagem por joserubenildosilva »

Se eu tiver que fazer isso marcelo então vou ter que reescrever todo o sistema.

vou fazer mais testes aqui. mas obrigado mesmo assim
Avatar do usuário
Luciano Bonfim
Usuário Nível 3
Usuário Nível 3
Mensagens: 414
Registrado em: 23 Ago 2007 09:34
Localização: Rio de Janeiro / São Paulo
Contato:

Mensagem por Luciano Bonfim »

caros,

Uma coisa que sei desde que comecei a mexer com clipper, é o sequinte: se eu tenho um DBF com um campo de nome "CODIGO" por exemplo e tenho uma variável com o mesmo nome "CODIGO" se eu mandar imprimir CODIGO o clipper dá preferência ao DBF, a nao ser que vc coloque "M->CODIGO"

exemplo:

Código: Selecionar todos


codigo="000121"
use clientes alias clientes
go 1
replace codigo with "000001"

@ 1,1 say clientes->codigo // vai imprimir "000001"
@ 1,1 say m->codigo // vai imprimir "000121"
@ 1,1 say codigo // vai imprimir "000001" //prevalece o DBF

@ 1,1 say valor // vai da erro pq nao existe o campo valor e nem uma variável chamada valor

portanto Josue dá uma olhada no seu código que vc deve ter uma funçäo abrindo outro DBF antes de vc imprimir, ou melhor,posta o código aqui
Muito Obrigado,

Luciano Bonfim de Azevedo
www.bonfim.com.br
luciano@bonfim.com.br
www.linkedin.com/in/lucianobonfim
Skype : lucianobonfim
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Mensagem por sygecom »

Olá José,
Post um exemplo de codigo inteiro simulando o problema, de preferencia que alguem venha aqui no forum copie e compile sem erro, e vamos ver onde esta o problema, eu uso do mesmo modo que o Marcelo citou, ou uso o ALIAS direto na abertura do DBF.
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
gvc
Colaborador
Colaborador
Mensagens: 1270
Registrado em: 23 Ago 2005 10:57

Re: Referencia a Campos

Mensagem por gvc »

joserubenildosilva escreveu: Percebi isso em relatorio e gravação. Mas nao eh sempre isso
Poste aqui o código o relatório ou envie para gvcortez@uol.com.br
Vc deve estar passando para outra área (alias) quando imprime o relatório.

Vc pode testar usando alias(). Essa função retorna o apelido da área atual, se vc não, colocar um número.
Se vc colocar um número, ela retorna o alias da área solicitada.

Então use:

Código: Selecionar todos

alert(alias())
@ 0,0 SAY CODIGO // Retorna erro 
e veja em qual área vc esta quando provoca o erro.

Boa sorte. Espero ter ajudado.
"TRS-80/Sincler/Apple/PC - Clipper Winter 85, tlink 1.0 [pc 10 MHz - 640K] {NEZ 8000 2Kb RAM}"
{POG - Programação Orientada a Gambiarra}
joserubenildosilva
Usuário Nível 1
Usuário Nível 1
Mensagens: 30
Registrado em: 15 Abr 2008 11:21
Localização: cuiaba-mt

Mensagem por joserubenildosilva »

Olha eu achei que seria moleza. Compilei meu programa com o xharbour nao deu erro, mas agora estes problemas ...

Mas vamos a luta. Ainda estou com problema na referencia aos campos
quando faço CLIENTE->CODIGO sem erros
mas CODIGO ESTA com erros.
se alguma tiver uma luz
Avatar do usuário
Luciano Bonfim
Usuário Nível 3
Usuário Nível 3
Mensagens: 414
Registrado em: 23 Ago 2007 09:34
Localização: Rio de Janeiro / São Paulo
Contato:

Mensagem por Luciano Bonfim »

Amigo,

só poderemos te ajudar se vc postar o código, caso contrário só a mäe Dina!!!!
Muito Obrigado,

Luciano Bonfim de Azevedo
www.bonfim.com.br
luciano@bonfim.com.br
www.linkedin.com/in/lucianobonfim
Skype : lucianobonfim
Avatar do usuário
ERASMO ANDRIOLI
Usuário Nível 2
Usuário Nível 2
Mensagens: 51
Registrado em: 15 Jul 2004 16:15
Localização: Sorriso-MT
Contato:

Mensagem por ERASMO ANDRIOLI »

Colega...

Eu uso assim:

Código: Selecionar todos

SELE CLIENTE
T_COD = CODIGO
@ 0,0 SAY T_COD PICT "999"
Saudações
joserubenildosilva
Usuário Nível 1
Usuário Nível 1
Mensagens: 30
Registrado em: 15 Abr 2008 11:21
Localização: cuiaba-mt

Mensagem por joserubenildosilva »

Segue abaixo o codigo do relatorio em questão

Código: Selecionar todos

SELE RELCOB
DBGOTOP()

Rel_DefCab(";Sacado;Documento;T¡tulo,Valor;VenceuEM,Dias,Fator,Val.Pres"+;
           ";Cobranc;Ocorrenc;Aline",;
           ".45.17.10.14.08.04.06.14.07.08.05",1)

IF pOpc = "COBR"
	 mClie := STRZERO(mCodClie,6)
	 mAux  := mClie+"-"+RTRIM(CLIENTE->nome)+" "+RTRIM(CLIENTE->telefone)+;
	          " "+RTRIM(CLIENTE->contato)  
   Rel_DefTit("TITULOS COBRANCA CLIENTE",mAux,,,1 )
	 mCamp[1] := "Cobran‡a" 
ELSE
   Rel_DefTit("RELATORIO DE PENDENCIAS",,,,1)
   mClie := cliente
	 CLIENTE->( DBSEEK(mClie) )
   mCamp[1] := "--=="+cliente+"==-- "+RTRIM(CLIENTE->nome)+" "+RTRIM(CLIENTE->telefone)+" "+;
	             RTRIM(CLIENTE->contato)
ENDIF
mAux     := LTRIM( STR(VAL(mClie),6) )
mCamp[1] += DadosCob3("C",PADR(mAux,14))     //--> Saf250.Prg
Rel_Lin(mCamp)

DO WHILE !EOF() .AND. ! Scancel

    //IF mSac != sacado
	    //mCamp[01] := mSac := sacado
	 //mCamp[01] := sacado
	 //ELSE
	 //		mCamp[01] := [ "]
	 //ENDIF
	 mCamp[02] := documento
	 mCamp[03] := titulo
O erro ocorre nas duas ultimas linnhas dizendo que tais campos nao existem.
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Mensagem por Toledo »

Pela lógica este erro não devia acontecer, mas entre o comando onde você seleciona o arquivo RELCOB até as linhas onde está ocorrendo os erros, existe várias funções (Rel_DefCab(), Rel_DefTit(), DadosCob3() e Rel_Lin()), então se uma destas funções selecionar um outro arquivo, ai sim pode ocorrer o erro.

Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Mensagem por sygecom »

Olá José,
Post um exemplo de codigo inteiro simulando o problema, de preferencia que alguem venha aqui no forum copie e compile sem erro, e vamos ver onde esta o problema.
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
gvc
Colaborador
Colaborador
Mensagens: 1270
Registrado em: 23 Ago 2005 10:57

Mensagem por gvc »

- Vc não postou o código todo. Esta faltando o final do WHILE.

- Tente o código abaixo e aproveite para ver se o processo executa algumas vezes antes de "dar pau". Se entrar na área errada, veja a postagem do mestre Toledo. Se entrar na área correta, processa um/algumas vezes correto e depois "dá pau", veja as instruções dentro do WHILE.

Código: Selecionar todos

while !eof() .and. !scancel
    alert(alias())  // <= Ver qual a área ativa
    mCamp[02] := documento
    mCamp[03] := titulo
Boa sorte. Espero ter ajudado.
"TRS-80/Sincler/Apple/PC - Clipper Winter 85, tlink 1.0 [pc 10 MHz - 640K] {NEZ 8000 2Kb RAM}"
{POG - Programação Orientada a Gambiarra}
Responder