FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Crear un PICTURE especial
Posts: 3358
Joined: Fri Oct 07, 2005 08:20 PM
Crear un PICTURE especial
Posted: Fri Nov 16, 2007 11:54 PM

Amigos del foro, buenas tardes:

En una aplicación necesito un PICTURE algo especial, trataré de explicarme, por ejemplo cuando recibimos números con decimales en un get usamos un picture así "@Z 999,999.999", cuando el usuario necesita registrar solo fracciones digamos .300 pues simplemente teclea el punto luego el 3 y puede o no teclear los 0, [x]Harbour se encarga de llenarlo correctamente y queda así .300, como es de esperarse.

Pues bien yo necesito usar un picture de este tipo "999-999" entonces para registrar 001-001 el usuario debería teclear solamente 1-1 y que el programa haga los ajustes, así el usuario se ahorra teclear los 0, ojalá me haya explicado.

Saludos

SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
Posts: 270
Joined: Fri Nov 11, 2005 07:39 PM
Crear un PICTURE especial
Posted: Sat Nov 17, 2007 12:23 AM
Hola Armando:

Se me ocurre que hagas una funcion que se ejecute en el valid del get ,

en esta funcion rellenas el picture , por ejemplo:


Function LlenaGet( cCodigo )
Local cCod := ""

 cCod := Padl( Left( cCodigo, 3 ) , 3, "0"  ) + "-" +  Padl( Right( cCodigo, 3 ) , 3, "0"  ) 

RETURN( cCod )


La pense a la rápida, pero deberia funcionar , es solo una idea :-)

Saludos
Juan
==> Pasando a FWH16.04 + Harbour32 + BCC70 + PellesC
=> Abandonando FWH 13.7 + xHarbour + BCC582
http://www.mitaller.cl
Posts: 215
Joined: Fri Feb 02, 2007 03:38 PM
separalos
Posted: Sat Nov 17, 2007 08:22 PM

Hola Armando,

Por que no los separa en get independientes y a cada uno de ellos los rellenas con cualquier caracter "0" u otro y despues en el reemplazo los unes si quieres con sus guiones etc.

Saludes,

Ramon Antonio Paredes
Managua, Nicaragua

... Desde la Tierra de lagos y Volcanes......
Posts: 3358
Joined: Fri Oct 07, 2005 08:20 PM
Crear un PICTURE especial
Posted: Sat Nov 17, 2007 08:52 PM

Amigos:

Gracias por las respuestas y sugerencias, tal vez sea posible modificar la clase TGET para meter esas carácteristicas, solo que de eso "yo solo se que no se nada", a ver si algun guru nos aporta algo para empezar a tirar.

Saludos

SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
Posts: 632
Joined: Tue Dec 12, 2006 07:34 PM
Hola
Posted: Mon Nov 19, 2007 03:47 PM
Armando wrote:Amigos:

Gracias por las respuestas y sugerencias, tal vez sea posible modificar la clase TGET para meter esas carácteristicas, solo que de eso "yo solo se que no se nada", a ver si algun guru nos aporta algo para empezar a tirar.

Saludos


Hola Armando buenos dias, tu necesitas una funcion que capture como cuentas contables verdad ? no hay necesidad de modificar la clase Tegt, yo tengo esa funcion que me rellena los ceros en el valid del get para captura de cuentas especiales de 1 a 4 niveles de cuentas, espero que te sirva.


//------------------------------------------------------------------------------
* FORMATO1 CON GUION 0000-0000-0000-0000 ó SIN GUION 000000000000
FUNCTION FORMATO1(VarCta, Ctaf,lGuion)
Local lcad1, lcad2, lcad3, lCad4, I, cFormCta

I := 0
lcad1 := ""
lcad2 := ""
lcad3 := ""
lcad4 := ""

//Procesa el primer campo de 4 Digitos: 0000- // Nivel 1
Do While .T.
I=I+1

IF SubStr(Ctaf, I, 1) == '-' .OR. I > Len(Ctaf)
Exit
EndIF

lcad1 := lcad1 + SubStr(Ctaf, I , 1)
EndDo

//Procesa el segundo campo de 4 Digitos: 0000-0000 // Nivel 2
Do While .T.
I=I+1

IF SubStr(Ctaf, I, 1) == '-' .OR. I > Len(Ctaf)
Exit
EndIF

lcad2 := lcad2 + SubStr(Ctaf, I , 1)
EndDo

//Procesa el tercer campo de 4 Digitos: 0000-0000-0000 // Nivel 3
Do While .T.
I=I+1

IF SubStr(Ctaf, I, 1) == '-' .OR. I > Len(Ctaf)
Exit
EndIF

lcad3 := lcad3 + SubStr(Ctaf, I, 1)
EndDo

//Procesa el cuarto campo de 4 Digitos: 0000-0000-0000-0000 // Nivel 4
Do While .T.
I=I+1

IF SubStr(Ctaf, I, 1) == '-' .OR. I > Len(Ctaf)
Exit
EndIF

lcad4 := lcad4 + SubStr(Ctaf, I, 1)
EndDo

*Nota: Tienes que indicar los 3 '-', ej: 1--, y como resultado: 00001-0000-0000-0000

