ABAP Routine Fortschreibungsregel im BW

Alles rund um die Sprache ABAP®: Funktionsbausteine, Listen, ALV
17 Beiträge • Seite 1 von 2 (current) Nächste
17 Beiträge Seite 1 von 2 (current) Nächste

ABAP Routine Fortschreibungsregel im BW

Beitrag von gruftassel (ForumUser / 31 / 0 / 0 ) »
Hallo,

hoffe es ist das richtige Forum.

möchte "Gültigkeitszeitraum-Merkmale" über eine Fortschreibung befüllen bzw. mit einer Routine abfragen. Wie sieht dann der ABAP aus. Leider sind meine Kentnisse sehr bescheiden.

Folgendes Codierung werden ja automatisch generiert. Wo und wie muss dann die Überprüfung erfolgen. Reicht denn ein normaler Select und an welcher Stelle muss er eingesetzt werden?

PROGRAM UPDATE_ROUTINE.

*$*$ begin of global - insert your declaration only below this line *-*

* TABLES: ...

* DATA: ...

*$*$ end of global - insert your declaration only before this line *-*



FORM compute_data_field

TABLES MONITOR STRUCTURE RSMONITOR "user defined monitoring

USING COMM_STRUCTURE LIKE /BIC/CSZKM_ZLMS_GP_KNE

RECORD_NO LIKE SY-TABIX

RECORD_ALL LIKE SY-TABIX

SOURCE_SYSTEM LIKE RSUPDSIMULH-LOGSYS

CHANGING RESULT LIKE /BIC/AZKM_O0100-VALIDFROM

RETURNCODE LIKE SY-SUBRC "Do not use!

ABORT LIKE SY-SUBRC. "set ABORT <> 0 to cancel update

*

*$*$ begin of routine - insert your code only below this line *-*

* fill the internal table "MONITOR", to make monitor entries

* result value of the routine



select * from Tabelle where Feldname >= 400 (Einzelzusagen)

RESULT = .



* if abort is not equal zero, the update process will be canceled

ABORT = 0.

*$*$ end of routine - insert your code only before this line *-*

*

ENDFORM.

Vielen Dank für Euro Hilfe. Wäre toll, wenn ihr mir helfen könnet.
Gruss marco

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


Beitrag von ereglam (Top Expert / 1829 / 2 / 7 ) »
Hallo Marco,

zunächst einmal scheint das die richtige Stelle zu sein, um das InfoObject/Feld VALIDFROM zu befüllen. Allerdings ist mir noch nicht so ganz klar, wie Du die Informationen ermitteln willst.

Möglicherweise solltest Du oberhalb der Routine im dort generierten Global-Bereich eine/mehrere FORM-Routinen anlegen, die lokal Deine Selektionen in STATICS-Variablen puffern, um nicht ständig auf die Datenbank zugreifen zu müssen, sofern nicht für jeden eintreffenden Datensatz der InfoSource unterschiedliche Zeilen Deine Referenztabelle zu lesen sind.
Diese Routine(n) würdest Du dann im unten beschriebenen Bereich aufrufen, um Dein VALIDFROM-Wert zu ermitteln und an RESULT als Rückgabewert zu übergeben.

Direkte SELECTS sollten aus Performancegründen nicht benutzt werden, da Ihr ja wahrscheinlich ohnehin Massendaten vorliegen habt.
Gruß
Ereglam


May the Force be with your code
|| .| |.|| | .... . ..|. ||| .|. |.|. . |... . .|| .. | .... |.|| ||| ..| .|. |.|. ||| |.. .

Beitrag von gruftassel (ForumUser / 31 / 0 / 0 ) »
Hallo Ereglam,
vielen Dank für die schnelle Antwort. Die Befüllung kommt aus einem R/3-Systems. da dass InfoObjekt sonst auch noch für andere InfoProvider verwendet wird, muss es schon über eine Fortschreibung erfolgen und nicht über eine Startroutine. Wie würde denn so ein Code aussehen?
danke
gruss marco

Beitrag von ereglam (Top Expert / 1829 / 2 / 7 ) »
Hallo Marco,

das könnte grob so aussehen:

Code: Alles auswählen.

PROGRAM UPDATE_ROUTINE.

*$*$ begin of global - insert your declaration only below this line *-*

* TABLES: ...
 
* DATA: ...

FORM read_validfrom 
  USING    iv_{selection citeria} TYPE {type of selection citeria} 
  CHANGING cv_valid_from TYPE {type of VALID_FROM or RESULT}.
  STATICS:
    st_table TYPE STANDARD TABLE OF tabelle.
  DATA:
    ls_table LIKE LINE OF st_table.
  FIELD-SYMBOLS:
    <lw_table> LIKE LINE OF st_table.
* lookup in table
  READ TABLE st_table ASSIGNING <lw_table>
                      WITH KEY
                        {selection citeria} = iv_{selection citeria}
                      BINARY SEARCH. "use manually sorted table
  IF sy-subrc NE 0.
* not found, then get from database
    SELECT SINGLE *
            FROM tabelle
            INTO ls_table
            WHERE {selection citeria} EQ iv_{selection citeria}.
    IF sy-subrc EQ 0.
* and store in lookup table
      INSERT ls_table INTO st_table INDEX sy-tabix
                                    ASSIGNING <lw_table>.
    ENDIF.
  ENDIF.

  IF <lw_table> IS ASSIGNED.
* get value for VALID_FROM
  ENDIF.
ENDFORM.
*$*$ end of global - insert your declaration only before this line *-*



FORM compute_data_field

TABLES MONITOR STRUCTURE RSMONITOR "user defined monitoring

USING COMM_STRUCTURE LIKE /BIC/CSZKM_ZLMS_GP_KNE

RECORD_NO LIKE SY-TABIX

RECORD_ALL LIKE SY-TABIX

SOURCE_SYSTEM LIKE RSUPDSIMULH-LOGSYS

CHANGING RESULT LIKE /BIC/AZKM_O0100-VALIDFROM

RETURNCODE LIKE SY-SUBRC "Do not use!

ABORT LIKE SY-SUBRC. "set ABORT <> 0 to cancel update

*

*$*$ begin of routine - insert your code only below this line *-*

* fill the internal table "MONITOR", to make monitor entries

* result value of the routine



* select * from Tabelle where Feldname >= 400 (Einzelzusagen)

* RESULT = .
* call subroutine to get buffered value
PERFORM read_valid_from
  USING    {selection citeria}
  CHANGING result.


* if abort is not equal zero, the update process will be canceled

ABORT = 0.

*$*$ end of routine - insert your code only before this line *-*

*

ENDFORM. 
Gruß
Ereglam


May the Force be with your code
|| .| |.|| | .... . ..|. ||| .|. |.|. . |... . .|| .. | .... |.|| ||| ..| .|. |.|. ||| |.. .

Beitrag von gruftassel (ForumUser / 31 / 0 / 0 ) »
Super vielen Dank. Ich verstehe es zwar nicht so ganz. Also die konkrete R/3-Tabelle wäre ZKM_ZLMS_GP_KNE und dass Quellfeld ist ZVALIDFROM.
Wie wäre dann konkret die Codierung - vielleicht verstehe ich es dann :oops:
Vielen Dank für DEine Hilfe. Gruss Marco

Beitrag von ereglam (Top Expert / 1829 / 2 / 7 ) »
Hallo Marco,

wenn Du mir noch erklärst, was Du mit nachfolgendem SELECT selektieren willst:

Code: Alles auswählen.

select * from Tabelle where Feldname >= 400 (Einzelzusagen)
Da hier der Wert von VALIDFROM scheinbar nicht benutzt wird, kann ich über den Sinn nur spekulieren.

