Ayuda : Retorno de GET VALID + FUNCTION(@variable)

Ayuda : Retorno de GET VALID + FUNCTION(@variable)

Postby russimicro » Mon May 11, 2015 11:04 pm

Code: Select all  Expand view

Señores... Buenas noches

uso : fwh 15.01 + xharbour.com (12.3)

Requiero retornar un valor a través de una función, usando un parámetro por referencia y obtengo valores diferentes si lo hago desde un GET:VALID  o silo hago invocando la función directamente :

FUNCTION capturaValorTexto(nCanTar,nUniMed,nPreAdi)

LOCAL oDlgBr1,  oCanTem, oBotAce
LOCAL oWndAct := GetWndDefault()
LOCAL lEstFun := .T.

nUniMed := 32  

set decimals to 6

PUBLIC cCanTem := SPACE(16)


DEFINE DIALOG oDlgBr1 TITLE HB_OEMTOANSI("Registro de cantidades") ;
           FROM 125, 100 TO 280,550 ;
           OF oWndAct PIXEL

   @ 25,05 SAY "Cantidad "  ;
           PIXEL SIZE 60,20 ;
           COLOR CLR_BLUE FONT M->oFonAc1 OF oDlgBr1

   @ 15,70 GET oCanTem VAR cCanTem OF oDlgBr1 ;   // cCanTem := "1*1"
           PICTURE "XXXXXXXXXXXXXXXX" ;
           PIXEL SIZE 120,25 ;
           UPDATE ;
           COLOR CLR_WHITE,CLR_GREEN FONT M->oFonAc8 ;
           VALID ( convierteSartaValores(cCanTem,@nCanTar,nUniMed,oDlgBr1,oBotAce,@lEstFun,@nPreAdi)   )  
//esta es la función                                    1*1, 0 , 32          

   @ 50, 100 BUTTONBMP oBotAce PROMPT "Aceptar";
             ACTION ( oDlgBr1:END() )  ;
             SIZE 40,16 PIXEL OF oDlgBr1


ACTIVATE DIALOG oDlgBr1  CENTER ON INIT ( oCanTem:SetFocus() )

// VALORES RETORNADOS
ALERT(nCanTar)  // 0.031000
ALERT(M->xCanSug) // 0.031250

// INVOCANDO LA FUNCION DIRECTAMENTE

/* cCanTem := "1*1"
   nUniMed := 32
  nCanTar := 0

convierteSartaValores(cCanTem,@nCanTar,nUniMed,oDlgBr1,oBotAce,@lEstFun,@nPreAdi)

// VALORES RETORNADOS
ALERT(nCanTar)  // 0.031250
ALERT(M->xCanSug) // 0.031250  VARIABLE PUBLICA

*/



RETURN  lEstFun

//***************************************************************

FUNCTION convierteSartaValores(cCanTem,nCanTar,nUniMed,oDlgBr1,oBotAce,lEstFun,nPreAdi)


LOCAL nCanTmo := 0  , nvlrCa1 := nvlrCa2 := nvlrCa3 := 0
LOCAL nPosIni := 0
LOCAL nPosFin := 0 , cCanTe2 := ""
LOCAL nCanFac := 0

set decimals to 6

nPosIni := ATNUM('*',cCanTem,1)
cCanTe2 := SUBS(cCanTem,nPosIni+1)
nPosFin := ATNUM('*',cCanTe2,1)
IF nPosFin > 0
   nPosFin += nPosIni
ENDIF

// PARA EL EJP. CONVIERTE EL TEXTO "1*1" => 1
IF nPosIni > 0
   IF nPosFin > 0
      nvlrCa1 := VAL(SUBS(cCanTem,1,nPosIni-1))
      nvlrCa2 := VAL(SUBS(cCanTem,nPosIni+1,nPosFin-1))
      nvlrCa3 := VAL(SUBS(cCanTem,nPosFin+1))
      nCanTmo := ( nvlrCa1 * nvlrCa2 * nvlrCa3 )
      nCanFac :=  nvlrCa1 * ( nvlrCa2 + nvlrCa3 )
   ELSE
      nvlrCa1 := VAL(SUBS(cCanTem,1,nPosIni-1))
      nvlrCa2 := VAL(SUBS(cCanTem,nPosIni+1))
      nCanTmo := ( nvlrCa1 * nvlrCa2 )
      nCanFac := nvlrCa2
   ENDIF

   M->vMenReg[3] := cCanTem
