Usuwanie spacji na końcu rekordu w IT

Jeśli programujesz, administrujesz, integrujesz i masz wątpliwość lub obawę, to właśnie najlepsze miejsce dla Ciebie. Pisz śmiało...
emil
Posty: 61
Rejestracja: pt gru 27, 2019 11:02 am
Has thanked: 12 times
Been thanked: 21 times

Usuwanie spacji na końcu rekordu w IT

Post autor: emil »

uwaga: ten temat poprzednio był widoczny jako "Znikająca spacja na 1 pozycji rekordu w itab po cięciu tekstu" - zmodyfikowałem tytuł i opis problemu - po drobnym doświadczeniu okazało się, że na zagadnienie trzeba zerknąć z innej strony.

Mamy program: wrzucam sobie do it_data ciągi od 1,2,3,...,9,0.
W pierwszym rekordzie jak widać, zamiast 9 jest spacja.

Kod: Zaznacz cały

*&---------------------------------------------------------------------*
*& Report Z_TEST_001
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT Z_TEST_001.

data: lv_txt(100) type c.

    TYPES: BEGIN OF ls_data,
             txt(10)  TYPE c,
           END OF ls_data.

    DATA: it_data TYPE TABLE OF ls_data.
    DATA: wa_data LIKE LINE OF it_data.

lv_txt = '123456789 1234567890123456789012345678901234567890'.

write: lv_txt+0(10), /.
wa_data-txt = lv_txt+0(10).
append wa_data to it_data.

write: lv_txt+10(10), /.
wa_data-txt = lv_txt+10(10).
append wa_data to it_data.

write: lv_txt+20(10), /.
wa_data-txt = lv_txt+20(10).
append wa_data to it_data.

write: lv_txt+30(10), /.
wa_data-txt = lv_txt+30(10).
append wa_data to it_data.

write: lv_txt+40(10), /.
wa_data-txt = lv_txt+40(10).
append wa_data to it_data.

clear wa_Data.

write: /, 'teraz z it:', /.

loop at it_data into wa_Data.
  write: wa_data-txt, /.
  ENDLOOP.
W momencie, gdy chcę odczytać wartość z pierwszego rekordu tabeli wewnętrznej, widzę, że znika mi spacja na końcu ciągu.
Tak samo jest w momencie, gdy ciąg '123456789 ' wrzucam do it_Data.
znika_Spacja_2.png
znika_Spacja_1.png
W jaki sposób zabezpieczyć spację na końcu lv_txt+0(10) przed pominięciem?
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Ostatnio zmieniony pn lip 12, 2021 11:29 am przez emil, łącznie zmieniany 2 razy.
ZETKA
Posty: 57
Rejestracja: czw lis 04, 2010 10:49 pm
Has thanked: 1 time
Been thanked: 49 times

Re: Znikająca spacja na 1 pozycji rekordu w itab po cięciu tekstu

Post autor: ZETKA »

Proszę spróbować zdefiniować docelowe komponenty TXT jako STRING a nie CHAR.
Pozdrawiam,
Krzysiek
emil
Posty: 61
Rejestracja: pt gru 27, 2019 11:02 am
Has thanked: 12 times
Been thanked: 21 times

Re: Znikająca spacja na 1 pozycji rekordu w itab po cięciu tekstu

Post autor: emil »

ZETKA pisze: pn lip 12, 2021 11:19 am Proszę spróbować zdefiniować docelowe komponenty TXT jako STRING a nie CHAR.
Spróbowałem ze STIRNGiem, nie pomogło.

Natrafiłem za to na coś, co całkiem mnie zaskoczyło: wyrzucając tekst na ekran z it_Data, wrzuciłem kolor na tło tekstu. Jak się okazuje, spacja tam jest i ma się bardzo dobrze, czyli w IT się utrzymała:
znika_Spacja_3.png
Wychodzi więc na to, że debuger nie pokaże mi spacji, zaznaczenie teksty (ctrl+y) nie pokaże mi spacji, ale jest ona i ma się całkiem dobrze.

Przechodzimy do sedna sprawy...

W chwili, gdy tabelę wewnętrzną wrzucam do smartforma, bohater naszego postu, czyli spacja na końcu wpisu w komórce IT_DATA znów nie jest widoczna. Smartform jej nie widzi = nie wrzuca jej na druk.
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
ZETKA
Posty: 57
Rejestracja: czw lis 04, 2010 10:49 pm
Has thanked: 1 time
Been thanked: 49 times

Re: Usuwanie spacji na końcu rekordu w IT

Post autor: ZETKA »

Typ C ignoruje spacje na końcu ciągu znaków, typ STRING nie.

Proszę spróbować:

Kod: Zaznacz cały

DATA: lv_txt TYPE string.

TYPES: BEGIN OF ls_data,
  txt  TYPE string,
END OF ls_data.

DATA: it_data TYPE TABLE OF ls_data.
DATA: wa_data LIKE LINE OF it_data.

lv_txt = `123456789 1234567890123456789012345678901234567890`.

WRITE: lv_txt+0(10), /.
wa_data-txt = lv_txt+0(10).
APPEND wa_data TO it_data.

WRITE: lv_txt+10(10), /.
wa_data-txt = lv_txt+10(10).
APPEND wa_data TO it_data.

WRITE: lv_txt+20(10), /.
wa_data-txt = lv_txt+20(10).
APPEND wa_data TO it_data.

WRITE: lv_txt+30(10), /.
wa_data-txt = lv_txt+30(10).
APPEND wa_data TO it_data.

WRITE: lv_txt+40(10), /.
wa_data-txt = lv_txt+40(10).
APPEND wa_data TO it_data.

