• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Mcomando

[VB6] Convocam-se experientes em Crystal Reports! Esgotei...

6 mensagens neste tópico

É verdade, amigos. Estou "a partir pedra" quase há uma semana para dar a volta a um report para sair em VB6, CR versão 4.6.1.0, mas os meus 67 anos já esgotaram toda a paciência (na verdade, é assim que tenho aprendido o que sei).

O report é complicado, o princípio e o meio está dominado, mas o fim é que não consigo, até porque sou um "curioso" destas coisas.

Quem me ajuda? Espero a vossa compreensão.

:down:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Algum código ?

Pode sempre apresentar o seu código para se ver o que se pode fazer.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Algum código ?

Pode sempre apresentar o seu código para se ver o que se pode fazer.

Como eu dizia no post o report é muito complicado e como programo por objecto, não sei se é assim que se diz, fiz algumas fórmulas que cumprem o objectivo mas não na totalidade.

O que eu podia fazer, se isso me for for permitido, era enviar o report e a Bd e explicar o que ainda pretendo que saia no report.

Desde já agradeço o seu post.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Como eu dizia no post o report é muito complicado e como programo por objecto, não sei se é assim que se diz, fiz algumas fórmulas que cumprem o objectivo mas não na totalidade.

O que eu podia fazer, se isso me for for permitido, era enviar o report e a Bd e explicar o que ainda pretendo que saia no report.

Desde já agradeço o seu post.

Será que isto ajuda:

Com acesso a uma query de Acess e as fórmulas que deixo a seguir, não consigo printar todo o record, fica pelos dados do Titulo1.

O que estou fazendo de errado? Já há alguns dias que não consigo ultrapassar o problema, preciso de ajuda.

Titulos

if {RelatorioVisita1.DataMov} = {RelatorioVisita1.Data} and {Titulos.Titulos} = {RelatorioVisita1.RelatButano.Titulo1} then {Titulos.Titulos}
Else if {RelatorioVisita1.DataMov} = {RelatorioVisita1.Data} and {Titulos.Titulos} = {RelatorioVisita1.RelatButano.Titulo2} then {Titulos.Titulos}
Else if {RelatorioVisita1.DataMov} = {RelatorioVisita1.Data} and {Titulos.Titulos} = {RelatorioVisita1.RelatButano.Titulo3} then {Titulos.Titulos}
Else if {RelatorioVisita1.DataMov} = {RelatorioVisita1.Data} and {Titulos.Titulos} = {RelatorioVisita1.RelatButano.Titulo4} then {Titulos.Titulos}
Else if {RelatorioVisita1.DataMov} = {RelatorioVisita1.Data} and {Titulos.Titulos} = {RelatorioVisita1.RelatButano.Titulo5} then {Titulos.Titulos}
Else if {RelatorioVisita1.DataMov} = {RelatorioVisita1.Data} and {Titulos.Titulos} = {RelatorioVisita1.Titulo6} then {Titulos.Titulos}
Else if {RelatorioVisita1.DataMov} = {RelatorioVisita1.Data} and {Titulos.Titulos} = {RelatorioVisita1.Titulo7} then {Titulos.Titulos}
Else if {RelatorioVisita1.DataMov} = {RelatorioVisita1.Data} and {Titulos.Titulos} = {RelatorioVisita1.Titulo8} then {Titulos.Titulos}

Detalhes

if {RelatorioVisita1.CodClte} = {Filtros.CodClte} and {Titulos.Titulos} ={RelatorioVisita1.RelatButano.Titulo1} then {RelatorioVisita1.RelatButano.Assunto1}
Else if {RelatorioVisita1.CodClte} = {Filtros.CodClte} and {Titulos.Titulos} ={RelatorioVisita1.RelatButano.Titulo2} then {RelatorioVisita1.RelatButano.Assunto2}
Else if {RelatorioVisita1.CodClte} = {Filtros.CodClte} and {Titulos.Titulos} ={RelatorioVisita1.RelatButano.Titulo3} then {RelatorioVisita1.RelatButano.Assunto3}
Else if {RelatorioVisita1.CodClte} = {Filtros.CodClte} and {Titulos.Titulos} ={RelatorioVisita1.RelatButano.Titulo4} then {RelatorioVisita1.Assunto3a}
Else if {RelatorioVisita1.CodClte} = {Filtros.CodClte} and {Titulos.Titulos} ={RelatorioVisita1.RelatButano.Titulo5} then {RelatorioVisita1.RelatButano.Assunto4}
Else if {RelatorioVisita1.CodClte} = {Filtros.CodClte} and {Titulos.Titulos} ={RelatorioVisita1.Titulo6} then {RelatorioVisita1.RelatButano.Assunto5}
Else if {RelatorioVisita1.CodClte} = {Filtros.CodClte} and {Titulos.Titulos} ={RelatorioVisita1.Titulo7} then {RelatorioVisita1.Assunto6}
Else if {RelatorioVisita1.CodClte} = {Filtros.CodClte} and {Titulos.Titulos} ={RelatorioVisita1.Titulo8} then {RelatorioVisita1.Assunto7}

