Logische Datenbanken - ADA

Getting started ... Alles für einen gelungenen Start.
10 Beiträge • Seite 1 von 1
10 Beiträge Seite 1 von 1

Logische Datenbanken - ADA

Beitrag von Luny (ForumUser / 14 / 0 / 0 ) »
Hallo zusammen,

hat schon einmal jemand die Struktur ANLCV der Log. Datenbank ADA ausgelsen?

Wenn ich den Selektionsbildschirm der DB über die Transaktion SLDB ausführe, erhalte ich folgende Fehlermeldung:
"Dieses Programm enthält Datenbank-Zugriffsroutinen.
Es kann daher nicht alleine gestartet werden.
Abbruch der Verarbeitung !"

Vielen Dank für eure Mühen/Hilfen!

Grüße, Luny :)


Re: Logische Datenbanken - ADA

Beitrag von casman (Specialist / 420 / 1 / 63 ) »
Hi Luny,

ich kenne zwar die Logische DB nicht, allerdings kannst du im Allgemeinen nicht einfach so einen Knoten einer LDB im Testmodus aufrufen (nichts anderes machst du ja in der SLDB bzw. SE36).

Die DB besteht aus einem Selektionsscreen und einem Datenbankprogramm(SAPLDB<log.DB name>), welches du nicht separat starten kannst. Gehe also in der SLDB einfach mal auf das "Testen"-Symbol, dann kannst du die Logische Datenbank aufrufen, hier wird nämlich ein "Test-Report" generiert, der die DB aufruft.

Grüße
Christoph

Re: Logische Datenbanken - ADA

Beitrag von Luny (ForumUser / 14 / 0 / 0 ) »
Hallo Casman,

danke! Habs gemacht!

Bekomme dann die Ausgabe: event: start-of-selection
event: GET ANLA0 LATE
event: end-of-selection

Was kann ich damit anfangen?

Re: Logische Datenbanken - ADA

Beitrag von casman (Specialist / 420 / 1 / 63 ) »
Moah, toll...das selbe krieg ich auch...da scheint das Testprogramm wohl nicht so sinnvoll zu sein. :-(

Ok, dann stellt sich erstmal die Frage: Was willst du mit der LDB machen?

1. einmalige Info zu irgendwas -> Verwendungsnachweis in SLDB -> Programme durchkucken, ob eins die Anforderungen erfüllt
2. einmalige Info zu irgendwas -> Transaktion SQ01 -> Bearbeiten -> Benutzergruppe wechseln -> /SAPQUERY/AM - hier hast du vordefinierte Queries, die die ADA nutzen
3. Aufruf aus einem eigenen Programm -> LDB im Programm einbinden (Springen -> Eigenschaften -> Logische Datenbank) und per GET ANLCV. den Knoten im Programm "abholen"
4. Aufruf aus einem eigenen Programm -> LDB mit dem FuBa LDB_PROCESS aufrufen und Ergebnisse zum Knoten ANLCV in einer Callback-Routine sammeln

Zu 4. kann ich dir bei Bedarf auch einen kleinen Quelltext-Ausschnitt zukommen lassen.

Re: Logische Datenbanken - ADA

Beitrag von Luny (ForumUser / 14 / 0 / 0 ) »
Hi!

Ja, 4.! Den FUBA habe ich auch schon in meinem Programm eingebunden.
Habe aber nocht nicht ganz durchschaut, wie er funktioniert!

Ein Quelltext wäre natürlich super! :-)

Vielen vielen Dank! :D

Re: Logische Datenbanken - ADA

Beitrag von casman (Specialist / 420 / 1 / 63 ) »
Hi Luny,

hier nun eine Kurzanleitung für LDB_PROCESS:

Als erstes musst du natürlich deine Variablen deklarieren:

Code: Alles auswählen.

*Declaration for FuBa LDB_PROCESS
DATA: g_it_callback          TYPE TABLE OF ldbcb,
      g_wa_callback          LIKE LINE OF g_it_callback,
      g_it_selscreen         TYPE TABLE OF rsparams,
      g_wa_selscreen         LIKE LINE OF g_it_selscreen,
      g_it_fsell             TYPE rsfs_fields,
      g_wa_ls_fieldselection LIKE LINE OF g_it_fsell,
      g_wa_ls_fields         LIKE LINE OF g_wa_ls_fieldselection-fields,
      g_it_ldb_lo            TYPE TABLE OF vtvbarw_dl,
      g_wa_ldb_lo            TYPE vtvbarw_dl,
