Forms und feldsymbole

Getting started ... Alles für einen gelungenen Start.
30 Beiträge • Seite 1 von 2 (current) Nächste
30 Beiträge Seite 1 von 2 (current) Nächste

Forms und feldsymbole

Beitrag von RIG (Specialist / 110 / 30 / 1 ) »
Kann man das überhaupt in eine Subroutine reinschmeißen oder geht das nicht?


Select * from zkob_cars into CORRESPONDING FIELDS OF TABLE gt_cars_bookrent.
Select * from zkob_sched into CORRESPONDING FIELDS OF TABLE gt_sched_bookrent.


Perform write_to_gs USING gt_cars_bookrent
<gs_cars_bookrent>
Changing gs_cars_bookrent.

Perform write_to_gs USING gt_sched_bookrent
<gs_sched_bookrent>
Changing gs_sched_bookrent.

*&---------------------------------------------------------------------*
*& Form WRITE_TO_GS
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_GT_CARS_BOOKRENT text
* -->P_<GS_CARS_BOOKRENT> text
* <--P_GS_CARS_BOOKRENT text
*----------------------------------------------------------------------*
form WRITE_TO_GS using ut_cars_bookrent
us_cars_bookrent
changing cs_Structure.

endform. " WRITE_TO_GS

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


Re: Forms und feldsymbole

Beitrag von Unit605 (Expert / 975 / 37 / 93 ) »
Versuch macht kluch... (klug).

Warum probierst Du es nicht einfach aus?

Ich nehme an, das --> <gs_cars_bookrent> soll ein Field-Symbol sein.

Wo wird das Field symbol denn 'assigned'?

Re: Forms und feldsymbole

Beitrag von RIG (Specialist / 110 / 30 / 1 ) »
Also der Code ist nur ein Beispiel.

Das Feldsymbol soll erst im Unterprogramm assigned werden beim Loopen.

Ich weiß halt nicht ob ich das so machen kann:

Code: Alles auswählen.


DATA: gt_cars_bookrent TYPE STANDARD TABLE OF zkob_cars,
          gt_sched_bookrent TYPE STANDARD TABLE OF zkob_sched.

FIELD SYMBOLS: <gs_cars_bookrent> TYPE zkob_cars,
                         <gs_sched_bookrent> TYPE zkob_sched,

Select * from zkob_cars into CORRESPONDING FIELDS OF TABLE gt_cars_bookrent.
Select * from zkob_sched into CORRESPONDING FIELDS OF TABLE gt_sched_bookrent.

Perform write_to_gs    USING  gt_cars_bookrent
                                            <gs_cars_bookrent>
                                              gv_class.

Perform write_to_gs USING     gt_sched_bookrent
                                            <gs_sched_bookrent>
                                              gv_class.

*&---------------------------------------------------------------------*
*& Form MYEXAMPLE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_GT_CARS_BOOKRENT text
* -->P_<GS_CARS_BOOKRENT> text
* <--P_GS_CARS_BOOKRENT text
*----------------------------------------------------------------------*
form MYEXAMPLE   using ut_bookrent TYPE ANY TABLE
                                     us_bookrent TYPE ANY
                                     uv_class

Loop on ut_bookrent ASSIGNING <us_bookrent> where rentclass = uv_class.

"Code here

EndLoop.
endform. " WRITE_TO_GS







Bisher habe ich Feldsymbole nie als Parameter übergeben sondern sie einfach Global deklariert und in meinen Forms benutzt, weiß auch nicht genau ob das so richtig ist. In diesem Fall komme ich aber nicht drum rum, oder ich schreibe 2 Forms was ja auch wieder murks ist. Ich habe schon danach gesucht, aber bin leider noch nicht fündig geworden nach dieser Variante. Ich habe die möglichkeit gesehen das Feldsymbol vor dem Perform zuzuweisen, aber dann hab ich komplett den Überblick verloren wie ich das für meine Bedürfnisse umbauen muss. Sorry, ich werd erstmal eine Nacht drüber schlafen und morgen wieder frisch probieren. Das hilft auch schon oft.

