You are on page 1of 17

Versão 1.

4

Notação de DESENVOLVIMENTO para o ADVPL Doc Origem Módulo Programa Título Objetivo Versão Revisão Manual do Analista Todos Todos Notação de desenvolvimento para o ADVPL Adequar os fontes no mesmo padrão de notação e sintaxe Todas 19.03.04 (1.0) 16.02.05 (1.1) 10.04.07 (1.2) 04.08.09 (1.3) 18.05.11 (1.4)

Tabelas Utilizadas SX2 SX3 SX4 SX5 SX6 SX7 SXB TODAS TODAS TODAS TODAS TODAS TODAS TODAS

Benefícios • • • • • • • Manter os fontes legíveis e de fácil entendimento para qualquer analista de sistemas ou programador. Permitir que o fonte seja compartilhado e tenha continuidade. Permitir o “job-rotation” de atividades. Permitir a identificação rápida de não-conformidades dentro do programa. Evitar caixas-pretas ou rotinas de difícil entendimento. Aumentar a qualidade do programa desenvolvido. Aumentar a produtividade.

Ensaios • • A responsabilidade faz parte da competência individual. O uso da notação deverá ser auditada pelos Coordenadores de Sistemas e pela Engenharia.

Desenvolvimento

Emissão : 18/05/11

NIL. .OR. Dessa forma. NIL. ou seja porque ela foi criada e/ou qual a sua finalidade.1]. NIL.. NIL. // Minutos do cronograma PRIVATE e PUBLIC – Não devem ser utilizadas.NIL ) Só deve ser usado quando não existe alternativa no uso do TRANSLATE do objeto: Desenvolvimento Emissão : 18/05/11 .. NIL. NIL.3]. NIL.CH” porque já estão dentro do PROTHEUS. aBtnSup[nButton. Local aArea Local nCont Local nTimeMin Variáveis • • • := GetArea() := 0 := 0 // Salva a área atual antes de iniciar esse processo.4 Definições Técnicas Declaração dos defines: Sempre em maiúsculo e no inicio do fonte. Além do fonte ficar mais legível.CH” nem “COLORS. NIL. NIL.CH. fica mais fácil identificar se a sintaxe do campo está correta. Compromete a integridade de pontos de entrada.2].. Operador . NIL.. // Contador de itens do pedido de venda – SC6.AND. aBtnSup[nButton. também permite identificar se a lógica booleana aplicada está correta. Declaração de Variáveis: Todas devem ter seu “Objetivo” declarado na frente da variável. NIL.CH" Correção imediata: Não usamos mais “FIVEWIN. Uso do CONSTRUCTOR do objeto: TBtnBmp():NewBar( aBtnSup[nButton. Dessa forma. Operadores lógicos: Deve ser sempre maiúsculos para facilitar o entendimento da lógica aplicada. o fonte fica mais legível e facilita a compreensão do programa. <> ! Valor lógico E Ou Diferente Não Strings: Deve ser com “ (aspas duplas). O compilador não aceita variáveis fora de uso e não declaradas. NIL. Para identificar se o compilador tem os defines corretos para gerar o RPO e para a rotina desenvolvida. NIL.CH" #INCLUDE "PROTHEUS. porque: O ADVPL aceita a passagem de parâmetros por referência Esse tipo de variável fragiliza a segurança do sistema.NIL. #INCLUDE "PROGRAMA.Versão 1. aBtn[nAux]. Campos das tabelas: Sempre em MAIÚSCULO (inclusive as variáveis de memória M->).NIL. uma vez que aspas simples são usadas na composição dos SELECTS das QUERY´s para processos no Top Connect.

