Você está na página 1de 17

Verso 1.

Notao de DESENVOLVIMENTO para o ADVPL Doc Origem Mdulo Programa Ttulo Objetivo Verso Reviso Manual do Analista Todos Todos Notao de desenvolvimento para o ADVPL Adequar os fontes no mesmo padro de notao 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

Benefcios Manter os fontes legveis e de fcil 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 identificao rpida de no-conformidades dentro do programa. Evitar caixas-pretas ou rotinas de difcil entendimento. Aumentar a qualidade do programa desenvolvido. Aumentar a produtividade.

Ensaios A responsabilidade faz parte da competncia individual. O uso da notao dever ser auditada pelos Coordenadores de Sistemas e pela Engenharia.

Desenvolvimento

Emisso : 18/05/11

Verso 1.4

Definies Tcnicas Declarao dos defines: Sempre em maisculo e no inicio do fonte. Para identificar se o compilador tem os defines corretos para gerar o RPO e para a rotina desenvolvida. #INCLUDE "PROGRAMA.CH" #INCLUDE "PROTHEUS.CH" Correo imediata: No usamos mais FIVEWIN.CH nem COLORS.CH porque j esto dentro do PROTHEUS.CH. Declarao de Variveis: Todas devem ter seu Objetivo declarado na frente da varivel, ou seja porque ela foi criada e/ou qual a sua finalidade. O compilador no aceita variveis fora de uso e no declaradas. Dessa forma, o fonte fica mais legvel e facilita a compreenso do programa. Local aArea Local nCont Local nTimeMin Variveis := GetArea() := 0 := 0 // Salva a rea atual antes de iniciar esse processo. // Contador de itens do pedido de venda SC6. // Minutos do cronograma

PRIVATE e PUBLIC No devem ser utilizadas, porque: O ADVPL aceita a passagem de parmetros por referncia Esse tipo de varivel fragiliza a segurana do sistema. Compromete a integridade de pontos de entrada.

Operadores lgicos: Deve ser sempre maisculos para facilitar o entendimento da lgica aplicada. Alm do fonte ficar mais legvel, tambm permite identificar se a lgica booleana aplicada est correta. Operador .AND. .OR. <> ! Valor lgico E Ou Diferente No

Strings: Deve ser com (aspas duplas), uma vez que aspas simples so usadas na composio dos SELECTS das QUERYs para processos no Top Connect. Campos das tabelas: Sempre em MAISCULO (inclusive as variveis de memria M->). Dessa forma, fica mais fcil identificar se a sintaxe do campo est correta. Uso do CONSTRUCTOR do objeto: TBtnBmp():NewBar( aBtnSup[nButton,1],NIL,; NIL, NIL, NIL, aBtnSup[nButton,2],; NIL, aBtn[nAux], NIL, NIL,; aBtnSup[nButton,3],NIL, NIL, NIL, NIL,; NIL, NIL, NIL, NIL,NIL )

S deve ser usado quando no existe alternativa no uso do TRANSLATE do objeto:

Desenvolvimento

Emisso : 18/05/11

Verso 1.4

@10,50 BTNBMP oBtnCliente RESOURCE "SALVAR" SIZE 20,20 Porque se houverem mudanas nas classes dos objetos no ser necessrio fazer manuteno nos os fontes, evitando assim retrabalho. Exemplo de uso de CONSTRUCTOR: Criao dinmica de objetos Passagem de parmetros: Os parmetros que no so usados devem ser identificados por NIL. Exemplo: SGMnuAtivo( NIL nLin NIL, NIL, NIL) ,cEntidade ,nCol ,NIL ,NIL ,cChave ,cCodCont ,oDlg ,NIL ,NIL ,NIL ,NIL ,NIL ,; ,; ,; ,;

Funes com muitos parmetros devem ser alinhadas em 4 colunas tabuladas e sequenciais: Function Tk271Historico( nOpc oFolderTlv cCodTransp cCidadeC cBairroC nLiquido aParcelas nValorCC oEnchTlc ,lHabilita ,oEnchTlv ,cTransp ,cCepC ,cCidadeE ,nTxJuros ,nEntrada ,cMotivo ,aColsTlv ,oFolderTmk ,cCodPagto ,cCob ,cUfC ,cCepE ,nTxDescon ,nFinanciado ,cEncerra ,cCodAnt) ,oEnchTmk,; ,cDescPagto,; ,cEnt,; ,cBairroE,; ,cUfE,; ,nVlJur,; ,nNumParcelas,; ,oFolderTlc,;

Se houverem mudanas na funo ou no-conformidade detectadas, fica fcil identificar quais os parmetros devem ser alterados, corrigidos ou substitudos. Pontos de Entrada: Usar os comandos ExistBlock e ExecBlock Local lTMKMHI := ExistBlock("TMKMHI") If lTMKMHI ExecBlock(TMKMHI, .F., .F.) Return(.T.) Endif //P.E. para TeleMarketing

Desenvolvimento

Emisso : 18/05/11

Verso 1.4

Documentao do cabealho da funo Deve ser revisado se houver mudana na estrutura (novo parmetro, retorno etc.)

Documentao do fonte Sempre aplicar no fonte com um todo e principalmente em: - Condicionais - Validaes - Gravaes - Processos - Resultados - Clculos Usar o modelo do IDE (Inserir -> Documentao de Explicao)

Sintaxe de comandos Banco de Dados:


Desenvolvimento Emisso : 18/05/11

Verso 1.4

DbSelectArea("XXX") DbSetOrder(X) If DbSeek(xFilial("XXX")) Endif DbSkip() DbCommit()

Condicionais: O IIF deve ser usado sempre que a linha no permite a diviso da condio: ACTIVATE MSDIALOG oDlg ON INIT VALID IIF(TK271Fim(nOpc,lMsg),oDlg:End(),.F.) Caso contrrio, para deixar o fonte simples e de fcil entendimento deve ser usado dessa forma: If TK271Fim(nOpc,lMsg) oDlg:End() Endif If ElseIf Endif Do Case Endcase Laos: While End For Next Converso de valores: LEN STR VAL TRIM ALLTRIM

Desenvolvimento

Emisso : 18/05/11

Verso 1.4

Configurao do IDE

O uso da tabulao fora desse padro compromete o alinhamento dos fontes.

Desenvolvimento

Emisso : 18/05/11

Verso 1.4

O Fonte MsLineDraw, exibe corretamente os caracteres ASCII usando na documentao da funo. Porm, no aceita ACENTUAO, que compromete o entendimento do fonte nas linhas de comentrio, dessa forma nos comentrios no usaremos acentuao: Ex: Criacao dos tres paineis com coordenadas Zero e alinhamento no topo da tela Arrays: Carregar em linhas ao invs de coloc-los em uma s linha de comando: Aadd(aTmpHeader,{ X3TITULO(),; X3_CAMPO,; X3_PICTURE,; X3_TAMANHO,; X3_DECIMAL,; X3_VALID,; X3_USADO,; X3_TIPO,; X3_ARQUIVO,; 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, fica fcil identificar quantas colunas tem o array e qual a finalidade de cada uma.

Desenvolvimento

Emisso : 18/05/11

Verso 1.4

Include das constantes para o sistema Para cada mdulo existe um programa chamado XXXDEF.CH. Exemplo: TMKDEF.CH - SIGATMK GPRDEF.CH SIGAGPR onde esto todos os DEFINES de cada mdulo. Exemplo: // Status da pesquisa na tabela SKC #INCLUDE ATIVA 1 #INCLUDE INATIVA 2 Esse INCLUDES so usados para as validaes de sistema, dessa forma ao invs 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, INATIVA, VENDA, ORCAMENTO, PERGUNTA, RESPOSTA e no: CODORC, CODPED, CODATIVO, CODINATIVO (nomes compostos). Sempre NUMERICO (Dessa forma cria-se uma validao constante, usando base numrica ao invs de Caracter - o que no gera problemas com banco de dados e mantm o mesmo padro no DEFINE (tudo numrico)

Porque: Isso evita que haja necessidade de consultar o SX3 para saber se 1 "X" e 2 "Y". E se quisermos mudar o contedo do campo para 1 = "W" s mudar o DEFINE, sem retrabalho nos fontes.

Comandos proibidos Private -> utilizar variveis Local ou Static Public -> utilizar variveis Local ou Static Dbgotop() -> utilizar If DbSeek(xFilial(xxx), .T.) For nX
Desenvolvimento Emisso : 18/05/11

Verso 1.4

Next vazio Local n Local i Local x

...e qualquer varivel com 1 byte.

Estrutura dos Fontes - Identao Exemplo 1: DEFINE MSDIALOG oDlg TITLE STR0001 FROM 100,200 // O restante do cdigo deve ficar dentro da estrutura DEFINEACTIVATE. oDlg:lMaximized:=.T. aObjects := {} nTotAux := ( 30+Len(aBtnLat) ) For nButton:= 1 To nTotAux Aadd( aObjects, { 27, 27, .F., .F., .T. } ) Next nButton ACTIVATE MSDIALOG oDlg ON INIT

Exemplo 2: BEGIN TRANSACTION // O restante do cdigo deve ficar dentro da estrutura BEGIN ...END RecLock() REPLACE CAMPO With Conteudo REPLACE CAMPO With Conteudo REPLACE CAMPO With Conteudo MsUnlock() END TRANSACTION

Documentao do Source Safe Check-in do fonte Release Desenvolvimento: Deve constar pelo menos a funo que foi alterada e o que foi feito, viso tcnica. Iniciar com: Foi modificada a funo ... Release Suporte: O que foi corrigido no processo ou seja no sistema, viso sistmica Iniciar com:

Foi corrigida a No-Conformidade em que ... Foi implementada a melhoria ...


Release Qualidade: O que a Qualidade deve fazer para validar a alterao, viso SQA. Passo-apasso para comprovar que a no-conformidade foi corrigida.
Desenvolvimento Emisso : 18/05/11

Verso 1.4

Fontes envolvidos na alterao: Relao de fontes alterados na FNC Implementao Contnua: Verificao que deve ser realizada para cada programa que foi alterado na FNC. - Identao com 4 parmetros por linha na chamada de funo; - Padronizao na nomenclatura do fonte, utilizao dos comandos .AND., .OR., .T., .F., variveis de loop, DbSelectArea, DbSetOrder; - Troca do comando Enddo por End; - Troca de != por <>; - Comentrio das variveis; - Troca de GetMV por SuperGetMV atravs de uma varivel local; - Troca de TamSX3() atravs de uma varivel local; - Comentar as strings que esto no arquivo *.ch; - Atualizao do comentrio da funo (parmetros); - Nome de campos e variveis de memria em maisculo; - Acerto na identao do fonte; - Declarao de uma varivel por linha; - Identao com 4 elementos por linha no preenchimento do array; - Tirar OemToAnsi; - Substituir FiveWin.ch por Protheus.ch; - Utilizao do comando REPLACE <Campo> WITH <Contedo>; - Troca do comando IIf por If/Else/Endif - Se for possvel no utilizar uma nica linha de comando; - Criao de cabealho para as funes; - Chamada do comando MemoWrite para query; - Componentizao das funes. Fechamento da FNC (texto visualizado pelos analistas e clientes) Anlise Inteligncia Protheus: O que foi corrigido no processo ou seja no sistema, viso sistmica (idem ao Release Suporte) Release Qualidade: O que a Qualidade deve fazer para validar a alterao, viso SQA (idem ao Release Qualidade do VSS) Fontes envolvidos na alterao: Relao de fontes alterados na FNC Source Safe: Qualquer alterao deve ser reproduzida a partir da verso alterada e replicada para a verso posterior, ou seja, se houve uma alterao na verso 8.11 ela tem que ser feita tambm na verso 10.

Notao das funes e dos fontes 1) Nome de programa: 3 caracteres do nome do mdulo + A, C, R (Atualizao, Consulta, Relatrio) + nmero do programa Exemplo: LOJC040

2) Nome de funo: 2 caracteres do nome do mdulo + nmero do programa + nome() Tamanho mximo: 10 caracteres.
Desenvolvimento Emisso : 18/05/11

