cambiar picture "en caliente"

cambiar picture "en caliente"

Postby JoseAlvarez » Wed Jun 09, 2021 11:32 pm

Hola a todos..

Por aca de nuevo solicitando apoyo para el tema que me concierne actualmente.

Estoy desarrollando un software con una caracteristica muy nombrada hoy dia en mi pais que es "multimoneda"
Por razones largas de explicar, en Venezuela se usan actualmente varias monedas que son el Bolivar (la oficial), el dolar estadounidense, el euro, el peso colombiano, el real brasileño, y dos criptomonedas que son el bitcoin y el petro. Un verdadero desastre, lo se.

El asunto es que quiero dejar la opcion al software para que en una factura se puedan trabajar con diferentes monedas las compras y las venta.

Pero me consigo con el problema que hay monedas que cuya tasa de cambio poseen 2 decimales, otras poseen 4 y otras 8. es decir, no son decimales fijos.

El software manejara una moneda ANCLA que sera por la que se rijan todas las operaciones de inventario y control interno, pero debe tener la capacidad de comprar en cualquier moneda y convertirla al ancla y al momento de vender debe poder hacer la inversa, convertir de la moneda ancla a la moneda en que de desee facturar.

¿Hay alguna manera de poder cambiar un GET en caliente? es decir, presentarlo inicialmente con 2 decimales, pero que si el usuario continua escribiendo pueda automaticamente aumentar la cantidad de decimales hasta un maximo de 8?

Pongo una imagen para ilustrar lo que se quiere

Image

Agradezco de antemano la ayuda o ideas que puedan prestarme.

FW17.01 / BCC7 / xHarbour
"Los errores en programación, siempre están entre la silla y el teclado..."

Fwh 19.06 32 bits + Harbour 3.2 + Borland 7.4 + MariaDB + TDolphin

Carora, Estado Lara, Venezuela.
User avatar
JoseAlvarez
 
Posts: 800
Joined: Sun Nov 09, 2014 5:01 pm

Re: cambiar picture "en caliente"

Postby leandro » Thu Jun 10, 2021 12:58 am

Saludos
LEANDRO AREVALO
Bogotá (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Embarcadero C++ 7.60 for Win32 ] [ FiveWin 23.07 ] [ xHarbour 1.3.0 Intl. (SimpLex) (Build 20230914) ]
User avatar
leandro
 
Posts: 1676
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia

Re: cambiar picture "en caliente"

Postby JoseAlvarez » Thu Jun 10, 2021 1:44 am

Hola leandro.

Gracias por responder.
Ya habia visto la opcion de poder cambiarlo con un combo. Pero no quisiera que el usuario tenga que seleccionar cada vez que deba incluir un dato.
Lo que me gustaria es si hay alguna manera que los decimales "se corran" solos hacia la derecha a medida que el usuario escribe.

Por supuesto que al darle enter se pinte de nuevo un picture de manera correcta con los separadores de miles y la coma decimal.

Seguimos buscando...
"Los errores en programación, siempre están entre la silla y el teclado..."

Fwh 19.06 32 bits + Harbour 3.2 + Borland 7.4 + MariaDB + TDolphin

Carora, Estado Lara, Venezuela.
User avatar
JoseAlvarez
 
Posts: 800
Joined: Sun Nov 09, 2014 5:01 pm

Re: cambiar picture "en caliente"

Postby karinha » Thu Jun 10, 2021 12:31 pm

Code: Select all  Expand view  RUN

// -----------------------------------------------------------------------
// Funci¢n ...: PictPts
// Descripci¢n: Cadena Picture para un GET.
// Par metros : Ninguno.
// Devolve ..: Una cadena.
// -----------------------------------------------------------------------
FUNCTION PictPts()
RETURN( "@E 9,999,999,999" )
// -----------------------------------------------------------------------

