-
SELECT .... ENDSELECT
Quando usamos a cláusula <SELECT ...ENDSELECT> o
retorno do servidor é feito registro a registro.
SELECT *
FROM table
WHERE field1 = ‘xxxx.
Treatment.
ENDSELECT.
- 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.
-
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
|
|