VIelen Dank für die Antwort erstmal, wenn ich es schaffe poste ich auch gern meine Lösung hier.

MfG RiG

Re: Forms und feldsymbole

Beitrag von Unit605 (Expert / 975 / 37 / 93 ) »
Man muss nicht immer und unbedingt Field-Symbols verwenden.

Man kann auch alle Uebergabeparameter an eine Formroutine uebergeben, die Du fuer beide Aktionen brauchst.
Es muessen ja nicht alle Uebergabeparameter gefuellt sein :wink:
In der Routine kannst Du dann abfragen, welche Parameter gefuellt sind und danach Deine Aktionen folgen lassen.

Mach es am Anfang einfach nicht zu kompliziert. Lieber erst einfach, aber dass es funktioniert.

Lieber mal paar Zeilen doppelt im Program als stundenlang ueber etwas 'dynamisches' Nachdenken.

Mit der Zeit kann man sich dann steigern.

Re: Forms und feldsymbole

Beitrag von a-dead-trousers (Top Expert / 4399 / 223 / 1182 ) »
hi!

Code: Alles auswählen.

Perform write_to_gs 
  USING gt_cars_bookrent
        <gs_cars_bookrent>
        gv_class.
Das Coding wird vermutlich dumpen solange dein Feldsymbol noch nicht zugewiesen ist. Mir ist keine einzige Schnittstelle (Form, Method, Submit, FuBa) in ABAP bekannt die Feldsymbole unterstützt. Vorallem ist ein Zuweisen eines Feldsymbols das über die Schnittstelle übergeben wird schlicht nicht möglich, da Parameter die Zeichen < > nicht enthalten dürfen und daher nicht als Feldsymbole interpretiert werden können.

Wenn du wirklich sauber und modular arbeiten willst, musst du entweder das Feldsymbol in jeder Unterroutine extra definieren, oder du verwendest statt eines Feldsymbols eine Datenreferenz in deiner Schnittstelle.

Code: Alles auswählen.

Perform read_mara
  USING ut_mara TYPE mara_tab
        ur_mara TYPE REF TO mara.
Das kannst du dann ähnlich wie Feldsymbole verwenden und es funktioniert auch mit jeder Schnittstelle (außer RFC).

lg ADT
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: Forms und feldsymbole

Beitrag von ewx (Top Expert / 4849 / 313 / 642 ) »
RIG hat geschrieben:Ich weiß halt nicht ob ich das so machen kann:
Hi Rig,

wie du sicherlich bemerkt hast, kannst du in der FORM-Anweisung nicht mitgeben, dass der Übergabeparameter ein Feldsymbol ist.
Deswegen kannst du es auch nicht in der Routine über den Übergabeparameter zuweisen.

Du kannst natürlich ein Feldsymbol übergeben aber du kannst ein Feldsymbol nicht "unassigned" übergeben wie folgendes kleine Beispiel zur Erzeugung eines Kurzdumps zeigt:

Code: Alles auswählen.

 FIELD-SYMBOLS <a> type c.
  PERFORM a CHANGING <a>.
  FORM a CHANGING a type c.
  ENDFORM.
  

Ansonsten gebe ich Unit605 recht (auch wenn ich Mach-es-doch-anders-Antworten zu einem Warum-geht-das-so-nicht-Problem immer blöd finde... ;)
Meiner Erfahrung nach versuchen "Dynamische Programmieranfänger" wirklich immer viel zu viel am Anfang.
Man muss sich aber nach und nach herantasten um ein Gefühl dafür zu bekommen, was dynamisch machbar und sinnvoll ist und und vor allen Dingen, was wirklich nötig ist.

Re: Forms und feldsymbole

Beitrag von RIG (Specialist / 110 / 30 / 1 ) »
Habe es jetzt erstmal so gelöst:

Code: Alles auswählen.

