{"id":756,"date":"2010-03-04T15:19:02","date_gmt":"2010-03-04T07:19:02","guid":{"rendered":"http:\/\/www.andreanolanusse.com\/pt\/?p=756"},"modified":"2013-05-02T20:34:10","modified_gmt":"2013-05-03T03:34:10","slug":"resolvendo-problemas-de-intervalo-de-data-com-records-em-delphi","status":"publish","type":"post","link":"http:\/\/www.andreanolanusse.com\/pt\/resolvendo-problemas-de-intervalo-de-data-com-records-em-delphi\/","title":{"rendered":"Resolvendo problemas de intervalo de data com Records em Delphi"},"content":{"rendered":"<p>Record \u00e9 um tipo de dado que lhe permite estruturar dados, a partir do Delphi 2006 Record se tornou quase uma classe, suportando:<\/p>\n<ul>\n<li>Construtores<\/li>\n<li>Sobreposi\u00e7\u00e3o de operadores<\/li>\n<li>Declara\u00e7\u00e3o de m\u00e9todos n\u00e3o-virtuais<\/li>\n<li>M\u00e9todos e propriedades est\u00e1ticos<\/li>\n<\/ul>\n<p>Podemos utilizar os Record de v\u00e1rias maneiras, no meu caso utilizo muito em par\u00e2metros de m\u00e9todos que devem representar chaves prim\u00e1rias (Primary Key), desta forma facilita a leitura e manuten\u00e7\u00e3o do c\u00f3digo, \u00e9 verdade que voc\u00ea n\u00e3o fica mudando as chaves prim\u00e1rias das tabelas do seu banco de dados o tempo todo, mas quando precisar o mudan\u00e7a no c\u00f3digo ser\u00e1 simples. Outro exemplo seria informar intervalo de dados.<\/p>\n<p>Imagine que voc\u00ea precise gerar um conjunto de boletos de um determinado per\u00edodo, voc\u00ea iria declarar algo assim.<\/p>\n<pre class=\"brush: delphi\">    procedure GerarBoleto( DataInicial, DataFinal : TDateTime );<\/pre>\n<p>Geralmente temos problema com periodos, porque os bancos de dados armazenam data e hora no mesmo campo, desta forma temos que na data inicial estar certo que a hora est\u00e1 acertada para &#8217;00:00:00&#8242; e para a data final teremos que estar certos de ter como hora final &#8217;23:59:59&#8242;, existem outros aspectos e artif\u00edcios dependendo do banco de dados para contornar esta situa\u00e7\u00e3o, mas isso depende de cada banco.<\/p>\n<p>Record \u00e9 uma excelente solu\u00e7\u00e3o para estes casos, para isso representamos os par\u00e2metros do m\u00e9todo GerarBoleto como um Record e ele ir\u00e1 fazer todo o trabalho para evitar os problema de data e hora, assim como facilitar a leitura, entendimento e manuten\u00e7\u00e3o do c\u00f3digo.<\/p>\n<p>O m\u00e9todo passaria a ser declarado assim:<\/p>\n<pre class=\"brush: delphi\">    procedure GerarBoleto( periodo : TPeriodo );<\/pre>\n<p>A declara\u00e7\u00e3o do Record teria as propriedades DataInicial e DataFinal, estas por suas vez quando receberam valores ter\u00e3o os mesmo ajustados de acordo com os m\u00e9todo Set.<\/p>\n<p>Abaixo a declara\u00e7\u00e3o do Record e a seguir algumas explica\u00e7\u00f5es para o mesmo.<\/p>\n<pre class=\"brush: delphi\">unit Perido;\r\n\r\ninterface\r\n\r\nuses SysUtils, DateUtils;\r\n\r\ntype\r\n\r\n  TPeriodo = Record\r\n  private\r\n    FDataFinal: TDateTime;\r\n    FDataInicial: TDateTime;\r\n    procedure SetDataFinal(const Value: TDateTime);\r\n    procedure SetDataInicial(const Value: TDateTime);\r\n\r\n  public\r\n    property DataInicial: TDateTime read FDataInicial write SetDataInicial;\r\n    property DataFinal: TDateTime read FDataFinal write SetDataFinal;\r\n\r\n    Constructor Create(Di, Df: TDateTime);\r\n\r\n    procedure SetIntervaloAnual( Anoi, Anof : Integer );\r\n  end;\r\n\r\nimplementation\r\n\r\n{ TPeriodo }\r\n\r\nconstructor TPeriodo.Create(Di, Df: TDateTime);\r\nbegin\r\n  DataInicial := Di;\r\n  DataFinal := Df\r\nend;\r\n\r\nprocedure TPeriodo.SetDataFinal(const Value: TDateTime);\r\nbegin\r\n  FDataFinal := EncodeDateTime(Yearof(Value), MonthOf(Value), Dayof(Value), 23, 59, 59, 1000);\r\nend;\r\n\r\nprocedure TPeriodo.SetDataInicial(const Value: TDateTime);\r\nbegin\r\n  FDataInicial := EncodeDateTime(Yearof(Value), MonthOf(Value), Dayof(Value), 0, 0, 0, 0);\r\nend;\r\n\r\nprocedure TPeriodo.SetIntervaloAnual(Anoi, Anof: Integer);\r\nbegin\r\n  DataInicial := EncodeDate(Anoi, 1, 1);\r\n  DataFinal   := EncodeDate(Anof, 12, 31);\r\nend;\r\n\r\nend.<\/pre>\n<ul>\n<li>Toda e qualquer atribui\u00e7\u00e3o de valor para DataInicial e DataFinal ser\u00e3o ajustados de acordo com o hor\u00e1rio inicial e final<\/li>\n<li>Foi criado um m\u00e9todo adicional SetIntervaloAnual, onde voc\u00ea pode informar o ano inicial e final para o per\u00edodo e o m\u00e9todo ir\u00e1 gerar os intervalos.<\/li>\n<\/ul>\n<p>Abaixo uma das formas onde podemos utilizar este Record, informando per\u00edodo inicial e final;<\/p>\n<pre class=\"brush: delphi\">var\r\n  periodo : TPeriodo;\r\nbegin\r\n  periodo.DataInicial := EncodeDate( 2009, 1, 1);\r\n  periodo.DataFinal   := Now;\r\n\r\n  GerarBoleto(periodo);<\/pre>\n<p>Outra forma \u00e9 passar o per\u00edodo utilizando o construtor do Record<\/p>\n<pre class=\"brush: delphi\">var\r\n  periodo : TPeriodo;\r\nbegin\r\n  periodo.Create(EncodeDate( 2009, 1, 1), Now);\r\n  GerarBoleto(periodo);<\/pre>\n<p>Outra forma seria utilizar o m\u00e9todo SetIntervaloAnual, onde voc\u00ea apenas especifica o per\u00edodo anual.<\/p>\n<pre class=\"brush: delphi\">var\r\n  periodo : TPeriodo;\r\nbegin\r\n\r\n  periodo.SetIntervaloAnual(2008, 2009);\r\n\r\n  GerarBoleto(periodo);<\/pre>\n<p>Em todos os casos, os valores hor\u00e1rios foram acertados.<\/p>\n<p>Mas este record pode fazer muito mais por n\u00f3s, porque n\u00e3o gerar a declara\u00e7\u00e3o where do SQL para as datas de acordo com os valores? Dois simples m\u00e9todos pode resolver todos os problemas.<\/p>\n<p>Field, \u00e9 o nome do campo que representa a data em sua tabela.<\/p>\n<pre class=\"brush: delphi\">function TPeriodo.DataDBFormat(const Value: TDateTime): String;\r\nbegin\r\n  Result := FormatDateTime('mm\/dd\/yyyy hh:mm:ss', Value);\r\nend;\r\n\r\nfunction TPeriodo.GenerateSQL(Field: String): String;\r\nConst\r\n  sql: String = '%s between ''%s'' and ''%s'' ';\r\nbegin\r\n  Result := Format(sql, [FieldI, DataDBFormat(DataInicial), DataDBFormat(DataFinal)]);\r\nend;<\/pre>\n<p>Na pr\u00e1tica usamos desta forma:<\/p>\n<pre class=\"brush: delphi\">var\r\n  periodo : TPeriodo;\r\nbegin\r\n\r\n  periodo.SetIntervaloAnual(2008, 2009);\r\n\r\n  ShowMessage( periodo.GenerateSQL('DATA_BOLETO'));<\/pre>\n<p>O resultado no ShowMessage ser\u00e1: <strong>DATA_BOLETO between &#8217;01\/01\/2008 00:00:00&#8242; and &#8217;12\/31\/2009 23:59:59&#8242;<\/strong><\/p>\n<p>Espero que este post seja \u00fatil e lhe ajude no seu dia-a-dia. <a href=\"http:\/\/www.andreanolanusse.com\/pt\/wp-content\/uploads\/2010\/03\/Periodo.zip\">Download c\u00f3digo fonte<\/a><\/p>\n<p>At\u00e9 o pr\u00f3ximo post.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Record \u00e9 um tipo de dado que lhe permite estruturar dados, a partir do Delphi 2006 Record se tornou quase uma classe, suportando: Construtores Sobreposi\u00e7\u00e3o de operadores Declara\u00e7\u00e3o de m\u00e9todos n\u00e3o-virtuais M\u00e9todos e propriedades est\u00e1ticos Podemos utilizar os Record de v\u00e1rias maneiras, no meu caso utilizo muito em par\u00e2metros de m\u00e9todos que devem representar chaves [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":4202,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_s2mail":"yes","footnotes":""},"categories":[102],"tags":[181,75],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v16.2 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Resolvendo problemas de intervalo de data com Records em Delphi | Andreano Lanusse | Tecnologia e Desenvolvimento de Software<\/title>\n<meta name=\"description\" content=\"Record \u00e9 um tipo de dado que lhe permite estruturar dados, a partir do Delphi 2006 Record se tornou quase uma classe, suportando: Construtores\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"http:\/\/www.andreanolanusse.com\/pt\/resolvendo-problemas-de-intervalo-de-data-com-records-em-delphi\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Resolvendo problemas de intervalo de data com Records em Delphi | Andreano Lanusse | Tecnologia e Desenvolvimento de Software\" \/>\n<meta property=\"og:description\" content=\"Record \u00e9 um tipo de dado que lhe permite estruturar dados, a partir do Delphi 2006 Record se tornou quase uma classe, suportando: Construtores\" \/>\n<meta property=\"og:url\" content=\"http:\/\/www.andreanolanusse.com\/pt\/resolvendo-problemas-de-intervalo-de-data-com-records-em-delphi\/\" \/>\n<meta property=\"og:site_name\" content=\"Andreano Lanusse | Tecnologia e Desenvolvimento de Software\" \/>\n<meta property=\"article:published_time\" content=\"2010-03-04T07:19:02+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2013-05-03T03:34:10+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/www.andreanolanusse.com\/pt\/wp-content\/uploads\/2011\/09\/Icon_Delphi.png\" \/>\n\t<meta property=\"og:image:width\" content=\"170\" \/>\n\t<meta property=\"og:image:height\" content=\"170\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@andreanolanusse\" \/>\n<meta name=\"twitter:site\" content=\"@andreanolanusse\" \/>\n<meta name=\"twitter:label1\" content=\"Est. tempo de leitura\">\n\t<meta name=\"twitter:data1\" content=\"4 minutos\">\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebSite\",\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/#website\",\"url\":\"http:\/\/www.andreanolanusse.com\/pt\/\",\"name\":\"Andreano Lanusse | Tecnologia e Desenvolvimento de Software\",\"description\":\"Andreano Lanusse blog - artigos, tutoriais e v&iacute;deos sobre tecnologia, desenvolvimento de software (Delphi XE4, C#, PHP, .NET) e t&eacute;cnicas de programa&ccedil;&atilde;o\",\"publisher\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/#\/schema\/person\/620bd05e81598c3aba4781796cbe8903\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":\"http:\/\/www.andreanolanusse.com\/pt\/?s={search_term_string}\",\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"ImageObject\",\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/resolvendo-problemas-de-intervalo-de-data-com-records-em-delphi\/#primaryimage\",\"inLanguage\":\"pt-BR\",\"url\":\"http:\/\/www.andreanolanusse.com\/pt\/wp-content\/uploads\/2011\/09\/Icon_Delphi.png\",\"contentUrl\":\"http:\/\/www.andreanolanusse.com\/pt\/wp-content\/uploads\/2011\/09\/Icon_Delphi.png\",\"width\":170,\"height\":170},{\"@type\":\"WebPage\",\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/resolvendo-problemas-de-intervalo-de-data-com-records-em-delphi\/#webpage\",\"url\":\"http:\/\/www.andreanolanusse.com\/pt\/resolvendo-problemas-de-intervalo-de-data-com-records-em-delphi\/\",\"name\":\"Resolvendo problemas de intervalo de data com Records em Delphi | Andreano Lanusse | Tecnologia e Desenvolvimento de Software\",\"isPartOf\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/#website\"},\"primaryImageOfPage\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/resolvendo-problemas-de-intervalo-de-data-com-records-em-delphi\/#primaryimage\"},\"datePublished\":\"2010-03-04T07:19:02+00:00\",\"dateModified\":\"2013-05-03T03:34:10+00:00\",\"description\":\"Record \\u00e9 um tipo de dado que lhe permite estruturar dados, a partir do Delphi 2006 Record se tornou quase uma classe, suportando: Construtores\",\"breadcrumb\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/resolvendo-problemas-de-intervalo-de-data-com-records-em-delphi\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"http:\/\/www.andreanolanusse.com\/pt\/resolvendo-problemas-de-intervalo-de-data-com-records-em-delphi\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/resolvendo-problemas-de-intervalo-de-data-com-records-em-delphi\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"item\":{\"@type\":\"WebPage\",\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/\",\"url\":\"http:\/\/www.andreanolanusse.com\/pt\/\",\"name\":\"In\\u00edcio\"}},{\"@type\":\"ListItem\",\"position\":2,\"item\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/resolvendo-problemas-de-intervalo-de-data-com-records-em-delphi\/#webpage\"}}]},{\"@type\":\"Article\",\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/resolvendo-problemas-de-intervalo-de-data-com-records-em-delphi\/#article\",\"isPartOf\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/resolvendo-problemas-de-intervalo-de-data-com-records-em-delphi\/#webpage\"},\"author\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/#\/schema\/person\/620bd05e81598c3aba4781796cbe8903\"},\"headline\":\"Resolvendo problemas de intervalo de data com Records em Delphi\",\"datePublished\":\"2010-03-04T07:19:02+00:00\",\"dateModified\":\"2013-05-03T03:34:10+00:00\",\"mainEntityOfPage\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/resolvendo-problemas-de-intervalo-de-data-com-records-em-delphi\/#webpage\"},\"commentCount\":3,\"publisher\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/#\/schema\/person\/620bd05e81598c3aba4781796cbe8903\"},\"image\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/resolvendo-problemas-de-intervalo-de-data-com-records-em-delphi\/#primaryimage\"},\"keywords\":[\"Delphi\",\"RTL\"],\"articleSection\":[\"Delphi\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"http:\/\/www.andreanolanusse.com\/pt\/resolvendo-problemas-de-intervalo-de-data-com-records-em-delphi\/#respond\"]}]},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/#\/schema\/person\/620bd05e81598c3aba4781796cbe8903\",\"name\":\"Andreano Lanusse\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/#personlogo\",\"inLanguage\":\"pt-BR\",\"url\":\"http:\/\/0.gravatar.com\/avatar\/6a9c6f73c7c480fb826c7303288abfd3?s=96&d=mm&r=g\",\"contentUrl\":\"http:\/\/0.gravatar.com\/avatar\/6a9c6f73c7c480fb826c7303288abfd3?s=96&d=mm&r=g\",\"caption\":\"Andreano Lanusse\"},\"logo\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/#personlogo\"},\"sameAs\":[\"https:\/\/twitter.com\/andreanolanusse\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","_links":{"self":[{"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/posts\/756"}],"collection":[{"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/comments?post=756"}],"version-history":[{"count":0,"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/posts\/756\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/media\/4202"}],"wp:attachment":[{"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/media?parent=756"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/categories?post=756"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/tags?post=756"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}