MUNDOSAP

Regresar   MUNDOSAP > DESARROLLO > Programación ABAP IV
Nombre de Usuario
Contraseña
Home Descargas Registrar FAQ Miembros Calendario Buscar Temas de Hoy Marcar Foros Como Leídos




 
Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Viejo 10/09/15, 12:51:24
Koriotto Koriotto is offline
Junior Member
 
Fecha de Ingreso: mar 2014
Mensajes: 24
Question (RUC) DV - Dígito Verificador Panamá

Hola a todos,

Les agradecería mucho me puedan ayudar con este tema.

Alguien tiene el código para devolver o calcular el dígito verificador (DV) a partir del RUC ó cédula de un contribuyente de Panamá?

He encontrado en la página oficial el algoritmo pero no esta nada claro por las casuísticas de RUC que presenta.

Gracias de antemano por la ayuda.
Responder Con Cita
  #2  
Viejo 11/12/15, 07:20:45
Koriotto Koriotto is offline
Junior Member
 
Fecha de Ingreso: mar 2014
Mensajes: 24
Listo

Me respondo yo solo la solución ya esta creada, gracias por su atención.
Responder Con Cita
  #3  
Viejo 11/12/15, 12:44:11
sconoredhot sconoredhot is offline
Senior Member
 
Fecha de Ingreso: feb 2008
Localización: Argentina, Rosario
Mensajes: 341
Smile hola

Podrias compartirla?
__________________
Sebas

Desarrollador ABAP.
Responder Con Cita
  #4  
Viejo 07/03/16, 07:43:39
Koriotto Koriotto is offline
Junior Member
 
Fecha de Ingreso: mar 2014
Mensajes: 24
FUNCTION Y_VALIDAR_RUC_PANAMA.
*"--------------------------------------------------------------------
*" IMPORTING
*" REFERENCE(I_RUC) “RUC a validar
*" REFERENCE(I_DV) “DV a evaluar (No tiene "-")
*" REFERENCE(I_TIPO) “Tipo 1 pers. natural, Tipo 2 pers. jurídica *" EXPORTING
*" REFERENCE(O_DV) “DV obtenido (debe coincidir con I_DV)
*" EXCEPTIONS
*" WRONG_DV

DATA: lv_ruc_in TYPE char20.
lv_i_ruc TYPE lfa1-stcd5,
lv_dv TYPE lfa1-stcd2,
lv_ructb TYPE char21,
lv_dv_length TYPE i,
lv_sw TYPE flag,
lv_ref TYPE char2,
lv_ind TYPE i, "Indice
lv_peso TYPE i VALUE 2, "Peso
lv_suma TYPE p DECIMALS 0, "acumulador
lv_dv1 TYPE i, "Calculated DV 1
lv_dv2 TYPE i, "Calculated DV 2
lv_dv1_c TYPE char1,
lv_dv2_c TYPE char1,
lv_dv_in TYPE char2,
lv_dv_out TYPE char2,
lv_repet TYPE flag,
lv_resto TYPE i,
lv_divisor TYPE i VALUE 11,
ls_error TYPE REF TO cx_sy_conversion_no_number.

lv_ruc_in = i_ruc.
lv_dv = i_dv.

lv_dv_length = strlen( lv_dv ).
IF lv_dv_length EQ 1.
CONCATENATE '0' lv_dv INTO lv_dv.
ENDIF.

TRANSLATE lv_dv USING ' 0'.

IF i_tipo EQ 3.
EXIT.
ENDIF.

CONDENSE lv_dv NO-GAPS.
MOVE lv_dv TO lv_dv_in.

PERFORM zf_init_values.
lv_i_ruc = i_ruc.

PERFORM zf_format_ruc USING i_tipo
CHANGING lv_i_ruc.

SHIFT lv_ruc_in RIGHT DELETING TRAILING space.
TRANSLATE lv_ruc_in USING ' 0'.
MOVE lv_ruc_in TO lv_ructb.

IF lv_ructb+6(1) EQ 'N' OR
lv_ructb+7(1) EQ 'N' OR
lv_ructb+10(1) EQ 'N'.
* Rutina de Personas naturales y números tributarios
IF lv_ructb+6(1) EQ 'N'.
lv_ructb+6(1) = '5'.
ELSEIF lv_ructb+7(1) EQ 'N'.
lv_ructb+7(1) = '5'.
ENDIF.

