직장에서 프로그래밍하는 동안 친구가 나에게 매우 흥미로운 사례를 제시했습니다. "테스트"과 같이 와일드 카드 값이있는 테이블이 있습니다. 이 레지스터는 단어 앞에 또는 뒤에 오는 것이 중요하지 않으므로 '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 문이나 순수한 코드로 모든 솔루션에서 구현할 수 있는지 알고 싶습니다.
크기가 너무 큽니까? 그리고 btw, 그 ABAP 코딩 촬영하고 총을해야합니다. ABAP 프로그램을 작성하는 방법의 예로서 이것을 사용하지 마십시오. – vwegert
이것은 적절한 코드가 아니며 시나리오가 어떻게 작동 하는지를 설명하고 ABAP 지식이없는 사람들에게 더 잘 이해할 수 있도록 쓴 것입니다. '큰'요소는 항목 수만은 아니지만 불필요한 처리입니다. 와일드 카드 테이블에 200,000 개의 항목이 있고 텍스트 테이블에 600,000 개가 있고 일치 항목이 없다고 가정 해보십시오 (가상 시나리오). – Zeh
모든 테이블 항목에 대해 모든 와일드 카드를 검사하지 않도록하는 마법은 없습니다. 유일한 문제는 가장 비싼 리소스 (데이터베이스 서버)로 처리를 오프로드할지 또는 ABAP 처리 중에 유지할지 여부입니다. – vwegert