Wrong Call To SALV Function

Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

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

Wrong Call To SALV Function

Beitrag von DavidFaude (ForumUser / 7 / 1 / 1 ) »
Hallo zusammen,

ich habe eine Frage zu einem selbstgeschriebenen Code, den ich ein Testsystem eingebunden habe. Leider kommt ich mit meinen rudimentären Kenntnissen da nicht viel weiter und wäre extrem dankbar für eine Hilfe. :)
Das Ziel des Codes ist es, eine CSV-Datei einzulesen, welche mit Personalzeitereignissen gefüllt ist.
Dazu habe um mögliche Fehler zu Beginn zu vermeiden eine CSV lediglich wie folgt gefült und diese versucht einzulesen.

ldate ltime satza
20231020 123000 001

(Jeder Wert in einer Spalte)

Ebenso habe ich bereits Dateien in anderen Formaten ohne den Kopf verwendet. Mein Problem ändert sich dadurch nicht.

Sobald ich das Programm starte tritt der Fehler "Wrong Call to SALV Function" auf, was offenbar an einer falschen Definition in Bezug auf den Button liegt.

Kann es dennoch sein, dass es auch ein Problem mit der Datei gibt? Sehr gern stelle ich euch den gesamten Code zur Verfügung.

Code: Alles auswählen.

REPORT zuploadtimeevents.

INCLUDE <icon>.

CLASS lcl_events DEFINITION.
  PUBLIC SECTION.
    CONSTANTS: cobtnloadtodb TYPE string VALUE 'BTNLOADDB'.
    CLASS-METHODS: ontoolbarclick FOR EVENT added_function OF cl_salv_events_table
      IMPORTING
        e_salv_function
        sender.
ENDCLASS.

CLASS lcl_events IMPLEMENTATION.
  METHOD ontoolbarclick.
    CASE e_salv_function.
      WHEN cobtnloadtodb.
        PERFORM uploadtodb.
    ENDCASE.
  ENDMETHOD.
ENDCLASS.

TYPES:
  BEGIN OF ty_teven,
    mandt TYPE mandt,
    pdsnr TYPE pdsnr_d,
    pernr TYPE pernr_d,
    zausw TYPE dzausw,
    ldate TYPE ldate,
    ltime TYPE ltime,
    erdat TYPE phdat,
    ertim TYPE phtim,
    satza TYPE retyp,
    terid TYPE terid,
    abwgr TYPE abwgr,
    origf TYPE origf,
    dallf TYPE dallf,
    pdc_otype TYPE otype,
    pdc_plans TYPE plans,
    otype TYPE otype,
    plans TYPE plans,
    pdc_usrup TYPE pdc_usrup,
    user2 TYPE hr_usrfld,
    indeu TYPE indeu,
    bukrs TYPE bukrs,
    gsber TYPE gsber,
    kostl TYPE kostl,
    ltlst TYPE lstar,
    aufnr TYPE aufnr,
    kstrg TYPE kstrg,
    posid TYPE ps_posid,
    nplnr TYPE nplnr,
    vornr TYPE vornr,
    kdauf TYPE kdauf,
    kdpos TYPE kdpos,
    prznr TYPE co_prznr,
    fistl TYPE fistl,
    geber TYPE bp_geber,
    skost TYPE kostl,
    sbukr TYPE bukrs,
    sgsbr TYPE gsber,
    sgtxt TYPE sgtxt,
    dart TYPE dart,
    udart TYPE udart,
    budget_pd TYPE fm_budget_period,
    trfgr TYPE trfgr,
    trfst TYPE trfst,
    prakn TYPE prakn,
    prakz TYPE prakz,
    aufkz TYPE aufkn,
    bwgrl TYPE ptm_vbas7s,
    waers TYPE waers,
  END OF ty_teven.

DATA:
  lt_itab       TYPE TABLE OF string,
  lttimeevents  TYPE TABLE OF ty_teven,
  lv_filename   TYPE string,
  watimeevent   TYPE ty_teven.

DATA:
  ltfiletable TYPE filetable,
  lwfileline  TYPE string,
  lv_rc       TYPE i.

