Hola,
Ese documento tiene el código ABAP para generación del Código de Control de Servicio de Impuestos de Bolivia.
Yo hice una adaptación de un código PHP del sitio:
https://code.google.com/p/codigocontrol/
Crear Funcion ZSDBO_COD_CONTROL_GERA
Codigo de Funcion:
FUNCTION zsdbo_cod_control_gera.
*”———————————————————————-
*”*”Interfase local
*” IMPORTING
*” REFERENCE(I_FACTURA) TYPE VBRK-XBLNR
*” REFERENCE(I_NITCI) TYPE KNA1-STCD1
*” REFERENCE(I_FECHA) TYPE VBRK-FKDAT
*” REFERENCE(I_MONTO) TYPE VBRP-KZWI1
*” REFERENCE(I_BUKRS) TYPE BUKRS
*” EXPORTING
*” REFERENCE(E_COD_CONTROL) TYPE CHAR256
*”———————————————————————-
PERFORM z_inicia_dados.
PERFORM z_inicia_dados_verhoeff.
v_factura = i_factura.
v_nitci = i_nitci.
v_fecha = i_fecha.
IF v_nitci IS INITIAL.
“Cliente no tiene NIT – Cód. de Control no generado
MESSAGE i030(zsd).
EXIT.
ENDIF.
*Arredontamento do valor
v_monto = round( val = i_monto dec = 0 mode = cl_abap_math=>round_half_up ).
SHIFT v_monto LEFT DELETING LEADING space.
SELECT SINGLE *
FROM ztsd068 INTO str_ztsd068
WHERE bukrs = i_bukrs
AND datbi GE v_fecha
AND datab LE v_fecha.
WRITE str_ztsd068–autoriza TO v_autorizacion LEFT-JUSTIFIED.
WRITE str_ztsd068–dosifica TO v_llave LEFT-JUSTIFIED.
**********************************************************************
**Testes
* v_factura = ‘152’.
* v_nitci = ‘1026469026’.
**ano / mes /dia
* v_fecha = ‘20070728’.
* v_monto = ‘135’.
* v_llave = ‘A3Fs4s$)2cvD(eY667A5C4A2rsdf53kw9654E2B23s24df35F5’.
* v_autorizacion = ‘79040011859’.
**********************************************************************
PERFORM verhoeff_add_recursive USING v_factura ‘2’.
PERFORM verhoeff_add_recursive USING v_nitci ‘2’.
PERFORM verhoeff_add_recursive USING v_fecha ‘2’.
PERFORM verhoeff_add_recursive USING v_monto ‘2’.
v_factura_n = v_factura.
v_nitci_n = v_nitci.
v_fecha_n = v_fecha.
v_monto_n = v_monto.
v_suma_n = v_factura_n + v_nitci_n + v_fecha_n + v_monto_n.
WRITE v_suma_n TO v_suma NO-ZERO LEFT-JUSTIFIED .
SHIFT v_suma LEFT DELETING LEADING space.
PERFORM verhoeff_add_recursive USING v_suma ‘5’.
* // paso2
v_len = strlen( v_suma ) – 5.
v_digitos = substring( val = v_suma off = v_len len = 5 ).
CLEAR: v_len, v_sub_llave.
v_len = v_digitos(1) + 1.
v_sub_llave = substring( val = v_llave off = 0 len = v_len ).
v_len_a = v_len_a + v_len.
CONCATENATE v_autorizacion
v_sub_llave
INTO v_autorizacion.
CLEAR: v_len, v_sub_llave.
v_len = v_digitos+1(1) + 1.
v_sub_llave = substring( val = v_llave off = v_len_a len = v_len ).
v_len_a = v_len_a + v_len.
CONCATENATE v_factura
v_sub_llave
INTO v_factura.
CLEAR: v_len, v_sub_llave.
v_len = v_digitos+2(1) + 1.
v_sub_llave = substring( val = v_llave off = v_len_a len = v_len ).
v_len_a = v_len_a + v_len.
CONCATENATE v_nitci
v_sub_llave
INTO v_nitci.
CLEAR: v_len, v_sub_llave.
v_len = v_digitos+3(1) + 1.
v_sub_llave = substring( val = v_llave off = v_len_a len = v_len ).
v_len_a = v_len_a + v_len.
CONCATENATE v_fecha
v_sub_llave
INTO v_fecha.
*Alteracao DC – Inicio
*Verificar tamanho para nao dar out of bounds.
CLEAR: v_len, v_sub_llave.
v_len = v_digitos+4(1) + 1.
*–
v_len_max = v_len_a + v_len.
v_len_llave = strlen( v_llave ).
v_len_aux = v_len_max – v_len_llave.
IF v_len_aux > 0.
v_len = v_len – v_len_aux.
ENDIF.
*–
v_sub_llave = substring( val = v_llave off = v_len_a len = v_len ).
v_len_a = v_len_a + v_len.
*Alteracao DC – Fim
CONCATENATE v_monto
v_sub_llave
INTO v_monto.
* // paso3
CONCATENATE v_autorizacion
v_factura
v_nitci
v_fecha
v_monto
INTO v_mensaje.
CONCATENATE v_llave
v_digitos
INTO v_llaverc4.
PERFORM allegedrc4 USING v_mensaje
v_llaverc4
v_arc4.
* // paso4
v_suma_total = 0.
v_sumas1 = 0.
str_sumas–line = 0. APPEND str_sumas TO tbl_sumas.
str_sumas–line = 0. APPEND str_sumas TO tbl_sumas.
str_sumas–line = 0. APPEND str_sumas TO tbl_sumas.
str_sumas–line = 0. APPEND str_sumas TO tbl_sumas.
v_strlen_arc4 = strlen( v_arc4 ).
v_i = 0.
WHILE v_i < v_strlen_arc4.
CALL METHOD cl_abap_conv_out_ce=>uccpi
EXPORTING
char = v_arc4+v_i(1)
RECEIVING
uccp = v_x.
v_aux = v_i MOD 5.
IF v_aux = 0.
v_sumas1 = v_sumas1 + v_x.
ELSE.
READ TABLE tbl_sumas INTO str_sumas INDEX v_aux.
str_sumas–line = str_sumas–line + v_x.
MODIFY tbl_sumas FROM str_sumas INDEX v_aux.
ENDIF.
v_suma_total = v_suma_total + v_x.
v_i = v_i + 1.
ENDWHILE.
* // paso5
v_total = 0.
v_stsp = v_sumas1 * v_suma_total.
v_digitossum = v_digitos(1) + 1.
v_dec2 = v_stsp / v_digitossum.
v_stsp = trunc( v_dec2 ).
v_total = v_total + v_stsp.
v_i = 1.
LOOP AT tbl_sumas INTO str_sumas.
v_digitossum = v_digitos+v_i(1) + 1.
v_stsp = str_sumas–line * v_suma_total.
v_dec2 = v_stsp / v_digitossum.
v_stsp = trunc( v_dec2 ).
v_total = v_total + v_stsp.
v_i = v_i + 1.
ENDLOOP.
PERFORM big_base_convert USING v_total
’64’
v_mensaje.
PERFORM allegedrc4 USING v_mensaje
v_llaverc4
v_codcontrol_raw.
v_len = strlen( v_codcontrol_raw ).
IF v_len = 10.
WRITE: v_codcontrol_raw TO v_codcontrol USING EDIT MASK ‘__-__-__-__-__’.
ELSEIF v_len = 8.
WRITE: v_codcontrol_raw TO v_codcontrol USING EDIT MASK ‘__-__-__-__’.
ELSE.
WRITE: v_codcontrol_raw TO v_codcontrol USING EDIT MASK ‘__-__-__’.
ENDIF.
e_cod_control = v_codcontrol.
ENDFUNCTION.
Forms Include (LZSDBO_COD_CONTROLF01):
*———————————————————————-*
***INCLUDE LZSDBO_COD_CONTROLF01 .
*———————————————————————-*
*&———————————————————————*
*& Form Z_INICIA_DADOS
*&———————————————————————*
* text
*———————————————————————-*
FORM z_inicia_dados .
CLEAR: tbl_table_d, tbl_table_p, tbl_state, tbl_sumas.
CLEAR: str_table, str_ztsd068.
CLEAR: str_state, str_state1, str_state2, str_sumas.
CLEAR: v_autorizacion, v_factura, v_nitci, v_fecha, v_monto,
v_llave, v_codigo, v_suma, v_suma_n, v_factura_n,
v_nitci_n, v_fecha_n, v_monto_n, v_d, v_p, v_inv.
CLEAR: v_digitos, v_len, v_len_a, v_sub_llave.
CLEAR: v_mensaje, v_llaverc4, v_arc4, v_codcontrol_raw, v_codcontrol.
CLEAR: v_suma_total, v_strlen_arc4, v_sumas1, v_i, v_x, v_aux,
v_total, v_stsp, v_digitossum, v_dec2.
ENDFORM. ” Z_INICIA_DADOS
*&———————————————————————*
*& Form Z_INICIA_DADOS_VERHOEFF
*&———————————————————————*
* Tabelas p/ Verhoeff
*———————————————————————-*
FORM z_inicia_dados_verhoeff .
*Tabela D
v_d = ‘0123456789’.
str_table = ‘1234067895’.
APPEND str_table TO tbl_table_d.
str_table = ‘2340178956’.
APPEND str_table TO tbl_table_d.
str_table = ‘3401289567’.
APPEND str_table TO tbl_table_d.
str_table = ‘4012395678’.
APPEND str_table TO tbl_table_d.
str_table = ‘5987604321’.
APPEND str_table TO tbl_table_d.
str_table = ‘6598710432’.
APPEND str_table TO tbl_table_d.
str_table = ‘7659821043’.
APPEND str_table TO tbl_table_d.
str_table = ‘8765932104’.
APPEND str_table TO tbl_table_d.
str_table = ‘9876543210’.
APPEND str_table TO tbl_table_d.
*Tabela P
v_p = ‘0123456789’.
str_table = ‘1576283094’.
APPEND str_table TO tbl_table_p.
str_table = ‘5803796142’.
APPEND str_table TO tbl_table_p.
str_table = ‘8916043527’.
APPEND str_table TO tbl_table_p.
str_table = ‘9453126870’.
APPEND str_table TO tbl_table_p.
str_table = ‘4286573901’.
APPEND str_table TO tbl_table_p.
str_table = ‘2793806415’.
APPEND str_table TO tbl_table_p.
str_table = ‘7046913258’.
APPEND str_table TO tbl_table_p.
*Inv
v_inv = ‘0432156789’.
ENDFORM. ” Z_INICIA_DADOS_VERHOEFF
*&———————————————————————*
*& Form big_base_convert
*&———————————————————————*
* * Conversion de numeros en base 10 a base 64 o 16
*———————————————————————-*
* * @param string $numero: numero a convertir
* * @param string $base: Opcional, convierte a la base indicada
* * @return string: numero convertido
*———————————————————————-*
FORM big_base_convert USING u_numero
u_base
u_cifrado.
DATA: lv_numero TYPE i,
lv_base TYPE i,
lv_cociente TYPE i,
lv_resto TYPE i,
lv_palabra TYPE char256.
DATA: tbl_dic TYPE TABLE OF char1,
str_dic TYPE char1.
lv_numero = u_numero.
lv_base = u_base.
str_dic = ‘1’. APPEND str_dic TO tbl_dic.
str_dic = ‘2’. APPEND str_dic TO tbl_dic.
str_dic = ‘3’. APPEND str_dic TO tbl_dic.
str_dic = ‘4’. APPEND str_dic TO tbl_dic.
str_dic = ‘5’. APPEND str_dic TO tbl_dic.
str_dic = ‘6’.APPEND str_dic TO tbl_dic.
str_dic = ‘7’.APPEND str_dic TO tbl_dic.
str_dic = ‘8’.APPEND str_dic TO tbl_dic.
str_dic = ‘9’.APPEND str_dic TO tbl_dic.
str_dic = ‘A’.APPEND str_dic TO tbl_dic.
str_dic = ‘B’.APPEND str_dic TO tbl_dic.
str_dic = ‘C’.APPEND str_dic TO tbl_dic.
str_dic = ‘D’.APPEND str_dic TO tbl_dic.
str_dic = ‘E’.APPEND str_dic TO tbl_dic.
str_dic = ‘F’.APPEND str_dic TO tbl_dic.
str_dic = ‘G’.APPEND str_dic TO tbl_dic.
str_dic = ‘H’.APPEND str_dic TO tbl_dic.
str_dic = ‘I’.APPEND str_dic TO tbl_dic.
str_dic = ‘J’.APPEND str_dic TO tbl_dic.
str_dic = ‘K’.APPEND str_dic TO tbl_dic.
str_dic = ‘L’.APPEND str_dic TO tbl_dic.
str_dic = ‘M’.APPEND str_dic TO tbl_dic.
str_dic = ‘N’.APPEND str_dic TO tbl_dic.
str_dic = ‘O’.APPEND str_dic TO tbl_dic.
str_dic = ‘P’.APPEND str_dic TO tbl_dic.
str_dic = ‘Q’.APPEND str_dic TO tbl_dic.
str_dic = ‘R’.APPEND str_dic TO tbl_dic.
str_dic = ‘S’.APPEND str_dic TO tbl_dic.
str_dic = ‘T’.APPEND str_dic TO tbl_dic.
str_dic = ‘U’.APPEND str_dic TO tbl_dic.
str_dic = ‘V’.APPEND str_dic TO tbl_dic.
str_dic = ‘W’.APPEND str_dic TO tbl_dic.
str_dic = ‘X’.APPEND str_dic TO tbl_dic.
str_dic = ‘Y’.APPEND str_dic TO tbl_dic.
str_dic = ‘Z’.APPEND str_dic TO tbl_dic.
str_dic = ‘a’.APPEND str_dic TO tbl_dic.
str_dic = ‘b’.APPEND str_dic TO tbl_dic.
str_dic = ‘c’.APPEND str_dic TO tbl_dic.
str_dic = ‘d’.APPEND str_dic TO tbl_dic.
str_dic = ‘e’.APPEND str_dic TO tbl_dic.
str_dic = ‘f’.APPEND str_dic TO tbl_dic.
str_dic = ‘g’.APPEND str_dic TO tbl_dic.
str_dic = ‘h’.APPEND str_dic TO tbl_dic.
str_dic = ‘i’.APPEND str_dic TO tbl_dic.
str_dic = ‘j’.APPEND str_dic TO tbl_dic.
str_dic = ‘k’.APPEND str_dic TO tbl_dic.
str_dic = ‘l’.APPEND str_dic TO tbl_dic.
str_dic = ‘m’.APPEND str_dic TO tbl_dic.
str_dic = ‘n’.APPEND str_dic TO tbl_dic.
str_dic = ‘o’.APPEND str_dic TO tbl_dic.
str_dic = ‘p’.APPEND str_dic TO tbl_dic.
str_dic = ‘q’.APPEND str_dic TO tbl_dic.
str_dic = ‘r’.APPEND str_dic TO tbl_dic.
str_dic = ‘s’.APPEND str_dic TO tbl_dic.
str_dic = ‘t’.APPEND str_dic TO tbl_dic.
str_dic = ‘u’.APPEND str_dic TO tbl_dic.
str_dic = ‘v’.APPEND str_dic TO tbl_dic.
str_dic = ‘w’.APPEND str_dic TO tbl_dic.
str_dic = ‘x’.APPEND str_dic TO tbl_dic.
str_dic = ‘y’.APPEND str_dic TO tbl_dic.
str_dic = ‘z’.APPEND str_dic TO tbl_dic.
str_dic = ‘+’.APPEND str_dic TO tbl_dic.
str_dic = ‘/’. APPEND str_dic TO tbl_dic.
lv_cociente = 1.
WHILE lv_cociente <> 0.
lv_cociente = lv_numero DIV lv_base.
lv_resto = lv_numero MOD lv_base.
IF lv_resto = 0.
str_dic = ‘0’.
ELSE.
READ TABLE tbl_dic INTO str_dic INDEX lv_resto.
ENDIF.
CONCATENATE str_dic
lv_palabra
INTO lv_palabra.
lv_numero = lv_cociente.
ENDWHILE.
IF strlen( lv_palabra ) = 1.
CONCATENATE ‘0’
lv_palabra
INTO lv_palabra.
ENDIF.
u_cifrado = lv_palabra.
ENDFORM. “big_base_convert
*&———————————————————————*
*& Form allegedrc4
*&———————————————————————*
* * Algoritmo Alleged RC4
*———————————————————————-*
* * @param string $mensaje: mensaje a cifrar
* * @param string $llave: llave a utilizar para el cifrado
* * @return string: cadena cifrada
*———————————————————————-*
FORM allegedrc4 USING u_mensaje TYPE char256
u_llaverc4 TYPE char256
u_arc4 TYPE char256.
DATA:
lv_x TYPE i,
lv_y TYPE i,
lv_index1 TYPE i,
lv_index2 TYPE i,
lv_nmen TYPE i,
lv_i TYPE i,
lv_cifrado TYPE char256,
lv_strlen_llave TYPE i,
lv_strlen_mensaje TYPE i,
lv_uccp TYPE i,
lv_z TYPE i.
DATA: lv_bita TYPE x,
lv_bitb TYPE x,
lv_bitc TYPE x.
CLEAR: tbl_state, str_state1.
lv_x = 0.
lv_y = 0.
lv_index1 = 0.
lv_index2 = 0.
lv_nmen = 0.
lv_i = 1.
str_state–line = 0.
DO 256 TIMES.
str_state1–line = lv_i.
APPEND str_state1 TO tbl_state.
lv_i = lv_i + 1.
ENDDO.
lv_i = 0.
lv_strlen_llave = strlen( u_llaverc4 ).
lv_strlen_mensaje = strlen( u_mensaje ).
WHILE lv_i < 256.
CALL METHOD cl_abap_conv_out_ce=>uccpi
EXPORTING
char = u_llaverc4+lv_index1(1)
RECEIVING
uccp = lv_uccp.
IF lv_i = 0.
str_state1 = str_state.
ELSE.
READ TABLE tbl_state INTO str_state1 INDEX lv_i.
ENDIF.
lv_index2 = ( lv_uccp + str_state1–line + lv_index2 ) MOD 256.
*READ
IF lv_i = 0.
str_state1 = str_state.
ELSE.
READ TABLE tbl_state INTO str_state1 INDEX lv_i.
ENDIF.
*–
IF lv_index2 = 0.
str_state2 = str_state.
ELSE.
READ TABLE tbl_state INTO str_state2 INDEX lv_index2.
ENDIF.
*SWAP
IF lv_i = 0.
str_state = str_state2.
ELSE.
MODIFY tbl_state FROM str_state2 INDEX lv_i.
ENDIF.
*–
IF lv_index2 = 0.
str_state = str_state1.
ELSE.
MODIFY tbl_state FROM str_state1 INDEX lv_index2.
ENDIF.
lv_index1 = ( lv_index1 + 1 ) MOD lv_strlen_llave.
lv_i = lv_i + 1.
ENDWHILE.
lv_i = 0.
WHILE lv_i < lv_strlen_mensaje.
lv_x = ( lv_x + 1 ) MOD 256.
IF lv_x = 0.
str_state1 = str_state.
ELSE.
READ TABLE tbl_state INTO str_state1 INDEX lv_x.
ENDIF.
lv_y = ( str_state1–line + lv_y ) MOD 256.
*READ
IF lv_x = 0.
str_state1 = str_state.
ELSE.
READ TABLE tbl_state INTO str_state1 INDEX lv_x.
ENDIF.
*–
IF lv_y = 0.
str_state2 = str_state.
ELSE.
READ TABLE tbl_state INTO str_state2 INDEX lv_y.
ENDIF.
*SWAP
IF lv_x = 0.
str_state = str_state2.
ELSE.
MODIFY tbl_state FROM str_state2 INDEX lv_x.
ENDIF.
*–
IF lv_y = 0.
str_state = str_state1.
ELSE.
MODIFY tbl_state FROM str_state1 INDEX lv_y.
ENDIF.
* ^ = XOR function
CALL METHOD cl_abap_conv_out_ce=>uccpi
EXPORTING
char = u_mensaje+lv_i(1)
RECEIVING
uccp = lv_uccp.
*READ
IF lv_x = 0.
str_state1 = str_state.
ELSE.
READ TABLE tbl_state INTO str_state1 INDEX lv_x.
ENDIF.
*–
IF lv_y = 0.
str_state2 = str_state.
ELSE.
READ TABLE tbl_state INTO str_state2 INDEX lv_y.
ENDIF.
lv_z = ( str_state1–line + str_state2–line ) MOD 256.
IF lv_z = 0.
str_state1 = str_state.
ELSE.
READ TABLE tbl_state INTO str_state1 INDEX lv_z.
ENDIF.
lv_bita = lv_uccp.
lv_bitb = str_state1–line.
lv_bitc = lv_bita BIT-XOR lv_bitb.
lv_nmen = lv_bitc.
PERFORM big_base_convert USING lv_nmen
’16’
lv_cifrado.
CONCATENATE u_arc4
lv_cifrado
INTO u_arc4.
lv_i = lv_i + 1.
ENDWHILE.
ENDFORM. “allegedrc4
*&———————————————————————*
*& Form calcsum
*&———————————————————————*
* text
*———————————————————————-*
* –>U_NUMBER text
*———————————————————————-*
FORM calcsum USING u_number.
DATA: lv_c TYPE char256,
lv_n TYPE char256,
lv_len TYPE char256,
lv_i TYPE i,
lv_ni TYPE char256,
lv_i8 TYPE char256,
lv_pini TYPE char256.
DATA: lv_char1 TYPE char256,
lv_char2 TYPE char256.
lv_n = u_number.
CALL FUNCTION ‘STRING_REVERSE’
EXPORTING
string = lv_n
lang = ‘E’
IMPORTING
rstring = lv_n
EXCEPTIONS
too_small = 1
OTHERS = 2.
IF sy–subrc <> 0.
* Implement suitable error handling here
ENDIF.
lv_c = 0.
lv_i = 0.
lv_len = strlen( lv_n ).
WHILE lv_i < lv_len.
lv_ni = lv_n+lv_i(1).
lv_i8 = ( ( lv_i + 1 ) MOD 8 ).
IF lv_i8 = 0.
lv_pini = v_p+lv_ni(1).
ELSE.
READ TABLE tbl_table_p INTO str_table INDEX lv_i8.
lv_pini = str_table–line+lv_ni(1).
ENDIF.
IF lv_c = 0.
lv_c = v_d+lv_pini(1).
ELSE.
READ TABLE tbl_table_d INTO str_table INDEX lv_c.
lv_c = str_table–line+lv_pini(1).
ENDIF.
lv_i = lv_i + 1.
ENDWHILE .
WRITE u_number TO lv_char1 LEFT-JUSTIFIED.
lv_char2 = v_inv+lv_c(1).
CONCATENATE lv_char1
lv_char2
INTO lv_char1.
u_number = lv_char1.
ENDFORM. “calcsum
*&———————————————————————*
*& Form verhoeff_add_recursive
*&———————————————————————*
* text
*———————————————————————-*
* –>V_NUMBER text
* –>V_DIGITS text
*———————————————————————-*
FORM verhoeff_add_recursive USING u_number
u_digits.
DATA: lv_temp TYPE char256,
lv_aux TYPE i.
lv_temp = u_number.
lv_aux = u_digits.
WHILE lv_aux > 0.
PERFORM calcsum USING lv_temp.
lv_aux = lv_aux – 1.
ENDWHILE.
u_number = lv_temp.
ENDFORM. “verhoeff_add_recursive
TOP Include:
FUNCTION-POOL zsdbo_cod_control. “MESSAGE-ID ..
***********************************************************************
* Tipos
***********************************************************************
*Types
TYPES: BEGIN OF ty_table,
line(10) TYPE c,
END OF ty_table.
TYPES: BEGIN OF typ_state,
line TYPE i,
END OF typ_state.
***********************************************************************
* Tabelas e Estruturas
***********************************************************************
*Tabelas
DATA: tbl_table_d TYPE TABLE OF ty_table,
tbl_table_p TYPE TABLE OF ty_table.
DATA: tbl_state TYPE TABLE OF typ_state.
DATA: tbl_sumas TYPE TABLE OF typ_state.
*Estruturas
DATA: str_table TYPE ty_table,
str_ztsd068 TYPE ztsd068.
DATA: str_state TYPE typ_state,
str_state1 TYPE typ_state,
str_state2 TYPE typ_state.
DATA: str_sumas TYPE typ_state.
***********************************************************************
* Variaveis
***********************************************************************
*Variaveis
DATA: v_autorizacion TYPE char256, “nro de autorizacion de la factura
v_factura TYPE char256, “nro de factura
v_nitci TYPE char256, “nit o ci del cliente
v_fecha TYPE char256, “fecha de la transaccion (Ymd)
“e.g. para el 10/08/2010: 20100810
v_monto TYPE char256, “monto de la transaccion sin decimales
v_llave TYPE char256, “llave de dosificacion
v_codigo TYPE char256, “codigo de control generado
v_suma TYPE char256. “Somatoria.
DATA: v_suma_n(256) TYPE n,
v_factura_n(256) TYPE n,
v_nitci_n(256) TYPE n,
v_fecha_n(256) TYPE n,
v_monto_n(256) TYPE n.
DATA: v_d(10) TYPE c,
v_p(10) TYPE c,
v_inv(10) TYPE c.
DATA: v_digitos(5) TYPE n,
v_len TYPE i,
v_len_a TYPE i,
v_sub_llave TYPE char256.
DATA: v_mensaje TYPE char256,
v_llaverc4 TYPE char256,
v_arc4 TYPE char256,
v_codcontrol_raw TYPE char256,
v_codcontrol TYPE char256.
DATA: v_suma_total TYPE i,
v_strlen_arc4 TYPE i,
v_sumas1 TYPE i,
v_i TYPE i,
v_x TYPE i,
v_aux TYPE i,
v_total TYPE i,
v_stsp TYPE i,
v_digitossum TYPE i,
v_dec2 TYPE p DECIMALS 2.
DATA: v_len_max TYPE i,
v_len_llave TYPE i,
v_len_aux type i.
Saludos,
Dalmo Costa
Hola Amigo, buenas tardes.
Una pregunta, que campos y que valores tienes definidos en esta tabla?
ztsd068
Espero y me puedas apoyar.
Saludos,
Jesus Martinez
This code helps a lot. The custom table mentioned on this code would need to be adjusted based on your client but that should be straight forward.