Árvore de páginas

Uso das Templates

A Navegação dentro dos Programas

O primeiro programa a ser executado deve ser o BC9200.EXE, nele deve ser escolhida a opção desejada. Com a opção escolhida o programa descompactará na memória RAM e chamará o programa da transação correspondente; é necessário utilizar “<enter>” para confirmar os campos, “seta para cima” para voltar ao campo anterior, e “clear” para voltar a tela anterior. O registro é definitivamente gravado, quando o último campo da tela for confirmado. Ao voltar para o menu principal, o programa da transação que estava aberto é eliminado da RAM.

O menu traz também algumas funcionalidades como:

 •  Envio do arquivo com as transações para o coletor;

 •  Eliminação do arquivo;

 •  Estorno do backup do arquivo.

 

Como baixar um arquivo gerado na RAM

Para baixar os arquivos gerados na RAM para o PC, deve ser instalado no PC o TNTERM, e no coletor deve existir o programa TDREM.

Primeiro é necessário deixar o coletor preparado para comunicação com a execução do TDREM, por intermédio do comando abaixo ou da opção envia do menu:

 •  tdrem-rp1 -rs3

Após isso deve ser executada a seguinte linha de comando no PC:

 •  TFT3000 - S38 - P1 G (nome do arquivo a ser baixado).

Quando terminar a transmissão, deve ser fechada a comunicação com o comando:

 •  TFT3000 - S38 -P1 -X

Quando na execução do menu das templates for necessária baixar o arquivo com os registros, utilizar os seguintes comandos:

 •  Selecionar a opção 6 do menu (Manut Dados).

 •  No submenu selecionar a opção 1 (Envia Dados).

 •  Execute o programa download.bat da pasta Comunica_Coletor.

 •  Será copiado o arquivo bcreg.txt para a máquina; e nesse caso, o arquivo existente no coletor é eliminado e feita uma cópia do backup para o arquivo bcreg.bak, sobrescrevendo o último backup.

 •  Para voltar o backup para uso, deve-se executar.

 •  Opção 3 (Recupera Arq.), que vai renomear o arquivo “_bcreg.bak” para “bcreg.txt”.

 •  Para recomeçar o arquivo de transações sem envia-lo, é só executar a opção 2 (Elimina Dados).

 

Como Compilar os Programas

 •  Instalar no PC o compilador Microsoft C.

 •  Instalar no PC o kit ADK de desenvolvimento da symbol.

 •  Setar no Microsoft C, o diretório base do ADK.

 •  Compilar os programas; no caso das transações utilizando o menu bc9200.c, os programas devem ser compactados depois de compilados, utilizando o programa PKZIP, porque os programas são descompactados e eliminados em tempo de execução. Isso é necessário devido a quantidade de memória não volátil (NVM) ser muito pequena. A descompactação em tempo de execução é feita por intermédio de um programa .bat que utiliza o aplicativo unzipjr.

 

Como Customizar o Menu

O menu pode ser customizado, sendo inicializado a estrutura menu_princ com os seguintes campos:

char_op_menu

Opção que deve ser escolhida na tela para o programa identificar a opção desejada.

char *item_menu

Deve ser inicializada com a label desejada para aparecer na tela.

char *programa

Nome do programa sem a extensão a ser executado.

 

Também pode ser customizada a função abre_menu, onde no local que está sendo impresso “MENU” pode ser substituído pelo título desejado para a tela.

A função abre_menu deve ser chamada com os parâmetros dos registros inicial e final que irão para a tela.

 

Como Customizar um Programa de Transações

Para customizar um programa, deve ser seguido os seguintes passos:

Escolha a template que melhor se adapte a situação do cliente; a template tem variações no seu corpo conforme o tipo de navegação.

O primeiro trecho a ser colocado no programa são as definições, que devem ser mantidas conforme abaixo:

#pragma pack(1)

 

Bibliotecas C Microsoft

#include <ctype.h>

#include <dos.h>

#include <fcntl.h>

