Ayuda con Radio

Ayuda con Radio

Postby JoseLuis » Wed Oct 28, 2009 1:16 pm

Hola amigos

Tengo un problemilla que me está haciendo perder mucho tiempo:
Tengo el siguiente radio que debe de llamar a la función ponotra() cuando haya un cambio del id 1 al id 2
Code: Select all  Expand view  RUN

 REDEFINE RADIO oRadio3  VAR seltar   ID 37,38 OF oDlg When cQuehago$"AM" .and. !Empty((aAlias[21])->Tipo1);
                 ON CHANGE(ponotra(seltar,aAlias),oDlg:Update)

Static function ponotra(seltar,aAlias)
local titulo
 if seltar=1
    Publicas:ccodart:=(aAlias[21])->Tipo
 else
    Publicas:ccodart:=(aAlias[21])->Tipo1
 endif
    Publicas:cArt:=tipoa(Publicas:cCodart,aAlias)
    Publicas:xntipo:=tipob(Publicas:cCodart,aAlias)
    titulo:=strtran(Publicas:cArt,'Cobro por ')
    pontitulo(titulo)
    Publicas:cPrecio_C:=valora(Publicas:cNeto,aAlias)
      If Publicas:cNeto =0
         msgstop('Error','Cantidad Cero')
      endif
    Publicas:cTot:=ponminimo(Publicas:cNeto,Publicas:cPrecio_C,aAlias)
    pontot(Publicas:cTot)
Return nil
 


Bien, pues no, ya que me ejecuta la función ponotra directamente al entrar en el diálogo.

Hay algún error en ésto?

Saludos

Jose Luis
--------------------------
Saludos

Jose Luis
JoseLuis
 
Posts: 428
Joined: Thu Oct 19, 2006 12:28 pm
Location: Toledo

Re: Ayuda con Radio

Postby JoseLuis » Wed Oct 28, 2009 1:40 pm

He probado también a:
Code: Select all  Expand view  RUN

  oRadio3:bchange :={||if(seltar=1,Publicas:ccodart:=(aAlias[21])->Tipo,Publicas:ccodart:=(aAlias[21])->Tipo1),ponotra(aAlias),oDlg:Update()}
 


y lo mismo, es decir que me evalúa el oDlg:update, aunque no haya cambio en el radio.

Saludos

Jose Luis
--------------------------
Saludos

Jose Luis
JoseLuis
 
Posts: 428
Joined: Thu Oct 19, 2006 12:28 pm
Location: Toledo

Re: Ayuda con Radio

Postby karinha » Wed Oct 28, 2009 3:12 pm

Code: Select all  Expand view  RUN

STATIC oRadio3
STATIC seltar := 1


FUNCTION...


 REDEFINE RADIO oRadio3  VAR seltar   ID 37,38 OF oDlg When cQuehago$"AM" .and. !Empty((aAlias[21])->Tipo1);
                 ON CHANGE(ponotra(seltar,aAlias),oDlg:Update, oDlG:Refresh())



Static function ponotra(seltar,aAlias)

   local titulo

   if seltar==2
      Publicas:ccodart:=(aAlias[21])->Tipo1
   elseif seltar==1
      Publicas:ccodart:=(aAlias[21])->Tipo
   endif

   Publicas:cArt:=tipoa(Publicas:cCodart,aAlias)
   Publicas:xntipo:=tipob(Publicas:cCodart,aAlias)
   titulo:=strtran(Publicas:cArt,'Cobro por ')
   pontitulo(titulo)
   Publicas:cPrecio_C:=valora(Publicas:cNeto,aAlias)

   If Publicas:cNeto =0
      msgstop('Error','Cantidad Cero')
   endif

   Publicas:cTot:=ponminimo(Publicas:cNeto,Publicas:cPrecio_C,aAlias)
   pontot(Publicas:cTot)

Return nil
 


Saludos
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7874
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: Ayuda con Radio

Postby joseluisysturiz » Wed Oct 28, 2009 4:42 pm

El oDlg:update es para actualizar valores visuales en el dialogo, intentalo asi... me paso recientemente un problema rompe coco y todo era la posicion del UPDATE, con colocarlo despues de oDlg se resolvio, espero te sirva mi opinion... :shock:

REDEFINE RADIO oRadio3 VAR seltar ID 37, 38 OF oDlg update;
When cQuehago$"AM" .and. !Empty((aAlias[21])->Tipo1);
ON CHANGE( ponotra(seltar,aAlias) )
Dios no está muerto...