IF lv_ructb+10(1) EQ 'N' AND lv_ructb+11(1) EQ 'T'.
"Nros Tributarios o Naturalizados
lv_ructb+10(1) = '4'.
lv_ructb+11(1) = '3'.

ELSEIF lv_ructb CS 'PE'." Panameño Extranjero
TRANSLATE lv_ructb USING 'P7'.
TRANSLATE lv_ructb USING 'E5'.

ELSEIF lv_ructb CS 'PI'."Panameño Indigena
TRANSLATE lv_ructb USING 'P7'.
TRANSLATE lv_ructb USING 'I9'.

ELSEIF lv_ructb CS 'AV'."Antes vigencia
TRANSLATE lv_ructb USING 'A1'.
TRANSLATE lv_ructb USING 'V5'.
"Extranjero
ELSEIF lv_ructb CS 'E'. "Extranjero
TRANSLATE lv_ructb USING 'E5'.
* Incluir caso "N"
ELSEIF lv_ructb CS 'N'. "Caso 'N'
TRANSLATE lv_ructb USING 'N4'.
ENDIF.

ELSEIF lv_ructb+7(1) NE 'N'."Persona jurídica

IF lv_ructb+3(1) EQ '0' AND lv_ructb+4(1) EQ '0' AND lv_ructb+5(1) < 5. "Formato antiguo
lv_sw = 'X'.
* Rutina de referencia cruzada
CONCATENATE lv_ructb+5(1) lv_ructb+6(1) INTO lv_ref.
READ TABLE it_arr WITH KEY arr_val = lv_ref.
IF sy-subrc EQ 0.
lv_ructb+5(1) = 0.
lv_ructb+6(1) = it_arr-arr_dig.
ENDIF.
ENDIF.
ENDIF.

****RUTINA DV
* Primer digito
DATA: v_valor TYPE i.
lv_ind = 19.
lv_peso = 2.
lv_suma = 0.
lv_repet = lv_sw.
DO 20 TIMES.
IF lv_peso = 12 AND lv_repet EQ 'X'.
lv_peso = lv_peso - 1.
CLEAR lv_repet.
ENDIF.

TRY.
v_valor = lv_ructb+lv_ind(1).
CATCH cx_sy_conversion_no_number INTO ls_error.
ENDTRY.

lv_suma = lv_suma + ( lv_peso * v_valor ).
lv_peso = lv_peso + 1.
lv_ind = lv_ind - 1.
ENDDO.

IF lv_suma > 0.

lv_resto = lv_suma MOD lv_divisor.

IF lv_resto EQ 0 OR lv_resto EQ 1.
lv_dv1 = 0.
ELSE.
lv_dv1 = lv_divisor - lv_resto.
lv_ructb+20(1) = lv_dv1.
ENDIF.
ENDIF.

* Segundo dígito
CLEAR: lv_resto.
lv_ind = 20.
lv_peso = 2.
lv_suma = 0.
lv_repet = lv_sw.
DO 21 TIMES.
IF lv_peso = 12 AND lv_repet EQ 'X'.
lv_peso = lv_peso - 1.
CLEAR lv_repet.
ENDIF.

TRY.
v_valor = lv_ructb+lv_ind(1).
CATCH cx_sy_conversion_no_number INTO ls_error.
ENDTRY.

lv_suma = lv_suma + ( lv_peso * v_valor ).
lv_peso = lv_peso + 1.
lv_ind = lv_ind - 1.
ENDDO.

IF lv_suma > 0.

lv_resto = lv_suma MOD lv_divisor.

IF lv_resto EQ 0 OR lv_resto EQ 1.
lv_dv2 = 0.
ELSE.
lv_dv2 = lv_divisor - lv_resto.
ENDIF.
ENDIF.

lv_dv1_c = lv_dv1.
lv_dv2_c = lv_dv2.
CONCATENATE lv_dv1_c lv_dv2_c INTO lv_dv_out.

o_dv = lv_dv_out.
IF lv_dv_in NE lv_dv_out.
RAISE wrong_dv.
ELSE.
ENDIF.

ENDFUNCTION.

*&---------------------------------------------------------------------*
*& Form ZF_INIT_VALUES
*&---------------------------------------------------------------------*
FORM zf_init_values .

it_arr-arr_val = 00.
it_arr-arr_dig = 0.
APPEND it_arr.
it_arr-arr_val = 10.
it_arr-arr_dig = 1.
APPEND it_arr.
it_arr-arr_val = 11.
it_arr-arr_dig = 2.
APPEND it_arr.
it_arr-arr_val = 12.
it_arr-arr_dig = 3.
APPEND it_arr.
it_arr-arr_val = 13.
it_arr-arr_dig = 4.
APPEND it_arr.
it_arr-arr_val = 14.
it_arr-arr_dig = 5.
APPEND it_arr.
it_arr-arr_val = 15.
it_arr-arr_dig = 6.
APPEND it_arr.
it_arr-arr_val = 16.
it_arr-arr_dig = 7.
APPEND it_arr.
it_arr-arr_val = 17.
it_arr-arr_dig = 8.
APPEND it_arr.
it_arr-arr_val = 18.
it_arr-arr_dig = 9.
APPEND it_arr.
it_arr-arr_val = 19.
it_arr-arr_dig = 1.
APPEND it_arr.
it_arr-arr_val = 20.
it_arr-arr_dig = 2.
APPEND it_arr.
it_arr-arr_val = 21.
it_arr-arr_dig = 3.
APPEND it_arr.
it_arr-arr_val = 22.
it_arr-arr_dig = 4.
APPEND it_arr.
it_arr-arr_val = 23.
it_arr-arr_dig = 7.
APPEND it_arr.
it_arr-arr_val = 24.
it_arr-arr_dig = 8.
APPEND it_arr.
it_arr-arr_val = 25.
it_arr-arr_dig = 9.
APPEND it_arr.
it_arr-arr_val = 26.
it_arr-arr_dig = 2.
APPEND it_arr.
it_arr-arr_val = 27.
it_arr-arr_dig = 3.
APPEND it_arr.
it_arr-arr_val = 28.
it_arr-arr_dig = 4.
APPEND it_arr.
it_arr-arr_val = 29.
it_arr-arr_dig = 5.
APPEND it_arr.
it_arr-arr_val = 30.
it_arr-arr_dig = 6.
APPEND it_arr.
it_arr-arr_val = 31.
it_arr-arr_dig = 7.
APPEND it_arr.
it_arr-arr_val = 32.
it_arr-arr_dig = 8.
APPEND it_arr.
it_arr-arr_val = 33.
it_arr-arr_dig = 9.
APPEND it_arr.
it_arr-arr_val = 34.
it_arr-arr_dig = 1.
APPEND it_arr.
it_arr-arr_val = 35.
it_arr-arr_dig = 2.
APPEND it_arr.
it_arr-arr_val = 36.
it_arr-arr_dig = 3.
APPEND it_arr.
it_arr-arr_val = 37.
it_arr-arr_dig = 4.
APPEND it_arr.
it_arr-arr_val = 38.
it_arr-arr_dig = 5.
APPEND it_arr.
it_arr-arr_val = 39.
it_arr-arr_dig = 6.
APPEND it_arr.
it_arr-arr_val = 40.
it_arr-arr_dig = 7.
APPEND it_arr.
it_arr-arr_val = 41.
it_arr-arr_dig = 8.
APPEND it_arr.
it_arr-arr_val = 42.
it_arr-arr_dig = 9.
APPEND it_arr.
it_arr-arr_val = 43.
it_arr-arr_dig = 1.
APPEND it_arr.
it_arr-arr_val = 44.
it_arr-arr_dig = 2.
APPEND it_arr.
it_arr-arr_val = 45.
it_arr-arr_dig = 3.
APPEND it_arr.
it_arr-arr_val = 46.
it_arr-arr_dig = 4.
APPEND it_arr.
it_arr-arr_val = 47.
it_arr-arr_dig = 5.
APPEND it_arr.
it_arr-arr_val = 48.
it_arr-arr_dig = 6.
APPEND it_arr.
it_arr-arr_val = 49.
it_arr-arr_dig = 7.
APPEND it_arr.

ENDFORM. " ZF_INIT_VALUES

*&---------------------------------------------------------------------*
*& Form ZF_FORMAT_RUC
*&---------------------------------------------------------------------*
FORM zf_format_ruc USING p_tipo CHANGING ruc_out.

DATA: seg1(11) TYPE c,
seg2(11) TYPE c,
seg3(11) TYPE c,
seg4(11) TYPE c.

DATA: libro_n(4) TYPE c,
tomo3_n(3) TYPE c,
tomo4_n(4) TYPE c,
asiento_n(5) TYPE c,
asiento_n6(6) TYPE c,
prov(2) TYPE c,
sigla(2) TYPE c.

DATA: tomo_j(9) TYPE c,
folio_j(4) TYPE c,
asiento_j(6) TYPE c.