Perform write_to_gs USING gt_cars_bookrent
                          gt_dummy
                    Changing gs_cars_bookrent.

Perform write_to_gs USING gt_dummy
                          gt_sched_bookrent
                    Changing gs_sched_bookrent.

*&---------------------------------------------------------------------*
*&      Form  WRITE_TO_GS
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_GT_CARS_BOOKRENT  text
*      -->P_<GS_CARS_BOOKRENT>  text
*      <--P_GS_CARS_BOOKRENT  text
*----------------------------------------------------------------------*
form WRITE_TO_GS  using    ut_cars_bookrent type any table "tt_cars_bookrent
                           ut_sched_bookrent type any table " tt_sched_bookrent
                  changing cs_Structure type any.

field-symbols:  <ls_sched_bookrent> type ts_sched_bookrent,
                <ls_cars_bookrent> type ts_cars_bookrent.


If ut_cars_bookrent is not INITIAL.

  LOOP AT ut_cars_bookrent assigning <ls_cars_bookrent> .

  ENDLOOP.

endif.


If ut_sched_bookrent is not INITIAL.

  LOOP AT ut_sched_bookrent assigning <ls_sched_bookrent> .

  ENDLOOP.

endif.


endform.                    " WRITE_TO_GS

Aber glücklich macht mich das noch nicht aber es funktioniert :-)

Viele Grüße und danke an Alle!

Re: Forms und feldsymbole

Beitrag von black_adept (Top Expert / 4099 / 128 / 941 ) »
Da wären aber 2 FORMs lesbarer gewesen.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Forms und feldsymbole

Beitrag von RIG (Specialist / 110 / 30 / 1 ) »
black_adept hat geschrieben:Da wären aber 2 FORMs lesbarer gewesen.

Da Sie aber dieselbe Funktion haben und ich hier nicht um doppelten Code herumkomme ist es doch besser der doppelte code steht an einer Stelle oder?
Ändere ich die Funktionalität der Funktion, darf ich nicht vergessen die 2. Variante mit zu ändern, das kann jetzt nicht passieren.

Wie gesagt, mir gefällts auch nicht.

Code: Alles auswählen.


Select RENTCLASS KENNZEICHEN LAUFLEISTUNG EINHEIT
      from        ZKOB_CARS
      into TABLE  ct_cars_bookrent.
     
      Sort ct_cars_bookrent by Rentclass
                               Kennzeichen DESCENDING .

      Perform CountGroupLines Using     ut_dummy
                                        ct_cars_bookrent
                                        uv_class_want
                              CHANGING  lv_group_rows_cars.


Code: Alles auswählen.

form COUNTGROUPLINES  using    ut_sched_bookrent  Type any table
                               ut_cars_bookrent   Type any table
                               uv_class_want  type zrig_rentclass
                      changing cv_rows_count type i.

data: lv_groupfirstrow type i,
      lv_grouplastrow type i.

*----------------------------------------------------------------------------------------------------
IF ut_sched_bookrent is not INITIAL.

  LOOP AT ut_sched_bookrent ASSIGNING <gs_sched_bookrent> WHERE rentclass = uv_class_want.

    AT NEW rentclass.
      lv_groupfirstrow = sy-tabix.
    ENDAT.

    AT END OF rentclass.
      lv_grouplastrow = sy-tabix.
    ENDAT.

  ENDLOOP.

*----------------------------------------------------------------------------------------------------
ElseIF ut_cars_bookrent is not INITIAL.

  LOOP AT ut_cars_bookrent ASSIGNING <gs_cars_bookrent> WHERE rentclass = uv_class_want.

    AT NEW rentclass.
      lv_groupfirstrow = sy-tabix.
    ENDAT.

    AT END OF rentclass.
      lv_grouplastrow = sy-tabix.
    ENDAT.

  ENDLOOP.

ENDIF.
*----------------------------------------------------------------------------------------------------

  IF lv_grouplastrow > 0.
    cv_rows_count = lv_grouplastrow - lv_groupfirstrow + 1.
  else.
    cv_rows_count = 0.
  ENDIF.

