Beruflich Dokumente
Kultur Dokumente
• Práticas de programação
• Performance
Práticas de programação
Veremos:
TRANSAÇÕES
LOCK de registro
• NO-LOCK
• SHARE-LOCK
• EXCLUSIVE-LOCK
LOCK de registro
Se o registro está: Outros poderão:
• EXCLUSIVE-LOCK
NO-LOCK • SHARE-LOCK
• NO-LOCK
• SHARE-LOCK
SHARE-LOCK (apenas leitura)
• NO-LOCK
EXCLUSIVE-LOCK • NO-LOCK
Conceito de TRANSAÇÕES
• DO TRANSACTION;
• FOR EACH TRANSACTION;
• REPEAT TRANSACION;
• DO ON ENDKEY ou DO ON ERROR onde
o bloco afeta diretamente a base de dados ou
lê registros com EXCLUSIVE-LOCK;
• FOR EACH ou REPEAT que diretamente lê
registros com EXCLUSIVE-LOCK.
Conceito de TRANSAÇÕES
Observe:
…
REPEAT :
CREATE customer.
UPDATE custnum NAME address address2 city state
postalcode.
END.
…
Para cada interação do REPEAT, o bloco é uma
transação em separado, ou seja, se ocorrer algum
erro o progress irá desfazer apenas a última
passagem pelo “repeat”.
Conceito de TRANSAÇÕES
Caso você queira controlar todos os registros incluídos
neste processo você pode tornar a transação maior:
DO TRANSACTION:
REPEAT:
CREATE customer.
UPDATE custnum NAME address address2 city
state postalcode.
END.
END.
Conceito de TRANSAÇÕES
• Criação de sub-transações;
Do transaction:
...
Run teste.
…
End.
Conceito de TRANSAÇÕES
Transações e Triggers:
Do transaction:
...
...
End.
Performance
<comando>. ELSE...
IF <condição N> THEN
...
IF <condição N> THEN <comando>.
<comando>.
Utilização do comando IF para o uso do
método LOAD-MOUSE-POINTER
Troque:
IF CAMPO:LOAD-MOUSE-
POINTER("<DIRETÓRIO\ARQUIVO>")
IN FRAME {&FRAME-NAME} THEN.
Pode ser substituída por:
CAMPO:LOAD-MOUSE-
POINTER("<DIRETÓRIO\ARQUIVO>")
IN FRAME {&FRAME-NAME}.
Utilização do comando CASE
Trocar: Por:
IF <condição 1> THEN DO: CASE <variável e/ou campo>:
WHEN <Valor 1> THEN DO:
comandos... Comandos...
END. END.
ELSE WHEN <Valor 2> THEN DO:
IF <condição 2> THEN DO: Comando...
END.
comandos... WHEN <Valor 3> THEN DO:
Comando...
END.
END.
ELSE
END CASE.
IF <condição 3> THEN DO:
comandos...
END.
Utilização de blocos para agrupar
comandos
Trocar: Por:
IF <condição> THEN DO: IF <condição> THEN
ASSIGN VAR1 = <valor1> ASSIGN VAR1 = <valor1>
VAR2 = <valor2> VAR2 = <valor2>
VAR3 = <valor3>. VAR3 =<valor3>.
END. ELSE
ELSE DO: ASSIGN VAR1 = <valor4>
ASSIGN VAR1 = <valor 4> VAR2 = <valor5>
VAR2 = <valor 5> VAR3 = <valor6>.
VAR3 = <valor 6>.
END.
Teste de variáveis lógicas
Trocar:
IF <variável ou campo lógico> = YES THEN DO:
Comandos ...
END.
Por:
IF <variável ou campo lógico> THEN DO:
Comandos ...
END.
Utilização do comando
CAN-FIND
Trocar:
FIND <tabela> WHERE <tabela>.<campo-chave> = <VALOR> no-lock.
IF NOT AVAILABLE <tabela> THEN DO:
CREATE <tabela>.
ASSIGN <tabela>.<campo-chave>.
END.
Por:
IF NOT CAN-FIND(<tabela> WHERE <tabela>.<campo-chave> =<valor>)
THEN DO:
CREATE <tabela>.
ASSIGN <tabela>.<campo-chave>. Com o can-find você apenas faz
END. trafegar um valor lógico ao invés
do registro inteiro.
Utilização do comando DO para laços
...O/*repeat
Finalização do programa ... /* Finalização do programa */
por outro lado */
cria uma transação.
TEMP-TABLES
• Não é aconselhável a utilização de TEMP-TABLE
definida como uma variável global.
• É possível, em muitos casos, substituir uma TEMP-
TABLE global por uma TEMP-TABLE compartilhada
(NEW SHARED e SHARED) ou por passagem de
parâmetros.
• Procure defini-las como NO-UNDO.
• Crie o mínimo possível, índices.
• Procure evitar a criação de TEMP-TABLES LIKE.
• Não é necessário utilizar os comandos FOR FIRST,
FOR LAST e CAN-FIND para TEMP-TABLES.
VARIÁVEIS
Errado:
Certo:
DEF VAR c-it-codigo AS CHAR extent
DEF VAR c-it-codigo AS CHAR
10 NO-UNDO.
extent 10 NO-UNDO.
DEF VAR i-cont AS integer
ASSIGN c-it-codigo = "A".
NO-UNDO.
DO i-cont = 1 TO 10:
ASSIGN c-it-codigo[i-cont] = "A".
END.
ASSIGN
Procure agrupar ao máximo as variáveis em
um mesmo ASSIGN.
Trocar:
ASSIGN c-it-codigo = "item-1".
ASSIGN i-op-codigo = 10.
ASSIGN c-cod-roteiro = "rot-1".
Por:
ASSIGN c-it-codigo = "item-1“
i-op-codigo = 10
c-cod-roteiro = "rot-1".
BUFFER-COPY
RUN cpp/cpapi001.p
PERSISTENT SET h-handle.
DELETE PROCEDURE h-handle.
WORK-FILES
Vantagens:
• É mais performático que TEMP-TABLES
• Permite busca de forma aleatória utilizando ROWID
Desvantagens:
• Não permite a utilização de índices
• Não permite a utilização de FIND, apenas FIND
NEXT/PREV/FIRST/LAST tornando o acesso sequencial
• Os dados são armazenados exclusivamente em memória
não possibilitando o armazenamento de uma grande
quantidade de registro
INDEXED-REPOSITION
ÍNDICES
ÍNDICES
Adequado:
FOR EACH oper-ord
WHERE oper-ord.nr-ord-prod = i-nr-ord-prod
NO-LOCK:
Melhor:
FOR EACH oper-ord
WHERE oper-ord.nr-ord-prod = i-nr-ord-prod
AND oper-ord.it-codigo = c-it-codigo
Oper-ord
NO-LOCK:
nr-ord-prod
it-codigo
cod-roteiro
op-codigo
ÍNDICES
Rápido:
FOR EACH oper-ord
WHERE oper-ord.nr-ord-prod = i-nr-ord-prod
AND oper-ord.it-codigo = c-it-codigo
AND oper-ord.cod-roteiro = c-cod-roteiro
NO-LOCK:
Muito Rápido:
FOR EACH oper-ord
WHERE oper-ord.nr-ord-prod = i-nr-ord-prod Oper-ord
AND oper-ord.it-codigo = c-it-codigo
AND oper-ord.cod-roteiro = c-cod-roteiro nr-ord-prod
AND oper-ord.op-codigo = i-op-codigo it-codigo
NO-LOCK: cod-roteiro
op-codigo
ÍNDICES
EXEMPLO:
FOR EACH customer WHERE customer.cust-num = 10 OR
customer.address <> "" NO-LOCK:
DISPLAY customer.
END.
ÍNDICES
•6)
O índice com uma comparação BEGINS (porque
BEGINS é considerada como 2 RANGE MATCHES)
•7)O índice com maior número de RANGE
MATCHES
•8) O índice com o critério de ordenação (BY). Isso
acontece apenas se a cláusula WHERE não prover
informações suficientes para a seleção de outro índice.
•9) Pelo nome do índice, em ordem alfabética.
•10) O índice primário.
Outras dicas de performance
Outras dicas de performance
Certo:
FOR EACH movto-estoq
WHERE movto-estoq.dt-trans = DATE (c-data) NO-LOCK:
END.
Errado:
FOR EACH movto-estoq
WHERE STRING (movto-estoq.dt-trans) = c-data NO-LOCK:
END.