. .. ..T..oFolderTlc. corrigidos ou substituídos. .NIL .cTransp .Versão 1.nTxDescon . Se houverem mudanças na função ou não-conformidade detectadas.lHabilita .NIL . . . Funções com muitos parâmetros devem ser alinhadas em 4 colunas – tabuladas e sequenciais: Function Tk271Historico( nOpc oFolderTlv cCodTransp cCidadeC cBairroC nLiquido aParcelas nValorCC oEnchTlc .cCodCont .NIL .oEnchTmk.50 BTNBMP oBtnCliente RESOURCE "SALVAR" SIZE 20.cUfE. Exemplo: SGMnuAtivo( NIL nLin NIL.cDescPagto.20 Porque se houverem mudanças nas classes dos objetos não será necessário fazer manutenção nos os fontes.cCepC .cBairroE.E. Pontos de Entrada: Usar os comandos ExistBlock e ExecBlock Local lTMKMHI := ExistBlock("TMKMHI") If lTMKMHI ExecBlock(“TMKMHI”.cEncerra . .F.nTxJuros . Exemplo de uso de CONSTRUCTOR: Criação dinâmica de objetos Passagem de parâmetros: Os parâmetros que não são usados devem ser identificados por NIL.nNumParcelas.) Endif //P...) Return(.cCob . NIL. .cCepE .aColsTlv .nFinanciado .nCol .cCodAnt) .cChave .nVlJur.NIL .cCidadeE ..NIL . NIL) . fica fácil identificar quais os parâmetros devem ser alterados.NIL .. ..cEntidade ..F. evitando assim retrabalho..cCodPagto .oFolderTmk . ..cEnt.oDlg .4 @10.oEnchTlv . .cMotivo ..cUfC . .nEntrada . para TeleMarketing Desenvolvimento Emissão : 18/05/11 .NIL . .

Resultados .Processos .Gravações .4 Documentação do cabeçalho da função Deve ser revisado se houver mudança na estrutura (novo parâmetro.Cálculos Usar o modelo do IDE (Inserir -> Documentação de Explicação) Sintaxe de comandos Banco de Dados: Desenvolvimento Emissão : 18/05/11 .Validações .Versão 1.) Documentação do fonte Sempre aplicar no fonte com um todo e principalmente em: .Condicionais . retorno etc.

.lMsg) oDlg:End() Endif If ElseIf Endif Do Case Endcase Laços: While End For Next Conversão de valores: LEN STR VAL TRIM ALLTRIM Desenvolvimento Emissão : 18/05/11 .) Caso contrário.lMsg).Versão 1. para deixar o fonte simples e de fácil entendimento deve ser usado dessa forma: If TK271Fim(nOpc.F.4 DbSelectArea("XXX") DbSetOrder(X) If DbSeek(xFilial("XXX")) Endif DbSkip() DbCommit() Condicionais: O IIF deve ser usado sempre que a linha não permite a divisão da condição: ACTIVATE MSDIALOG oDlg ON INIT VALID IIF(TK271Fim(nOpc.oDlg:End().

Desenvolvimento Emissão : 18/05/11 .4 Configuração do IDE O uso da tabulação fora desse padrão compromete o alinhamento dos fontes.Versão 1.

X3_DECIMAL. dessa forma nos comentários não usaremos acentuação: Ex: Criacao dos tres paineis com coordenadas Zero e alinhamento no topo da tela Arrays: Carregar em linhas ao invés de colocá-los em uma só linha de comando: Aadd(aTmpHeader. X3_PICTURE..4 O Fonte MsLineDraw. X3_ARQUIVO.. fica fácil identificar quantas colunas tem o array e qual a finalidade de cada uma.. Porém..{ X3TITULO(). X3_CAMPO.. não aceita ACENTUAÇÃO. X3_USADO..Versão 1.. que compromete o entendimento do fonte nas linhas de comentário... X3_VALID. Desenvolvimento Emissão : 18/05/11 . X3_TIPO. X3_TAMANHO.. X3_CONTEXT. X3_PROPRI }) // // // // // // // // // // // 01 02 03 04 05 06 07 08 09 10 11 Documentar sempre a estrutura do ARRAY: // // // // // // // // // // // // [01] [02] [03] [04] [05] [06] [07] [08] [09] [10] [11] [12] Abatimentos Correcao Monetaria Juros Acrescimo Decrescimo Desconto Valor Original do Titulo Saldo do Titulo na Moeda do Titulo Saldo do Titulo na Moeda Corrente Pagamento Parcial Valor a ser Recebido na moeda do titulo Valor a ser Recebido na moeda corrente := := := := := := := := := := := := aRdpTlc[1][2] + aValores[2] aRdpTlc[2][2] + aValores[10] aRdpTlc[3][2] + aValores[8] aRdpTlc[4][2] + aValores[5] aRdpTlc[5][2] + aValores[4] aRdpTlc[6][2] + aValores[9] aRdpTlc[7][2] + aValores[1] aRdpTlc[8][2] + aValores[6] aRdpTlc[9][2] + aValores[7] aRdpTlc[10][2] + aValores[3] aRdpTlc[11][2] + aValores[11] aRdpTlc[12][2] + aValores[12] aRdpTlc[1][2] aRdpTlc[2][2] aRdpTlc[3][2] aRdpTlc[4][2] aRdpTlc[5][2] aRdpTlc[6][2] aRdpTlc[7][2] aRdpTlc[8][2] aRdpTlc[9][2] aRdpTlc[10][2] aRdpTlc[11][2] aRdpTlc[12][2] Dessa forma. exibe corretamente os caracteres ASCII usando na documentação da função.

Sempre NUMERICO (Dessa forma cria-se uma validação constante. RESPOSTA e não: CODORC.Versão 1. Comandos proibidos Private -> utilizar variáveis Local ou Static Public -> utilizar variáveis Local ou Static Dbgotop() -> utilizar If DbSeek(xFilial(“xxx”).CH – SIGAGPR onde estão todos os DEFINES de cada módulo. sem retrabalho nos fontes.4 Include das constantes para o sistema Para cada módulo existe um programa chamado XXXDEF.CH . Exemplo: TMKDEF. VENDA. E se quisermos mudar o conteúdo do campo para 1 = "W" é só mudar o DEFINE. usando base numérica ao invés de Caracter . PERGUNTA. dessa forma ao invés de usarmos: If SKC->KC_STATUS <> "2" usamos : If VAL(SKC->KC_STATUS) <> INATIVA Premissas: • Os nomes devem ser inteiros e completos ou seja: ATIVA.o que não gera problemas com banco de dados e mantém o mesmo padrão no DEFINE (tudo numérico) • Porque: Isso evita que haja necessidade de consultar o SX3 para saber se 1 é "X" e 2 é "Y".CH. INATIVA. Exemplo: // Status da pesquisa na tabela SKC #INCLUDE ATIVA 1 #INCLUDE INATIVA 2 Esse INCLUDES são usados para as validações de sistema.SIGATMK GPRDEF. CODINATIVO (nomes compostos). CODPED. CODATIVO.) For nX Desenvolvimento Emissão : 18/05/11 .T. ORCAMENTO. .

visão técnica. visão SQA.... Estrutura dos Fontes ... Foi implementada a melhoria . oDlg:lMaximized:=.. Release Qualidade: O que a Qualidade deve fazer para validar a alteração.END RecLock() REPLACE CAMPO With Conteudo REPLACE CAMPO With Conteudo REPLACE CAMPO With Conteudo MsUnlock() END TRANSACTION Documentação do Source Safe Check-in do fonte Release Desenvolvimento: Deve constar pelo menos a função que foi alterada e o que foi feito. .e qualquer variável com 1 byte.4 Next vazio Local n Local i Local x . Release Suporte: O que foi corrigido no processo ou seja no sistema.Versão 1.200 // O restante do código deve ficar dentro da estrutura DEFINE…ACTIVATE. { 27. } ) Next nButton ACTIVATE MSDIALOG oDlg ON INIT Exemplo 2: BEGIN TRANSACTION // O restante do código deve ficar dentro da estrutura BEGIN ...T. . Passo-apasso para comprovar que a não-conformidade foi corrigida. .T.. visão sistêmica Iniciar com: Foi corrigida a Não-Conformidade em que .Identação Exemplo 1: DEFINE MSDIALOG oDlg TITLE STR0001 FROM 100..F. Desenvolvimento Emissão : 18/05/11 .F.. Iniciar com: Foi modificada a função .. 27. aObjects := {} nTotAux := ( 30+Len(aBtnLat) ) For nButton:= 1 To nTotAux Aadd( aObjects.

.Versão 1..Se for possível não utilizar uma única linha de comando.Atualização do comentário da função (parâmetros).Tirar OemToAnsi.AND. ou seja. se houve uma alteração na versão 8.ch. .T. utilização dos comandos .Utilização do comando REPLACE <Campo> WITH <Conteúdo>. visão sistêmica (idem ao Release Suporte) Release Qualidade: O que a Qualidade deve fazer para validar a alteração. .Troca de TamSX3() através de uma variável local. .Nome de campos e variáveis de memória em maiúsculo.Identação com 4 elementos por linha no preenchimento do array. .ch por Protheus.. .Identação com 4 parâmetros por linha na chamada de função. R (Atualização. . .11 ela tem que ser feita também na versão 10.ch.Troca de GetMV por SuperGetMV através de uma variável local. Notação das funções e dos fontes 1) Nome de programa: 3 caracteres do nome do módulo + A.Chamada do comando MemoWrite para query. visão SQA (idem ao Release Qualidade do VSS) Fontes envolvidos na alteração: Relação de fontes alterados na FNC Source Safe: Qualquer alteração deve ser reproduzida a partir da versão alterada e replicada para a versão posterior. . . variáveis de loop. . .F. Relatório) + número do programa Exemplo: LOJC040 2) Nome de função: 2 caracteres do nome do módulo + número do programa + nome() Tamanho máximo: 10 caracteres.Troca do comando IIf por If/Else/Endif . .Troca de != por <>.OR. . Fechamento da FNC (texto visualizado pelos analistas e clientes) Análise Inteligência Protheus: O que foi corrigido no processo ou seja no sistema.4 Fontes envolvidos na alteração: Relação de fontes alterados na FNC Implementação Contínua: Verificação que deve ser realizada para cada programa que foi alterado na FNC. .Comentário das variáveis. Desenvolvimento Emissão : 18/05/11 . .Substituir FiveWin. .. . . .Declaração de uma variável por linha.Acerto na identação do fonte. DbSetOrder.Componentização das funções.Troca do comando Enddo por End.Criação de cabeçalho para as funções. C. . . .Padronização na nomenclatura do fonte.Comentar as strings que estão no arquivo *. . DbSelectArea. Consulta.

Exemplo: Ao invés de: Local n := len(aCols) Usar: Local nLenAcols := Len(aCols) Campos novos Quando criarem campos novos (em qualquer tabela).4 Exemplo: No programa LOJC040 Errado: Static Function AfterCols(aCols) Correto: Static Function Lj040After(aCols) 3) Nome de variáveis: Usar nomes de variáveis que não sejam compostos de somente 1 caracter de vogal ou consante: k.Versão 1. 2) É difícil de entender o código. y. Nomenclatura de update: “UPD” + 3 caracteres do módulo + sequência numérica Ex: UPDCRD01. i Motivos: 1) Existem diversas variáveis privates que foram convertidas para local no P10 R2. além de fazerem o programa de update (para geração automática do campo na base de dados do cliente). Ex: If SF1->(FieldPos("F1_NUMMOV")) > 0 Desenvolvimento Emissão : 18/05/11 . 3) É uma programação pobre. x. n.prw Sempre validar um campo novo usando o comando FieldPos(). vocês precisam obrigatoriamente usar os comandos: • • • FieldPut: Set the value of a field variable FieldGet: Retrieve the value of a field variable FieldPos: Return the position of a field in a work area * Mais informações no Norton Guide. Isso vai facilitar o trabalho na frente.