CLEAR: wa_data, lv_txt.

WRITE: /, 'teraz z it:', /.

LOOP AT it_data INTO wa_data.
  lv_txt = lv_txt && wa_data-txt.
ENDLOOP.

WRITE: lv_txt.
Pozdrawiam,
Krzysiek
emil
Posty: 61
Rejestracja: pt gru 27, 2019 11:02 am
Has thanked: 12 times
Been thanked: 21 times

Re: Usuwanie spacji na końcu rekordu w IT

Post autor: emil »

Wykorzystanie STRINGa sprawiło, że napotkałem na inny problem, z którym nie potrafię sobie poradzić.
Nie wiem, czy to upały, czy pomroczność jasna...

Dla kodu który wklejałem i który modyfikował ZETKA, może zaistnieć przypadek w którym STRING ma np. 5 znaków.
Jeśli będę próbował do WA wrzucić wartość z lv_txt+0(10), to zgodnie z wszystkimi prawidłami, SAP wywali mi błąd STRING_OFFSET_TOO_LARGE.

Pytanie brzmi następująco (dla przykładowego kodu z tematu):

w jaki sposób jednocześnie kontrolować, by nie odpytać o zakres znaków spoza długości STRINGa, a jednocześnie dzielić STRING na odpowiednie kawałki (długości)?

Teoretycznie mam jakiś zamysł, ale gdy zacząłem go realizować, ilość ifów, elsów i strlen`ów była tak okrutna, że nawet mnie to raziło...

Jakieś sugestie?
ZETKA
Posty: 57
Rejestracja: czw lis 04, 2010 10:49 pm
Has thanked: 1 time
Been thanked: 49 times

Re: Usuwanie spacji na końcu rekordu w IT

Post autor: ZETKA »

Napisałem z ręki więc może są jakieś błędy, ale mniej więcej o to chodzi.
Pewnie trzeba jeszcze obsłużyć string o zerowej długości.

Kod: Zaznacz cały

DATA: itab      TYPE TABLE OF string,
      in_string TYPE string.
      
CONSTANTS: out_length TYPE i VALUE 10.

in_string = `qwertyuiopasdfghjklzxcvbnm.........`.

DO.
  string_length = strlen( in_string ).
  IF string_length GE out_length.
    APPEND lv_string(out_length) TO itab.
    lv_string = shift_left( val = lv_string places = out_length ).
  ELSE.
    APPEND lv_string(string_length) TO itab.
    EXIT  
  ENDIF.
ENDDO.
Pozdrawiam,
Krzysiek
emil
Posty: 61
Rejestracja: pt gru 27, 2019 11:02 am
Has thanked: 12 times
Been thanked: 21 times

Re: Usuwanie spacji na końcu rekordu w IT

Post autor: emil »

Dla potomnych: poprawiony kod.

Kod: Zaznacz cały

DATA: itab      TYPE TABLE OF string,
      lv_string TYPE string,
      string_length type i.

CONSTANTS: out_length TYPE i VALUE 5.

lv_string = `qwer yuio pasdfghjklzxcvbnm.........`.
 
DO.
  string_length = strlen( lv_string ).
  IF string_length GE out_length.
    APPEND lv_string(out_length) TO itab.
    lv_string = shift_left( val = lv_string places = out_length ).
  ELSE.
    APPEND lv_string(string_length) TO itab.
    EXIT  .
  ENDIF.
ENDDO.
Nadal do obsłużenie pozostaje string o zerowej długości.

***** ***

ZETKA, dokładnie o takie rozwiązanie chodziło, dziękuję.
Idę teraz oglądać, jak wyglądają spacje na końcu ;)
emil
Posty: 61
Rejestracja: pt gru 27, 2019 11:02 am
Has thanked: 12 times
Been thanked: 21 times

Re: Usuwanie spacji na końcu rekordu w IT

Post autor: emil »

Pora powrócić do pierwotnego problemu, czyli uciekającej spacji na końcu tekstu. Tak, jak pisał ZETKA, zmiana typu danych na STTRING pomogła, końcowa spacja nie znika.

Nie zmieniło to sytuacji, która jest bezpośrednim powodem powstania tego wątku: "końcowa" spacja znika w momencie, gdy na smartformie składam sobie pełen tekst z tekstu pokrojonych na 250 znakowe kawałki (co wynika z ograniczenia smartformów w zakresie max długości tekstu podanego np przez IT).

By wykluczyć błąd po stronie ABAPa zbierającego dane do smartforma, wyciągnąłem program do obiektu lokalnego, w którym nie uruchamiam generowania pdf, tylko przygotowane dane (docelowo podawane do MF odpalającego smartform) wyświetlam sprawdzając, czy "ostatni element" kodu nadal ma końcową spację.

Write z dorzuconym kolorem fajnie pokazuje, czy mamy spację w rekordzie itaba:
spacja1.png
Wyświetlenie danych z itaba następuje dosłownie linijkę wcześniej, niż odpalenie FM smartforma, więc zakładamy, że dane są poprawnie przygotowane.

Oczywiście na samym smartformie znów pojawia się problem:
spacja2.png
Jak widać, spacja wyparowała.

Struktura wykorzystywana do obsługi danych podawanych smarftormowi przez FM jest identyczna jak ta, którą wykorzystuje ABAP przygotowujący dane. Tabele wewnętrzna do której smartform loopuje dane z MF, także jest oparta na tej samej strukturze, nie ma więc możliwości, by string został przekonwertowanych do c.
Może to jakiś mechanizm smartforma ucina spacje w końcówkach przy poniższym łączeniu tekstów?
spacja3.png
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.