
“…neque porro quisquam est, qui dolorem ipsum, quia dolor sit, amet, consectetur, adipisci velit…”¹
Hemos llegado a la última parte de la serie. En este último capítulo:
Ahora que aprendimos cómo mostrar oraciones que comienzan en nuevas líneas en el anterior capítulo, usemos esto para un escenario como mostrar texto con una lista con viñetas.
Si hace clic en Sí, se realizarán los siguientes pasos:
- Comprobar estado incompleto
- Verifica los datos
- Actualizar el documento
- Registrar los errores
📄 Código ABAP:
*--------------------------------------------------------------------*
* Anatomy of a Function Module: POPUP_TO_CONFIRM - Part 4
*
* Story 5: Displaying a Bulleted List in Text
*--------------------------------------------------------------------*
REPORT sy-repid.
CONSTANTS: newline VALUE cl_abap_char_utilities=>newline,
maxlen TYPE i VALUE 57.
DATA: question TYPE string,
answer(1).
question &&=:
|If you click Yes, the following steps will be performed:| , newline,
|• Check incompleteness| , newline,
|• Verify the data| , newline,
|• Update the document| , newline,
|• Log the errors| , newline.
SPLIT question AT newline INTO TABLE DATA(segments).
CLEAR question.
LOOP AT segments ASSIGNING FIELD-SYMBOL(<segment>).
DO COND #( WHEN strlen( <segment> ) EQ maxlen THEN 1 ELSE ( maxlen - strlen( <segment> ) ) ) TIMES.
<segment> &&= | |.
ENDDO.
question &&= <segment>.
ENDLOOP.
question &&= newline.
CALL FUNCTION 'POPUP_TO_CONFIRM'
EXPORTING
text_question = question
userdefined_f1_help = '_'
IMPORTING
answer = answer
EXCEPTIONS
OTHERS = 2.
🖥️ Salida:
Sistema 1: altura de línea: 1,75 em |
Sistema 2: altura de línea: 34px |
En este ejemplo, activé el botón Información para ampliar la ventana emergente. Si las oraciones se ajustan a 48 caracteres, entonces no es necesario.
⚠️ El único efecto secundario de mostrar el botón de información al configurar el parámetro USER_DEFINED_F1_HELP
con un valor que no existe es que se muestra el siguiente mensaje cuando el usuario hace clic en ese botón.
No hay documentación definida por el usuario disponible
Mencioné el objeto del documento. ARBFND_DETAILED_LONGTEXT
en el primero parte de esta serie. Ahora es el momento de usarlo.
⚠️ Tenga en cuenta que es posible que el objeto del documento no esté disponible en todos los sistemas.
Primero, echemos un vistazo a si este objeto existe y qué contiene. Para hacer esto, siga los pasos a continuación.
SE61
.ARBFND_DETAILED_LONGTEXT
en el campo de entrada Texto de diálogo.
Transacción SE61 |
Contenido del documento |
Como puede ver, el objeto del documento contiene 70 marcadores de posición. Cada marcador de posición puede contener 75 caracteres. Podemos llenar estos marcadores de posición llenando el PARAMETER
parámetro.
Intentemos mostrar el texto a continuación:
Sed ut perspiciatis, unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam eaque ipsa, quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt, explicabo. Nemo enim ipsam voluptatem, quia voluptas sit, aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos, qui ratione voluptatem sequi nesciunt, neque porro quisquam est, qui dolorem ipsum, quia dolor sit, amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt, ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit, qui in ea voluptate velit esse, quam nihil molestiae consequatur, vel illum, qui dolorem eum fugiat, quo voluptas nulla pariatur? ¹
Dividiré el texto en segmentos de 75 caracteres y luego completaré la tabla de parámetros. Finalmente, llamaré a la función con el DIAGNOSE_OBJECT
parámetro y el PARAMETER
mesa.
ℹ️ No necesitamos usar el TEXT_QUESTION
parámetro en esta historia, ya que mostraremos el texto largo usando los parámetros anteriores. En realidad, no deberíamos porque no hay nada que enviar con él.
📄 Código ABAP:
*--------------------------------------------------------------------*
* Anatomy of a Function Module: POPUP_TO_CONFIRM - Part 4
*
* Story 6: Displaying Longer Text Using a Document Object
*--------------------------------------------------------------------*
REPORT sy-repid.
*--------------------------------------------------------------------*
* DATA
*--------------------------------------------------------------------*
CONSTANTS: number_of_placeholders TYPE i VALUE 70,
width_of_parameter_value TYPE i VALUE 75.
DATA: text TYPE string,
values TYPE TABLE OF spo_val,
params TYPE TABLE OF spar,
answer TYPE char1.
*--------------------------------------------------------------------*
* Build a long text.
*--------------------------------------------------------------------*
text &&=:
`Sed ut perspiciatis, unde omnis iste natus error sit voluptatem accusantium`,
` doloremque laudantium, totam rem aperiam eaque ipsa, quae ab illo inventor`,
`e veritatis et quasi architecto beatae vitae dicta sunt, explicabo. Nemo en`,
`im ipsam voluptatem, quia voluptas sit, aspernatur aut odit aut fugit, sed `,
`quia consequuntur magni dolores eos, qui ratione voluptatem sequi nesciunt,`,
` neque porro quisquam est, qui dolorem ipsum, quia dolor sit, amet, consect`,
`etur, adipisci velit, sed quia non numquam eius modi tempora incidunt, ut l`,
`abore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam`,
`, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut a`,
`liquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit, qu`,
`i in ea voluptate velit esse, quam nihil molestiae consequatur, vel illum, `,
`qui dolorem eum fugiat, quo voluptas nulla pariatur?`.
*--------------------------------------------------------------------*
* Split the text and fill the VALUES internal table.
*--------------------------------------------------------------------*
DATA(textlen) = strlen( text ).
DATA(to_be_copied) = 0.
DATA(copied) = 0. "75, 150, 225, ...
WHILE copied LT textlen.
to_be_copied = COND #( WHEN copied + width_of_parameter_value LT textlen
THEN width_of_parameter_value
ELSE textlen - copied ).
APPEND CONV spo_val( text+copied(to_be_copied) ) TO values.
copied += to_be_copied.
ENDWHILE.
*--------------------------------------------------------------------*
* Fill the PARAMS internal table.
*--------------------------------------------------------------------*
DATA(number_of_used_placeholders) = lines( values ).
DATA(index_of_unused_placeholder) = 0.
* Move values to placeholders and add them to the PARAMS internal table.
* ARBFND_DETAILED_LONGTEXT has 70 placeholders (&VAR0000001&..&VAR0000070&).
LOOP AT values ASSIGNING FIELD-SYMBOL(<value>).
APPEND VALUE spar( param = 'VAR' && CONV numc7( sy-tabix )
value = <value> ) TO params.
ENDLOOP.
* Set unused parameters (placeholders) to empty.
index_of_unused_placeholder = number_of_used_placeholders.
DO ( number_of_placeholders - number_of_used_placeholders ) TIMES.
index_of_unused_placeholder += 1.
APPEND VALUE spar( param = 'VAR' && CONV numc7( index_of_unused_placeholder )
value = space ) TO params.
ENDDO.
*--------------------------------------------------------------------*
* Call the function with the DIAGNOSE_OBJECT and the PARAMETER.
* Set the TEXT_QUESTION to space as we don't need it.
*--------------------------------------------------------------------*
CALL FUNCTION 'POPUP_TO_CONFIRM'
EXPORTING
diagnose_object="ARBFND_DETAILED_LONGTEXT"
text_question = space
"userdefined_f1_help = '.'
IMPORTING
answer = answer
TABLES
parameter = params
EXCEPTIONS
OTHERS = 2.
🖥️ Salida:
Sin usar el parámetro USERDEFINED_F1_HELP |
Usando el parámetro USERDEFINED_F1_HELP |
📄 Texto que se muestra en la ventana emergente:
Sed ut perspiciatis, unde omnis iste natus error sit voluptatem acusantiumdoloremque laudantium, totam rem aperiam eaque ipsa, quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt, explicabo. Nemo enim ipsam voluptatem, quia voluptas sit, aspernatur aut odit aut fugit, sedquía consequuntur magni dolores eos, qui ratione voluptatem sequi nesciente,neque porro quisquam est, q etur, adipisci velit, sed quia non numquam eius modi tempora incidunt, ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit, qui in ea voluptate velit esse, quam nihil molestiae consequatur, vel iluminar,qui dolorem eum fugiat, qu |
Cuando comparamos el texto con la versión original, vemos los siguientes cambios:
Sed ut perspiciatis, unde omnis iste natus error sit voluptatem acusantium doloremque laudantium, totam rem aperiam eaque ipsa, quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt, explicabo. Nemo enim ipsam voluptatem, quia voluptas sit, aspernatur aut odit aut fugit, sed quía consequuntur magni dolores eos, qui ratione voluptatem sequi nesciente, neque porro quisquam est, q |
⚠️ Hay 2 problemas con la salida:
Problema | Solución |
Cuando el último carácter de un segmento no es un espacio, la última palabra del segmento y la primera palabra del segmento siguiente se mantienen juntas porque tampoco hay espacios entre los marcadores de posición. 🤦 P.ej acusantiumdoloremque |
Se puede crear un objeto de documento personalizado e insertar un espacio entre los marcadores de posición para resolver este problema. O podemos intentar trasladar la primera palabra que provoca que “por qué nos mantenemos juntos” al siguiente marcador de posición. |
Después de que la función reemplace los marcadores de posición con valores, hay otro paso que divide todo el texto en segmentos para completar las tablas HTML más adelante. (Para obtener más información sobre la lógica, consulte el primero capítulo). En este paso, solo se transfieren 400 caracteres a la vez en el bucle de división de texto. Llamemos a esto ‘bloque’. Esta lógica hace que las palabras que excedan el límite no se agreguen al final del bloque. Y sigue añadiendo los siguientes segmentos. Esto provoca pérdida de datos en cada bloque de 400 caracteres.🤷 Por ejemplo, q |
El segundo problema requiere análisis porque hay algo raro en la función. Para el análisis de este problema, puede echar un vistazo a la siguiente tabla. Como puede ver allí, cuando se completan los bloques de 400 caracteres que se llenan al combinar segmentos de 75 caracteres, los últimos 25 caracteres se ignoran cada vez. |
# | Valor para marcador de posición | Len | Bloquear |
1 | Sed ut perspiciatis, unde omnis iste natus error sit voluptatem accusantium | 75 | 1 |
2 | doloremquelaudantium, totam rem aperiam eaque ipsa, quae ab illo inventor | 74 | |
3 | e veritatis et quasi architecto beatae vitae dicta sunt, explicabo. Nemo es | 75 | |
4 | im ipsam voluptatem, quia voluptas sit, aspernatur aut odit aut fugit, sed | 74 | |
5 | quia consequuntur magni dolores eos, qui ratione voluptatem sequi nesciunt, | 75 | |
6 | neque porro quisquam est, qui dolorem ipsum, quia dolor sit, amet, consect | 75 | |
7 | etur, adipisci velit, sed quia non numquam eius modi tempora incidente, ut l | 75 | 2 |
8 | abore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam | 75 | |
9 | quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut a | 75 | |
10 | líquido ex ea commodi consequatur? Quis autem vel eum iure reprehenderit, qu | 75 | |
11 | i in ea voluptate velit esse, quam nihil molestiae consequatur, vel illum, | 75 | |
12 | qui dolorem eum fugiat, qu |
52 |
🧮 Esta es la fórmula general: 400 caracteres – (75 caracteres x 5 segmentos) = 25 caracteres (para omitir)
En esta publicación de blog, ha aprendido cómo mostrar texto que contiene listas con viñetas y mostrar texto más largo mediante el uso de objetos de documento.
Sin embargo, no hay ningún objeto de documento adecuado que podamos usar para mostrar texto largo dinámico. Al menos yo no pude encontrar ninguno. Incluso si podemos crear uno personalizado, parece que necesitamos escribir lógica adicional para controlar la manipulación del texto.
Por supuesto, esto sucede cuando queremos mostrar texto de más de 400 caracteres.
La fogata todavía está caliente. Una gran oportunidad para un buen sueño. O puedes echar un vistazo a la RSSPO120
programa estándar para POPUP_TO_CONFIRM
ejemplos de uso
Más recursos |
Notas finales
Marcas registradas
Descargo de responsabilidad
|
Calle Eloy Gonzalo, 27
Madrid, Madrid.
Código Postal 28010
Paseo de la Reforma 26
Colonia Juárez, Cuauhtémoc
Ciudad de México 06600
Real Cariari
Autopista General Cañas,
San José, SJ 40104
Av. Jorge Basadre 349
San Isidro
Lima, LIM 15073