Als zweites musst du die Selektionsoptionen (Selectionscreen) und deine gewünschten Felder, die du zurückbekommen willst (Field-Selection) deiner LDB im Programm aufbauen...z.B. so:

Code: Alles auswählen.

*Fill Callback
  REFRESH: g_it_callback.
  g_wa_callback-ldbnode = 'POSITIONS'. "zu selektierender Knoten
  g_wa_callback-get      = 'X'.
  g_wa_callback-get_late = ' '.
  g_wa_callback-cb_prog = sy-repid.
  g_wa_callback-cb_form = 'LDB_CALLBACK_LO'.  "Name der Callback Routine
  APPEND g_wa_callback TO g_it_callback.
  CLEAR g_wa_callback.

*Fill Field-Selection
  REFRESH: g_it_fsell, g_wa_ls_fieldselection-fields.
  g_wa_ls_fields-line = 'BUKRS'.
  APPEND g_wa_ls_fields TO g_wa_ls_fieldselection-fields.

  g_wa_ls_fields-line = 'GSART'.
  APPEND g_wa_ls_fields TO g_wa_ls_fieldselection-fields.

  g_wa_ls_fields-line = 'SSTATI'.
  APPEND g_wa_ls_fields TO g_wa_ls_fieldselection-fields.

g_wa_ls_fieldselection-tablename = 'POSITIONS'.
  APPEND g_wa_ls_fieldselection TO g_it_fsell.

* Selectionscreen
**Key Date
  CLEAR g_wa_selscreen.
  g_wa_selscreen-selname = 'P_DAT'.
  g_wa_selscreen-kind    = 'P'.
  g_wa_selscreen-sign    = 'I'.
  g_wa_selscreen-option  = 'EQ'.
  g_wa_selscreen-low     = g_keydate.
  APPEND g_wa_selscreen TO g_it_selscreen.

*Product Groups - Loans
  CLEAR g_wa_selscreen.
  g_wa_selscreen-selname = 'P_LO'.
  g_wa_selscreen-kind    = 'P'.
  g_wa_selscreen-sign    = 'I'.
  g_wa_selscreen-option  = 'EQ'.
  g_wa_selscreen-low     = 'X'.
  APPEND g_wa_selscreen TO g_it_selscreen.
  


Dann brauchst du eine Callback Routine. Hintergrund: Die LDB liefert immer genau eine Ergebniszeile u_wa_ldb_lo an die Callback-Routine, die dann den Satz an eine interne Tabelle g_it_ldb_lo anhängt:

Code: Alles auswählen.

FORM ldb_callback_lo USING                                  "#EC CALLED
                     u_positions  TYPE ldbcb-ldbnode         "#EC *
                     u_wa_ldb_lo TYPE vtvbarw_dl            "#EC *
                     u_mode       TYPE c                     "#EC *
                     u_selected  TYPE c.                    "#EC *

  APPEND u_wa_ldb_lo TO g_it_ldb_lo.

ENDFORM.                   
Nun musst du deine LDB noch aufrufen:

Code: Alles auswählen.

*   call logical database
    CALL FUNCTION 'LDB_PROCESS'
      EXPORTING
        ldbname                     = 'FTI_LO_POSITIONS'
        field_selection             = g_it_fsell[]
      TABLES
        callback                    = g_it_callback
        selections                  = g_it_selscreen
      EXCEPTIONS
        ldb_not_reentrant           = 1
        ldb_incorrect               = 2
        ldb_already_running         = 3
        ldb_error                   = 4
        ldb_selections_error        = 5
        ldb_selections_not_accepted = 6
        variant_not_existent        = 7
        variant_obsolete            = 8
        variant_error               = 9
        free_selections_error       = 10
        callback_no_event           = 11
        callback_node_duplicate     = 12
        callback_no_program         = 13
        callback_no_cbform          = 14
        dyn_node_no_type            = 15
        dyn_node_invalid_type       = 16
        OTHERS                      = 17.
    IF sy-subrc <> 0.
