Crear un PICTURE especial

Post Reply
User avatar
Armando
Posts: 2479
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México
Contact:

Crear un PICTURE especial

Post 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
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
jcaro
Posts: 270
Joined: Fri Nov 11, 2005 7:39 pm

Post 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
Juan
==> Pasando a FWH16.04 + Harbour32 + BCC70 + PellesC
=> Abandonando FWH 13.7 + xHarbour + BCC582
http://www.mitaller.cl
User avatar
Ramon Paredes
Posts: 215
Joined: Fri Feb 02, 2007 3:38 pm
Location: Managua, Nicaragua

separalos

Post 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
... Desde la Tierra de lagos y Volcanes......
User avatar
Armando
Posts: 2479
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México
Contact:

Post 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
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
ACC69
Posts: 619
Joined: Tue Dec 12, 2006 7:34 pm
Contact:

Hola

Post 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.
Carlos Mora
Posts: 988
Joined: Thu Nov 24, 2005 3:01 pm
Location: Madrid, España

Post 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.
User avatar
Armando
Posts: 2479
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México
Contact:

Post 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
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
ACC69
Posts: 619
Joined: Tue Dec 12, 2006 7:34 pm
Contact:

Ejemplo...

Post 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.
Post Reply