Edit Report

if {RelatorioVisita1.CodClte} = {Filtros.CodClte} and {RelatorioVisita1.DataMov} = {RelatorioVisita1.Data} then
{RelatorioVisita1.RelatButano.Titulo1} = {Titulos.Titulos} or 
{RelatorioVisita1.RelatButano.Titulo2} = {Titulos.Titulos} or
{RelatorioVisita1.RelatButano.Titulo3} = {Titulos.Titulos} or
{RelatorioVisita1.RelatButano.Titulo4} = {Titulos.Titulos} or
{RelatorioVisita1.RelatButano.Titulo5} = {Titulos.Titulos} or
{RelatorioVisita1.Titulo6} = {Titulos.Titulos} or
{RelatorioVisita1.Titulo7} = {Titulos.Titulos} or
{RelatorioVisita1.Titulo8} = {Titulos.Titulos}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Olá boa noite!

Não sei se isto te vai servir para alguma coisa ... talvez s/n

Aqui tens alguns comandos "Formulas"

============================================

Inicio do Documento - "Formulas Crystal Reports - Crystal Syntax.txt"

---------------------------------------------------------------------------------

O Documento abaixo foi traduzido do HELP do Crystal Reports versão 9

A maioria das informacoes deve ser compativel tambem com as versoes 8 e 8.5

Nome do Arquivo: Formulas Crystal Reports - Crystal Syntax.txt

NOTAS:

- Foi usada a CRYSTAL SYNTAX deliberadamente porque a BASIC SYNTAX eh mais facil

- Acentuacao foi deliberadamente omitida do documento para evitar problemas

- Criticas e sugestoes sao benvindas

---------------------------------------------------------------------------------

// Esta formula retorna o string "Alo Mundo!"

// Aqui outro comentario

"Alo Mundo"" // Comentarios podem ser adicionados no final da linha

// Comentários podem aparecer no final da formula

Como campos aparecem nas formulas:

Bancos de Dados, Parametros, Formulas, Totais e Campos de Expressoes SQL terao seus nome cercados por colchetes "{" "}"

Campos de Bancos de Dados sao retirados diretamente das Tabelas dos Bancos de Dados.

Exemplo: Database field: {Clientes.Nome}

Parametros, formulas, totais de controle, e nomes de expressoes SQL sao especificados quando criados.

Campos de Parametros tambem incluem a interrogacao: "?".

Exemplo: {?Meu campo de parametro}

Campos de Formula incluem o caracter arroba "@".

Exemplo: {@Outra formula}

Campos de totais incluem o caracter tralha "#".

Exemplo: {#meu total geral}

Campos de expressoes SQL incluem o caracer percentual "%".

Exemplo: {%minha expressao SQL}.

Campos de Soma. Exemplo: Sum({Vendas.Valor Venda}, {Vendas.Custo Envio}).

Campos de Grupo. Exemplo: GroupName({Vendas.Tipo de Envio}).

Formulas com CRYSTAL SYNTAX

Todas as formulas neste exemplo usam o Banco de Dados Xtreme.

Para saber quantos dias levaram para entregar um produto da data da ordem de compra,

voce pode subtrair a data de envio da data da ordem de compra.

Exemplo:

// Na formula abaixo sao usados campos do Banco de Dados

{Orders.Ship Date} - {Orders.Order Date}

Para achar o valor total em dolares de um dado produto, multiplicamos o valor unitario do produto pela quantidade solicitada.

Exemplo: {Orders Detail.Unit Price} * {Orders Detail.Quantity}

Para calcular o valor de venda de 80 porcento do valor unitario original.

Exemplo: {Orders Detail.Unit Price} * 0.80

Data (Data), Hora (Time) e Data e Hora (DataTime)

O tipo DateTime pode conter datas e horas, apenas datas ou apenas horas, sendo o mais versatil.

O tipo Date pode conter apenas DATAS.

O tipo Time pode conter apenas HORAS.

Os tipos Date e Time sao mais eficientes do que o tipo DateTime e podem ser usados em situacoes em que a Date e Hora nao sejam necessarias num mesmo campo.

Valores de Data e Hora devem ser informados entre os caracteres tralha "#" de diversas formas.

Importante: Campos Date-time nao podem ser divididos em mais de uma linha.

Exemplos:

#8/6/1976 1:20 am#

#August 6, 1976#

#6 Aug 1976 13:20:19#

#6 Aug 1976 1:30:15 pm#

#8/6/1976#

#10:20 am#

Usando CdateTime para converter string em Data e Hora.

Exemplo:

CDateTime ("8/6/1976 1:20 am")

CDateTime ("10:20 am")

Os literais Data e Hora sempre terao a data no formato US (mm/dd/yyyy)

e nao sao afetados pela configuracao de data local do computador.

Por outro lado usando configuracao local de DATAS para o Portugues teremos:

CDateTime ("22 agosto 1997") //Mesmo que #Aug 22, 1997#

Valores de Data e Hora podem ser tambem criados com Cdate e Ctime.

Exemplos:

CDate ("Aug 6, 1969")

CDate (1969, 8, 6) // Especificando Ano, Mes e Dia

// Convertendo DateTime para Date

CDate (#Aug 6, 1969#)

CTime ("10:30 am")

CTime (10, 30, 0) // Especificando Hora, Minuto e Segundo

CTime (#10:30 am#)

Variaveis Locais

Sao declaradas usando a palavra "Local" seguida do tipo de variavel ("Numeric" por exemplo) e da palavra "Var".

Exemplos:

// Declarando uma variavel Local numerica de nome "x"

Local NumberVar x;

// Declarando uma variavel Local string de nome "NomeCliente"

Local StringVar NomeCliente;

// Declarando uma variavel Local boleana de nome "FlagErro"

Local BooleanVar FlagErro;

Variaveis locais sao restritas a formula onde foram criadas,

isso significa que seu valor nao pode ser usado por outra formula.

Exemplos:

// Formula A

Local NumberVar x;

x := 10;

//Formula B

EvaluateAfter ({@Formula A})

Local NumberVar x;

x := x + 1;

Usando Variaveis GLOBAIS

Variaveis GLOBAIS sao declaradas usando a palavra "Global " seguida do tipo de variavel ("Numeric" por exemplo) e da palavra "Var".

Variaveis GLOBAIS sao usadas para fazer calculos mais complexos onde o resultado da formula depende de outras formulas ou grupos de dados.

Podem ser referenciadas em diversas formulas e em diferentes sessoes do relatorio.

Exemplos:

//Formula C

Global NumberVar x;

x := 10;

//Formula D

// Chama a funcao "WhileReadingRecords"

WhileReadingRecords;

Global NumberVar x;

x := x + 1

Usando Variaveis tipo ARRAY

Podemos criar variaveis tipo ARRAY.

Exemplos:

StringVar Array x := ["hello", "bye", "again"];  // Valor de x = ["hello", "bye", "again"]

x [2] := "once"; // Agora o valor x = ["hello", "once", "again"]

// A expressao abaixo vai causar um ERRO se for retirado o "//" do comentario

// porque o ARRAY x tem tamanho 3 (definido na sua criacao)

//x [4] := "zap";

// A formula abaixo retorna um String = "HELLO"

UpperCase (x [1])

As palavras reservadas "Redim" and "Redim Preserve"  podem ser usadas para redimensionar um array

se for necessario adicionar mais dados ao ARRAY.

"Redim" elimina os dados no ARRAY antes de redimensionar.

"Redim Preserve" preserva o conteudo do ARRAY antes de redimensionar.

Exemplos:

Local NumberVar Array x;

Redim x [2]; // Conteudo de x = [0, 0]

x [2] := 20; // Conteudo de x = [0, 20]

Redim x [3]; // Conteudo de x = [0, 0, 0]

x [3] := 30; // Conteudo de x = [0, 0, 30]

Redim Preserve x [4]; // Conteudo de x = [0, 0, 30, 0]

"finished"

Local StringVar Array a;

Redim a [2];

// Coloca valores nos elementos do ARRAY a

a[1] := "good";

a[2] := "bye";

// O operador "&" pode ser usado para concatenar strings.

a[1] & a[2] // A formula retorna o String = "goodbye"

Funcoes (Functions)

Quando usamos uma funcao(Funcition) na formula, devemos colocar o nome da funcao (Function) e os argumentos requeridos.

Por Exemplo, a funcao "Length (<variavel tipo string>) " requer um argumento tipo string e calcula o tamanho da string.

Local StringVar x := "hello";

Length (x) // A formula retorna  o Numero 5

Se passamos argumentos de tipo incorreto para a funcao, ocorre um erro.

Por exemplo, chamando "Lenght (3)" gera um erro porque a funcao "Lenght" nao aceita numero como argumento.

Funcoes em alguns casos podem aceitar strings ou numeros como argumentos.

Por exemplo, a funcao "CDate" pode aceitar um simples String como argumento para criar uma variavel "Date" ou 3 valores numericos que representam ano, mes e dia respectivamente para formar a Data.

Exemplos:

Local StringVar x := "hello";

Local StringVar y;

// A partir da posicao  2, va ate o final da string

y := Mid (x, 2); // o valor de y sera "ello"

// A partir da posicao 2, pegar 1 caracter

y := Mid (x, 2, 1) //o valor de y sera "e"

Funcoes Condicionais

Podemos criar formulas de acordo com certas condicoes.

Por exemplo, podemos mostrar o campo: "{Customer.Last Year's Sales}" para valores acima de 100000 em verde

e para valores abaixo de 15000 em vermelho. Todos os outros valores de vendas serao na cor preta (default).

Exemplos:

// Formatacao Condicional Exemplo 1

If {Customer.Last Year's Sales} > 100000 Then

   crGreen

Else If {Customer.Last Year's Sales} < 15000 Then

   crRed

Else

   crBlack

Ordem de precedencia

Em expressoes aritimeticas que involvem diversas operacoes existe uma ordem de precedencia.

O programa Crystal Reports calcula as expressoe da esquerda para a direita.

Entretanto algumas regras de precedencia sao seguidas da matematica basica.

Multiplicacao e Divisao sao executadas primeiro da esquerda para a direita e entao adicoes e subtracoes sao executadas.

Exemplos:

5 + 10 * 3 = 5 + 30 = 35.

Voce pode alterar a ordem de precedencia usando parenteses "()".

Exemplo:

(5 + 10) * 3 = 15 * 3 = 45.

É recomendado o uso de parenteses para controlar melhor o resultado de formulas complexas.

Lista dos operadores aritimeticos de precedencia maior para menor

Exponeciacao (^)

Negacao (-)

Multiplicacao, divisao, and porcentagem (*, /, %)

Divisao Inteira (\)

Modulo (Mod)

Adicao e Subtracao (+, -)

Campos NULOS (Null) e como usar "IsNull"

Em geral, quando o Crystal Reports encontra um valor "Null" em uma formula, a execucao da formula eh interrompida e nenhum valor eh retornado.

Se voce quer trabalhar com valores de campos tipo "Null" em uma formula, voce deve explicitar seu uso com algumas funcoes especiais.

A saber: IsNull, PreviousIsNull or NextIsNull.

Exemplos:

O campo "{Product.Color}" cotem cores basicas como "red" e "black" e mais duas palavras de descricao como "steel satin" e "jewel green".

Segue um exemplo de uma formula que imprime "basic" para as cores basicas e "fancy" para as outras.

// Inicio da Formula

If InStr({Product.Color}, " ") = 0 Then

    formula = "basic"

Else

    formula = "fancy"

// Final da Formula

A funcao "InStr" pesquisa a string "{Product.Color}" por um espaco em branco " ".

Se acha o espaco em branco, retorna a posicao e se nao encontra retorna 0 (zero).

Cores basicas terao apenas uma palavra ("red", "black") sem espaco em branco.

Para alguns produtos a cor pode nao ter sido informada, ou seja, seu conteudo no Banco de Dados é NULO.

Nesses casos a formula acima retornaria um erro. Para corrigir o problema usaremos "IsNull".

// Inicio da Formula com IsNull

If IsNull({Product.Color}) Or

   InStr({Product.Color}, " ") = 0 Then

   "basic"

Else

   "fancy"

// Final da Formula

Quando o Crystal Reports avalia a condicao:

IsNull({Product.Color}) Or

InStr({Product.Color}, " ") = 0

Primeiro eh verificado "IsNull ({Product.Color))",

se retorna "True" ele sabe que existe pelo menos uma condicao verdadeira e nao necessita olhar o resto da condicao.

InStr({Product.Color}, " ") = 0

Em outras palavras, o Crystal Reports para de avaliar o resto da condicao quando ele ja sabe o resultado de toda a condicao.

No exemplo a seguir, a formula previne a divisao por zero no caso de "demon = 0".

Local NumberVar num;

Local NumberVar denom;

...

If denom <> 0 And num / denom > 5 Then

...

NOTA: Visual Basic nao suporta essa tecnica, porque todas as partes da condicao no Visual Basic sao testadas, mesmo sem necessidade.

Condicao SE/ENTAO/SENAO (If/Then/Else)

Suponha que uma empresa queira taxar a renda de seus empregados (variavel "income").

Segundo as seguintes regras:

Se "income" menor que $8000 nao existe taxa.

Se "income" entre $8000 e $20000 taxa sera de 20% (variavel "tax").

Se "income" entre $20000 e $35000 taxa sera de 29%.

Se "income" acima de $35000 taxa sera de 40%.

// Condicao Se/Entao/Senao - Exemplo 5

Local CurrencyVar tax := 0;

Local CurrencyVar income := {Employee.Salary};

Local StringVar message := "";

If income < 8000 Then

(

   message := "no";

   tax := 0

)

Else If income >= 8000 And income < 20000 Then

(

   message := "lowest";

   tax := (income - 8000)*0.20

)

Else If income >= 20000 And income < 35000 Then

(

   message := "middle";

   tax := (20000 - 8000)*0.20 + (income - 20000)*0.29

)

Else

(

   message := "highest";

   tax := (20000 - 8000)*0.20 + (35000 - 20000)*0.29 +

          (income - 35000)*0.40

);

// Usando 2 casas decimais e virgula como separador de milhares

Local StringVar taxStr := CStr (tax, 2, ",");

"You are in the " & message & " tax bracket. " &

"Your estimated tax is " & taxStr & "."

NOTA: No exemplo acima sao executadas duas expressoes quando as condicoes sao atendidas.

Uma coloca o valor na variavel "tax" e outra uma mensagem na variavel "message".

A expressao "If" eh uma expressao, em outras palavras, verifica uma condicao, se nao existe

uma clausula "Else" e a condicao nao for verdadeira entao o valor eh o valor "default"

Exemplo:

If Length ({Employee.First Name}) < 5 Then

   "short"

Na expressao "If" acima eh retornado o valor de uma string.

Se o valor da string eh "short", o primeiro nome do empregado tem tamanho menor que 5.

Em todos os outros casos o retorno serah "".

Considera a formula:

If Year({Orders.Order Date}) >= 1995 Then

   {Orders.Order Date}

Se o campo "{Orders.Order Date}" for anterior a 1995 a expressao acima retorna "Null" no valor de "DateTime".

O valor "Null" de "DateTime" nao eh impresso pelo Crystal Reports.

Desta forma se esta formula for colocada em um relatorio, o campo aparecera em "branco" para datas anteriores a 1995.

Segue um exemplo que ilustra o uso dos parenteses "()" para mais de uma expressao executada

Uma empresa cobra 5 porcento de taxa para ordens entregues em 3 dias e 2 porcento nos outros casos.

Se quer imprimir a mensagem: "Rush shipping is $100.00" ou "Regular shipping is $20.00" quando apropriada.

// Inicio da Formula

Local StringVar message;

Local CurrencyVar ship;

If {Orders.Ship Date} - {Orders.Order Date} <= 3 Then

(

   message := "Rush";   // O ponto e virgula ";" no final da linha eh opcional

   ship := {Orders.Order Amount} * 0.05

) // NAO pode ser colocado ";" aqui

Else

(

   message := "Regular";

   ship := {Orders.Order Amount} * 0.02;

); // O ponto e virgula aqui ";" eh requerido para separar

// a expressao "If" do final da expressao abaixo

message & " shipping is " & CStr (ship)

// Final da Formula

Quando expressoes sao grupadas juntas com parenteses "()", todo o grupo entre os parenteses são considerados uma expressao simples.

// Expressao grupada entre parenteses

(

   // Primeira parte da expressao eh do tipo string

   message := "Rush";

   // A segunda parte da expressao eh to tipo "Currency"

   ship := {Orders.Order Amount} * 0.05;

)

Por exemplo, a formula a seguir da ERRO.

A razao do erro eh que a parte "Then" da instrucao "If" retorna um valor tipo "Currency"

e a parte "Else" retorna um valor tipo "String"

Isto nao eh permitido, porque a expressao "If" deve sempre retornar um mesmo tipo valor no "Then" e no "Else".

//Exemplo de Formula COM ERRO

Local StringVar message;

Local CurrencyVar ship;

If {Orders.Ship Date} - {Orders.Order Date} <= 3 Then

(

   message := "Rush";

   ship := {Orders.Order Amount} * 0.05

)

Else

(

   // As duas linhas a seguir foram trocadas

   ship := {Orders.Order Amount} * 0.02;

   message := "Regular";

);

message & " shipping is " & CStr (ship)

Uma maneira de corrigir a formula acima sem necessidade de cuidar da ordem das expressoes eh fazer

com que a expressao "If" retorne um valor constante (por exemplo o numero "0").

// Corrigindo a formula errada acima

Local StringVar message;

Local CurrencyVar ship;

If {Orders.Ship Date} - {Orders.Order Date} <= 3 Then

(

   message := "Rush";

   ship := {Orders.Order Amount} * 0.05;

   0

)

Else

(

   ship := {Orders.Order Amount} * 0.02;

   message := "Regular";

   0

);

message & " shipping is " & CStr (ship)

// Final da Formula

Expressao Condicional "Select"

A expressao "Select" eh similar a expressao "If". Entretanto voce pode criar formulas mais "claras"

e intuitivas usando a expresso "Select" em vez de "If" e "Else If".

Por exemplo, avaliando o campo do Banco de Dados "{Customer.Fax}" para determinar se:

Codigo de area eh Estado de Washington (206, 360, 509) ou British Columbia no Canada (604,250)

// Select Exemplo 1

Select {Customer.Fax}[1 To 3]

   Case "604", "250" :

      "BC"

   Case "206", "509", "360" :

      "WA"

   Default :

      "";

// Final do Exemplo 1

A expressao a direita da palavra "Select" eh chamada de "Condicao Select".

No exemplo acima, se {Customer.Fax}[1 To 3], A expressao "Select" tenta achar no primeiro "Case"

um codigo de area que combine e entao executa o que esta depois dos "dois pontos" ":".

A condicao "Defaul" eh executada para os outros casos.

Verifique que existe tambem um ":" a direita de "Default"

// Mesmo Efeito do Select do Exemplo 1 - Usando "If" e "Else If"

Local StringVar areaCode := {Customer.Fax}[1 To 3];

If areaCode In ["604", "250"] Then

   "BC"

Else If areaCode In ["206", "509", "360"] Then

   "WA"

Else

   "";

// Final do Exemplo 1

A Nova formula abaixo grupa o numero de indicacoes ao oscar de um filme nas categorias:

"low", "medium", "high" ou "extreme" e no processo mostra algumas das possibilidades

// Select example 2

Select {movie.NOM}

   Case 1,2,3, Is < 1 :

   (

      // Podem existir outras expressoes entre os parenteses

      10 + 20;

      "low"

   )

   Case 4 To 6, 7, 8, 9 :

      "medium"

   Case 10 :

      "high"

   Default :

      "extreme"

// Final do Exemplo 2

A Clausula "Default" em uma expressao "Select" eh opcional.

Se a clausula "Default" nao existir e nenhuma das opcoes foi atendida, a expressao "Select"

vai retornar o valor "Default" to tipo de expressao (no caso acima um "" - string vazio).

Por exemplo, na formula acima se a clausula "Default" nao existisse, e o valor de "{movie.NOM}" = 11,

o retorno do "Select" seria um string "" (vazio).

Loops FOR

Os Loops FOR permitem a execucao de uma sequencia de expressoes um determinado numero de vezes.

Os loops FOR devem ser usados quando sabemos antecipadamente o numero de vezes que as expressoes devem ser executadas.

Verifique a "Sintaxe" dos loop FOR nos exemplos a seguir:

Exemplo 1

Suponha que voce queira inverter o conteudo da string "{Customer.Customer Name}"

Por exemplo: de "City Cyclists" para "stsilcyC ytiC".

// Invertendo um string - Versao 1

Local StringVar str := "";

Local NumberVar strLen :=

   Length ({Customer.Customer Name});

Local NumberVar i;

For i := 1 To strLen Do

(

   Local NumberVar charPos := strLen - i + 1;

   str := str + {Customer.Customer Name}[charPos]

);

str

// Final do Exemplo 1

Examine como a formula acima funciona.

O tamanho do string contido no campo "{Customer.Customer Name}" eh colocado na variavel "strLen".

O loop FOR sera executado de 1 ate o tamanho do campo "{Customer.Customer Name}" indicado na variavel "strLen".

A variavel "str" comeca VAZIA e vai armazenado os caracteres a cada execucao do comando FOR,

de forma a conter ao final do FOR todos os caracteres de "{Customer.Customer Name}" invertidos.

Exemplo 2

Aqui mostramos uma versao simplificada da formula acima

usando a clausula "Step" com o valor negativo "-1".

// Invertendo um string - Versao 2

Local StringVar str := "";

Local NumberVar strLen :=

   Length ({Customer.Customer Name});

Local NumberVar i;

For i := strLen To 1 Step -1 Do

(

   str := str + {Customer.Customer Name}

);

str

// Final do Exemplo 2

Exemplo 3

A forma mais simples de se inverter um string eh usando a funcao "StrReverse" como a seguir:

// Invertendo um string - Versao 3

StrReverse ({Customer.Customer Name})

As funcoes para manipulacao de string incluidas no Crytal Reports 8.5 podem executar diversas modificacoes

nas variaveis tipo string que seriam tradicionalmente feitas com loops FOR ou outros tipos de loops.

Outro exemplo de loop FOR

Segue um exemplo completo da mais poderosa facilidade de processamento do Crystal Reports.

"The Caesar cipher" eh um codigo simples tradicionalmente creditado a "Julius Caesar".

Nesse codigo, cada letra da palavra eh trocada por outra letra no alfabeto cinco posicoes a frente.

Por exemplo: A string "Jaws" se tornaria "Ofbx". Verifique que o "w" eh trocado por "b".

Segue a formula que implementa "The Caesar cipher" ao campo "{Customer.Customer Name}" no

Banco de Dados Xtreme:

//The Caesar cipher

// String de entrada para encriptar

Local StringVar inString := {Customer.Customer Name};

Local NumberVar shift := 5;

Local StringVar outString := "";

Local NumberVar i;

For i := 1 To Length(inString) Do

(

   Local StringVar inC := inString ;

   Local StringVar outC;

   Local BooleanVar isChar :=

   LowerCase(inC) In "a" To "z";

   Local BooleanVar isUCaseChar :=

   isChar And (UpperCase (inC) = inC);

   inC := LCase(inC);

   If isChar Then

   (

      Local NumberVar offset :=

         (Asc(inC) + shift - Asc("a")) Mod

         (Asc("z") - Asc("a") + 1);

      outC := Chr(offset + Asc("a"));

      If isUCaseChar Then outC := UpperCase(outC)

   )

   Else

      outC := inC;

   outString := outString + outC

);

outString

// Final da Formula

No exemplo acima tem uma expressao "If" concatenada com um bloco de expressao FOR.

Essa expressao "If" eh responsavel para precisamente deslocar (shift) um simples caracter.

Por exemplo, letras sao tratadas diferentemente de pontuacao e espacos que nao sao codificados.

O importante nesse exemplo sao as estruturas de controle, que podem ser combinadas com outras

estruturas e controle e com multiplas expressoes incluidas entre parenteses.

Usando "Exit For"

Voce pode sair de um loop FOR usando a instrucao "Exit For".

O exemplo a seguir, pesquisa o array "Global" de nomes procurando o nome "Fred".

Se o nome eh encontrado, retorna o indice do nome no array, se nao encontrou retorna -1.

Suponhamos o conteudo do array sendo:

["Frank", "Helen", "Fred", "Linda"]

Entao a execucao da formula abaixo retorna o valor 3.

// Inicio da Formula

Global StringVar Array names;

// O array "names" foi criado e inicializado em outra formula

// seu conteudo eh: ["Frank", "Helen", "Fred", "Linda"]

Local NumberVar i;

Local NumberVar result := -1;

// A funcao "UBound" retorna o tamanho do array

For i := 1 to UBound (names) Do

(

   If names = "Fred" Then

   (

      result := i;

      Exit For

   )

);

result

// Final da Formula

Quando considerado como uma expressao o loop FOR sempre retorna um valor "Boolean" igual a "True".

Desta forma voce nunca devera querer um loop FOR como ultima expressao de uma formula,

porque o resultado da formula seria sempre "True" em vez do resultado esperado.

Exemplo de Loop "While ... Do"

O exemplo abaixo pesquisa pela primeira ocorrencia de um caracter "numerico" num string de entrada.

Se um numero eh encontrado, a formula retorna a posicao do numero no string de entrada,

se nao for encontrado retorna -1.

No exemplo, o string de entrada eh uma constante de valor: "The 7 Dwarves",

mas poderia ser um campo string de um Banco de Dados, por exemplo.

Na execucao da formula o resultado sera a posicao 5 onde o numero 7 eh encontrado.

// Inicio da Formula

Local StringVar inString := "The 7 Dwarves";

Local NumberVar strLen := Length (inString);

Local NumberVar result := -1;

Local NumberVar i := 1;

While i <= strLen And result = -1 Do

(

   Local StringVar c := inString ;

   If NumericText © Then

      result := i;

   i := i + 1;

);

result

// Final da Formula

Mecanismo seguro para loops FOR

Existe um mecanismo seguro para prevenir que um relatorio possa entra num loop inifinito.

Qualquer execucao de uma formula pode ter ate 100.000 loops.

Isso serah explicado no exemplo a seguir.

// Inicio da Formula

Local NumberVar i := 1;

While i <= 200000 Do

(

   If i > {movie.STARS} Then

      Exit While;

   i := i + 1

);

20

// Final da Formula

Se o valor de "{movie.STARS}" eh maior que 100.000 entao a condicao do loop (i <= 200000)

sera executada mais vezes do que o maximo permitido e uma mensagem de erro eh mostrada.

No exemplo abaixo a formula tambem dispara o mecanismo seguro, porque o total de loops

serah de 40001 + 70001.

// Inicio da Formula

Local NumberVar i := 1;

For i := 1 To 40000 Do

(

   Sin (i);

);

i := 1;

While i <= 70000 Do

(

   i := i + 1;

)

// Final da Formula

Limitacoes (Crystal syntax)

- Tamanho maximo de uma constante string, valor string em uma variavel,

  string retornado por uma funcao ou string em um array sera de 65.534 caracteres

- Tamanho maximo de um array 1000 elementos

- Numero maximo de argumentos para uma funcao eh 1000

- Numero maximo de loops em estruturas condicionais eh 100.000

- Funcoes de Data e Hora usadas no Visual Basic. Aceitas datas a partir do ano 100 ate o ano 9999

- Funcoes de Data e Hora no Crytal Reports tradicional. Aceitas datas a partir do ano 1 ate o ano 9999

---------------------------------------------------------------------------------

Final do Documento - "Formulas Crystal Reports - Crystal Syntax.txt"

============================================

Até+

programadorvb6

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Obrigado, programadorvb6.

As informações que recebi são sempre de muito utilidade para quem gosta de trabalhar nestas coisas.

Mas, sabes, amigo, eu estou a dar a volta ao problema, esquecendo o que já tinha feito e me deu muito trabalho. Mandar abaixo qualquer coisa é sempre um problema para nós.

Optei por modificar bd, simplifiquei, e são mais uns dias para voltar até ao ponto onde já estava.

O report final, com esta nova versão, penso que o domino melhor.

Cumprimentos

:)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora