Problema con una rutina que convierte la cifra total de una factura a texto en Visual FoxPro 9.0

Estimado Experto: He estado trabajando con visul foxpro 9.0 y estoy realizando un programa de Facturación, ahí anexe una rutina que me convierte el importe total de la factura a letras, cuando imprimo la !er factura todo bien, el problema es cuando imprimo la 2da factura (utilizo la misma rutina) me marca el siguiente error 'Fuction argument value, type, or count is invalid' seria tan amable de darle una revisada a mi rutina y decirme que estoy haciendo mal (de antemano gracias).
Anexo la rutina:
VMIMPORT=0
DIMENSION Cifras(3,9)
Cifras(1,01)="UN"
Cifras(1,02)="DOS"
Cifras(1,03)="TRES"
Cifras(1,04)="CUATRO"
Cifras(1,05)="CINCO"
Cifras(1,06)="SEIS"
Cifras(1,07)="SIETE"
Cifras(1,08)="OCHO"
Cifras(1,09)="NUEVE"
Cifras(2,01)="ONCE"
Cifras(2,02)="DOCE"
Cifras(2,03)="TRECE"
Cifras(2,04)="CATORCE"
Cifras(2,05)="QUINCE"
Cifras(2,06)="DIECISEIS"
Cifras(2,07)="DIECISIETE"
Cifras(2,08)="DIECIOCHO"
Cifras(2,09)="DIECINUEVE"
Cifras(3,01)="DIEZ"
Cifras(3,02)="VEINTE"
Cifras(3,03)="TREINTA"
Cifras(3,04)="CUARENTA"
Cifras(3,05)="CINCUENTA"
Cifras(3,06)="SESENTA"
Cifras(3,07)="SETENTA"
Cifras(3,08)="OCHENTA"
Cifras(3,09)="NOVENTA"
*-*-*-
SELECT DATOSFAC
GO TOP
m.wimporte = TOTALFAC
VMIMPORT=VMIMPORT+M.WIMPORTE
m.wimpent = INT(m.wimporte)
m.wimpdec = (m.wimporte - INT(m.wimporte)) * 100
m.wimpletra = Numletra(INT(m.wimporte))
m.wimpletra = m.wimpletra + " PESOS "+ TRANSFORM(m.wimpdec,"99")+"/100 M.N."
REPLACE ALL MONTOLET WITH M.WIMPLETRA
RETURN
*********************
FUNCTION NumLetra
*********************
PARAMETERS Numero
PRIVATE NumeroL,Contador,PosReal,Cifra,CifraPos,CifraPos2
PRIVATE PosRelativa,Incremento,Anade,NumLetra
*** Comprueba si el N£mero es 0 y retorna
IF ABS(numero) > 999999999    <====== Aqui me marca error cuando se imp 2da vez
    RETURN "ERROR"
ENDIF
IF Numero=0
   RETURN "CERO"
ENDIF
NumeroL=RTRIM(LTRIM(STR(INT(Numero))))
NumLetra=""
IF LEFT(NumeroL,1)="-"
NumeroL=SUBSTR(NumeroL,2)
NumLetra="MENOS "
ENDIF
*** Comprueba que el n£mero este entre -999,999,999 y 999,999,999
Contador = 1

1 Respuesta