ELSE
   nCanFac := 0
   nCanTmo := VAL(cCanTem)
   nCanTar := nCanTmo
   M->xCanSug := nCanTar
   lEstFun := .F.
   RETURN .T.
ENDIF

nPreAdi := nCanFac

nCanTar := ( nCanTmo / nUniMed )  // ESTA ES LA OPERACION FINAL => ( 1 / 32 )

M->xCanSug := nCanTar     // VARIABLE PUBLICA

lEstFun := .T.

RETURN

//***************************************************************

JOHNSON RUSSI
 
russimicro
 
Posts: 229
Joined: Sun Jan 31, 2010 3:30 pm
Location: Bucaramanga - Colombia

Re: Ayuda : Retorno de GET VALID + FUNCTION(@variable)

Postby Antonio Linares » Tue May 12, 2015 10:38 am

No parece que estés modificando cCanTem desde la función
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41366
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Ayuda : Retorno de GET VALID + FUNCTION(@variable)

Postby russimicro » Tue May 12, 2015 11:25 am

Antonio..

La variable es "nCanTar" , convierteSartaValores(cCanTem,@nCanTar,nUniMed,oDlgBr1,oBotAce,@lEstFun,@nPreAdi),
el hecho es que si la modifica pero la retorna redondeada a tres decimales
russimicro
 
Posts: 229
Joined: Sun Jan 31, 2010 3:30 pm
Location: Bucaramanga - Colombia

Re: Ayuda : Retorno de GET VALID + FUNCTION(@variable)

Postby jrestojeda » Fri May 15, 2015 1:21 pm

Hola,
Prueba lo siguiente:

Code: Select all  Expand view

SET DECIMALS TO nDecimal // NUMERO DE DECIMALES QUE NECESITES
nCanTar := ( nCanTmo / nUniMed )
SET DECIMALS TO 3 // VUELVES AL VALOR
 


Espero te sirva la idea.
Saludos,
Ojeda Esteban Eduardo.
Buenos Aires - Argentina.
FWH - PellesC - DBF/CDX - ADS - Gloriosos .Bat - MySql - C# .net - FastReport
Skype: jreduojeda
User avatar
jrestojeda
 
Posts: 583
Joined: Wed Jul 04, 2007 3:51 pm
Location: Buenos Aires - Argentina

Re: Ayuda : Retorno de GET VALID + FUNCTION(@variable)

Postby russimicro » Sat May 16, 2015 12:48 am

ya lo tengo definido...
set decimals to 6

el problema se da si llamo la función desde el action de un get... porque de forma directa funciona bien

Gracias por su respuesta....

Si alguien tiene el tiempo podemos programar una conexión remota tipo team viewer y les muestro directamente el funcionamiento en el retorno de la función
russimicro
 
Posts: 229
Joined: Sun Jan 31, 2010 3:30 pm
Location: Bucaramanga - Colombia

Re: Ayuda : Retorno de GET VALID + FUNCTION(@variable)

Postby Antonio Linares » Sat May 16, 2015 5:33 pm

En tu código:

Code: Select all  Expand view

   @ 15,70 GET oCanTem VAR cCanTem OF oDlgBr1 ;   // cCanTem := "1*1"
           PICTURE "XXXXXXXXXXXXXXXX" ;
           PIXEL SIZE 120,25 ;
           UPDATE ;
           COLOR CLR_WHITE,CLR_GREEN FONT M->oFonAc8 ;
           VALID ( convierteSartaValores(cCanTem,@nCanTar,nUniMed,oDlgBr1,oBotAce,@lEstFun,@nPreAdi)   )  
 


la variable cCanTem es la que se muestra en el GET.

Luego si el valor del GET tiene que cambiar entonces cCanTem debería ser modificado.

