Crear un PICTURE especial

Crear un PICTURE especial

Postby Armando » 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
User avatar
Armando
 
Posts: 3179
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México

Postby jcaro » 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:


Code: Select all  Expand view

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

separalos

Postby Ramon Paredes » Sat Nov 17, 2007 8: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......
User avatar
Ramon Paredes
 
Posts: 215
Joined: Fri Feb 02, 2007 3:38 pm
Location: Managua, Nicaragua

Postby Armando » Sat Nov 17, 2007 8: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
User avatar
Armando
 
Posts: 3179
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México

Hola

Postby ACC69 » Mon Nov 19, 2007 3: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.
ACC69
 
Posts: 632
Joined: Tue Dec 12, 2006 7:34 pm

Postby Carlos Mora » Mon Nov 19, 2007 9: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:
Code: Select all  Expand view
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.
Carlos Mora
 
Posts: 989
Joined: Thu Nov 24, 2005 3:01 pm
Location: Madrid, España

Postby Armando » Tue Nov 20, 2007 1: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
User avatar
Armando
 
Posts: 3179
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México

Ejemplo...

Postby ACC69 » Tue Nov 20, 2007 4: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.
ACC69
 
Posts: 632
Joined: Tue Dec 12, 2006 7:34 pm


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: Google [Bot], groiss and 56 guests