Página 1 de 1

por que nao consigo pegar o valor desta variavel????

Enviado: 23 Fev 2006 08:57
por clebermano
Pessoal ja tenho algumas funcoes parecidas com esta, que sempre me dao o retorno que eu preciso.mas essa aki nao ta dando certo. olha so.

//esta linha chama o a funcao.
@ 08,02 say "Grupo.:" getwin Mgrupo pict "999" valid (if(Mgrupo==0,d_bedit("grupo","prd_2.ntx",@mgrupo,"codigo","descricao"),),.t.)


// afuncao eh esta aki.

// a retorno que eu preciso eh o Pret. voltar para a funcao chamadora acima.

*****************************************************************************
FUNC D_BEDIT(pDBF,pINDEX,pRET,pCAMPO1,pCAMPO2,pCAMPO3,pCAMPO4,pCAMPO5,pMENSAGEM,pLIN,pCOL)
*****************************************************************************

LOCAL TELADBEDIT
LOCAL mALIAS

mALIAS:=ALIAS()
SELE ( pDBF )
SAVE SCREEN TO TELADBEDIT
if !empty(Pcampo5)
aColunas:={Pcampo1,Pcampo2,Pcampo3,Pcampo4,Pcampo5}
elseif !empty(Pcampo4)
aColunas:={Pcampo1,Pcampo2,Pcampo3,Pcampo4}
elseif !empty(Pcampo3)
aColunas:={Pcampo1,Pcampo2,Pcampo3}
else
aColunas:={Pcampo1,Pcampo2}
endif


Drawinx(02,00,29,79,'PESQUISA ')//+ IF(!EMPTY(pMENSAGEM,ALLTRIM(pMENSAGEM)," ")))

*CAMPOS := { 'CODIGO','DESCRICAO'}
CABECA := { 'Codigo','DESCRICAO'}

rodamens("<INS>-Inclui þ <DEL>-Apaga þ <F2>-Calendario þ <F3>-Calculadora")

WHILE .T.


ORD := 1
DBEDIT( 06,01,20,78,ACOLUNAS,'FUNDBEDIT',,CABECA,'ÍÑÍ',' ³ ' )
SELE ( mALIAS )
@ 10,10 SAY pRET
@ 11,10 SAY VALTYPE(pRET)
INKEY(0)
pRET:=pRET
* RETURN(0)
RESTORE SCREEN FROM TELADBEDIT
RETURN
END

CLOSEALL()

RETURN

*****************************************************************************
FUNCTION FUNDBEDIT( MODO, COL)
*****************************************************************************

LOCAL TECLA
TECLA := LASTKEY()

DO CASE
CASE MODO = 4
IF TECLA = 27
RETURN 0
ENDIF


IF TECLA = -3
SET ORDER TO 2
SET SOFTSEEK ON
key:=space(30)
@ 19,15 say ' Digite a Chave.:' get key
read
REG := RECNO()
IF ! DBSEEK( RTRIM(KEY) )
ERRORMENS('Informacao Nao Encontrada! Verifique...')
DBGOTO( REG )
ENDIF
SET SOFTSEEK OFF
RETURN 1
ENDIF

IF TECLA = 22
APPEND BLANK
KEYB( REPL(CHR(19),5) )
RETURN 2
ENDIF

IF TECLA = 7
if Winquest('Deseja apagar este registro? ',ICON_QUES,{'Sim','Nao'}) == 1
DO WHILE !RLOCK()
ENDDO
DELETE
UNLOCK
endif
RETURN 2

ENDIF

IF TECLA = 13
pFIELD:=FIELD(1)
pRET:=&pFIELD
@ 10,10 SAY pRET //eu preciso que este valor volte para o prg produtos.
INKEY(0)
RETURN (0)
ENDIF