ENDIF.

So, bei Fragen melde dich einfach.

PS: Ich weiß, der Quelltext ist mancherorts nicht mehr ganz Zeitgemäß...er stammt aus einem alten Programm, von daher stört euch nicht dran!

Re: Logische Datenbanken - ADA

Beitrag von Luny (ForumUser / 14 / 0 / 0 ) »
Hi casman,

danke das hat mir schon sehr geholfen.
Mein Programmcode sieht aktuell folgendermaßen aus:

Code: Alles auswählen.

*Declaration for FuBa LDB_PROCESS
DATA: lt_callback            TYPE TABLE OF ldbcb,
      ls_callback            LIKE LINE OF lt_callback OCCURS 1 WITH HEADER LINE,
      lt_selscreen           TYPE TABLE OF rsparams,
      ls_selscreen           LIKE LINE OF lt_selscreen.

* Selectionscreen
**Key Date
ls_selscreen-selname = 'BUKRS'.
ls_selscreen-kind    = 'S'.
ls_selscreen-sign    = 'I'.
ls_selscreen-option  = 'EQ'.
ls_selscreen-low     = '5600'.
APPEND ls_selscreen TO lt_selscreen.
CLEAR ls_selscreen.

ls_selscreen-selname = 'ANLAGE'.
ls_selscreen-kind    = 'S'.
ls_selscreen-sign    = 'I'.
ls_selscreen-option  = 'EQ'.
ls_selscreen-low     = '3456'.
APPEND ls_selscreen TO lt_selscreen.
CLEAR ls_selscreen.

ls_selscreen-selname = 'BERDATUM'.
ls_selscreen-kind    = 'S'.
ls_selscreen-sign    = 'I'.
ls_selscreen-option  = 'EQ'.
ls_selscreen-low     = '20091231'.
APPEND ls_selscreen TO lt_selscreen.
CLEAR ls_selscreen.

ls_selscreen-selname = 'BEREICH1'.
ls_selscreen-kind    = 'P'.
ls_selscreen-sign    = 'I'.
ls_selscreen-option  = 'EQ'.
ls_selscreen-low     = '01'.
APPEND ls_selscreen TO lt_selscreen.
CLEAR ls_selscreen.

ls_selscreen-selname = 'XEINZEL'.
*ls_selscreen-kind    = 'P'.
*ls_selscreen-sign    = 'I'.
*ls_selscreen-option  = 'EQ'.
ls_selscreen-low     = 'X'.
APPEND ls_selscreen TO lt_selscreen.
CLEAR ls_selscreen.

*Callback
REFRESH: ls_callback.
ls_callback-ldbnode = 'ANLCV'.
ls_callback-get     = 'X'.
ls_callback-cb_prog = '/LUR/ANDERNACH'.
ls_callback-cb_form = 'CB_GET_ANLCV'.
APPEND ls_callback TO lt_callback.
CLEAR ls_callback.

*   call logical database
CALL FUNCTION 'LDB_PROCESS'
  EXPORTING
    ldbname                     = 'ADA'
*        field_selection             = g_it_fsell
  TABLES
    callback                    = lt_callback
    selections                  = lt_selscreen
  EXCEPTIONS
    ldb_not_reentrant           = 1
    ldb_incorrect               = 2
    ldb_already_running         = 3
    ldb_error                   = 4
    ldb_selections_error        = 5
    ldb_selections_not_accepted = 6
    variant_not_existent        = 7
    variant_obsolete            = 8
    variant_error               = 9
    free_selections_error       = 10
    callback_no_event           = 11
    callback_node_duplicate     = 12
    callback_no_program         = 13
    callback_no_cbform          = 14
    dyn_node_no_type            = 15
    dyn_node_invalid_type       = 16
    OTHERS                      = 17.
IF sy-subrc <> 0.
ENDIF.

*&---------------------------------------------------------------------*
*&      Form  cb_get_anlcv
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->NAME       text
*      -->LS_BSIK    text
*      -->MODE       text
*      -->SELECTED   text
*----------------------------------------------------------------------*
FORM cb_get_anlcv     USING  name      LIKE ldbn-ldbnode
                             ls_anlcv  LIKE anlcv
                             mode      TYPE c
                             selected  TYPE c.

  