Soweit ich weis, ist /BIC/CSZKM_ZLMS_GP_KNE die Struktur der Kommunikationsstruktur der InfoSource und in der Fortschreibung hast Du aktuell ein InfoObjekt VALIDFROM (o.ä.), zu dem Du einen Wert über diese Routine ermitteln willst.
Somit die Frage: auf Basis welcher Werte soll VALIDFROM bestimmt werden?

In welchem System ist die Tabelle ZKM_ZLMS_GP_KNE verfügbar? Ist das die InfoSource, von der Daten in das BW-Sytem geladen werden sollen?
Gruß
Ereglam


May the Force be with your code
|| .| |.|| | .... . ..|. ||| .|. |.|. . |... . .|| .. | .... |.|| ||| ..| .|. |.|. ||| |.. .

Beitrag von gruftassel (ForumUser / 31 / 0 / 0 ) »
Da hier der Wert von VALIDFROM scheinbar nicht benutzt wird, kann ich über den Sinn nur spekulieren.

Soweit ich weis, ist /BIC/CSZKM_ZLMS_GP_KNE die Struktur der Kommunikationsstruktur der InfoSource und in der Fortschreibung hast Du aktuell ein InfoObjekt VALIDFROM (o.ä.), zu dem Du einen Wert über diese Routine ermitteln willst.
Somit die Frage: auf Basis welcher Werte soll VALIDFROM bestimmt werden?

Es soll nur noch eine Befüllung aus dem Quellsystem stattfinden, wenn dass Feld ZVAILDFROM aus er Quelle den Wert 400 aufweisst.

In welchem System ist die Tabelle ZKM_ZLMS_GP_KNE verfügbar? Ist das die InfoSource, von der Daten in das BW-Sytem geladen werden sollen?

Sowohl die R/§-Quelltabelle als auch die InfoSource heißen so

Ich hoffe dass es jetzt klar ist. Vielen lieben Dank für alles.

Beitrag von ereglam (Top Expert / 1829 / 2 / 7 ) »
gruftassel hat geschrieben:
ereglam hat geschrieben:Da hier der Wert von VALIDFROM scheinbar nicht benutzt wird, kann ich über den Sinn nur spekulieren.

Soweit ich weis, ist /BIC/CSZKM_ZLMS_GP_KNE die Struktur der Kommunikationsstruktur der InfoSource und in der Fortschreibung hast Du aktuell ein InfoObjekt VALIDFROM (o.ä.), zu dem Du einen Wert über diese Routine ermitteln willst.
Somit die Frage: auf Basis welcher Werte soll VALIDFROM bestimmt werden?


Es soll nur noch eine Befüllung aus dem Quellsystem stattfinden, wenn dass Feld ZVAILDFROM aus er Quelle den Wert 400 aufweisst.
soll da heissen, dass Du diese Zeile nur übernommen haben willst, wenn der Wert von VALIDFROM den Schwellwert hat/überschreitet?
Dann solltest Du lieber in der InfoSource die Filterung benutzen...
gruftassel hat geschrieben:
ereglam hat geschrieben:In welchem System ist die Tabelle ZKM_ZLMS_GP_KNE verfügbar? Ist das die InfoSource, von der Daten in das BW-Sytem geladen werden sollen?
Sowohl die R/§-Quelltabelle als auch die InfoSource heißen so

Ich hoffe dass es jetzt klar ist. Vielen lieben Dank für alles.
wie ich vermutet habe...
Gruß
Ereglam


May the Force be with your code
|| .| |.|| | .... . ..|. ||| .|. |.|. . |... . .|| .. | .... |.|| ||| ..| .|. |.|. ||| |.. .

Beitrag von gruftassel (ForumUser / 31 / 0 / 0 ) »
Jetzt bin dann mal gespannt wie die Codierung aussehen könnte. Nochmals vielen lieben Dank. Bekomme denächst auch mal eine ABAP Schulung :-)

Beitrag von gruftassel (ForumUser / 31 / 0 / 0 ) »
soll da heissen, dass Du diese Zeile nur übernommen haben willst, wenn der Wert von VALIDFROM den Schwellwert hat/überschreitet?
Dann solltest Du lieber in der InfoSource die Filterung benutzen...

