Problem z programem dla TR

Jeśli programujesz, administrujesz, integrujesz i masz wątpliwość lub obawę, to właśnie najlepsze miejsce dla Ciebie. Pisz śmiało...
ODPOWIEDZ
Lebenin
Posty: 42
Rejestracja: pt paź 10, 2008 3:07 pm
Lokalizacja: Wrocław

Problem z programem dla TR

Post autor: Lebenin »

Witam

Podczas tworzenia/zmiany programu dotyczącego treasury pojawił mi się następujący error w programie typu include uniemożliwiający uruchomienie programu głównego:

"Each ABAP program can contain only one "REPORT", "PROGRAM", "FUNCTION-", "POOL" statement."

Po głębszym "wniknięciu" informuje mnie o tym, że:

"REPORT/PROGRAM statement missing, or program type is I (INCLUDE)."

I tu ma rację bo to jest include, tylko co teraz zrobić, aby system mnie "przepuścił"?

Z góry dziękuję za wszelkie uwagi oraz sugestie.

A oto początek kodu i miejsce gdzie system wskazuje mi błąd (oznaczone '!!'):

*&---------------------------------------------------------------------*
*& Include ZFII_..... *
*&---------------------------------------------------------------------*
*--Tables
!! TABLES : fdsb,t001,t036. "#EC NEEDED
*--type-pools
TYPE-POOLS : slis.
*--constants
CONSTANTS : c_x TYPE char1 VALUE 'X',
.
.
.


Pozdrawiam
Lebenin
radek.kiela
Posty: 37
Rejestracja: pn sie 06, 2007 8:40 pm

Post autor: radek.kiela »

No, to zależy od kontekstu, w którym jest ten program dołączony do programu głównego (w którym jest instrukcja INCLUDE).
Mały wycinek z "BC - ABAP Programming":
"For example, you cannot declare a table work area that is defined by the TABLES statement with
another TABLES statement inside a subroutine."
Szedłbym właśnie tym tropem...
Jesli o to chodzi, to musiałbyś uzyć LOCAL przed TABLES.

Przypadek braku deklaracji REPORT/PROGRAM pomijam, bo to nie jest chyba "TOP INCLUDE".
Radek
Lebenin
Posty: 42
Rejestracja: pt paź 10, 2008 3:07 pm
Lokalizacja: Wrocław

Post autor: Lebenin »

Odonośnie braku deklaracji REPORT/PROGRAM to tak, jest to TOP INCLUDE.
Lebenin
radek.kiela
Posty: 37
Rejestracja: pn sie 06, 2007 8:40 pm

Post autor: radek.kiela »

Jeśli jest to TOP INCL., to pewnie jest dołączony do programu głównego typu 1. Więc powinieneś tu (w Twoim includzie) zawrzeć deklarację PROGRAM/REPORT.
Radek
Lebenin
Posty: 42
Rejestracja: pt paź 10, 2008 3:07 pm
Lokalizacja: Wrocław

Post autor: Lebenin »

Deklaracja zawarta w programie głównym:

REPORT Zfir_... .
*--top include
INCLUDE Zfii_...._top.

Zrobiłem również deklarację w include i ciągle system informuje mnie o tym samym błędzie. Co jest dziwne (przynajmniej dla mnie) działa to w taki sposób iż:

1. Gdy w include wstawie deklaracje system informuje:

Each ABAP program can contain only one "REPORT", "PROGRAM", "FUNCTION-POOL" statement.

2. Gdy ją usunę:

REPORT/PROGRAM statement missing, or program type is I (INCLUDE).

Deklaracja jest potrzebna i tu się zgodzę bo jak jest zadeklarowane to błąd wyskakuje nie przy sprawdzaniu składni ale podczas aktywowania. Jeżeli pozwole systemowi aktywować program mimo wszystko (zasugerował mi to znajomy któremu to pomogło w paru małych błędach) błąd wyskakuje przy uruchamianiu programu (ale nie krytyczny - w sensie wyrzucenia do menu głównego, tylko po prostu "czerwone światło" z informacją o błędzie wielokrotnej deklaracji - info. nr 1).
Lebenin
radek.kiela
Posty: 37
Rejestracja: pn sie 06, 2007 8:40 pm

Post autor: radek.kiela »

Z programu głownego usuń deklarację PROGRAM.
Ma być tylko w TOP INCL na początku.
Radek
Lebenin
Posty: 42
Rejestracja: pt paź 10, 2008 3:07 pm
Lokalizacja: Wrocław

Post autor: Lebenin »

Dziękuję za pomoc, pomogło.

Aby kontynuować konwersjację (chociaż to nie jest głównym powodem) wspomnę o kolejnym błędzie jaki się pojawił.

Głowny program zawiera pare "includów", w których pojawia sie informacja że pole xx jest niezdefiniowane. Info systemu:

Field "xx" is unknown. It is neither in one of the specified tables nor defined by a "DATA" statement . . . . . . . . . .

Błąd pojawia się w includ nr3 w miejscu oznaczonym "!!" (ten includ zawiera same Form-y ale narazie błąd wyskakuje tylko w tym - pewnie ponieważ jest pierwszy w kodzie)

*----------------------------------------------------------------------*
* Form aabbzz
*----------------------------------------------------------------------*

FORM aabbzz.
CLEAR: !!xx,
aa,
bb,
zz.
REFRESH: xx.
.
.
.

Natomiast jest on zdefiniowany w includzie nr1 następująco:

