Page 1 of 1

PICTUREs personalizados

Posted: Mon Nov 19, 2007 5:52 pm
by FiveWiDi
Como se hacercan los reyes, yo también voy a hacer la carta.

Es España (y creo que en otros paises sucede algo parecido), en la banca se usa el CCC (Código Cuenta Cliente). Éste es un número de 20 cifras con 4 grupos de cifras:

4 para entidad
4 para oficina
2 para dígitos de control
10 para número de cuenta

y el formato sería: 1234.5678.90.1234567890

Es posible hacer un PICTURE para introducir datos de este tipo?

Se puede complicar aún más. También existe el IBAN que es el CCC precedido de 2 caracteres que identifican el pais.

En fin sólo era un deseo para estas Navidades.

Saludos
Carlos G.

Posted: Mon Nov 19, 2007 6:32 pm
by Carlos Mora
Hola Carlos,

No te sirve el picture '@R 9999-9999-99-9999999999' ?
Digamos que estaría bien si conaras que tienes editar, que quieres obtener, el formato en que esta la variable, etc.

Saludos

Posted: Mon Nov 19, 2007 8:32 pm
by Manuel Aranda
Hola Carlos,
como dice Carlos Mora el PICTURE "@R 9999-9999-99-9999999999" va perfecto.
Ya puestos, te pego también un par de funciones para validarlo, por si te son de utilidad.
Un saludo,
Manuel

Code: Select all

REDEFINE GET oGet[18] VAR  cCuenta  WHEN nPago=2 VALID ValidaCuenta(cCuenta,nPago) ID 428 OF oFolder:aDialogs[2] PICTURE "@R 9999-9999-99-9999999999" FONT oFont2

*******************************************
FUNCTION VALIDACUENTA(cCuenta,nPago)
*******************************************
Local lValor:=.T.
Local cDigito
//
IF EMPTY(cCuenta) .AND. nPago = 2
   MsgSTOP(OemToAnsi("El n£mero de cuenta bancaria debe tener 20 d¡gitos"),OemToAnsi("­­­ Atenci¢n !!!"))
   lValor=.F.
ENDIF
//
IF !EMPTY(cCuenta)
   //
   IF LEN(ALLTRIM(cCuenta)) < 20
      MsgSTOP(OemToAnsi("El n£mero de cuenta bancaria debe tener 20 d¡gitos"),OemToAnsi("­­­ Atenci¢n !!!"))
      lValor=.F.
   ELSE
   //
   cDigito=DigBanco(SUBSTR(cCuenta,1,8),SUBSTR(cCuenta,11,10))
   //
      IF cDigito <> SUBSTR(cCuenta,9,2)
         MsgSTOP(OemToAnsi("El n£mero de cuenta bancaria es incorrecto"),OemToAnsi("­­­ Atenci¢n !!!"))
         lValor=.F.
      ENDIF
      //
   ENDIF
   //
ENDIF
//
RETURN lValor

*************************************************************************
FUNCTION Digbanco(cRefer1,cRefer2)
*************************************************************************
LOCAL nDigitos := 10
LOCAL aDigito  := ARRAY( nDigitos )
LOCAL aPeso    := { 1, 2, 4, 8, 5, 10, 9, 7, 3, 6 }
LOCAL nSuma    := 0
LOCAL nCont
LOCAL nModulo
LOCAL nResto
LOCAL cDigito1
LOCAL cDigito2

cRefer1 := STRTRAN(cRefer1,'-')
cRefer1 := STRTRAN(cRefer1,'.')
cRefer1 := STRTRAN(cRefer1,'/')
cRefer1 := STRTRAN(cRefer1,' ')
cRefer1 := RIGHT(cRefer1,nDigitos)
cRefer1 := PADL(cRefer1,nDigitos,'0')

cRefer2 := STRTRAN(cRefer2,'-')
cRefer2 := STRTRAN(cRefer2,'.')
cRefer2 := STRTRAN(cRefer2,'/')
cRefer2 := STRTRAN(cRefer2,' ')
cRefer2 := RIGHT(cRefer2,nDigitos)
cRefer2 := PADL(cRefer2,nDigitos,'0')

FOR nCont := 1 to nDigitos
   aDigito[ nCont ] := VAL( SUBSTR( cRefer1, nCont, 1 ) )
   nSuma += ( aDigito[ nCont ] * aPeso[ nCont ] )
NEXT
nModulo  := 11 - INT( nSuma % 11 )
nResto   := IF( nModulo == 10, 1, IF( nModulo == 11, 0, nModulo ) )
cDigito1 := LTRIM(STR(nResto))

nSuma := 0
FOR nCont := 1 to nDigitos
   aDigito[ nCont ] := VAL( SUBSTR( cRefer2, nCont, 1 ) )
   nSuma += ( aDigito[ nCont ] * aPeso[ nCont ] )
NEXT
nModulo  := 11 - INT( nSuma % 11 )
nResto   := IF( nModulo == 10, 1, IF( nModulo == 11, 0, nModulo ) )
cDigito2 := LTRIM(STR(nResto))

RETURN(cDigito1+cDigito2)

Posted: Mon Nov 19, 2007 9:28 pm
by Carlos Mora
Ya mismo hago un cut & paste y guardo en la libreria de recortes. No lo necesito YA, pero seguro que en breve me va a hacer falta.

¡Gracias por la perla!

Carlos Mora

Posted: Mon Nov 19, 2007 11:04 pm
by FiveWiDi
Gracias a ambos,

de momento haré lo mismo que dice Carlos.

Lo guardo y a ver cuando lo implanto.

Gracias de nuevo.
Carlos G.