PARAMETERS: p_file TYPE string OBLIGATORY.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
  CLEAR: ltfiletable, lv_filename.
  CALL METHOD cl_gui_frontend_services=>file_open_dialog
    EXPORTING
      window_title      = 'Select File'
      default_extension = 'csv'
    CHANGING
      file_table = ltfiletable
      rc         = lv_rc
    EXCEPTIONS
      cntl_error           = 1
      error_no_gui         = 2
      not_supported_by_gui = 3
      others               = 4.

  IF lv_rc = 0 AND lines( ltfiletable ) > 0.
    READ TABLE ltfiletable INDEX 1 INTO lwfileline.
    p_file = lwfileline.
  ELSE.
    MESSAGE 'File selection canceled or error occurred.' TYPE 'I'.
  ENDIF.

START-OF-SELECTION.

  TRY.
      CALL FUNCTION 'GUI_UPLOAD'
        EXPORTING
          filename   = p_file
          filetype   = 'ASC'
        TABLES
          data_tab   = lt_itab
        EXCEPTIONS
          fileopenerror         = 1
          filereaderror         = 2
          no_batch              = 3
          guirefusefiletransfer = 4
          invalid_type          = 5
          no_authority          = 6
          unknown_error         = 7
          baddataformat         = 8
          headernotallowed      = 9
          separatornotallowed   = 10
          headertoolong         = 11
          unknowndperror        = 12
          access_denied         = 13
          dpoutof_memory        = 14
          disk_full             = 15
          dp_timeout            = 16
          OTHERS                = 17.
    CATCH cx_sy_no_handler.
      MESSAGE 'Unexpected error during file upload!' TYPE 'E'.
      EXIT.
  ENDTRY.

  IF sy-subrc <> 0.
    MESSAGE 'Error during file upload!' TYPE 'E'.
    EXIT.
  ENDIF.

  LOOP AT lt_itab INTO DATA(line).
    CLEAR watimeevent.
    SPLIT line AT cl_abap_char_utilities=>horizontal_tab INTO
      watimeevent-ldate
      watimeevent-ltime
      watimeevent-satza.
    IF watimeevent-ldate IS NOT INITIAL AND watimeevent-ltime IS NOT INITIAL.
      APPEND watimeevent TO lttimeevents.
    ENDIF.
  ENDLOOP.

  DATA lo_alv TYPE REF TO cl_salv_table.

  TRY.
      cl_salv_table=>factory(
        IMPORTING
          r_salv_table = lo_alv
        CHANGING
          t_table      = lttimeevents ).

      DATA lo_columns TYPE REF TO cl_salv_columns_table.
      lo_columns = lo_alv->get_columns( ).

      DATA lo_column TYPE REF TO cl_salv_column.

      lo_columns->set_optimize( abap_true ).

      lo_column = lo_columns->get_column( 'LDATE' ).
      lo_column->set_short_text( |Datum| ).

      lo_column = lo_columns->get_column( 'LTIME' ).
      lo_column->set_short_text( |Uhrzeit| ).

      lo_column = lo_columns->get_column( 'SATZA' ).
      lo_column->set_short_text( |Zeiter Art| ).

      DATA(lo_functions) = lo_alv->get_functions( ).
      lo_functions->set_all( abap_true ).

      lo_functions->add_function(
        name     = 'BTNLOADDB'
        icon     = '@08@'
        text     = 'Load to DB'
        tooltip  = 'Lädt die Daten in die Datenbank'
        position = if_salv_c_function_position=>right_of_salv_functions ).

      SET HANDLER lcl_events=>ontoolbarclick FOR lo_alv->get_event( ).

      lo_alv->display( ).

    CATCH cx_salv_msg INTO DATA(lx_msg).
      MESSAGE lx_msg->get_text( ) TYPE 'E'.
    CATCH cx_salv_not_found.
      MESSAGE 'ALV Grid/Table could not be created.' TYPE 'E'.
    CATCH cx_salv_wrong_call.
      MESSAGE 'Wrong call to SALV function.' TYPE 'E'.
    CATCH cx_salv_existing.
      MESSAGE 'SALV object already exists.' TYPE 'E'.
  ENDTRY.

FORM uploadtodb.
  INSERT cc1tev FROM TABLE lttimeevents.
  IF sy-subrc <> 0.
    MESSAGE 'Error during database insertion!' TYPE 'E'.
    EXIT.
  ENDIF.
  COMMIT WORK.
  MESSAGE 'Data successfully loaded into database!' TYPE 'S'.
ENDFORM.

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


Re: Wrong Call To SALV Function

Beitrag von ewx (Top Expert / 4884 / 317 / 644 ) »
du musst mal schauen, wo genau die Exception geworfen wird.

Re: Wrong Call To SALV Function

Beitrag von a-dead-trousers (Top Expert / 4442 / 226 / 1193 ) »
Zwei Dinge:
1) GUI_UPLOAD soll man nicht mehr verwenden (CL_GUI_FRONTEND_SERVICES stattdessen einsetzen).
2) Der Fullscreen SALV erlaubt keine dynamischen Buttons. Stattdessen muss man einen eigenen GUI-Status anlegen, dort den gewünschten Funktionscode einbauen und diesen dann an das SALV übergeben (SET_SCREEN_STATUS). Ansonst bleibt noch die Möglichkeit den SALV in einem Container zu instanzieren, dann klappen auch die dynamischen Buttons (Eigenes Dynpro mit CustomContainer-Bereich anlegen, den Namen in der FACTORY übergeben und zusätzlich zum DISPLAY-Aufruf auch CALL SCREEN aufrufen).
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: Wrong Call To SALV Function

Beitrag von rob_abc (Specialist / 125 / 33 / 50 ) »
Das was adt sagt.
Aber anstatt ein dynpro mit control anzulegen, würde ich mit einem default screen arbeiten.

Mit den beiden kleinen Anpassungen läuft dein Code bereits.

Code: Alles auswählen.

      cl_salv_table=>factory( EXPORTING r_container  = cl_gui_container=>default_screen
                              IMPORTING r_salv_table = lo_alv
                              CHANGING  t_table      = lttimeevents ).
      ...
      lo_alv->display( ).
      WRITE space.

Re: Wrong Call To SALV Function

Beitrag von a-dead-trousers (Top Expert / 4442 / 226 / 1193 ) »
rob_abc hat geschrieben:
26.03.2025 08:34
Aber anstatt ein dynpro mit control anzulegen, würde ich mit einem default screen arbeiten.
Kann man machen aber dann bleibt das ursprüngliche Dynpro im Hintergrund bestehen. Bei einem Report ist das vielleicht nicht so problematisch aber bei anderen Dialogen sehe ich dann schon ein gewisses Fehlerpotential (GUI-Buttons bleiben erhalten, andere Controls im Hintergrund könnten auf Eingaben reagieren usw.)
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: Wrong Call To SALV Function

Beitrag von rob_abc (Specialist / 125 / 33 / 50 ) »
Ja, würde ich auch nur in Verbindung mit einem Report nutzen.

Re: Wrong Call To SALV Function

Beitrag von DavidFaude (ForumUser / 7 / 1 / 1 ) »
Perfekt ich danke euch für die schnelle Hilfe!

Ich habe es wie von rob_abc mit dem default_screen umgesetzt.

Re: Wrong Call To SALV Function

Beitrag von DavidFaude (ForumUser / 7 / 1 / 1 ) »
Für alle die den gesamten Code auch probieren möchten hier auch als kleiner Dank für die Hilfe! Er funktioniert allerdings noch nicht vollständig aber ich bin ein Fehler weiter ;)

Code: Alles auswählen.

REPORT zuploadtimeevents.
INCLUDE <icon>.

CLASS lcl_events DEFINITION.
  PUBLIC SECTION.
    CONSTANTS: cobtnloadtodb TYPE string VALUE 'BTNLOADDB'.
    CLASS-METHODS: ontoolbarclick FOR EVENT added_function OF cl_salv_events_table
      IMPORTING
        e_salv_function
        sender.
ENDCLASS.

CLASS lcl_events IMPLEMENTATION.
  METHOD ontoolbarclick.
    CASE e_salv_function.
      WHEN cobtnloadtodb.
        PERFORM uploadtodb.
    ENDCASE.
  ENDMETHOD.