AND. Ex: Versão 8.IIf(nOpc <> 3. . A criação dos campos ocorre – de maneira obrigatória – somente na instalação de uma versão nova (Ex: Protheus 10).11 R1. Next nX Motivos: 1) Os clientes não são obrigados a rodar os updates.F.) Endif aCols[Len(aCols)][nUsado+1] := .T. M->&(FieldName(nI))) EndIf Next nI MsUnLock() FkCommit() 2) For nX := 1 TO Len(aHeader) If (aHeader[nX][10] <> "V" . Programação: Como proteger o fonte em algoritmos com ARRAY Importante: É necessário sempre validar o array antes de usar a posição do mesmo Trecho de fonte com erro: //Gera os arrays antes do recalculo dos valores For nX := 1 to Len(aLojas) Desenvolvimento Emissão : 18/05/11 .4 Endif Exemplos: 1) //ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ //³ Atualiza dados do cabecalho do produto principal ³ //ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ RecLock("SUG".. 2) Nós temos as versões de Release dentro de uma versão.. xFilial("SUG")) Else FieldPut(nI.Versão 1. R2. R3 e R4 – o cliente pode migrar de uma para outra atualizando a base de dados e/ou somente o RPO.F.)) For nI := 1 TO SUG->(FCount()) If (FieldName(nI) == "UG_FILIAL") FieldPut(nI. aHeader[nX][08] <> "M") aCols[Len(aCols)][nX] := FieldGet(FieldPos(aHeader[nX][2])) Else aCols[Len(aCols)][nX] := CriaVar(aHeader[nX][2].T. .

aSL2 e aSL4) com os dados de cada orcamento aArquivos := Lj7GeraOrc( aLojas[nX][5] ) AAdd( aArqAux. Confirmar e em seguida.11 – Release 4 = ATUSX P8 R4 Protheus 10 = ATUSX P10-R1. gerar o CH atualizado na máquina. aArquivos } ) Next nX Como deveria ser: //Gera os arrays antes do recalculo dos valores For nX := 1 to Len(aLojas) If Len(aLojas[nX]) >= 2 DbSelectarea(“SL1”) DbSetorder(1) If DbSeek(aLojas[nX][1]+aLojas[nX][2])) If Len(aLojas[nX]) >= 5 aArquivos := Lj7GeraOrc( aLojas[nX][5] ) AAdd( aArqAux. Exemplo: Protheus 8. { aClone(aLojas[nX]).R1).4 //Posiciona o orcamento no original SL1->(DbSeek(aLojas[nX][1]+aLojas[nX][2])) //Gera os arrays (aSL1. 3) Como incluir o CH no ATUSX: • • • Atualizar o cabeçalho do programa no ATUSX. aArquivos } ) Endif Endif Endif Next nX Criação de novos STR´s nos arquivos . 4) A ordem dos fatores: Desenvolvimento Emissão : 18/05/11 .CH: Quando o fonte for atualizado em uma versão de Release (Ex: Protheus 10 .Versão 1. { aClone(aLojas[nX]). o procedimento correto é: 1) Atualizar o fonte e o arquivo CH sempre juntos. Incluir / Alterar os textos (strings) que serão traduzidos. 2) Atualizar o arquivo CH no ATUSX que estiver relacionado a versão do Release.

