on 09-28-2012 5:24 PM
Hola
Estamos tratando de generar el complemento detallista a traves del EFM, pero uno de los campos requiere el importe con letra. Alguna idea de si esto se puede generar a traves del EFM (Electronic File Manager)
Saludos
Jacobo
El Stored procedured es el siguiente:
CREATE Procedure [dbo].[SP_NUMLETRAS]
--@Monto Numeric(10,0)
@Montodec Float
,@Codmon Char(3)
As
Set Nocount Off
-- Variables Para Descomposición Del Monto
Declare @Montodec2 Decimal(16,2)
Declare @Monto1 Integer
Declare @Monto Numeric(10,0)
Declare @Dec Decimal(16,2)
Declare @Dec_Char Char(2)
Declare @Dec_Char2 Char(20)
Declare @Declen Integer
Set @Montodec2 = @Montodec
Set @Monto1 = @Montodec2
Set @Monto = @Monto1
Set @Dec_Char2 = Convert(Char(20),@Montodec2)
Set @Declen = Len(@Dec_Char2)
Set @Dec_Char = Substring(@Dec_Char2,@Declen - 1,2)
Declare @Cociente Numeric(9,0)
,@Residuo Tinyint
,@Divtexto Char(12)
,@Divnumer Numeric(10,1)
,@Contapos Tinyint
-- Tabla Temporal Para Descomposición
-- Debido A Que No Una Estructura Tipo Array (Matriz)
Create Table #Sp_Numlet_Num (Cifra Tinyint, Posicion Tinyint)
-- Inicializa Contador De Posiciones
Set @Contapos = 1
-- Inicializa Cociente
Set @Cociente=999999999
-- Bucle De Descomposición Del Monto
While @Cociente > 0
Begin
-- Obtener El Cociente Y El Residuo
Set @Divnumer = @Monto/10
Set @Divtexto = Cast(@Divnumer As Char(12))
Set @Cociente = Cast(Left(@Divtexto, Len(@Divtexto)-2) As Numeric(9,0))
Set @Residuo = Cast(Right(Rtrim(@Divtexto), 1) As Tinyint)
Set @Monto = @Cociente
--Select @Divtexto As Division
-- ,@Cociente As Cociente
-- ,@Residuo As Residuo
-- Almacenar El Residuo En Tabla Temporal
Insert Into #Sp_Numlet_Num Values(@Residuo, @Contapos)
-- Aumenta Contador De Posiciones
Set @Contapos = @Contapos + 1
End
------------------------------------------------------------
-- Ahora Tenemos El Número Descompuesto En Tabla Temporal
-- La Primera Fila Comienza Con Las Unidades, Luego Decenas,
-- Centenas, Millares, Decenas De Millar, Etc
------------------------------------------------------------
-- Variables Para Armado Del Número En Letras
Declare @Cifra Tinyint
,@Posicion Tinyint
,@Textocif Varchar(12)
,@Textopos Varchar(10)
,@Flgcerod Bit
,@Flgceroc Bit
,@Flagdiez Bit
,@Flagmill Bit
,@Numletras Varchar(256)
-- Inicialización De Variable De Número En Letras
Set @Numletras = ''
-- Creación Del Cursor Para Bucle De Armado Ordenado Por Posición
-- De Mayor A Menor
Declare Cifras_Cursor Cursor Scroll For
Select Cifra, Posicion From #Sp_Numlet_Num Order By Posicion Desc
-- Abrir El Cursor
Open Cifras_Cursor
-- Traer El Primer Registro Del Cursor
Fetch Next From Cifras_Cursor Into @Cifra, @Posicion
-- Activación Flag Del Millones
If @Posicion > 7
Set @Flagmill = 1
Else
Set @Flagmill = 0
-- Bucle Para El Cursor
While @@Fetch_Status = 0
Begin
-- Inicialización Del Flags Cero (Para Cifra=0 En Posición Siguiente)
Set @Flgcerod = 0 -- Para Cifra = 0 En La Siguiente Posición
Set @Flgceroc = 0 -- Para Cifra = 0 En La Subsiguiente Posición
-- Cuando La Posición Actual Es Decena:
-- Salto 1 Registro Adelante Para Verificar Si La Cifra
-- Que En La Siguente Posición (Unidad) Es Cero
-- Cuando Cifra = 1 O Cifra = 2, Pone 'Diez' O 'Veinte'
-- Cuando Cifra = 3..9, No Pone ' Y '
If @Posicion In (2, 5, 😎
Begin
Fetch Next From Cifras_Cursor Into @Cifra, @Posicion
If @Cifra = 0
Set @Flgcerod = 1
-- Regreso A La Posición Anterior Del Cursor
Fetch Prior From Cifras_Cursor Into @Cifra, @Posicion
End
-- Cuando La Posición Actual Es Centena:
-- Salto 2 Registros Adelante Para Verificar Si La Cifra
-- Que En La Subsiguente Posición (Unidad) Es Cero
-- Si Cifra = 1, Pone 'Cien', Para Los Demas No Tiene Efecto
If @Posicion In (3, 6, 9)
Begin
Fetch Next From Cifras_Cursor Into @Cifra, @Posicion
Fetch Next From Cifras_Cursor Into @Cifra, @Posicion
If @Cifra = 0
Set @Flgceroc = 1
-- Regreso A La Posición Anterior Del Cursor
Fetch Prior From Cifras_Cursor Into @Cifra, @Posicion
Fetch Prior From Cifras_Cursor Into @Cifra, @Posicion
End
------------------------
-- Texto Para Las Cifras
------------------------
Set @Textocif = ''
-- Unidades
If @Posicion In(1, 4, 7, 10)
If @Flagdiez = 1
Set @Textocif =
Case @Cifra
When 1 Then 'ONCE '
When 2 Then 'DOCE '
When 3 Then 'TRECE '
When 4 Then 'CATORCE '
When 5 Then 'QUINCE '
When 6 Then 'DIECISEIS '
When 7 Then 'DIECISIETE '
When 8 Then 'DIECIOCHO '
When 9 Then 'DIECINUEVE '
End
Else
Set @Textocif =
Case @Cifra
When 1 Then 'UN '
When 2 Then 'DOS '
When 3 Then 'TRES '
When 4 Then 'CUATRO '
When 5 Then 'CINCO '
When 6 Then 'SEIS '
When 7 Then 'SIETE '
When 8 Then 'OCHO '
When 9 Then 'NUEVE '
End
-- Decenas
If @Posicion In(2, 5, 😎
If @Flgcerod = 1
Set @Textocif =
Case @Cifra
When 1 Then 'DIEZ '
When 2 Then 'VEINTE '
When 3 Then 'TREINTA '
When 4 Then 'CUARENTA '
When 5 Then 'CINCUENTA '
When 6 Then 'SESENTA '
When 7 Then 'SETENTA '
When 8 Then 'OCHENTA '
When 9 Then 'NOVENTA '
End
Else
Set @Textocif =
Case @Cifra
When 1 Then ''
When 2 Then 'VEINTI'
When 3 Then 'TREINTA Y '
When 4 Then 'CUARENTA Y '
When 5 Then 'CINCUENTA Y '
When 6 Then 'SESENTA Y '
When 7 Then 'SETENTA Y '
When 8 Then 'OCHENTA Y '
When 9 Then 'NOVENTA Y '
End
-- Centenas
If @Posicion In(3, 6, 9)
If @Flgceroc = 1 And @Cifra = 1
Set @Textocif = 'CIEN '
Else
Set @Textocif =
Case @Cifra
When 1 Then 'CIENTO '
When 2 Then 'DOS'
When 3 Then 'TRES'
When 4 Then 'CUATRO'
When 5 Then 'QUINIENTOS '
When 6 Then 'SEIS'
When 7 Then 'SETE'
When 8 Then 'OCHO'
When 9 Then 'NOVE'
End
----------------------------
-- Texto Para Las Posiciones
----------------------------
-- Inicialización Del Texto De La Posición
Set @Textopos = ''
-- Inicialización Del Flag De Diez
Set @Flagdiez = 0
-- Activación Del Flag De Diez
If @Posicion In(2, 5, 😎 And @Cifra = 1
Set @Flagdiez = 1
-- Texto De Posición De Centenas
If @Posicion In(3, 6, 9) And @Cifra Not In(0, 1, 5)
Set @Textopos = 'CIENTOS '
-- Texto De Posición De Millares
If @Posicion In(4, 10)
Set @Textopos = 'MIL '
-- Texto De Posición De Millones
If @Posicion = 7
If @Cifra = 1 And @Flagmill = 0
Set @Textopos = 'MILLON '
Else
Set @Textopos = 'MILLONES '
-- Concatenación Con De Texto Cifra Y Texto De La Posición
Set @Numletras = @Numletras + Isnull(@Textocif, '') + @Textopos
-- Trae El Siguiente Registro
Fetch Next From Cifras_Cursor Into @Cifra, @Posicion
End
-- Cierra El Cursor
Close Cifras_Cursor
Deallocate Cifras_Cursor
-- Busqueda De La Moneda
Declare @Nommon Char(20)
Select @Nommon = Case
when Currcode='MXP' then 'PESOS'
when Currcode='USD' then 'DÓLARES'
when Currcode='USB' then 'DÓLARES'
when Currcode='YEN' then ' YENES'
when Currcode='EUR' then 'EUROS'
End
From Ocrn Where Currcode = @Codmon
Declare @Nommon2 Char(20)
Select @Nommon2 = Case
when Currcode='MXP' then 'M.N.'
when Currcode='USD' then 'USD'
when Currcode='USB' then 'USD'
when Currcode='YEN' then ' '
when Currcode='EUR' then ''
End
From Ocrn Where Currcode = @Codmon
-- Concatenación Final Con Moneda
Set @Numletras = @Numletras + Rtrim(@Nommon) + ' ' + @Dec_Char + '/100 '+ @Nommon2
--
Select @Numletras As [Número En Letras]
Y despues tienes que poner el campo de usuario:
SP_NUMLETRAS $[OINV.DocTotal], $[OINV.DocCur]
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
segun lo que entiendo y lo poco que conozco... tienes que crear el campo de usuario en la factura y ponerle esta búsqueda formateada
DECLARE @Monto AS float, @Total AS float, @Pagares AS int, @Curr AS char(3), @Moneda AS char(10), @MN AS char (10),
@Idioma as char(2)
SET @Curr = $[OINV.DocCur.0.CHAR]
SET @Total = $[$29.0.NUMBER]
SET @Pagares = $[OINV.Installmnt.0.NUMBER]
SET @Monto = (SELECT ROUND(@Total / @Pagares, 2))
SET @Idioma = $[OINV.U_IME]
IF (@Curr = '$')
BEGIN
IF (@Idioma = 'ES')
BEGIN
SET @Moneda = 'PESOS'
SET @MN = 'M.N.'
EXEC MontoEnLetraFact @Monto, @Moneda, @MN
END
ELSE
BEGIN
SET @Moneda = 'PESOS'
SET @MN = 'M.N.'
EXEC MontoEnLetraFact1 @Monto, @Moneda, @MN
END
END
ELSE
BEGIN
IF (@Idioma = 'ES')
BEGIN
SET @Moneda = 'DOLARES'
SET @MN = 'U.S.D.'
EXEC MontoEnLetraFact @Monto, @Moneda, @MN
END
ELSE
BEGIN
SET @Moneda = 'DOLLARS'
SET @MN = 'U.S.D.'
EXEC MontoEnLetraFact1 @Monto, @Moneda, @MN
END
END
solo fijate si en BO usas $ o MXP
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
User | Count |
---|---|
95 | |
11 | |
11 | |
6 | |
6 | |
4 | |
4 | |
3 | |
3 | |
3 |
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.