// -----------------------------------------------------------------------
// Funci¢n ...: PictEuros
// Descripci¢n: Cadena Picture para un GET.
// Par metros : Ninguno.
// Devolve ..: Una cadena.
// -----------------------------------------------------------------------
FUNCTION PictEuros()
RETURN( "@E 9,999,999,999.99" )
// -----------------------------------------------------------------------

// -----------------------------------------------------------------------
// Funci¢n ...: Num2StrDec
// Descripci¢n: Convierte un campo num‚rico a cadena, para mostrar en un
//              LISTBOX.
// Par metros : nCampo -> Valor Num‚rico.
// Devolve ..: Cadena formateada.
// -----------------------------------------------------------------------
FUNCTION Num2StrDec( nCampo )
RETURN Transform( nCampo, "@E 999,999,999.99" )
// -----------------------------------------------------------------------

// -----------------------------------------------------------------------
// Funci¢n ...: Num2Str
// Descripci¢n: Convierte un campo num‚rico a cadena, para mostrarlo en un
//              LISTBOX.
// Par metros : nCampo -> Valor Num‚rico.
// Devolve ..: Cadena formateada.
// -----------------------------------------------------------------------
FUNCTION Num2Str( nCampo, nSize, nDec )

   LOCAL cPicture := "@E 999,999,999,999"

   DO CASE
      CASE nSize = 12 .AND. nDec = 0
           cPicture := "@E 999,999,999,999"
      CASE nSize = 12 .AND. nDec = 2
           cPicture := "@E 999,999,999.99"
      CASE nSize = 12 .AND. nDec = 3
           cPicture := "@E 99,999,999.999"
      CASE nSize = 08 .AND. nDec = 0
           cPicture := "@E 99,999,999"
      CASE nSize = 08 .AND. nDec = 2
           cPicture := "@E 99,999.99"
      CASE nSize = 08 .AND. nDec = 3
           cPicture := "@E 9,999.999"
      CASE nSize = 07 .AND. nDec = 0
           cPicture := "@E 9,999,999"
      CASE nSize = 07 .AND. nDec = 2
           cPicture := "@E 9,999.99"
      CASE nSize = 07 .AND. nDec = 3
           cPicture := "@E 999.999"
      CASE nSize = 05 .AND. nDec = 0
           cPicture := "@E 99,999"
      CASE nSize = 05 .AND. nDec = 2
           cPicture := "@E 99.99"
      CASE nSize = 05 .AND. nDec = 3
           cPicture := "@E 9.999"
      CASE nSize = 02 .AND. nDec = 0
           cPicture := "99"
   ENDCASE

RETURN Transform( nCampo, cPicture )
// -----------------------------------------------------------------------

// -----------------------------------------------------------------------
// Funci¢n ...: Num2Doc
// Descripci¢n: Convierte un campo num‚rico a cadena, para mostrarlo en un
//              LISTBOX. Solo para los n£meros de documento.
// Par metros : nCampo -> Valor Num‚rico.
// Devolve ..: Cadena formateada.
// -----------------------------------------------------------------------
FUNCTION Num2Doc( nCampo )
RETURN Transform( nCampo, "@E 9999999" )
// -----------------------------------------------------------------------

// -----------------------------------------------------------------------
// Funci¢n ...: IsPar
// Descripci¢n: Comprueba si un n§ es par, lo utilizo para cambiar alternar
//              los colores de los browse.
// Par metros : nCampo -> Valor Num‚rico.
// Devolve ..: .T. o .F.
// -----------------------------------------------------------------------
FUNCTION IsPar( nNumero )

   LOCAL lDevuelve := .F.

   IF ValType( nNumero ) = "N"
      IF nNumero % 2 = 0
         lDevuelve := .T.
      ENDIF
   ENDIF

RETURN lDevuelve
 


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

Re: cambiar picture "en caliente"

Postby karinha » Thu Jun 10, 2021 12:47 pm

Code: Select all  Expand view  RUN