Erro crítico! A string deve ser colocada no arquivo CH correspondente para que seja traduzido para todos os idiomas. Endif Next nColuna Maneira Correta: Local nAuxLen := LEN( aHeader ) For nColuna := 1 To nAuxLen If aHeader[nColuna][8] == "C" aCols[nAtual][nColuna] := SPACE(aHeader[nColuna][4]) ElseIf aHeader[nColuna][8] == "D" aCols[nAtual][nColuna] := dDataBase ElseIf aHeader[nColuna][8] == "M" aCols[nAtual][nColuna] := "" ElseIf aHeader[nColuna][8] == "N" aCols[nAtual][nColuna] := 0 Else aCols[nAtual][nColuna] := .F.Versão 1. Endif Next nColuna Nomenclatura de Parâmetros Desenvolvimento Emissão : 18/05/11 . O idioma é desvinculado do país.F. Motivo: Evitar erros de compilação por causa de falta de strings. ex: podemos usar o sistema em espanhol para a localização Brasil. 2º) Depois subir o fonte no SOURCE-SAFE (check-in no SSIM). independente se a funcionalidade será executada inicialmente em um país. Aumento de Performance – rotinas procedurais Exemplo Incorreto do uso de FOR/NEXT: For nColuna := 1 To LEN( aHeader ) If aHeader[nColuna][8] == "C" aCols[nAtual][nColuna] := SPACE(aHeader[nColuna][4]) ElseIf aHeader[nColuna][8] == "D" aCols[nAtual][nColuna] := dDataBase ElseIf aHeader[nColuna][8] == "M" aCols[nAtual][nColuna] := "" ElseIf aHeader[nColuna][8] == "N" aCols[nAtual][nColuna] := 0 Else aCols[nAtual][nColuna] := .4 1º) Primeiro atualizar o arquivo CH no ATUSX.