IF lGuion
cFormCta := STRZERO(Val(lcad1),4) +'-'+ STRZERO(Val(lcad2),4)+'-'+ STRZERO(Val(lcad3),4)+'-'+ STRZERO(Val(lcad4),4)
ELSE
cFormCta := STRZERO(Val(lcad1),4) + STRZERO(Val(lcad2),4) + STRZERO(Val(lcad3),4) + STRZERO(Val(lcad4),4)
ENDIF
*MsgInfo(cFormCta)
RETURN (cFormCta)

Adriano C. C.
Posts: 989
Joined: Thu Nov 24, 2005 03:01 PM
Crear un PICTURE especial
Posted: Mon Nov 19, 2007 09:23 PM
Armando,
Armando wrote:Amigos:

Gracias por las respuestas y sugerencias, tal vez sea posible modificar la clase TGET para meter esas carácteristicas, solo que de eso "yo solo se que no se nada", a ver si algun guru nos aporta algo para empezar a tirar.

Saludos


Para añadir o cambiar el comportamiento de una clase te recomiendo que uses la herencia, porque modificar la TGet sería algo inmanejable. ¿QUe vas a hacer si sale una version nueva? Si lo haces por herencia, aun cuando cambie la clase tget tu clase seguirá manteniendo las correcciones que tu hiciste y recibirá las novedades por herencia. A la larga vas a ver que es todo más mantenible.
Esto de la herencia es un patron de programación que se llama Variaciones Protegidas

http://es.wikipedia.org/wiki/Grasp#Vari ... Protegidas

Esto no es nuevo, es un modelo que usaba Visual Object en el IDE para editar los formularios. Luego tu codigo se implementaba en otra clase, sublcase del formularoi original.

Otro efecto colateral de hacer modificaciones sobre el mismo código es que tu NO PUEDES COMPARTIR tu trabajo con los demás porque no puedes redistribuir el código de la clase TGET completo, es trabajo con copyright.
En cambio, de la otra forma tu puedes distribuir tu clase ya que solo contiene los aspectos reelaborados. Ayudas a proteger a FW sin perder la libertad de hacer con el código lo que quieras.

Aunque... yo a tu caso lo resuelvo de una manera mas sencilla:
cVar:= Space(8) // para alojar un '001-0001'

@ ... GET cVar .... VALID Ajusta( @cVar )

...

Function Ajusta( cVar )
   Local c1, c2
Local nPos:= AT( '-', cVar )
   If nPos > 0
      cVar:= StrZero( Val( Left( cVar, nPos - 1 ) ), 3 ) + '-' +StrZero( Val( SubStr( cVar, nPos +1 ) ), 4 ) 
      Return .T.
   Else
     // ver que hace en caso de que no ponga el guion
   EndIf
REturn .F.


Un saludo,

Carlos.
Saludos
Carlos Mora
http://harbouradvisor.blogspot.com/
StackOverflow http://stackoverflow.com/users/549761/carlos-mora
“If you think education is expensive, try ignorance"
Posts: 3358
Joined: Fri Oct 07, 2005 08:20 PM
Crear un PICTURE especial
Posted: Tue Nov 20, 2007 01:44 AM

Adriano:

Sip, efectivamente son cuentas contables.

Carlos, muchas gracias por los comentarios y el ejemplo.

Voy a probar ambos ejemplos y veré cual me ajusta mejor, ya les contare.

Saluds

SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
Posts: 632
Joined: Tue Dec 12, 2006 07:34 PM
Ejemplo...
Posted: Tue Nov 20, 2007 04:14 PM
Armando wrote:Adriano:

Sip, efectivamente son cuentas contables.

Carlos, muchas gracias por los comentarios y el ejemplo.

Voy a probar ambos ejemplos y veré cual me ajusta mejor, ya les contare.

Saluds


Buenos dias amigo, te pongo un ejemplo de como funciona la funcion dentro de un solo campo get, espero que te sirva de gran ayuda, y si alguien la puede mejorar el codigo sera bienvenido.
En ese ejemplo uso la clase BtnGet o lo puedes aplicar al get normal.


cCtaIni := SPACE(19)
REDEFINE BTNGET oGet[01] VAR cCtaIni ID 101 OF oDlg RESOURCE "AYUDA" PICTURE "@K ###################";
ACTION (ListCat(@cCtaIni,S07,"cCtaIni",oGet[01]));
VALID V_FormCta("cCtaIni",cCtaIni)


//------------------------------------------------------------------------------
Static FUNCTION V_FormCta(VarCta, CtAf)
Local FormCtas

IF EMPTY(Ctaf)
MsgAlert("Error: Campo no puede quedar vacío")
RETURN .F.
ENDIF

FormCtas := FORMATO1(VarCta, Ctaf,.T.)

DO CASE
CASE VarCta == "cCtaIni"
cCtaIni := FormCtas

CASE VarCta == "cCtaFin"
cCtaFin := FormCtas

IF cCtaIni > cCtaFin
MsgInfo('ERROR: Cuenta debe ser mayor o igual que el inicial')

RETURN .F.
ENDIF
ENDCASE

oGet[01]:Refresh()
oGet[02]:Refresh()

Release FormCtas
RETURN (.T.)

Saludos
Atte: Adriano C. C.

Continue the discussion