#include "Fivewin.Ch"
#include "Ord.Ch"     // PARA SCOPES()

FUNCTION ACTUALIZA()

   LOCAL oFont1, oFont2 // etc
   LOCAL Rut_Pac1 := Spac( 12 )

   Abre_dbf( "GeneCoti", 3, .F. , "GeneC" ) // COMO ESTA LA APERTURA?

   SET INDEX TO GeneCoti  // NTX?

   DbSetorder( 2 ) // ESTA CORRECTO EL INDICE? SET ORDER TO 2

   cAlias := ALIAS() // "GeneC"

   ( cAlias )->( OrdScope( 0, Rut_Pac1 ) )
   ( cAlias )->( OrdScope( 1, Rut_Pac1 ) )
   ( cAlias )->( DbGotop() )

   Define Font oFont1 Name "Arial" Size 0, 25    BOLD
   Define Font oFont2 Name "Arial" Size 0, - 14    BOLD
   Gra := 0

   DEFINE DIALOG oDlgBus RESOURCE "BUSCA_COTI" STYLE nOr( WS_POPUP, WS_VISIBLE, WS_DLGFRAME ) COLORS RGB( 138, 4, 4 )

   REDEFINE SAY oSay1 ID 4004 PROMPT "COTIZACIONES REALIZADAS" OF oDlgBus FONT oFont1  COLORS RGB( 56, 76, 170 )

   REDEFINE SAY oSay3 ID 4011 PROMPT "Rut Paciente" OF oDlgBus FONT oFont2    RIGHT

   REDEFINE SAY oSay4 ID 4005 PROMPT "Nombre" OF oDlgBus FONT oFont2  RIGHT

// Este Get es el encargado de Actualizar el Xbrowse
   Redefine GET oRut VAR Rut_Pac1 ID 4008 PICTURE "@R ##.###.####!" FONT oFont2 OF oDlgBus COLOR RGB( 0, 0, 128 ), RGB( 159, 233, 255 );
      WHEN  ( oRut:oGet:Picture := "@KR #########!", .T. );
      VALID If( Vrut( { oRut },Rut_Pac1 ), ( oRut:oGet:Picture := "@R ##.###.####!", oRut:Refresh(),oBrw:Refresh(), .T. ), .F. )

   Redefine SAY oNom Var Nom_Pac1 Id 4012 Of oDlgBus Update PICTURE "@!" FONT oFont2   COLOR RGB( 0, 0, 128 ), RGB( 159, 233, 255 )

   REDEFINE BTNBMP oBtn1 ID 4007 PROMPT "VOLVER"  Resource "#8002" 2007 FONT oFont2 OF oDlgBus MESSAGE "VOLVER Y NO GRABA"  ;
      ACTION ( oDlgBus:END() )


   REDEFINE XBROWSE oBrw  OF oDlgBus ALIAS "GeneC"  ID 4001;
      HEADERS 'Folio', 'Fecha', 'Digita', 'Hora';
      FIELDS GeneC->Nro_Cot, ctod( GeneC->Fec_Cot ), GeneC->Cod_Dig, GeneC->Hor_Dig;
      COLSIZES 70, 90, 60, 60;
      PICTURES '@!', '@D', '@!', '@!';
      FONT oFont2;
      CELL LINES AUTOSORT NOBORDER

   oBrw:nMarqueeStyle := MARQSTYLE_HIGHLROW
   oBrw:nColDividerStyle := LINESTYLE_RAISED
   oBrw:nRowDividerStyle := LINESTYLE_RAISED
   oBrw:bClrHeader := {|| { nRGB( 140, 0, 0 ), nRGB( 231, 242, 255 ), } }
   oBrw:nOpacity    := 230
   oBrw:nHeaderHeight      := 35
   oBrw:nFreeze       := 2
   AEval( oBrw:aCols, { |o| o:nHeadStrAlign := AL_CENTER } )
   oDlgBus:bStart := { || oBrw:Gotop() }

   oBrw:bClrStd  := { || If( Eval( oBrw:bKeyNo,,oBrw ) % 2 == 0, { CLR_BLACK, RGB( 198, 255, 198 ) }, ;
      { CLR_BLACK, RGB( 232, 255, 232 ) } ) }    // Efecto Cebra
   oBrw:Seek( "" )
   oBrw:bClrStd             := {|| { nRGB(  0,  0,  0 ), nRGB( 255,248,220 ) } }

   oBrw:bClrSelFocus        := {|| { nRGB(  255,  255,  255 ), nRGB( 102, 178, 255 ) } }
   oBrw:bClrSel       := {|| { nRGB(  0,  0,255 ), nRGB( 241,222,088 ) } }  // para barra de linea selecc cuando el control no tiene el foco
   oBrw:lAutoSort := .T.
   oBrw:lFooter := .F.
   oBrw:lHScroll := .F.
   oBrw:lIncrFilter      := .T.
   oBrw:lSeekWild        := .F.                   //  .T. Busca Contenido, .F. Que comience con lo que digita
   oBrw:nColorPen := CLR_RED
   oBrw:bChange := {|| oBrw:Refresh() }

RETURN NIL

FUNCTION cPicture_Get()  // aqui la mascara del GET. Cambie para tu ejemplo.

   IF cTipo = "J" .AND. oGet:cPicture != "@R 99.999.999/9999-99"
      cCgc := Space( 14 )
      oGet:cPicture := "@R 99.999.999/9999-99"
      oGet:oGet:Picture := "@R 99.999.999/9999-99"
      oGet:Refresh()
   ELSEIF cTipo = "F" .AND. oGet:cPicture != "@R 999.999.999-99"
      cCgc := Space( 11 )
      oGet:cPicture := "@R 999.999.999-99"
      oGet:oGet:Picture := "@R 999.999.999-99"
      oGet:Refresh()
   ENDIF

RETURN( .T. )
 


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

Re: cambiar picture "en caliente"

Postby JoseAlvarez » Thu Jun 10, 2021 11:33 pm

Hola a todos nuevamente.

Muchas gracias a joao y leandro por su ayuda en la inquietud que me ocupa, pero creo que no me supe
explicar, de hecho me explique muy mal. Pido disculpas por eso.

Lo que quiero y necesito es que el picture de un get NUMERICO ajuste sus digitos enteros y decimales
a medida que el usuario va escribiendo. es decir,

Comienzo con un get cuya variable contenedora es 0 y el picture es

"@E 999,999,999,999.99"

El usuario comienza a escribir normalmente, pero si decide escribir un tercer decimal, que el get se
ajuste de manera automatica, agregando un decimal y restando un entero,

que el picture haga esto

"@E 99,999,999,999.999"

un cuarto decimal, el picture se ajuste a

"@E 9,999,999,999.9999"

otro mas...

"@E 999,999,999.99999"

otro...

"@E 99,999,999.999999"

otro...

"@E 9,999,999.9999999"

otro y hasta un maximo de 8 decimales y seis enteros

"@E 999,999.99999999"

Y por supuesto viceversa, si el usuario presiona BACK SPACE, se resten del picture los decimales
y se aumente al picture los enteros

Estos valores son los que guardare en la tabla y mostrare en el listbox, convirtielos previamente a TEXTO.

Espero haberme explicado bien esta vez y quedo atento a sus comentarios de ayuda, como siempre.

Image
"Los errores en programación, siempre están entre la silla y el teclado..."

Fwh 19.06 32 bits + Harbour 3.2 + Borland 7.4 + MariaDB + TDolphin

Carora, Estado Lara, Venezuela.
User avatar
JoseAlvarez
 
Posts: 800
Joined: Sun Nov 09, 2014 5:01 pm

Re: cambiar picture "en caliente"