Criação de Ponto de Entrada A criação de novos Pontos de Entrada (PE) deverá seguir a seguinte notação: Iniciais do módulo + Rotina + processo (gravação. deve-se sempre nomeá-los iniciando com as letras que identificam o módulo: Exemplos: Módulo Parâmetro SIGALOJA MV_LJFINPRO SIGATEC MV_ATDIAS SIGATMK MV_TMKKIT Para projetos do padrão.. Premissas para atualizar fontes no padrão 1.4 Para diferenciar os parâmetros criados por módulo. Para tratar um retorno específico (ex: lógico). validação etc. .. não utilizar P?? (específico FSW). utilizar o comando ValType().F.TOTVS Contato: Usuário requisitante para acompanhamento do chamado Produto: PZRESERVAS Desenvolvimento Emissão : 18/05/11 . código da rotina: 450. porque não sabemos que tipo de dado será retornado. Para obter novos alias abrir chamado junto a Engenharia de SW de acordo com o procedimento abaixo: 1. Estar cadastrado na ferramenta SSIM (solicitar acesso ao líder) 2.) Ex: AT450GRV (Mód. . No Call Center abra um chamado contendo as seguintes informações: Cliente: 99401 . {cParam1. GRV: gravação) If ExistBlock(“AT450GRV”) xRet := ExecBlock(“AT450GRV”.F. Projetos FSW Criação de arquivos com a nomenclatura do padrão. AT: Assistência Técnica. não utilizar MV_FSxxxxx. nParam2}) Endif If ValType(xRet) == “L” lRet := xRet Endif O retorno de um PE sempre deve ser atribuído a uma variável não-tipificada (xRet). disponível na Intranet. Conhecer a metodologia de manutenção de SW (PQ-2029).Versão 1.

criar nos programas LOJXFUN?. 3. Desenvolvimento Emissão : 18/05/11 . Transferir seu chamado para área N1-ENGPMPA.<Nome lógico da tabela>. Módulo: SIGAXXXX Finalidade: <Projeto> . equipe "I8".Solicitação de serviços internos 2.4 Rotina: PZRESERVAS Origem: ORI001 – Cliente em produção Categoria: CAT032 . Funções na Venda Assistida iniciar por Lj7xxxx Funções genéricas que serão utilizadas por mais de uma função.Versão 1. Descrever no campo incidente: Solicitação de reserva de tabela "XYZ" Célula requisitante: XXXXXXXX – Inovação Padrão.

copiar ou divulgar as informações nela contidas ou tomar qualquer ação baseada nessas informações. Esta mensagem contém informação confidencial e/ou privilegiada.4 Documentações Esse é um documento técnico e específico para área de Inteligência Protheus (IP) da TOTVS S/A. não pode usar. Desenvolvimento Emissão : 18/05/11 .Versão 1. Se você não for o destinatário ou a pessoa autorizada a receber esta mensagem.