ENDCLASS.

TYPES:
  BEGIN OF ty_teven,
    mandt TYPE mandt,
    pdsnr TYPE pdsnr_d,
    pernr TYPE pernr_d,
    zausw TYPE dzausw,
    ldate TYPE ldate,
    ltime TYPE ltime,
    erdat TYPE phdat,
    ertim TYPE phtim,
    satza TYPE retyp,
    terid TYPE terid,
    abwgr TYPE abwgr,
    origf TYPE origf,
    dallf TYPE dallf,
    pdc_otype TYPE otype,
    pdc_plans TYPE plans,
    otype TYPE otype,
    plans TYPE plans,
    pdc_usrup TYPE pdc_usrup,
    user2 TYPE hr_usrfld,
    indeu TYPE indeu,
    bukrs TYPE bukrs,
    gsber TYPE gsber,
    kostl TYPE kostl,
    ltlst TYPE lstar,
    aufnr TYPE aufnr,
    kstrg TYPE kstrg,
    posid TYPE ps_posid,
    nplnr TYPE nplnr,
    vornr TYPE vornr,
    kdauf TYPE kdauf,
    kdpos TYPE kdpos,
    prznr TYPE co_prznr,
    fistl TYPE fistl,
    geber TYPE bp_geber,
    skost TYPE kostl,
    sbukr TYPE bukrs,
    sgsbr TYPE gsber,
    sgtxt TYPE sgtxt,
    dart TYPE dart,
    udart TYPE udart,
    budget_pd TYPE fm_budget_period,
    trfgr TYPE trfgr,
    trfst TYPE trfst,
    prakn TYPE prakn,
    prakz TYPE prakz,
    aufkz TYPE aufkn,
    bwgrl TYPE ptm_vbas7s,
    waers TYPE waers,
  END OF ty_teven.

DATA:
  lt_itab       TYPE TABLE OF string,
  lttimeevents  TYPE TABLE OF ty_teven,
  lv_filename   TYPE string,
  watimeevent   TYPE ty_teven.

DATA:
  ltfiletable TYPE filetable,
  lwfileline  TYPE string,
  lv_rc       TYPE i.

PARAMETERS: p_file TYPE string OBLIGATORY.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
  CLEAR: ltfiletable, lv_filename.
  CALL METHOD cl_gui_frontend_services=>file_open_dialog
    EXPORTING
      window_title      = 'Select File'
      default_extension = 'csv'
    CHANGING
      file_table = ltfiletable
      rc         = lv_rc
    EXCEPTIONS
      cntl_error           = 1
      error_no_gui         = 2
      not_supported_by_gui = 3
      others               = 4.

  IF lv_rc = 0 AND lines( ltfiletable ) > 0.
    READ TABLE ltfiletable INDEX 1 INTO lwfileline.
    p_file = lwfileline.
  ELSE.
    MESSAGE 'File selection canceled or error occurred.' TYPE 'I'.
  ENDIF.