Gracias a mi Dios ante todo!
User avatar
joseluisysturiz
 
Posts: 2064
Joined: Fri Jan 06, 2006 9:28 pm
Location: Guatire - Caracas - Venezuela

Re: Ayuda con Radio

Postby JoseLuis » Wed Oct 28, 2009 5:47 pm

Hola y gracias por responder

Precisamente lo que quiero es lo contrario, osea que no me evaue el odlg:update hasta que realmente haya un cambia en el radio y no hay manera. En el momento en que pongo oDlg:Update(), me ejecuta la función ponotra(), y yo sólo quiero que me lo haga cuando cambie el radio de una opción a otra.
--------------------------
Saludos

Jose Luis
JoseLuis
 
Posts: 428
Joined: Thu Oct 19, 2006 12:28 pm
Location: Toledo

Re: Ayuda con Radio

Postby Manuel Aranda » Wed Oct 28, 2009 8:58 pm

Hola Jose Luís:

Tal vez el problema esté en el resto del código del diálogo, algún UPDATE o algo así, y no en control RADIO. Yo he tratado de reproducir el problema con el trozo de código que has puesto y no se produce. La función de ejecuta al pinchar en una de las opciones del RADIO, eso sí, se ejecuta 2 veces y desconozco la razón, pero el problema que describes no se da.
Por si te sirve de algo el tratar de buscar por otro lado.
Un saludo,
Manuel

xH 1.2.3, FWH 23.07 32 bits, BC++ 7.4, xVerce CW 1.0, PellesC
User avatar
Manuel Aranda
 
Posts: 604
Joined: Wed Oct 19, 2005 8:20 pm
Location: España

Re: Ayuda con Radio

Postby acuellar » Wed Oct 28, 2009 9:32 pm

Jose Luis Intenta asi

Code: Select all  Expand view  RUN

   Local xRadio:={|| ( ponotra(seltar,aAlias),oDlg:Refresh() ) } //ó oDlg:Update()
   
REDEFINE RADIO oRadio3  VAR seltar   ID 37,38 OF oDlg When cQuehago$"AM" .and. !Empty((aAlias[21])->Tipo1);
                 ON CHANGE EVAL(xRadio)

....
Static function ponotra(seltar,aAlias)
...
Return nil

 


Saludos

Adhemar
Saludos,

Adhemar C.
User avatar
acuellar
 
Posts: 1645
Joined: Tue Oct 28, 2008 6:26 pm
Location: Santa Cruz-Bolivia

Re: Ayuda con Radio

Postby joseluisysturiz » Wed Oct 28, 2009 11:40 pm

a mi tampoco me da ningun error y solo se ejecuta la accion cuando cambio entre las opciones del RADIO, si quieres tener un mejor control, manipula el valor del Radio, el cual es 1 y 2 porque solo tienes 2 opciones, asi puede decir cuando quieres que se ejecute, en el ON CHANGE has una validacion con iif(valida, accion1, accion2 ), asi solo se ejecutara la funcion que quieres cuando se cumpla el valor que quieres o 1 o 2, espero me hayas entendido...