Verso 1.4

Exemplo: No programa LOJC040 Errado: Static Function AfterCols(aCols) Correto: Static Function Lj040After(aCols)

3) Nome de variveis: Usar nomes de variveis que no sejam compostos de somente 1 caracter de vogal ou consante: k, n, x, y, i Motivos: 1) Existem diversas variveis privates que foram convertidas para local no P10 R2. Isso vai facilitar o trabalho na frente. 2) difcil de entender o cdigo. 3) uma programao pobre. Exemplo: Ao invs de: Local n := len(aCols) Usar: Local nLenAcols := Len(aCols)

Campos novos Quando criarem campos novos (em qualquer tabela), alm de fazerem o programa de update (para gerao automtica do campo na base de dados do cliente), vocs 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 informaes no Norton Guide. Nomenclatura de update: UPD + 3 caracteres do mdulo + sequncia numrica Ex: UPDCRD01.prw

Sempre validar um campo novo usando o comando FieldPos(). Ex: If SF1->(FieldPos("F1_NUMMOV")) > 0

Desenvolvimento

Emisso : 18/05/11

Verso 1.4

Endif

Exemplos: 1) // // Atualiza dados do cabecalho do produto principal // RecLock("SUG",IIf(nOpc <> 3, .F., .T.)) For nI := 1 TO SUG->(FCount()) If (FieldName(nI) == "UG_FILIAL") FieldPut(nI, xFilial("SUG")) Else FieldPut(nI, M->&(FieldName(nI))) EndIf Next nI MsUnLock() FkCommit() 2) For nX := 1 TO Len(aHeader) If (aHeader[nX][10] <> "V" .AND. aHeader[nX][08] <> "M") aCols[Len(aCols)][nX] := FieldGet(FieldPos(aHeader[nX][2])) Else aCols[Len(aCols)][nX] := CriaVar(aHeader[nX][2],.T.) Endif aCols[Len(aCols)][nUsado+1] := .F. Next nX Motivos: 1) Os clientes no so obrigados a rodar os updates. A criao dos campos ocorre de maneira obrigatria somente na instalao de uma verso nova (Ex: Protheus 10). 2) Ns temos as verses de Release dentro de uma verso. Ex: Verso 8.11 R1, R2, R3 e R4 o cliente pode migrar de uma para outra atualizando a base de dados e/ou somente o RPO.

Programao: Como proteger o fonte em algoritmos com ARRAY Importante: necessrio sempre validar o array antes de usar a posio do mesmo Trecho de fonte com erro: //Gera os arrays antes do recalculo dos valores For nX := 1 to Len(aLojas)

Desenvolvimento

Emisso : 18/05/11

Verso 1.4

//Posiciona o orcamento no original SL1->(DbSeek(aLojas[nX][1]+aLojas[nX][2])) //Gera os arrays (aSL1, aSL2 e aSL4) com os dados de cada orcamento aArquivos := Lj7GeraOrc( aLojas[nX][5] ) AAdd( aArqAux, { aClone(aLojas[nX]), 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, { aClone(aLojas[nX]), aArquivos } ) Endif Endif Endif Next nX

Criao de novos STRs nos arquivos .CH: Quando o fonte for atualizado em uma verso de Release (Ex: Protheus 10 - R1), o procedimento correto : 1) Atualizar o fonte e o arquivo CH sempre juntos. 2) Atualizar o arquivo CH no ATUSX que estiver relacionado a verso do Release. Exemplo: Protheus 8.11 Release 4 = ATUSX P8 R4 Protheus 10 = ATUSX P10-R1. 3) Como incluir o CH no ATUSX: Atualizar o cabealho do programa no ATUSX. Incluir / Alterar os textos (strings) que sero traduzidos. Confirmar e em seguida, gerar o CH atualizado na mquina.

4) A ordem dos fatores:


Desenvolvimento Emisso : 18/05/11

Verso 1.4

1) Primeiro atualizar o arquivo CH no ATUSX. 2) Depois subir o fonte no SOURCE-SAFE (check-in no SSIM). Motivo: Evitar erros de compilao por causa de falta de strings. Erro crtico! A string deve ser colocada no arquivo CH correspondente para que seja traduzido para todos os idiomas, independente se a funcionalidade ser executada inicialmente em um pas. O idioma desvinculado do pas, ex: podemos usar o sistema em espanhol para a localizao Brasil.

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] := .F. 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. Endif Next nColuna

Nomenclatura de Parmetros

Desenvolvimento

Emisso : 18/05/11

Verso 1.4

Para diferenciar os parmetros criados por mdulo, deve-se sempre nome-los iniciando com as letras que identificam o mdulo: Exemplos: Mdulo Parmetro SIGALOJA MV_LJFINPRO SIGATEC MV_ATDIAS SIGATMK MV_TMKKIT Para projetos do padro, no utilizar MV_FSxxxxx.

Criao de Ponto de Entrada A criao de novos Pontos de Entrada (PE) dever seguir a seguinte notao: Iniciais do mdulo + Rotina + processo (gravao, validao etc.) Ex: AT450GRV (Md. AT: Assistncia Tcnica, cdigo da rotina: 450, GRV: gravao) If ExistBlock(AT450GRV) xRet := ExecBlock(AT450GRV, .F., .F., {cParam1, nParam2}) Endif If ValType(xRet) == L lRet := xRet Endif O retorno de um PE sempre deve ser atribudo a uma varivel no-tipificada (xRet), porque no sabemos que tipo de dado ser retornado. Para tratar um retorno especfico (ex: lgico), utilizar o comando ValType().

Premissas para atualizar fontes no padro 1. Estar cadastrado na ferramenta SSIM (solicitar acesso ao lder) 2. Conhecer a metodologia de manuteno de SW (PQ-2029), disponvel na Intranet.

Projetos FSW Criao de arquivos com a nomenclatura do padro, no utilizar P?? (especfico FSW). Para obter novos alias abrir chamado junto a Engenharia de SW de acordo com o procedimento abaixo: 1. No Call Center abra um chamado contendo as seguintes informaes: Cliente: 99401 - TOTVS Contato: Usurio requisitante para acompanhamento do chamado Produto: PZRESERVAS
Desenvolvimento Emisso : 18/05/11

Verso 1.4

Rotina: PZRESERVAS Origem: ORI001 Cliente em produo Categoria: CAT032 - Solicitao de servios internos 2. Descrever no campo incidente: Solicitao de reserva de tabela "XYZ" Clula requisitante: XXXXXXXX Inovao Padro. Mdulo: SIGAXXXX Finalidade: <Projeto> - <Nome lgico da tabela>. 3. Transferir seu chamado para rea N1-ENGPMPA, equipe "I8". Funes na Venda Assistida iniciar por Lj7xxxx Funes genricas que sero utilizadas por mais de uma funo, criar nos programas LOJXFUN?.

Desenvolvimento

Emisso : 18/05/11

Verso 1.4

Documentaes

Esse um documento tcnico e especfico para rea de Inteligncia Protheus (IP) da TOTVS S/A.

Esta mensagem contm informao confidencial e/ou privilegiada. Se voc no for o destinatrio ou a pessoa autorizada a receber esta mensagem, no pode usar, copiar ou divulgar as informaes nela contidas ou tomar qualquer ao baseada nessas informaes.

Desenvolvimento

Emisso : 18/05/11