#include <io.h>

#include <malloc.h>

#include <stdlib.h>

#include <string.h>

#include <stdio.h>

#include <conio.h>

#include <sys\types.h>

#include <sys\stat.h>

 

Biblioteca ADK

#include <3000\bios.h>

#include <3000\dos.h>

#include <3000\urm.h>

 

Bibliotecas Definições Data Collection   */

#include <bc9200a.h>

 

Após isso, devem ser definidos os pré-processadores com os intervalos da tela, título, tamanho da tela do coletor, e arquivo para gravação, por exemplo:

 

#define COL_TELA                            16                            /*Número de Colunas da tela*/

#define LIN_TELA                              8                              /*Número de Linhas da tela*/

#define REG_INI_1                             0                              /*Índice do primeiro registro da primeira tela*/

#define REG_FIM_1                           5                              /*Índice do último registro da primeira tela*/

#define TITULO_1              “Transf Mat ½ “   /*Título da primeira tela*/

>#define TITULO_1                            6                              /*Índice do primeiro registro da segunda tela*/

#define REG_FIM_2                          11                             /*Índice do segundo registro da segunda tela*/

#define TITULO_2              “Transf Mat 2/2”   /*Titulo da segunda tela*/

>#define ARQUIVO_GRAVAÇÃO       “d:bc9201.txt”            /*Arquivo para gravação do registro*/

 

Deve ser colocado o restante do código antes do MainBlock, e deve ser definido o número de campos que existem na tela, na declaração de quantos registros terá a estrutura, e na declaração global da matriz valor[][15].

 

/*Deve ser trocado o índice abaixo pelo número de registros da estrutura, que equivale ao número de campos */

Struct reg_campos_tela_campos_tela[12];

 

/*Variáveis Globais*/

int con_handle;

int handle_comm = -1;

 

/*Deve ser trocado o primeiro índice pelo número de registros da estrutura, que equivale ao número de campos da tela*/

char valor[12][15];

 

/*Declaração das Funções*/

void mostra_erro (int nr_erro);

void monta_string (char *registro);

short após_leitura(char titulo[], short,short);

 

/*Bibliotecas Funções Data Collection*/

#include <bc9200.h>

 

Inicialização da Estrutura de campos

/*Inicialização dos campos para construção do programa*/

 

campos_tela[0].cd_campo= 1;                                /*Número para identificação do campo*/

strcpy(campos_tela[0].label,”Estab”);                      /*Labeldo campo*/

strcpy(camos_tela[0].tipo,”int”);                              /*Tipo de dados do campo: “int”, “chr”, “dat” e “dec”*/

campos_tela[0].tamanho= 3;                                  /*Tamanho do campo para leitura*/

strcpy(campos_tela[0].inicial,”014”);                        /*Valorque é inicializado o campo*/

campos_tela[0].dec_ano = 0;                                                 /*Quant de decimais para o caso de ser uma campo “dec”, e quant de casas p/ ano no caso de ser “dat”*/

 

Essa inicialização deve ser repetida para cada campo enviado para a tela, variando o índice do registro, Ex: campos_tela[1], campos_tela[2] etc.

Quando o campo não solicita informação na tela, deve ser modificado o campo cd_campo para 0, que então é tratado internamente. Um exemplo desse procedimento está no programa bc9204.

 

Observação 1: Campo da estrutura que seja uma string sem valor, deve ser inicializada com o primeiro byte da string com ‘\0’.

Exemplo:

campos_tela[0].inicial[0] = ‘\0’

Observação 2: Campo da estrutura que seja uma string com valor, deve ser inicializado com a função strcpy.

Exemplo:

strcpy(campos_tela[0].label,”Estab”)

 

Após a inicialização da estrutura é criado o corpo do programa, se o programa tem somente duas telas, sendo a segunda repetitiva, pode-se seguir o modelo do corpo dos programas bc9201.c, bc9202.c e bc9205.c; nesse caso, o único ponto a ser alterado no corpo principal é o nome do programa, passando para função_execlp, que executa o programa de menu e aborta o atual.

 