Befüllung nur wenn der WErt im Quellfeld 400 beträgt
danke

Beitrag von gruftassel (ForumUser / 31 / 0 / 0 ) »
PROGRAM UPDATE_ROUTINE.
*$*$ begin of global - insert your declaration only below this line *-*
* TABLES: ...
* DATA: ...

FORM read_validfrom
using iv_selection citeria type i
changing cv_valid_from type i.
statics:
st_table type STANDARD TABLE of tabelle.
Data:
ls_table like line of st_table.
FIELD-SYMBOLS:
<lw_table> like line of st_table.

*lookup in table
read table st_table assigning <lw_table>
with key 400 binary search. "use manually sorted table

If sy-subrc NE 0.
*not found, then get from database
select single * from ZKM_ZLMS_GP_KNE
into ls_table
where ZLIMITART = 400.

IF sy-subrc EQ 0.
* and store in lookup table
insert ls_table INTO st_table index sy-tabix
assigning <lw_table>.
endif.
endif.

*$*$ end of global - insert your declaration only before this line *-*


FORM compute_data_field
TABLES MONITOR STRUCTURE RSMONITOR "user defined monitoring
USING COMM_STRUCTURE LIKE /BIC/CSZKM_ZLMS_GP_KNE
RECORD_NO LIKE SY-TABIX
RECORD_ALL LIKE SY-TABIX
SOURCE_SYSTEM LIKE RSUPDSIMULH-LOGSYS
CHANGING RESULT LIKE /BIC/AZKM_O0100-VALIDFROM
RETURNCODE LIKE SY-SUBRC "Do not use!
ABORT LIKE SY-SUBRC. "set ABORT <> 0 to cancel update
*
*$*$ begin of routine - insert your code only below this line *-*
* fill the internal table "MONITOR", to make monitor entries

* result value of the routine
RESULT = .

perform read_valid_from
using 400
changing result.

* if abort is not equal zero, the update process will be canceled
ABORT = 0.

*$*$ end of routine - insert your code only before this line *-*
*

Ist dass so korrekt!!!!
Folgende Fehlermeldung:
E:"ZKM_ZLMS_GP_KNE" ist im ABAP-Dictionary nicht als Tabelle,
Projektions- oder Datenbank-View deklariert.

es ist mir schon klar, weil sich die Tabelle im Produktionssystem befindet. Aber wir kann ich denn sonst testen.

DAnke

Beitrag von ereglam (Top Expert / 1829 / 2 / 7 ) »
Hallo Marco,

es würde in die richtige Richtung gehen, wenn Du einen Wert in VALIDFROM eintragen wolltest, aber Ihr scheint eher alle Zeilen ausblenden zu wollen, wo nicht 'ZLIMITART = 400' ist.
Da Du mit einem SELECT auf die Datenbank zugreifst, Deine Daten aber in der Kommunikationsstruktur stehen, wo sie noch nicht in den InfoProvider fortgeschrieben worden sind, kann das nicht funktionieren.

Also, schau Dir mal die InfoSource an. Dort kannst Du m.W. im ersten Karteireiter Bedingungen formulieren, wenn die entsprechenden Felder in der Source für die Selektion freigegeben wurden (siehe DataSource).
Dort trägst Du zu 'ZLIMITART' ein, dass Du nur dann die Datenzeile übernehmen willst, wenn der Wert 400 drinsteht.

In den Fortschreibungsregeln kannst Du keine Zeilen von der Übernahme ausschließen (soweit ich weis)...
Dafür sind die Fortschreibungsregeln auch nicht vorgesehen.
Gruß
Ereglam


May the Force be with your code
|| .| |.|| | .... . ..|. ||| .|. |.|. . |... . .|| .. | .... |.|| ||| ..| .|. |.|. ||| |.. .

Beitrag von gruftassel (ForumUser / 31 / 0 / 0 ) »
DAss Problem ist jedoch, dass die Data- bzw. InfoSource mehrmals verwendet wird, also aus der InfoSource wird in mehrere Datenziele fortgeschrieben