DATA: BEGIN OF xx OCCURS 23,
mm(01) TYPE c, "T(ag), W(oche), M(onat)
dd LIKE fomn-datum, "JJJJMMTT oder JJJJWW oder JJJJMM
* in DE steht D0 korrekt aufbereitet, Jahr 2stellig, rechtsbündig
vv(08 ) TYPE c,
uu LIKE fomn-datum, "Bis-Datum der jeweiligen Spalte
END OF xx.

Kolejność zamieszczenia w programie głownym każdego include jest zgodna z numeracją.

Na bardziej ogólnym poziomie natomiast system informuje mnie że Form aabbzz zawarty w kodzie nie istnieje - w rzeczywistości natomiast istnieje i bez problemu można do niego przejść nawet z miejsca w którym system pokazuje że go nie ma (sądze że jest to wina błędu z elementem xx).

Sytuacja powtarza się również w innych includach z zawartymi w nich "Formami", tu kolejny przykład (fomn to tabela):

W includ 4
FORM mnmn.
DATA: jjj LIKE !!oo,
.
.
.

Natomiast zadeklarowane w include 1:

DATA: ooo LIKE fomn-datum,
.
.
.

Również z góry dziękuję za wszelaką pomoc i sugestie.
Lebenin
radek.kiela
Posty: 37
Rejestracja: pn sie 06, 2007 8:40 pm

Post autor: radek.kiela »

Sprawa nie jest prosta, jeśli się nie widzi całej konstrukcji tego programu.

Ale spróbujmy tak:

1. istnieje program główny z Top Incl.

2. To właśnie w TOP powinieneś mieć zawarte wszystkie deklaracje danych globalnych, a zatem, jeśli masz je rozbite na kolejne Includ'y - dołącz je do TOP INCLUDE:

***TOP INCL
PROGRAM nazwa_programu MESSAGE-ID klasa_kom.

INCLUDE inc1. "zmienne/stałe, chociaż mogłyby być bezpośrednio w TOP
INCLUDE inc2. "zmienne/stałe, patrz uwaga wyżej
***TOP INCL.


3. A zatem program główny ma postać:

***MAIN PROGRAM
INCLUDE TOP_INCL. "dane globalne

INCLUDE inc3. "procedury
INCLUDE inc4. "procedury
***MAIN PROGRAM

4. wszystko to musi być zapisane (save) - ale nie aktywowane osobno.
5. wklikujesz się do ___PROGRAMU GŁÓWNEGO___
6. uruchamiasz aktywację:
aktywujesz ___PROGRAM GŁÓWNY___ oraz wszystkie inne jego składniki (include'y) w jednym kroku aktywacji

No tak jakoś bym to widział...
Radek
Lebenin
Posty: 42
Rejestracja: pt paź 10, 2008 3:07 pm
Lokalizacja: Wrocław

Post autor: Lebenin »

W tym wypadku dane były zadeklarowane w include1. Stworzyłem wiec na jego podstawie include TOP i pomogło... szkoda że tylko na chwile bo od razu pojawiły się inne nie zadeklarowane dane (oznaczenie !!).

SELECTION-SCREEN BEGIN OF BLOCK b0.
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-058.
SELECT-OPTIONS: s_bukrs FOR !! tabela-bukrs MEMORY ID buk,
s_gsber FOR tabela-gsber.
SELECTION-SCREEN END OF BLOCK b1.

Info systemu:
Field "FDSB-BUKRS" is unknown. It is neither in one of the specified tables nor defined by a "DATA" statement . . . . . . . . . .

Co więcej w programie głównym występuje to po includ TOP, w ktym jest juz zawarte tabela-bukrs i w tym wypadku jest wszystko ok, system nic nie "krzyczy" (przedstawione poniżej).

DATA: BEGIN OF bktab OCCURS 23,
bukrs LIKE tabela-bukrs,
waers LIKE tabla-dispw,
END OF bktab.
Lebenin
radek.kiela
Posty: 37
Rejestracja: pn sie 06, 2007 8:40 pm

Post autor: radek.kiela »

No tak, ale teraz istotne jest, gdzie jest zawarta definicja ekranu selekcji (SELECTION-SCREEN...)
Dla typizacji zmiennych w SELECT-OPTIONS musisz podać istniejący już obiekt danych po sł.kl. FOR (podobnie do LIKE).

Reasumując konstrukcja ekranu selekcji powinna być ujęta PO deklaracjach globalnych (nie ma to znaczenie dla PARAMETERS ale dla SO ma).

Zatem możesz sobie utworzyć kolejny Incl., najlepiej korzystając z nawigacji:

***
INCLUDE ekran_selekcji.
***
Przy czym wipisujesz to PO DEKLARACJACH GLOBALNYCH, ale przed definicją procedur (bo one mogą się odwoływać do zmiennych ekranu selekcji).
Radek
Lebenin
Posty: 42
Rejestracja: pt paź 10, 2008 3:07 pm
Lokalizacja: Wrocław

Post autor: Lebenin »

Ciągle pracuje nad tym programem, ale mam do niego pytanie bardziej ogólne. Czy przenosząc program ze starszej wersji systemu, w której nie było jeszcze TOP include, a który działa poprawnie, należy go stworzyć i przenieść tam wszystkie deklaracje, czy można pozostawić wszystko tak jak jest - czyli deklaracje w include1? (i "rzeźbić" w nim) Tak jak wspomniałem przenoszony program na nowszą wersję informuje właśnie o błędach, które tutaj przedstawiam, a które w starszej wersji nie wystepują.
Lebenin
ODPOWIEDZ