2016-05-03 9 views
5

Ich bin verwirrt. Wenn ich das folgende Stück CodeWarnung, wenn Sekundärschlüssel vollständig angegeben, aber nicht verwendet, aber wenn angegeben dann Fehler

REPORT zzy. 

CLASS lcl_main DEFINITION FINAL CREATE PRIVATE. 
    PUBLIC SECTION. 
    CLASS-METHODS: 
     class_constructor, 
     main. 
    PRIVATE SECTION. 
    TYPES: BEGIN OF t_record, 
     transid TYPE sy-index, 
     item1 TYPE char20, 
     value1 TYPE p LENGTH 7 DECIMALS 2, 
     value2 TYPE p LENGTH 7 DECIMALS 2, 
     value3 TYPE p LENGTH 7 DECIMALS 2, 
     value4 TYPE p LENGTH 7 DECIMALS 2, 
    END OF t_record, 
    tt_record TYPE STANDARD TABLE OF t_record WITH NON-UNIQUE KEY transid item1 WITH UNIQUE HASHED KEY sec_key COMPONENTS value1 value2 value3. 
    CLASS-DATA: 
     mt_record TYPE tt_record. 
ENDCLASS. 

CLASS lcl_main IMPLEMENTATION. 
    METHOD class_constructor. 
    DO 10 TIMES. 
     INSERT VALUE t_record(transid = sy-index item1 = |Item{ sy-index }| value1 = sy-index value2 = sy-index/2 value3 = sy-index/4 value4 = 0) 
     INTO TABLE mt_record. 
    ENDDO. 
    ENDMETHOD. 

    METHOD main. 
    DATA: 
     l_secs TYPE i, 
     l_millisecs TYPE i, 
     l_start TYPE timestampl, 
     l_end TYPE timestampl, 
     l_diff LIKE l_start. 
    GET TIME STAMP FIELD l_start. 
    LOOP AT mt_record INTO DATA(ls_record) 
     WHERE value1 = '100.00' AND value2 = '150.0' AND value3 = '10.0'. 

     ASSERT 1 = 1. 

    ENDLOOP. 
    GET TIME STAMP FIELD l_end. 
    l_diff = l_end - l_start. 

    WRITE:/l_diff. 
    ENDMETHOD. 
ENDCLASS. 

START-OF-SELECTION. 
    lcl_main=>main(). 

kompilieren bekomme ich die folgende Warnung

Programm ZZY
Sekundärschlüssel "SEC_KEY" vollständig spezifiziert. Für den Zugriff wird jedoch der primäre Schlüssel
verwendet. Überprüfen Sie, ob der Zugriff mit „SEC_KEY“ ist mehr
effizient

aber wenn ich diesen Schlüssel angeben, mit USING KEY sec_key dann erhalte ich eine Kompilation Zeitfehler!

REPORT zzy. 

CLASS lcl_main DEFINITION FINAL CREATE PRIVATE. 
    PUBLIC SECTION. 
    CLASS-METHODS: 
     class_constructor, 
     main. 
    PRIVATE SECTION. 
    TYPES: BEGIN OF t_record, 
     transid TYPE sy-index, 
     item1 TYPE char20, 
     value1 TYPE p LENGTH 7 DECIMALS 2, 
     value2 TYPE p LENGTH 7 DECIMALS 2, 
     value3 TYPE p LENGTH 7 DECIMALS 2, 
     value4 TYPE p LENGTH 7 DECIMALS 2, 
    END OF t_record, 
    tt_record TYPE STANDARD TABLE OF t_record WITH NON-UNIQUE KEY transid item1 WITH UNIQUE HASHED KEY sec_key COMPONENTS value1 value2 value3. 
    CLASS-DATA: 
     mt_record TYPE tt_record. 
ENDCLASS. 

CLASS lcl_main IMPLEMENTATION. 
    METHOD class_constructor. 
    DO 10 TIMES. 
     INSERT VALUE t_record(transid = sy-index item1 = |Item{ sy-index }| value1 = sy-index value2 = sy-index/2 value3 = sy-index/4 value4 = 0) 
     INTO TABLE mt_record. 
    ENDDO. 
    ENDMETHOD. 

    METHOD main. 
    DATA: 
     l_secs TYPE i, 
     l_millisecs TYPE i, 
     l_start TYPE timestampl, 
     l_end TYPE timestampl, 
     l_diff LIKE l_start. 
    GET TIME STAMP FIELD l_start. 
    LOOP AT mt_record INTO DATA(ls_record) USING KEY sec_key 
     WHERE value1 = '100.00' AND value2 = '150.0' AND value3 = '10.0'. 

     ASSERT 1 = 1. 

    ENDLOOP. 
    GET TIME STAMP FIELD l_end. 
    l_diff = l_end - l_start. 

    WRITE:/l_diff. 
    ENDMETHOD. 
ENDCLASS. 

START-OF-SELECTION. 
    lcl_main=>main(). 

Programm ZZY
Key "SEC_KEY" ist ein Sekundärschlüssel vom Typ "HASHED KEY". Alle Schlüsselkomponenten müssen in diesen Fällen zur Verfügung gestellt werden

Was mache ich hier falsch?

Antwort

4

Wie in der syntax documentation of the LOOP conditions angegeben,

Wenn ein sekundärer Tabellenschlüssel angegeben ist, wird jede WHERE-Bedingung muss auch optimizable sein angegeben. Andernfalls tritt ein Syntaxfehler auf oder es wird eine Ausnahme ausgelöst.

Stellen Sie sicher, dass Sie genügend Kaffee oder andere Stimulanzien zur Hand haben, wenn Sie in die Regeln dessen eintauchen, was vergleichbar und optimierbar ist und was nicht, denn das ist mühsam. In diesem Fall muss der angegebene Vergleich eine TYPE P und eine TYPE C (wie '100.00') enthalten - was möglich sein sollte - aber zusätzlich müssen die Längen übereinstimmen, was sie nicht tun. Schon die Dokumentation besagt, dass es aufgrund der Komplexität der Vergleichsregeln (vor allem bei elementaren Datentypen, ist es keine gute Idee, einen Regelsatz zu erstellen, der genau angibt, wann der Vergleichstyp mit dem Datentyp des Datentyps übereinstimmt) linker Operand

Fazit:. genau die gleiche Art für Schlüsselzugriff verwenden, nie auf implizite Konvertierungen verlassen Wenn Sie eine Variable oder konstante mit dem gleichen Typ Sie für Ihre valueN Spalten verwendet deklarieren und verwenden, die im Vergleich. es funktioniert

+1

Das war es! Angeben der Literale, die in dem Lo verwandt werden Op Bedingung als Konstanten löste das Problem! – Jagger