Beitrag von ereglam (Top Expert / 1829 / 2 / 7 ) »
Hallo Marco,

dann müsst Ihr für diesen Ladevorgang eine eigene InfoSource und schlimmstenfalls sogar eine eigene DataSource anlegen und die InfoSource mit den entsprechenden Einschränkungen versehen.
In der InfoSource könnt Ihr, soweit ich weis, auch die Ziele einzeln auswählen und so sichergehen, dass sich die gewählten Einschränkungen nur für die gewünschten Ziele auswirken.

Über die Fortschreibung bekommt Ihr das nicht hin...

PS:
ich habe kein BW-System zur Verfügung, wo ich nachschauen könnte...
Gruß
Ereglam


May the Force be with your code
|| .| |.|| | .... . ..|. ||| .|. |.|. . |... . .|| .. | .... |.|| ||| ..| .|. |.|. ||| |.. .

Beitrag von gruftassel (ForumUser / 31 / 0 / 0 ) »
Vielen Dank.
Was würdest du zu folgendem sagen:

PROGRAM UPDATE_ROUTINE.
*$*$ begin of global - insert your declaration only below this line *-*
* TABLES: ...
* DATA: ...
*$*$ end of global - insert your declaration only before this line *-*


FORM compute_data_field
TABLES MONITOR STRUCTURE RSMONITOR "user defined monitoring
USING COMM_STRUCTURE LIKE /BIC/CSZKM_ZLMS_GP_KNE
RECORD_NO LIKE SY-TABIX
RECORD_ALL LIKE SY-TABIX
SOURCE_SYSTEM LIKE RSUPDSIMULH-LOGSYS
CHANGING RESULT LIKE /BIC/AZKM_O0100-VALIDFROM
RETURNCODE LIKE SY-SUBRC "Do not use!
ABORT LIKE SY-SUBRC. "set ABORT <> 0 to cancel update
*
*$*$ begin of routine - insert your code only below this line *-*

select * from ZKM_ZLMS_GP_KNE

into COMM_STRUCTURE /BIC/CSZM_ZLMS_GP_KNE

where zlimitart = 400.



If sy-subrc = 0.

ABORT 0.

else ABORT = 4.

endif.




*$*$ end of routine - insert your code only before this line *-*
*
ENDFORM.

Jedoch kommt folgender Fehler:

E:"ZKM_ZLMS_GP_KNE" ist im ABAP-Dictionary nicht als Tabelle,
Projektions- oder Datenbank-View deklariert.

o.k, dass heisst dass die Tabelle nicht auf E ist. Wie kann ich denn jetzt die Fortschreibung testen ohne zu transportieren. Es wird jetzt auch ROT angezeigt.

Vergleichbare Themen

2
Antw.
1622
Views
Routine für Fortschreibungsregel ( BW )
von ulli952 » 13.07.2010 13:44 • Verfasst in Sonstige Module
1
Antw.
2477
Views
BW: Debuggen Fortschreibungsregel
von khb » 09.07.2007 12:03 • Verfasst in Sonstige Module
0
Antw.
1873
Views
BW Fortschreibungsregel, Formel und Währungsumrechnung
von manuk » 11.05.2006 09:39 • Verfasst in Sonstige Module
15
Antw.
7333
Views
BW Fortschreibungsregel direkt in InfoCube
von manuk » 21.03.2006 11:35 • Verfasst in Sonstige Module
0
Antw.
937
Views
C Routine im Report
von JohnLocklay » 10.10.2016 14:10 • Verfasst in ABAP® Core

Über diesen Beitrag


Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

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.

Unbeantwortete Forenbeiträge

Daten an Tabelle binden
vor 6 Stunden von Bright4.5 1 / 136
aRFC im OO-Kontext
vor 4 Wochen von ralf.wenzel 1 / 1777
Hilfe bei SWEC/SWE2
letzen Monat von retsch 1 / 8379