Para uma estrutura mais complexa o programa ideal para se basear é o bc9203.c, preparado para quantas telas forem necessárias, com navegação independente.

No exemplo abaixo é utilizada a estrutura mais complexa.

Primeiro deve ser feita a validação de todas as telas do programa no seguinte código:

 

If((exec_erro = valida_tela(REG_INI_1,REG_FIM_1) == 1) && (valida_tela(REG_INI_2,REG_FIM_2)==1)

&&.....                ..........&& (valida_tela(REG_INI_6, REG_FIM_6) == 1))

 

O programa somente prossegue quando todas as telas estão OK.

Caso passe pela validação, é necessário entrar na tela inicial, que deve sempre se basear neste modelo, pois no caso de abortar essa tela, retorna ao menu:

 

if (tela== 1)

{

                do

                {

                               constroi_tela(TITULO_1,REG_INI_1, REG_FIM_1);

                                ex_erro = le_campos(REG_INI_1,REG_FIM_1);

                                if (exec_erro == 1)

                                {

                                                exit_erro = _execlp(“bc9200”,”bc9200”,”d:bc9203.exe”, NULL);

                                                if (exec_erro == 1)

                                                {

                                                                 mostra_erro(6);

                                                                 exit(0);

                                                                 }

                                                }

                                                tela = 2

                                }while((valor[3][0]<’1’)||(valor[3][0]>’3’));

               }

}                              

 

No exemplo acima existe um menu para navegação, onde a tela é identificada como 1,  seguindo os passos:

 •  Constrói a tela com o comando constroi_tela.

 •  Lê os campos com o comando le_campos, caso o comando le_campos retorne aborto da tela(1), o programa retorna ao menu principal.

 •  Valida a tela para a qual quer navegar, com o valor lido pelas funções.

 •  Fecha com o while, que obriga a tela a ser reconstruída, enquanto não possuir os valores desejados.

 

No próximo exemplo passa para a tela 2, que corresponde a tela de Reporte Repetitivo. Essa segunda tela é simples, ao terminar a leitura (caso correta), vai para outra tela sem se repetir.

 

if (tela== 2)

{

                switch(valor[3][0])

                {

                                case ’1’  : campos_tela[8].cd_campo = 0;

                                                     campos_tela[9].cd_campo = 0;

                                                     break;

                                case ’2’  : campos_tela[8].cd_campo = 9;

                                                     campos_tela[9].cd_campo = 0;

                                                    normal'>break;

                                case ’3’  : campos_tela[8].cd_campo = 0;

                                                     campos_tela[9].cd_campo = 10;

                                                     break;

               }

                do

               {

                                constroi_tela(TITULO_2,REG_INI_2,REG_FIM_2);

                                if(exec_erro = le_campos(REG_INI_2,REG_FIM_2) ! = 0)

                                {

                                                tela = 1;

                                                break;

                               }

                                tela = 3;

                }while (!após_leitura(TITULO_2,REG_INI_2,REG_FIM_2));

}

 

Assim, como no caso anterior, o programa:

 •  Constrói a tela.

 •  Lê os campos.

 •  O comando SWITCH faz a habilitação e desabilitação dos campos, conforme foi selecionado na primeira tela.

 •  No caso do usuário abortar, a tela não irá sair do programa, simplesmente atribui 1 para tela, retornando para a tela 1. Caso contrário, passa para a tela 3.

 •  Antes de sair é utilizada a função apos_leitura para fazer as validações e atualização de valores, se essa função retornar 0, ele entenderá como erro e voltará a pedir todos os registros, caso contrario, passa para a tela 3.

 •  A tela 3 é o último tipo de tela, é a tela final que é repetitiva, esta tela grava os registro, e o programa somente saíra dela quando o usuário abortar com a tecla “clear”.

 

f (tela == 3)

