dicas delphi

Download Dicas Delphi

Post on 28-Nov-2014

162 views

Category:

Documents

6 download

Embed Size (px)

TRANSCRIPT

http://www.arquivodecodigos.net/dicas/delphi-efetuando-calculos-de-porcentagem-emdelphi-2707.html

Efetuando clculos de porcentagem em Delphi Clculos de porcentagens esto presentes em boa parte das aplicaes que desenvolvemos. Porm, h momentos em que a mente trava e no conseguimos lembrar com clareza como estes clculos so feitos, principalmente em Delphi. Esta anotao tem o objetivo de ser uma fonte de pesquisa para os momentos em que suas habilidades matemticas insistirem em continuar ocultas. Ex: 1 - Suponhamos que um produto que custe R$ 178,00 sofra um acrscimo de 15%. Qual o valor final do produto? Veja o cdigo em Delphi:

procedure TForm1.Button1Click(Sender: TObject); var valor, percentual, valor_final: double; begin valor := 178.00; // valor original percentual := 15.0 / 100.0; // 15% valor_final := valor + (percentual * valor); ShowMessage('O valor final do produto : ' + FloatToStr(valor_final)); // O resultado ser 204,70 end;Ex: 2 - Um produto, cujo valor original era de R$ 250,00, teve um desconto de 8%. Qual foi seu valor final? Veja o cdigo em Delphi:

procedure TForm1.Button1Click(Sender: TObject); var valor, percentual, valor_final: double; begin valor := 250.00; // valor original percentual := 8.0 / 100.0; // 8% valor_final := valor - (percentual * valor); ShowMessage('O valor final do produto : ' + FloatToStr(valor_final)); // O resultado ser 230,00 end;Ex: 3 - Em um concurso de perguntas e respostas, um jovem acertou 72 das 90 perguntas apresentadas. Qual foi a porcentagem de acertos? E a porcentagem de erros? Veja o cdigo em Delphi:

procedure TForm1.Button1Click(Sender: TObject); var perguntas, acertos: double; begin perguntas := 90.0; acertos := 72.0; ShowMessage('Porcentagem de acertos: ' + FloatToStr(((acertos / perguntas) * 100)) + '%'); ShowMessage('Porcentagem de erros: ' + FloatToStr((((perguntas - acertos) / perguntas) * 100)) + '%'); // Os resultados sero 80% e 20% end;Ex: 4 - Um aparelho de CD foi adquirido por R$ 300,00 e revendido por R$ 240,00. Qual foi a porcentagem de lucro na transao? Veja o cdigo em Delphi:

procedure TForm1.Button1Click(Sender: TObject); var v_ant, v_nov, p_lucro: double; begin v_ant := 300.0; // valor anterior v_nov := 340.0; // valor novo p_lucro := 0.0; // porcentagem de lucro while(v_ant + ((p_lucro / 100.0) * v_ant) < v_nov) do begin p_lucro := p_lucro + 0.1; end; ShowMessage('A porcentagem de lucro foi de: ' + FloatToStr(p_lucro) + '%'); // O resultado ser 13,39 end;Ex: 5 - Uma loja repassa 5% do lucro a seus vendedores. Se um produto custa R$ 70,00, qual o valor em reais repassado a um determinado vendedor? Veja o cdigo em Delphi:

procedure TForm1.Button1Click(Sender: TObject); var valor, porcent, comissao: double; begin valor := 70.0; // valor do produto porcent := 5.0 / 100.0; // 5% comissao := porcent * valor; ShowMessage('O valor repassado ao vendedor : ' + FloatToStr(comissao)); // O resultado ser 3,5 end;