Postby Antonio Linares » Fri Jun 11, 2021 7:50 am

Jose,

Aqui tienes un ejemplo que parece funcionar bien, a falta de implementar el borrado:

Code: Select all  Expand view  RUN
#include "Fivewin.ch"

function Main()

    local oDlg, oGet, n := 0

    SET DECIMALS TO 8

    DEFINE DIALOG oDlg

    @ 3, 1 GET oGet VAR n PICTURE "@E 999,999,999,999.99" ;
       ON CHANGE If( oGet:nPos - 1 == Len( oGet:oGet:buffer ),;
                   ( n := Val( StrTran( oGet:GetText(), ',', '.' ) ),;
                     oGet:oGet := FWGetNew( 20, 20, bSETGET( n ),, oGet:cPicture := GetPicture( oGet ) ),;
                     oGet:oGet:SetFocus(), oGet:SetText( oGet:oGet:buffer ),;
                     oGet:SetPos( Len( oGet:oGet:buffer ) ),;
                     oGet:KeyDown( VK_LEFT ), oGet:KeyDown( VK_RIGHT ) ),)

    ACTIVATE DIALOG oDlg CENTER
   
return nil

function GetPicture( oGet )

    local cPicture

    do case
        case oGet:cPicture == "@E 999,999,999,999.99"
           oGet:oWnd:SetText( "1" )
           cPicture = "@E 99,999,999,999.999"

        case oGet:cPicture == "@E 99,999,999,999.999"
            oGet:oWnd:SetText( "2" )
            cPicture = "@E 9,999,999,999.9999"
           
        case oGet:cPicture == "@E 9,999,999,999.9999"
            oGet:oWnd:SetText( "3" )
            cPicture = "@E 999,999,999.99999"
           
        case oGet:cPicture == "@E 999,999,999.99999"
            oGet:oWnd:SetText( "4" )
            cPicture = "@E 99,999,999.999999"
           
        case oGet:cPicture == "@E 99,999,999.999999"
            oGet:oWnd:SetText( "5" )
            cPicture = "@E 9,999,999.9999999"
           
        case oGet:cPicture == "@E 9,999,999.9999999"
            oGet:oWnd:SetText( "6" )
            cPicture = "@E 999,999.99999999"
    endcase

return cPicture    


Esta es la lógica que sigue:
Code: Select all  Expand view  RUN
ON CHANGE If( oGet:nPos - 1 == Len( oGet:oGet:buffer ),;  // estamos en la última posición del GET ?
          ( n := Val( StrTran( oGet:GetText(), ',', '.' ) ),;  // actualizamos el valor de n
          oGet:oGet := FWGetNew( 20, 20, bSETGET( n ),, oGet:cPicture := GetPicture( oGet ) ),; // reeemplazamos la DATA oGet del TGet
          oGet:oGet:SetFocus(), oGet:SetText( oGet:oGet:buffer ),; // actualizamos el GET "interior" (el de Harbour) y repintamos TGet
          oGet:SetPos( Len( oGet:oGet:buffer ) ),; // nos vamos a la última posición
          oGet:KeyDown( VK_LEFT ), oGet:KeyDown( VK_RIGHT ) ),)  // pulsamos izquierda y derecha para que se reposicione correctamente a nivel interno
regards, saludos

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

Re: cambiar picture "en caliente"

Postby JoseAlvarez » Fri Jun 11, 2021 6:10 pm

Muchas gracias Antonio.

Me esta dando errores al aplicarlo al formulario.

Estoy resolviendo..

Agradecido.
"Los errores en programación, siempre están entre la silla y el teclado..."

Fwh 19.06 32 bits + Harbour 3.2 + Borland 7.4 + MariaDB + TDolphin

Carora, Estado Lara, Venezuela.
User avatar
JoseAlvarez
 
Posts: 800
Joined: Sun Nov 09, 2014 5:01 pm


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: karinha and 76 guests