Padrão para Escrita de Fontes AdvPl Nome dos Fontes Exemplo: R FAT R 01 01 = seqüencial de acordo com a máscara formada pelos dígitos anteriores R = relatório; A = atualização; C = consulta; M = miscelânea e job FAT = módulo de faturamento; outras possibilidades: EST, COM, CTB, FIN, FIS, PCP, ATF, GPE, etc. R = rdmake (chamada por menu); E = execblock (chamada por CNAB, lançamento padrão, outro fonte, validações, gatilhos, fórmulas, etc.) Cabeçalho Corresponde à documentação básica do fonte, caracterizando o desenvolvedor, a descrição sumário do que o fonte faz e sua(s) aplicação(ões). Adotamos o modelo disponível no próprio IDE (opção Inserir/Documentação de Cabeçalho). Também é interessante documentar blocos do fonte, descrevendo o que fazem, e utilizando para isso o outro modelo também disponível no IDE (opção Inserir/Documentação de Explicação). Escrita de Query Sempre criar as condições utilizando chave de filtragem o mais próximo possível de algum índice existente na tabela, não esquecendo de colocar o campo de filial na chave; para os casos de query com objetivo de buscar registros de todas as filiais e caso seja uma tabela com muitos registros, avaliar a necessidade de criar um índice sem a filial para ganho de performance. Com Somente 1 Tabela: Exemplo errado: SELECT A1_COD, A1_LOJA, A1_NOME FROM SA1010 SA1 WHERE A1_COD = ‘000001’ AND SA1.D_E_L_E_T_ <> ‘*’ Ou SELECT A1_COD, A1_LOJA, A1_NOME FROM SA1010 SA1 WHERE A1_COD = ‘000001’ AND A1_FILIAL = ‘’ AND SA1.D_E_L_E_T_ <> ‘*’ Nesse caso, o SQL executará o que chamamos de full scan, ou seja, fará uma busca em toda a tabela para localizar um único registro. Exemplo correto: SELECT A1_COD, A1_LOJA, A1_NOME FROM SA1010 SA1 WHERE A1_FILIAL = ‘ ‘ AND A1_COD = ‘000001’ AND SA1.D_E_L_E_T_ <> ‘*’ Desta forma, o SQL utilizará o índice para localizar os registros conforme a condição, sem executar full scan e gerando o resultado mais rapidamente. Com 2 ou mais Tabelas: Exemplo errado: SELECT C5_NUM, C5_CLIENTE, C5_LOJA, C6_PRODUTO, C6_QTDVEN FROM SC5010 SC5, SC6010 SC6 WHERE C5_NUM BETWEEN ‘ ’ AND ‘ZZZZZZ’ AND C6_NUM = C5_NUM AND C5_FILIAL = ‘ ’ AND C6_FILIAL = ‘ ’ AND SC5.D_E_L_E_T_ <> ‘*’ AND SC6.D_E_L_E_T_ <> ‘*’ ou SELECT C5_NUM, C5_CLIENTE, C5_LOJA, C6_PRODUTO, C6_QTDVEN FROM SC5010 SC5, SC6010 SC6 WHERE C5_NUM BETWEEN ‘ ’ AND ‘ZZZZZZ’ AND C6_NUM = C5_NUM AND SC5.D_E_L_E_T_ <> ‘*’ AND SC6.D_E_L_E_T_ <> ‘*’ Nesse caso, o SQL executará o que chamamos de full scan, ou seja, fará uma busca em toda a tabela para localizar um único registro. Exemplo correto: SELECT C5_NUM, C5_CLIENTE, C5_LOJA, C6_PRODUTO, C6_QTDVEN FROM SC5010 SC5, SC6010 SC6 Página: 1 Padrão para Escrita de Fontes AdvPl WHERE C5_FILIAL = ‘ ’ AND C5_NUM BETWEEN ‘ ’ AND ‘ZZZZZZ’ AND SC5.D_E_L_E_T_ <> ‘*’ AND C6_FILIAL = ‘ ’ AND C6_NUM = C5_NUM AND SC6.D_E_L_E_T_ <> ‘*’ Desta forma, o SQL utilizará o índice para localizar os registros conforme a condição, sem executar full scan e gerando o resultado mais rapidamente. Outra dica que otimiza a performance no uso de querys diz respeito a quantidade de campos retornados na cláusula SELECT. Coso você utilize muitos campos de 1 ou mais tabelas, é indicado retornar o R_E_C_N_O_ de cada tabela e posicioná-lo dentro de um While, por exemplo. Segue exemplo: Não se esqueça de utilizar os comandos RetSqlName(Tabela) e xFilial(Alias) nas querys. Nome de Variáveis Utilizar sempre a letra com o tipo de conteúdo como primeiro dígito da variável: c para string, n para numérico, l para lógico, d para data e a para arrays. Não iniciar a variável com underline (sublinhado). Caso se esteja criando uma variável, em ponto de entrada, que possa existir como private ou pública no fonte chamador, utilize nome mais específico. Por exemplo: cLocPadE ao invés de _cLocal ou cLocal. Escrita de Campos e Comandos 1. Nome de Campo: sempre em letra maiúscula; Página: 2 Padrão para Escrita de Fontes AdvPl 2. 3. Utilizar o mesmo padrão de desenvolvimento da Microsiga: dbSelectArea(), dbSkip(), dbCloseArea(), etc; Encerre o While com EndDo e o If com EndIf; não use apenas End Projetos de Fontes Mantenha sempre os fontes organizados dentro de um mesmo diretório. Como padrão utilizamos as pastas Rdmake (até a versão 7.10) oo My Projects (8.11 e superiores). Evite criar novos arquivos de projetos (.prj), mantendo somente um projeto no cliente. Isso facilita quando atualizamos o repositório e necessitamos recompilar todos os fontes específicos do cliente. Tabulação Utilizar sempre 4 caracteres como tabulação. Fonte de exibição no IDE Utilizar a fonte padrão MS Line Draw. Assim todos os recursos de exibição no IDE serão padronizados. Cuidados Especiais para os Pontos de Entrada Utilizar sempre GetArea e RestArea para todas as tabelas envolvidas no ponto de entrada. LINEDRAW.TTF Códigos ou Valores fixos Nunca deixar informações como conteúdos de códigos de produtos, TES, clientes, etc., fixos no fonte. Sempre que essa atribuição for necessária, criar parâmetros correspondentes no SX1, SX5 ou SX6. Página: 3