Você está na página 1de 23

Final do Documento - "Formulas Crystal Reports.

txt"
-------------------------------------------------------------------------------O Documento abaixo foi traduzido do HELP do Crystal Reports verso 9
A maioria das informacoes deve ser compativel tambem com as versoes 8 e
8.5
Nome do Arquivo: Formulas Crystal Reports.txt
Data da Criacao: 5 Julho 2007
Ultima Alteracao: 6 Julho 2007
Roberto Marques - Email: rmarques@rmlc.com.br
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
// Comentrios podem aparecer no final da formula
Como campos aparecem nas formulas:
Bancos de Dados, Parametros, Formulas, Totais e Campos de Expressoes
SQL terao s
eus nome cercados por colchetes "{" "}"
Campos de Bancos de Dados sao retirados diretamente das Tabelas dos
Bancos de Da
dos.
Exemplo: Database field: {Clientes.Nome}
Parametros, formulas, totais de controle, e nomes de expressoes SQL sao
especifi
cados 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 com
pra,
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 un
itario 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 usad

os 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 di
versas 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" p
or 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 v
ariavel ("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
relatori
o.
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 redim
ensionar 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 tip
o 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 ace
ita 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 valore
s acima de 100000 em verde
e para valores abaixo de 15000 em vermelho. Todos os outros valores de
vendas se
rao 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 p
recedencia.
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
ent
ao 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 co
mplexas.
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 ex
ecucao da formula eh interrompida e nenhum valor eh retornado.
Se voce quer trabalhar com valores de campos tipo "Null" em uma formula,
voce de
ve 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 p
alavras de descricao como "steel satin" e "jewel green".
Segue um exemplo de uma formula que imprime "basic" para as cores
basicas e "fan
cy" 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
usarem
os "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 n
ecessita 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 "incom
e").
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 at
endidas.
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
"de
fault"
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
expressa
o executada
Uma empresa cobra 5 porcento de taxa para ordens entregues em 3 dias e
2 porcent
o 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 so 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
"C
urrency"
e a parte "Else" retorna um valor tipo "String"
Isto nao eh permitido, porque a expressao "If" deve sempre retornar um
mesmo tip
o 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 e
xpressoes 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
for
mulas 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
determina
r se:
Codigo de area eh Estado de Washington (206, 360, 509) ou British
Columbia no Ca
nada (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 cate
gorias:
"low", "medium", "high" ou "extreme" e no processo mostra algumas das
possibilid
ades
// 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
express
ao "Select"
vai retornar o valor "Default" to tipo de expressao (no caso acima um "" strin
g vazio).
Por exemplo, na formula acima se a clausula "Default" nao existisse, e o
valor d
e "{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 n
umero de vezes.
Os loops FOR devem ser usados quando sabemos antecipadamente o
numero de vezes q
ue 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 v
ariavel "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 Nam
e}" 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}[i]
);
str
// Final do Exemplo 2
Exemplo 3

A forma mais simples de se inverter um string eh usando a funcao


"StrReverse" co
mo a seguir:
// Invertendo um string - Versao 3
StrReverse ({Customer.Customer Name})
As funcoes para manipulacao de string incluidas no Crytal Reports 8.5
podem exec
utar diversas modificacoes
nas variaveis tipo string que seriam tradicionalmente feitas com loops FOR
ou ou
tros tipos de loops.
Outro exemplo de loop FOR
Segue um exemplo completo da mais poderosa facilidade de processamento
do Crysta
l Reports.
"The Caesar cipher" eh um codigo simples tradicionalmente creditado a
"Julius Ca
esar".
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 [i];
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 FO
R.
Essa expressao "If" eh responsavel para precisamente deslocar (shift) um
simples
caracter.
Por exemplo, letras sao tratadas diferentemente de pontuacao e espacos
que nao s
ao codificados.
O importante nesse exemplo sao as estruturas de controle, que podem ser
combinad
as 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 ret
orna -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 [i] = "Fred" Then
(
result := i;
Exit For
)
);
result
// Final da Formula
Quando considerado como uma expressao o loop FOR sempre retorna um
valor "Boolea
n" igual a "True".
Desta forma voce nunca devera querer um loop FOR como ultima expressao
de uma fo
rmula,

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 e
ntrada,
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
encontrad
o.
// 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 [i];
If NumericText (c) 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 i
nifinito.

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 mo
strada.
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
caractere
s
- 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 1
00 ate o ano 9999
- Funcoes de Data e Hora no Crytal Reports tradicional. Aceitas datas a
partir d
o ano 1 ate o ano 9999
-------------------------------------------------------------------------------Final do Documento - "Formulas Crystal Reports.txt"

Você também pode gostar