2013-06-28 2 views
1

직장에서 프로그래밍하는 동안 친구가 나에게 매우 흥미로운 사례를 제시했습니다. "테스트"과 같이 와일드 카드 값이있는 테이블이 있습니다. 이 레지스터는 단어 앞에 또는 뒤에 오는 것이 중요하지 않으므로 'test'을 포함하는 단어를 찾을 수 있습니다.many-to-one 선택

예를 들어 'this is a test'과 같이 원하는 텍스트가있는 레지스터를 보유하는 다른 테이블이 있습니다.

일반 액세스 환경 설정은 와일드 카드 테이블에서 텍스트 테이블로 이루어 지지만 내 친구의 시나리오에서는 불가능합니다.

그는 실제로 해결책을 찾았지만 가능한 한 훌륭하다고 생각하지 않습니다.

그의 아이디어는 모든 와일드 카드 레지스터와 필요한 모든 텍스트를 선택하는 것이 었습니다. 그런 다음, 텍스트 테이블에 일치하는 대상이없는 모든 레지스터를 와일드 카드 테이블에서 삭제합니다. 이는 이미 정확하고 관련 값만 포함하고 있기 때문입니다. 이 같이 쓸 수 ABAP에서

이이 ABAP에서 이루어지기 때문에

data: 
    wa_wildcard type   string, 
    t_wildcards type table of string, 
    t_texts  type table of string, 
    wa_text  type   string, 
    lv_index  type   sy-tabix, 
    lv_found  type   c. 

select * from zt_texts into table t_texts. "Retrieves desired texts. 
check sy-subrc is initial. 

select * from zt_wildcards into table t_wildcards. "Retrieves all widlcards. 
check sy-subrc is initial. 

loop at t_wildcards into wa_wildcard. "Checks every Wildcard 
    move lv_index to sy-tabix. "Stores the iteration index for Wildcard table. 

    loop at t_texts into wa_text. "Checks if the actual wildcard matches any text retrieved. 
    if wa_text cp wa_wildcard-value. "If text contain parts of the wildcard string, it matches 
     move 'X' to lv_found. "Found a match, may exit the loop! 
     exit. 
    endif. 
    endloop. 

    if lv_found ne 'X'. 
    delete t_wildcards index lv_index. "removes the wildcard if no match was found. 
    endif. 
endloop. 

, 내가 와일드 카드 테이블에 대한 데이터베이스에 직접 검증 과정을 수행 할 수있는 선택 문이있을 것이라고 생각 할 수있다 너무 커서 모든 것을 선택하고, 반복하고, 처리 할 수 ​​있습니다.

EDIT : 일반적인 아이디어는 텍스트 하나 하나마다 모든 와일드 카드를 테스트하지 않고 텍스트를 사용하여 적절한 와일드 카드를 찾는 것입니다. 데이터베이스를 중심으로, 즉 select 문이나 순수한 코드로 모든 솔루션에서 구현할 수 있는지 알고 싶습니다.

+0

크기가 너무 큽니까? 그리고 btw, 그 ABAP 코딩 촬영하고 총을해야합니다. ABAP 프로그램을 작성하는 방법의 예로서 이것을 사용하지 마십시오. – vwegert

+0

이것은 적절한 코드가 아니며 시나리오가 어떻게 작동 하는지를 설명하고 ABAP 지식이없는 사람들에게 더 잘 이해할 수 있도록 쓴 것입니다. '큰'요소는 ​​항목 수만은 아니지만 불필요한 처리입니다. 와일드 카드 테이블에 200,000 개의 항목이 있고 텍스트 테이블에 600,000 개가 있고 일치 항목이 없다고 가정 해보십시오 (가상 시나리오). – Zeh

+0

모든 테이블 항목에 대해 모든 와일드 카드를 검사하지 않도록하는 마법은 없습니다. 유일한 문제는 가장 비싼 리소스 (데이터베이스 서버)로 처리를 오프로드할지 또는 ABAP 처리 중에 유지할지 여부입니다. – vwegert

답변

0

이것은 예상되는 항목 수에 따라 더 나은 방법 일 수 있습니다. ZTEXT에 대한 데이터베이스 액세스가 많으므로 ZWILDCARD에 항목이 있으므로이 수가 적 으면로드가 줄어 듭니다. 이 가정된다 ZWILDCARD

select * from zwildcard into t_wildcards. 

loop at t_wildcards into wa_wildcard. 
    select * from ztext appending table t_texts 
    where value LIKE wa_wildcard. 
    if sy-subrc is not initial. 
    delete t_wildcards index sy-index. 
    endif. 
endloop. 

양쪽에 SQL 와일드 카드 (_%하지 *+)가 항목의 목록을 갖는다. 그렇지 않은 경우 루프의 시작 부분에 필요한 서식을 추가해야합니다.

또한 에 대해서만 신경을 쓰고 t_text이 아니라면 데이터베이스 액세스가 select single 일 수 있으므로로드가 더욱 줄어 듭니다.

+0

예, 그렇지만 귀하의 경우 텍스트 데이터 앞에 와일드 카드 데이터가 있습니다. 이는 정확히 우리가 가진 반대의 시나리오입니다. – Zeh