Formulas Crystal Reports

download Formulas Crystal Reports

of 14

Transcript of Formulas Crystal Reports

Final do Documento - "Formulas Crystal Reports.txt"---------------------------------------------------------------------------------O Documento abaixo foi traduzido do HELP do Crystal Reports verso 9A maioria das informacoes deve ser compativel tambem com as versoes 8 e 8.5Nome do Arquivo: Formulas Crystal Reports.txtData da Criacao: 5 Julho 2007Ultima Alteracao: 6 Julho 2007Roberto Marques - Email: [email protected]:- 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 formulaComo 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 SYNTAXTodas 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.80Data (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 DateCDate (#Aug 6, 1969#)CTime ("10:30 am")CTime (10, 30, 0) // Especificando Hora, Minuto e SegundoCTime (#10:30 am#)Variaveis LocaisSao 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 BEvaluateAfter ({@Formula A})Local NumberVar x;x := x + 1;Usando Variaveis GLOBAISVariaveis 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 CGlobal NumberVar x;x := 10;//Formula D// Chama a funcao "WhileReadingRecords"WhileReadingRecords;Global NumberVar x;x := x + 1Usando Variaveis tipo ARRAYPodemos 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 arrayse 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 aa[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 () " requer um argumento tipo string e calcula o tamanho da string.Local StringVar x := "hello";Length (x) // A formula retorna o Numero 5Se 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 stringy := Mid (x, 2); // o valor de y sera "ello"// A partir da posicao 2, pegar 1 caractery := 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 verdee para valores abaixo de 15000 em vermelho. Todos os outros valores de vendas serao na cor preta (default).Exemplos:// Formatacao Condicional Exemplo 1If {Customer.Last Year's Sales} > 100000 Then crGreenElse If {Customer.Last Year's Sales} < 15000 Then crRedElse crBlackOrdem 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 menorExponeciacao (^) 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 FormulaIf InStr({Product.Color}, " ") = 0 Then formula = "basic"Else formula = "fancy"// Final da FormulaA 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 IsNullIf IsNull({Product.Color}) Or InStr({Product.Color}, " ") = 0 Then "basic"Else "fancy"// Final da FormulaQuando o Crystal Reports avalia a condicao:IsNull({Product.Color}) OrInStr({Product.Color}, " ") = 0Primeiro 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}, " ") = 0Em 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 5Local 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 milharesLocal 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 existeuma 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 FormulaLocal StringVar message;Local CurrencyVar ship;If {Orders.Ship Date} - {Orders.Order Date}