on change (iif(seltar == 1, ponotra(seltar,aAlias), .t. )

se repite 2 veces creo que por los tantos refresh y update...
Dios no está muerto...

Gracias a mi Dios ante todo!
User avatar
joseluisysturiz
 
Posts: 2064
Joined: Fri Jan 06, 2006 9:28 pm
Location: Guatire - Caracas - Venezuela

Re: Ayuda con Radio

Postby JoseLuis » Thu Oct 29, 2009 12:41 pm

Estoy echo un lio
Me parece que debe ser algún Update que tengo en el diálogo, pero no lo localizo.
Con el ejemplo testrad.prg que viene el \samples, he construido lo siguiente:
Code: Select all  Expand view  RUN

// Radio Buttons management sample

#include "FiveWin.ch"

//----------------------------------------------------------------------------//
function Main()

   local oDlg, oRadMenu, oBrush
   local nOption := 1
   local bultos,oalbaran,obultos,osay,albaran
   local ponotra :={|| if(noption==1,rtotal->bulto:="999",rtotal->bulto:="555"),oDlg:Update()}
   SET _3DLOOK ON
   if file ("Rtotal.DBF")
      ferase ("Rtotal.DBF")
   endif
         DbCreate("Rtotal", ;
        { { "Expedicion","C", 12, 0 },;
          { "Bulto"     ,"C",  3, 0 },;     
          { "Precio"    ,"N",  9, 2 } } )
   dbusearea(.f.,,"rtotal",,.f.)
   Rtotal->(Dbappend())
   Rtotal->expedicion:="000000000001"
   Rtotal->Bulto:="002"
   albaran:=Rtotal->expedicion
   bultos:=Rtotal->bulto

   DEFINE DIALOG oDlg RESOURCE "Radios"
   REDEFINE SAY osay ID 10  OF oDlg
   REDEFINE SAY osay ID 11  OF oDlg
   REDEFINE RADIO oRadMenu VAR nOption ID 110, 120 OF oDlg;
      ON CHANGE eval(ponotra)
   REDEFINE GET oalbaran VAR Albaran ID 200 OF oDlg Update;
        Valid (Albaran:= Padl(alltrim(Albaran),12,"0"),oDlg:Update())
   REDEFINE GET obultos VAR bultos ID 201 OF oDlg Update;
                Valid (bultos:= Padl(alltrim(bultos),3,"0"),oDlg:Update())
   ACTIVATE DIALOG oDlg CENTERED

return nil


//----------------------------------------------------------------------------//
 


y con este .rc
Code: Select all  Expand view  RUN

#include <windows.h>
#include <commctrl.h>
#include <richedit.h>

LANGUAGE LANG_ENGLISH,SUBLANG_ENGLISH_US

RADIOS DIALOG DISCARDABLE 46, 44, 127, 112
STYLE WS_POPUP|DS_MODALFRAME|DS_3DLOOK|WS_CAPTION|WS_SYSMENU
CAPTION "Testing Radio Buttons"
FONT 10, "MS Sans Serif"
{
  CONTROL "&Some Radios", 107, "Button", BS_GROUPBOX, 5, 6, 70, 75
  CONTROL "&One", 110, "Button", BS_AUTORADIOBUTTON|WS_GROUP|WS_TABSTOP, 10, 16, 28, 12
  CONTROL "&Two", 120, "Button", BS_AUTORADIOBUTTON, 10, 28, 28, 12
  CONTROL "", 200, "Edit", ES_AUTOHSCROLL|WS_BORDER|WS_TABSTOP, 12, 92, 56, 12
  CONTROL "", 201, "Edit", ES_AUTOHSCROLL|WS_BORDER|WS_TABSTOP, 80, 92, 40, 12
  CONTROL "Expedicion", 10, "Static", WS_GROUP, 16, 84, 40, 8
  CONTROL "Bultos", 11, "Static", WS_GROUP, 88, 84, 24, 8
}

 


Y ahora, en éste ejemplo simple, mi pregunta es ¿Porque no me actualiza el dialogo cuando cambio de radio? si le tengo puesto oDlg:Update en el ON CHANGE
--------------------------
Saludos

Jose Luis
JoseLuis
 
Posts: 428
Joined: Thu Oct 19, 2006 12:28 pm
Location: Toledo

Re: Ayuda con Radio

Postby joseluisysturiz » Thu Oct 29, 2009 3:33 pm

Nose porque metes los UPDATE dentro de los VALID, pero si te digo algo, tenia un problema de actualizacion de datos en los recursos y lo resolvi colocando UPDATE despues de los OF, ejemplo....

of oDlg UPDATE y con eso santo remedio, revisate eso y nose si sera algun problema, pero saca los oDlg UPDATE de ios VALID, imagino se estan repitiendo cuando se cumple la condicion, te recomiendo uses DATABASE si vas usar DBF, te maneja rapidamente tus alias, campos, dbf y es rapida, espero haya ayudado mi informacion... :shock:
Dios no está muerto...

Gracias a mi Dios ante todo!
User avatar
joseluisysturiz
 
Posts: 2064
Joined: Fri Jan 06, 2006 9:28 pm
Location: Guatire - Caracas - Venezuela

Re: Ayuda con Radio

Postby rolando » Thu Oct 29, 2009 4:23 pm

José Luis,

Si entendí lo que quieres, creo que este cambio en tu rutina puede solucionarlo:

Code: Select all  Expand view  RUN
local nOpcion:=3            // valor inicial


REDEFINE RADIO oRadio3  VAR seltar   ID 37,38 OF oDlg When cQuehago$"AM" .and. !Empty((aAlias[21])->Tipo1);
                 ON CHANGE(ponotra(seltar,aAlias,@nOpcion),selaoDlg:Update)




Static function ponotra(seltar,aAlias,nOpcion)
local titulo

 if nOpcion = 3
    nOpcion := 0
    return nil
 endif

 if seltar=1
    Publicas:ccodart:=(aAlias[21])->Tipo
 else
    Publicas:ccodart:=(aAlias[21])->Tipo1
 endif
    Publicas:cArt:=tipoa(Publicas:cCodart,aAlias)
    Publicas:xntipo:=tipob(Publicas:cCodart,aAlias)
    titulo:=strtran(Publicas:cArt,'Cobro por ')
    pontitulo(titulo)
    Publicas:cPrecio_C:=valora(Publicas:cNeto,aAlias)
      If Publicas:cNeto =0
         msgstop('Error','Cantidad Cero')
      endif
    Publicas:cTot:=ponminimo(Publicas:cNeto,Publicas:cPrecio_C,aAlias)
    pontot(Publicas:cTot)
Return nil
 


Espero te sirva.

Saludos.

Rolando :D
User avatar
rolando
 
Posts: 593
Joined: Sat May 12, 2007 11:47 am
Location: San Nicolás - BA - ARGENTINA

Re: Ayuda con Radio

Postby JoseLuis » Thu Oct 29, 2009 4:38 pm

Gracias por responder

Jose Luis:

Pongo el oDlg:Update dentro de los valid, porque lo que pretendo es que cuando me valide un get, inmediatamente me recalcule todo el formulario que hay en el diálogo. No sé otra forma de conseguirlo.
Por ejemplo, si el get tiene el código de un cliente, cuando valido que ése código es correcto, adl poner oDlg:Update en el valid, lo que hago es que me recalcula la tarifa de ése clietne, etc. osea que me recalcula todo lo que he puesto en el get con "OF oDlg Update"

Rolando:

El código que he puesto al final es como un ejemplo de que no comprendo que pasa con oDlg:Update(), si compilas éste ejemplo con su .rc, verás que aunque he puesto la cláusula oDlg:Update(), no actualiza el diálogo con los nuevos valores. Sin embargo, como pongo al comienzo del post, yo lo que pretendo en mi aplicación es que no me evalúe el oDlg:Update(), en un radio, que he puesto tras "ON CHANGE" hasta que realmente haya ese cambio, ya si pongo "OF oDlg Update" en el radio, y luego tras el ON CHANGE pongo oDlg:Update(), me recalcula todo el Diálogo, y ésto es lo que no quiero, quiero que me lo recalcule cuando realmente cambie el radio.
--------------------------
Saludos

Jose Luis
JoseLuis
 
Posts: 428
Joined: Thu Oct 19, 2006 12:28 pm
Location: Toledo

Re: Ayuda con Radio

Postby jrestojeda » Thu Oct 29, 2009 4:57 pm

Hola José Luis...

Probá hacerlo con Refresh()

Si bien no entiendo del todo tu problema, tienes que tener en cuenta que si cabias el contenido de las variables de algunos de los controles del diálogo, esas variables y objetos asociados al control cambiado, en caso de que estén declaradas como Local debes envíarlas por parametro a la función del On Change, y debes envíarlas con @ para que actualize su valor.
Si las variables y los objetos los declarás como Static, te ahoras el @ pero de todas formas, hay que aplicarle un refresh() para que al regresar del On change actualizen.

Espero te sirva el coementario.

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

Re: Ayuda con Radio

Postby JoseLuis » Fri Oct 30, 2009 9:41 am

Buenas

He probado con Refresn() y obtengo el mismo resultado.

El tema está en que todos los gets del diálogo tienen como última acción del valid "oDlg:Update()", a fin de que cuando se valide ése get, que recalcule todos los gets del diálogo.

Esto está funcionando bien hasta ahora, es decir por ejemplo si un cliente tiene la tarifa "001", pero yo manualmente se la he cambiado a la "002", pues cuando entro en el dialogo me pone lo que tengo grabado en la base de datos, es decir la "002", que es la que le he puesto a mano. Es decir, me respeta los datos que he puesto a mano, aunque le correspondiera otra tarifa.

Pero el problema me ha surgido a añadir un Radio de dos opciones. Estas dos opciones me deberían dar a elegir entre ésta tarifa que he puesto a mano y la tarifa que correspondería al cliente.

Lógicamente tengo que tener un oDlg:Update tanto en el radio, como en todos los gets para que cuando cambio de tarifa en el radio, me ejecute todo el formulario que tiene cada get que afecta a la nueva tarifa.

Y ahí viene el problema que aunque tenga puesta una tarifa "a pelo", la "002", como tengo puesto un oDlg:Update, pues lo que hace al entrar en el díálogo es evaluar la tarifa que le correspondería al cliente y va y se la pone.

Es por lo que he dicho desde el comienzo del post, que no me respeta que tenga puesto el oDlg:Update en el ON CHANGE, ya que cuando entro por primera vez en el diálogo no hay cambio de radio, entro con el valor 1 , y sin embargo me evalúa como si hubiera un cambio.

Voy a tener que hacer una cosa un poco chapucera, y es poner un tercer radio, y en la función que los evalúa poner que no haga ninguna ación si tiene el valor de éste radio.

Esto es algo que me ha desconcertado
--------------------------
Saludos

Jose Luis
JoseLuis
 
Posts: 428
Joined: Thu Oct 19, 2006 12:28 pm
Location: Toledo

Re: Ayuda con Radio

Postby Pedro » Fri Oct 30, 2009 11:41 am

Hola José Luis
Veamos si te entiendo, tu tienes un diálogo donde uno de sus campos es una tarifa, pretendes con un radio elegir la tarifa del cliente u otra puesta a mano,(pero claro "esa otra" no está en el diálogo aún digitada, la que está es la del cliente una vez validado su código), díme, ¿cómo pretendes elegir algo que aún no existe?, otra cosa es que por medio del radio permitas o no, cambiar la tarifa que viene del cliente, con su correspondiente refresco de datos que afecten a la tarifa. En el ejemplo que has puesto con su rc, no sé si te funciona, a mi no, ya que los valid no devuelven nada por lo que da un error de validación en los gets. En cuanto a los radio, bueno yo he cambiado un poco el código y si cambio el radio, me camba el valor de los bultos si mayor problema, respetando el primer valor con el que viene la variable bultos. Este es el código modificado.
Code: Select all  Expand view  RUN
// Radio Buttons management sample

#include "FiveWin.ch"

//----------------------------------------------------------------------------//
function Main()

   local oDlg, oRadMenu, oBrush
   local nOption := 0
   local bultos,oGet[2],osay,albaran
*   local ponotra :={|| if(noption==1,rtotal->bulto:="999",rtotal->bulto:="555"),oDlg:Update()}
   SET _3DLOOK ON
   if file ("Rtotal.DBF")
      ferase ("Rtotal.DBF")
   endif
         DbCreate("Rtotal", ;
        { { "Expedicion","C", 12, 0 },;
          { "Bulto"     ,"C",  3, 0 },;    
          { "Precio"    ,"N",  9, 2 } } )
   dbusearea(.f.,,"rtotal",,.f.)
   Rtotal->(Dbappend())
   Rtotal->expedicion:="000000000001"
   Rtotal->Bulto:="002"
   albaran:=Rtotal->expedicion
   bultos:=Rtotal->bulto

   DEFINE DIALOG oDlg RESOURCE "Radios"
   REDEFINE SAY osay ID 107  OF oDlg
   REDEFINE SAY osay ID 10  OF oDlg
   REDEFINE SAY osay ID 11  OF oDlg
   REDEFINE RADIO oRadMenu VAR nOption ID 110, 120 OF oDlg;
      ON CHANGE ponotra(nOption,oDlg,oGet)
   REDEFINE GET oGet[1] VAR Albaran ID 200 OF oDlg Update;
        Valid (Albaran:= Padl(alltrim(Albaran),12,"0"),oDlg:Update(),.t.)
   REDEFINE GET oGet[2] VAR bultos ID 201 OF oDlg Update;
                Valid (bultos:= Padl(alltrim(bultos),3,"0"),oDlg:Update(),.t.)
   ACTIVATE DIALOG oDlg CENTERED

return nil
Function Ponotra(nOption,oDlg,oGet)

If nOption == 1
   oGet[2]:Varput("999")
   oGet[2]:Refresh()
   oDlg:Refresh()
Elseif nOption == 2  
   oGet[2]:Varput("555")
   oGet[2]:Refresh()
   oDlg:Refresh()
EndIf
Return nil  

Espero te sirva, aunque sigo sin entender por tus explicaciones, que es lo que pretendes en tu módulo
Last edited by Pedro on Fri Oct 30, 2009 11:46 am, edited 1 time in total.
Un saludo
Pedro
gahetesoft@gmail.com
FWH12.06 BCC582, Xverce CW, Pelles C 6.00.4,PSPAD 4.54
y ahora con ADO
User avatar
Pedro
 
Posts: 464
Joined: Tue Mar 21, 2006 7:30 pm
Location: Córdoba (España)

Next

Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 10 guests