{

                do

                {

                                constroi_tela(TITULO_3,REG_INI_3,REG_FIM_3);

                                inicializa_campos(REG_INI_3,REG_FIM_3);

                                if(exec_erro= le_campos(REG_INI_3,REG_FIM_3) != 0)

                               {

                                                tela= 2;

                                                break;

                               }

                                tela = 3;

                }while(!apos_leitura(TITULO_3,REG_INI_3,REG_FIM_3));

                >if (exec_erro == 0)

                {

                                monta_string(registro);

                               erro_gravacao = grava_registro(registro,ARQUIVO_GRAVACAO);

                               if(erro_gravação!= 0)

                                                mostra_erro(erro_gravação);

                }

}

 

 •  Constrói a tela.

 •  Inicializa os campos, caso a tela se repetir não é necessário reconstruí-la cada vez, somente limpar os campos.

 •  Chama a função de leitura novamente, caso o usuário abortar a tela 2; saindo do bloco de leitura do registro, depois da validação, passa pela função monta_string, que retorna o registro construído no layout numa string. Passa a string para ser gravada no registro e caso o usuário não tenha escolhido abortar a tela, volta a pedir os campos da tela para gravação de um novo registro.

 

Observação: Depois desse bloco, o tronco do programa pode ser fechado.

 

Como Fazer a Transação Utilizar o Padrão Americano Para Decimais?

Para o programa obedecer ao padrão americano em campos decimais, é necessário alterar a constante NUM_TYPE que está definida no programa bc9200a.h para o valor “1”.

 

Como criar uma mensagem de ERRO?

Para criar uma nova mensagem de erro, deve ser adicionado na função mostra_erro um case no fim do switch, alimentado a variável desc_erro, e especificando um número para a função no case. Para mostrar a mensagem utilizar o código: mostra_erro (<nr erro>);

Para parametrizar a mensagem, é necessário definir uma variável global.

 

Como validar um registro ao fim de cada tela?

Colocar conforme nos exemplos, um bloco do... while... chamando a função apos_leitura, assim pode ser validado os registros.

A função apos_leitura recebe os valores do título da tela a ser validada, e quais os índices iniciais e finais dos campos que devem ser validados. Nessa função pode ser validado e atualizado os valores da tela.

Os valores validados estão na matriz valor, e possuem os mesmos índices da estrutura campos_tela correspondente. EX: O valor[4], e o valor digitado para o campo campos_tela[4].

Primeiro verificar se o campo validado corresponde a tela que está sendo validada, caso obedeça a essa condição, pode ser feita a validação ou atualização do valor do campo conforme solicitado. Caso contrario, a variável retorna_erro deve ter seu valor alterado para 0. Veja o exemplo abaixo:

 

           short retorna_erro = 1

            if (registro_fim == REG_FIM_2)

{

                                if(strcmp(valor[3],”0”)

                               {

                                                mostra_erro(15);

                                                retorna_erro = 0;

}

                                if (valor[5][0] != ‘\0’)

                                {

                                                mostra_erro(16);

                                                retorna_erro = 0;

                                }

               }

                if (registro_fim == REG_FIM_3)

                                int_to_float(valor[14], valor[14],dec_ano); /*faz conversão dos valores para “dec”*/

 

                if (retorna_erro == 0)

                                constroi_tela(titulo,registro_ini,registro_fim);

                return retorna_erro;

 

Observação Importante: Os campos decimais têm seus valores gravados como números inteiros. Para gravar com casas decimais, é necessário utilizar a função int_to_float na função após_leitura como no exemplo acima.

 

Como personalizar o layout de registro?

O Layout de exportação é construído na função monta_string, possibilitando personalizar o layout de forma exclusiva. A função recebe o ponteiro para uma string qualquer e grava sobre ela o registro dentro do layout, pronto para ser gravado no arquivo. Para importação pelo Data Collection, deve ser utilizado o caracter “|” para separação dos campos, e a string deve ser terminada com a soma dos caracteres asc 13 + 10; também deve ser cadastrado nos parâmetros do Data Collection o caracter “|” como separador.