Respuesta
1
Si la rutina le funcionó bien la primera vez, esta bien y el problema no está ahí, verifique si en algún punto del proceso le cambia el tipo de dato a la variable que le marca el error, "Fuction argument value, type, or count is invalid'" esto es por el tipo de argumento, es decir, la primera vez llega con el tipo correcto y por eso funciona, la segunda llega con otro tipo y falla, verifique donde inicializa los valores y muy seguramente le cambia el tipo de dato.
Ok, pero ya probé inicializando dentro de la rutina numero=0 y de todas formas me marca el error, también probé poniendo la variable publica e inicializandola en cero y me da el mismo error. No entiendo
Escríbeme a mi correo y te envío mi rutina de monto nmumerico.
Esta tutina funciona perfectamente, úsala, solo pido se respete en las librerías el nombre del autor.
************************************************************************
*
* Autor         : Luis Enrique Agudelo Romero
* eMail         : [email protected]
* Descripción    : Procedimiento que el valor de un número en letras
* Fecha            : Diciembre 30 de 2001
* Sistema        : Uso general
* Formato         : General
* Ubicado en     : ..\Prgs\
*
* Uso : Montonum(234,.f.,"caja","s") Dos Cientos Treinta y Cuatro Cajas
*       Montonum(1,.f.,"caja","s") Una Caja
*       Montonum(8234,.f.,"Dolar","es") ocho Mil Dos Cientos Treinta y Cuatro Dolares
*       Montonum(8234.55,.f.,"Dolar","es") ocho Mil Dos Cientos Treinta y Cuatro Dolares Con 55/100
*
************************************************************************
Function Montonum
***********************
Parameter LuchoValor, Cents, Plata, Platas
Private LuchoNum, N1, N2, N3, N4, N5, Dec, Arm, Lon, Att, Con, i, Tmp, letras,Centavos
    N1 = ""
    N2 = ""
    N3 = ""
    N4 = ""
    N5 = ""
    LuchoNum = Alltrim(Str( LuchoValor,20,2))
    Att = At(".",LuchoNum)
    IF Att != 0
        Centavos = "Con " + Substr(LuchoNum,Att+1,len(LuchoNum)) + "/100"
        LuchoNum = Substr(LuchoNum,1,Att-1)
        Lon = Len(LuchoNum)
    ELSE
        Lon = Len(LuchoNum)
        Centavos = "Con 00/100"
    ENDIF
    Do While .t.
        Con = Lon / 3
        If Int(Con) != Con
            LuchoNum = Space(1)+LuchoNum
        Else
            Exit
        Endif
        Att = At(".",LuchoNum)
        If Att != 0
            Lon = Len(Substr(LuchoNum,1,Att))
        Else
            Lon = Len(LuchoNum)
        Endif
    ENDDO
    Letras = ""
    For i = 1 To Con
        Tmp = "N"+Str(i,1,0)
        &Tmp = Substr(LuchoNum,Lon+1-3,3)
        Lon = Lon - 3
        letras = RetLet(&Tmp,i-1) +letras
    Next
    If  LuchoValor > 1
        Letras = Letras + "" + Plata+platas
    Else
        Letras = Letras + "" + Plata
    Endif
    If Cents
        letras = Letras + " " + Centavos
    Endif
Return Letras
**************************
Function RetLet
**************************
Parameter LuchoValor, LuchoNum
Private I, Mle
Mle = ""
Do Case
    Case Substr(LuchoValor,1,1) = "1"
        Mle = "Cien"
        If val(Substr(LuchoValor,2,1)) != 0 or val(Substr(LuchoValor,3,1)) != 0
            Mle = Mle + "to "
        Else
            Mle = Mle + " "
        Endif
    Case Substr(LuchoValor,1,1) = "2"
        Mle = "DosCientos "
    Case Substr(LuchoValor,1,1) = "3"
        Mle = "TresCienTos "
    Case Substr(LuchoValor,1,1) = "4"
        Mle = "CuatroCientos "
    Case Substr(LuchoValor,1,1) = "5"
        Mle = "Quinientos "
    Case Substr(LuchoValor,1,1) = "6"
        Mle = "SeisCientos "
    Case Substr(LuchoValor,1,1) = "7"
        Mle = "SeteCientos "
    Case Substr(LuchoValor,1,1) = "8"
        Mle = "OchoCientos "
    Case Substr(LuchoValor,1,1) = "9"
        Mle = "NoveCientos "
EndCase
If Val(Substr(LuchoValor,2,2)) >= 11 and Val(Substr(LuchoValor,2,2)) <= 15
    Do Case
        Case Substr(LuchoValor,2,2) = "11"
            Mle = Mle + "Once "
        Case Substr(LuchoValor,2,2) = "12"
            Mle = Mle + "Doce "
        Case Substr(LuchoValor,2,2) = "13"
            Mle = Mle + "Trece "
        Case Substr(LuchoValor,2,2) = "14"
            Mle = Mle + "Catorce "
        Case Substr(LuchoValor,2,2) = "15"
            Mle = Mle + "Quince "
    EndCase