START-OF-SELECTION.

  TRY.
      CALL METHOD cl_gui_frontend_services=>gui_upload
        EXPORTING
          filename                = p_file
          filetype                = 'ASC'
        CHANGING
          data_tab                = lt_itab
        EXCEPTIONS
          file_open_error         = 1
          file_read_error         = 2
          no_batch                = 3
          gui_refuse_filetransfer = 4
          invalid_type            = 5
          no_authority            = 6
          unknown_error           = 7
          bad_data_format         = 8
          header_not_allowed      = 9
          separator_not_allowed   = 10
          header_too_long         = 11
          unknown_dp_error        = 12
          access_denied           = 13
          dp_out_of_memory        = 14
          disk_full               = 15
          dp_timeout              = 16
          OTHERS                  = 17.
    CATCH cx_sy_no_handler.
      MESSAGE 'Unexpected error during file upload!' TYPE 'E'.
      EXIT.
  ENDTRY.

  IF sy-subrc <> 0.
    MESSAGE 'Error during file upload!' TYPE 'E'.
    EXIT.
  ENDIF.

  LOOP AT lt_itab INTO DATA(line).
    CLEAR watimeevent.
    SPLIT line AT cl_abap_char_utilities=>horizontal_tab INTO
      watimeevent-ldate
      watimeevent-ltime
      watimeevent-satza.
    IF watimeevent-ldate IS NOT INITIAL AND watimeevent-ltime IS NOT INITIAL.
      APPEND watimeevent TO lttimeevents.
    ENDIF.
  ENDLOOP.

  DATA lo_alv TYPE REF TO cl_salv_table.

  TRY.
      cl_salv_table=>factory(
        EXPORTING
          r_container = cl_gui_container=>default_screen
        IMPORTING
          r_salv_table = lo_alv
        CHANGING
          t_table      = lttimeevents ).

      DATA lo_columns TYPE REF TO cl_salv_columns_table.
      lo_columns = lo_alv->get_columns( ).

      DATA lo_column TYPE REF TO cl_salv_column.

      lo_columns->set_optimize( abap_true ).

      lo_column = lo_columns->get_column( 'LDATE' ).
      lo_column->set_short_text( |Datum| ).

      lo_column = lo_columns->get_column( 'LTIME' ).
      lo_column->set_short_text( |Uhrzeit| ).

      lo_column = lo_columns->get_column( 'SATZA' ).
      lo_column->set_short_text( |Zeiter Art| ).

      DATA lo_functions TYPE REF TO cl_salv_functions.
      lo_functions = lo_alv->get_functions( ).
      lo_functions->set_all( abap_true ).

      lo_functions->add_function(
        name     = 'BTNLOADDB'
        icon     = '@08@'
        text     = 'Load to DB'
        tooltip  = 'Lädt die Daten in die Datenbank'
        position = if_salv_c_function_position=>right_of_salv_functions ).

      DATA(lo_events) = lo_alv->get_event( ).
      SET HANDLER lcl_events=>ontoolbarclick FOR lo_events.

      " Set custom GUI status
      lo_alv->set_screen_status(
        pfstatus      = 'ZMY_STATUS' " The GUI status you created
        report        = sy-repid ).

      lo_alv->display( ).

      WRITE space.

    CATCH cx_salv_msg INTO DATA(lx_msg).
      MESSAGE lx_msg->get_text( ) TYPE 'E'.
    CATCH cx_salv_not_found.
      MESSAGE 'ALV Grid/Table could not be created.' TYPE 'E'.
    CATCH cx_salv_wrong_call.
      MESSAGE 'Wrong call to SALV function.' TYPE 'E'.
    CATCH cx_salv_existing.
      MESSAGE 'SALV object already exists.' TYPE 'E'.
  ENDTRY.

FORM uploadtodb.
  INSERT cc1tev FROM TABLE lttimeevents.
  IF sy-subrc <> 0.
    MESSAGE 'Error during database insertion!' TYPE 'E'.
    EXIT.
  ENDIF.
  COMMIT WORK.
  MESSAGE 'Data successfully loaded into database!' TYPE 'S'.
ENDFORM.

Folgende Benutzer bedankten sich beim Autor DavidFaude für den Beitrag:
Jan


Seite 1 von 1

Vergleichbare Themen

1
Antw.
3538
Views
CALL FUNCTION und CALL TRANSACTION
von phil1982 » 10.08.2007 11:00 • Verfasst in ABAP® für Anfänger
3
Antw.
963
Views
CALL FUNCTION 'FKK_BELEG_WRITE_CHANGEDOC'
von L0w-RiDer » 03.05.2019 08:47 • Verfasst in ABAP® für Anfänger
11
Antw.
5684
Views
CALL FUNCTION 'C13Z_FILE_UPLOAD_BINARY'
von bohne » 18.02.2006 20:14 • Verfasst in ABAP® für Anfänger
5
Antw.
5051
Views
CALL FUNCTION 'BAPI_MATERIAL_SAVEDATA'
von autohandel7 » 17.07.2014 14:26 • Verfasst in ABAP® für Anfänger
2
Antw.
2395
Views
Remote Function Call
von km216 » 03.03.2011 10:31 • Verfasst in ABAP® Core

Über diesen Beitrag



Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

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.