Tal vez no estoy entendiendo el problema
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41366
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Ayuda : Retorno de GET VALID + FUNCTION(@variable)

Postby russimicro » Sat May 16, 2015 8:53 pm

Antonio...

Buena tarde ...

La secuencia es esta :
1. Capturo un texto con este formato "1*1" -> un trozo de lamina de un metro --> en la variable "cCanTem"
2. el método convierteSartaValores(cCanTem,@nCanTar,nUniMed,oDlgBr1,oBotAce,@lEstFun,@nPreAdi) , recibe la variable : cCanTem, como una sarta, la convierte en numérica y la regresa como numerica en la varibale @nCanTar ( asi nCanTar := VAL(1)*VAL(1) / 32 (valor final para este ejemplo)
3. El valor de retorno en nCanTar, es el que evaluó ---> ALERT(nCanTar) // 0.031000

/// resumen del código
@ 15,70 GET oCanTem VAR cCanTem OF oDlgBr1 ; // cCanTem := "1*1"
PICTURE "XXXXXXXXXXXXXXXX" ;
PIXEL SIZE 120,25 ;
UPDATE ;
COLOR CLR_WHITE,CLR_GREEN FONT M->oFonAc8 ;
VALID ( convierteSartaValores(cCanTem,@nCanTar,nUniMed,oDlgBr1,oBotAce,@lEstFun,@nPreAdi) )

ACTIVATE DIALOG oDlgBr1 CENTER ON INIT ( oCanTem:SetFocus() )

// VALORES RETORNADOS
ALERT(nCanTar) // 0.031000
convierteSartaValores(cCanTem,@nCanTar,nUniMed,oDlgBr1,oBotAce,@lEstFun,@nPreAdi)
ALERT(nCanTar) // 0.031250

Nota : Antonio como puede notar en el código inicial invoco la función convierteSartaValores(), desde el get y directamente y retorna estos valores : 0.031000 y 0.031250 respectivamente.

Nota: La variable que debe almacenar el valor final es nCanTar , que a su vez llega como parámetro a la función :
FUNCTION capturaValorTexto(nCanTar,nUniMed,nPreAdi), ahora si declaro la variable nCanTar como local en este método el valor retornado por ambas invocaciones es igual (0.031250 ) => división de 1 / 32 , con set decimals to 6


Johnson Russi
russimicro
 
Posts: 229
Joined: Sun Jan 31, 2010 3:30 pm
Location: Bucaramanga - Colombia

Re: Ayuda : Retorno de GET VALID + FUNCTION(@variable)

Postby Antonio Linares » Sun May 17, 2015 7:45 pm

ok entendido, entendí que el valor modificado tenía que llegar al GET

Tienes definido set decimals to 6 antes de llamar a la función capturaValorTexto() ?
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41366
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Ayuda : Retorno de GET VALID + FUNCTION(@variable)

Postby russimicro » Mon May 18, 2015 1:29 am

Antonio

Buena noche

1. Uso : "set decimals to 6" en todo el .prg
2. Llegue a la siguiente conclusión : si la variable nCanTar, usada asi : "VALID ( convierteSartaValores(cCanTem,@nCanTar,nUniMed,oDlgBr1,oBotAce,@lEstFun,@nPreAdi) )", es una variable local la retorna con los 6 decimales y si es publica(dese el inicio de la aplicación ) , la retorna modificada pero con tres decimales.
3. Por Ahora , es la solución que le di... usarla como local y luego asignársela a la variable final(la publica)
4. Si usted considera ver el caso en ejecución estaré atento a su disposición de tiempo para una asistencia remota

Gracias

Saludos

Johnson Russi Tello
russimicro
 
Posts: 229
Joined: Sun Jan 31, 2010 3:30 pm
Location: Bucaramanga - Colombia

Re: Ayuda : Retorno de GET VALID + FUNCTION(@variable)

Postby Antonio Linares » Mon May 18, 2015 7:15 am

Johnson,

Si te funciona bien, eso es lo que cuenta :-)
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41366
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 36 guests