DATA: length TYPE i,
off TYPE i,
ruc_in TYPE char30.
DATA: v_length_seg1 TYPE i,
v_length_seg2 TYPE i,
v_length_seg3 TYPE i,
v_length_ruc TYPE i,

v_length_ruc_20 TYPE i VALUE '20'.
CLEAR: prov, sigla, off.
CLEAR: v_length_seg1, v_length_seg2, v_length_seg3.

*Formatear ruc
ruc_in = ruc_out.
SPLIT ruc_in AT '-' INTO seg1 seg2 seg3 seg4.

v_length_seg1 = strlen( seg1 ).
v_length_seg2 = strlen( seg2
v_length_seg3 = strlen( seg3 ).
v_length_ruc = v_length_seg1 + v_length_seg2 + v_length_seg3.

IF v_length_ruc GT v_length_ruc_20.

MESSAGE e000(wn) WITH 'RUC supera la longitud permitida'.
ELSE.

IF ruc_in CS 'PAS'. "Extranjeros con Pasaporte

ruc_out = ruc_in.

ELSEIF seg2 CS 'NT' AND NOT seg4 IS INITIAL. "número tributario
DO 2 TIMES.
IF seg1+off(1) CA '1234567890'.
CONCATENATE prov seg1+off(1) INTO prov.
ADD 1 TO off.
ENDIF.
ENDDO.

sigla = 'NT'.

CONCATENATE prov sigla INTO seg1.

libro_n = seg1.
WRITE libro_n TO libro_n USING EDIT MASK 'RR____'.
TRANSLATE libro_n USING ' 0'.

tomo3_n = seg3.
WRITE tomo3_n TO tomo3_n USING EDIT MASK 'RR___'.
TRANSLATE tomo3_n USING ' 0'.

asiento_n = seg4.
WRITE asiento_n TO asiento_n USING EDIT MASK 'RR_____'.
TRANSLATE asiento_n USING ' 0'.

IF p_tipo EQ '1'.
CONCATENATE '5' libro_n tomo3_n asiento_n INTO ruc_out.
ELSEIF p_tipo EQ '2'.
CONCATENATE libro_n tomo3_n asiento_n INTO ruc_out.
ENDIF.

ELSEIF p_tipo EQ 1 AND seg1 NA sy-abcde AND seg2 NA syabcde. "Persona natural sin sigla

IF v_length_seg3 GT '6'.
MESSAGE e000(wn) WITH 'Formato RUC incorrecto'.
ELSE.

length = strlen( seg1 ).

IF length = 2.
prov = seg1.
sigla = '00'.
ELSE.
CONCATENATE '0' seg1 INTO prov.
sigla = '00'.
ENDIF.
CONCATENATE prov sigla INTO seg1.

libro_n = seg1.
WRITE libro_n TO libro_n USING EDIT MASK 'RR____'.
TRANSLATE libro_n USING ' 0'.

asiento_n = seg3.
WRITE asiento_n TO asiento_n USING EDIT MASK 'RR_____'.
TRANSLATE asiento_n USING ' 0'.

IF length = 4.

tomo4_n = seg2.
WRITE tomo4_n TO tomo4_n USING EDIT MASK 'RR____'.
TRANSLATE tomo4_n USING ' 0'.
CONCATENATE 'N' libro_n tomo4_n asiento_n INTO ruc_out.

ELSE.

tomo3_n = seg2.
WRITE tomo3_n TO tomo3_n USING EDIT MASK 'RR___'.
TRANSLATE tomo3_n USING ' 0'.
CONCATENATE 'N' libro_n tomo3_n asiento_n INTO ruc_out.

ENDIF.
ENDIF.
ELSEIF p_tipo EQ 1 AND ( seg1 CA sy-abcde OR
seg2 CA sy-abcde ). "Persona natural con sigla

IF v_length_seg3 GT '6'. MESSAGE e000(wn) WITH 'Formato RUC incorrecto'. ELSE.
IF seg1 CS 'PE' OR seg2 CS 'PE'.
length = strlen( seg2 ).
prov = '00'.
sigla = 'PE'.

ELSEIF seg1 CS 'PI' OR seg2 CS 'PI'.
length = strlen( seg3 ).
prov = seg1.

sigla = 'PI'.

ELSEIF seg1 CS 'N' OR seg2 CS 'N'.
length = strlen( seg2 ).
prov = '00'.
sigla = 'N0'.

ELSEIF seg1 CS 'E' OR seg2 CS 'E'.
length = strlen( seg2 ).
prov = '00'.
sigla = 'E0'.

ELSEIF seg1 CS 'AV' OR seg2 CS 'AV'.

length = strlen( seg3 ).
prov = seg1.

sigla = 'AV'.

ENDIF.

CONCATENATE prov sigla INTO seg1.

libro_n = seg1.
WRITE libro_n TO libro_n USING EDIT MASK 'RR____'.
TRANSLATE libro_n USING ' 0'.

IF seg4 IS INITIAL.

IF strlen( seg3 ) LE 5.
asiento_n = seg3.
CLEAR asiento_n6.
ELSE.
asiento_n6 = seg3.
CLEAR asiento_n.
ENDIF.
ELSE.

IF strlen( seg4 ) LE 5.
asiento_n = seg4.
CLEAR asiento_n6.
ELSE.
asiento_n6 = seg4.
CLEAR asiento_n.
ENDIF.
ENDIF.

IF asiento_n IS NOT INITIAL.
WRITE asiento_n TO asiento_n USING EDIT MASK 'RR_____'.
TRANSLATE asiento_n USING ' 0'.
ENDIF.

IF asiento_n6 IS NOT INITIAL.
WRITE asiento_n6 TO asiento_n6 USING EDIT MASK 'RR______'.
TRANSLATE asiento_n6 USING ' 0'.
ENDIF.

IF length = 4.

IF seg4 IS INITIAL.
tomo4_n = seg2.
ELSE.
tomo4_n = seg3.
ENDIF.
WRITE tomo4_n TO tomo4_n USING EDIT MASK 'RR____'.
TRANSLATE tomo4_n USING ' 0'.

CONCATENATE 'N' libro_n tomo4_n asiento_n INTO ruc_out.
ELSE.

IF seg4 IS INITIAL.
tomo3_n = seg2.
ELSE.
tomo3_n = seg3.
ENDIF.
WRITE tomo3_n TO tomo3_n USING EDIT MASK 'RR___'.
TRANSLATE tomo3_n USING ' 0'.

IF asiento_n IS NOT INITIAL.
CONCATENATE 'N' libro_n tomo3_n asiento_n INTO ruc_out.
ELSE.
CONCATENATE 'N' libro_n tomo3_n asiento_n6 INTO ruc_out.
ENDIF.

ENDIF.

ENDIF.

ELSEIF p_tipo EQ 2. "Persona Jurídica

IF v_length_seg1 GT '10'
OR v_length_seg2 GT '4'
OR v_length_seg3 GT '6'.

MESSAGE e000(wn) WITH 'Formato RUC incorrecto'.
ELSE.

IF seg2 IS INITIAL. "No tiene "-"

ruc_out = ruc_in.

ELSE.
tomo_j = seg1.
folio_j = seg2.
asiento_j = seg3.

WRITE tomo_j TO tomo_j USING EDIT MASK 'RR_________'.

WRITE folio_j TO folio_j USING EDIT MASK 'RR____'.
WRITE asiento_j TO asiento_j USING EDIT MASK 'RR______'.

TRANSLATE tomo_j USING ' 0'.
TRANSLATE folio_j USING ' 0'.
TRANSLATE asiento_j USING ' 0'.

CONCATENATE tomo_j folio_j asiento_j INTO ruc_out.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
ENDFORM. " ZF_FORMAT_RUC
Responder Con Cita
  #5  
Viejo 13/04/18, 23:51:49
don 4D don 4D is offline
Junior Member
 
Fecha de Ingreso: abr 2018
Mensajes: 1
¿qué lenguaje es?

¿podrías decirnos qué lenguaje es este? ¿Alguien tiene esta rutina en otro lenguaje?
Responder Con Cita
  #6  
Viejo 22/11/18, 15:24:09
Koriotto Koriotto is offline
Junior Member
 
Fecha de Ingreso: mar 2014
Mensajes: 24
El lenguaje es ABAP.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Reglas de Mensajes
no puedes crear nuevos temas
no puedes responder temas
no puedes adjuntar archivos
no puedes editar tus mensajes

El código vB está On
Las caritas están On
Código [IMG] está On
Código HTML está Off
Saltar a Foro


Husos Horarios son GMT. La hora en este momento es 14:55:39.


www.mundosap.com 2006 - Spain
software crm, crm on demand, software call center, crm act, crm solutions, crm gratis, crm web