Page 1 of 1

Crear un PICTURE especial

Posted: Fri Nov 16, 2007 11:54 pm
by Armando
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

Posted: Sat Nov 17, 2007 12:23 am
by jcaro
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:

Code: Select all


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 :lol:

Saludos

separalos

Posted: Sat Nov 17, 2007 8:22 pm
by Ramon Paredes
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

Posted: Sat Nov 17, 2007 8:52 pm
by Armando
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

Posted: Mon Nov 19, 2007 3:47 pm
by ACC69
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.

Posted: Mon Nov 19, 2007 9:23 pm
by Carlos Mora
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:

Code: Select all

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.

Posted: Tue Nov 20, 2007 1:44 am
by Armando
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

Ejemplo...

Posted: Tue Nov 20, 2007 4:14 pm
by ACC69
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.