endform.                    " COUNTGROUPLINES
Für Verbesserungsvorschläge hab ich immer Ohren, deswegen bin ich ja hier :-)

Viele Grüße
RiG

Re: Forms und feldsymbole

Beitrag von ewx (Top Expert / 4849 / 313 / 642 ) »
RIG hat geschrieben:
black_adept hat geschrieben:Da wären aber 2 FORMs lesbarer gewesen.
Da Sie aber dieselbe Funktion haben und ich hier nicht um doppelten Code herumkomme ist es doch besser der doppelte code steht an einer Stelle oder?
Ändere ich die Funktionalität der Funktion, darf ich nicht vergessen die 2. Variante mit zu ändern, das kann jetzt nicht passieren.
Nicht nur lesbarer auch wartbarer.
Der Code kann gar nicht gleich/ doppelt sein, da beide Tabellen unterschiedliche Felder haben!!
Und wenn es nur um die Ausgabe als "Funkion" geht: Was könnten denn das für Änderungen sein, die die Ausgabe von beiden "Funktionen" gleichermaßen beträfe?
Und selbst wenn (falls z.B. jeweils die Schlüsselfelder in rot dargestellt werden sollen), so musst du das für jede Funktion definieren, dass es so sein soll und dementsprechend auch jede Funktion einzeln anpassen.

Richtig unleserlich und schlecht wartbar wird es dann, wenn du noch zusätzliche Leseroutinen, Prüfungen und sonstiges "Brimborium" zu jeder Ausgabe hast.

Dann hast du nämlich nicht nur zwei IF-Abfragen mit den Loops, sondern auch noch Datendeklarationen, von denen du später nicht mehr weisst, ob die nun von beiden "Funktionen" benutzt werden oder nur von einer und von welcher?
Also: Zwei Forms!

Re: Forms und feldsymbole

Beitrag von RIG (Specialist / 110 / 30 / 1 ) »
Ach mist...

es geht doch nicht....

ich hatte es nur ohne where ausprobiert, jetzt mit dem Loop ...Where.... geht es nicht mehr.

bei Loop... where ... muss der Zeilentyp der Tabelle statisch bekannt sein.


Ich brauch wohl doch eine saubere Lösung.

Ich will ja nur Zeilen zählen in 2 Verschiedenen Tabellen - mit gleichem Suchkriterium.
Tabelle 1:

AA BA CA
1 8 12
1 7 6
1 1 3
2 6 3
2 ...
4 ...
4 ...
4 ...
4 ...
4 ...


Tabelle 2:

Tabelle 1:

AA BA CA
1 5 bla
1 2 bla
2 3 bla
2 3 bla
2 ...
3 ...
4 ...
4 ...
4 ...
4 ...


Also ich möchte wissen wieviel Zeilen gibt es in Tabelle 1 mit AA = 2 (Ergebis: 2) und in Tabelle 2 mit AA = 2 (Ergebis: 3)


Die Tabellen werden vorm zählen logischerweise sortiert. :-)

Irgendwelche Vorschläge wie man das am besten macht?

Viele Grüße RiG

Re: Forms und feldsymbole

Beitrag von ewx (Top Expert / 4849 / 313 / 642 ) »
ja, z.B. so:

Code: Alles auswählen.

field-symbols <data> type any.
field-symbols <value> type any.
*-- ersten Eintrag finden
read table gt_data 
      with key ('AA') = vergleichswert transporting no fields
if sy-subrc = 0.
lv_tabix = sy-tabix.
lv_anzahl = 1.
do.
add 1 to lv_tabix.
*-- nächsten Eintrag lesen
read table gt_data index lv_tabix assigning <data>.
if sy-subrc = 0.
assign component 'AA' of structure <data> to <value>.
*-- und vergleichen
if sy-subrc = 0 and <vlaue> = vergleichswert.
  add 1 to lv_anzahl.
