Dicas Delphi

Download Dicas Delphi

Post on 28-Nov-2014

153 views

Category:

Documents

5 download

Embed Size (px)

TRANSCRIPT

<p>http://www.arquivodecodigos.net/dicas/delphi-efetuando-calculos-de-porcentagem-emdelphi-2707.html</p> <p>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:</p> <p>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:</p> <p>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:</p> <p>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:</p> <p>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) &lt; 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:</p> <p>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;</p> <p>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 -</p> <p>((DmDados.ProdutosPrecoCusto.AsFloat * DmDados.ProdutosDesconto</p> <p>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;</p> <p>http://www.scriptbrasil.com.br/forum/lofiversion/index.php/t100022.html</p> <p>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:</p> <p>CODE procedure tformcadpedidos.recalculapedido; var tmptable:ttable; total:currency; begin</p> <p>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;</p> <p>Codigo que transformei:(No consigo criar a TmpQry de jeito nenhum)</p> <p>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, []);</p> <p>//</p> <p>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)</p> <p>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);</p> <p>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</p> <p>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.Open; StaticTextTotal.Caption := FormatCurr('###,###,##0.00', TmpQry.FieldByName('Total').Value); finally TmpQry.Free; end; end; A forma como foi montada a instruo SQL (temos apenas a funo de agregao - SUM no SELECT) permite que omitamos a clusula GROUP BY, utilizado quando queremos agrupar os valores. Por exemplo, se fosse para gerar uma lista com o total de todos os pedidos, totalizado pedido-a-pedido, teramos de defin-la desta forma:</p> <p>QUOTE Select NumeroPedido, SUM(PrecoUni *Quantidade) as Total From Itens Group By NumeroPedido Nesta situao, todos as colunas no SELECT, que no so funo de agregao devem ser colocadas na clusula Group By. Aquele AS antes do nome do campo que estamos calculando, no obrigatrio, mas no MSAccess (se no me engano) necessrio. Abraos Carlos Rocha</p> <p>12/04/2007 - 12:08 Ok, eu entendi. Tentei usar da forma que voc explicou, porem no caso de eu passar um novo pedido(QryPedidos.insert), a a variavel total no funciona, so fica 0,00. Segue o cdigo completo do Formulario.</p> <p>CODE unit CadPedidos; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ZDataset, DB, ZAbstractRODataset, ZAbstractDataset, ZAbstractTable, Grids, DBGrids, StdCtrls, Buttons, DBCtrls, Mask, ExtCtrls; type TCPedidos = class(TForm) PanelDados: TPanel; LabelCodigoPedido: TLabel; LabelCodigoCliente: TLabel; LabelLocalFatura: TLabel; LabelLocalCobranca: TLabel; LabelLocalEntrega: TLabel; LabelCPF_CNPJ: TLabel; LabelCEP: TLabel; LabelDataCadastro: TLabel; LabelTotalPedido: TLabel; DBEditCodigoPedido: TDBEdit; DBEditCodigoCliente: TDBEdit; DBEditLocalFatura: TDBEdit; DBEditLocalCobranca: TDBEdit; DBEditLocalEntrega: TDBEdit; DBEditCPF_CNPJ: TDBEdit; DBEditCEP: TDBEdit; DBEditDataCadastro: TDBEdit; StaticTextTotal: TStaticText; PanelBotoes: TPanel; SpdBtnAlterar: TSpeedButton; SpdBtnIncluir: TSpeedButton; SpdBtnProcurar: TSpeedButton; SpdBtnCancelar: TSpeedButton;</p> <p>SpdBtnGravar: TSpeedButton; SpdBtnExcluir: TSpeedButton; DBNavigatorPedidos: TDBNavigator; BitBtnFechar: TBitBtn; DBGridItens: TDBGrid; DSPedidos: TDataSource; DSItens: TDataSource; QryClientes2: TZQuery; DSClientes: TDataSource; QryPedidos: TZQuery; QryItens: TZQuery; QryClientes: TZQuery; QryProdutos: TZQuery; QryItensItem: TIntegerField; QryItensNumeroPedido: TIntegerField; QryItensCodigoProduto: TIntegerField; QryItensQuantidade: TIntegerField; QryItensPrecoUni: TIntegerField; QryProdutosCodigoProduto: TIntegerField; QryProdutosDescricao: TStringField; QryProdutosPrecoUni: TIntegerField; QryClientesCodigoCliente: TIntegerField; QryClientesDataCadastro: TDateField; QryClientesTipo: TStringField; QryClientesCPF_CNPJ: TStringField; QryClientesNome: TStringField; QryClientesEndereco: TStringField; QryClientesBairro: TStringField; QryClientesCidade: TStringField; QryClientesEstado: TStringField; QryClientesTelefone: TStringField; QryClientesEmail: TStringField; QryItensTotal: TCurrencyField; QryItensDescricao: TStringField; QryClientes2CodigoCliente: TIntegerField; QryClientes2DataCadastro: TDateField; QryClientes2Tipo: TStringField; QryClientes2CPF_CNPJ: TStringField; QryClientes2Nome: TStringField; QryClientes2Endereco: TStringField; QryClientes2Bairro: TStringField; QryClientes2Cidade: TStringField; QryClientes2Estado: TStringField; QryClientes2Telefone: TStringField; QryClientes2Email: TStringField;</p> <p>DBRadioGroupCondicaoPagamento: TDBRadioGroup; SpeedButtonImprimir: TSpeedButton; NomeCliente: TLabel; DBLookupComboBoxNomeCliente: TDBLookupComboBox; QryPedidosCodigoPedido: TIntegerField; QryPedidosCondicaoPgto: TStringField; QryPedidosDataCadastro: TDateField; QryPedidosCodigoCliente: TIntegerField; QryPedidosNomeCli: TStringField; QryPedidosLocalFatura: TStringField; QryPedidosLocalCobranca: TStringField; QryPedidosLocalEntrega: TStringField; QryPedidosCPF_CNPJ: TStringField; QryPedidosCEP: TStringField; QryPedidosNomeCliente: TStringField; procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure QryPedidosNewRecord(DataSet: TDataSet); procedure QryItensNewRecord(DataSet: TDataSet); procedure QryItensCalcFields(DataSet: TDataSet); procedure QryItensBeforeInsert(DataSet: TDataSet); procedure QryItensBeforePost(DataSet: TDataSet); procedure DBGridItensKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure QryItensCodigoProdutoValidate(Sender: TField); procedure QryPedidosDataCadastroSetText(Sender: TField; const Text: String); procedure SpdBtnIncluirClick(Sender: TObject); procedure SpdBtnAlterarClick(Sender: TObject); procedure SpdBtnExcluirClick(Sender: TObject); procedure SpdBtnGravarClick(Sender: TObject); procedure SpdBtnCancelarClick(Sender: TObject); procedure SpdBtnProcurarClick(Sender: TObject); procedure DBLookupComboBoxNomeClienteClick(Sender: TObject); procedure SpeedButtonImprimirClick(Sender: TObject); procedure QryPedidosCPF_CNPJGetText(Sender: TField; var Text: String; DisplayText: Boolean); private { Private declarations } procedure AtivarControles(Ativar: Boolean); procedure RecalculaPed...</p>