24 febrero 2010
MzAzMTMxMzAzMDMwMzEzMDMwMzEzMTMxMzAzMDMxMzAzMDMxMzEzMDMw
MzAzMDMxMzAzMTMxMzEzMDMxMzEzMDMwMzEzMTMwMzEzMTMxMzEzMDMw
MzEzMTMxMzAzMTMwMzAzMDMxMzAzMDMwMzAzMDMwMzEzMTMwMzEzMDMw
MzAzMDMxMzEzMDMwMzAzMDMxMzAzMTMxMzEzMDMwMzEzMTMwMzAzMTMw
MzAzMDMwMzAzMDMxMzEzMDMwMzEzMDMwMzAzMTMxMzAzMDMxMzAzMTMw
MzEzMTMxMzAzMDMxMzEzMDMxMzEzMDMwMzAzMTMxMzAzMTMxMzEzMDMx
MzAzMTMwMzEzMTMwMzAzMDMxMzAzMDMxMzEzMDMxMzAzMDMxMzAzMTMx
MzAzMDMxMzAzMTMwMzEzMTMxMzAzMDMxMzAzMDMxMzEzMTMwMzEzMDMw
MzAzMTMxMzAzMTMxMzEzMTMwMzAzMTMwMzAzMDMwMzAzMDMxMzEzMDMw
MzEzMDMxMzAzMTMxMzAzMTMxMzAzMDMwMzAzMTMwMzAzMDMwMzAzMDMx
MzEzMDMxMzEzMDMxMzAzMTMxMzAzMDMxMzAzMTMwMzEzMTMwMzEzMTMx
MzAzMDMxMzEzMTMwMzAzMTMxMzAzMTMxMzAzMDMwMzAzMTMwMzEzMTMw
MzEzMDMxMzAzMDMxMzEzMDMwMzEzMDMxMzAzMDMxMzAzMDMwMzAzMDMw
MzEzMTMxMzAzMDMxMzEzMDMxMzEzMDMwMzEzMDMxMzAzMTMxMzAzMDMw
MzEzMTMwMzEzMTMxMzAzMDMxMzAzMDMxMzEzMDMwMzEzMDMxMzAzMTMx
MzEzMDMxMzAzMDMwMzEzMTMwMzEzMTMxMzEzMDMwMzEzMDMwMzAzMDMx
Es mucho más fácil de lo que parece. La primera persona que lo descubra recibirá… una satisfacción personal tremenda.
|
Sería bueno comprar libros si se pudiera comprar a la vez el tiempo para leerlos; pero casi siempre se confunde la compra de los libros con la apropiación de su contenido.
Nuestro mundo civilizado no es más que una mascarada donde se encuentran caballeros, curas, soldados, doctores, abogados, sacerdotes, filósofos; pero no son lo que representan, sino sólo la mascara, bajo la cual, por regla general, se esconden especuladores de dinero.
Toda sociedad exige, necesariamente, un acomodamiento recíproco, un temperamento; así, cuanto más numerosa es, más insípida se hace. No se puede ser verdaderamente uno mismo, sino mientras está uno solo; por consiguiente, quien no ama la soledad, no ama la libertad. Porque no es uno libre sino estando solo.
Nuestras ansiedades, preocupaciones, miedos, vejaciones, etcétera, normalmente sólo tienen que ver con la opinión de alguien sobre nosotros. La manera de quitarse esta locura de encima es percatarse de cuán falsas, perversas, erróneas y absurdas son la inmensa mayoría de las opiniones que existen en la mente de los hombres y lo poco, por tanto, que debemos preocuparnos por ellas.
Siempre me resultó un obstáculo en mi vida, y en todo lo que emprendí, que hasta una edad bastante avanzada no fuera capaz de formarme una idea lo suficientemente clara de la pequeñez y miseria de los hombres.
No existe opinión alguna, por absurda que sea, que los hombres no acepten como propia si llegada la hora de convencerles se arguye que tal opinión es aceptada universalmente. Son como ovejas que siguen al carnero dondequiera que vaya; les es más fácil morir que pensar.
Las religiones, como las luciérnagas, necesitan de la oscuridad para brillar.
Lo que se conoce como opinión universal es la opinión de dos o tres personas; nos convenceríamos de esto si pudiéramos asistir a su génesis. Fueron dos o tres personas quienes primero la afirmaron y benévolamente creyeron haberla examinado a fondo. Otros, que les consideraban suficientemente capacitados, aceptaron en principio esas ideas. Y estos a su vez fueron más creídos por gente indolente que opinaban que era mejor asumirlo en seguida que entretenerse con comprobaciones. Y así creció el número de crédulos, hasta que llegó un momento en el que el consenso se convirtió en deber. A partir de aquí los que están capacitados para juzgar están obligados a callarse.
|
17 febrero 2010
Hola y autocompasión para nosotros, sufridos programadores de ABAP.
La gestión de mensajes en Batch-Input y BAPI es bastante horrorosa, teniendo en cuenta además que utilizan dos estructuras muy similares pero con nombres de campos muy parecidos, lo que suele llevar a confusiones frustrantes cuando intentamos analizar el resultado.
Estas macros permiten gestionar los mensajes de ambos tipo de llamadas unificando criterios y simplificando al máximo el código a utilizar.
- vc_messtab2bapiret messtab bapiret2: mueve una estructura bdcmsgcoll a bapiret2.
- vc_bapiret2messtab bapiret2 messtab: mueve una estructura bapiret2 a bdcmsgcoll.
- vc_messtab2mensaje messtab cadenadetexto: construye un mensaje como texto a partir de una estructura bdcmsgcoll.
- vc_bapiret2mensaje bapiret2 cadenadetexto: construye un mensaje como texto a partir de una estructura bapiret2.
* _ _ ___ _
*| |__ (_) / / |__ __ _ _ __ (_) _ __ ___ ___ ___ ___ __ _ __ _ ___ ___
*| '_ \| | / /| '_ \ / _` | '_ \| | | '_ ` _ \ / _ \ __| __|/ _` |/ _` |/ _ \ __|
*| |_) | |/ / | |_) | (_| | |_) | | | | | | | | __/__ \__ \ (_| | (_| | __/__ \
*|_.__/|_|_/ |_.__/ \__,_| .__/|_| |_| |_| |_|\___|___/___/\__,_|\__, |\___|___/
* |_| |___/
* as seen in http://glob.cranf.net
* ASCII art made using http://ascii.cranf.net
*
***********************************************************************
DEFINE vc_messtab2bapiret."convierte estructura messtab de BI a bapiret2
"vc_messtab2bapiret messtab bapiret2.
"lo hace de línea en línea, no usando tablas
perform vc_messtab2bapiret using &1 changing &2.
END-OF-DEFINITION.
*
FORM vc_messtab2bapiret USING pbi TYPE bdcmsgcoll
CHANGING pbapi TYPE bapiret2.
pbapi-type = pbi-msgtyp.
pbapi-id = pbi-msgid.
pbapi-number = pbi-msgnr.
pbapi-message_v1 = pbi-msgv1.
pbapi-message_v2 = pbi-msgv2.
pbapi-message_v3 = pbi-msgv3.
pbapi-message_v4 = pbi-msgv4.
ENDFORM. "vc_messtab2bapiret
***********************************************************************
DEFINE vc_bapiret2messtab. "convierte estructura bapiret2 a messtab de BI
"vc_bapiret2messtab bapiret2 messtab.
"lo hace de línea en línea, no usando tablas
perform vc_bapiret2messtab using &1 changing &2.
END-OF-DEFINITION.
*
FORM vc_bapiret2messtab USING pbapi TYPE bapiret2
CHANGING pbi TYPE bdcmsgcoll.
pbi-msgtyp = pbapi-type.
pbi-msgid = pbapi-id.
pbi-msgnr = pbapi-number.
pbi-msgv1 = pbapi-message_v1.
pbi-msgv2 = pbapi-message_v2.
pbi-msgv3 = pbapi-message_v3.
pbi-msgv4 = pbapi-message_v4.
ENDFORM. "vc_bapiret2messtab
***********************************************************************
DEFINE vc_messtab2mensaje. "convierte estructura messtab en mensaje verbal
"vc_messtab2mensaje messtab cadenadetexto
perform vc_messtab2mensaje using &1 changing &2.
END-OF-DEFINITION.
*
FORM vc_messtab2mensaje USING pbi TYPE bdcmsgcoll
CHANGING pmensaje.
DATA lmsgid LIKE sy-msgid.
DATA lmsgnr LIKE sy-msgno.
DATA lmensaje LIKE sy-lisel.
DATA lmsgv1 TYPE symsgv.
DATA lmsgv2 TYPE symsgv.
DATA lmsgv3 TYPE symsgv.
DATA lmsgv4 TYPE symsgv.
lmsgid = pbi-msgid.
lmsgnr = pbi-msgnr.
lmsgv1 = pbi-msgv1.
lmsgv2 = pbi-msgv2.
lmsgv3 = pbi-msgv3.
lmsgv4 = pbi-msgv4.
CALL FUNCTION 'RPY_MESSAGE_COMPOSE'
EXPORTING
language = sy-langu
message_id = lmsgid
message_number = lmsgnr
message_var1 = lmsgv1
message_var2 = lmsgv2
message_var3 = lmsgv3
message_var4 = lmsgv4
IMPORTING
message_text = lmensaje
EXCEPTIONS
message_not_found = 1
OTHERS = 2.
IF sy-subrc <> 0.
CLEAR lmensaje.
ENDIF.
pmensaje = lmensaje.
ENDFORM. "vc_messtab2mensaje
***********************************************************************
DEFINE vc_bapiret2mensaje."convierte estructura bapiret2 en mensaje verbal
perform vc_bapiret2mensaje using &1 changing &2.
END-OF-DEFINITION.
*
FORM vc_bapiret2mensaje USING pbapi TYPE bapiret2
CHANGING pmensaje.
DATA lbi TYPE bdcmsgcoll.
vc_bapiret2messtab pbapi lbi.
vc_messtab2mensaje lbi pmensaje.
ENDFORM. "vc_bapiret2mensaje
***********************************************************************
Self-Promotion: Tengo unas estupendas macros para hacer Batch-Input en mi compactador de código BI. Échales un vistazo.
|
Buenas, sufridos programadores de ABAP.
Los que estamos curtidos sabemos que, a veces, los caminos de SAP son inexcrutables inescrutables; pero más por retorcidos que porque no se puedan deducir. Es el caso de los porcentajes que corresponden a los tipos de IVA recogidos en campos MWSKZ. En vez de ser almacenados en una tabla al efecto, pues no. Se marea al programador.
La siguiente rutina deduce el porcentaje correspondiente a un indicador de IVA simplemente conociendo este y el país. Si sy-subrc no vale 0, es que no lo ha encontrado; esto se deberá controlar.
Una advertencia: los valores son devueltos como porcentajes literales, de 0 a 100. Cualquier operación que se realice con ellos deberá ser dividida a su vez por 100 para que el resultado sea correcto.
* _ _ _ __ _
* __| | ___ __| |_ _ ___ ___ (_)/ / (_)_ ____ _
* / _` |/ _ \/ _` | | | |/ __| _ \ / / | | \ / / _` |
*| (_| | __/ (_| | |_| | (__ __/ / /_ | |\ V / (_| |
* \__,_|\___|\__,_|\__,_|\___|___| /_/(_) |_| \_/ \__,_|
* as seen on http://glob.cranf.net
* ASCII art made at http://ascii.cranf.net
*
FORM deduce_porcentaje_iva USING pland1 pmwskz CHANGING pkbetr LIKE konp-kbetr.
DATA lvakey LIKE konh-vakey.
DATA lknumh LIKE konh-knumh.
CLEAR pkbetr.
CONCATENATE pland1 pmwskz INTO lvakey SEPARATED BY space.
SELECT SINGLE knumh
INTO lknumh
FROM konh
WHERE vakey = lvakey.
IF sy-subrc = 0.
SELECT SINGLE kbetr INTO pkbetr
FROM konp
WHERE knumh = lknumh.
IF sy-subrc = 0.
pkbetr = pkbetr / 10.
ELSE.
sy-subrc = 2.
ENDIF.
ELSE.
sy-subrc = 1.
ENDIF.
ENDFORM.
|
Hoy voy a hablar de uno de mis autores favoritos: Voltaire.
A mucha gente le suena este nombre de los libros de filosofía e historia del colegio y se imagina que se debe tratar de un ladrillo espantoso. Pues para nada. De hecho, escribe unos libros muy actuales y divertídisimos. Voltaire tenía muy mala uva, y la descargaba en cantidad de libritos satíricos (algunos escritos bajo seudónimo por eso de conservar el pellejo) donde no dejaba títere con cabeza.
Ayer precisamente acabé de leer El Ingenuo. Es la historia de un indio del Canadá que llega a Francia después de un largo viaje, y que debido a su falta de “educación” (sí, entre comillas) es el tío más natural del mundo y dice lo que piensa. Así sucede que le intentan convertir al cristianismo y le dan a leer una biblia. Tanto entusiasmo le despierta el Nuevo Testamento que decide circuncidarse inmediatamente, lo que escandaliza a todos. Lo mismo ocurre cuando, después de confesarse, obliga literalmente al cura a confesársele a él, bajo el mandamiento de “Confesaos los unos a los otros“. Más tarde, en la fecha del bautizo no aparece, dejando a todo el mundo preocupado. No aparece… porque está en el río pasando frío esperando a que lo rocíen. Cuando le explican finalmente que no se hace así, el contesta algo así como “Joder, tanta gaita con el libro de las narices y al final no hacéis nada de lo que dice; hacéis lo que os sale de los cojones“…. en definitiva, que grita a la sociedad de su época (y de la nuestra) la incoherencia y la hipocresía de su comportamiento.
Otro librito delicioso, y uno de los más famosos es Cándido. En él critica, más bien destroza, la filosofía de Leibnitz, quien aseguraba que “al ser este mundo creado por Dios, no tiene más remedio que ser el mejor de los mundos posibles“. Así enseña el maestro Pangloss, experto en Cosmogonigología (!), al pobre Cándido que vive feliz en su castillo… hasta que lo invaden, lo queman, matan al padre, violan a la madre y la hermana, a él le dan por culo, después hostias, huye en barco, naufraga, llega a Lisboa, hay un terremoto… y Cándido no deja de repetirse “¡Es el mejor de los mundos posibles! ¡Es el mejor de los mundos posibles!“.
También es una pasada Macromegas y Micromegas, sobre lo grande y lo pequeño. Macromegas, habitante de Saturno de 30km de altura, llega a la tierra y coge a una ballena en la puntita de su uña. Al ver a un ser tan increíblemente diminuto se pregunta “¿Tendrá conciencia? ¿Pensará?“…
Y uno de mis favoritos es Zadig, que transcurre en la antigua Babilonia. Zadig es un tío honrado y cabal, preocupado por hacer (y que se hagan) las cosas bien. De hecho, atrae la admiración de todos los gobernantes que se encuentra, quienes lo quieren tener a su lado. Y hace las cosas tan bien tan bien tan bien, que no sufre más que traiciones, envidias, malos rollos y puteos, cuando no se lo intentan cargar directamente.
Otra pasada de libro es La Princesa de Babilonia, quien busca desesperadamente a su amado por todo el mundo… ocasión que Voltaire aprovecha para hacer un repaso, escupiendo veneno, de la gente de los países que recorre la susodicha.
Pero lo mejor de Voltaire es que, en todos estos libritos, entre las risas y el cachondeo, esconde unas verdades como puños y unos pensamientos profundos. E introducidos de manera tan contundente que muchas veces dejas de leer un buen rato mientras le das vueltas al puñetazo mental que acabas de leer. Y como ejemplo, un fragmento de Zadig.
Antes de seguir leyendo, hay que ponerse en antecedentes: Zadig vivía en Babilonia, y era un hombre recto, honesto, preocupado por hacer las cosas bien… con lo que no hacía más que ganarse traiciones y enemigos por todas partes. En este punto del relato, Zadig está de vuelta de todo y se dedica a viajar de incógnito… pero repentinamente conoce a un ermitaño que destila sabiduría en sus palabras. Éste le pide a Zadig que le acompañe durante unos días y que no se separe de él, pase lo que pase. Y esto es lo que pasa:
Los dos viajeros llegaron al atardecer a un castillo soberbio. El ermitaño pidió hospitalidad para él y para el joven que lo acompañaba. El portero, al que se hubiera tomado por un gran señor, los introdujo con una especie de bondad despectiva. Los admitieron a su mesa en el último puesto, sin que el señor del castillo los honrara con una mirada, pero fueron servidos como los demás con delicadeza y profusión. A la mañana siguiente, tras dormir en un bello aposento, un criado les entregó a cada uno una moneda de oro. Zadig comprobó que el bolsillo del ermitaño estaba abultado, y se dió cuenta que había robado una jofaina de oro. Quedó muy sorprendido, pero no dijo nada.
Hacia el mediodía, el ermitaño se presentó a la puerta de una casa muy pequeña donde vivía un rico avaro; allí pidió hospitalidad por unas horas. Un criado malvestido les hizo pasar a la cuadra y les ofreció algunas aceitunas podridas, pan malo y cerveza pasada. El ermitaño comió y bebió igual que contento que la semana pasada. Después dió al criado mal encarado que los vigilaba las dos monedas de oro y le pidió hablar con su amo. “Magnífico señor, dignaos aceptar esta jofaina de oro en agradecimiento”. El avaro a punto estuvo de caerse de espaldas, pero el ermitaño no le dejó tiempo de volver de su asombro; salió apresuradamente con su joven viajero.
Zadig, extrañadísimo, le dice “¿Qué es lo que veo? Robáis una jofaina a quien os recibe magníficamente y se la dais a un avaro que os trata indignamente”. El anciano responde “Hijo, el hombre espléndido que sólo recibe a los extranjeros por vanidad y para que admiren sus riquezas, se hará más prudente. El avaro aprenderá a ejercer la hospitalidad. No os extrañéis por nada y seguidme”.
Llegaron al anochecer a una casa sencilla, donde nada denotaba prodigalidad ni avaricia. El dueño era un filósofo retirado del mundo, que cultivaba en paz sabiduría y virtud. Y no se aburría. Él mismo recibió a los viajeros con nobleza que nada tenía de ostentación. Primero les hizo descansar y luego él mismo les llevó comida, mientras hablaba de las últimas revoluciones de Babilonia, “…pero los hombres no merecen tener un rey como Zadig”. Éste, que viajaba de incógnito, enrojeció y sintió redoblar su dolor. Todos convinieron en que el mundo no estaba a gusto de los más sabios, y el ermitaño añadió que no se conocían los caminos de la providencia, y que los hombres hacían mal juzgar un todo del que sólo conocían una pequeñísima parte.
Tras la conversación, el hombre volvió a acompañarlos a sus aposentos y agradeció al cielo su visita. Incluso les ofreció algo de dinero, que el ermitaño rehusó. Al día siguiente, tras despertar, el ermitaño dijo: “hay que partir mientras están todos durmiendo: quiero dejarle a este hombre un testimonio de mi estima y afecto”. Diciendo estas palabras, pegó fuego a la casa con una tea. Zadig, asustado, intentó impedirlo, pero el ermitaño le arrastraba con una fuerza superior. La casa estaba en llamas y el ermitaño, que ya estaba lejos decía “A Dios gracias, ya está la casa de este hombre destruida de arriba a abajo”. Zadig sintió deseos de pegarle e insultarle, pero se contuvo.
La última noche la pasaron en casa de una viuda virtuosa y su encantador sobrino de catorce años, su única esperanza. Al día siguiente, mandó a éste acompañar a los viajeros hasta un puente que, habiéndose roto hacía poco, era peligroso. Ya en el puente, el ermitaño le dijo al chico: “Venid, tengo que mostrar mi agradecimiento a vuestra tía”. Y cogiéndole del pelo lo tiró al río, donde la corriente lo tragó.
Zadig no pudo más: “¡Monstruo! ¡El más canalla de todos los hombres!”.
Interrumpió el ermitaño: “Me habías prometido más paciencia. Sabed que bajo las ruinas de aquella casa que incendié yacía un inmenso tesoro, y que este niño que acabo de ahogar hubiera matado a su tía dentro de un año y a vos dentro de dos”. Y Zadig respondió “Quien os lo ha dicho, bárbaro”.
Y en ese momento el ermitaño dejo caer su capa y relució. Cuatro alas surgieron. Era un ángel.
“Los hombres todo lo juzgan: tú eras entre todos los hombres el que más merecía ser ilustrado. No hay mal del que no nazca un bien. Si no hubiera más que bien y no hubiera mal, esta tierra sería otra tierra, el encadenamiento de los acontecimientos sería otro orden de sabiduría. El Ser Supremo ha creado millones de mundos de los cuales ninguno es igual a otro. Todo lo que ves en el pequeño átomo en el que has nacido debía estar en su lugar y en su tiempo, según las leyes inmutables del que todo lo abarca. No hay azar, todo es orden y previsión.”
Y el ángel Jesrad, elevándose hacia lo alto, le dijo: “Dirígete a Babilonia”.
|
16 febrero 2010
Hola sufridos programadores de ABAP.
En esta ocasión presento unas macros que permiten convertir strings en tablas internas y viceversa. Hago uso de ellas en mi librería WordWind, pero aquí se recogen como stand-alone en un include para cuando os sea necesario.
Aparte de las obvias funciones de interconversión, tenemos las opciones más sofisticadas de trabajar directamente con tablas tipo TLINE y la opción de hacer wordwrapping, es decir, de no romper las palabras a final de línea, pasándolas a la siguiente.
- vc_tab2str tabla cadena: convierte tabla con texto en string
- vc_str2tab cadena tabla: convierte string en tabla
- vc_str2tabwordwrap cadena tabla: esta rompe palabras por espacios o añade guiones
- vc_str2tline cadena tabla: convierte string a tabla tline de texto estándar haciendo wordwrap
- vc_tline2str tabla cadena: convierte tabla tline de texto estándar en string
* _ _ ____ _ ____ _ _
*| |_ __ _| |__|___ \ ___| |_ _ _|___ \| |_ __ _| |__
*| __/ _` | '_ \ __) / __| __| '__|__) | __/ _` | '_ \
*| || (_| | |_) / __/\__ \ |_| | / __/| || (_| | |_) |
* \__\__,_|_.__/_____|___/\__|_| |_____|\__\__,_|_.__/
* as seen in http://glob.cranf.net
* una creación de alberto viñuela / voet cranf
* convierte tablas de texto en cadenas y viceversa
* la tabla ha de tener cabecera.
* ni la cadena ni la tabla se inicializan: se efectua append
*DATA cadena(120) VALUE 'hola amigos como están ustedes'.
*DATA: BEGIN OF tabla OCCURS 0, linea(4), END OF tabla.
* vc_tab2str tabla cadena.
* convierte tabla con texto en string
* vc_str2tab cadena tabla.
* convierte string en tabla
* vc_str2tabwordwrap cadena tabla.
* esta rompe palabras por espacios o añade guiones
* vc_str2tline cadena tabla
* convierte string a tabla tline de texto estándar
* haciendo wordwrap
* vc_tline2str tabla cadena
* convierte tabla tline de texto estándar en string.
*tab2str/str2tab
***********************************************************************
DEFINE vc_str2tab."convierte string en tabla de ancho arbitrario
"vc_str2tab string tablainterna
perform vc_str2tab tables &2 using &1.
END-OF-DEFINITION.
*
FORM vc_str2tab TABLES ptable USING pstring.
DATA lstring TYPE string.
DATA loffset TYPE i.
DATA lofflen TYPE i.
DATA llimlen TYPE i.
DATA lchunks TYPE i.
DATA ltablength TYPE i.
DATA lstrlength TYPE i.
lstring = pstring.
lstrlength = STRLEN( lstring ).
DESCRIBE FIELD ptable LENGTH ltablength IN CHARACTER MODE.
lofflen = ltablength.
lchunks = lstrlength / ltablength.
WHILE loffset < lstrlength.
llimlen = ltablength + loffset.
IF llimlen > lstrlength.
lofflen = lstrlength - loffset.
ENDIF.
ptable = lstring+loffset(lofflen).
APPEND ptable.
loffset = loffset + ltablength.
ENDWHILE.
CLEAR ptable.
ENDFORM. "vc_str2tab
***********************************************************************
DEFINE vc_tab2str."convierte contenido tabla interna en string
"vc_tab2str tablainterna string.
perform vc_tab2str tables &1 changing &2.
END-OF-DEFINITION.
*
FORM vc_tab2str TABLES ptable CHANGING pstring.
LOOP AT ptable.
CONCATENATE pstring ptable INTO pstring
IN CHARACTER MODE
RESPECTING BLANKS.
ENDLOOP.
ENDFORM. "vc_tab2str
***********************************************************************
DEFINE vc_str2tabwordwrap. "convierte string en contenido de tabla interna
"sin romper las palabras
"vc_str2tabwordwrap string tablainterna.
perform vc_str2tabwordwrap tables &2 using &1.
END-OF-DEFINITION.
*
FORM vc_str2tabwordwrap TABLES ptable
USING pstring.
DATA ltablength TYPE i.
DATA lauxline TYPE string.
DATA lauxlinepre TYPE string.
DATA lauxlen TYPE i.
DATA lguion.
DATA: BEGIN OF lit_previas OCCURS 0,
palabra(72),
END OF lit_previas.
DATA: BEGIN OF lit_palabras OCCURS 0,
palabra(72),
END OF lit_palabras.
CLEAR lauxline.
SPLIT pstring AT space INTO TABLE lit_previas.
DESCRIBE FIELD ptable LENGTH ltablength IN CHARACTER MODE.
* comprobamos que las palabras quepan SIEMPRE
lguion = 'X'.
WHILE lguion = 'X'.
CLEAR lguion.
REFRESH lit_palabras.
LOOP AT lit_previas.
lauxlen = STRLEN( lit_previas-palabra ).
IF lauxlen > ltablength.
ltablength = ltablength - 1.
CONCATENATE lit_previas-palabra(ltablength)
'-'
INTO lit_palabras-palabra.
APPEND lit_palabras.
lauxlen = lauxlen - ltablength.
lit_palabras-palabra = lit_previas-palabra+ltablength(lauxlen).
ltablength = ltablength + 1.
APPEND lit_palabras.
lguion = 'X'.
ELSE.
lit_palabras = lit_previas.
APPEND lit_palabras.
ENDIF.
ENDLOOP.
lit_previas[] = lit_palabras[].
ENDWHILE.
* hacemos la carga definitiva
LOOP AT lit_palabras.
lauxlinepre = lauxline.
CONCATENATE lauxline lit_palabras-palabra INTO lauxline
SEPARATED BY space.
CONDENSE lauxline.
lauxlen = STRLEN( lauxline ).
IF lauxlen > ltablength.
ptable = lauxlinepre. APPEND ptable.
lauxline = lit_palabras-palabra.
ENDIF.
ENDLOOP.
APPEND lauxline TO ptable.
ENDFORM. "vc_str2tabwordwrap
***********************************************************************
DEFINE vc_str2tline."convierte string en contenido de tabla TLINE (texto sap)
"sin romper las palabras
"vc_str2tline string tablainternatipotline.
perform vc_str2tline tables &2 using &1.
END-OF-DEFINITION.
*
FORM vc_str2tline TABLES ptline
USING pstring.
DATA: lwa_tline LIKE tline.
DATA: BEGIN OF lit_lines OCCURS 0,
linea LIKE tline-tdline,
END OF lit_lines.
vc_str2tabwordwrap pstring lit_lines.
LOOP AT lit_lines.
CLEAR lwa_tline.
IF sy-tabix = 1.
lwa_tline-tdformat = '*'.
ENDIF.
lwa_tline-tdline = lit_lines-linea.
APPEND lwa_tline TO ptline.
ENDLOOP.
ENDFORM. "vc_str2tline
***********************************************************************
DEFINE vc_tline2str."convierte contenido tabla TLINE (texto sap) en string
"vc_tline2str tablainternatline string.
perform vc_tline2str tables &1 using &2.
END-OF-DEFINITION.
*
FORM vc_tline2str TABLES ptline
CHANGING pstring.
DATA: lwa_tline LIKE tline.
DATA: BEGIN OF lit_lines OCCURS 0,
linea LIKE tline-tdline,
END OF lit_lines.
LOOP AT ptline INTO lwa_tline.
lit_lines-linea = lwa_tline-tdline.
APPEND lit_lines.
ENDLOOP.
vc_tab2str lit_lines pstring.
ENDFORM. "vc_tline2str
|
|