ENDFORM.                    "cb_get_anlcv

Nun müsste doch die Struktur ls_anlcv gefüllt sein oder???

Ist sie nämlich nicht. In der SLDB bekomme ich auch bei der Selektion mit diesen Parametern kein GET oder GET LATE Ergebnis zur Struktur ANLCV.... :(
Bin echt am verzweifeln so langsam... benötige die Felder "NAFAP", "GJE_KANSW" und "BCHWRT_LFD" der Struktur ANLCV.

Re: Logische Datenbanken - ADA

Beitrag von Luny (ForumUser / 14 / 0 / 0 ) »
Hey,

habe es nun doch hinbekommen! Hat alles super geklappt!!! :)

Eine Frage habe ich allerdings noch.
Die LD soll mehrmals aufgerufen werden (ist Teil eines Loops). Jedoch bekomme ich ab dem zweiten Durchlauf den sy-subrc = 1 (ldb_not_reentrant).
Kann ich das umgehen ohne die LD zu verändern?

Vielen Dank nochmal! :)
Luny

Re: Logische Datenbanken - ADA

Beitrag von casman (Specialist / 420 / 1 / 63 ) »
Hi Luny,

die Meldung besagt, dass die LDB nicht mehrfach aus einem Program aufgerufen werden kann. Bei mehrfach aufrufbaren LDB's gibt es eine LDB_PROCESS_INIT-Form, die alle Variablen zurücksetzt...warum steht auch nochmal in der Hilfe zum FuBa LDB_PROCESS...

Die einzige Möglichkeit das zu umgehen, besteht m.E. nach darin, einen Report zu schreiben, der nur die LDB aufruft und diesen dann von deinem Original-Report aus per SUBMIT mehrfach aufzurufen...da könntest du dir die Ergebnisse in den Shared Memory schreiben...sowas hab ich mal bei einem Kunden gemacht, könnte ich Montag nachkucken, wenn du es brauchst...
IMHO ist es aber keine gute Idee, eine LDB im Loop aufzurufen. Da hängt einfach zu viel dran. Stichwort: Performance. Wenn du wirklich nur 2-3 Felder brauchst, würde ich versuchen einen FuBa dafür zu finden, oder das ganze selbst per sinnvollen Selects zu erledigen.

PS: Wenn du keine Feldliste übergibst, werden immer alle Felder zurückgeliefert. Das kostet unter Umständen wahnsinnig Zeit, wenn dafür extra was berechnet oder zusätzlich selektiert werden muss.

Grüße
Christoph

Re: Logische Datenbanken - ADA

Beitrag von Luny (ForumUser / 14 / 0 / 0 ) »
Hey!

Hat jetzt alles super geklappt!
Habe ein seperates Programm geschrieben und den Memory genutzt!
Mit der Feldliste werde ich mir auf jeden Fall noch mal anschauen, vielleicht kann ich dann noch etwas Performance gewinnen! ;)

Vielen vielen Dank für deine Mühe!!!

Luny

Seite 1 von 1

Über diesen Beitrag


Unterstütze die Community und teile den Beitrag für mehr Leser und besseren Inhalt:

Aktuelle Forenbeiträge

Zugriff auf Eingabeparameter in Methode
vor 5 Stunden von ewx 6 / 55
Inlcudes in SapScripts
Gestern von Bright4.5 6 / 94
JSON parsen in Node-Table
vor 2 Tagen von ralf.wenzel 6 / 115
Lokale Klassendefinition in globaler Klasse
vor 2 Tagen von msfox gelöst 13 / 4825

Vergleichbare Themen

Logische Datenbanken
von ralf.wenzel » 05.05.2020 08:07
Logische Datenbanken Alternativen
von SaskuAc » 28.06.2017 14:10
Logische Datenbanken Bedinungen
von SaskuAc » 11.11.2016 10:54
logische Datenbanken - wie find ich diese und Inhalt
von Thomas82515 » 25.08.2008 17:27
Funktionale Abhängigkeiten Datenbanken
von Bright4.5 » 25.03.2021 16:46