IF TECLA >= 26 .AND. TECLA <= 126
IF LASTREC() = 0
APPEND BLANK
ENDIF
KEYB( CHR(TECLA) )
DO WHILE !RLOCK()
ENDDO
DO CASE
CASE COL = 1
@ ROW(),COL() GET CODIGO PICT '@!'
CASE COL = 2
@ ROW(),COL() GET DESCRICAO PICT '@!'
ENDCASE
READY()
IF LASTKEY() = 27
DBUNLOCK()
RETURN 1
ENDIF
DBUNLOCK()
KEYB(CHR(4))
RETURN 2
ENDIF
ENDCASE

Enviado: 23 Fev 2006 11:01
por spereira
clebermano,

tente colocar a variável com o conteúdo que se quer no return entre parênteses.

Ex. Return(variável)

Enviado: 23 Fev 2006 15:11
por rochinha
Amiguinho

Coloque a váriavel de retorno no final de sua função D_BEDIT() ou passe-a como parametro @pret desta função.

@braços :?)

Enviado: 23 Fev 2006 17:53
por clebermano
amigo spereira, se eu colocar return (pcod) acontece da funcao dbedit entender como uma funcao do modo do dbedit, como por exemplo se o codigo for 1, nao sai do dbedit.

Enviado: 23 Fev 2006 18:20
por clebermano
amigo rochinha, quando eu olho o say que esta dentro da funcao do dbedit, la no final, a variavel esta carrada com o valor que eu preciso, quando eu retorno, e verifico la em cima ela ja esta com valor 0, se eu passar @pret, da o maior pau na compilacao...
Ja passaram por isso??

Enviado: 26 Fev 2006 03:58
por rochinha
Amiguinho

Acrescente o seguinte:

FUNC D_BEDIT(pDBF,pINDEX,pRET,pCAMPO1,pCAMPO2,pCAMPO3,pCAMPO4,pCAMPO5,pMENSAGEM,pLIN,pCOL)
*****************************************************************************

LOCAL TELADBEDIT
LOCAL mALIAS
PUBLIC pRET

mALIAS:=ALIAS()
...

Analise também o funcionamento da seguinte função:

Código: Selecionar todos

FUNCTION pesq( m_relacao, m_area, m_ordem, m_campo, m_saida, m_vazio )
   //
   // -> funcao para leitura de dados em outro arquivo
   u_areatua := alltrim( str( select(), 3 ) )
   u_ordem := IndexOrd()
   sele &m_area
   if m_ordem = nil .or. m_ordem = 0
      re_torno := &m_campo
      sele &u_areatua
   else
      set order to m_ordem
      seek m_relacao
      re_torno := &m_campo
      sele &u_areatua
      set order to u_ordem
      if pcount() > 4
         &m_saida := re_torno
         if pcount() = 6
            return ""
         endif
      endif
   endif
   return iif (re_torno = nil, "", re_torno)
Uso:

Código: Selecionar todos

nCodigoDoCliente := 5
cNomeDoCliente := pesq( str(nCodigoDoCliente,5,0), "clientes", 2, "nome" ) 
Tenho um indice criado com a chave str(idcliente,5,0).
Uma tabela chamada clientes
O indice com a chave str(idcliente,5,0) esta na posicao 2
O campo nome contem o conteudo que preciso

Quando eu passo os parametros a função fica assim:

Código: Selecionar todos

      ...
      set order to 2
      seek str(nCodigoDoCliente,5,0)
      re_torno := nome
      sele &u_areatua // Seleciona area de trabalho anterior
      set order to u_ordem // Seleciona ordem anterior
      ...
      return iif (re_torno = nil, "", re_torno)
Veja que re_torno devolve o valor avaliado em &m_campo.

Pode-se usa-la para pegar qualquer valor de qualquer campo em qualquer tabela aberta.

Exemplo:

Código: Selecionar todos

use clientes
use pedidos
go top
lin = 0
do while .not. eof()
     @ lin, 0 say pesq( str(pedidos->idcliente,5,0), "clientes", 2, "nome" ) 
     @ lin,50 say pesq( str(pedidos->idcliente,5,0), "clientes", 2, "telefone" ) 
      @ lin,65 say pedidos->valor
     lin = lin + 1
     skip
enddo

Passe a usa-la.

@braços :?)