Else
    Do Case
        Case Substr(LuchoValor,2,1) = "1"
            Mle = Mle + "Diez "
        Case Substr(LuchoValor,2,1) = "2"
            IF Substr(LuchoValor,3,1) = "0"
                Mle = Mle + "Veinte"
            ELSE
                Mle = Mle + "Veinti"
            Endif
        Case Substr(LuchoValor,2,1) = "3"
            Mle = Mle + "Treinta "
        Case Substr(LuchoValor,2,1) = "4"
            Mle = Mle + "Cuarenta "
        Case Substr(LuchoValor,2,1) = "5"
            Mle = Mle + "Cincuenta "
        Case Substr(LuchoValor,2,1) = "6"
                Mle = Mle + "Sesenta "
        Case Substr(LuchoValor,2,1) = "7"
            Mle = Mle + "Setenta "
        Case Substr(LuchoValor,2,1) = "8"
            Mle = Mle + "Ochenta "
        Case Substr(LuchoValor,2,1) = "9"
            Mle = Mle + "Noventa "
    EndCase
    If val(Substr(LuchoValor,3,1)) != 0  and val(Substr(LuchoValor,2,1)) != 0 AND Substr(LuchoValor,2,1) != "2"
        Mle = Mle + "y "
    Endif
    Do Case
        Case Substr(LuchoValor,3,1) = "1"
            Mle = Mle + "Un "
        Case Substr(LuchoValor,3,1) = "2"
            Mle = Mle + "Dos "
        Case Substr(LuchoValor,3,1) = "3"
            Mle = Mle + "Tres "
        Case Substr(LuchoValor,3,1) = "4"
            Mle = Mle + "Cuatro "
        Case Substr(LuchoValor,3,1) = "5"
            Mle = Mle + "Cinco "
        Case Substr(LuchoValor,3,1) = "6"
            Mle = Mle + "Seis "
        Case Substr(LuchoValor,3,1) = "7"
            Mle = Mle + "Siete "
        Case Substr(LuchoValor,3,1) = "8"
            Mle = Mle + "Ocho "
        Case Substr(LuchoValor,3,1) = "9"
            Mle = Mle + "Nueve "
    EndCase
ENDIF
Do Case
    Case LuchoNum = 3 or LuchoNum = 1
        IF Val(LuchoValor) != 0
            Mle = Mle + "Mil "
        Endif
    Case LuchoNum = 2
        IF Substr(LuchoValor,3,1) = "1" AND Val(LuchoValor) = 1
            Mle = Mle + "Millon "
        ELSE
            Mle = Mle + "Millones "
        Endif
    Case LuchoNum = 4
        IF Substr(LuchoValor,3,1) = "1" AND Val(LuchoValor) = 1
            Mle = Mle + "Billon "
        ELSE
            Mle = Mle + "Billones "
        ENDIF
Endcase
Return Mle
Se me olvidó decir que esta función sirve para números desde -999,999,999,999,999 hasta 999,999,999,999,999
Se puede utilizar por sus parámetros para mostrar totales de cualquier cosa, CAJAS, PERROS, CABALLOS, PESOS, BOLÍVARES.
El parámetro booleano sirve para decirle a la función si quiere que muestre los centavos o no.
Y el tercero y cuarto parámetro es para manejar el tipo de objeto que se está contando, en tercero es el singular y el cuarto es el plural CAJA ES / DOLAR ES / BOLÍVAR ES, ETC.
Puede mostrar el resultado de 345.67así :
1. Trescientoscuarentaycinco pesos con 67/100
2. Trescientoscuarentaycinco pesos con
3. Trescientoscuarentaycinco pesos con sesentaysiete centavos.
Si no decifra cómo, escríbame a mi correo, esta en la función

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas