Sei sulla pagina 1di 41

Desenvolvimento

Tcnicas e Procedimentos



Microsiga Software S/A Pgina 1 de 41



NDICE ANALTICO
Prefcio .................................................................................................................. 4

O Que Fazer um Programa com Inteligncia ........................................................ 4
Programando Simples, mas Certo .......................................................................... 5
Erros que Podem ser Evitados ............................................................................... 5
A Importncia de Programas Documentados .......................................................... 6
Cabealho de Programa / Funo .......................................................................... 7
Criao de Variveis ................................................................................................. 8
A Declarao ....................................................................................................... 8
O Tipo de Varivel ................................................................................................ 8
Tipos Existentes ................................................................................................... 8
Inicializao ......................................................................................................... 9
Padronizao de Variveis ..................................................................................... 9
Criando uma Varivel Utilizando a Funo CRIAVAR() ............................................ 10
Variveis de Relatrios........................................................................................ 10
Cuidados com Posicionamentos de Registros ............................................................ 12
Funo Posicione ............................................................................................... 13
Funo Existcpo ................................................................................................. 13
Restaurando ndice e limpando filtros .................................................................. 14
Outros cuidados .................................................................................................... 15
Confrontando relatrios e consultas ..................................................................... 15
Problemas com Looping de Programas ................................................................. 16
Manipulao de Arquivos Externos ao Protheus ..................................................... 17
Desenvolvendo Telas .......................................................................................... 18
Salvando Arrays padres .................................................................................... 19
Pontos de Entrada ................................................................................................. 20
Objetivo dos Pontos de Entrada ........................................................................... 20
Quando criar um Ponto de Entrada ...................................................................... 20
Procedimentos para sua criao .......................................................................... 21
Contabilizando ....................................................................................................... 22
A Funo HeadProva .......................................................................................... 22
A funo DetProva() ........................................................................................... 22
A funo RodaProva() ......................................................................................... 23
Atualizando SX (ATUSX) ......................................................................................... 24

Desenvolvimento
Tcnicas e Procedimentos



Microsiga Software S/A Pgina 2 de 41


Exemplo de atualizao no SX: ............................................................................ 24
SX1 - Parmetros Genricos ................................................................................ 24
SX2 - Mapeamento dos arquivos .......................................................................... 25
SX3 - Dicionrio de Dados ................................................................................... 25
SX5 - Tabelas Genricas ..................................................................................... 25
SX6 - Parmetros ............................................................................................... 25
SX7 Gatilhos ................................................................................................... 25
SXE/SXF - Seqncia. de documentos .................................................................. 25
SINDEX- Arquivo de ndices ................................................................................ 25
Controle de Transao (TTS) .................................................................................. 26
O que ............................................................................................................. 26
Quando usar ...................................................................................................... 26
Como usar ......................................................................................................... 26
Onde no usar ................................................................................................... 26
Comandos definidos pelo usurio (UDCs) ................................................................ 28
Uso de Strings ................................................................................................... 29
ndices ................................................................................................................. 30
Criando e Deletando Arquivos de trabalho (Temporrios.) .................................... 30
Utilizando Querys no Protheus ............................................................................. 30
Dicas Importantes - DBF versus SQL .................................................................... 31
Conceito de Filial e Compartilhamento de Arquivos ................................................... 33
Arquivos Compartilhados .................................................................................... 33
Arquivos Exclusivos ............................................................................................ 33
Tcnicas para Filtragem ...................................................................................... 34
Chaves Primrias ................................................................................................ 34
Chaves Estrangeiras ........................................................................................... 34
Integridade Referencial ....................................................................................... 34
Usando Rotinas Automticas ................................................................................... 36
Controle de Semforo ............................................................................................ 37
Atualizao do Source Safe ..................................................................................... 38
Procedimentos para Localizaes..............................................................................39
Programando com Schedule de
Relatrios...............................................................................................................41


Desenvolvimento
Tcnicas e Procedimentos



Microsiga Software S/A Pgina 3 de 41






Existe um ditado chins que diz: O Homem no tropea em montanhas, tropea em
pedregulhos, areia, pequenos buracos, mas nunca em uma montanha.

Isso nos remete a pensar que onde erramos exatamente no simples, naquele detalhe quase
imperceptvel e que tem um valor muito grande para o todo. Avaliemos do ponto de vista
humano; ser to difcil cumprimentar a todos, sermos mais amigos, mais serenos nas decises e
companheiros uns dos outros e trabalharmos em equipe? Por que muitas vezes no o fazemos?
Por que insistimos no individualismo e no mal-humor? No seria mais fcil, at mesmo bvio,
estarmos mais bem-humorados e dispostos a trabalhar em equipe, trocarmos conhecimento e
discernimento nas decises, pensarmos mais no todo porm se importando com as partes que o
compe?

Seria mais interessante se ao caminharmos por um parque, prestssemos mais ateno nas
rvores, no caminho, nas flores, no canto dos passarinhos sem se esquecer do objetivo do
passeio, sem perder a noo de tempo e distncia, mas curtindo muito a paisagem, o detalhe.

Agora vamos traar um paralelo com o nosso dia a dia. No seria melhor ao reservarmos um
fonte, verificarmos com mais ateno:
As condicionais? Afinal muitas vezes no testamos um ELSE.
Os filtros? Geralmente esquecemos de tentar otimizar a performance no SQL.
As mensagens? Afinal to comum nos depararmos com textos completamente sem sentido.
Os helps? Damos pouca ateno a eles e nos esquecemos que a primeira coisa que o usurio
tenta.

Imaginem algumas ligaes menos por causa de uma simples documentao a mais! Aquele
ponto de entrada que criamos e no pensamos nos supostos parmetros que nosso pessoal em
campo pode querer, ou mesmo no retorno mais adequado para aquela funo.

Lembrem-se tambm da documentao do novo campo; Ela realmente necessria? Se a chave
de ndice imprescindvel, por que no crio uma query? Ao responder um BOPS, no seria
melhor que fosse sua ltima argumentao para o problema? Se isto ficar claro e bem resolvido
no teremos mais aquela ocorrncia ou dvida. Se tivermos que explicar um processo para
algum, que o faamos de tal forma a no gerarmos incgnitas.

Por que ao invs de focarmos nossos esforos para matarmos o BOPS, no avaliamos o fonte
para evitarmos NOVOS BOPS? Ao resolver uma ocorrncia lembre-se de todos os pontos de
implicao da sua atividade. O que isso ir impactar no servio do outro? Sem falar em
documentar no Quark!

Vamos trazer o comportamento do parque para o nosso trabalho tambm. Ao programar vamos
nos ater aos detalhes, sermos mais crticos, pensarmos que aquela instruo a mais, significa
muito para o sistema e que l na frente, se tratado com descuido, pode causar problemas.

Desenvolvimento
Tcnicas e Procedimentos



Microsiga Software S/A Pgina 4 de 41



Tenha convico que, se agirmos de maneira mais focada aos nossos propsitos, o passeio ou
melhor a programao, ser muito mais entusiasmada, produtiva e com uma margem de erro
bem menor. Com esse comportamento quem ganha somos ns; Microsiga!. S assim teremos
mais tempo de irmos ao parque no final de semana.

Lembre-se que no adianta decidirmos passear no parque do Ibirapuera no domingo, e no
estarmos com a cabea voltada para o passeio, ao invs disso pensarmos no trabalho, na DLLl
que no comunica, no BOPS que no foi baixado, pois se assim for, estaremos to voltados para
outros fins que no curtiremos o passeio. Pense que para passear, ou melhor, programar, a regra
tambm valida, no adianta nem ao menos tentarmos se no estivermos concentrados para
isso.

Enfim, quer uma prova de trabalho em equipe com um alto nvel de qualidade e detalhes; este
manual, que foi constitudo em apenas 2 dias, com a colaborao de mais de 20 pessoas,
focadas em seus objetivos, se atentando cada um com o seu tema. O resultado? Um trabalho
excelente, um documento para nos ajudar a sermos melhores e no errarmos no fcil!
O Que Fazer um Programa com Inteligncia
Precisamos entender, antes de mais nada, o que inteligncia.

Segundo o dicionrio Michaelis, inteligncia significa:
faculdade de entender, pensar, raciocinar e interpretar;
Compreenso, conhecimento profundo.

De acordo com essa definio, se pretendemos utilizar nosso bem mais precioso em nosso
trabalho, vamos precisar desenvolver alguns hbitos:

Devemos estudar o programa antes de comear a desenvolver. Imagine prestar um concurso ou
fazer uma prova sem estudar. Vai ganhar um zero na certa! No programa no ser diferente!

Fazer um levantamento dos programas que sofrero as conseqncias das alteraes realizadas.
Todos esses programas devero ser testados juntamente com o programa alterado.

Antes de criar uma funo, consulte o Help Microsiga ou os colegas de trabalho, pois esta funo
j pode ter sido criada.

Ao criar uma funo, certifique-se de que no cabealho conste algumas informaes bsicas
como: descrio da funo, sintaxe, definio dos parmetros e autor. comum ao desenvolver
uma funo, utilizarmos outra j pronta como exemplo, e neste momento o copiar/colar nos faz
esquecer de alterar estas informaes.

Imagine se algum desenvolver uma funo inconsistente e esquecer de trocar o seu nome no
cabealho. Devemos assumir a responsabilidade de nossos atos.


Desenvolvimento
Tcnicas e Procedimentos



Microsiga Software S/A Pgina 5 de 41


Ao fazer a documentao das alteraes realizadas, certifique-se de que as informaes esto
claras, no s para o seu entendimento mas para que os colegas no percam tempo tentando
entender-las.

Ao realizar os testes, defina critrios. Antes de comear defina onde quer chegar. No basta
consistir suas alteraes. O fato de suas alteraes estarem funcionando como previstas no
garante a no existncia de erros.

No limite-se a testar sua alterao na base que voc utilizou durante o desenvolvimento, pois
voc criou o ambiente perfeito para que o programa funcione.

Pode parecer um pouco trabalhoso passar por estes processos no decorrer do desenvolvimento
do sistema, mas se medidas como estas no forem tomadas, o que era extremamente simples se
tornar extremamente trabalhoso.
Programando Simples, mas Certo
Qual profissional da rea de informtica ainda no se deparou com um cdigo fonte que parecia
estar escrito em outro dialeto mesmo com todo conhecimento adquirido naquela linguagem, este
fato geralmente ocorre pela m utilizao de sintaxes complexas que nem sempre significam um
bom funcionamento do sistema.

Um profissional da rea de informtica no possui nenhum modelo padro para desenvolver os
seus algoritmos, porm necessria a aplicao da tica profissional para que se possa
desenvolver algoritmos de maneira simples e correta, este conceito se baseia nos seguintes
aspectos :

Entender qual o objetivo do processo em questo
Analisar a melhor forma de desenvolver um algoritmo que seja de fcil manuteno.
Utilizar comandos e sintaxes que utilizem o mximo de simplicidade e clareza possvel.
Erros que Podem ser Evitados
Existem alguns erros que com um pouco de ateno, podem ser evitados, tais como:
Verifique se a varivel est declarada antes do uso;
Ao declarar uma varivel, verifique qual a necessidade de ter essa varivel e qual o tipo e a sua
classe;
Classifiquem as funes e os procedimentos conforme a necessidade, como por exemplo, na
declarao de um array, defina o seu tamanho e no uso verifique se o elemento existe;
Salve a ordem e a rea e o registro do arquivo que ser utilizadopara que no final do processo se
recupere estes valores;
Evite retornar da funo antes do seu final, ou seja, crie preferencialmente um nico retorno;
Valide sempre o retorno do ponto de entrada;
Quando for gravar um arquivo que utiliza campos de outros arquivos, posicione todos os arquivos
e registros antes de iniciar a gravao, e descreva o alias do campo;

Desenvolvimento
Tcnicas e Procedimentos



Microsiga Software S/A Pgina 6 de 41


Utilize de arquivo CH nas strings para localizao;
Quando possvel utilize a linguagem SQL, pois minimiza o tempo de execuo em muitos
processos.
A Importncia de Programas Documentados
Todos sabemos o quanto difcil elaborar e manter uma documentao tcnica atualizada, ainda
mais aqui na Microsiga, cuja dinmica dos acontecimentos muitas vezes impede que isso seja
viabilizado. Diante desse cenrio, o que nos resta? Obviamente que pelo menos os programas
sejam documentados, bem documentados.

Documentar bem, no significa que tenhamos que escrever dezenas de linhas de comentrios a
cada linha de cdigo. Significa que os comentrios tm passar alguma informao relevante.
Vemos comentrios assim: compara A com B e s. Isso bvio, a leitura do cdigo j nos diz
isso. A documentao deve se ater a conceitos, por exemplo: Se A for maior que B, o arquivo de
saldos ser atualizado, caso contrrio o registro ser rejeitado para que o saldo no fique
negativo.. Isto sim transmite alguma informao.

Tambm se pode utilizar desse recurso para fazer lembretes a fatos importantes que, se forem
deixados de lado, podem comprometer o funcionamento das rotinas.

Por exemplo: Ao acionar esta funo, o arquivo XXX DEVE estar posicionado no ndice 1.

E os cabealhos? Quantos programas so aproveitados e nem sequer o nome do autor
trocado? Se o analista X tivesse escrito todos programas que aparece como autor ele deveria ter
comeado na poca do Charles Babage. O cabealho das funes de conter o nome na dita cuja,
autor, data de criao, uma descrio sumria de sua funcionalidade, a sintaxe e por ltimo, mas
no menos importante, a descrio dos argumentos de entrada e sada. A respeito desse ltimo
item deve-se ter especial ateno nas manutenes, pois novos argumentos so criados e nem
sempre so declarados nessa seo da documentao do cabealho, isso muito grave.

No IDE do PROTHEUS existem opes bastante interessantes para nos auxiliar nessa tarefa.
Experimente as opes Inserir, Documentao de cabealho e Inserir, Documentao de
Explicao.

Existe ainda um tipo de documentao que nem sempre observada, aquela inerente ao
prprio cdigo. Programas cujas variveis so declaradas como nX, cVAR1, dAUX, nNUM, etc.,
so extremamente difceis de entender e pior, manter. conveniente que os nomes das variveis
retratem seu uso ou destino. Por exemplo: dDataDeS ou dDataDeE. Segundo as convenes da
Microsiga, variveis do tipo DATA devem ser iniciadas pela letra d. Assim Data, no
acrescenta nada ao entendimento do que a varivel representa. Nos sobrou o dES e o dEE
para informar para que diados serve a bendita varivel. Ser sada, soluo, saldo? Entrada,
Estorno, Estoque? Que tal isso: dSeguro e dEntrega?


Desenvolvimento
Tcnicas e Procedimentos



Microsiga Software S/A Pgina 7 de 41


Enfim, como foi dito, no preciso escrever um livro a cada programa, basta ser objetivo e se
colocar na posio de quem no conhece o programa to pouco o assunto. Algum dia voc
mesmo poder estar nessa posio.
Cabealho de Programa / Funo
O cabealho do programa utilizado para identificar informaes gerais sobre a rotina, seu autor,
data, entre outras informaes. importante que esteja preenchida de forma correta e
atualizada. Lembre-se de que nada adianta um cabealho que no informe nada ou pior ainda,
com informaes errneas.

Lembre-se que um bom livro comea com um bom prefcio, e um bom programa comea com
um cabealho til e legvel.

A manuteno/atualizao do cabealho de responsabilidade da ltima pessoa que alterou o
fonte. O cabealho de programa padro da Microsiga contm: rotina, autor, data do
desenvolvimento, comentrio sinttico e sintaxe.

Desenvolvimento
Tcnicas e Procedimentos



Microsiga Software S/A Pgina 8 de 41


CRIAO DE VARIVEIS
Na criao de uma varivel deve-se ter em mente alguns pontos fundamentais:

A declarao
O tipo de varivel
A funo CRIAVAR()
A inicializao
Padronizao de variveis
A Declarao
Deve ser feita sempre no incio da rotina que for utiliz-la, como no exemplo:

Function a910VerCod()

Local cCod910 := 001

Return
O Tipo de Varivel
O tipo de varivel serve para identificar a utilizao que a mesma ter no decorrer da rotina.
Toda varivel deve estar tipada durante sua criao. Quando programamos nativamente em C,
isto se torna obrigatrio. Devemos fazer o mesmo no AP5, pois isto demonstra que a varivel foi
conscientemente declarada.
Tipos Existentes
PUBLIC: Esta varivel ser inicializada em um valor lgico falso (.F.) at que seja atribudo um
valor especfico a ela. Esta varivel permanece definida por toda a durao da aplicao e pode
ser vista (assim como usada, alterada e avaliada) por qualquer funo. Esta varivel gera um
token (indicao) na tabela de smbolos, isto significa que o mdulo principal conter smbolos
para esta classe de varivel, o que, por sua vez, ocupa mais espao de memria. Deve-se evitar
a utilizao deste tipo, a no ser em casos extremos.

PRIVATE: Esta varivel ser inicializada em valor nulo (NIL) e uma vez declarada, permanecer
assim durante toda a durao do fluxo da funo, at que este volte ao procedimento inicial que
a chamou. Em essncia, uma varivel de memria PRIVATE inicializada logo no incio do
Protheus, agir como um varivel PUBLIC. Esta varivel pode ser vista por uma sub-rotina da
funo e modificada de maneira correspondente. Esta varivel tambm gera um token na tabela
de smbolos comentada acima.

Desenvolvimento
Tcnicas e Procedimentos



Microsiga Software S/A Pgina 9 de 41



LOCAL: Esta varivel de memria ser inicializada com valor nulo (NIL) e s visvel dentro da
funo que a inicializa, mesmo que esta ltima, contenha funes incorporadas a seu contedo.
Este tipo de varivel o mais adequado a ser utilizado em funes, pois no gera smbolos na
tabela de smbolos, por conseqncia ocupa pouco espao de memria e, o compilador avalia as
variveis LOCAL e STATIC mais rapidamente que os outros tipos (PUBLIC e PRIVATE). Cuidado
para no sucumbir teoria de que se pode obter economia de memria, mudando qualquer
referncia PRIVATE para uma referncia LOCAL. Se voc fizer isso, as funes podem no
funcionar corretamente, embora funcionassem na verso anterior s alteraes.

STATIC: A varivel STATIC idntica classe de armazenamento LOCAL, com uma exceo.
Uma varivel STATIC retida dentro de sua sub-rotina, mesmo depois que o fluxo da funo a
tenha deixado. Isto particularmente til para funes independentes tipo caixa-preta, que
contm seu prprio conjunto de variveis exclusivas e devem manter esses valores de interao
em interao.
Inicializao
Quando no atribumos nenhum valor a uma varivel no momento de sua declarao, corremos o
risco de utiliz-la com valor NIL e causar erros fatais. Por isso, a inicializao de uma varivel
de extrema importncia.
Padronizao de Variveis
importante que ao lermos o nome de uma varivel, possamos saber se o seu tipo numrico,
caracter, data ou lgico. O nome da varivel de get no deve coincidir com uma varivel de outro
programa, pois toda varivel de get possui um help especfico.

Exemplo:
a varivel DBaixa (get da baixa no programa de Ttulos a Receber), j possui um texto help que
indica seu conteudo e no dever ser criada outra varivel para outra finalidade com este mesmo
nome.

Para tanto, definimos a seguinte padronizao :

N Numricas
L Lgicas
D Data
C Caracter
A Array (matriz)
O Objeto
U Sem definio

Desenvolvimento
Tcnicas e Procedimentos



Microsiga Software S/A Pgina 10 de 41


Criando uma Varivel Utilizando a Funo CRIAVAR()
Esta funo cria uma varivel, retornando o valor do campo, de acordo com o dicionrio de
dados. Avalia o inicializador padro e retorna o contedo de acordo com o tipo de dado definido
no dicionrio.

Sintaxe

uRet := CriaVar(cCampo,lIniPad,cLado)

Onde :

Uret tipo de retorno de acordo com o dicionrio de dados, considerando inicializador
padro.
cCampo Nome do campo
LiniPad Indica se considera (.T.) ou no (.F.) o inicializador padrao (X3_RELACAO)
Clado Lado para inicializao padro
Variveis de Relatrios
Na criao de um relatrio algumas variveis e seus tipos so convencionados para a utilizao
da biblioteca de funes de relatrio.

Varivel Tipo Contedo
Wnrel Local Nome default do relatrio em disco
CbCont Local Contador
Cabec1 Local 1 linha do cabealho do relatrio
Cabec2 Local 2 linha do cabealho do relatrio
Cabec3 Local 3 linha do cabealho do relatrio
Tamanho Local Tamanho do Relatrio (P = Pequeno 80 Colunas, M= Mdio 132 colunas),
G = (Grande 220 colunas)
Limite Local Quantidade de colunas no relatrio (80, 132, 220).
Titulo Local Titulo do Relatrio
CDesc1 Local 1 linha da descrio do relatrio
CDesc2 Local 2 linha da descrio do relatrio
CDesc3 Local 3 linha da descrio do relatrio
aReturn Private Array com as informaes para a tela de configurao da impresso
Nomeprog Private Nome do programa do relatrio
CString Private Alias do arquivo principal do relatrio para o uso de filtro
Li Private Controle das linhas de impresso. Seu valor inicial a quantidade mxima
de linhas por pgina utilizada no relatrio.
M_Pag Private Controle do nmero de pginas do relatrio.
Aord Private Array contendo as ordens de layout para a impresso. Caso no existam
vrias ordens este array deve estar vazio. Ex.: aOrd:= {Cdigo, Descrio,
Telefone} -> O layout do relatrio vai depender da ordem selecionada na

Desenvolvimento
Tcnicas e Procedimentos



Microsiga Software S/A Pgina 11 de 41


tela de configurao de impresso.
nLastKey Private Utilizado para controlar o cancelamento da impresso do relatrio.
Cperg Private Nome da pergunte a ser exibida para o usurio.
Alinha Private Array que contem informaes para a impresso de relatrios cadastrais

Desenvolvimento
Tcnicas e Procedimentos



Microsiga Software S/A Pgina 12 de 41


CUIDADOS COM POSICIONAMENTOS DE REGISTROS
O posicionamento correto de registros fundamental para a funcionalidade completa dos
programas. Algumas dicas para posicionamento de registros so :

Evitar DBGOTOP(), usar DBSEEK(XFILIAL()) para os arquivos de dados do sistema. O comando
DBGOTOP() somente ser utilizado quando da real necessidade de se efetuar uma leitura desde
o incio do arquivo independente do tratamento de filial.

Como no mesmo arquivo de dados, poderemos ter registros de vrias filiais, desta forma ficar
garantido o posicionamento no primeiro registro da filial corrente.

Ao executar um DBSEEK(), verificar se localizou o registro, exemplo:

If ! SB1->(dbSeek(xFilial("SB1")))
// No achei o registro
Endif

Mesmo que seja bvio a existncia do registro, faa o teste pois o programa deve prever que a
base de dados no to confivel como deveria, e um alerta ajuda a identificar estes casos. Em
casos de relatrios, atentar-se para imprimir a mensagem de forma consciente.

Se for executada a funo RECLOCK(cAlias, .F.), para alterao do registro atual, em um arquivo
no estado de EOF() (caso falhe um DBSEEK() ) ser abortado o programa e gravado um arquivo
texto de nome MSRLOCK.EOF que poder ser usado para averiguaes.

O comando SOFTSEEK determina se ser usada uma busca relativa durante um procura em um
banco de dados. Se este comando estiver em ON, e for utilizada uma funo DBSEEK(), e
nenhuma correspondncia for encontrada, o ponteiro de registro ficar no prximo registro do
ndice que possua um valor mais alto que a expresso utilizada nesta funo. Este comando
dever ser utilizado com a mxima ateno, pois caso esteja ligado, poder localizar um registro
errado.

Quanto ao comando DO WHILE no esquecer de incluir a condio referente filial, quando esta
leitura for de registros de uma filial). Exemplo :

dbSelectArea("SB1")
dbSeek(xFilial("SB1"))

Do While ! Eof() .And. B1_FILIAL == xFilial("SB1")
// Processamento
dbSkip()
Enddo


Desenvolvimento
Tcnicas e Procedimentos



Microsiga Software S/A Pgina 13 de 41


Ao criar uma funo que ir desposicionar registros, use a funo GETAREA() e RESTAREA(),
para voltar tudo posio original. Exemplo:

Dbselectarea("SD1")
aAreasd1 := Getarea() // Armazena o ambiente do arquivo SD1

SD1->(dbsetorder(3))

SD1->(dbseek(xfilial("SD1") + DTOS("01/03/01"), .T.))
Do While ! Eof() .And. D1_FILIAL == xfilial("SD1") .And. DTOS(D1_EMISSAO) <=
DTOS(mv_par02)
// Processamento
Dbskip()
Enddo

Restarea(aAreasd1) // Restaura o ambiente do arquivo SD1
Funo Posicione
Podemos tambm buscar uma informao em determinado campo usando apenas uma funo.

Sintaxe:

Posicione(cAlias, nOrdem, cChave, cCampo)

Exemplo:

Posicione("SB1", 1, xFilial("SB1") + cCodigo, "B1_DESC")

Desta forma, ser efetuada uma busca no SB1, na ordem 1, chave da busca xFilial("SB1") +
cCodigo e ser retornado o contedo do campo "B1_DESC". Note que esta funo, no restaura
a posio original do arquivo alvo (no caso SB1).

necessrio colocar a FILIAL do arquivo na chave passada como parmetro, caso ela exista na
chave do indice.
Funo Existcpo
Retorna se determinada chave existe ou no no arquivo.

Sintaxe :

ExistCpo(cAlias,cChave,nOrdem)

Exemplo :

Desenvolvimento
Tcnicas e Procedimentos



Microsiga Software S/A Pgina 14 de 41



ExistCpo("SB1", 1, cCodigo, "B1_DESC")

Desta forma, ser efetuada uma busca no SB1, na ordem 1, chave cChave. E ser retornado se a
chave foi encontrada ou no (.T. ou ,F,). Neste caso no necessrio passar a filial. Ela ser
inserida automaticamente na chave de pesquisa pela funo.
Restaurando ndice e limpando filtros
Nos relatrios devemos analisar que a funo SetPrint, possibilita efetuar filtros , escolha da
ordem e gerao em disco ou impressora , no final dos programas de relatrio devemos
restaurar a ordem original do arquivos e limpar o filtro e desativar a impressora.

//Trmino do relatorio

dbSelectArea("SRA")
Set Filter to
dbSetOrder(1)

Set Device To Screen

If aReturn[5] = 1
Set Printer To
Commit
ourspool(wnrel)
Endif

MS_FLUSH()

Desenvolvimento
Tcnicas e Procedimentos



Microsiga Software S/A Pgina 15 de 41


OUTROS CUIDADOS
Um dos cuidados que devemos ter quando da criao de relatrios contendo valores a
utilizao dos subtotais e totais, a fim de evitar erros que podem ser desastrosos durante uma
tomada de deciso errada devido a valores errados.

A utilizao de somatrias deve ser bastante criteriosa a fim de no cometermos o erro de
misturarmos unidades de medidas diferentes no mesmo clculo.
Confrontando relatrios e consultas
Quando elaboramos um sistema, existem muitos relatrios que geram dados para outros
relatrios e consultas.

Devemos tomar cuidado para que no aconteam divergncias de informaes de um para o
outro, como por exemplo, no caso de valores.

Um bom exemplo disso, a rotina de impresso de folha de pagamento. Este relatrio exibe
informaes que so utilizadas em outros relatrios, tais como, valores para o FGTS, guia de
recolhimento de impostos.

Uma soluo para que no se ocorra uma divergncia de valores, seria utilizar uma nica funo
ou rotina de processamento. Isto evitaria que ao se alterar o sistema, por motivo de lei ou outro
qualquer, o programador alterasse por exemplo s rotinas de relatrio de folha de pagamento e
guia de impostos e esquecesse de alterar por exemplo rotina de relatrio de FGTS.

Exemplos como Saldos Bancrios, Quantidades de Estoques, Valores de Faturamento, entre
outros, devem ser confrontados entre relatrios e consultas para no gerarem informaes
errneas ao cliente.

Normalmente estes problemas ocorrem em funes de critrios de filtragens diferenciados entre
eles. Para evitar este tipo de problema fundamental que o analista ao efetuar alguma
manuteno em algum relatrio ou consulta atente-se ao fato de assegurar que esta alterao
no influencie outras situaes.

Este um tipo de no conformidade simples de ser evitada e que pode causar problemas srios
para os usurios alm de ser de dificil argumentao quando nos questionado, pois evidencia
falta de ateno ou critrio na manuteo ou falta de conhecimento sobre o funcionamento do
sistema.

Desenvolvimento
Tcnicas e Procedimentos



Microsiga Software S/A Pgina 16 de 41


Problemas com Looping de Programas
O Protheus utiliza a tecnologia Cliente/Servidor. Isto significa que o aplicativo no mais
executado individualmente em cada mquina, ele ser executado no servidor do aplicativo. At a
verso 4.07 um programa travado significava que apenas a estao estava comprometida (o
executvel estava na memria da estao). Com o Protheus, todo o processamento est no
Server e quando o programa est em looping estaremos gradativamente usando todo a CPU do
Server e consequentemente parando todo o processamento.

Se ao desenvolvermos uma rotina e a mesma entrar em looping (tiver apenas uma entrada e no
tiver uma sada do processamento), este processamento utilizar todos os recursos do servidor
comprometendo (reduzindo drasticamente a performance do aplicativo), ou at impedindo, o uso
do aplicativo por todos os demais usurios.

Se isso acontecer em uma empresa onde existem apenas 5 usurios, o administrador da rede
poder reiniciar o servidor, porm onde existe um nmero considervel de usurios poder haver
um prejuzo para a empresa que utiliza nosso sistema.

Exemplo:

dbSeek(xFilial(SE1)+DTOS(dDtIni))

Do While SE1->(!Eof())


---------- Falta um DbSkip()
Enddo

No exemplo acima, a rotina ficar em looping (pois falta um comando de sada da rotina, um
DbSkip() seria o mais apropriado), utilizando todos os recursos de processamento do servidor,
fazendo com que o mesmo pare de funcionar.

Outro exemplo:

aCampos := {}

Do while .T.

Aadd(aCampos, Teste)

Enddo

No exemplo acima o caso ainda mais crtico, pois alm utilizar todo o recurso de
processamento do servidor, em dado momento haver uma queda do aplicativo, devido a
limitao da varivel tipo Array, criada acima. E quando este limite for ultrapassado, o

Desenvolvimento
Tcnicas e Procedimentos



Microsiga Software S/A Pgina 17 de 41


sistema ser interrompido abruptamente e todos os demais usurios ficaro
impossibilitados de utilizarem o sistema.
Manipulao de Arquivos Externos ao Protheus
A manipulao de arquivos considerados externos ao Protheus dever ter um tratamento
diferenciado. O arquivos a serem manipulados (alterados/consultados) devero ser copiados do
Client para o Server e vice-versa utilizando uma conexo (TPC-IP,IPX,etc). Para copiar os
arquivos, foram criadas duas funes que sero executadas via conexo, a CPYS2T()
encarregada de copiar do Server para o Client/Terminal e a CPYT2S() encarregada de copiar do
Client/Terminal para o Server.

O editor de texto Word da Microsoft, os arquivos de imagens (BMP,JPEG,etc) exigem um lugar
fsico para abertura dos documentos/imagens, navegando pela Internet por exemplo so
copiados via conexo para um diretrio temporrio no computador para serem visualizados.

O AP5 trabalha da mesma forma, atravs dessas consideraes e utilizando a arquitetura
Client/Server via conexo os arquivos sero copiados.

Em alguns Mdulos do Protheus so encontradas rotinas de Importao/Exportao de
lanamentos, exigindo serem utilizadas as funes CPYT2S() e CPYS2T() para manipulao dos
arquivos. Por exemplo, uma importao de lanamentos da Folha de Pagamento poder ser feita
diretamente do Client sem precisar copiar para o Server mas se outro usurio precisar visualizar
os lanamentos de origem da importao no ter acesso, agora se for realizado a cpia do
Client para o Server todos podero visualizar (aconselhvel). Isso acontece no Mdulo de
Controle de Documentos, quando todos os arquivos (documentos) so copiados entre o Client e
o Server para que todos visualizem e manipulem. Um exemplo que no h necessidade de cpia
so os arquivos gerados para contabilizao (CPROVA), pois estes so gerados no prprio Server
no havendo necessidade de cpia.

Os arquivos que podero ser copiados devero estar necessariamente embaixo do RootPath na
configurao do Server, isto , o diretrio DOCS do exemplo abaixo dever ser sub-diretrio do
RootPath.

Exemplo de cpia do Server para o Client:

