Exceto em casos de um único registro (SELECT UP TO 1 ROWS … ENDSELECT.).
SELECT INTO TABLE
O retorno do servidor é feito uma única vez para todos os registros.
SELECT *
INTO TABLE wt_table
FROM table
WHERE field1 = ‘xxxx’.
IF sy-dbcnt NE 0.
LOOP AT wt_table.
Treatment.
ENDLOOP.
ENDIF.
INTO CORRESPONDING FIELDS OF
DATA : BEGIN OF wt_table OCCURS 0,
field1 LIKE table-field1,
field2 LIKE table-field2,
field3 LIKE table-field3,
END OF wt_table.
SELECT *
INTO CORRESPONDING FIELDS OF
wt_table
FROM table
WHERE field1 = ‘xxxx’.
Neste caso o SAP executa uma pesquisa em busca dos campos de mesmo nome dos retornados no 'select' para depois alocá-los
INTO TABLE
DATA : BEGIN OF wt_table OCCURS 0,
field1 LIKE table-field1,
field2 LIKE table-field2,
field3 LIKE table-field3,
END OF wt_table.
SELECT field1 field2 field3
INTO TABLE wt_table
FROM table
WHERE field1 = ‘xxxx’.
FOR ALL ENTRIES IN
SELECT *
INTO TABLE wt_table1
FROM table1
WHERE field1 IN s_field1.
SELECT *
INTO TABLE wt_table2
FROM table2
FOR ALL ENTRIES IN wt_table1
WHERE field1 =
wt_table1-field1
AND field2 = ‘xxxx’.
- testar qde registros- Ordenar- Eliminar duplicados* Usar a chave primária ou campos que sejam seletivos através de algum índiceFOR ALL ENTRIES IN
SELECT *
INTO TABLE wt_table1
FROM table
WHERE field1 IN s_field1.
IF sy-dbcnt NE 0.
SORT
wt_table1 BY field1.
DELETE ADJACENT DUPLICATES FROM
wt_table1
COMPARING field1.
SELECT *
INTO TABLE wt_table2
FROM table2
FOR ALL ENTRIES IN
wt_table1
WHERE field1 =
wt_table1-field1
AND field2 = ‘xxxx’.
ENDIF.
READ TABLE
READ TABLE wt_table
WITH KEY field1 = wv_field1.
Utilizar READ TABLE WITH KEY com BINARY SEARCH
READ TABLE
SORT wt_table BY field1.
READ TABLE wt_table
WITH KEY field1 = wv_field1
BINARY SEARCH.
LOOP AT
LOOP AT wt_table1.
LOOP AT wt_table2
WHERE field =
wt_table1-field.
Treatment.
ENDLOOP.
ENDLOOP.
- Evitar ao extremo LOOP WHERE- Evitar o uso de mais de 3 loops aninhados - Utilizar LOOP FROM SY-TABIX sempre que possívelLOOP AT
SORT wt_table1 BY field1.
SORT wt_table2 BY field1.
wv_index = 1.
LOOP AT wt_table1.
LOOP AT wt_table2 FROM
wv_index.
IF wt_table2-field1 >
wt_table1-field1.
wv_index = sy-tabix.
EXIT.
ELSE IF wt_table2-field1 =
wt_table1-field1.
Treatment.
ENDIF.
ENDLOOP.
Treatment.
ENDLOOP.
ORDER BY
SELECT *
FROM table
WHERE field1 = ‘xxxx’
ORDER BY field2.
Não usar ORDER BY para campos na cláusula fora dos índices
ORDER BY
SELECT *
INTO TABLE wt_table
FROM table
WHERE field1 = ‘xxxx’.
IF sy-dbcnt NE 0.
SORT
wt_table BY field2.
LOOP AT wt_table.
Treatment.
ENDLOOP.
ENDIF.
SELECT *
SELECT *
INTO CORRESPONDING FIELDS OF TABLE
wt_ekpo
FROM wt_ekpo
FOR ALL ENTRIES IN wt_ekko
WHERE ebeln = wt_ekko-ebeln.
Apesar da comodidade, devemos evitar o uso de * pois o mesmo aloca muito espaço em memória. É recomendado selecionar somente os campos que serão utilizados.
SELECT ebeln matnr menge
INTO TABLE wt_ekpo
FROM wt_ekpo
FOR ALL ENTRIES IN wt_ekko
WHERE ebeln =
wt_ekko-ebeln.
SELECT
dentro de LOOP...ENDLOOP
SELECT *
INTO TABLE it_table1
FROM table1.
Loop at it_table1.
SELECT *
FROM table2
INTO TABLE it_table2
WHERE table1-field1 =
table2-field1
AND it_table2-field2 = 'abc'.
Treatment.
Endloop.
SELECT *
INTO TABLE it_table1
FROM table1.
SORT it_table1 BY field1.
DELETE ADJACENT DUPLICATES FROM it_table1
COMPARING field1.
SELECT *
INTO TABLE it_table2
FROM table2
FOR ALL ENTRIES IN it_table1
WHERE field1 = it_table1-field1
AND field2 = 'abc'.
Loop at it_table1.
READ TABLE it_table2
WITH KEY field1 =
it_table1-field1
BINARY SEARCH.
IF SY-SUBRC = 0.
Treatment.
ENDIF.
Endloop.
SELECT *
INTO TABLE it_table1
FROM table1.
SORT it_table1 BY field1.
DELETE ADJACENT DUPLICATES FROM it_table1
COMPARING field1.
SELECT *
INTO TABLE it_table2
FROM table2
FOR ALL ENTRIES IN it_table1
WHERE field1 = it_table1-field1
AND field2 = 'abc'.
Loop at it_table1.
READ TABLE it_table2
WITH KEY field1 =
it_table1-field1
BINARY SEARCH.
IF SY-SUBRC = 0.
Treatment.
ENDIF.
Endloop.
Utilizar operações array/massiva para atualizar tabelas (p. ex. INSERT / DELETE /
UPDATE / MODIFY FROM TABLE) ao invés
de utilizar loops
LOOP AT wt_table
WHERE field1 = ‘xxx’.
DELETE wt_table.
ENDLOOP.
LOOP AT wt_table
WHERE field1 = ‘xxx’.
wt_table-field2 = ‘aaa’.
wt_table-field3 = ‘bbb’.
MODIFY wt_table.
ENDLOOP.
LOOP AT wt_table1.
MOVE wt_table1 TO wt_table2.
APPEND wt_table2.
ENDLOOP.
LOOP AT wt_table1.
MOVE-CORRESPONDING wt_table1 TO
wt_table2.
ENDLOOP.
DELETE FROM wt_table
WHERE field1 = ‘xxx’.
CLEAR wt_table.
wt_table-field2 = ‘aaa’.
wt_table-field3 = ‘bbb’.
MODIFY wt_table
TRANSPORTING field2 field3
WHERE field1 = ‘xxx’.
APPEND LINES OF wt_table1
TO wt_table2.
wt_table2[] = wt_table1[].
Boa Prática
Evitar utilizar seleções com OR ou argumentos que possam agregar muito peso aoacesso ao DB, trocando por vários SELECTs na mesma tabela, usando INTO TABLEno 1º select, e APPENDING TABLE nos demais (se necessário, excluirduplicidades após todos os SELECTs). Ex.: Tabela VBFA com OR nos camposVBTYP_N ou VBTYP_V
Boa Prática 11
Não usar JOIN com mais de 5 tabelas ou JOIN muito complexos (criar views). Sepossível, desmembrar um join muito complexo em vários selects (ou joinsmenores), compondo a tabela interna com todos os dados ao final dos selects
Boa Prática 12
SELECTCOUNT: O * faz parte da sintaxe do comando. (Se for apenas para validar se oregistro existe, usar adicionalmente UP TO 1 ROWS)
Boa Prática 13
SELECT- Sempre buscar a utilização de um índice e seguir aseqüência de campos deste indice
Boa Prática 14
Todo SELECT SINGLE deve ser utilizado com a chave completa (caso contrárioutilizar SELECT..UP TO 1 ROWS...ENDSELECT.)
Boa Prática 15
Evitar ao máximo funções em instruções SQL- GROUP BY- HAVING- DISTINCT
Boa Prática 16
Outrasconsiderações- Não utilizar COMPUTE- Utilizar WHILE ao invés de DO ... ENDDO- Não utilizar FIELD-SYMBOL com TYPE ANY- Não utilizar parâmetros sem tipo definido- Não utilizar o SORT em tabelas internas sem especificar os campos- Sempre que possível definir parâmetros de seleção como obrigatórios(especialmente os que compõe chave primária ou índices)- Avaliar a possibilidade de executar o processo em paralelo (avaliando combasis a disponibilidade de recursos), tratando com parâmetros o n.º detasks.- Verificar a possibilidade de utilizar funções "SINGLE_READ" aoinvés de acessar diretamente o banco de dados- Verificar a possibilidade de utilizar funções “ARRAY_READ”- Sempre utilizar as transações de Verificação Ampliada (Transação SLIN) eCode Inspector (Transação SCI) para detectar erros e avisos no código.
Boa Prática 17
Objetosde Banco de Dados* Criar tabelas comoBUFERIZADAS quando possível (Tabelas até 1 Mb e que não sofram muitasatualizações , típico de tabelas de cadastros estáveis)* Sugerir a criaçãode índices quando não houver um índice específico para a seleção de umagrande quantidade de registros (atentando ao fato de que a cada novo índice,INSERT/UPDATE ficarão mais demorados)* Sempre utilizar o campo mandante na criação dos índices* O padrão denomenclatura para criação de índice é sempre iniciar pela letra “Z”.* Criar tabelas com acategoria de tamanho e tipo de dados (APPL0, 1 etc) dimensionadascorretamente
Boa Prática 18
Definir tabelas internas grandes como SORTED e muito grandes como HASHED