quinta-feira, 29 de setembro de 2016

Calcular a quantidade máxima de OCCURS

Olá!

Em programas que possuem lista de registros na área de dados de comunicação (entrada/saída de dados do programa), onde a quantidade de ocorrências da lista tem que ser determinada para aproveitar todo o espaço da área de dados. Ou seja, se as variáveis que não estão na lista ocupam 20 % do espaço da área de dados, os outros 80% podem ser ocupados com os dados da lista.

Assim, para determinar a quantidade máxima de ocorrências que a lista possa assumir, de modo a aproveitar todo espaço de dados, é necessário realizar a avaliação do espaço que está sendo utilizado pelas variáveis que não estão na lista; do tamanho de cada registro da lista, e do tamanho do espaço da área de dados do programa.

Por exemplo, se cada registro da consulta tiver o tamanho de 1.5 MB e a rotina utilizar comunicação via COMMAREA, o número máximo de registros que poderão ser passados a cada vez para a outra camada é de 21 registros. Porque o tamanho máximo suportado em COMMAREA é de 32.7 MB e divido pelo tamanho do registro que é 1.5 MB, temos o resultado de 21.8 que representa o número de vezes que podemos repetir o tamanho desse registro, ou seja, podemos passar até 21 registros para a outra camada.

Para simplificar o cálculo básico para definir a quantidade registros que podem ser trafegados entre as camadas, é: A = (B - C) / D.
Onde:
  • A - Número de ocorrências
  • B - Tamanho da área de comunicação
  • C - Parte de dados fixa
  • D - O tamanho de cada registro

Exemplo de cálculo com o book abaixo para comunicação COMMAREA.

Book SEM numero de ocorrencias - FELIPE BARBOSA FERREIRA

A - ??
B - 32.7 MB
C - 127 bytes
D - 1.5 MB

A = (32700 - 127) / 1500

Logo, o resultado de A = 21,71, como não existe 0,71 de ocorrência, então arredondamos para baixo, 21 ocorrências possíveis. Assim, o book de exemplo pode conter além da parte fixa, uma lista com até 21 ocorrências.

Para facilitar a leitura e codificação dos controles de laço de repetição que manipularam os campos da lista, é uma boa prática definir o total ocorrências com números que contenham o final em zero, exemplo: 10; 20; 50; 100; 200; 500; 1000; 1500; 2000.

Book com número de ocorrências definido:

Book com numero de ocorrencias - FELIPE BARBOSA FERREIRA

Agora, pense na situação em que por exemplo a lista de resposta do programa somente consiga transportar 20 registros, entretanto na base de dados (DB) há 100 registros para a resposta do programa, assim se executarmos o programa irá faltar 80 registros. Para que seja retornado todos os 100 registros, será necessário criar um controle de reprocessamento, para que sejam processados os 20 primeiros registros e depois os demais registros que estão contidos no DB. Este controle será apresentado no próximo post!

Consultar a relação de Termos e Abreviaturas acesse aqui.
FELIPE BARBOSA FERREIRA
Até o próximo post!

domingo, 18 de setembro de 2016

Verificar a quantidade de espaço usada da área de dados

Olá!

Para que não seja ultrapassado o limite da quantidade de dados que podem ser transitados entre os programas, é necessário realizar a verificação do tamanho da área de dados que está sendo utilizada pelo programa.

Em um programa que não possui lista de registros, a verificação consiste em apenas fazer o somatório dos tamanhos das variáveis que são usadas para receber e enviar dados do programa, se o resultado do somatório ultrapassar o limite suportado pela área de dados será necessário analisar a situação. Exemplo:

Área de dados:
           03 REQUISICAO.
      * --    OBRIGATORIOS
               05 CD-ALUNO                       PIC  9(009) COMP.
      *
           03 RESPOSTA.
      * --    CONTROLE DE ERRO
               05 CD-ERRO                        PIC  9(009) COMP.
               05 TX-ERRO                        PIC  X(120).
      * --    DADOS PROCESSADOS
               05 NM-ALUNO                       PIC  X(050).

Somatório = 4 + 4 + 120 + 50
Somatório = 178 bytes

Note que variáveis compactadas ocupam um espaço menor, e para o cálculo do somatório é utilizado os valores que cada variável usa/ocupa de espaço na área de dados.

Para os programas que possuem lista de registros, é necessário realizar o cálculo da seguinte forma:

Somatório = somatorioVariaveisFixas + (quantidadeDeOcorrencias * (somatorioVariaveisLista))

Área de dados com lista:
           03 REQUISICAO.
      * --    OBRIGATORIOS
               05 CD-ALUNO                       PIC  9(009) COMP.
      *
           03 RESPOSTA.
      * --    CONTROLE DE ERRO
               05 CD-ERRO                        PIC  9(009) COMP.
               05 TX-ERRO                        PIC  X(120).
      * --    DADOS PROCESSADOS
               05 LS-ALUNOS OCCURS 10 TIMES.
                   05 NM-ALUNO                   PIC  X(050).
                   05 NM-ALUNO-SOBRENOME         PIC  X(050).

somatorioVariaveisFixas = 4 + 4 + 120
somatorioVariaveisFixas = 128

quantidadeDeOcorrencias = 10

somatorioVariaveisLista = 50 + 50
somatorioVariaveisLista = 100

Somatório = 128 + (10 * 100)
Somatório = 1128 bytes

Repare que mesmo neste exemplo que possui variáveis com tamanhos relativamente pequenos, quando realizado o cálculo para verificar a área total utilizada para conter as informações, o resultado se apresenta maior do que o esperado, pois nenhuma variável possui o tamanho um tamanho "grande" e já está sendo usado mais de 1 MB de espaço.

Então, considerando que aplicações em cenários reais usam mais variáveis, ou até mesmo mais de uma lista na área de dados do programa, é recomendável realizar está simples verificação nos programas desenvolvidos. 

Consultar a relação de Termos e Abreviaturas acesse aqui.
FELIPE BARBOSA FERREIRA

Até o próximo post!

sábado, 3 de setembro de 2016

Quantidade de dados suportados Commarea / Container

Olá!

No post anterior foi apresentado como realizar a codificação de um programa para consultar os registros do banco de dados (DB), ou seja, realizar um Select e retornar todos os registros.

Agora pense que o desenvolvimento da aplicação será sobre o padrão de arquitetura MVC, e que tenha que retornar os registros para o usuário.


Logo, quando o usuário realizar uma requisição na camada de apresentação, sabemos que a rotina que realiza o Select estará na camada de modelos e deve repassar os dados da consulta, para uma rotina que está na camada de controles, que por sua vez essa rotina da camada de controles passa o resultado para a camada de apresentação. Para melhor entendimento veja a ilustração abaixo:

tramite de dados entre as camadas - felipe barbosa ferreira
Tramite de dados entre as camadas

Assim, tenha o foco no transito dos dados do programa que realiza a consulta no DB que está na camada de modelos, para o programa da camada de controle. Pois há um limite da quantidade de dados que podem ser transitadas entre a camadas.

Limite de dados? Qual é o limite máximo suportado?

Se a rotina que realiza o Select é construída para utilizar comunicação via COMMAREA, então a sua área de comunicação de dados possui o tamanho máximo de 32.700 bytes. Caso essa rotina utilize comunicação via container, o tamanho máximo cresce, veja na tabela abaixo:

Tipo de comunicaçãoTamanho máximo suportado
COMMAREA32.7 MB
Container Storage 24-bit 16 MB
Container Storage 31-bit 2 GB
Container Storage 64-bit > 2 GB e < 512 TB

Note que para o tipo de comunicação Container Storage 31-bit e 64-bit, o total de dados suportados é "alto". Mas lembre-se que dependendo da estrutura física e lógica da aplicação quanto maior é tamanho/fluxo dos dados que são trafegados, mais demorado ser o processamento dos dados, podendo resultar em uma perda significativa de performance.

Deste modo é necessário avaliar quantidade de registros que uma consulta irá retornar, para assim ter a ideia da quantidade de espaço que será utilizada para transitar os dados entre as camadas.

Pois imagine que ao construir um programa que utilize comunicação via COMMAREA, e realiza uma consulta que retorne 1 GB de dados que devem ser passados em uma única vez para a outra camada. ERRO: limite de área ultrapassado. Pois, o tamanho máximo para COMMAREA é de 32.7 MB.

Então, para construir um programa deve se estar atento de como/quanto será a utilização do espaço da área de dados, pois se o limite da área de comunicação for ultrapassado a execução do programa se finalizada com erro (ABEND).

As referências técnicas para este post estão em:
  1. IBM - Passing data to other programs
  2. IBM - COMMAREA or channel data structures
  3. IBM - Exploitation of 64-bit storage by CICS TS
  4. Using IBM CICS Transaction Server Channels and Containers
  5. What is the 64-bit address space?
Veja no próximo post, como calcular a quantidade de registros (OCCURS) que podem ser trafegados entre as camadas.

Consultar a relação de Termos e Abreviaturas acesse aqui.
FELIPE BARBOSA FERREIRA

Até o próximo post!