function Arredonda(Valor: Real): Real; var Modo: TFPURoundingMode; begin Modo := GetRoundMode; try SetRoundMode(rmTruncate); Result := RoundTo(Valor, -2); finally SetRoundMode(Modo); end; end; if FrmPrincipal.DSBotoes.State in [dsEdit,dsinsert] Then DmDados.ProdutosPrecoVenda.AsFloat := Arredonda((DmDados.ProdutosPrecoCusto.AsFloat -

((DmDados.ProdutosPrecoCusto.AsFloat * DmDados.ProdutosDesconto

procedure TForm1.Button1Click(Sender: TObject); var valor, valor1, indice, resultado : Currency; begin valor := StrToCurr(StringReplace(Edit1.Text, '.', '', [])); valor1 := ( Valor /30 ) * StrToFloat(StringReplace(Edit2.Text, '.', '', [])); indice := StrToFloat(StringReplace(Edit3.Text, '.', '', [])); resultado := ( valor1 * indice) / 100; // so esta calculando para 30 dias EXATO Label2.Caption := FormatCurr('###,###,##0.00',resultado); label3.Caption := FormatCurr('###,###,##0.00',valor-resultado); end;

http://www.scriptbrasil.com.br/forum/lofiversion/index.php/t100022.html

Carlos Rocha 11/04/2007 - 13:09 Copiei essa procedure de um programa que baixei da net. o programa, ele era Table da Guia BDE, eu coverti em Query do Zeos Lib. Acontece que a linha "TmpQry.Connection := QryItens.Connection;", a conexao um est sendo feita. Codigo que copiei:

CODE procedure tformcadpedidos.recalculapedido; var tmptable:ttable; total:currency; begin

tmptable:=ttable.Create(application); try tmptable.DatabaseName:=tableitens.DatabaseName; tmptable.TableName:=tableitens.TableName; tmptable.Open; tmptable.FindKey([tablepedidosnumeropedido.asInteger]); total:=0; while (not tmptable.Eof) and (tmptable.FieldByName('NumeroPedido').AsInteger= tablepedidosnumeropedido.AsInteger) do begin total:=total+(tmptable.fieldbyname('valorunitario').AsCurrency * tmptable.fieldbyname('quantidade').AsFloat); tmptable.Next; end; finally tmptable.Close; tmptable.Free; end; statictexttotal.Caption:=formatcurr('###,###,##0.00',total); end;

Codigo que transformei:(No consigo criar a TmpQry de jeito nenhum)

CODE procedure TCPedidos.RecalculaPedido; var TmpQry:TZQuery; Total:Currency; // armazena valores do tipo moeda begin // cria um objeto Qry via codificao TmpQry := TZQuery.Create(Application); try // define DatabaseName e QryName via codificao TmpQry.Connection := QryItens.Connection; TmpQry.Name := QryItens.Name; TmpQry.SQL.Text := 'Select * from Itens'; TmpQry.Open; //Observe que, para um novo pedido, o CodigoPedido ainda no foi gerado.Self // Da QryPedidosCodigoPedido.AsString sempre tera valor nulo e no ter tens o pedido. TmpQry.Locate('NumeroPedido', QryPedidosCodigoPedido.AsInteger, []);

//

TmpQry.FindField(QryPedidosCodigoPedido.AsString); Total := 0; // inicializa a variavel totalizadora while (not TmpQry.Eof) and (TmpQry.FieldByName('NumeroPedido').AsInteger = QryPedidosCodigoPedido.AsInteger) do begin // Acumula o Total da linha Total := Total + (TmpQry.FieldByName('PrecoUni').AsCurrency * TmpQry.FieldByName('Quantidade').AsFloat); TmpQry.Next; // prximo registro end; finally TmpQry.Close; // fecha a tabela TmpQry.Free; // libera objeto da memria end; StaticTextTotal.Caption := FormatCurr('###,###,##0.00', Total); end; Micheus 11/04/2007 - 15:35 QUOTE(Carlos Rocha @ 11/04/2007 - 01:09) ... Codigo que transformei:(No consigo criar a TmpQry de jeito nenhum)

CODE procedure TCPedidos.RecalculaPedido; var TmpQry:TZQuery; Total:Currency; // armazena valores do tipo moeda begin // cria um objeto Qry via codificao TmpQry := TZQuery.Create(Application); try // define DatabaseName e QryName via codificao TmpQry.Connection := QryItens.Connection; TmpQry.Name := QryItens.Name; TmpQry.SQL.Text := 'Select * from Itens'; TmpQry.Open; //Observe que, para um novo pedido, o CodigoPedido ainda no foi gerado.Self // Da QryPedidosCodigoPedido.AsString sempre tera valor nulo e no ter tens o pedido. TmpQry.Locate('NumeroPedido', QryPedidosCodigoPedido.AsInteger, []); // TmpQry.FindField(QryPedidosCodigoPedido.AsString);

Total := 0; // inicializa a variavel totalizadora while (not TmpQry.Eof) and (TmpQry.FieldByName('NumeroPedido').AsInteger = QryPedidosCodigoPedido.AsInteger) do begin // Acumula o Total da linha Total := Total + (TmpQry.FieldByName('PrecoUni').AsCurrency * TmpQry.FieldByName('Quantidade').AsFloat); TmpQry.Next; // prximo registro end; finally TmpQry.Close; // fecha a tabela TmpQry.Free; // libera objeto da memria end; StaticTextTotal.Caption := FormatCurr('###,###,##0.00', Total); end; Carlos Rocha, parece-me que voc quer recalcular o valor total de um determinado pedido, certo?! Primeiramente algumas observaes: 1) note que o exemplo original limitado pelo uso de dataset do tipo Table. Quando voc utiliza dataset do tipo Query, muitas limitaes no existem e facilidades nos esto disponveis; 2) a linha TmpQry.Name := QryItens.Name dever resultar em problema j que os identificadores devem ser nicos e deste modo voc est tentando duplicar o nome do componente; 3) quando voc observa: Observe que, para um novo pedido, o CodigoPedido ainda no foi gerado. Da QryPedidosCodigoPedido.AsString sempre tera valor nulo e no ter tens o pedido.; entendo que no haveria nada a fazer (processar) neste caso; 4) apesar de estar comentada, a linha TmpQry.FindField(QryPedidosCodigoPedido.AsString); no deve ser utilizada da forma como parece ter sido imaginada. FindField procura pelo nome de um campo na lista de Fields do dataset, no nno resultado da consulta/tabela; Ento, vamos tentar abandonar alguns dos vcios impostos pelas limitaes do Paradox e simplificar. Inicialmente, verificamos se devemos fazer, ou no, qualquer processamento em funo da situao do pedido (Novo ou no). Segundo sua observao, quando CodigoPedido for nulo (novo pedido) ainda no havero itens, logo, no faremos qualquer contabilizao. J quando o pedido estiver gravado e poder ter itens, ento vamos procurar pelos mesmos e executar os clculos. Entretanto, o SQL nos oferece funes como o SUM (somatrio) que nos permite enviar numa instruo SELECT a orientao para que o banco faa os clculos e nos retorne o resultado prontinho. Fazemos, ento, uso deste recurso, limitando os itens a serem calculados em funo do CodigoPedido passado como parmetro para a clusula WHERE. CODE

procedure TCPedidos.RecalculaPedido; var TmpQry:TZQuery; Total:Currency; // armazena valores do tipo moeda begin StaticTextTotal.Caption := '0,00'; // se o pedido no tiver itens ou houver exception, este o valor apresentado if not QryPedidosCodigoPedido.IsNull then begin // cria um objeto Qry via codificao TmpQry := TZQuery.Create(Application); try // define DatabaseName e QryName via codificao TmpQry.Connection := QryItens.Connection; TmpQry.Name := 'TmpQry'; // *** o Nome do componente deve ser nico!!! TmpQry.SQL.Add('Select SUM(PrecoUni *Quantidade) as Total'); TmpQry.SQL.Add('From Itens'); TmpQry.SQL.Add('Where NumeroPedido = :NumeroPedido'); TmpQry.ParamByName('NumeroPedido').Value := QryPedidosCodigoPedido.AsInteger; TmpQry.Op