{"id":631,"date":"2010-01-21T04:26:45","date_gmt":"2010-01-20T20:26:45","guid":{"rendered":"http:\/\/www.andreanolanusse.com\/pt\/?p=631"},"modified":"2013-05-05T22:23:48","modified_gmt":"2013-05-06T05:23:48","slug":"disponibilizando-metodos-de-uma-classe-como-server-methods-sem-usar-tservermodule-em-datasnap","status":"publish","type":"post","link":"http:\/\/www.andreanolanusse.com\/pt\/disponibilizando-metodos-de-uma-classe-como-server-methods-sem-usar-tservermodule-em-datasnap\/","title":{"rendered":"Disponibilizando m\u00e9todos de uma classe como Server Methods sem usar TServerModule em DataSnap"},"content":{"rendered":"<p>Hoje certamente voc\u00ea tem diversas classes contendo regras de neg\u00f3cios que poderiam ser melhor aproveitas em uma aplica\u00e7\u00e3o multicamada desenvolvida em Delphi. Por meio dos Server Methods \u00e9 poss\u00edvel fazer isso tranquilamente.<\/p>\n<p>Para uma classe ser disponibilizada como Server Methods \u00e9 necess\u00e1rio:<\/p>\n<ul>\n<li>Descender de TPersistent<\/li>\n<li>Ter a diretiva {$MethodInfo ON}, esta diretiva permite ao DataSnap obter informa\u00e7\u00f5es da classe a partir da RTTI<\/li>\n<li>Estar registrada atrav\u00e9s do componente DSServerClass<\/li>\n<\/ul>\n<p>Abaixo exemplo de uma classe que n\u00e3o \u00e9 descendente de TDSServerModule e sim de TPersistant, podemos assumir que esta classe j\u00e1 existia anteriormente e que agora queremos reusar em nosso servidor DataSnap<\/p>\n<pre class=\"brush: pascal; highlight: [14, 15]\">unit User;\r\n\r\ninterface\r\n\r\nuses\r\n  BaseServerClass,\r\n  Classes,\r\n  DBXCommon,\r\n  SysUtils,\r\n  Dialogs,\r\n  MainServerModule;\r\n\r\ntype\r\n{$METHODINFO ON}\r\n  TUser = class(TPersistent)\r\n  private\r\n\r\n  public\r\n    constructor Create;\r\n    destructor Destroy; override;\r\n\r\n    procedure AddUser(FirstLastName, Login, Password: String);\r\n\r\n    function IsValidUser(Login, Password: String): Boolean;\r\n\r\n    procedure DisableUser(Login: String);\r\n    procedure EnableUser(Login: String);\r\n\r\n  end;\r\n\r\nimplementation\r\n\r\nuses\r\n  ServerContainer;\r\n\r\n{ TUser }\r\n\r\nprocedure TUser.AddUser(FirstLastName, Login, Password: String);\r\nvar\r\n  Comm: TDBXCommand;\r\nbegin\r\n\r\n  if (FirstLastName = '') then\r\n    raise Exception.Create('First\/Last name is required');\r\n\r\n  if (Login = '') then\r\n    raise Exception.Create('Login is required');\r\n\r\n  if (Password = '') then\r\n    raise Exception.Create('Password is required');\r\n\r\n  Comm := FDbxConnection.CreateCommand;\r\n\r\n  Comm.Text :=\r\n    'Insert Into Users (NAME, LOGIN, PASSWORD, ACTIVE ) Values (' + QuotedStr\r\n    (FirstLastName) + ',' + QuotedStr(Login) + ',' + QuotedStr(Password)\r\n    + ', true)';\r\n  Comm.ExecuteQuery;\r\n\r\n  FreeAndNil(Comm);\r\n\r\nend;\r\n\r\nconstructor TUser.Create;\r\nbegin\r\n  FDbxConnection := DMServerContainer.DataSnap_Server_Log.DBXConnection;\r\nend;\r\n\r\ndestructor TUser.Destroy;\r\nbegin\r\n\r\n  inherited;\r\nend;\r\n\r\nprocedure TUser.DisableUser(Login: String);\r\nvar\r\n  Comm: TDBXCommand;\r\nbegin\r\n\r\n  if (Login = '') then\r\n    raise Exception.Create('Login is required');\r\n\r\n  Comm := FDbxConnection.CreateCommand;\r\n\r\n  Comm.Text := 'Update Users Set ACTIVE = False Where LOGIN = ' + QuotedStr\r\n    (Login);\r\n  Comm.ExecuteQuery;\r\n\r\n  FreeAndNil(Comm);\r\n\r\nend;\r\n\r\nprocedure TUser.EnableUser(Login: String);\r\nvar\r\n  Comm: TDBXCommand;\r\nbegin\r\n\r\n  if (Login = '') then\r\n    raise Exception.Create('Login is required');\r\n\r\n  Comm := FDbxConnection.CreateCommand;\r\n\r\n  Comm.Text := 'Update Users Set ACTIVE = True Where LOGIN = ' + QuotedStr\r\n    (Login);\r\n  Comm.ExecuteQuery;\r\n\r\n  FreeAndNil(Comm);\r\n\r\nend;\r\n\r\nfunction TUser.IsValidUser(Login, Password: String): Boolean;\r\nvar\r\n  Comm: TDBXCommand;\r\n  Reader: TDBXReader;\r\nbegin\r\n  if (Login = '') then\r\n    raise Exception.Create('Login is required');\r\n\r\n  if (Password = '') then\r\n    raise Exception.Create('Password is required');\r\n\r\n  Comm := FDbxConnection.CreateCommand;\r\n\r\n  Comm.Text := 'Select ACTIVE From Users Where LOGIN = ' + QuotedStr(Login)\r\n    + ' and PASSWORD = ' + QuotedStr(Password);\r\n\r\n  Reader := Comm.ExecuteQuery;\r\n\r\n  if Reader.Next then\r\n  begin\r\n    Result := Reader.Value[0].GetBoolean;\r\n  end\r\n  else\r\n    Result := False;\r\n\r\n  Reader.Close;\r\n  FreeAndNil(Reader);\r\n  FreeAndNil(Comm);\r\n\r\nend;\r\n\r\nend.<\/pre>\n<p>Quer saber mais sobre DataSnap, <a href=\"http:\/\/www.andreanolanusse.com\/pt\/tag\/datasnap\/\"><strong>clique aqui<\/strong><\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hoje certamente voc\u00ea tem diversas classes contendo regras de neg\u00f3cios que poderiam ser melhor aproveitas em uma aplica\u00e7\u00e3o multicamada desenvolvida em Delphi. Por meio dos Server Methods \u00e9 poss\u00edvel fazer isso tranquilamente. Para uma classe ser disponibilizada como Server Methods \u00e9 necess\u00e1rio: Descender de TPersistent Ter a diretiva {$MethodInfo ON}, esta diretiva permite ao DataSnap [&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":[23,33,181],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v16.2 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Disponibilizando m\u00e9todos de uma classe como Server Methods sem usar TServerModule em DataSnap<\/title>\n<meta name=\"description\" content=\"Hoje certamente voc\u00ea tem diversas classes contendo regras de neg\u00f3cios que poderiam ser melhor aproveitas em uma aplica\u00e7\u00e3o multicamada desenvolvida em\" \/>\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\/disponibilizando-metodos-de-uma-classe-como-server-methods-sem-usar-tservermodule-em-datasnap\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Disponibilizando m\u00e9todos de uma classe como Server Methods sem usar TServerModule em DataSnap\" \/>\n<meta property=\"og:description\" content=\"Hoje certamente voc\u00ea tem diversas classes contendo regras de neg\u00f3cios que poderiam ser melhor aproveitas em uma aplica\u00e7\u00e3o multicamada desenvolvida em\" \/>\n<meta property=\"og:url\" content=\"http:\/\/www.andreanolanusse.com\/pt\/disponibilizando-metodos-de-uma-classe-como-server-methods-sem-usar-tservermodule-em-datasnap\/\" \/>\n<meta property=\"og:site_name\" content=\"Andreano Lanusse | Tecnologia e Desenvolvimento de Software\" \/>\n<meta property=\"article:published_time\" content=\"2010-01-20T20:26:45+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2013-05-06T05:23:48+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=\"2 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\/disponibilizando-metodos-de-uma-classe-como-server-methods-sem-usar-tservermodule-em-datasnap\/#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\/disponibilizando-metodos-de-uma-classe-como-server-methods-sem-usar-tservermodule-em-datasnap\/#webpage\",\"url\":\"http:\/\/www.andreanolanusse.com\/pt\/disponibilizando-metodos-de-uma-classe-como-server-methods-sem-usar-tservermodule-em-datasnap\/\",\"name\":\"Disponibilizando m\\u00e9todos de uma classe como Server Methods sem usar TServerModule em DataSnap\",\"isPartOf\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/#website\"},\"primaryImageOfPage\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/disponibilizando-metodos-de-uma-classe-como-server-methods-sem-usar-tservermodule-em-datasnap\/#primaryimage\"},\"datePublished\":\"2010-01-20T20:26:45+00:00\",\"dateModified\":\"2013-05-06T05:23:48+00:00\",\"description\":\"Hoje certamente voc\\u00ea tem diversas classes contendo regras de neg\\u00f3cios que poderiam ser melhor aproveitas em uma aplica\\u00e7\\u00e3o multicamada desenvolvida em\",\"breadcrumb\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/disponibilizando-metodos-de-uma-classe-como-server-methods-sem-usar-tservermodule-em-datasnap\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"http:\/\/www.andreanolanusse.com\/pt\/disponibilizando-metodos-de-uma-classe-como-server-methods-sem-usar-tservermodule-em-datasnap\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/disponibilizando-metodos-de-uma-classe-como-server-methods-sem-usar-tservermodule-em-datasnap\/#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\/disponibilizando-metodos-de-uma-classe-como-server-methods-sem-usar-tservermodule-em-datasnap\/#webpage\"}}]},{\"@type\":\"Article\",\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/disponibilizando-metodos-de-uma-classe-como-server-methods-sem-usar-tservermodule-em-datasnap\/#article\",\"isPartOf\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/disponibilizando-metodos-de-uma-classe-como-server-methods-sem-usar-tservermodule-em-datasnap\/#webpage\"},\"author\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/#\/schema\/person\/620bd05e81598c3aba4781796cbe8903\"},\"headline\":\"Disponibilizando m\\u00e9todos de uma classe como Server Methods sem usar TServerModule em DataSnap\",\"datePublished\":\"2010-01-20T20:26:45+00:00\",\"dateModified\":\"2013-05-06T05:23:48+00:00\",\"mainEntityOfPage\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/disponibilizando-metodos-de-uma-classe-como-server-methods-sem-usar-tservermodule-em-datasnap\/#webpage\"},\"commentCount\":9,\"publisher\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/#\/schema\/person\/620bd05e81598c3aba4781796cbe8903\"},\"image\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/disponibilizando-metodos-de-uma-classe-como-server-methods-sem-usar-tservermodule-em-datasnap\/#primaryimage\"},\"keywords\":[\"DataSnap\",\"dbExpress\",\"Delphi\"],\"articleSection\":[\"Delphi\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"http:\/\/www.andreanolanusse.com\/pt\/disponibilizando-metodos-de-uma-classe-como-server-methods-sem-usar-tservermodule-em-datasnap\/#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\/631"}],"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=631"}],"version-history":[{"count":0,"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/posts\/631\/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=631"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/categories?post=631"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/tags?post=631"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}