else.
exit. "from do
endif.
endif.
enddo.
endif.
ist aber eben auch deutlich komplizierter als einfach zwei LOOP - WHERE Befehle zu schreiben.

Alternative wäre ein Makro:

Code: Alles auswählen.

define count_entries.
loop at &1 transporting no fields where &2 = &3.
add 1 to &4.
endloop.
end-of-definition.
Aufruf der Makros:

Code: Alles auswählen.

count_entries gt_cars aa '2' count1.
count_entries gt_sched aa '2' count2.
&amp ist das "kaufm. UND"...!

Folgende Benutzer bedankten sich beim Autor ewx für den Beitrag:
RIG


Re: Forms und feldsymbole

Beitrag von black_adept (Top Expert / 4099 / 128 / 941 ) »
Hi RIG,

in einem soooooo einfachen Fall kannst du dann natürlich auch 1 Form für beides nehmen: Ich gebe dir aber nur ein Outline - du sollst schon selber noch ein wenig rumfrickeln. Das bringt dir letztlich mehr.

1.) Übergabe der Tabelle (generisch) und des Suchwertes ( am besten Typisiert ).
2.) Loop ... Assigning in ein generisches Feldsymbol ( das dann zur Laufzeit deiner Tabellenzeile entspricht ).
3.) Innerhalb des Loop machst du ein MOVE-CORRESPONDING in eine typisierte Struktur, die mindestens das Feld enthält, welches du auswerten möchtest.
4.) Test der typisierten Struktur ob der Suchwert erfüllt ist. Falls ja: zählen

Folgende Benutzer bedankten sich beim Autor black_adept für den Beitrag:
RIG

live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Forms und feldsymbole

Beitrag von RIG (Specialist / 110 / 30 / 1 ) »
black_adept hat geschrieben:Hi RIG,
....
2.) Loop ... Assigning in ein generisches Feldsymbol ( das dann zur Laufzeit deiner Tabellenzeile entspricht ).
...
Genau da steh ich ja wieder vor meinem Problem mit dem Feldsymbol in meiner Form. Wenn es erst zur Laufzeit zugewiesen werden soll und ich es nicht übergeben darf hab ich noch keinen geschmeidigen Einfall.

Der Rest klingt logisch :-)

VG RiG

Re: Forms und feldsymbole

Beitrag von black_adept (Top Expert / 4099 / 128 / 941 ) »
Definier das FS vom Type ANY. Dann bekommt es automatisch beim LOOP AT...ASSIGNING den korrekten Type zugewiesen.

Folgende Benutzer bedankten sich beim Autor black_adept für den Beitrag:
RIG

live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Vergleichbare Themen

4
Antw.
2421
Views
Feldsymbole
von kleiner SAPler » 20.06.2006 08:14 • Verfasst in ABAP® Core
1
Antw.
3072
Views
Feldsymbole
von JetGum » 16.07.2007 14:03 • Verfasst in ABAP® für Anfänger
2
Antw.
1513
Views
Makros und Feldsymbole
von kleiner SAPler » 26.06.2006 10:53 • Verfasst in ABAP® Core
0
Antw.
1003
Views
Assign und Feldsymbole
von kleiner SAPler » 20.06.2006 07:53 • Verfasst in ABAP® Core
4
Antw.
2380
Views
Erneut Feldsymbole & Datenreferenzen
von Vrosk » 09.11.2005 14:40 • Verfasst in ABAP® Core

Aktuelle Forenbeiträge

Regex in where
vor 7 Stunden von edwin 7 / 163
Daten an Tabelle binden
vor 20 Stunden von Bright4.5 3 / 1487

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.

Aktuelle Forenbeiträge

Regex in where
vor 7 Stunden von edwin 7 / 163
Daten an Tabelle binden
vor 20 Stunden von Bright4.5 3 / 1487

Unbeantwortete Forenbeiträge

aRFC im OO-Kontext
vor 5 Wochen von ralf.wenzel 1 / 3261
Hilfe bei SWEC/SWE2
September 2024 von retsch 1 / 9822