CPYS2T("\DOCS\EXEMPLO.DOC,"C:\WINDOWS\TEMP",.T.)
Onde os parmetros so:
1o. o <Nome do Arquivo> a ser copiado para o Client
2o. o <Nome do Diretrio> do Client e/ou local fsico onde ser copiado o arquivo.
3o. se deseja compactar o arquivo (recomendvel)

Exemplo de cpia do Client para o Server:

CPYT2S("C:\WINDOWS\TEMP\EXEMPLO.DOC,"\DOCS",.T.)


Desenvolvimento
Tcnicas e Procedimentos



Microsiga Software S/A Pgina 18 de 41


Onde os parmetros so:
1o. o <Nome do Arquivo> a ser copiado para o Server
2o. o <Nome do Diretrio> do Server
3o. se deseja compactar o arquivo (recomendvel)

As funes possuem um retorno True(.T.) ou False(.F.) indicando se a cpia foi realizada com
sucesso ou no.
Desenvolvendo Telas
A aparncia e objetividade das telas num sistema base fundamental da interface Sistema x
Usurio.

O AP5 j cria, automaticamente, a grande parte das telas de um mdulo, tais como a Browse, a
GetDados e Enchoice.

Algumas outras telas necessitam de construo manual, ou seja, com a utilizao de comandos,
tais como SAY , GET e LABEL, na Dialog.

Procure sempre colocar em tela as informaes que mais se objetivam com o assunto abordado.

Sempre que possvel, d preferncia aos campos obrigatrios primeiro. Isso facilita a digitao do
usurio, que no precisar passar de campo em campo (no caso de estar utilizando a tecla
<TAB>) at chegar ao campo desejado. A ordem dos campos tambm importante para a fcil
localizao das informaes.

Quando o volume de informaes muito grande, divida os campos em folders, ou seja, pastas,
agrupando os campos em assuntos. Isso ir deixar a tela menos poluda e evitar que o usurio
navegue por uma tela s. Para fazer essa facilidade, preencha o campo X3_FOLDER, no SX3,
com um nmero, agrupando-os de acordo com a tipo de informao e no SXA, com o ALIAS do
arquivo em pauta, a ordem, que equivale ao numero informado no X3_FOLDER e a descrio nos
trs idiomas. Essa descrio que ser a informao contida na pasta do folder. Exemplo: Os
campos SZ1_ENDER, SZ1_NUM e SZ1_BAIRRO devem estar com o campo X3_FOLDER
preenchido com o contedo 1. No SXA, o XA_ALIAS dever ser SZ1, o XA_ORDEM = 1
(mesmo valor preenchido no X3_FOLDER), no XA_DESCRIC, Endereo Residencial e, nos
demais, o mesmo texto em outros idiomas.

O Folder, alm de agrupar e facilitar a procura pelos campos, evita a rolagem vertical da tela,
facilitando a visualizao das informaes.

Evite tela com muitos botes. Isso poder confundir o usurio e induzi-lo ao erro. Utilize telas
sequenciais, conhecidas como Wizard (semelhante aos de instalao de um software). Dessa
forma, o usurio ficar mais atento aos fatos, dificultando o erro. Mas cuidado: no faa disso
uma incansvel sequncia de telas, pois isso acabar desmotivando o usurio a utilizar o sistema.


Desenvolvimento
Tcnicas e Procedimentos



Microsiga Software S/A Pgina 19 de 41


Enfim, as telas devem ser limpas e objetivas, de tal forma que impea o usurio de sair de seu
objetivo final. Todo curioso ir apertar todos os botes da tela ou preencher todos os campos
com qualquer tipo de informao. Portanto, esteja atento a tamanho dos labels, para que os
mesmos no excedam o tamanho da caixa de dilogo definida. Isso, alm de no ser esttico,
prejudica o entendimento da informao.
Salvando Arrays padres
Quando temos Janelas que necessitem apresentar mais de uma getdados, devemos salvar os
elementos, acols, aheader e n, da tela anterior para apresentar uma nova janela.

As principais variveis so:

Acols = Array contendo as linhas usada que sero apresentadas na
Getdados
AHeader = Array contendo o cabeo das colunas da Getdados
N = Varivel publica que indica a posio do atual no acols
(a Linha que est sendo editada na Getdados)

Para salva-las podemos:

aColsAnt := aClone(Acols)
aHeaderAnt := aClone(aHeader)
nElemAnt := n

E para restaura-las:

aCols := aClone(aColsAnt)
aHeader := aClone(aHeaderAnt)
n := nElemAnt

Desenvolvimento
Tcnicas e Procedimentos



Microsiga Software S/A Pgina 20 de 41


PONTOS DE ENTRADA
Dentro dos processos operacionais dos programas possvel criar aberturas que possibilitam a
execuo de processos distintos a partir de uma rotina do sistema.
Objetivo dos Pontos de Entrada
Deixar o sistema flexivl , pois isso permite uma grande variedade de desenvolvimento pelos
nossos analistas de suporte de acordo com a necessidade de cada tipo de cliente/implantao.

Permitir que o sistema seja o mais abrangente possvel de acordo com cada tipo de segmento
de negcio.
Quando criar um Ponto de Entrada
O ponto de entrada tem resultado quando permite que um processo possa ser modificado, desde
que ele no seja crtico para o sistema.

Exemplo: Montagem das parcelas de pagamento de um pedido

Ele til em processos que podem ser diferentes de acordo com o tipo de negcio de cada
empresa ou estratgia adotada.

Ex: Relatrio de Pedido, Cadastro de Clientes

Sintaxe para criar um Ponto de Entrada:

Function TMKA010()

Local lRetorno := .F.
Local LTMKMCL := Existblock("TMKMCl") // O Existblock detecta se existe uma funo
no repositrio do AP5 com esse PE.

If lTMKMCL
lRetorno := Execblock(TMKMCI,.F.,F.,{aValor}) // aValor um array que seria
recebido pelo usuario em PARAMIXB
Endif

Return( lRetorno )

Desenvolvimento
Tcnicas e Procedimentos



Microsiga Software S/A Pgina 21 de 41


Procedimentos para sua criao
Avaliar com critrio a criao do Ponto de Entrada, pois importante localiza-lo num ponto que
seja til, no redudante e que realmente d condies de atender ao solicitante.
O Ponto de entrada no uma ferramenta de correo de eventuais falha do sistema e sim para
ajudar no desenvolvimento de negcios especficos.
Documentar no QUARK com nome,momento no qual o momento em que ele disparado,
parametros que ele envia,retorno esperado (se houver) e o que ele executa com o retorno

Para Entendimento do Conceito de Integridade Referencial

Desenvolvimento
Tcnicas e Procedimentos



Microsiga Software S/A Pgina 22 de 41


CONTABILIZANDO
A contabilizao de registros em um sistema ERP necessrio toda vez que houverem operaoes
envolvendo valores na empresa, como por exemplo, a emisso de uma nota fiscal, um
recebimento de dinheiro, um pagamento na folha, entre outros.

Para quem est programando fundamental que este conceito esteja bastante sidimentado.

Para se definir a contabilizao em qualquer rotina deve-se :
Definir os lanamentos padronizados que sero utilizados para a rotina (cada mdulo ou
famlia de mdulo possui uma sequencia lgica)
Preparar o programa para efetuar as atualizaes e a contabilizao. Este detalhe
muito importante pois o lanamento padro uma frmula e o posicionamento dos
registros fundamental. Exemplo : Na rotina de exclusao de nota fiscal deve-se executar
a contabilizao antes do comando dbDelete().
A chamada do lanamento contbil deve estar em um lugar estratgicamente correto,
pois teoricamente a ltima coisa a ser feita na rotina. No aconselhvel executar a
contabilizao e depois efetuar outros comandos.

Existem trs funes que devero ser utilizadas, para que seja criado um arquivo texto,
contendo as informaes a serem contabilizadas.

Como temos 2 sistemas contbeis (SIGACON e SIGACTB) com procedimentos diferenciados
programamos de forma identica para ambos porm internamente as rotinas efetuam comandos
diferentes. Os comandos para a contabilizao so :
A Funo HeadProva
Este funo cria o cabealho da contabilizao. tratada de forma diferenciada para os mdulos
SIGACON e SIGACTB.

Sintaxe:
nHdlPrv := HeadProva(cLoteAtf, cNomProg, Substr(cUsuario,7,6), @arquivo, .T.)

Onde:
NHdlPrv Varivel que conter o num. (Handle) do arquivo (.LAN) criado.
cLoteAtf Cdigo do lote do mdulo (Ex.: Ativo Fixo: 8866)
cNomProg Nome do Programa (Ex.: ATFA060)
cUsuario Usurio arquivo: nome do arquivo (Ex.: cArquivo := )
A funo DetProva()
Em primeiro lugar, deve-se estar posicionado no registro, que contm o valor ser contabilizado

Desenvolvimento
Tcnicas e Procedimentos



Microsiga Software S/A Pgina 23 de 41



Sintaxe:
ExpN1 := DetProva(ExpN2,ExpC1,ExpC2,ExpC3)

ExpN1 Valor Total da Contabilizao
ExpN2 Handle retornado da funo anterior
ExpC1 Cdigo do Lanamento Padro
ExpC2 Nome da rotina Geradora
ExpC3 Lanamento Padro
A funo RodaProva()
Esta funo ir cria a finalizao da contabilizao.

Sintaxe:
RodaProva(ExpN1, ExpN2)

ExpN1 Handle retornado da funo anterior
ExpN2 Valor Total da contabililizao

No Final, ou seja, aps todos registros serem processados utilizar a funo CA100INCL(), cujo
objetivo ler o arquivo gerado (.LAN), e gerar os lanamentos no arquivo SI2 (Lanamentos
contbeis).

Exemplo:

CA100Incl( cArquivo, nHdlPrv, nOpcx, cLoteContabil, lDigita, lAglut, cOnLine, dData)

Onde:
cArquivo Nome do arquivo
nHdlPrv Numero do Header
nOpcx Numero da Opcao escolhida
cLoteContabil Numero do Lote
lDigita Se Mostra ou nao
lAglut Se Aglutina ou no
cOnLine Determina se sera On Line ou pelo cProva

Desenvolvimento
Tcnicas e Procedimentos



Microsiga Software S/A Pgina 24 de 41


ATUALIZANDO SX (ATUSX)
O ATUSX uma ferramenta muito importante utilizada na manuteno dos arquivos
customizadores internos: os arquivos SXs . nos arquivos SX que esto armazenadas todas as
informaes padres necessrias para a criao de bases das empresas e efetuar possveis
customizaes.

Em uma atualizao de verso, o sistema ir fazer uma compatibilizao de dados com os
arquivos j existentes e os atualizar com base nos SXs. Ao desenvolver uma rotina que exige
um novo campo, por exemplo, este dever ser criado no ATUSX, caso contrrio gerar uma no
conformidade comprometendo todo o trabalho da atualizao e o bom andamento do trabalho.
Todo os campos, perguntas, ndices, parmetros novos devero estar no ATUSX , pois estes so
os padres do Protheus.

aqui tambm que cadastramos os HELPs de campo e de programas, criamos os menus do
sistema e onde disponibilizamos informaes para serem traduzidas para outros pases.
Exemplo de atualizao no SX:
Criao de ndice no Cadastro de Funcionrios- Suponhamos que seja necessrio um ndice por
Data de Admisso. Neste caso utilizaremos o SINDEX , onde devero ser alimentados
basicamente o Alias (SRA), a ordem , a chave de indexao (RA_ADMISSA) e sua descrio em
Portugus. As descries referentes s outras lnguas devero ficar a cargo do departamento de
tradues. Numa atualizao de verso, o sistema enxergar a existncia deste ndice pelo
SINDEX e o disponibilizar para utilizao.

Ao final da manuteno dos arquivos SXs, abre-se uma janela onde deve ser documentado todas
as alteraes efetuadas da forma mais clara e precisa possvel. Esta documentao de extrema
importncia para que se tenha um controle dos arquivos customizadores padres e garantem
um perfeito funcionamento do Protheus.
SX1 - Parmetros Genricos
Esta tabela contm as perguntas, os valores armazenados e a ltima resposta utilizada para
processamento, impresso de relatrios , etc.

Todos os processamentos ou relatrios que tenham a opo de parametrizao, devero utilizar
a funo Pergunte para carregar os valores dos parmetros e/ou apresentar na tela as perguntas
relacionadas.

Como o usurio pode no utilizar a opo de parametrizao, devemos sempre carregar as
variveis MV_PARXX com os valores default ou com as ltimas respostas aplicadas, para evitar
erros de comparao de variveis.

Desenvolvimento
Tcnicas e Procedimentos



Microsiga Software S/A Pgina 25 de 41


SX2 - Mapeamento dos arquivos
Armazena os Paths dos arquivos possibilitando que estes possam ser distribudos em diversos
drives ou diretrios.
SX3 - Dicionrio de Dados
Armazena informaes referentes s definies de todos os campos que existem no Protheus.
SX5 - Tabelas Genricas
Armazena tabelas genricas utilizadas em todo sistema.
SX6 - Parmetros
Elemento chave para a execuo de um processamento, que determina diferentes resultados
dependendo do seu contedo.
SX7 Gatilhos
Rotina ou operao que disparada a partir de um evento get.
SXE/SXF - Seqncia. de documentos
Armazena sequencias alfanumricas que devero ser controladas por um semforo. Um exemplo
clssico seria a numerao de pedidos de venda, em que vrios usurios poderiam estar
utilizando o mesmo nmero de pedido.
SINDEX- Arquivo de ndices
Armazena todos os ndices padres.

Desenvolvimento
Tcnicas e Procedimentos



Microsiga Software S/A Pgina 26 de 41


CONTROLE DE TRANSAO (TTS)
O que
Tratando-se de Banco de Dados, toda e qualquer operao de incluso, alterao ou excluso de
registro armazenada primeiramente na rea de LOG, garantindo assim que ao fazer a incluso
de uma linha (registro) seja garantida a incluso completa de todas as colunas (campos). Caso
no seja possvel a incluso da linha completa ele executa um procedimento chamado de
ROLLBACK, ou seja, ignora todo o registro.
Quando usar
Quando temos uma operao em Banco de Dados que necessite que vrias incluses, alteraes
ou excluses s sejam efetuadas quando todas as operaes tenham sido realizadas com
sucesso, garantindo com isso que no seja atualizada parcialmente uma tabela ou que atualize
uma tabela e no atualize outra tabela relacionada.
Como usar
Para definir uma transao, deve-se utilizar os comandos BEGIN TRANSACTION e END
TRANSACTION para definir inicio e fim de uma transao respectivamente. Todas informaes
serem gravadas no Banco devem estar dentro de uma nica transao sejam elas provenientes
de uma ou vrias tabelas.

Deve-ser evitar utilizar laos (WHILE, FOR) dentro de uma transao, pois a rea de LOG do
banco limitada, e se o volume de informaes ultrapassarem este limite, ocasionar o
travamento do banco de dados. O tamanho da transao deve-ser ser conhecido pelo
programdor. Em suma, para exemplificar, devemos controlar a transao de uma nota e no de
um conjunto ilimitado de notas.
Onde no usar
O controle de transao jamais dever ser utilizado durante processo que envolvam interface
(telas com entrada de dados). O controle deve-se resumir apenas ao processo de gravao.
Entre um incio de transao (Begin Transaction) e um final (End Transaction) Todos os registros
a serem gravados ficam locados at o final da transao. Caso tenhamos uma tela aps o
BEGIN e antes do END dependeremos do usurio para efetuar a liberao da transao, fato este
que causaria enormes problemas para o usurio.

Outro lugar que no deve-se ter o controle de transao refere-se a rotinas de reprocessamentos
ou reclculos, onde as informaes podem ser regerados durante este processo ou onde
possamos ter um grande nmero de locks.

Desenvolvimento
Tcnicas e Procedimentos



Microsiga Software S/A Pgina 27 de 41



BEGIN TRANSACTION

ExpN1 :=FuncGrava()

END TRANSACTION

Caso exista uma transao dentro de uma outra a segunda ser automaticamente ignorada,
fechando-se a transao principal quando da chamada do comando END TRANSACTION.

Desenvolvimento
Tcnicas e Procedimentos



Microsiga Software S/A Pgina 28 de 41


COMANDOS DEFINIDOS PELO USURIO (UDCS)
Este recurso cria novas e infinitas possibilidades para modificar a maneira pela qual escrevemos o
cdigo de uma funo e a maneira pela qual podemos resolver problemas complexos. Ele ajuda
a facilitar a manuteno do cdigo, e a implementao de normas.

Estes comandos so traduzidos, analisados e modificados antes que o compilador comece a
trabalhar para gerar um arquivo objeto. O responsvel por esta traduo o pr-processador
que um tradutor inteligente que atua antes da gerao do cdigo objeto.

Em sua maioria, isto se resume a encontrar os comandos no cdigo fonte e traduzi-los para
instrues e funes equivalentes que se acham no corpo da funo ou no contedo de arquivos
.CH (arquivos de cabealho). Este tipo de arquivo (.CH), contm diversos comandos que sero
utilizados por todas as funes que contenham a instruo include em seu cdigo.

Estes mesmos comandos poderiam estar embutidos na funo, mas para facilitar a manuteno,
um nico arquivo .CH, pode ser includo (comando include) em vrias funes ao mesmo tempo.
No h a necessidade de colocar o comando include em cada funo. Uma nica meno ao .CH
no arquivo .PR?, servir ao propsito de todas as funes nele embutidas.

Estes comandos so diretivas do pr-processador e comeam sempre com o caracter #
diretamente sua frente e devem estar escritos em caracteres tipo caixa alta. Os mais utilizados
no Protheus so:

#DEFINE
#IFDEF, ou #IFNDEF
#ELSE
#ENDIF
#INCLUDE

Cada um destes comandos pode ser colocado em qualquer parte do arquivo fonte, que ser lido
pelo pr-processador. No entanto, para facilitar a visualizao da existncia destes comandos e
manuteno da funo, estes comandos devem ser colocados no incio do fonte.

O pr-processador substituir, cada ocorrncia da constante no fonte, ser substituda pela
expresso ou valor, que estiver contida diretamente frente da mesma. A exemplo de sintaxe e
cdigo fonte para este comando :

#DEFINE _TESC 27
#DEFINE _LESC lastkey()

if _nLastkey == _TESC
RETURN
Endif

Desenvolvimento
Tcnicas e Procedimentos



Microsiga Software S/A Pgina 29 de 41



if _LESC == _TESC
RETURN
Endif

Esta diretiva muito til quando temos um valor constante vrias vezes repetido dentro do
cdigo fonte, que poder ser alterado com freqncia no decorrer da vida til da funo.

#IFDEF ou #IFNDEF <CONSTANTE>
<instrues>
#ELSE
<outras instrues>
#ENDIF

Esta diretiva do pr-processador permite que voc prepare aplicaes para compilao
condicional, ou em outras palavras, se a <constante>, definida anteriormente via diretiva
DEFINE ou pelo Protheus foi definida (IFDEF), as <instrues> sero incorporadas ao cdigo
objeto e as <outras instrues>, sero desprezadas. Mas se a <constante> no foi definida
<IFNDEF> as <instrues> sero incorporadas e as <outras instrues> sero desprezadas.

#INCLUDE <ARQUIVO>

Uma instruo INCLUDE diz ao pr-processador para inserir o contedo de outro arquivo em um
local determinado dentro da funo. Este arquivo especificado, deve focalizar outras instrues
do pr-processador que possam ser comuns a diversos mdulos da rotina.
Uso de Strings
Para que o sistema possa ser utilizado em outros pases com lnguas diferentes ao invs de
inserirmos diretamente os textos no fonte do relatrio utilizamos o recurso de strings, onde
atravs de um include acessaremos o texto em trs lnguas diferentes (Portugus, Espanhol e
Ingls) dependendo da forma da compilao.

convencionado que o nome do include seja o mesmo nome do fonte do relatrio para que a
manuteno deste relatrio seja o mais simples possvel.

Exemplo:

Relatrio FABR001.PRW
Include FABR001.CH

Desenvolvimento
Tcnicas e Procedimentos



Microsiga Software S/A Pgina 30 de 41


NDICES
A utilizao de ndices para a pesquisa deve ser bem analisada a fim de evitar lentido ou
processamentos redundantes nos relatrios.

Os ndices ajudam a otimizar as pesquisas e laos de processamentos, por isto no devem ser
subtilizados ou utilizados de forma errnea.

Caso a necessidade do relatrio exija uma otimizao que no possvel obter com os ndices
padres do sistema possvel criar ndices temporrios atravs da funo Indregua tornando
assim os relatrios mais geis e bem estruturados.
Criando e Deletando Arquivos de trabalho (Temporrios.)
Quando criamos um arquivo de trabalho ou um ndice de trabalho (utilizando a funo Indregua)
no final do programa devemos apaga-los.

Para criao de um ndice de Trabalho (Temporrio) com Indregua:

cArqNtx := CriaTrab( NIL, .F. ) //Criando Arquivo
IndRegua( "SRA", cArqNtx, cIndCond, , cFor, STR0039 ) //Selec.registros..."

Para deletar este ndice de trabalho no final do processamento:

DbSelectArea( SRA ) //Selecionando a area
DbSetOrder( 1 ) //Posicionando na ordem de origem
fErase( cArqNtx + OrdBagExt() )//Deletando arquivo de trabalho

Caso o programa que crie um arquivo de trabalho e no o apague no final de seu
processamento, este ficar ocupando espao em disco no ambiente de trabalho. Isto poder
gerar problemas futuros para o cliente. Por isto, fundamental, que aps sua utilizao o mesmo
seja descartado.
Utilizando Querys no Protheus
Podemos utilizar querys no Protheus quando acessamos bancos de dados via TopConnect.

As querys, quando bem construdas, melhoram enormemente a eficincia ( velocidade ) das
consultas aos dados e reduzem a sobrecarga no servidor de aplicao, TopConnect e Banco de
Dados.


Desenvolvimento
Tcnicas e Procedimentos



Microsiga Software S/A Pgina 31 de 41


Normalmente uma query utilizada em substituio a um Loop ( While ) na base de dados de
programao convencional. Querys mais complexas utilizando joins poder ser construdas com a
mesma funo de vrios loops.
Dicas Importantes - DBF versus SQL
A princpio no existem diferenas na programao na verso SQL, j que pelo prprio fato de
ser uma linguagem interpretada, o sistema quem se encarrega de executar os comandos e
funes adequadamente no ambiente em que trabalha. Mas importante manter algumas
informaes em mente ao programar para o ambiente SQL.

Deve-se lembrar que estamos trabalhando com um banco de dados relacional, que se utiliza de
tabelas ao invs de arquivos, e onde o sistema no tem acesso aos dados de forma nativa e sim
atravs do Top Connect. Essa forma de acesso adiciona ao sistema algumas das caractersticas e
vantagens oferecidas pelo SGBD em uso (por exemplo, o Oracle, MSSQL Server ou o DB2) como
por exemplo segurana e integridade referencial, e as imensas facilidades da linguagem SQL,
mas por outro lado tem-se tambm as implicaes da converso dos comandos no padro xBase
para a perfeita compreenso no ambiente SQL.

Imagine a montagem de uma expresso de filtro para um ndice condicional. Tome a seguinte
expresso como exemplo: "DTOS(E1_VENCTO) >= DTOS(mv_par01)". Em um ambiente
padro xBase, como o NTX ou o ADS, pode-se utilizar variveis sem qualquer problema em uma
expresso de filtro pois a mesma ser avaliada registro a registro durante a montagem do ndice.
Mas no ambiente SQL, o filtro nada mais do que uma tabela temporria, onde esto
selecionados apenas os registros conforme a condio indicada. A seleo de dados em tabelas
pelo SQL mais rpida, mas em conpensao o SGBD no tem como reconhecer a varivel
informada na expresso. Ela existe apenas no sistema ou, mais especificamente, no seu
programa. Por isso, deve-se substituir a expresso anteriormente exemplificada pela seguinte
(que tambm funcionaria perfeitamente em um ambiente xBase): "DTOS(E1_VENCTO) >=
"+DTOS(mv_par01)+"". Esta expresso melhor que anterior simplesmente porque no se
utiliza da varivel e sim do contedo da mesma, o que pode ser compreendido em qualquer
ambiente. Toda essas explicaes so vlidas, da mesma maneira, a filtros criados atravs do
comando SET FILTER.
Ainda existem outros detalhes a se considerar quando se trabalha com ndices em um ambiente
SQL. que na verdade no existem ndices condicionais nesse ambiente. O filtro criado
independente do ndice. Ento, voc pode criar um INDREGUA com um filtro e mudar a ordem,
mas o filtro permanecer ativo, em qualquer ordem. Do mesmo modo, no se pode manter dois
ndices, com filtros diferentes, pois um filtro sobrescreveria o outro.

Outro ponto de ateno deve ser a funo xBase chamada DBSETINDEX. Podem ocorrer alguns
erros ao tentar-se utilizar essa funo para abrir um ndice de trabalho criado. Por esses motivos
e pelo fato de tornar o processamento mais lento deve-se evitar ao mximo o uso de ndices de
trabalho no ambiente SQL.

Da mesma maneira que a funco DBSETINDEX, os comandos COPY TO e APPEND FROM tambm
devem ter uma ateno especial. No ambiente SQL esses comandos so executados entre uma

Desenvolvimento
Tcnicas e Procedimentos



Microsiga Software S/A Pgina 32 de 41


tabela e um arquivo DBF (e vice-versa) ou entre dois arquivos DBF. Por exemplo, o comando
COPY TO pode ser usado para copiar os dados da tabela ativa para um DBF local e o comando
APPEND FROM pode ser usado para importar os dados de um arquivo local para a tabela ativa.
Os dois podem ser usados entre dois arquivos, mas nunca pode-se usar, por exemplo, o
comando APPEND FROM para importar os dados de uma tabela para outra.

Desenvolvimento
Tcnicas e Procedimentos



Microsiga Software S/A Pgina 33 de 41


CONCEITO DE FILIAL E COMPARTILHAMENTO DE ARQUIVOS
O Sistema permite a criao de vrias Filiais para uma mesma empresa cadastrada, de modo que
Filiais da mesma empresa compartilhem ou no as mesmas informaes como Cadastro de
Produtos, Clientes, etc.

Este tratamento feito internamente atravs dos campo XX_FILIAL obedecendo a seguinte
regra:
Arquivos Compartilhados
Quando o arquivo esta configurado para trabalhar no modo compartilhado (X2_MODO = C),
este campo ser gravado com ( espaos ).
Deste modo o registro ficara disponvel para todas as Filiais.
Arquivos Exclusivos
Quando o arquivo esta configurado para trabalhar no modo exclusivo ( X2_MODO= C ), esta
campo ser gravado com o cdigo da Filial Atual.

Deste modo o registro focara disponivel apenas para a Filial que o gravou.

Para que o registro realmente fique disponvel ou no para suas respectivas Filiais , TODAS as
rotinas que manilpulam registros diretamente na base de dados dever verificar a Filial atravs
da Funo xFilial() , alem disto a maioria dos ndices possuem o campo FILIAL na
chave :

Sintaxe : XFILIAL(EXPC1) onde, ExpC1 = Alias do arquivo

A funo xFilial() verifica se o arquivo exclusivo ou compartilhado e ira retornar se o
arquivo for Compartilhado e o cdigo da Filial se o arquivo for exclusivo .

Por exemplo :

Para executar um dbSeek no arquivo de clientes :

DbSelectArea(SA1)
DbSeek(xFilial(SA1)+cCodCli+cLoja)

ndice do SA1 :

A1_FILIAL+A1_COD+A1_LOJA


Desenvolvimento
Tcnicas e Procedimentos



Microsiga Software S/A Pgina 34 de 41


Ou um processamento no arquivo :

Do while !EOF() .AND. XX_FILIAL==xFilial(01)

Sendo o campo FILIAL parte da chave de Todos os ndices do sistema, este procedimento
garante que a utilizao dos registros ser exclusiva da Filial que criou os mesmos no caso do
arquivo ser Exclusivo, ou disponvel para todas as Filiais quando o mesmo estiver configurado
como Compartilhado.

Jamais use um campo filial de uma tabela para executar um dbSeek() em outra tabela. Pois uma
tabela poder ser compartillhada (campo filial em branco), enquanto que a outra poder ser
compartilhada (campo filial preenchido).

A varivel cFilAnt contm a filial que o usurio est operando, e a varivel cEmpant contm a
empresa e a filial
Tcnicas para Filtragem
Nos sistemas Microsiga, a filtragem dos dados em ambiente Code Base os DBFs feita de
maneira geral pela Funo INDREGUA(Params,) , o que de forma geral no impede o uso de
instrues como SET FILTER TO, DBSETFILTER(), DBFILTER() ou qualquer outro comando de
sintaxe xBase. A INDREGUA() uma funo interna que rene vrios atrativos e facilidades para
o seu uso, entre elas a possibilidade de se indexar e filtrar os registros atravs dos parmetros
fornecidos, ela tambm preferencialmente usada para que o cdigo fique mais limpo e de
fcil interpretao pois dentro de sua estrutura rene uma srie de comandos de indexao e
filtragem que agiliza o processo de criao de ndices e filtros em arquivos de trabalho com
menos linhas de cdigo, vejamos o Exemplo :
Chaves Primrias
Sua funo garantir unicidade. Em toda relao, por definio, tem-se uma ou mais chaves
candidatas. Dessas chaves, uma ser primria e se houver mais de uma na relao, essas outras
sero definidas como chave alternada.
Chaves Estrangeiras
um atributo cuja funo permitir relacionamento. Em uma tabela na qual o atributo chave
externa ou estrangeira, em outra, o atributo deve ser chave primria, e os valores dos campos
so necessrios.
Integridade Referencial
Todos os valores da chave estrangeira tem, obrigatoriamente, que ter valor correspondente na
chave primria que se relaciona; mas nem todos os valores encontrados na chave primria,

Desenvolvimento
Tcnicas e Procedimentos



Microsiga Software S/A Pgina 35 de 41


precisam ter seus correspondentes na chave estrangeira que se relaciona. Por exemplo, na tabela
de clientes, o campo A1_COD (cdigo do cliente), vai estar relacionado com outra tabela que
indica quais so os pedidos de venda colocados. Desta forma, nem todos os clientes precisam ter
pedidos de venda colocados; mas, necessariamente, todos os pedidos de venda precisam de um
cliente.

Como o PROTHEUS foi projetado para o ambiente SQL, onde a integridade referencial das
tabelas definida no prprio banco de dados atravs de regras internas, devemos tomar algumas
precaues com esse tpico:

Verificar a integridade da coluna em todas as tabelas relacionadas: no pode-se alterar o
tamanho do cdigo do cliente em apenas uma tabela, caso esse cdigo seja alterado deve-se
verificar as tabelas de cabecalho e itens das notas fiscais, de titulos a pagar e receber, etc. O
sistema conta com o recurso de grupos de tabelas relacionadas, que permite alterar o tamanho
de diversas colunas de uma vez s , garantindo a integridade das colunas

Verificar a integridade dos cadastros com todas as tabelas relacionadas: no pode-se excluir o
cdigo do cliente se existe um pedido de vendas em aberto para esse cliente, deve-se verificar
todas as tabelas relacionadas antes de atualizar a base de dados.Alm disso na incluso de
cadastros devemos utilizar as funes existchav e existcpo para garantir que as informaes de
chave no sejam repetidas e que o acesso a tabelas externas seja validado de maneira
consistente.

Verificar a atualizao da informao em todas as tabelas relacionadas: a integridade no se
resume a validaes de cadastros e tamanho de colunas, deve-se garantir no ato do
desenvolvimento que TODOS os pontos relacionados ao tpico envolvido sejam analisados e se
necessrio atualizados. Por exemplo, se ser atualizado o saldo em estoque de determinado
produto NO DEVE-SE atualizar somente o arquivo de saldos em estoque, deve-se avaliar se o
produto utiliza rastreabilidade para nesse caso atualizar o arquivo de saldos por lote, deve-se
avaliar se o produto utiliza controle de localizao fisica para nesse caso atualizar o arquivo de
saldos por localizao, etc. Deve-se fazer um estudo antes de qualquer alterao em atualizao
de base de dados.

Desenvolvimento
Tcnicas e Procedimentos



Microsiga Software S/A Pgina 36 de 41


USANDO ROTINAS AUTOMTICAS
A cada dia estamos criando rotinas com interface automtica para melhorar a entrada de dados
via outros equipamentos, tais como coletores de dados, interface de outros softwares, etc.
Porm, para nossa prpria portabilidade e utilizao de rotinas padronizadas, temos adotado o
prprio programa standard, contudo sem interferencia do usurio (digitador). Para tal, criamos
um mecanismo onde todos os programas que necessitem desta regra devem ser capazes de
inserir dados de forma automtica. Abaixo mostraremos como proceder :

Tome como exemplo o MATA250.PRX . O vetor aRotAuto passado para o programa citado. Se
este vetor contiver elementos, significa que ser utilizada a Rotina Automtica. Este vetor deve,
quando da utilizao das rotinas automticas, conter os dados mnimos necessrios para a
atualizao dos arquivos.

Veja a estrutura do vetor a ser enviado para a rotina automtica.

ARotAuto := { cCampo, Contedo, Validao}

Onde
CCampo o campo a ser atualizado,
Contedo o contedo que cCampo vai receber
Validao a validao que cCampo vai receber.

Observao: A Validao pode ser uma funo ou um valor NIL. Se for NIL, as validaes a
serem utilizadas para o respectivo campo sero as existentes no SX3. Se as validaes no forem
as do SX3, elas devem ser passadas numa funo.

Exemplo,

ARotAuto := { { "D3_TM" ,"001" ,NIL } , ;
{ "D3_COD" ,padr("10100",15) ,NIL } , ;
{ "D3_UM" ,"UN" ,NIL } , ;
{ "D3_QUANT" ,1 ,NIL } , ;
{ "D3_OP" ,"00000401001" ,NIL } , ;
{ "D3_LOCAL" ,"01" ,NIL } , ;
{ "D3_EMISSAO" ,dDataBase ,NIL } }

Para o processo de incluso simples, sem getdados, a varivel padro a ser utilizada nos
programas chama-se aRotAuto, e para processo de incluso com cabealho e itens, as variveis a
serem utilizadas so: aAutoCab para o cabealho, e aAutoItens para os itens da getdados.

Para uma incluso simples, tomar como exemplo o MATA250.PRX. Para uma incluso com
cabealho e tem, tomar como exemplo o CONA050.PRX.

Desenvolvimento
Tcnicas e Procedimentos



Microsiga Software S/A Pgina 37 de 41


CONTROLE DE SEMFORO
O controle de Semaforo permite que o sistema controle a Numerao Automtica de Documentos
On Line. Temos basicamente 3 funes que gerenciam o controle do mesmo.

So elas :

GETSXENUM( EXPC1) Obtem o nmero sequencial do alias especificado no parmetro.

ROLLBACKSXE Descarta o nmero pendente do semforo. usado quando o usurio
cancela a operao (o numero no aproveitado).

CONFIRMSXE Confirma o nmero sugerido. Esta funo deve ser chamada quando da
confirmao da gravao do registro.

MAYIUSE Checa fisicamente se um determinado arquivo existe. O arquivo poder conter o
nmero sequencial.

Obs : A funo GETX8NUM executa a prpria GETSXENUM.


Desenvolvimento
Tcnicas e Procedimentos



Microsiga Software S/A Pgina 38 de 41


ATUALIZAO DO SOURCE SAFE
A atualizao do Source Safe a ltima, e mais crtica, etapa do processo de alterao dos
programas. Para que ela seja feita com a mxima segurana algumas etapas devem ser
observadas. A seguir:

Aps as alteraes ser necessria uma anlise meticulosa de tudo o que foi alterado para avaliar
qual o impacto que estas podero causar no programa em que foram executadas e nos
programas correlacionados;

Devero ser efetuados o maior nmero de testes onde devero ser previstos o maior nmero de
situaes possveis e provveis. Os testes devero ser simulados em base equivalente instalada
no cliente e para as novas verses, em uma nova base que poder ser gerada atravs do ATUSX;

Feita a anlise, os testes e antes de atualizar definitivamente o Source Safe o programa alterado
dever ser comparado com o constante no Source Safe para verificar se as alteraes foram
realmente feitas no programa que foi reservado e, s ento o programa poder ser Baixado.

Aps a Baixa, e para garantir que o atualizao do Source Safe foi feita corretamente, o
programa atualizado dever ser novamente comparado. E claro que se todas as etapas
anteriores, principalmente a 1 e 2 , foram cumpridas essa no passar de uma medida de
segurana.






Desenvolvimento
Tcnicas e Procedimentos



Microsiga Software S/A Pgina 39 de 41


LOCALIZAES
A Microsiga atua hoje em 13 pases e isto faz com que praticamente todas as alteraes
executadas no sistema reflitam em todos os pases (exceto quando no for necessrio tal
procedimento).


Procedimentos a serem cumpridos em alterao / desenvolvimento de programas :

A fim de evitar os inconvenientes citados no ponto anterior, existem procedimentos que devem
ser adotados no nosso dia a dia e repassado para aqueles funcionrios que se acoplam a nossa
equipe. Estes so (entre parntesis os problemas que seriam reduzidos usando os
procedimentos) :

o Quando includo um novo STR em um CH, ou criado um novo CH, ou modificado um
STR em um CH j existente, este deve ser replicado em PORTUGUS para os demais
idiomas e automaticamente deve ser encaminha um e-mail para
traducoes@microsiga.com.br indicando a verso, o STR e o CH que foi alterado.
o Quando criado um campo novo, ou modificado o contedo de um j existente, os
campos que devem refletir esta alterao nos demais idiomas devem ser deixados em
branco, assim como o pessoal de tradues identifica os campos que devem ser
traduzidos. Isto valido para todos os arquivos do dicionrio de dados.
o Quando criado ou alterado um novo HELP (de campo ou de programa) deve ser
informado de imediato para tradues para proceder a traduo para os outros idiomas.
o Para atualizar um parmetro deve ser sempre usada a funo PUTMV, NUNCA DEVE
SER PREENCHIDO NEM POSICIONADO POR FORA. Esta funo atualiza nos trs
idiomas.
o Quando criado um campo novo similar a outros j existentes no sistema, deve se
analisar se este deve ser replicado com caractersticas diferentes para todos os paises
localizados, ou se as caractersticas devem ser igual independentemente da localizao.
Na falta de critrio ou informao, deve ser informado ao setor de localizaes.
o Quando criado um campo novo de uso exclusivo de Brasil (E1_INSS por exemplo) deve
ser informada a equipe de localizaes para configurar este campo (uso, browse, etc.)
de acordo com os demais paises.
o Quando for modificada a caracterstica de um campo do sistema e este estiver replicado
para o resto dos pases, as alteraes devem ser replicadas em todos os paises. Na
dvida da aplicabilidade da alterao nos outros paises, deve ser informada a equipe de
localizaes.
o Os novos campos tipo COMBO, devem ser criados com numerao e no com siglas (1
para sim e 2 para no, ao invs de S para sim e N para no). Esta alterao o incluso
deve ser informada de imediato para a equipe de tradues.
o Quando for criado um novo parmetro, ou modificado o contedo default de um j
existente, esta modificao deve ser aplicada nas 3 lnguas.
o Quando houve a possibilidade de pegar um STR do dicionrio (funo RETTITLE() ),
este deve ser pego, o que evita ter que criar vrios STR e tratarmos com a varivel
cPaisLoc dentro do programa. Exemplo CGC, NOTA FISCAL, CEP, etc.

Desenvolvimento
Tcnicas e Procedimentos



Microsiga Software S/A Pgina 40 de 41


o No deve ser usada a acentuao
o Quando criadas novas perguntas no SX1, ou modificadas as existentes, e o X1_GSC for
igual a C, deve ser informado de imediato para tradues, pois os campos das opes
do combo, quando vazias, geram erro fatal na execuo.


Desenvolvimento
Tcnicas e Procedimentos



Microsiga Software S/A Pgina 41 de 41


PROGRAMANDO COM SCHEDULE DE RELATRIOS
Como o sistema permite que a emisso de relatrios possa ser programada (schedule)
fundamental que se utilize as rotinas padres para a emisso dos mesmo. O controle do
schedule feito pela funo SetPrint. Sendo assim, no suportado interface com data entry
durante o processo de relatrio, visto que isto inviabilizar a utilizao do mesmo. A no ser em
relatrios especficos e que sejam inviveis a utilizao de shedule (ex. Impresso de Cheques)
este procedimento dever ser adotado corretamente.
Caso exista alguma entrada de dados que seja possvel ser assumida qualquer valor apenas no
schedule deve-se adotar o seguinte procedimento :

Usar a varivel __cInternet, que se estiver com valor .T. (Verdadeiro) estamos no processo de
schedule.

Potrebbero piacerti anche