RESPUESTA A LA PREGUNTA 6347 PUBLIC lcRetorno,numeroletra numeroletra=numletra(VALORCAJA,.F.) FUNCTION numletra PARAMETERS tnImporte, tlPesetas IF tnImporte <= 9999999999 lcRetorno = NUMPAL(tnImporte) IF tlPesetas lcRetorno = Pesetas (lcRetorno, tnImporte) ENDIF ELSE lcRetorno = 'NUMERO DEMASIADO GRANDE: ' + STR(tnImporte) ENDIF RETURN lcRetorno FUNCTION NUMPAL PARAMETERS tnImporte LOCAL lcRetorno, lcImporte, lnMillones, lcMillones, lcNexo, lnMiles, lcMiles lcRetorno = '' lcImporte = RTRIM(LTRIM(STR(tnImporte))) lnMillones = 0 lcMillones = '' lcNexo = '' lnMiles = 0 IF LEN(lcImporte)>6 * Si la cifra es de millones, nos quedamos con los dígitos excepto los últimos seis. lnMillones = VAL(Left(lcImporte,LEN(lcImporte)-6)) lcMillones = NumeroSeisCifras(lnMillones) * Calcula la palabra nexo de unión entre los millones y los miles lcNexo = IIF(lnMillones = 1, " MILLON " , " MILLONES ") * Calcula la cifra de los miles, es decir, solo los seis últimos dígitos. lnMiles = VAL(RIGHT(lcImporte,6)) lcMiles = NumeroSeisCifras(lnMiles) lcRetorno = lcMillones + lcNexo + lcMiles ELSE * Calcula la cifra de los miles, es decir, solo los seis primeros dígitos. lcMiles = NumeroSeisCifras(tnImporte) lcRetorno = lcMiles ENDIF * Corregir la palabra ciento por cien en los millones IF tnImporte > 99999999 AND tnImporte < 100999999 lcRetorno = STRTRAN(lcRetorno,' CIENTO ', ' CIEN ') ENDIF * Cambiar algunas palabras y quitar los espacios lcRetorno = STRTRAN(lcRetorno,'UNO','UN') lcRetorno = STRTRAN(lcRetorno,'CIENTO MIL','CIEN MIL') lcRetorno = STRTRAN(lcRetorno,' ',' ') lcRetorno = STRTRAN(lcRetorno,' ',' ') lcRetorno = ALLTRIM(lcRetorno) * Comprobar las terminaciones de uno por 'un' y ciento por 'cien' y cambiarlas lcRetorno = IIF(RIGHT(lcRetorno,2)='UN', lcRetorno+'O', lcRetorno) lcRetorno = IIF(RIGHT(lcRetorno,6)='CIENTO', SUBSTR(lcRetorno, 1, LEN(lcRetorno)-2), lcRetorno) RETURN lcRetorno * FIN NumPal --------------------------------------------------------------------------------------------------------------------------------------------------------- *----------------------------------------------------------------------------------------------------------------------- * PROCEDURE NumeroSeisCifras * NOTA: Sólo admite cifras de 999999 millones. Suficiente para los numeros a tratar. *----------------------------------------------------------------------------------------------------------------------- PROCEDURE NumeroSeisCifras PARAMETERS tnNumero LOCAL U, U1,U2, U3, U4,U5,U6,U7, U8, U9, U10, U11, U12, U13, U14, U15, U16, U17, U18, U19, ; U20, U30, U40, U50, U60, U70, U80, U90, ; U100, U200, U300, U400, U500, U600, U700, U800, U900 U = "" U1 = "UNO" U2 = "DOS" U3 = "TRES" U4 = "CUATRO" U5 = "CINCO" U6 = "SEIS" U7 = "SIETE" U8 = "OCHO" U9 = "NUEVE" U10 = "DIEZ" U11 = "ONCE" U12 = "DOCE" U13 = "TRECE" U14 = "CATORCE" U15 = "QUINCE" U16 = "DIECISEIS" U17 = "DIECISIETE" U18 = "DIECIOCHO" U19 = "DIECINUEVE" U20 = "VEINTE" U30 = "TREINTA" U40 = "CUARENTA" U50 = "CINCUENTA" U60 = "SESENTA" U70 = "SETENTA" U80 = "OCHENTA" U90 = "NOVENTA" U100 = "CIENTO" U200 = "DOSCIENTOS" U300 = "TRESCIENTOS" U400 = "CUATROCIENTOS" U500 = "QUINIENTOS" U600 = "SEISCIENTOS" U700 = "SETECIENTOS" U800 = "OCHOCIENTOS" U900 = "NOVECIENTOS" LOCAL lcRetorno, lnContador, lnInicio, lcCadena lnContador = 1 lnInicio = 1 lcCadena = STR(tnNumero,9,2) lcRetorno = " " DO WHILE lnContador < 3 * Subdividir la cadena quedandonos con los tres primeros dígitos lcSubcadena = SUBSTR(lcCadena,lnInicio,3) Centena = SUBSTR(lcSubcadena,1,1)+'00' Decena = SUBSTR(lcSubcadena,2,2) Unidad = SUBSTR(lcSubcadena,3,1) * Si tiene centena toma la cadena correspondiente a la centena IF VAL(lcSubcadena) > 99 lcRetorno = lcRetorno + U&Centena + " " ENDIF lnDecena = VAL(Decena) * Si tiene decena toma la cadena correspondiente a la decena IF lnDecena > 0 DO CASE * Para valores múltiples de 10 o entre el 10 y 19 inclusives, suma al retorno el valor fijo del define. CASE (INT(lnDecena/10.0)=lnDecena/10.0) OR (lnDecena>9 AND lnDecena<20) lcRetorno = lcRetorno + U&Decena * Para valores mayores que 9 y NO multiplos de 10, suma el valor del retorno, la decena 'y' unidad CASE lnDecena > 9 AND (INT(lnDecena/10.0)#lnDecena/10.0) Decena = SUBSTR(Decena,1,1) + '0' IF Decena # '20' lcRetorno = lcRetorno + U&Decena+' Y '+U&Unidad ELSE lcRetorno = lcRetorno + 'VEINTI'+U&Unidad ENDIF * Para valores entre el 1 y el 10 retorna el valor de retorno más la cadena correspondiente a la unidad. CASE lnDecena < 10 lcRetorno = lcRetorno + U&Unidad ENDCASE ENDIF (lnDecena > 0) * Si es una cifra que contenga miles, añadir la palabra MIL a la cifra pasada. IF tnNumero > 999.99 .AND. lnContador = 1 lcRetorno = lcRetorno + ' MIL ' IF lcRetorno = ' UNO MIL ' lcRetorno = ' MIL ' ENDIF ENDIF lnInicio = 4 lnContador = lnContador + 1 ENDDO (mientras lnContador < 3) RETURN lcRetorno * FIN NumeroSeiscifras --------------------------------------------------------------------------------------------------------------------------------------------------------- *----------------------------------------------------------------------------------------------------------------------- * FUNCTION Pesetas *----------------------------------------------------------------------------------------------------------------------- FUNCTION Pesetas PARAMETERS tcImporte, tnImporte LOCAL lcRetorno, lnPOsicion, lcMiles lcRetorno = tcImporte + IIF(tnImporte = INT(tnImporte / 1000000) * 1000000, ' DE ' + 'PESETAS.', ' PESETAS.') * Quedarse con la parte de los miles y quitar la de los millones, para cambiar la terminación TOS por TAS, * para poner la cifra en femenino. lnPOsicion = AT('MILLONES', lcRetorno) IF lnPOsicion <> 0 lcMiles =SUBSTR(lcRetorno, lnPOsicion+8, LEN(lcRetorno)-lnPOsicion+8) lcMiles = STRTRAN(lcMiles, 'TOS','TAS') lcRetorno = SUBSTR(lcRetorno, 1 , lnPOsicion + 7) + lcMiles ELSE lcRetorno = STRTRAN(lcRetorno, 'TOS','TAS') ENDIF * Cambiar las terminaciones y quitar los espacios lcRetorno = STRTRAN(lcRetorno,'UNO','UN') lcRetorno = STRTRAN(lcRetorno,' ',' ') lcRetorno = STRTRAN(lcRetorno,' ',' ') lcRetorno = STRTRAN(lcRetorno,'UN PESETA','UNA PESETA') lcRetorno = STRTRAN(lcRetorno,'CIENTO PESETAS','CIEN PESETAS') lcRetorno = STRTRAN(lcRetorno,'CIENTO MIL','CIEN MIL') RETURN lcRetorno * FIN pesetas ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ luego lo llamo asi: --VALORCAJA=valor_paso_por _parametro(tu valor) valorcaja=584725 DO \programas\NUMEROS_A_LETRAS REPORT Form \reportes\RECIBO_DE_CAJA NOCONSOLE EN EL REPORTE EXISTE LA VARIABLE DE RETORNO lcRetorno. Uriel Cardenás Noriega Ucardena@telebucaramanga.com.co