<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-830298852164908263</id><updated>2011-12-04T13:17:52.181-08:00</updated><category term='MYSQL'/><category term='C#'/><category term='PHP'/><category term='JQuery'/><category term='Smarty'/><category term='SQL'/><category term='UML / Engenharia de Software'/><category term='Linq'/><category term='Entity framework'/><category term='Delphi'/><category term='Zend Framework'/><category term='AJAX'/><category term='XML'/><category term='ASP.Net'/><category term='Curiosidades'/><title type='text'>Maurício Vinicius (Análise e desenvolvimento)</title><subtitle type='html'>Blog destinado a analistas e programadores.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://devutils.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/830298852164908263/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://devutils.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Maurício Vinicius de O. Santos</name><uri>http://www.blogger.com/profile/10158075805974585222</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_l_YF-xHSDL4/STdFoMVcXEI/AAAAAAAAAAM/JXTfPHMPqmI/S220/ATgAAACOLsPwGjdpAa_SnOfdO8oYetUIkSOR5GaAc2aKfeEu6I4-M5gbzP0CnwnwwaDRa6r1hQ_cDneOBEkOgXyiYiANAJtU9VCdj81JzTyD8JjI5C1-yzkrumjLYA.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>28</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-830298852164908263.post-8445233257323495596</id><published>2010-08-12T14:49:00.000-07:00</published><updated>2010-08-13T04:56:12.686-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.Net'/><category scheme='http://www.blogger.com/atom/ns#' term='Entity framework'/><title type='text'>Declarações IN e NOT IN no Linq to Entity</title><content type='html'>Esses dias eu quebrei a cabeça para fazer uma declaração IN e NOT IN em minha query.&lt;br /&gt;Enfim, eu tinha pensado que já tinha arrumado uma solução, que seria utilizar o Contains:&lt;br /&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt;"&gt;&lt;span style=";font-family:consolas;font-size:100%;color:blue;"   &gt;var&lt;/span&gt;&lt;span style=";font-family:consolas;font-size:100%;"  &gt; query = &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt;"&gt;&lt;span style=";font-family:consolas;font-size:100%;"  &gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;span style="color:blue;"&gt;from&lt;/span&gt; i &lt;span style="color:blue;"&gt;in&lt;/span&gt; dm.inspecoes&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt;"&gt;       &lt;span style=";font-family:consolas;font-size:100%;"  &gt;&lt;span style="color:blue;"&gt;where &lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:consolas;font-size:100%;"  &gt;i&lt;/span&gt;&lt;span style=";font-family:consolas;font-size:100%;"  &gt;.idtipo_operacao == 6&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:consolas;font-size:100%;"  &gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt;"&gt;&lt;span style=";font-family:consolas;font-size:100%;"  &gt;&lt;span style=""&gt;    &amp;amp;&amp;amp;&lt;/span&gt; !(&lt;span style="color:blue;"&gt;from&lt;/span&gt; i2 &lt;span style="color:blue;"&gt;in&lt;/span&gt; &lt;/span&gt;&lt;span style=";font-family:consolas;font-size:100%;"  &gt;dm.inspecoes&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt;"&gt;&lt;span style=";font-family:consolas;font-size:100%;"  &gt; &lt;/span&gt;                   &lt;span style=";font-family:consolas;font-size:100%;"  &gt;&lt;span style="color:blue;"&gt;where &lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:consolas;font-size:100%;"  &gt;i&lt;/span&gt;&lt;span style=";font-family:consolas;font-size:100%;"  &gt;.idtipo_operacao == 5&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt;"&gt;&lt;span style=";font-family:consolas;font-size:100%;"  &gt;&lt;span style=""&gt;            &lt;/span&gt;&lt;span style="color:blue;"&gt;select&lt;/span&gt; i2.chassi)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt;"&gt;&lt;span style=";font-family:consolas;font-size:100%;"  &gt;&lt;span style=""&gt;           &lt;/span&gt;.Contains(i.chassi) &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt;"&gt;&lt;span style=";font-family:consolas;font-size:100%;"  &gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;span style="color:blue;"&gt;select&lt;/span&gt; i;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;span style=";font-family:consolas;font-size:100%;color:blue;"   &gt;foreach&lt;/span&gt;&lt;span style=";font-family:consolas;font-size:9pt;"  &gt;&lt;span style="font-size:100%;"&gt; (&lt;/span&gt;&lt;span style=";font-size:100%;color:blue;"  &gt;var&lt;/span&gt;&lt;span style="font-size:100%;"&gt; c &lt;/span&gt;&lt;span style=";font-size:100%;color:blue;"  &gt;in&lt;/span&gt;&lt;span style="font-size:100%;"&gt; query) &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);font-size:100%;" &gt;Console&lt;/span&gt;&lt;span style="font-size:100%;"&gt;.WriteLine( c );&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Nossa, fiquei super alegre em saber que eu poderia utilizar o Contains, que geraria uma clausula CONTAINS no comando SQL final.&lt;br /&gt;Dai fui implementar...e...nada! :S&lt;br /&gt;Dava o seguinte erro:&lt;br /&gt;&lt;h2&gt;&lt;span style="font-size:100%;"&gt;&lt;em&gt;&lt;em&gt;&lt;em&gt;&lt;em&gt;LINQ to Entities does not recognize the method 'Boolean  Contains[String](System.Linq.IQueryable`1[System.String],  System.String)' method, and this method cannot be translated into a  store expression.&lt;/em&gt;&lt;/em&gt;&lt;/em&gt;&lt;/em&gt;&lt;/span&gt;&lt;/h2&gt;Igual diz o Milton Leite: "Que beleza!"&lt;br /&gt;Pesquisando na internet, vi que o Entity não tem suporte para o método Contains. Dai pensei: Que padronização maravilhosa! essa é a Microsoft! :(&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 102, 0);font-family:arial;font-size:130%;"  &gt;A SUBQUERY &lt;/span&gt;&lt;br /&gt;Uma forma que eu arrumei de solucionar esse problema, é utilizar a clausula Where da minha entidade.&lt;br /&gt;Primeiro de tudo, eu separei a subquery em uma outra variavel.&lt;br /&gt;Nessa subquery, nós possuimos todas as ocorrências que nós queremos inserir dentro da clausula IN:&lt;br /&gt;&lt;br /&gt;    var subQuery = (from i2 in dm.inspecoes                     &lt;br /&gt;                               where idtipo_operacao == 5                              &lt;br /&gt;                               select new { chassi = "'" + i2.chassi + "'" });&lt;br /&gt;&lt;br /&gt;Como o campo do meu critério é do tipo VARCHAR e não INT, eu preciso inserir uma apostrofe antes e depois do valor de cada campo, dai o resultado seria: { '123455abcde', '987654fedcba'}&lt;br /&gt;Até ai beleza, montamos nossa SubQuery.&lt;br /&gt;Agora, precisamos passar os valores para um array, para que posteriormente tenhamos os valores dentro da clausula IN. Nossa array fica dessa forma:&lt;br /&gt;&lt;br /&gt;string[] resultados;&lt;br /&gt;resultados = subQuery.Select(r =&gt; r.chassi).ToArray();&lt;br /&gt;&lt;br /&gt;Para finalizar, basta inserirmos a clausula IN ou NOT IN em nossa query principal:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 102, 0); font-weight: bold;font-family:arial;font-size:130%;"  &gt;A QUERY PRINCIPAL E A SOLUÇÃO&lt;/span&gt;&lt;br /&gt;var queryFinal =  dm.inspecoes.Where("it.idtipo_operacao = 6 AND it.chassi IN {" + string.Join(",", resultados) + "}");&lt;br /&gt;&lt;br /&gt;Notem que eu usei como alias para a minha tabela a sigla "it". Esse alias é criado pelo Emtity por padrão para a entidade selecionada.&lt;br /&gt;&lt;br /&gt;Depois, com esse resultado você pode voltar um list ou um array.&lt;br /&gt;return queryFinal.ToList();&lt;br /&gt;return queryFinal.ToArray();&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 102, 0);font-family:arial;font-size:130%;"  &gt;OBSERVAÇÕES&lt;/span&gt;&lt;br /&gt;Como o Entity Framework não tem suporte para o Contains, esse foi um método que consegui obter o resultado que queria. Porém, se formos pensar bem, teremos uma queda de desempenho considerável em nossa query.&lt;br /&gt;O que a query acima faz, é o seguinte:&lt;br /&gt;SELECT * FROM inspecoes i WHERE i.chassi NOT  IN ('331311233', '2323434244', '2342324234', '2343232423');&lt;br /&gt;&lt;br /&gt;Lembra que passamos o resultado da subquery para um array? Então, esse array nada mais é que o seguinte resultado: { '331311233', '2323434244', '2342324234', '2343232423' }&lt;br /&gt;&lt;br /&gt;Se o Entity desse suporte para o Contains, o resultado final seria:&lt;br /&gt;SELECT * FROM inspecoes i WHERE i.idtipo_operacao = 6 AND i.chassi NOT  IN (SELECT chassi FROM i i2 WHERE i2.idtipo_operacao = 5)&lt;br /&gt;&lt;br /&gt;A consulta SQL seria mais rápida, porque o SGBD não precisará verificar valor por valor do conteudo que esta na clausula IN. Sem contar que podemos ter o campo "chassi" indexado, o que ajudaria no desempenho de nossas consultas.&lt;br /&gt;&lt;br /&gt;To passando um perrengue danado com esse Entity, mas chego lá!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/830298852164908263-8445233257323495596?l=devutils.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devutils.blogspot.com/feeds/8445233257323495596/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=830298852164908263&amp;postID=8445233257323495596' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/830298852164908263/posts/default/8445233257323495596'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/830298852164908263/posts/default/8445233257323495596'/><link rel='alternate' type='text/html' href='http://devutils.blogspot.com/2010/08/declaracoes-in-e-not-in-no-linq-to.html' title='Declarações IN e NOT IN no Linq to Entity'/><author><name>Maurício Vinicius de O. Santos</name><uri>http://www.blogger.com/profile/10158075805974585222</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_l_YF-xHSDL4/STdFoMVcXEI/AAAAAAAAAAM/JXTfPHMPqmI/S220/ATgAAACOLsPwGjdpAa_SnOfdO8oYetUIkSOR5GaAc2aKfeEu6I4-M5gbzP0CnwnwwaDRa6r1hQ_cDneOBEkOgXyiYiANAJtU9VCdj81JzTyD8JjI5C1-yzkrumjLYA.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-830298852164908263.post-3098998355852157126</id><published>2010-07-29T20:18:00.001-07:00</published><updated>2010-07-30T05:14:24.258-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.Net'/><category scheme='http://www.blogger.com/atom/ns#' term='MYSQL'/><category scheme='http://www.blogger.com/atom/ns#' term='Linq'/><category scheme='http://www.blogger.com/atom/ns#' term='Entity framework'/><title type='text'>Menu dinâmico buscando itens da base de dados (ASP.Net)</title><content type='html'>Fala pessoaL!&lt;br /&gt;Nossa, faz muito tempo que não posto nada e para falar a verdade, faz tempo que eu nem acesso meu blog. Estou sem tempo e com muitas preocupações. Viajarei para a Australia no fim desse ano e isso esta me deixando ansioso e muito nervoso. Correria total!!&lt;br /&gt;Bom, como o blog não é sobre mim mas sim sobre análise e desenvolvimento de sistemas, vamos ao que interessa.&lt;br /&gt;&lt;br /&gt;Devido a um novo projeto da empresa, comecei a programar em asp.net C# há poucos dias. Precisei fazer um controle de login dos usuários e claro, um menu contendo todos os menus que o usuário tem acesso.&lt;br /&gt;Só que esses menus estão cadastrados na base de dados. E agora?&lt;br /&gt;Não achei nada na internet, nenhum blog de pessoas que já fizeram isso em asp.net e disponibilizaram.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 153, 0); font-weight: bold;font-family:arial;font-size:180%;"  &gt;TECNOLOGIAS E FERRAMENTAS UTILIZADAS&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Estou utilizando o modelo entidade relacional Entity Framework da Microsoft, acessando uma base de dados MySQL (the best database ever! ;) )&lt;br /&gt;&lt;br /&gt;Não irei tratar aqui sobre como fazer os relacionamentos das tabelas ou criação e associação entre as classes do nosso modelo objeto relacional, mas sim como criar o menu para o site e seus respectivos filhos.&lt;br /&gt;&lt;span style="font-weight: bold;font-family:arial;font-size:180%;"  &gt;&lt;br /&gt;&lt;span style="color: rgb(255, 153, 0);"&gt;TABELAS USADAS NO EXEMPLO&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Eu utilizei uma tabela com relacionamento Self One to Many. Para quem não conhece esse tipo de relacionamento, vale a pena dar uma olhada nesse outro post em meu blog:&lt;br /&gt;&lt;br /&gt;http://devutils.blogspot.com/2008/12/sql-relacionamentos-self-to-self.html&lt;br /&gt;&lt;br /&gt;CREATE DATABASE `exemplomenu`&lt;br /&gt;&lt;br /&gt;USE `exemplomenu`&lt;br /&gt;&lt;br /&gt;DROP TABLE IF EXISTS `menus_web`;&lt;br /&gt;&lt;br /&gt;CREATE TABLE `menus_web` (&lt;br /&gt;`idmenus` int(7) unsigned NOT NULL AUTO_INCREMENT,&lt;br /&gt;`nome` varchar(45) NOT NULL COMMENT 'nome do item de menu',&lt;br /&gt;`ordem` int(7) unsigned DEFAULT NULL COMMENT 'para ordenação dos itens de menu',&lt;br /&gt;`pai` int(7) unsigned DEFAULT NULL,&lt;br /&gt;`hint` varchar(255) DEFAULT NULL,&lt;br /&gt;`bitmap` int(7) DEFAULT NULL COMMENT 'icone do item de menu',&lt;br /&gt;`url` varchar(50) DEFAULT NULL,&lt;br /&gt;PRIMARY KEY (`idmenus`),&lt;br /&gt;KEY `fk_menus_menus1` (`pai`)&lt;br /&gt;) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=latin1;&lt;br /&gt;&lt;br /&gt;/*Data for the table `menus_web` */&lt;br /&gt;&lt;br /&gt;insert  into `menus_web`(`idmenus`,`nome`,`ordem`,`pai`,`hint`,`bitmap`,`url`) values (1,'Veículos',50,NULL,NULL,NULL,''),(2,'Relatórios',NULL,1,NULL,NULL,''),(3,'Por responsabilidade',NULL,2,NULL,NULL,'/veiculos/relatorios/responsabilidade.aspx'),(4,'Avarias por montadora',NULL,7,NULL,NULL,''),(5,'Avarias por modelo',NULL,7,NULL,NULL,''),(6,'Avarias por peça',NULL,7,NULL,NULL,''),(7,'Gráficos',NULL,1,NULL,NULL,''),(8,'Por responsabilidade e período',NULL,2,NULL,NULL,''),(9,'Algodão',NULL,NULL,NULL,NULL,''),(10,'Relatórios',NULL,9,NULL,NULL,''),(11,'Sair',NULL,NULL,NULL,NULL,'sair.aspx');&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:arial;font-size:180%;"  &gt;&lt;span style="color: rgb(255, 153, 0);"&gt;CRIAÇÃO DO MENU&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Utilizarei o componente Menu, que se encontra na aba Navigation da ToolBox. Vamos deixar o ID dele como Menu1.&lt;br /&gt;&lt;br /&gt;Repare que o menu possui uma propriedade chamada MaximumDynamicDisplayLevels. Essa propriedade diz quantos nodes filhos o menu poderá ter.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;    //Objeto do tipo MenuItem (node de um menu)&lt;/span&gt;&lt;br /&gt;MenuItem vMenu;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;//Objeto array, do tipo MenuItem&lt;/span&gt;&lt;br /&gt;MenuItem[] vMenu2 = new MenuItem[5];&lt;br /&gt;int vCont = 0;&lt;br /&gt;&lt;br /&gt;Primeriamente vamos gerar um procedimento que nos traz todos os menus pais, ou seja, que  contenha o valor pai igual a vazio.&lt;br /&gt;&lt;br /&gt;private void GerarMenu()&lt;br /&gt;{&lt;br /&gt;   using (kerpModel.kerpModelEntities dm = new kerpModel.kerpModelEntities())&lt;br /&gt;   {&lt;br /&gt;     &lt;span style="color: rgb(51, 51, 255);"&gt;  //SELECIONA OS DADOS DO MENU POR MEIO DO LINQ&lt;/span&gt;&lt;br /&gt;       var consMenu = (from m in dm.menus_web&lt;br /&gt;                       where m.pai == null&lt;br /&gt;                       select m);&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;      &lt;span style="color: rgb(51, 51, 255);"&gt; //CORRE OS REGISTROS DO MENU&lt;/span&gt;&lt;br /&gt;       foreach(kerpModel.menus_web row in consMenu)&lt;br /&gt;       {&lt;br /&gt;          &lt;span style="color: rgb(51, 51, 255);"&gt;//Cria um novo node para o menu&lt;/span&gt;&lt;br /&gt;           vMenu = new MenuItem(row.nome.ToString());&lt;br /&gt;&lt;br /&gt;           vMenu.NavigateUrl = row.url.ToString();&lt;br /&gt;           Menu1.Items.Add(vMenu);         &lt;br /&gt;           &lt;span style="color: rgb(51, 51, 255);"&gt;//Chama o procedimento que verifica se o menu possui filhos, passando o id do menu como parametro&lt;/span&gt;&lt;br /&gt;           this.GerarMenuFilho(int.Parse(row.idmenus.ToString()));&lt;br /&gt;       }&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;//Função que adiciona os filhos do item de menu&lt;/span&gt;&lt;br /&gt;private void GerarMenuFilho(int idpai)&lt;br /&gt;{&lt;br /&gt;   using (kerpModel.kerpModelEntities dm = new kerpModel.kerpModelEntities())&lt;br /&gt;   {&lt;br /&gt;       &lt;span style="color: rgb(51, 51, 255);"&gt;//SELECIONA OS DADOS DO MENU, QUE TEVE O ID PASSADO POR PARAMETRO&lt;/span&gt;&lt;br /&gt;       var consMenu = (from m in dm.menus_web&lt;br /&gt;                       where m.pai == idpai&lt;br /&gt;                       select m);&lt;br /&gt;&lt;br /&gt;       &lt;span style="color: rgb(51, 51, 255);"&gt;//CORRE OS REGISTROS DO MENU&lt;/span&gt;&lt;br /&gt;       foreach (kerpModel.menus_web row in consMenu)&lt;br /&gt;       {          &lt;br /&gt;          &lt;span style="color: rgb(51, 51, 255);"&gt; //Chama a função que verifica se o menu atual também possui filhos&lt;/span&gt;&lt;br /&gt;           if (totalFilhos(int.Parse(row.idmenus.ToString())) &gt; 0)&lt;br /&gt;           {&lt;br /&gt;               &lt;span style="color: rgb(51, 51, 255);"&gt;//Adiciona o menu ao array de menus, para que ele possa ser recuperado posteriormente&lt;/span&gt;&lt;br /&gt;               vMenu2[vCont] = vMenu;             &lt;br /&gt;              &lt;span style="color: rgb(51, 51, 255);"&gt; //Variavel que conta quantos nodes principais o menu possui&lt;/span&gt;&lt;br /&gt;               vCont++;&lt;br /&gt;               &lt;span style="color: rgb(51, 51, 255);"&gt;//Adiciona o filho atual ao menu e ao mesmo tempo diz que agora o novo menu é ele mesmo&lt;/span&gt;&lt;br /&gt;               vMenu.ChildItems.Add(vMenu = new MenuItem(row.nome.ToString(), null, null, row.url.ToString(), null));&lt;br /&gt;               &lt;span style="color: rgb(51, 51, 255);"&gt;//Chama novamente a função, e adiciona seus filhos&lt;/span&gt;&lt;br /&gt;               this.GerarMenuFilho(int.Parse(row.idmenus.ToString()));&lt;br /&gt;           }&lt;br /&gt;           else&lt;br /&gt;           {&lt;br /&gt;              &lt;span style="color: rgb(51, 51, 255);"&gt;//Caso o item não possua filos, apenas o adiciona como um novo node&lt;/span&gt;&lt;br /&gt;               vMenu.ChildItems.Add(new MenuItem(row.nome.ToString(), null, null, "~"+row.url.ToString(), null));&lt;br /&gt;           }          &lt;br /&gt;       }&lt;br /&gt; &lt;br /&gt;   &lt;span style="color: rgb(51, 51, 255);"&gt;    //Aqui esta o segredinho. Foi para isso que eu criei o contador. Cada vez que o node e seus filhos sao criados, ainda é necessário criar os outros nodes faltantes, mas esses nodes precisam ser inseridos em seus pais. Cada vez que o cursor passa por aqui, dizemos que o menu atual é o menu pai anterior. Dificil de entender, né? para entender, debuge a aplicação.&lt;/span&gt;&lt;br /&gt;       vCont--;&lt;br /&gt;       if(vCont &gt;= 0)&lt;br /&gt;           vMenu = vMenu2[vCont];&lt;br /&gt; &lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt; //Função que verifica se o menu possui filhos&lt;/span&gt;&lt;br /&gt;private int totalFilhos(int idmenu)&lt;br /&gt;{&lt;br /&gt;   int count = 0;&lt;br /&gt;   using (kerpModel.kerpModelEntities dm = new kerpModel.kerpModelEntities())&lt;br /&gt;   {&lt;br /&gt;       count = (from m in dm.menus_web&lt;br /&gt;                where m.pai == idmenu&lt;br /&gt;                select m).Count();&lt;br /&gt;   }&lt;br /&gt;   return count;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;//Para finalizar, no nosso Page_Load nós chamamos o procedimento &lt;/span&gt;&lt;br /&gt;protected void Page_Load(object sender, EventArgs e)&lt;br /&gt;{&lt;br /&gt;   if (!Page.IsPostBack)&lt;br /&gt;   {&lt;br /&gt;       this.GerarMenu();&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Pessoal, peço desculpas por estar ausente do blog. Esta muito dificil de acessá-lo. Mas assim que for possível, responderei a seus comentários. Obrigado.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/830298852164908263-3098998355852157126?l=devutils.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devutils.blogspot.com/feeds/3098998355852157126/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=830298852164908263&amp;postID=3098998355852157126' title='4 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/830298852164908263/posts/default/3098998355852157126'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/830298852164908263/posts/default/3098998355852157126'/><link rel='alternate' type='text/html' href='http://devutils.blogspot.com/2010/07/menu-dinamico-buscando-itens-de-menu-da.html' title='Menu dinâmico buscando itens da base de dados (ASP.Net)'/><author><name>Maurício Vinicius de O. Santos</name><uri>http://www.blogger.com/profile/10158075805974585222</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_l_YF-xHSDL4/STdFoMVcXEI/AAAAAAAAAAM/JXTfPHMPqmI/S220/ATgAAACOLsPwGjdpAa_SnOfdO8oYetUIkSOR5GaAc2aKfeEu6I4-M5gbzP0CnwnwwaDRa6r1hQ_cDneOBEkOgXyiYiANAJtU9VCdj81JzTyD8JjI5C1-yzkrumjLYA.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-830298852164908263.post-6515925266924549843</id><published>2009-08-20T05:11:00.000-07:00</published><updated>2009-08-20T07:06:40.427-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Zend Framework'/><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><title type='text'>Dump com FirePHP/FireBUG e Zend Framework</title><content type='html'>Esses dias que eu estava me atualizando na internet, me deparei com um artigo falando sobre o FirePHP, que até aquele momento me era desconhecido.&lt;br /&gt;Para todos os desenvolvedores que trabalham com Javascript em especialmente Ajax, o Firebug do Firefox é uma ferramenta "ferrada" para o debug e dump das informações  que foram criadas via Javascript.&lt;br /&gt;&lt;br /&gt;E que tal termos algo parecido só que para o PHP? Seria legal, não é verdade? É exatamente isso que o FirePHP faz.&lt;br /&gt;&lt;br /&gt;Eu não falarei exatamente sobre o FirePHP, mas falarei sim sobre como utilizálo no Zend Framework por meio das classes já existentes no nosso maravilhoso framework que é uma mão na roda!&lt;br /&gt;&lt;br /&gt;Quem quiser saber mais sobre o FirePHP, aconselho ler o mesmo artigo que li no imasters:&lt;br /&gt;http://imasters.uol.com.br/artigo/13959/php/_como_debugar_aplicacoes_ajaxphp_com_firephp/&lt;br /&gt;&lt;br /&gt;E também indico o manual do Zend que fala sobre o FirePHP:&lt;br /&gt;http://framework.zend.com/manual/en/zend.log.writers.html#zend.log.writers.firebug&lt;br /&gt;&lt;br /&gt;É por isso que gosto do Zend, pela sua vasta documentação :)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);font-family:arial;font-size:130%;"  &gt;&lt;span style="font-weight: bold;"&gt;CRIANDO AS INSTÂNCIAS NECESSÁRIAS&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;O FirePHP funciona como um log. Do mesmo jeito que criamos log por meio da classe Zend_Log. É o Zend_Log quem delega o log atual registrado para os "log writers" e o Zend_Log_Writer_FireBug é um componente writer que envia o log para o FirePHP.&lt;br /&gt;&lt;br /&gt;Em seu bootstrap, antes de você dar um dispatcher em seu controller, insira as linhas abaixo:&lt;br /&gt;&lt;br /&gt;$logger = new Zend_Log();&lt;br /&gt;$writer = new Zend_Log_Writer_Firebug();&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(0, 0, 153);"&gt;//DIZ AO LOG QUEM É O WRITER, OU SEJA, QUEM IRÁ GRAVAR OS LOGS&lt;/span&gt;&lt;br /&gt;$logger-&gt;addWriter($writer);&lt;br /&gt;&lt;br /&gt;Para utilizar seu log em todo o seu projeto, você pode manter uma instancia do seu Logger para toda a aplicação e usar em suas views, controllers e models:&lt;br /&gt;Zend_Registry::set('logger',$logger);&lt;br /&gt;&lt;br /&gt;Utilizando o Logger:&lt;br /&gt;$logger = Zend_Registry::get('logger');&lt;br /&gt;$logger-&gt;log('Mensagem de log para o FirePHP!', Zend_Log::INFO);&lt;br /&gt;&lt;br /&gt;Repare na constante INFO da classe Zend_Log.&lt;br /&gt;Toda vez que chamarmos um Log, no FireBug do firefox será mostrada um ícone de informação com a mensagem do primeiro parametro.&lt;br /&gt;Você também pode utilizar as constantes WARN ou ALERT como referência de log ou prioridade das mensagens.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://framework.zend.com/manual/en/figures/zend.wildfire.firebug.console.png"&gt;&lt;img style="cursor: pointer; width: 310px; height: 151px;" src="http://framework.zend.com/manual/en/figures/zend.wildfire.firebug.console.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Um exemplo disso, é utilizarmos esse log em blocos Try catch.&lt;br /&gt;Exemplo:&lt;br /&gt;try {&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(0, 0, 153);"&gt;// Caso tenha ocorrido algum erro&lt;/span&gt;&lt;br /&gt;} catch(Exception $e) {&lt;br /&gt;Zend_Registry::get('logger')-&gt;err($e)&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;ou também de outra forma:&lt;br /&gt;&lt;br /&gt;try {&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153); font-style: italic;"&gt;// Caso tenha ocorrido algum erro&lt;/span&gt;&lt;br /&gt;} catch(Exception $e) {&lt;br /&gt;$logger-&gt;log('Erro em bloco try catch ao tentar inserir dados na Base: '.$e, Zend_Log::ALERT);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);font-family:arial;font-size:130%;"  &gt;&lt;span style="font-weight: bold;"&gt;DUMP DE INFORMAÇÕES PROCESSADAS NA BASE DE DADOS&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Seria legal nós termos um dump de todas as operações que são feitas em nossa base de dados, não acha?&lt;br /&gt;Mas seria um saco, cansativo e de grande manutenabilidade termos que chamar nosso log toda hora.&lt;br /&gt;&lt;br /&gt;Mas..olha só como o Zend é camarada...rs&lt;br /&gt;No seu bootstrap mesmo, insira as seguintes linhas de código depois de ter setado o seu Adapter e antes do dispatcher do seu controller:&lt;br /&gt;&lt;br /&gt;$profiler = new Zend_Db_Profiler_Firebug('All DB Queries');&lt;br /&gt;$profiler-&gt;setEnabled(true);&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(0, 0, 153);"&gt;//$db SERIA O SEU ADAPTER CONFIGURADO PARA ACESSAR A BASE DE DADOS.&lt;/span&gt;&lt;br /&gt;$db-&gt;setProfiler($profiler);&lt;br /&gt;&lt;br /&gt;Com esse código, toda vez que for enviada uma instrução SQL para nossa base, o FirePHP nos mostrará os dados enviados para o servidor, parecido com a imagem abaixo:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_l_YF-xHSDL4/So1Vu5c905I/AAAAAAAAAEY/O8NK9K5w-Us/s1600-h/firePHP1.JPG"&gt;&lt;img style="cursor: pointer; width: 400px; height: 150px;" src="http://4.bp.blogspot.com/_l_YF-xHSDL4/So1Vu5c905I/AAAAAAAAAEY/O8NK9K5w-Us/s400/firePHP1.JPG" alt="" id="BLOGGER_PHOTO_ID_5372044194707526546" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);font-family:arial;font-size:130%;"  &gt;&lt;span style="font-weight: bold;"&gt;DICAS&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Em meu firebug, eu tive que habilitar a opção Rede (Última aba da janela do FireBug).&lt;br /&gt;Não esqueça de habilitar o seu FirePHP.&lt;br /&gt;Insira seu site na lista de (allowed Sites) do FirePHP&lt;br /&gt;Seria chato se os usuários que acessam o site visualizassem todos os dumps que usamos para nos basear em tempo de produção, não é verdade?&lt;br /&gt;Para não enviarmos mais o dump, não é necessário tirar todas as linhas de código dos nossos objetos. Basta fazer o seguinte:&lt;br /&gt;&lt;br /&gt;$writer-&gt;setEnabled(false);&lt;br /&gt;$profiler-&gt;setEnabled(false);&lt;br /&gt;&lt;br /&gt;Espero que tenham gostado da matéria e por favor, enviem sugestões, criticas ou elogios.&lt;br /&gt;Abraços.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/830298852164908263-6515925266924549843?l=devutils.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devutils.blogspot.com/feeds/6515925266924549843/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=830298852164908263&amp;postID=6515925266924549843' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/830298852164908263/posts/default/6515925266924549843'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/830298852164908263/posts/default/6515925266924549843'/><link rel='alternate' type='text/html' href='http://devutils.blogspot.com/2009/08/dump-com-firephpfirebug-no-zend.html' title='Dump com FirePHP/FireBUG e Zend Framework'/><author><name>Maurício Vinicius de O. Santos</name><uri>http://www.blogger.com/profile/10158075805974585222</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_l_YF-xHSDL4/STdFoMVcXEI/AAAAAAAAAAM/JXTfPHMPqmI/S220/ATgAAACOLsPwGjdpAa_SnOfdO8oYetUIkSOR5GaAc2aKfeEu6I4-M5gbzP0CnwnwwaDRa6r1hQ_cDneOBEkOgXyiYiANAJtU9VCdj81JzTyD8JjI5C1-yzkrumjLYA.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_l_YF-xHSDL4/So1Vu5c905I/AAAAAAAAAEY/O8NK9K5w-Us/s72-c/firePHP1.JPG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-830298852164908263.post-4216815258151000240</id><published>2009-08-03T13:18:00.000-07:00</published><updated>2009-08-06T13:10:08.437-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Zend Framework'/><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><title type='text'>Upload de arquivos com Zend Framework - Parte 2</title><content type='html'>Pessoal,&lt;br /&gt;Criei uma classe que utiliza o Zend_File para o upload de arquivos.&lt;br /&gt;Como sempre tive problemas ao postar códigos nesse blog, tive novamente que dar um printscreen da tela...&lt;br /&gt;&lt;br /&gt;Eu criei uma classe abstrata chamada Utils, onde implemento todos os métodos que utilizo frequentemente em meu projeto.&lt;br /&gt;Os métodos que crio nessa classe são estáticos, pq não precisarei criar uma estância deles cada vez que eu for utilizá-los.&lt;br /&gt;Eu criei um diretório chamado "classes" dentro de application. Basta adicionar o include_path desse diretório em seu bootstrap.&lt;br /&gt;&lt;br /&gt;Essa classe faz upload de todos os campos do tipo file que tiver na página.&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="font-weight: bold;"&gt;@UploadDir:&lt;/span&gt; Diretório para onde será encaminhado o arquivo&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="font-weight: bold;"&gt;@renameFile:&lt;/span&gt; Caso deseja renomear os arquivos para que não haja overwrite, deixe este parâmetro como true. Caso contrário, o arquivo sofrerá overwrite.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="font-weight: bold;"&gt;@allowedFiles:&lt;/span&gt; Caso filtrar os tipos de arquivos à enviar, crie um array contendo os formatos permitidos.&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_l_YF-xHSDL4/SndHmYXOYUI/AAAAAAAAAEI/CxvfmEbK6SI/s1600-h/zend_upload1_marca.jpg"&gt;&lt;img style="cursor: pointer; width: 400px; height: 326px;" src="http://1.bp.blogspot.com/_l_YF-xHSDL4/SndHmYXOYUI/AAAAAAAAAEI/CxvfmEbK6SI/s400/zend_upload1_marca.jpg" alt="" id="BLOGGER_PHOTO_ID_5365836205735698754" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Reparem que eu utilizei um método da própria classe, que serve para identificar a extensão do arquivo.&lt;br /&gt;Segue abaixo o código desse método estático:&lt;br /&gt;&lt;blockquote&gt;    static function findexts($filename)&lt;br /&gt;    {&lt;br /&gt;            $filename = strtolower($filename) ;&lt;br /&gt;&lt;br /&gt;            $exts = split("[/\\.]", $filename) ;&lt;br /&gt;&lt;br /&gt;            $n = count($exts)-1;&lt;br /&gt;&lt;br /&gt;            $exts = $exts[$n];&lt;br /&gt;&lt;br /&gt;            return $exts;&lt;br /&gt;    }&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Para chamar a classe em Seus controllers:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_l_YF-xHSDL4/SndHvb9KYrI/AAAAAAAAAEQ/XqMTVBh_fYg/s1600-h/zend_upload2_marca.jpg"&gt;&lt;img style="cursor: pointer; width: 400px; height: 42px;" src="http://1.bp.blogspot.com/_l_YF-xHSDL4/SndHvb9KYrI/AAAAAAAAAEQ/XqMTVBh_fYg/s400/zend_upload2_marca.jpg" alt="" id="BLOGGER_PHOTO_ID_5365836361318949554" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Caso você queira permitir todos os tipos de arquivos, basta não passar o 3º parâmetro para a classe.&lt;br /&gt;&lt;br /&gt;Caso o nome dos arquivos sejam renomeados, o nome inicial do arquivo será o nome do input, por exemplo: foto_perfil....jpg&lt;br /&gt;Para verificar se houve erro no envio de algum arquivo, você pode fazer o seguinte tratamento:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="color: rgb(0, 0, 153); font-style: italic;"&gt;//LOOP EM CIMA DOS ARQUIVOS ENVIADOS&lt;/span&gt;&lt;br /&gt;foreach($filesUploaded as $fileUploaded)&lt;br /&gt;{&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153); font-style: italic;"&gt;   //HOUVE ERRO NO ARQUIVO?  &lt;/span&gt;&lt;br /&gt;    if(!strpos($fileUploaded, 'Erro:')) {...}&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Qualquer dúvida, fiquem avontade de incluir comentários.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Instead of reinventing the wheel, I use Frameworks. ZEND FRAMEWORK! ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/830298852164908263-4216815258151000240?l=devutils.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devutils.blogspot.com/feeds/4216815258151000240/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=830298852164908263&amp;postID=4216815258151000240' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/830298852164908263/posts/default/4216815258151000240'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/830298852164908263/posts/default/4216815258151000240'/><link rel='alternate' type='text/html' href='http://devutils.blogspot.com/2009/08/upload-de-arquivos-com-zend-framework.html' title='Upload de arquivos com Zend Framework - Parte 2'/><author><name>Maurício Vinicius de O. Santos</name><uri>http://www.blogger.com/profile/10158075805974585222</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_l_YF-xHSDL4/STdFoMVcXEI/AAAAAAAAAAM/JXTfPHMPqmI/S220/ATgAAACOLsPwGjdpAa_SnOfdO8oYetUIkSOR5GaAc2aKfeEu6I4-M5gbzP0CnwnwwaDRa6r1hQ_cDneOBEkOgXyiYiANAJtU9VCdj81JzTyD8JjI5C1-yzkrumjLYA.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_l_YF-xHSDL4/SndHmYXOYUI/AAAAAAAAAEI/CxvfmEbK6SI/s72-c/zend_upload1_marca.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-830298852164908263.post-169968603664701076</id><published>2009-07-17T08:12:00.000-07:00</published><updated>2009-07-19T19:32:10.519-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='JQuery'/><category scheme='http://www.blogger.com/atom/ns#' term='AJAX'/><title type='text'>FUNÇÃO AJAX C/ JQUERY</title><content type='html'>E ai pessoal,&lt;br /&gt;Tenho demorado para postar pq estou muuuuuito sem tempo :(&lt;br /&gt;&lt;br /&gt;Está mais correria do que nunca, mas a vida honesta é dura, faz parte.&lt;br /&gt;&lt;br /&gt;Eu comecei outro projeto nesse mes.&lt;br /&gt;É um site de relacionamentos e terá muitas coisas em Ajax.&lt;br /&gt;Eu pensei então em escrever uma função que me auxiliasse toda vez que fosse preciso carregar meus dados sem dar um Refresh na página inteira.&lt;br /&gt;Essa função que eu desenvolvi é bem simples de utilizar.&lt;br /&gt;Eu testei várias vezes e até agora tem suprido minhas necessidades.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 102, 0);font-family:arial;font-size:130%;"  &gt;As funções Javascript.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Infelizmente, o blog não me permite inserir códigos javascript. Então dei um printscreen da minha tela..e estou passando para vocês.&lt;br /&gt;&lt;br /&gt;A PRIMERA FUNÇÃO QUE CHAMEI DE isArray, É RESPONSÁVEL POR VERIFICAR SE O OBJETO PASSADO É UM ARRAY&lt;br /&gt;&lt;br /&gt;A SEGUNDA FUNÇÃO É A ALMA DO NEGÓCIO, A FUNÇÃO callAjax.&lt;br /&gt;Segue abaixo alguns detalhes sobre os parâmetros&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(0, 0, 153);"&gt;&lt;span style="font-weight: bold;"&gt;@CAMPO&lt;/span&gt; = NOME DO CONTAINER(DIV) QUE VOCÊ DESEJA ATUALIZAR&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(0, 0, 153);"&gt;&lt;span style="font-weight: bold;"&gt;@PARAMETRO&lt;/span&gt; = PARAMETROS QUE DESEJA PASSAR PARA A URL (PODE SER UM ARRAY)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(0, 0, 153);"&gt;&lt;span style="font-weight: bold;"&gt;@CAMPOVALOR&lt;/span&gt; = CAMPOS QUE POSSUEM OS VALORES REFERENTES AOS PARAMETROS (A SEQUENCIA DOS VALORES AQUI DEVEM ESTAR NA MESMA ORDEM QUE VOCÊ PASSOU O PARAMETRO. TAMBÉM PODE SER UM ARRAY)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(0, 0, 153);"&gt;&lt;span style="font-weight: bold;"&gt;@METODO&lt;/span&gt; = MÉTODO GET OU POST&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(0, 0, 153);"&gt;&lt;span style="font-weight: bold;"&gt;@VARURL&lt;/span&gt; = URL QUE VOCÊ DESEJA CHAMAR&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_l_YF-xHSDL4/SmCl0uAesRI/AAAAAAAAAEA/3msTOOHa6cc/s1600-h/js-callajax2.jpg"&gt;&lt;img style="cursor: pointer; width: 386px; height: 487px;" src="http://3.bp.blogspot.com/_l_YF-xHSDL4/SmCl0uAesRI/AAAAAAAAAEA/3msTOOHa6cc/s400/js-callajax2.jpg" alt="" id="BLOGGER_PHOTO_ID_5359465881692713234" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;parametro.length;i++){ else="" valor="jQuery(&amp;quot;#&amp;quot;+campovalor[i]).attr(&amp;quot;value&amp;quot;);" varparametro="varparametro+&amp;quot;&amp;amp;&amp;quot;+parametro[i]+&amp;quot;=&amp;quot;+valor;"&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 102, 0);font-size:130%;" &gt;&lt;span style="font-family:arial;"&gt;Módo de utilização&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Passando parâmetros e valores simples (não Array)&lt;/span&gt;&lt;br /&gt;&lt;div   style=";font-family:arial,helvetica,sans-serif;font-size:12pt;"&gt;&lt;div&gt;&lt;span style="font-style: italic; color: rgb(0, 0, 153);"&gt;//TODA VEZ QUE UM COMPONENTE COM O ID "button1" FOR CLICADO, REQUISITA A FUNÇÃO JS.&lt;/span&gt;&lt;br /&gt;$("#button1").click(function(){&lt;br /&gt;  callAjax('p_email', 'email', 'email', 'GET', 'verificaemail.php');&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Passando parâmetros e valores compostos (Array)&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;span style="font-style: italic; color: rgb(0, 0, 153);"&gt;//TODA VEZ QUE UM COMPONENTE COM O ID "button1" FOR CLICADO, REQUISITA A FUNÇÃO JS.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(0, 0, 153);"&gt;//PASSANDO 3 PARAMETROS PARA A PAGINA verificaemail.php&lt;/span&gt;&lt;br /&gt;parametros = new Array(3);&lt;br /&gt;parametros[0] = 'email';&lt;br /&gt;parametros[1] = 'idcliente';&lt;br /&gt;parametros[2] = 'idade';&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(0, 0, 153);"&gt;//PASSANDO 3 VALORES PARA A PAGINA verificaemail.php.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(0, 0, 153);"&gt;//AQUI OS VALORES (id dos campos input por exemplo) DEVEM ESTAR NA MESMA SEQUENCIA DOS PARÂMETROS&lt;/span&gt;&lt;br /&gt;valores = new Array(3);&lt;br /&gt;valores[0] = 'campo_email';&lt;br /&gt;valores[1] = 'campo_idcliente';&lt;br /&gt;valores[2] = 'campo_idade';&lt;br /&gt;&lt;br /&gt;O que seria enviado para a pagina verificaemail.php, seria o seguinte Querystring:&lt;br /&gt;?email=valordocampo&amp;amp;idcliente=valordocampo&amp;amp;idade=valordocampo&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt; Para chamar a função, é a mesma coisa. Idêntica como chamamos pelo primeiro exemplo:&lt;br /&gt;$("#button1").click(function(){&lt;br /&gt;  callAjax('p_email', parametros, valores, 'GET', 'verificaemail.php');&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;A função callAjax você pode colocar dentro de um arquivo .js por exemplo, incluindo junto com sua biblioteca de scripts.&lt;br /&gt;&lt;br /&gt;Para chamar a função como no exemplo acima, vc deve chamar dentro do ready do Jquery. Ficaria assim:&lt;br /&gt;&lt;br /&gt;$(document).ready(function() {&lt;br /&gt;&lt;br /&gt;$("#button1").click(function(){&lt;br /&gt;  callAjax('p_email', parametros, valores, 'GET', 'verificaemail.php');&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Blz pessoal?&lt;br /&gt;Desculpem a demora para postar.&lt;br /&gt;No outro post, espero postar algumas coisas a mais sobre o Zend Framework.&lt;br /&gt;Abraços...t+&lt;br /&gt;&lt;/parametro.length;i++){&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/830298852164908263-169968603664701076?l=devutils.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devutils.blogspot.com/feeds/169968603664701076/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=830298852164908263&amp;postID=169968603664701076' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/830298852164908263/posts/default/169968603664701076'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/830298852164908263/posts/default/169968603664701076'/><link rel='alternate' type='text/html' href='http://devutils.blogspot.com/2009/07/funcao-ajax-c-jquery.html' title='FUNÇÃO AJAX C/ JQUERY'/><author><name>Maurício Vinicius de O. Santos</name><uri>http://www.blogger.com/profile/10158075805974585222</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_l_YF-xHSDL4/STdFoMVcXEI/AAAAAAAAAAM/JXTfPHMPqmI/S220/ATgAAACOLsPwGjdpAa_SnOfdO8oYetUIkSOR5GaAc2aKfeEu6I4-M5gbzP0CnwnwwaDRa6r1hQ_cDneOBEkOgXyiYiANAJtU9VCdj81JzTyD8JjI5C1-yzkrumjLYA.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_l_YF-xHSDL4/SmCl0uAesRI/AAAAAAAAAEA/3msTOOHa6cc/s72-c/js-callajax2.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-830298852164908263.post-5070211294281815905</id><published>2009-06-23T07:31:00.001-07:00</published><updated>2009-06-23T11:00:57.792-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Zend Framework'/><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><title type='text'>Carrinho de compras com Zend Framework</title><content type='html'>E ai pessoal,&lt;br /&gt;Desculpem minha ausência, tenho me ocupado muito com alguns projetos que tenho feito por fora.&lt;br /&gt;&lt;br /&gt;Tenho mexido bastante com o Zend Framework e só tenho uma coisa a dizer: Estou tendo bem menos dor de cabeça do que quando programava com PHP puro. Isso sem falar da organização do projeto em MVC, os benefícios do Zend_Layout, etc.&lt;br /&gt;&lt;br /&gt;Em um dos projetos, tive que construir um carrinho de compras utilizando Session.&lt;br /&gt;Eu li um livro sobre Zend Framework, que ensina a criar um carrinho de compras com o Zend_Registry.&lt;br /&gt;O problema do Zend_Registry é que ele não utiliza sessões, mas sim variáveis globais.&lt;br /&gt;&lt;br /&gt;Eu não me basiei nesse livro, então caso saiba de qual livro estou me referindo, esqueça o carrinho que você aprendeu lá caso queira fazer um carrinho baseado em Session.&lt;br /&gt;&lt;br /&gt;Para a criação de Sessions no Zend, nós utilizamos a classe Zend_Session_Namespace();&lt;br /&gt;&lt;br /&gt;Como essa é uma classe singleton, caso já tenha sido criada uma instância da mesma, apenas é retornado a instância já criada. Você pode tentar criá-la várias vezes, mas ela apenas retornará a instância que já foi criada, até que ela seja liberada da memória.&lt;br /&gt;Ou seja, o Zend simplesmente ignora a criação do novo objeto vazio e continua a session com os mesmos valores já gravados.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Eu ajustei uma classe que peguei em um forum sobre ZF. Ela "manuseia" uma session e achei que valeria a pena incluí-la no meu projeto.&lt;br /&gt;&lt;br /&gt;Como tive muito problemas ao postar o código nesse blog, eu printei as telas.&lt;br /&gt;Pois o blog não estava permitindo que eu colocasse os conteudos&lt;br /&gt;&lt;br /&gt;Segue abaixo a classe. Você pode ajustá-la conforme suas necessidades. Para nosso carrinho, creio que seja o suficiente da forma como a deixei.&lt;br /&gt;&lt;br /&gt;&lt;span style=";font-family:arial;font-size:130%;"  &gt;&lt;span style="font-weight: bold; color: rgb(204, 102, 0);"&gt;CLASSE "CONTROLADORA" DAS NOSSAS SESSIONS&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_l_YF-xHSDL4/SkESNWfveLI/AAAAAAAAADg/nj6TZAqSEo4/s1600-h/classe_sessao+copy.jpg"&gt;&lt;img style="cursor: pointer; width: 410px; height: 361px;" src="http://4.bp.blogspot.com/_l_YF-xHSDL4/SkESNWfveLI/AAAAAAAAADg/nj6TZAqSEo4/s320/classe_sessao+copy.jpg" alt="" id="BLOGGER_PHOTO_ID_5350577852879173810" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Eu já dei o name do meu namespace de carrinho, mas você pode colocar no construtor da classe um parâmetro que seria o nome do seu namespace. Caso você não de um nome para o namespace, ele adota o valor Default.&lt;br /&gt;Ficaria assim: Zend_Session_Namespace('Default');&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:arial;font-size:130%;"  &gt;&lt;span style="color: rgb(204, 102, 0);"&gt;ACTION DE INCLUSÃO DE ITEM NO CARRINHO&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;sizeof existe="true;" caso="" o="" produto="" ainda="" nao="" tenha="" inserido="" adiciona="" mais="" um="" item="" na="" variavel="" carrinho="" que="" possui="" os="" itens="" cadastrados="" idproduto=""&gt;&lt;br /&gt;&lt;/sizeof&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_l_YF-xHSDL4/SkESV7id3_I/AAAAAAAAADo/VTdnVdgFQbU/s1600-h/action_carrinho+copy.jpg"&gt;&lt;img style="cursor: pointer; width: 320px; height: 308px;" src="http://4.bp.blogspot.com/_l_YF-xHSDL4/SkESV7id3_I/AAAAAAAAADo/VTdnVdgFQbU/s320/action_carrinho+copy.jpg" alt="" id="BLOGGER_PHOTO_ID_5350578000261668850" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;sizeof existe="true;" caso="" o="" produto="" ainda="" nao="" tenha="" inserido="" adiciona="" mais="" um="" item="" na="" variavel="" carrinho="" que="" possui="" os="" itens="" cadastrados="" idproduto=""&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 102, 0);font-family:arial;font-size:130%;"  &gt;LISTANDO OS ITENS NO CARRINHO&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Para listar os itens no carrinho é simples, basta fazer um foreach da variavel carrinho, que atribuimos o valor no nosso controller: &lt;span style="font-style: italic; font-weight: bold;"&gt;"$this-&gt;view-&gt;carrinho = $carrinho;"&lt;/span&gt;&lt;br /&gt;&lt;sizeof i=""&gt;&lt;sizeof guardando="" array="" mostrando="" dados="" incluidos="" no="" echo="" idproduto="" qtde="" atualizando="" e="" excluindo="" atualizar="" ou="" excluir="" coloquei="" checkbox="" em="" nosso="" carrinho="" de="" indice="$chave[$i];" mesmo="" eu="" aplico="" um="" submit="" do="" contendo="" os="" itens="" o="" rio="" nos="" para="" uma="" chamada="" segue="" abaixo="" minha="" action="" request="$this-"&gt;&lt;blockquote&gt;&lt;br /&gt;$carrinho = $this-&gt;carrinho;&lt;br /&gt;$chave = @array_keys($carrinho);&lt;br /&gt;for($ i = 0; $i &lt; count ($chave);$ i ++){&lt;br /&gt;$indice = $chave[$i];  &lt;span style="color: rgb(0, 0, 153); font-style: italic;"&gt;&lt;br /&gt;&lt;br /&gt;//CRIANDO O OBJETO DA NOSSA CLASSE DE PERSISTENCIA COM A BASE DE DADOS, DA TABELA PRODUTOS.&lt;/span&gt;&lt;br /&gt;$produtos = new Produtos();&lt;br /&gt;$where = "idproduto = ".$carrinho[$indice]['idproduto'];&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(0, 0, 153);"&gt;//PUXANDO OS DADOS DO PRODUTO&lt;/span&gt;&lt;br /&gt;$produto = $produtos-&gt;fetchRow($where);&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Eu estou criando um objeto da nossa classe de persistencia (model), para poder visualizar o nome do produto, qtde em estoque, entre outras coisas.&lt;br /&gt;Você pode usar seu próprio modelo.&lt;br /&gt;Caso queira apenas mostrar o código do produto e quantidade escolhida pelo usuário, você poderia implementar o código abaixo:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;$carrinho = $this-&gt;carrinho;&lt;br /&gt;$chave = @array_keys($carrinho);&lt;br /&gt;&lt;br /&gt;for($ i = 0;$ i&lt; sizeof ($chave); $ i ++){&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(0, 0, 153);"&gt;//GUARDANDO O INDICE DO ARRAY&lt;/span&gt;&lt;br /&gt;$indice = $chave[$i];&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(0, 0, 153);"&gt;//MOSTRANDO OS DADOS INCLUIDOS NO CARRINHO&lt;/span&gt;&lt;br /&gt;echo $carrinho[$indice]['idproduto']." - ".$carrinho[$indice]['qtde'];&lt;br /&gt;&lt;br /&gt;}&lt;sizeof i=""&gt;&lt;/sizeof&gt;&lt;/blockquote&gt;&lt;sizeof&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=";font-family:arial;font-size:130%;"  &gt;&lt;span style="font-weight: bold; color: rgb(204, 102, 0);"&gt;ATUALIZANDO E EXCLUINDO ITENS DO CARRINHO&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Para atualizar ou excluir itens de um carrinho, eu coloquei um checkbox em nosso carrinho de compras, contendo o indice do mesmo ($indice), então eu aplico um submit do formulário contendo os itens incluidos.&lt;br /&gt;O formulário nos enviará para uma action chamada udcarrinhoAction().&lt;br /&gt;&lt;br /&gt;Segue abaixo minha action udcarrinho:&lt;br /&gt;&lt;/sizeof&gt;&lt;/sizeof&gt;&lt;/sizeof&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_l_YF-xHSDL4/SkESvvBBkhI/AAAAAAAAADw/2NIILhZ3baA/s1600-h/action_udcarrinho+copy.jpg"&gt;&lt;img style="cursor: pointer; width: 400px; height: 289px;" src="http://3.bp.blogspot.com/_l_YF-xHSDL4/SkESvvBBkhI/AAAAAAAAADw/2NIILhZ3baA/s400/action_udcarrinho+copy.jpg" alt="" id="BLOGGER_PHOTO_ID_5350578443576775186" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;sizeof existe="true;" caso="" o="" produto="" ainda="" nao="" tenha="" inserido="" adiciona="" mais="" um="" item="" na="" variavel="" carrinho="" que="" possui="" os="" itens="" cadastrados="" idproduto=""&gt;&lt;sizeof i=""&gt;&lt;sizeof guardando="" array="" mostrando="" dados="" incluidos="" no="" echo="" idproduto="" qtde="" atualizando="" e="" excluindo="" atualizar="" ou="" excluir="" coloquei="" checkbox="" em="" nosso="" carrinho="" de="" indice="$chave[$i];" mesmo="" eu="" aplico="" um="" submit="" do="" contendo="" os="" itens="" o="" rio="" nos="" para="" uma="" chamada="" segue="" abaixo="" minha="" action="" request="$this-"&gt;&lt;br /&gt;&lt;br /&gt;Caso vocês queiram apagar todos os itens do carrinho, basta usar o método emptySess da nossa classe.&lt;br /&gt;&lt;br /&gt;Caso tenham dúvidas em como montar o formulário do carrinho, entrem em contato comigo. Farei de tudo para ajudar.&lt;br /&gt;&lt;br /&gt;The Best regards for you guys!! ;)&lt;/sizeof&gt;&lt;/sizeof&gt;&lt;/sizeof&gt;&lt;/sizeof&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/830298852164908263-5070211294281815905?l=devutils.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devutils.blogspot.com/feeds/5070211294281815905/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=830298852164908263&amp;postID=5070211294281815905' title='13 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/830298852164908263/posts/default/5070211294281815905'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/830298852164908263/posts/default/5070211294281815905'/><link rel='alternate' type='text/html' href='http://devutils.blogspot.com/2009/06/carrinho-de-compras-com-zend-framework.html' title='Carrinho de compras com Zend Framework'/><author><name>Maurício Vinicius de O. Santos</name><uri>http://www.blogger.com/profile/10158075805974585222</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_l_YF-xHSDL4/STdFoMVcXEI/AAAAAAAAAAM/JXTfPHMPqmI/S220/ATgAAACOLsPwGjdpAa_SnOfdO8oYetUIkSOR5GaAc2aKfeEu6I4-M5gbzP0CnwnwwaDRa6r1hQ_cDneOBEkOgXyiYiANAJtU9VCdj81JzTyD8JjI5C1-yzkrumjLYA.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_l_YF-xHSDL4/SkESNWfveLI/AAAAAAAAADg/nj6TZAqSEo4/s72-c/classe_sessao+copy.jpg' height='72' width='72'/><thr:total>13</thr:total></entry><entry><id>tag:blogger.com,1999:blog-830298852164908263.post-5001288667019572684</id><published>2009-05-20T07:07:00.000-07:00</published><updated>2009-06-09T11:42:01.469-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Curiosidades'/><title type='text'>Prova da IBM</title><content type='html'>Para aqueles que estão terminando a faculdade e querem estagiar na IBM, é necessário fazer uma prova que é válida por 1 ano.&lt;br /&gt;A prova não é nenhum bicho de 7 cabeças, mas o que a torna difícil é o tempo para finalização das questões.&lt;br /&gt;&lt;br /&gt;A prova é dividida em 3 módulos: Exercícios de Lógica, Inglês e Redação.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0); font-weight: bold;font-family:arial;font-size:130%;"  &gt;TESTE DE LÓGICA&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Os problemas de lógica são divididos em 3 partes onde a primeira você possui 25 minutos, a segunda 15 minutos e a terceira 20 minutos. A cada 4 questões erradas 1 certa é anulada.&lt;br /&gt;&lt;br /&gt;Todas as questões possuem 5 alternativas, sendo que na primeira parte, a alternativa (E) diz que todas as alternativas anteriores estão incorretas.&lt;br /&gt;As questões da primeira parte são parecidas com as de baixo, mas claro que eu não me lembro exatamente como foram as questões, mas são  bem parecidas:&lt;br /&gt;&lt;br /&gt;Ex 1.: Antônio possui 60 reais e deseja comprar caixas de bombom para a namorada. Cada caixa custa 12,25. Quantas caixas Antônio poderá comprar?&lt;br /&gt;&lt;br /&gt;Ex 2: Um ônibus possui 15 assentos de cada lado, porém 2 assentos foi retirado do lado direito para dar espaço à deficientes físicos.&lt;br /&gt;No fundo, o ônibus possui  5 assentos. Quantos assentos tem no total?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;A segunda parte é mais fácil. Você tem 5 códigos onde cada um diz respeito a uma categoria. Exemplo:&lt;br /&gt;&lt;br /&gt;Serviços de almoxarifado e organização dos eventos da Empresa - &lt;span style="font-weight: bold;"&gt;Cód A&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Instalações Elétricas e segurança - &lt;span style="font-weight: bold;"&gt;Cód B&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Serviços e materiais de Limpeza   - &lt;span style="font-weight: bold;"&gt;Cód C&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Manutenção de equipamentos eletrônicos - &lt;span style="font-weight: bold;"&gt;Cód D&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Em cada pergunta você deve responder à que categoria a pergunta melhor se adequa.&lt;br /&gt;Exemplo:&lt;br /&gt;&lt;br /&gt;1 - Repor produtos de limpeza&lt;br /&gt;2 - Arrumar impressora com defeito&lt;br /&gt;3 - Repor folhas para o almoxarifado&lt;br /&gt;4 - Consertar vazamento no banheiro do 13º andar.&lt;br /&gt;5 - Comprar canetas e folhas para impressão.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;E por aí vai. Essa é a parte mais fácill da prova de lógica.&lt;br /&gt;&lt;br /&gt;A terceira parte é um pouco mais chata, pelo menos na minha opinião.&lt;br /&gt;É dada uma tabela com horários de saída e chegada de aviões de 4 aeroportos e em cima disso, é dada algumas perguntas referente aos horarios.&lt;br /&gt;Sinceramente eu não me lembro de uma pergunta das questões dessa última parte, portanto eu ficarei devendo.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0); font-weight: bold;font-family:arial;font-size:130%;"  &gt;TESTE DE INGLÊS&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A prova de inglês é super fácil e tem o prazo de 15 minutos. Creio que com um nível intermediário você conseguirá gabaritar a prova facilmente.&lt;br /&gt;As questões de inglês possuem apenas 3 alternativas, o que torna ainda mais fácil a prova, porém neste teste a cada 1 erro, 1 questão certa é anulada. Portanto responda apenas as questões que você tenha certeza.&lt;br /&gt;&lt;br /&gt;Tipos de questão:&lt;br /&gt;&lt;br /&gt;1 - Have you ever _____ in Los Angeles?&lt;br /&gt;a) stay                            b) been                  c) be&lt;br /&gt;&lt;br /&gt;2 - Did you  ______ Maurício yesterday?&lt;br /&gt;a) see                  b) saw                               c) look&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0); font-weight: bold;font-family:arial;font-size:130%;"  &gt;REDAÇÃO&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Na redação você escolhe um dos 3 assuntos listados e possui prazo de 20 minutos:&lt;br /&gt;1 - Team working (trabalho em equipe)&lt;br /&gt;2 - Foco no cliente&lt;br /&gt;3 - Alguma coisa relacionada a novas idéias no trabalho, algo do tipo: Boas idéias, novas soluções, etc.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Não tem como eu lembrar tudo, mas creio que isso já ajuda à quem quer fazer a prova e deseja se preparar.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;&lt;span style="font-family: arial; font-weight: bold; color: rgb(204, 102, 0);"&gt;ATUALIZAÇÃO - 09/06/2009&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Pessoal, estou atualizando o blog para lhes informar que passei na prova.&lt;br /&gt;Depois da prova, me chamaram para uma dinâmica em grupo.&lt;br /&gt;&lt;br /&gt;Hasta Luego y buena prueba.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/830298852164908263-5001288667019572684?l=devutils.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devutils.blogspot.com/feeds/5001288667019572684/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=830298852164908263&amp;postID=5001288667019572684' title='8 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/830298852164908263/posts/default/5001288667019572684'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/830298852164908263/posts/default/5001288667019572684'/><link rel='alternate' type='text/html' href='http://devutils.blogspot.com/2009/05/prova-da-ibm.html' title='Prova da IBM'/><author><name>Maurício Vinicius de O. Santos</name><uri>http://www.blogger.com/profile/10158075805974585222</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_l_YF-xHSDL4/STdFoMVcXEI/AAAAAAAAAAM/JXTfPHMPqmI/S220/ATgAAACOLsPwGjdpAa_SnOfdO8oYetUIkSOR5GaAc2aKfeEu6I4-M5gbzP0CnwnwwaDRa6r1hQ_cDneOBEkOgXyiYiANAJtU9VCdj81JzTyD8JjI5C1-yzkrumjLYA.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-830298852164908263.post-8560605347182860397</id><published>2009-04-29T13:32:00.000-07:00</published><updated>2009-04-30T07:19:25.195-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Zend Framework'/><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><title type='text'>Agrupando Erros do Zend_Form em uma mesma linha</title><content type='html'>Toda vez que utilizamos o método&lt;span style="color: rgb(153, 0, 0);"&gt; &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(153, 0, 0);"&gt;isValid&lt;/span&gt; para validar nossos campos e emitir os erros no formulário, por padrão o ZF mostra os erros em baixo de cada Elemento, que é onde fica o decorate "Errors". E talvez gostaríamos de mostrar ao usuário os erros de uma vez só, jogando tudo em apenas uma linha.&lt;br /&gt;&lt;br /&gt;Para isso, nós utilizaremos os decorators da classe Zend_Form.&lt;br /&gt;&lt;br /&gt;Nosso resultado final será como a figura abaixo:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Para o nosso exemplo, a seguinte classe esta montada:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;class MeuForm extends Zend_Form&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;public function __construct($options = null)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;parent::__construct($options);&lt;br /&gt;&lt;br /&gt;$this-&gt;setMethod(’post’);&lt;br /&gt;&lt;br /&gt;$username=new Zend_Form_Element_Text(’login’, array(&lt;br /&gt;&lt;br /&gt;‘required’ =&gt; true,&lt;br /&gt;&lt;br /&gt;‘label’ =&gt; ‘Login:’,&lt;br /&gt;&lt;br /&gt;‘filters’ =&gt; array(’StringTrim’, ‘StringToLower’),&lt;br /&gt;&lt;br /&gt;‘validators’ =&gt; array(&lt;br /&gt;&lt;br /&gt;‘Alnum’,&lt;br /&gt;&lt;br /&gt;array(’Regex’,false,array(’/^[a-z][a-z0-9]{2,}$/’))&lt;br /&gt;&lt;br /&gt;)&lt;br /&gt;));&lt;br /&gt;&lt;br /&gt;$username-&gt;removeDecorator(’Errors’);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$password=new Zend_Form_Element_Password(senha’, array(&lt;br /&gt;&lt;br /&gt;‘required’ =&gt; true,&lt;br /&gt;&lt;br /&gt;‘label’ =&gt; ‘Senha:’,&lt;br /&gt;&lt;br /&gt;‘filters’ =&gt; array(’StringTrim’),&lt;br /&gt;&lt;br /&gt;‘validators’ =&gt; array(&lt;br /&gt;&lt;br /&gt;‘NotEmpty’,&lt;br /&gt;&lt;br /&gt;array(’StringLength’, false, array(6))&lt;br /&gt;&lt;br /&gt;)&lt;br /&gt;));&lt;br /&gt;&lt;br /&gt;$password-&gt;removeDecorator(’Errors’);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$save=new Zend_Form_Element_Submit(’save’, array(&lt;br /&gt;&lt;br /&gt;‘label’ =&gt; ’Salvar’,&lt;br /&gt;&lt;br /&gt;‘required’=&gt; false,&lt;br /&gt;&lt;br /&gt;‘ignore’ =&gt; true,&lt;br /&gt;));&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$this-&gt;addElements(array($username, $password, $save));&lt;br /&gt;&lt;br /&gt;$this-&gt;setDecorators(array(&lt;br /&gt;&lt;br /&gt;‘FormElements’,&lt;br /&gt;&lt;br /&gt;‘FormErrors’,&lt;br /&gt;&lt;br /&gt;‘Form’&lt;br /&gt;&lt;br /&gt;));&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;As linhas principais da nossa mudança são as seguintes:&lt;br /&gt;&lt;br /&gt;$username-&gt;removeDecorator(’Errors’);&lt;br /&gt;$password-&gt;removeDecorator(’Errors’);&lt;br /&gt;&lt;br /&gt;Se você não utilizar o parametro removeDecorator, com certeza os erros apareceram em baixo de cada elemento de seu formulário.&lt;br /&gt;Para os erros aparecerem agrupados, o seguinte decorator foi criado:&lt;br /&gt;$this-&gt;setDecorators(array(&lt;br /&gt;&lt;br /&gt;‘FormElements’,&lt;br /&gt;&lt;br /&gt;‘FormErrors’,&lt;br /&gt;&lt;br /&gt;‘Form’&lt;br /&gt;&lt;br /&gt;));&lt;br /&gt;&lt;br /&gt;quer incrementar mais ainda?&lt;br /&gt;Então no lugar de criar o decorator acima, crie o seguinte decorator:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;    $this-&gt;setDecorators(array(&lt;br /&gt;&lt;br /&gt;            ‘FormElements’,&lt;br /&gt;&lt;br /&gt;            new Zend_Form_Decorator_FormErrors(array(&lt;br /&gt;&lt;br /&gt;                            ‘ignoreSubForms’=&gt;true,&lt;br /&gt;&lt;br /&gt;                           ‘markupElementLabelStart’=&gt; ‘&amp;lt;b&amp;gt;’,&lt;br /&gt;&lt;br /&gt;                           ‘markupElementLabelEnd’=&gt; ‘&amp;lt;/b&amp;gt;’,&lt;br /&gt;&lt;br /&gt;                           ‘markupListStart’=&gt;’&amp;lt;div&amp;gt;’                             &lt;br /&gt;&lt;br /&gt;                           ‘markupListEnd’ =&gt; ‘&amp;lt;/div&amp;gt;’,&lt;br /&gt;&lt;br /&gt;                           ‘markupListItemStart’=&gt;’&amp;lt;span&amp;gt;’,&lt;br /&gt;&lt;br /&gt;                           ‘markupListItemEnd’=&gt;’&amp;lt;/span&amp;gt;’,&lt;br /&gt;           &lt;br /&gt;&lt;br /&gt;                         )),&lt;br /&gt;&lt;br /&gt;           ‘Form’&lt;br /&gt;&lt;br /&gt;));&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;O código acima irá colocar os "Índices" dos erros em um div e em negrito e os erros dos validators (StringLength, Alnum, NotEmpty) em uma tag span.&lt;br /&gt;&lt;br /&gt;Tenho estudado sobre como utilizar o Dojo ToolKit no ZF. Os formulários ficam show de bola!&lt;br /&gt;Espero postar sobre o Dojo ToolKit no ZF ;)&lt;br /&gt;&lt;br /&gt;Abraços Pessoal.&lt;o:p&gt;&lt;/o:p&gt;&lt;p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/830298852164908263-8560605347182860397?l=devutils.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devutils.blogspot.com/feeds/8560605347182860397/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=830298852164908263&amp;postID=8560605347182860397' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/830298852164908263/posts/default/8560605347182860397'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/830298852164908263/posts/default/8560605347182860397'/><link rel='alternate' type='text/html' href='http://devutils.blogspot.com/2009/04/agrupando-erros-do-zendform-em-uma.html' title='Agrupando Erros do Zend_Form em uma mesma linha'/><author><name>Maurício Vinicius de O. Santos</name><uri>http://www.blogger.com/profile/10158075805974585222</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_l_YF-xHSDL4/STdFoMVcXEI/AAAAAAAAAAM/JXTfPHMPqmI/S220/ATgAAACOLsPwGjdpAa_SnOfdO8oYetUIkSOR5GaAc2aKfeEu6I4-M5gbzP0CnwnwwaDRa6r1hQ_cDneOBEkOgXyiYiANAJtU9VCdj81JzTyD8JjI5C1-yzkrumjLYA.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-830298852164908263.post-2290712256353864485</id><published>2009-04-24T03:59:00.000-07:00</published><updated>2009-04-24T10:25:28.582-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Zend Framework'/><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='Smarty'/><title type='text'>Integrando Smarty com Zend Framework</title><content type='html'>E ai pessoal...&lt;br /&gt;Dando continuidade ao aprendizado do Zend Framework, escreverei como integrar o Zend framework com o Smarty Template Engine.&lt;br /&gt;&lt;br /&gt;Com o smarty nós conseguimos separar nossas views(Front controllers)  em templates. Apesar do Zend adotar o padrão MVC (Movel &lt;span style="font-weight: bold;"&gt;View&lt;/span&gt; Controller), nós temos algumas limitações visuais para organizar nosso código de forma que um webdesigner reconheça ou tenha uma grande noção do que está acontecendo em cada bloco de código de nossos arquivos de layout do sistema e, pelos seguidores do Smarty, não há outro template engine melhor que ele.&lt;br /&gt;&lt;br /&gt;Um exemplo:&lt;br /&gt;Toda vez que formos mostrar valores, fazer loops e decisões em nossas páginas e juntarmos tudo ao código HTML, nós temos um visual poluido de nossos arquivos deixando a manutenção mais exaustiva, sem contar que em alguns editores usados pelos webdesigners como o Dreamweaver, a tentativa de interpretação do código do dreamweaver muitas vezes desestrutura o layout do nosso site em fase de desenvolvimento.&lt;br /&gt;Uma diferença de um código sem e com Smarty.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Sem Smarty:&lt;/span&gt; &lt; ?php echo $nomedavariavel ? &gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Com Smarty:&lt;/span&gt; {$nomedavariavel}&lt;br /&gt;&lt;br /&gt;Eu li alguns artigos explicando como integrar o Smarty com o Zend...mas não gostei. Vou postar aqui da forma que eu achei menos confusa e mais fácil para manutenção:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 102, 0);font-size:130%;" &gt;&lt;span style="font-family:arial;"&gt;INSTALANDO, INSTANCIANDO E CONFIGURANDO O SMARTY&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Faça o download do smarty pelo link: &lt;a href="http://www.smarty.net/download.php"&gt;http://www.smarty.net/download.php&lt;/a&gt;&lt;br /&gt;Crie um diretório chamado Smarty dentro do diretório Library da sua aplicação ZF.&lt;br /&gt;Copie o conteúdo da pasta Lib do arquivo de download(Smarty) para o novo diretório criado.&lt;br /&gt;&lt;br /&gt;Dentro do diretório application do ZF, crie os seguintes diretórios: templates, templates_c e templates_cache.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;include "Zend/Loader.php";&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153); font-style: italic;"&gt;// Instancia as classes necessárias automaticamente (inclusive a do Smarty)&lt;/span&gt;&lt;br /&gt;Zend_Loader::registerAutoload();&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(0, 0, 153);"&gt;//Cria objeto do smarty e configura suas propriedades&lt;/span&gt;&lt;br /&gt;$smarty = new Smarty();&lt;br /&gt;$smarty-&gt;debugging = false;&lt;br /&gt;$smarty-&gt;force_compile = true;&lt;br /&gt;$smarty-&gt;caching = true;&lt;br /&gt;$smarty-&gt;compile_check = true;&lt;br /&gt;$smarty-&gt;cache_lifetime = -1;&lt;br /&gt;$marty-&gt;template_dir = './application/templates/';&lt;br /&gt;$smarty-&gt;compile_dir = './application/templates_c';&lt;br /&gt;$smarty-&gt;cache_dir = './application/templates_cache';&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(0, 0, 153);"&gt;//Registra o objeto criado. É por esse registro que iremos referenciar o objeto smarty em nossos controllers&lt;/span&gt;&lt;br /&gt;Zend_Registry::set('smarty', $smarty);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Em seu controller,  crie uma variável privada chamada $smarty:&lt;br /&gt;class MeuController extends Zend_Controller_Action&lt;br /&gt;{&lt;br /&gt;private $smarty;&lt;br /&gt;...&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Chame o smarty da seguinte forma na function init() do seu controller:&lt;br /&gt;public function init(){&lt;br /&gt;$this-&gt;smarty = Zend_Registry::get('smarty');&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;E dentro de suas actions, passe os valores necessários para o smarty, Ex.:&lt;br /&gt;public function indexAction()&lt;br /&gt;{&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(0, 0, 153);"&gt;  //Cria uma variável chamada Hello com o valor Hello Word!&lt;/span&gt;&lt;br /&gt;$this-&gt;smarty-&gt;assign('Hello', 'Hello Word!');&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(0, 0, 153);"&gt;  //Diz ao smarty qual é seu arquivo de template para ser renderizado&lt;/span&gt;&lt;br /&gt;$this-&gt;smarty-&gt;display('arquivo_template.tpl');&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Não esqueça de criar seu arquivo de template(dados html) dentro do diretório templates que criamos.&lt;br /&gt;Caso esteja trabalhando com módulos no Zend, vc também pode fazer isso sem problemas que funciona da mesma forma.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 102, 0);font-size:130%;" &gt;&lt;span style="font-family:arial;"&gt;PLUG-IN &lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(204, 102, 0);font-size:130%;" &gt;&lt;span style="font-family:arial;"&gt;DO SMARTY &lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(204, 102, 0);font-size:130%;" &gt;&lt;span style="font-family:arial;"&gt;PARA ECLIPSE&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Como eu uso o Eclipse, existe um Suporte do Smarty para o eclipse PDT.&lt;br /&gt;Vocês podem baixar nesse endereço: &lt;a href="http://code.google.com/p/smartypdt/"&gt;http://code.google.com/p/smartypdt/&lt;/a&gt;&lt;br /&gt;Basta descompactar o arquivo no seu diretório do eclipse.&lt;br /&gt;Ele é bom para verificar erros de sintaxe do Smarty e além disso, caso não tenhamos esse plugin, o eclipse fica mostrando aqueles warnings como se fossem erros de HTML.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Bom pessoal, é isso!&lt;br /&gt;Hasta luego!!&lt;br /&gt;;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/830298852164908263-2290712256353864485?l=devutils.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devutils.blogspot.com/feeds/2290712256353864485/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=830298852164908263&amp;postID=2290712256353864485' title='4 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/830298852164908263/posts/default/2290712256353864485'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/830298852164908263/posts/default/2290712256353864485'/><link rel='alternate' type='text/html' href='http://devutils.blogspot.com/2009/04/integrando-smarty-com-zend-framework.html' title='Integrando Smarty com Zend Framework'/><author><name>Maurício Vinicius de O. Santos</name><uri>http://www.blogger.com/profile/10158075805974585222</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_l_YF-xHSDL4/STdFoMVcXEI/AAAAAAAAAAM/JXTfPHMPqmI/S220/ATgAAACOLsPwGjdpAa_SnOfdO8oYetUIkSOR5GaAc2aKfeEu6I4-M5gbzP0CnwnwwaDRa6r1hQ_cDneOBEkOgXyiYiANAJtU9VCdj81JzTyD8JjI5C1-yzkrumjLYA.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-830298852164908263.post-7448549787008222029</id><published>2009-04-22T13:08:00.001-07:00</published><updated>2009-04-23T10:49:16.323-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Zend Framework'/><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><title type='text'>Módulos no Zend Framework</title><content type='html'>E ai pessoal,&lt;br /&gt;Há um tempo atrás eu passei um sufoco ao tentar criar a separação dos meus controllers e diretórios por módulos. Nas minhas pesquisas para resolver meu problema, verifiquei que há muitas pessoas encontrando esta dificuldade e sem soluções.&lt;br /&gt;Vamos imaginar que você possui um site que terá a área default(front com os usuários) e a parte de administração - admin(front dos administradores do site). É dessa forma que veremos como criar esses módulos.&lt;br /&gt;Eu fiz o teste do exemplo utilizando o&lt;span style="font-weight: bold;"&gt; XamppLite&lt;/span&gt; 1.7.0  e o Appserv 2.5.10.&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(153, 0, 0);"&gt;Obs.:&lt;/span&gt; &lt;span style="font-style: italic;"&gt;Caso esteja tendo problemas com o .htaccess, leia mais no final do post &lt;span style="font-weight: bold;"&gt;(Dicas)&lt;/span&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Eu cheguei a fazer testes com o Application server, mas deu um problema com relação a segurança e redirecionamentos do .htaccess. Estou entrando em contato pelo site do application server para poder solucionar o problema, mas pelo xampplite deu tudo certo.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);font-size:130%;" &gt;&lt;span style="font-weight: bold;font-family:arial;" &gt;ESTRUTURA DE DIRETÓRIOS&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Deve existir várias formas de separar os módulos. Postarei a forma que obtive sucesso após bater a cabeça.&lt;br /&gt;A estrutura do nosso diretório ficará como a figura abaixo:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_l_YF-xHSDL4/Se99Cxd8cUI/AAAAAAAAADQ/UUZ2CJ6nb7s/s1600-h/zend_ex_modulo.JPG"&gt;&lt;img style="cursor: pointer; width: 179px; height: 335px;" src="http://1.bp.blogspot.com/_l_YF-xHSDL4/Se99Cxd8cUI/AAAAAAAAADQ/UUZ2CJ6nb7s/s320/zend_ex_modulo.JPG" alt="" id="BLOGGER_PHOTO_ID_5327614370794729794" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Note que dentro de application eu criei um diretório chamado admin e outro chamado default(marquei de vermelho), que serão nossos módulos e conterão seus próprios controllers, models e scripts.&lt;br /&gt;&lt;br /&gt;Para cada área da administração eu criei um controller, onde vc pode inserir as Actions de add, edit, etc...Assim como os arquivos phtml.&lt;br /&gt;Os nomes dos arquivos phtml precisam ser iguais ao de suas Actions. Por exemplo, dentro do Controller &lt;span style="font-style: italic;"&gt;NoticiasController&lt;/span&gt;, terei as seguintes actions:&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;public function addAction(){...}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;public function editAction(){...}&lt;/span&gt;&lt;br /&gt;e o nome de seus templates: add.phtml e edit.phtml&lt;br /&gt;&lt;br /&gt;É dessa forma que o Zend trabalha.&lt;span style="font-style: italic;"&gt; Caso tenha alguma outra forma que você saiba e tenha se sentido incomodado com minha observação, pode postar um comentário que ficarei feliz de saber outra forma. :)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);font-family:arial;font-size:130%;"  &gt;&lt;span style="font-weight: bold;"&gt;CONTROLLERS&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Como nós separamos nosso exemplo em módulos, devemos dizer ao index.php onde ficarão esses módulos.&lt;br /&gt;&lt;br /&gt;No seu index.php, adicione a seguinte linha:&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(0, 0, 153);font-family:arial;" &gt;//Cria a instrancia do front_controller&lt;/span&gt;&lt;br /&gt;&lt;span style="text-decoration: underline;font-family:arial;" &gt;$controller = Zend_Controller_Front::getInstance();&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;//Indica o topo do nosso diretório. por exemplo, caso o seu endereço fique: http://localhost/sistemas/Exemplo, o seu setBaseUrl deverá ficar com o valor '/sistemas/Exemplo'. No meu caso, estarei acessando http://localhost/ex_modulo&lt;/span&gt;&lt;br /&gt;$controller-&gt;setBaseUrl('/Ex_modulo');&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="text-decoration: underline; color: rgb(0, 0, 153);font-family:arial;" &gt;// mostra os erros em modo de execução&lt;/span&gt;&lt;br /&gt;&lt;span style="text-decoration: underline;font-family:arial;" &gt;$controller-&gt;throwExceptions(true);&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;//Diz onde está os controllers do nosso módulo default&lt;/span&gt;&lt;br /&gt;$controller-&gt;setControllerDirectory('./application/default/controllers');&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;//Aqui nós dizemos ao ZF que existe um módulo chamado admin e que seus controllers estão no diretório passado por parâmetro.&lt;/span&gt;&lt;br /&gt;$controller-&gt;addControllerDirectory('./application/admin/controllers', 'admin');&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;Note que nos diretórios de controllers eu já criei os controllers para cada área de nossa administração: IndexControllers.php, NoticiasController.php e BlogsController.php .&lt;/span&gt;&lt;br /&gt;Quando criamos nosso projeto sem módulos, o nome da classe dos módulos no nosso caso ficaria +/- assim:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;public class NoticiasController extends Zend_Controller_Action(){...}&lt;/span&gt;&lt;br /&gt;Se você tentar executar seu projeto o Zend reclamará que ele não conseguiu achar os controllers requisitados.&lt;br /&gt;Como separamos nosso projeto em módulos, as nossas classes deverão conter o nome do nosso Módulo (com a primeira letra em maiúsculo)  + underline"_" + NomedomoduoloController&lt;br /&gt;Ficou confuso? bom, o resultado final ficaria assim:&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;public class Admin_IndexController extends Zend_Controller_Action(){...}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;public class Admin_NoticiasController extends Zend_Controller_Action(){...}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;public class Admin_BlogsController extends Zend_Controller_Action(){...}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 102, 0);font-size:130%;" &gt;&lt;span style="font-family:arial;"&gt;DICAS&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-size:180%;" &gt;&lt;span style="font-weight: bold;"&gt;1 &lt;/span&gt;&lt;/span&gt;- No seu index.php indique seus include paths do seguinte modo:&lt;br /&gt;setlocale(LC_ALL, 'BRA');&lt;br /&gt;date_default_timezone_set('America/Sao_Paulo');&lt;br /&gt;set_include_path('.' . PATH_SEPARATOR . '..' . PATH_SEPARATOR . './library'&lt;br /&gt;     . PATH_SEPARATOR .'./application/default/models/'&lt;br /&gt;     . PATH_SEPARATOR .'./application/admin/models/'&lt;br /&gt;     . PATH_SEPARATOR&lt;br /&gt;     . get_include_path());&lt;br /&gt;&lt;br /&gt;E para facilitar nossa vida, você pode utilizar a o autoload do Zend:&lt;br /&gt;&lt;br /&gt;include "Zend/Loader.php";&lt;br /&gt;Zend_Loader::registerAutoload();&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-size:180%;" &gt;&lt;span style="font-weight: bold;"&gt;2 &lt;/span&gt;&lt;/span&gt;- Inclua o arquivo .htaccess no diretorio raiz do seu projeto que no nosso caso é o Ex_modulo:&lt;br /&gt;Arquivo .htaccess:&lt;br /&gt;# Rewrite Engine config&lt;br /&gt;RewriteEngine on&lt;br /&gt;RewriteCond %{REQUEST_FILENAME} !-f&lt;br /&gt;RewriteCond %{REQUEST_FILENAME} !-d&lt;br /&gt;RewriteRule !\.(gif|jpg|png|css|js|controller.php|tpl|trans.php|service.php)$ index.php&lt;br /&gt;&lt;br /&gt;# Coloca UTF-8 como charset padrao&lt;br /&gt;AddDefaultCharset iso8859-1&lt;br /&gt;&lt;br /&gt;# Desabilita a auto insercao de escapes (\)&lt;br /&gt;php_flag magic_quotes_gpc off&lt;br /&gt;&lt;br /&gt;# Desabilita as Variaveis globais&lt;br /&gt;php_flag register_globals off&lt;br /&gt;&lt;br /&gt;No appserv e wampp, é necessário descomentar a seguinte linha no httpd.conf do apache:&lt;br /&gt;LoadModule rewrite_module modules/mod_rewrite.so&lt;br /&gt;se não vc vai obter o erro: &lt;span style="font-style: italic;"&gt;Internal Server error&lt;/span&gt; .&lt;br /&gt;O Xampplite já vem com a linha descomentada por padrão (pelo menos nessa versão).&lt;br /&gt;&lt;br /&gt;Veja que eu inseri o Charset &lt;span style="font-weight: bold;"&gt;Iso8859-1&lt;/span&gt; no arquivo htacces.&lt;br /&gt;Caso você não lembre que estamos setando essa configuração no .htaccess e você quer q seu projeto rode com o charset utf8 e não lembrar de mudar no seu .htaccess, você vai ter sérias dores de cabeça procurando onde esta seu problema de CharSet.&lt;br /&gt;&lt;br /&gt;Bom pessoal, em caso de dúvidas ou caso queiram que eu envie os arquivos do Exemplo, comentem ou me enviem e-mail que enviarei os arquivos de exemplo.&lt;br /&gt;&lt;br /&gt;Abraços e até +&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/830298852164908263-7448549787008222029?l=devutils.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devutils.blogspot.com/feeds/7448549787008222029/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=830298852164908263&amp;postID=7448549787008222029' title='10 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/830298852164908263/posts/default/7448549787008222029'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/830298852164908263/posts/default/7448549787008222029'/><link rel='alternate' type='text/html' href='http://devutils.blogspot.com/2009/04/modulos-no-zend.html' title='Módulos no Zend Framework'/><author><name>Maurício Vinicius de O. Santos</name><uri>http://www.blogger.com/profile/10158075805974585222</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_l_YF-xHSDL4/STdFoMVcXEI/AAAAAAAAAAM/JXTfPHMPqmI/S220/ATgAAACOLsPwGjdpAa_SnOfdO8oYetUIkSOR5GaAc2aKfeEu6I4-M5gbzP0CnwnwwaDRa6r1hQ_cDneOBEkOgXyiYiANAJtU9VCdj81JzTyD8JjI5C1-yzkrumjLYA.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_l_YF-xHSDL4/Se99Cxd8cUI/AAAAAAAAADQ/UUZ2CJ6nb7s/s72-c/zend_ex_modulo.JPG' height='72' width='72'/><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-830298852164908263.post-3773459283963129602</id><published>2009-04-09T08:49:00.000-07:00</published><updated>2009-04-09T10:24:06.451-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Zend Framework'/><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><title type='text'>Upload de arquivos com Zend Framework</title><content type='html'>E ai pessoal,&lt;br /&gt;Depois de um longo tempo sem escrever devido à mudança de emprego que tive, escreverei hoje sobre um framework que tenho estudado, o Zend Framework.&lt;br /&gt;&lt;br /&gt;Lembra de quando você fazia o código para upload de arquivos do seu site e tinha uma "dor de cabeça" para obter tamanho de arquivo, verificar extensão, tamanho e etc?&lt;br /&gt;&lt;br /&gt;O Zend já faz essa brincadeira para nós. É aquela velha história de não termos que reinventar a roda ou perder tempo criando nossas proprias classes e, além de criar, fazer testes exaustivos.&lt;br /&gt;Então, pq não usar um framework de confiança e já testado?&lt;br /&gt;&lt;br /&gt;Para este tutorial, você precisa ter uma base de como funciona o Zend Framework, como carregar(include) seus arquivos com o Zend_Loader por exemplo e saber como o Zend visualiza a estrutura de arquivos do seu projeto.&lt;br /&gt;Para isso, eu indico um bom tutorial para iniciantes:&lt;br /&gt;&lt;br /&gt;http://akrabat.com/wp-content/uploads/iniciando-com-zend-framework_130.pdf&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold; color: rgb(204, 102, 0);font-family:arial;" &gt;AS CLASSES&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;O Zend possui uma classe Zend_File_Transfer que além de nos permitir trabalhar com uploads, também nos dá uma mão para a segurança em download de arquivos do nosso site.&lt;br /&gt;&lt;br /&gt;Para conseguirmos indicar para onde irá nossos arquivos e checar algumas configurações, utilizaremos a classe Zend_File_Transfer _Adapter_Http&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);font-family:arial;font-size:130%;"  &gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;EXEMPLOS&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Vamos criar um formulário que conterá um input file 'uploadedfile', que será responsável por carregar nosso arquivo (lembrando que precisamos ter o enctype preenchido sempre que formos mexer com arquivos em nossos formulários).&lt;br /&gt;&lt;pre class="programlisting"&gt;&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;code&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;form enctype="multipart/form-data" action="/file/upload" method="post"&gt;&lt;br /&gt;      Arquivo: &lt;input name="uploadedfile" type="file"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;input value="Enviar" type="submit"&gt;&lt;br /&gt;&lt;/form&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;span style=";font-family:georgia;font-size:100%;"  &gt;Além de fazer o formulário de envio via HTML, podemos usar também a classe &lt;/span&gt;&lt;code&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style=";font-family:georgia;font-size:100%;"  &gt;&lt;br /&gt;Zend_Form_Element_File (O que eu acho melhor, veja o pq).&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Exemplo:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;$element = new Zend_Form_Element_File('&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;uploadedfile&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;');&lt;br /&gt;$element-&gt;setLabel('Enviar arquivo:')&lt;br /&gt;       -&gt;setDestination('c:\Temp');&lt;br /&gt;&lt;br /&gt;// Quero que o usuário envia apenas 1 arquivo&lt;br /&gt;$element-&gt;addValidator('Count', false, 1);&lt;br /&gt;// com o tamanho limite de 100K&lt;br /&gt;$element-&gt;addValidator('Size', false, 102400);&lt;br /&gt;// apenasJPEG, PNG, e GIFs&lt;br /&gt;$element-&gt;addValidator('Extension', false, 'jpg,png,gif');&lt;br /&gt;$form-&gt;addElement($element, 'foo');&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;//Setando o destino de nossos arquivos de upload (Caso use o exemplo de formulário em html)&lt;br /&gt;&lt;pre class="programlisting"&gt;&lt;code&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;$adapter = new Zend_File_Transfer_Adapter_Http();&lt;br /&gt;&lt;br /&gt;$adapter-&gt;setDestination('C:\temp');&lt;br /&gt;&lt;br /&gt;if (!$adapter-&gt;receive()) {&lt;br /&gt;$messages = $adapter-&gt;getMessages();&lt;br /&gt;echo implode("\n", $messages);&lt;br /&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;//Carregando os arquivos para o servidor&lt;br /&gt;&lt;pre class="programlisting"&gt;&lt;code&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;$upload = new Zend_File_Transfer();&lt;br /&gt;&lt;br /&gt;// Retorna as informações referente ao arquivo&lt;br /&gt;$files = $upload-&gt;getFileInfo();&lt;br /&gt;&lt;br /&gt;foreach ($files as $file =&gt; $info) {&lt;br /&gt;//O usuário escolheu um arquivo ou o campo esta vazio?&lt;br /&gt;if (!$upload-&gt;isUploaded($file)) {&lt;br /&gt;   print "Pq vc nao escolheu o seu arquivo e deixou o campo vazio?";&lt;br /&gt;   continue;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Tudo ok?&lt;br /&gt;if (!$upload-&gt;isValid($file)) {&lt;br /&gt;   print "Desculpe, mas o arquivo $file não é o que queremos.";&lt;br /&gt;   continue;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//Envia para o servidor&lt;br /&gt;$upload-&gt;receive();&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre class="programlisting"&gt;&lt;code&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;// Obtem o nome do arquivo&lt;br /&gt;$names = $upload-&gt;getFileName('&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;uploadedfile&lt;/span&gt;&lt;/code&gt;'&lt;code&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;);&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;// Retorna o tamanho do arquivo&lt;br /&gt;$size = $upload-&gt;getFileSize(&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;'&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;uploadedfile&lt;/span&gt;&lt;/code&gt;'&lt;code&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;);&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;// Retorna o mimetype do arquivo (Se é jpeg, gif, pdf, etc)&lt;br /&gt;$type = $upload-&gt;getMimeType('&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;uploadedfile&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;');&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Que ajuda o Zend nos fornece né?&lt;br /&gt;Bom, é isso ai!&lt;br /&gt;Para dúvidas, consultem o manual da Zend:&lt;br /&gt;&lt;br /&gt;http://framework.zend.com/manual/en/zend.file.html&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/830298852164908263-3773459283963129602?l=devutils.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devutils.blogspot.com/feeds/3773459283963129602/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=830298852164908263&amp;postID=3773459283963129602' title='3 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/830298852164908263/posts/default/3773459283963129602'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/830298852164908263/posts/default/3773459283963129602'/><link rel='alternate' type='text/html' href='http://devutils.blogspot.com/2009/04/upload-de-arquivos-com-zend-framework.html' title='Upload de arquivos com Zend Framework'/><author><name>Maurício Vinicius de O. Santos</name><uri>http://www.blogger.com/profile/10158075805974585222</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_l_YF-xHSDL4/STdFoMVcXEI/AAAAAAAAAAM/JXTfPHMPqmI/S220/ATgAAACOLsPwGjdpAa_SnOfdO8oYetUIkSOR5GaAc2aKfeEu6I4-M5gbzP0CnwnwwaDRa6r1hQ_cDneOBEkOgXyiYiANAJtU9VCdj81JzTyD8JjI5C1-yzkrumjLYA.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-830298852164908263.post-5895800715566852453</id><published>2009-03-04T06:34:00.001-08:00</published><updated>2009-03-04T09:16:57.855-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='XML'/><title type='text'>Trabalhando com arquivos XML no PHP</title><content type='html'>E aew pessoal.&lt;br /&gt;Esses dias eu criei uma aplicação simples em PHP para ser utilizada em Pocket PC, ou seja, páginas WAP só que envolvendo o PHP como linguagem para acessar os dados de uma base MySQL.&lt;br /&gt;Mas como eu iria dizer ao aplicativo PHP que eu teria que acessar a base do servidor x, y ou z?&lt;br /&gt;Foi ai que eu criei um arquivo XML não só contendo informação da base de dados, mas também outros dados que seriam interessantes quando não houvesse conexão com a rede wireless.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 102, 0);font-size:130%;" &gt;&lt;span style="font-weight: bold;font-family:arial;" &gt;ARQUIVOS XML&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;O XML trabalha muito parecido com o html em relação a criação, abertura e fechamento de Tags. A diferença é que todo XML é case sensitive. Outra característica parecida com o HTML, é que você pode definir o character code, segundo o padrão W3C.&lt;br /&gt;&lt;br /&gt;Um exemplo de um arquivo XML:&lt;blockquote&gt;&lt;/blockquote&gt;&lt;span style="color: rgb(51, 0, 153);"&gt;&lt;estados&gt;&lt;/estados&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_l_YF-xHSDL4/Sa61ssqm0DI/AAAAAAAAADA/J4VIFvrpkE8/s1600-h/xml1.jpg"&gt;&lt;img style="cursor: pointer; width: 336px; height: 110px;" src="http://1.bp.blogspot.com/_l_YF-xHSDL4/Sa61ssqm0DI/AAAAAAAAADA/J4VIFvrpkE8/s320/xml1.jpg" alt="" id="BLOGGER_PHOTO_ID_5309380790225129522" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;nome&gt;&lt;br /&gt;&lt;br /&gt;Este é um exemplo simples de um arquivo XML, contendo como nódulo pai &lt;estados&gt; e seus filhos chamados &lt;span style="font-weight: bold; font-style: italic;"&gt;nome&lt;/span&gt;.&lt;nome&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 102, 0);font-size:130%;" &gt;&lt;span style="font-family:arial;"&gt;CARREGANDO ARQUIVOS XML&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Para interpretar um documento XML, utilizamos a função&lt;span style="font-weight: bold;"&gt; simplexml_load_file()&lt;/span&gt;. Esta função realiza a leitura de um documento XML, criando um objeto do tipo &lt;span style="font-weight: bold;"&gt;SimpleXmlElement&lt;/span&gt;. Caso o documento esteja mal formatado, com algum erro de case sensitive ou até mesmo não seja um documento XML, essa função retornará FALSE.&lt;br /&gt;&lt;br /&gt;Vamos criar um documento PHP que lerá o arquivo XML do exemplo acima. Vamos chamar o arquivo XML de estados.XML.&lt;br /&gt;&lt;br /&gt;&lt; ? &lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic; color: rgb(0, 0, 153);"&gt;//interpreta o documento XML&lt;/span&gt;&lt;br /&gt;$xml = simplexml_load_file('estados.XML');&lt;br /&gt;&lt;br /&gt;var_dum($xml);&lt;br /&gt;&lt;br /&gt;?&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic; color: rgb(255, 0, 0);"&gt;Obs.:&lt;/span&gt; A função var_dump() analisa o objeto resultante.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;O resultado será o seguinte:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Object(SimpleXMLElement)#1 (4) {&lt;br /&gt;["nome"]=&gt; string(9) "SAO PAULO"&lt;br /&gt;["nome"]=&gt; string(14) "RIO DE JANEIRO"&lt;br /&gt;["nome"]=&gt; string(17) "RIO GRANDE DO SUL"&lt;br /&gt;["nome"]=&gt; string(4) "ACRE"&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Você pode pegar os dados de um arquivo xml pelos índices de seus nodes. Exemplo:&lt;br /&gt;&lt;br /&gt;&lt; ? &lt;span style="color: rgb(0, 0, 153);"&gt;//interpreta o documento XML&lt;/span&gt;&lt;br /&gt;$xml = simplexml_load_file('estados.XML');&lt;br /&gt;&lt;br /&gt;echo "Estado: ' . $xml-&gt;estados-&gt;nome[0] . "\n";&lt;br /&gt;echo "Estado: ' . $xml-&gt;estados-&gt;nome[1]. "\n";&lt;br /&gt;echo "Estado: ' . $xml-&gt;estados-&gt;nome[2]. "\n";&lt;br /&gt;echo "Estado: ' . $xml-&gt;estados-&gt;nome[3];&lt;br /&gt;?&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Você também pode mudar o valor de um node, como no exemplo  a seguir:&lt;br /&gt;&lt;br /&gt;&lt; ? &lt;span style="color: rgb(0, 0, 153);"&gt;//interpreta o documento XML&lt;/span&gt;&lt;br /&gt;$xml = simplexml_load_file('estados.XML');&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(0, 0, 153);"&gt;//Modificando o valor do primeiro estado e mostrando a seguir&lt;/span&gt;&lt;br /&gt;$xml-&gt;estados-nome[0] = "MATO GROSSO DO SUL";&lt;br /&gt;echo "Estado: ' . $xml-&gt;estados-nome[0];&lt;br /&gt;&lt;br /&gt;?&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Você pode utilizar a função foreach para mostrar todos os subelementos &lt;span style="font-weight: bold; font-style: italic;"&gt;nome&lt;/span&gt; do documento:&lt;br /&gt;&lt;br /&gt;&lt; ? &lt;span style="color: rgb(0, 0, 153);"&gt;//interpreta o documento XML&lt;/span&gt;&lt;br /&gt;$xml = simplexml_load_file('estados.XML');&lt;br /&gt;&lt;br /&gt;foreach($xml-&gt;estados-&gt;nome as $estado){&lt;br /&gt;echo $estado . "\n";&lt;br /&gt;}&lt;br /&gt;?&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 102, 0); font-weight: bold;font-size:130%;" &gt;&lt;span style="font-family:arial;"&gt;FUNÇÕES NATIVAS DO PHP5 PARA MANUSEIO DE ARQUIVOS XML&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Existem algumas funções que auxiliam no uso do XML, como incluir novo node, Listar atributos, visualizacão de nodes filhos, gravar dados em um novo arquivo XML, e muitos outros.&lt;br /&gt;&lt;br /&gt;Para visualizar e aprender essas funções, nada melhor que o bom e velho PHP.net (www.php.net) que na minha opinião, é o melhor manual/tutorial para linguagem de programação feito até hoje.&lt;br /&gt;Segue abaixo algumas funções que sempre costumo usar:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);"&gt;asXML()&lt;/span&gt; - Retorna uma string XML formatada representando o objeto, bem como seus subelementos.&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);"&gt;addChild()&lt;/span&gt; - Adiciona um novo elemento ao node especificado.&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);"&gt;file_put_contents&lt;/span&gt; - Sobrepõe um arquivo XML com novos dados.&lt;br /&gt;&lt;br /&gt;Qualquer dúvida, é só potar um comentário...&lt;br /&gt;Abraços.&lt;/nome&gt;&lt;/estados&gt;&lt;/nome&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/830298852164908263-5895800715566852453?l=devutils.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devutils.blogspot.com/feeds/5895800715566852453/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=830298852164908263&amp;postID=5895800715566852453' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/830298852164908263/posts/default/5895800715566852453'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/830298852164908263/posts/default/5895800715566852453'/><link rel='alternate' type='text/html' href='http://devutils.blogspot.com/2009/03/trabalhando-com-arquivos-xml-no-php.html' title='Trabalhando com arquivos XML no PHP'/><author><name>Maurício Vinicius de O. Santos</name><uri>http://www.blogger.com/profile/10158075805974585222</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_l_YF-xHSDL4/STdFoMVcXEI/AAAAAAAAAAM/JXTfPHMPqmI/S220/ATgAAACOLsPwGjdpAa_SnOfdO8oYetUIkSOR5GaAc2aKfeEu6I4-M5gbzP0CnwnwwaDRa6r1hQ_cDneOBEkOgXyiYiANAJtU9VCdj81JzTyD8JjI5C1-yzkrumjLYA.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_l_YF-xHSDL4/Sa61ssqm0DI/AAAAAAAAADA/J4VIFvrpkE8/s72-c/xml1.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-830298852164908263.post-4421297249214987809</id><published>2009-02-20T10:34:00.000-08:00</published><updated>2009-02-20T11:33:43.536-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='UML / Engenharia de Software'/><title type='text'>Análise de Requisitos</title><content type='html'>E aew pessoal,&lt;br /&gt;Eu resolvi escrever esse artigo devido a uma visita em um suposto novo cliente, depois de ele ter solicitado a criação de um sistema.&lt;br /&gt;&lt;br /&gt;Grande parte das vezes que visitamos um cliente que necessita de um software de gestão para a empresa, a primeira coisa que escutamos é: "Eu quero pouca coisa", "É coisa rápida e fácil".&lt;br /&gt;Escutamos isso porquê o cliente tem pouca noção para análisar um problema, então é aí que entra o analista de sistemas para levantar os requisitos de sistema.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;&lt;span style="color: rgb(255, 102, 0);font-family:arial;" &gt;INTRODUÇÃO&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A análise de requisitos é uma das sub-áreas da engenharia de software, que a função é detectar e documentar problemas do cenário atual para que eles sejam implementados com qualidade e com o mínimo de manutenção possível.&lt;br /&gt;&lt;br /&gt;Creio que cerca de 80% dos erros nos projetos são causados por defeitos inseridos durante a análise e requisitos, causando um custo maior de manutencão e de testes do sistema e, o pior são os erros descobertos pelos usuários. Atire a primeira pedra o programador que nunca escutou: "Está dando problema!", "Esta com bug!", "Não funciona!". Além disso, a pior coisa para uma empresa é a perda de oportunidades e de confiança com os clientes.&lt;br /&gt;&lt;br /&gt;Para terminar a introdução, segundo a wikipedia, Análise de requisitos é: &lt;span style="font-style: italic; color: rgb(0, 102, 0);"&gt;" O estudo das características que o &lt;/span&gt;&lt;a style="font-style: italic; color: rgb(0, 102, 0);" href="http://pt.wikipedia.org/wiki/Software" title="Software"&gt;sistema&lt;/a&gt;&lt;span style="font-style: italic; color: rgb(0, 102, 0);"&gt; deverá ter para atender às necessidades e expectativas do cliente.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(0, 102, 0);"&gt;Cada funcionalidade demandada pelo cliente deve ser analisada para verificar os possíveis impactos no desenvolvimento das demais funcionalidades do sistema, e verificado em conjunto com a equipe de desenvolvimento se as necessidades &lt;/span&gt;&lt;a style="font-style: italic; color: rgb(0, 102, 0);" href="http://pt.wikipedia.org/wiki/Tecnologia" title="Tecnologia"&gt;tecnológicas&lt;/a&gt;&lt;span style="font-style: italic; color: rgb(0, 102, 0);"&gt; para a sua implementação estão disponíveis."&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 102, 0);font-size:130%;" &gt;&lt;span style="font-weight: bold;font-family:arial;" &gt;ESTUDO DE VIABILIDADE&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Você esta prestes a criar a documentação necessária e a implementar o novo sistema. Mas será que é realmente viável a criação do mesmo?&lt;br /&gt;&lt;br /&gt;Uma forma de avaliar a viabilidade de um projeto é obter, através de interação com as partes interessadas a resposta às seguintes questões:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Será que o sistema contribui para os objetivos da organização? (POR PARTE DO CLIENTE)&lt;/li&gt;&lt;li&gt;Dadas as restrições tecnológicas, organizacionais (econômicas, políticas, ambientais, recursos disponíveis) e temporais associadas ao projeto, será que o sistema pode ser implementado? (POR PARTE DOS ANALISTA/DESENVOLVEDOR)&lt;/li&gt;&lt;li&gt;Caso haja necessidade de integração entre diferentes sistemas, será que esta é possível? (POR PARTE DOS ANALISTA/DESENVOLVEDOR)&lt;/li&gt;&lt;/ul&gt;Creio que a primeira questão é a que mais "pega" em um estudo de viabilidade. Caso a resposta seja negativa, com certeza você terá dores de cabeça caso resolva tocar o projeto, pois o cliente nuncá ficará satisfeito mesmo se tudo estiver funcionando.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold; color: rgb(255, 102, 0);font-family:arial;" &gt;PROCESSOS DA ENGENHARIA DE REQUISITOS&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Você deve estar se perguntando: "E quais são os passos para o levantamento de requisitos?"&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Identificação do problema&lt;/span&gt; &lt;span style="font-style: italic;"&gt;(Questionar  os problemas e as necessidades que o cliente esta enfrentando).&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Análise e negociação&lt;/span&gt; &lt;span style="font-style: italic;"&gt;(Saber como funciona cada processo e a regra de negócio é fundamental!)&lt;/span&gt;.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Especificação e documentação&lt;/span&gt;&lt;span style="font-style: italic;"&gt; (Documentar por meios legíveis todos os processos que cada tarefa terá. É nesta fase que se dá a produção do documento de especificação de requisitos)&lt;/span&gt;.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Validação&lt;/span&gt; &lt;span style="font-style: italic;"&gt;(Rever os 3 passos anteriores  e demonstrar que o documento de requisitos produzido corresponde ao sistema que o cliente pretende receber)&lt;/span&gt;.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Esses passos podem ser feitos de vários meios: Entrevistas, Questionários, Workshops ou qualquer outro meio de obter o máximo de informações dos usuários.&lt;br /&gt;&lt;br /&gt;Não podemos começar a implementar um sistema pelo que achamos que deve ser feito, por isso o usuário "trabalha", passando todas as informações necessárias.&lt;br /&gt;&lt;br /&gt;Como criar a documentação jogando todos os requisitos funcionais e todos os processos que cada requisito terá, explicarei em outro Post...caso eu ainda esteja vivo com esse carnaval.&lt;br /&gt;&lt;br /&gt;Abraços e até +.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/830298852164908263-4421297249214987809?l=devutils.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devutils.blogspot.com/feeds/4421297249214987809/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=830298852164908263&amp;postID=4421297249214987809' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/830298852164908263/posts/default/4421297249214987809'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/830298852164908263/posts/default/4421297249214987809'/><link rel='alternate' type='text/html' href='http://devutils.blogspot.com/2009/02/analise-de-requisitos.html' title='Análise de Requisitos'/><author><name>Maurício Vinicius de O. Santos</name><uri>http://www.blogger.com/profile/10158075805974585222</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_l_YF-xHSDL4/STdFoMVcXEI/AAAAAAAAAAM/JXTfPHMPqmI/S220/ATgAAACOLsPwGjdpAa_SnOfdO8oYetUIkSOR5GaAc2aKfeEu6I4-M5gbzP0CnwnwwaDRa6r1hQ_cDneOBEkOgXyiYiANAJtU9VCdj81JzTyD8JjI5C1-yzkrumjLYA.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-830298852164908263.post-251928402260157042</id><published>2009-02-12T03:43:00.000-08:00</published><updated>2009-02-12T08:36:34.797-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Delphi'/><title type='text'>InputQuery / Inputbox com campo estilo senha</title><content type='html'>Hoje eu precisei pedir uma senha para o usuário do sistema,  só que eu não queria criar um form só para solicitar a senha, dai eu resolvi usar InputQuery.&lt;br /&gt;Só que havia um problema, o usuário não pode visualizar a senha enquanto digita. Então como fazer com que o InputQuery fique com o passwordChar igual a #?&lt;br /&gt;&lt;br /&gt;O delphi não possui um componente/função que faça isso. Então eu fui ao bendito google e achei a função/procedimento que queria no &lt;span style="font-weight: bold;"&gt;Blog do Adriano Santos &lt;/span&gt;http://delphitodelphi.blogspot.com que além de escrever para o blog pessoal, cria alguns artigos para a revista ClubeDelphi da devMedia www.devmedia.com.br.&lt;br /&gt;&lt;br /&gt;Para a função, você precisa adicionar na Uses, as seguintes unidades: &lt;span style="font-weight: bold;"&gt;Types, Controls e Windows&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Segue abaixo a função:&lt;/span&gt;&lt;br /&gt;&lt;pre class="pas-source"&gt;&lt;span class="pas-kwd"&gt;function&lt;/span&gt; InputQuerySenha(&lt;span class="pas-kwd"&gt;const&lt;/span&gt; ACaption, APrompt: &lt;span class="pas-kwd"&gt;string&lt;/span&gt;; &lt;span class="pas-kwd"&gt;var&lt;/span&gt; Value: &lt;span class="pas-kwd"&gt;string&lt;/span&gt;):&lt;br /&gt;Boolean;&lt;br /&gt;&lt;span class="pas-kwd"&gt;var&lt;/span&gt;&lt;br /&gt;Form: TForm;&lt;br /&gt;Prompt: TLabel;&lt;br /&gt;Edit: TEdit;&lt;br /&gt;DialogUnits: TPoint;&lt;br /&gt;ButtonTop, ButtonWidth, ButtonHeight: Integer;&lt;br /&gt;&lt;span class="pas-kwd"&gt;function&lt;/span&gt; GetAveCharSize(Canvas: TCanvas): TPoint;&lt;br /&gt;&lt;span class="pas-kwd"&gt;var&lt;/span&gt;&lt;br /&gt;I: Integer;&lt;br /&gt;Buffer: &lt;span class="pas-kwd"&gt;array&lt;/span&gt;[&lt;span class="pas-num"&gt;0&lt;/span&gt;..&lt;span class="pas-num"&gt;51&lt;/span&gt;] &lt;span class="pas-kwd"&gt;of&lt;/span&gt; Char;&lt;br /&gt;&lt;span class="pas-kwd"&gt;begin&lt;/span&gt;&lt;br /&gt;&lt;span class="pas-kwd"&gt;for&lt;/span&gt; I := &lt;span class="pas-num"&gt;0&lt;/span&gt; &lt;span class="pas-kwd"&gt;to&lt;/span&gt; &lt;span class="pas-num"&gt;25&lt;/span&gt; &lt;span class="pas-kwd"&gt;do&lt;/span&gt;&lt;br /&gt;  Buffer[I] := Chr(I + Ord(&lt;span class="pas-str"&gt;'A'&lt;/span&gt;));&lt;br /&gt;&lt;span class="pas-kwd"&gt;for&lt;/span&gt; I := &lt;span class="pas-num"&gt;0&lt;/span&gt; &lt;span class="pas-kwd"&gt;to&lt;/span&gt; &lt;span class="pas-num"&gt;25&lt;/span&gt; &lt;span class="pas-kwd"&gt;do&lt;/span&gt;&lt;br /&gt;  Buffer[I + &lt;span class="pas-num"&gt;26&lt;/span&gt;] := Chr(I + Ord(&lt;span class="pas-str"&gt;'a'&lt;/span&gt;));&lt;br /&gt;GetTextExtentPoint(Canvas.Handle, Buffer, &lt;span class="pas-num"&gt;52&lt;/span&gt;, TSize(Result));&lt;br /&gt;Result.X := Result.X &lt;span class="pas-kwd"&gt;div&lt;/span&gt; &lt;span class="pas-num"&gt;52&lt;/span&gt;;&lt;br /&gt;&lt;span class="pas-kwd"&gt;end&lt;/span&gt;;&lt;br /&gt;&lt;span class="pas-kwd"&gt;procedure&lt;/span&gt; Saida(Sender: TObject);&lt;br /&gt;&lt;span class="pas-kwd"&gt;begin&lt;/span&gt;&lt;br /&gt;&lt;span class="pas-kwd"&gt;if&lt;/span&gt; TEdit(Sender).Text = &lt;span class="pas-str"&gt;''&lt;/span&gt; &lt;span class="pas-kwd"&gt;then&lt;/span&gt;&lt;br /&gt;&lt;span class="pas-kwd"&gt;begin&lt;/span&gt;&lt;br /&gt;  ShowMessage(&lt;span class="pas-str"&gt;'Vazio'&lt;/span&gt;);&lt;br /&gt;  TEdit(Sender).SetFocus;&lt;br /&gt;&lt;span class="pas-kwd"&gt;end&lt;/span&gt;;&lt;br /&gt;&lt;span class="pas-kwd"&gt;end&lt;/span&gt;;&lt;br /&gt;&lt;span class="pas-kwd"&gt;begin&lt;/span&gt;&lt;br /&gt;Result := False;&lt;br /&gt;Form := TForm.Create(Application);&lt;br /&gt;&lt;span class="pas-kwd"&gt;with&lt;/span&gt; Form &lt;span class="pas-kwd"&gt;do&lt;/span&gt;&lt;br /&gt;&lt;span class="pas-kwd"&gt;try&lt;/span&gt;&lt;br /&gt;Canvas.Font := Font;&lt;br /&gt;DialogUnits := GetAveCharSize(Canvas);&lt;br /&gt;BorderStyle := bsDialog;&lt;br /&gt;Caption := ACaption;&lt;br /&gt;ClientWidth := MulDiv(&lt;span class="pas-num"&gt;180&lt;/span&gt;, DialogUnits.X, &lt;span class="pas-num"&gt;4&lt;/span&gt;);&lt;br /&gt;Position := poScreenCenter;&lt;br /&gt;Prompt := TLabel.Create(Form);&lt;br /&gt;&lt;span class="pas-kwd"&gt;with&lt;/span&gt; Prompt &lt;span class="pas-kwd"&gt;do&lt;/span&gt;&lt;br /&gt;&lt;span class="pas-kwd"&gt;begin&lt;/span&gt;&lt;br /&gt;  Parent := Form;&lt;br /&gt;  Caption := APrompt;&lt;br /&gt;  Left := MulDiv(&lt;span class="pas-num"&gt;8&lt;/span&gt;, DialogUnits.X, &lt;span class="pas-num"&gt;4&lt;/span&gt;);&lt;br /&gt;  Top := MulDiv(&lt;span class="pas-num"&gt;8&lt;/span&gt;, DialogUnits.Y, &lt;span class="pas-num"&gt;8&lt;/span&gt;);&lt;br /&gt;  Constraints.MaxWidth := MulDiv(&lt;span class="pas-num"&gt;164&lt;/span&gt;, DialogUnits.X, &lt;span class="pas-num"&gt;4&lt;/span&gt;);&lt;br /&gt;  WordWrap := True;&lt;br /&gt;&lt;span class="pas-kwd"&gt;end&lt;/span&gt;;&lt;br /&gt;Edit := TEdit.Create(Form);&lt;br /&gt;&lt;span class="pas-kwd"&gt;with&lt;/span&gt; Edit &lt;span class="pas-kwd"&gt;do&lt;/span&gt;&lt;br /&gt;&lt;span class="pas-kwd"&gt;begin&lt;/span&gt;&lt;br /&gt;  &lt;span class="pas-comment"&gt;{Usando a fonte Wingdings e a letra "ele" em minúsculo, simula-se as "bolinhas" no lugar&lt;/span&gt;&lt;br /&gt;&lt;span class="pas-comment"&gt;       de asterísco da senha}&lt;/span&gt;&lt;br /&gt;  Font.&lt;span class="pas-kwd"&gt;Name&lt;/span&gt; := &lt;span class="pas-str"&gt;'Wingdings'&lt;/span&gt;;&lt;br /&gt;  PasswordChar := &lt;span class="pas-str"&gt;'l'&lt;/span&gt;;&lt;br /&gt;  Parent := Form;&lt;br /&gt;  Left := Prompt.Left;&lt;br /&gt;  Top := Prompt.Top + Prompt.Height + &lt;span class="pas-num"&gt;5&lt;/span&gt;;&lt;br /&gt;  Width := MulDiv(&lt;span class="pas-num"&gt;164&lt;/span&gt;, DialogUnits.X, &lt;span class="pas-num"&gt;4&lt;/span&gt;);&lt;br /&gt;  MaxLength := &lt;span class="pas-num"&gt;255&lt;/span&gt;;&lt;br /&gt;  Text := Value;&lt;br /&gt;  SelectAll;&lt;br /&gt;&lt;span class="pas-kwd"&gt;end&lt;/span&gt;;&lt;br /&gt;ButtonTop := Edit.Top + Edit.Height + &lt;span class="pas-num"&gt;15&lt;/span&gt;;&lt;br /&gt;ButtonWidth := MulDiv(&lt;span class="pas-num"&gt;50&lt;/span&gt;, DialogUnits.X, &lt;span class="pas-num"&gt;4&lt;/span&gt;);&lt;br /&gt;ButtonHeight := MulDiv(&lt;span class="pas-num"&gt;14&lt;/span&gt;, DialogUnits.Y, &lt;span class="pas-num"&gt;8&lt;/span&gt;);&lt;br /&gt;&lt;span class="pas-kwd"&gt;with&lt;/span&gt; TButton.Create(Form) &lt;span class="pas-kwd"&gt;do&lt;/span&gt;&lt;br /&gt;&lt;span class="pas-kwd"&gt;begin&lt;/span&gt;&lt;br /&gt;  Parent := Form;&lt;br /&gt;  Caption := &lt;span class="pas-str"&gt;'Confirmar'&lt;/span&gt;;&lt;br /&gt;  ModalResult := mrOk;&lt;br /&gt;  &lt;span class="pas-kwd"&gt;Default&lt;/span&gt; := True;&lt;br /&gt;  SetBounds(MulDiv(&lt;span class="pas-num"&gt;38&lt;/span&gt;, DialogUnits.X, &lt;span class="pas-num"&gt;4&lt;/span&gt;), ButtonTop, ButtonWidth,&lt;br /&gt;    ButtonHeight);&lt;br /&gt;&lt;span class="pas-kwd"&gt;end&lt;/span&gt;;&lt;br /&gt;&lt;span class="pas-kwd"&gt;with&lt;/span&gt; TButton.Create(Form) &lt;span class="pas-kwd"&gt;do&lt;/span&gt;&lt;br /&gt;&lt;span class="pas-kwd"&gt;begin&lt;/span&gt;&lt;br /&gt;  Parent := Form;&lt;br /&gt;  Caption := &lt;span class="pas-str"&gt;'Cancelar'&lt;/span&gt;;&lt;br /&gt;  ModalResult := mrCancel;&lt;br /&gt;  Cancel := True;&lt;br /&gt;  SetBounds(MulDiv(&lt;span class="pas-num"&gt;92&lt;/span&gt;, DialogUnits.X, &lt;span class="pas-num"&gt;4&lt;/span&gt;), Edit.Top + Edit.Height + &lt;span class="pas-num"&gt;15&lt;/span&gt;,&lt;br /&gt;    ButtonWidth, ButtonHeight);&lt;br /&gt;  Form.ClientHeight := Top + Height + &lt;span class="pas-num"&gt;13&lt;/span&gt;;&lt;br /&gt;&lt;span class="pas-kwd"&gt;end&lt;/span&gt;;&lt;br /&gt;&lt;span class="pas-kwd"&gt;if&lt;/span&gt; ShowModal = mrOk &lt;span class="pas-kwd"&gt;then&lt;/span&gt;&lt;br /&gt;&lt;span class="pas-kwd"&gt;begin&lt;/span&gt;&lt;br /&gt;  Value := Edit.Text;&lt;br /&gt;  Result := True;&lt;br /&gt;&lt;span class="pas-kwd"&gt;end&lt;/span&gt;;&lt;br /&gt;&lt;span class="pas-kwd"&gt;finally&lt;/span&gt;&lt;br /&gt;Form.Free;&lt;br /&gt;&lt;span class="pas-kwd"&gt;end&lt;/span&gt;;&lt;br /&gt;&lt;span class="pas-kwd"&gt;end&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-weight: bold;font-family:trebuchet ms;" &gt;Exemplo de uso:&lt;/span&gt;&lt;br /&gt;&lt;div class="post-body"&gt;&lt;style type="text/css"&gt;&lt;br /&gt;&lt;!-- .pas-source {font-family: "Courier New", monospace; font-size: 9pt;} .pas-comment {font-style: italic; font-weight: normal; text-decoration: none; color: #000080; } .pas-kwd {font-style: normal; font-weight: bold; text-decoration: none; } .pas-str {font-style: normal; font-weight: normal; text-decoration: none; color: #800080; } .pas-num {font-style: normal; font-weight: normal; text-decoration: none; color: #800000; } .pas-float {font-style: normal; font-weight: normal; text-decoration: none; color: #800000; } .pas-hex {font-style: normal; font-weight: normal; text-decoration: none; color: #800000; } .pas-preproc {font-style: normal; font-weight: normal; text-decoration: none; color: #008000; } .pas-asm {font-style: italic; font-weight: normal; text-decoration: none; } .pas-err {font-style: normal; font-weight: normal; text-decoration: none; color: #FF0000; } --&gt;&lt;br /&gt;&lt;/style&gt;&lt;br /&gt;&lt;pre class="pas-source"&gt;&lt;span class="pas-kwd"&gt;procedure&lt;/span&gt; TForm1.Button1Click(Sender: TObject);&lt;br /&gt;&lt;span class="pas-kwd"&gt;var&lt;/span&gt;&lt;br /&gt;Texto : &lt;span class="pas-kwd"&gt;string&lt;/span&gt;;&lt;br /&gt;&lt;span class="pas-kwd"&gt;begin&lt;/span&gt;&lt;br /&gt;InputQuerySenha(&lt;span class="pas-str"&gt;'Caption'&lt;/span&gt;, &lt;span class="pas-str"&gt;'Caption'&lt;/span&gt;, Texto);&lt;br /&gt;Edit1.Text := Texto;&lt;br /&gt;&lt;span class="pas-kwd"&gt;end&lt;/span&gt;;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Abraços pessoal. T+&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/830298852164908263-251928402260157042?l=devutils.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devutils.blogspot.com/feeds/251928402260157042/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=830298852164908263&amp;postID=251928402260157042' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/830298852164908263/posts/default/251928402260157042'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/830298852164908263/posts/default/251928402260157042'/><link rel='alternate' type='text/html' href='http://devutils.blogspot.com/2009/02/inputquery-inputbox-com-campo-estilo.html' title='InputQuery / Inputbox com campo estilo senha'/><author><name>Maurício Vinicius de O. Santos</name><uri>http://www.blogger.com/profile/10158075805974585222</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_l_YF-xHSDL4/STdFoMVcXEI/AAAAAAAAAAM/JXTfPHMPqmI/S220/ATgAAACOLsPwGjdpAa_SnOfdO8oYetUIkSOR5GaAc2aKfeEu6I4-M5gbzP0CnwnwwaDRa6r1hQ_cDneOBEkOgXyiYiANAJtU9VCdj81JzTyD8JjI5C1-yzkrumjLYA.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-830298852164908263.post-549584683981637754</id><published>2009-01-22T13:58:00.000-08:00</published><updated>2009-01-23T04:20:12.216-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Delphi'/><title type='text'>Threads - Conceito e exemplo em Delphi</title><content type='html'>Nesse post falarei a respeito de Threads no Delphi.&lt;br /&gt;Threads são processos e segundo o dicionário, o verbo processar no termo computacional significa &lt;span style="font-weight: bold;"&gt;"&lt;/span&gt;&lt;span id="lblDlpoDefinicao"&gt;&lt;span&gt;&lt;span class="texto"&gt;&lt;span ondblclick="javascript:SeleccionaEntrada_v2(getSel(),'0')"&gt;&lt;span style="font-weight: bold;"&gt;tratar dados em computador a fim de obter informação sistematizada"&lt;/span&gt; ou &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span id="lblDlpoDefinicao"&gt;&lt;span&gt;&lt;span class="texto"&gt;&lt;span ondblclick="javascript:SeleccionaEntrada_v2(getSel(),'0')"&gt;&lt;span style="font-weight: bold;"&gt;"interpretar e executar instruções"&lt;/span&gt;.&lt;br /&gt;Toda vez que executamos um projeto no Delphi, o projeto aberto é uma thread na qual é o processo principal do seu sistema. Você pode estar pensando: "Mas para que eu preciso aprender sobre Threads?". Você já notou que toda vez que um trecho de código é executado no delphi, você só consegue mexer no seu sistema depois que tudo é executado. Não notou? Então faça o seguinte exemplo:&lt;br /&gt;&lt;br /&gt;Crie um projeto VCL forms e arraste um button no seu formulário.&lt;br /&gt;No Onclick de um botao, coloque o código abaixo, rode o programa e depois clique nele.&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153); font-weight: bold;"&gt;var&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153); font-weight: bold;"&gt;I: Integer;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153); font-weight: bold;"&gt;begin&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153); font-weight: bold;"&gt;   for I:=1 to 10000 do&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153); font-weight: bold;"&gt;     begin&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153); font-weight: bold;"&gt;     end;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153); font-weight: bold;"&gt;end;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Notou que após que você clica no botao e enquanto o laço de repetição não foi finalizado,  não é possível nem mover o seu formulário ou executar qualquer outra tarefa em seu aplicativo?&lt;br /&gt;Isso acontece devido ao processo que esta rodando mas ainda não foi finalizado.&lt;br /&gt;Mas e agora? Se eu quiser executar outra tarefa no meu aplicativo enquanto o laço de repetição ainda esta em loop?. É aqui que entra Threads de sistema!&lt;br /&gt;Outro exemplo de Thread é o componente Timer do Delphi que enquanto você esta rodando seu aplicativo, você consegue fazer com que o timer atualize a hora em um label a cada segundo sem interferir nas outras execuções.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 102, 0);font-size:130%;" &gt;&lt;span style="font-weight: bold;font-family:arial;" &gt;CRIANDO UMA CLASSE E TENDO COMO HERANÇA A CLASSE TTHREAD&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Criaremos uma classe chamada TMinhaThread que extenderá a classe TThread que esta na unit Classes:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 153);"&gt;type&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 153);"&gt;  TMinhaThread = class(TThread)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 153);"&gt;     private&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 153);"&gt;         procedure Execute; override;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 153);"&gt;   end;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Na nossa classe criada, criamos uma procedure chamada Execute que deverá ser modificada(override/virtual) toda vez que herdamos a classe Tthread. Somos forçados a fazer isso pois a classe TThread possui o método Execute que é abstrato e segundo o conceito de Orienteção a objetos, toda classe que herda uma classe que possui métodos abstratos, deve implementar todos os métodos abstratos da mesma. Eu sei que você deve estar pensando: "E toda classe que possui métodos abstratos, deve ser abstrata.", mas orientação a objetos não é o foco do Post.&lt;br /&gt;&lt;br /&gt;Pressione CTRL+SHIFT+C para o delphi criar a estrutura no método Execute.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 153);"&gt;procedure TMinhaThread.Execute;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 153);"&gt;var&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 153);"&gt;I: Integer;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 153);"&gt;begin&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 153);"&gt;try&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 153);"&gt;for I:=0 to 10000 do&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 153);"&gt;begin&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 153);"&gt;   Sleep(20);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 153);"&gt;end;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 153);"&gt;Except&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 153);"&gt;end;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 153);"&gt;end;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Com a procedure já implementada, arraste outro button para o formulário e adicione o seguinte trecho de código:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 153);"&gt;var&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 153, 0); font-style: italic;"&gt;//Cria a variavel minhaThread do tipo TMinhaThread&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 153);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 153);"&gt;  minhaThread: TMinhaThread;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 153);"&gt;begin&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span id="lblDlpoDefinicao"&gt;&lt;span&gt;&lt;span class="texto"&gt;&lt;span ondblclick="javascript:SeleccionaEntrada_v2(getSel(),'0')"&gt;&lt;span style="color: rgb(0, 153, 0); font-style: italic;"&gt;//Criação do objeto&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span id="lblDlpoDefinicao"&gt;&lt;span&gt;&lt;span class="texto"&gt;&lt;span ondblclick="javascript:SeleccionaEntrada_v2(getSel(),'0')"&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 153);"&gt;  minhaThread := TMinhaThread.Create(False);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 153);"&gt;  minhaThread.FreeOnTerminate := true;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 153);"&gt;end;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;O método create recebe um valor booleano que significa:&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;True&lt;/span&gt; - A Thread é iniciada porém ela é pausada ou seja, não executa o método Execute (imagine o componente Timer com a opção Enabled = false).&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span id="lblDlpoDefinicao"&gt;&lt;span&gt;&lt;span class="texto"&gt;&lt;span ondblclick="javascript:SeleccionaEntrada_v2(getSel(),'0')"&gt;&lt;span style="font-weight: bold;"&gt;False &lt;/span&gt;- O método Execute é executado assim que a Thread é iniciada.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span id="lblDlpoDefinicao"&gt;&lt;span&gt;&lt;span class="texto"&gt;&lt;span ondblclick="javascript:SeleccionaEntrada_v2(getSel(),'0')"&gt;O método FreeOnTerminate, verifica se a Thread precisa ser liberada da memória assim que ela for finalizada. Com isso não precisamos dar um FreeAndNil.&lt;br /&gt;Valor True para liberar da memória e False para permanecer armazenada.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Execute o botão e note que apesar do seu aplicativo estar em loop, você consegue movê-lo e até mesmo executar outras tarefas.&lt;br /&gt;&lt;br /&gt;Outro exemplo onde podemos utilizar Threads é no download ou upload de múltiplos arquivos, pois com thread conseguimos fazer a transferência de vários arquivos ao mesmo tempo sem ser preciso esperarmos o término de cada um.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Todas as explicações que eu posto aqui no blog são de tarefas que pratico no dia-a-dia, mas caso algum leitor ache interessante eu postar algo de um determinado assunto, basta comentar em algum post ou me enviar um e-mail.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span id="lblDlpoDefinicao"&gt;&lt;span&gt;&lt;span class="texto"&gt;&lt;span ondblclick="javascript:SeleccionaEntrada_v2(getSel(),'0')"&gt;Blz pessoal?&lt;br /&gt;See ya guys....&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/830298852164908263-549584683981637754?l=devutils.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devutils.blogspot.com/feeds/549584683981637754/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=830298852164908263&amp;postID=549584683981637754' title='5 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/830298852164908263/posts/default/549584683981637754'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/830298852164908263/posts/default/549584683981637754'/><link rel='alternate' type='text/html' href='http://devutils.blogspot.com/2009/01/threads-conceito-e-exemplo.html' title='Threads - Conceito e exemplo em Delphi'/><author><name>Maurício Vinicius de O. Santos</name><uri>http://www.blogger.com/profile/10158075805974585222</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_l_YF-xHSDL4/STdFoMVcXEI/AAAAAAAAAAM/JXTfPHMPqmI/S220/ATgAAACOLsPwGjdpAa_SnOfdO8oYetUIkSOR5GaAc2aKfeEu6I4-M5gbzP0CnwnwwaDRa6r1hQ_cDneOBEkOgXyiYiANAJtU9VCdj81JzTyD8JjI5C1-yzkrumjLYA.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-830298852164908263.post-701735520733571752</id><published>2009-01-21T09:46:00.000-08:00</published><updated>2009-01-21T11:25:52.212-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Curiosidades'/><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><title type='text'>Votação de produtos com porcentagem e barra de progresso</title><content type='html'>E ai pessoal, tudo tranquilo?&lt;br /&gt;Depois de mais ou menos 1 mes de ferias do blog, voltei aqui para postar mais uma implementação q fiz em um dos meus trabalhos.&lt;br /&gt;&lt;br /&gt;No momento eu estou fazendo um site em PHP, onde há produtos e cada produto possui uma enquete com 5 opções:&lt;br /&gt;1 - Péssimo produto&lt;br /&gt;2 - Razoável&lt;br /&gt;3 - Bom&lt;br /&gt;4 - Muito bom&lt;br /&gt;5 - Excelente&lt;br /&gt;&lt;br /&gt;Eu não explicarei exatamente como fazer a enquete, ou seja, como incluir uma nova enquete ou como fazer com que a página receba os votos do usuário. Irei apenas enfatizar como pegar o total de votação e mostrar a porcentagem de cada opção e além disso, como mostrar o total da votação em uma barra de progresso horizontal.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 102, 0);font-size:130%;" &gt;&lt;span style="font-family:arial;"&gt;TABELAS UTILIZADAS &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Segue abaixo como estao as minhas tabelas na base de dados:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;USUARIOS&lt;/span&gt;&lt;br /&gt;-------------------&lt;br /&gt;idusuario INT AUTOINCREMENT NOT NULL&lt;br /&gt;nome VARCHAR(30) NOT NULL&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;PRODUTOS&lt;/span&gt;&lt;br /&gt;-------------------&lt;br /&gt;idproduto INT AUTOINCREMENT NOT NULL&lt;br /&gt;nome VARCHAR(30) NOT NULL&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0); font-weight: bold;"&gt;VOTACOES_PRODUTOS&lt;/span&gt;&lt;br /&gt;--------------------&lt;br /&gt;idusuario INT&lt;br /&gt;idproduto INT&lt;br /&gt;data_votacao DATETIME&lt;br /&gt;declaracao TINYINT (Campo que determina a opção do voto)&lt;br /&gt;&lt;br /&gt;Bom, agora com nossas tabelas, irei mostrar a logica de como fazer a porcentagem de votos para cada opção.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 102, 0);font-family:arial;font-size:130%;"  &gt;&lt;br /&gt;PORCENTAGEM DE VOTOS POR OPÇÃO VOTADA&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Para calcular a porcentagem de votos que uma opção teve, devemos fazer o seguinte calculo:&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;porcentagem é&lt;/span&gt; &lt;span style="font-weight: bold;font-size:180%;" &gt;=&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;quantidade total&lt;/span&gt; . &lt;span style="color: rgb(0, 0, 153);"&gt;(quantidade de votos/100)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;Quantidade total &lt;/span&gt;=  Número de registros da tabela votacoes_produtos.&lt;br /&gt;Ex.: &lt;span style="color: rgb(153, 153, 0);"&gt;(SELECT COUNT(*) as qtde_total FROM votacoes_produtos)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;Quantidade de votos&lt;/span&gt; = Número de votos que o produto obteve na determinada opção.&lt;br /&gt;Ex.: &lt;span style="color: rgb(153, 153, 0);"&gt;(SELECT COUNT(*) as qtde_votos FROM votacoes_produtos WHERE idproduto = 3 and declaracao = 4)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;ficaria assim em PHP:&lt;br /&gt;$porcentagem = $qtde_total*($qtde_votos/100);&lt;br /&gt;echo $porcentagem;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 102, 0);font-size:130%;" &gt;&lt;span style="font-family:arial;"&gt;RECEBENDO A PORCENTAGEM DE TODAS AS OPÇÕES&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Imagine a primeira opção (Péssimo produto) como 0%  e a quinta opção (Excelente) como 100% da nossa barra de progresso.&lt;br /&gt;Precisamos criar uma forma de preencher nossa barra de progresso pelas votações recebidas, tendo votos da primeira e última opção ou não.&lt;br /&gt;&lt;br /&gt;Para fazer isso, faremos uma regra de três.&lt;br /&gt;Vamos supor que 5 pessoas votaram, seus votos foram: 5, 3, 5, 1 e 2&lt;br /&gt;A soma de todas as votações(opções), seria 16...correto?&lt;br /&gt;O máximo de número de votos seria 5x5 = 25(100%)&lt;br /&gt;Ai você faz aquela pergunta para obter a porcentagem: se para 25 pontos eu tenho 100%, quantos % eu obtive com 16 pontos?&lt;br /&gt;Fácil!&lt;br /&gt;25 = 100%&lt;br /&gt;16 = x&lt;br /&gt;&lt;br /&gt;x = (100*16)/25&lt;br /&gt;x = 64%&lt;br /&gt;&lt;br /&gt;Como diz o professor de inglês Arthur que aparece no youtube: IT'S EASY!!!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 102, 0);font-family:arial;font-size:130%;"  &gt;CRIANDO A BARRA DE PROGRESSO&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Nossa barra de progresso será feita no esquema de Estrelas.&lt;br /&gt;Faça download das seguintes imagens:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_l_YF-xHSDL4/SXdojoe-LpI/AAAAAAAAACQ/8VC-9Hvd6NM/s1600-h/estrela02.gif"&gt;&lt;img style="cursor: pointer; width: 90px; height: 20px;" src="http://2.bp.blogspot.com/_l_YF-xHSDL4/SXdojoe-LpI/AAAAAAAAACQ/8VC-9Hvd6NM/s320/estrela02.gif" alt="" id="BLOGGER_PHOTO_ID_5293814848369340050" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_l_YF-xHSDL4/SXdocbB-K5I/AAAAAAAAACI/XDJjwsdinZk/s1600-h/estrela01.gif"&gt;&lt;img style="cursor: pointer; width: 90px; height: 20px;" src="http://1.bp.blogspot.com/_l_YF-xHSDL4/SXdocbB-K5I/AAAAAAAAACI/XDJjwsdinZk/s320/estrela01.gif" alt="" id="BLOGGER_PHOTO_ID_5293814724498959250" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Para criar a barra de progresso, utilizaremos HTML puro.&lt;br /&gt;Crie uma tabela com 100 pixels de largura, 0 de borda, cellpadding e cellspacing.&lt;br /&gt;Dentro dessa nova tabela criada, insira outra tabela com 100% de largura, 0 de borda, cellpadding e cellspacing.&lt;br /&gt;&lt;br /&gt;Na coluna(TD) da primeira tabela criada, insira o seguinte código CSS:  &lt;span style="color: rgb(204, 0, 0);"&gt;style="background-image:url(estrela02.gif); background-repeat:no-repeat;"&lt;/span&gt;&lt;br /&gt;Na coluna(TD) da segunda tabela criada, insira o seguinte código CSS:&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);"&gt;style="background-image:url(estrela01.gif); background-repeat:no-repeat"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;No width da segunda tabela criada, coloque o seguinte valor: width="&lt; ? echo $x; ? &gt;"&lt;br /&gt;onde $x é o novo valor q obtemos com a regra de 3 que criamos acima.&lt;br /&gt;Note que conforme a porcentagem, as estrelas coloridas sobrepõe as estrelas apagadas.&lt;br /&gt;&lt;br /&gt;É isso galera..&lt;br /&gt;Em caso de dúvidas, envie comentário q tentarei responder o mais rápido possível.&lt;br /&gt;Até lá.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/830298852164908263-701735520733571752?l=devutils.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devutils.blogspot.com/feeds/701735520733571752/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=830298852164908263&amp;postID=701735520733571752' title='5 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/830298852164908263/posts/default/701735520733571752'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/830298852164908263/posts/default/701735520733571752'/><link rel='alternate' type='text/html' href='http://devutils.blogspot.com/2009/01/votao-de-produtos-com-porcentagem-e.html' title='Votação de produtos com porcentagem e barra de progresso'/><author><name>Maurício Vinicius de O. Santos</name><uri>http://www.blogger.com/profile/10158075805974585222</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_l_YF-xHSDL4/STdFoMVcXEI/AAAAAAAAAAM/JXTfPHMPqmI/S220/ATgAAACOLsPwGjdpAa_SnOfdO8oYetUIkSOR5GaAc2aKfeEu6I4-M5gbzP0CnwnwwaDRa6r1hQ_cDneOBEkOgXyiYiANAJtU9VCdj81JzTyD8JjI5C1-yzkrumjLYA.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_l_YF-xHSDL4/SXdojoe-LpI/AAAAAAAAACQ/8VC-9Hvd6NM/s72-c/estrela02.gif' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-830298852164908263.post-4861143875735406699</id><published>2008-12-16T11:13:00.000-08:00</published><updated>2008-12-16T11:39:09.557-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='AJAX'/><title type='text'>Grid com AJAX, Paginação, Ordenação e Filtro no PHP</title><content type='html'>Estou em meio ao desenvolvimento de um site em PHP e precisei de uma Grid que além de me auxiliar na paginação, busca e ordenação dos registros, também fosse em AJAX.&lt;br /&gt;Depois de procurar no site PHP Classes  (http://www.phpclasses.org/) achei uma Grid bem interessante chamada EyeDBGrid.&lt;br /&gt;&lt;br /&gt;Para download da classe, acesse o link: http://www.phpclasses.org/browse/package/4951/download/zip.html&lt;br /&gt;&lt;br /&gt;Com ela nós conseguimos recuperar dados de qualquer base Mysql.&lt;br /&gt;Segue abaixo uma imagem de exemplo:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.phpclasses.org/browse/view/image/file/25228/name/ex3.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 638px; height: 314px;" src="http://www.phpclasses.org/browse/view/image/file/25228/name/ex3.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Após feito o download você terá as classes, imagens e folhas de estilo usadas pela Grid.&lt;br /&gt;Rode o exemplo no seu servidor.&lt;br /&gt;A classe utiliza as proprias funções "mysql_", sendo assim, não é preciso de ativação das classes PDO pelo servidor.&lt;br /&gt;&lt;br /&gt;Eu não tenho muito o que falar sobre as configurações e adaptações da Grid para seu sistema, pois todos os exemplos e arquivos contendo as classes estão comentados.&lt;br /&gt;&lt;br /&gt;Espero ter ajudado vocês.&lt;br /&gt;Abraços.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/830298852164908263-4861143875735406699?l=devutils.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devutils.blogspot.com/feeds/4861143875735406699/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=830298852164908263&amp;postID=4861143875735406699' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/830298852164908263/posts/default/4861143875735406699'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/830298852164908263/posts/default/4861143875735406699'/><link rel='alternate' type='text/html' href='http://devutils.blogspot.com/2008/12/grid-com-ajax-paginao-ordenao-e-filtro.html' title='Grid com AJAX, Paginação, Ordenação e Filtro no PHP'/><author><name>Maurício Vinicius de O. Santos</name><uri>http://www.blogger.com/profile/10158075805974585222</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_l_YF-xHSDL4/STdFoMVcXEI/AAAAAAAAAAM/JXTfPHMPqmI/S220/ATgAAACOLsPwGjdpAa_SnOfdO8oYetUIkSOR5GaAc2aKfeEu6I4-M5gbzP0CnwnwwaDRa6r1hQ_cDneOBEkOgXyiYiANAJtU9VCdj81JzTyD8JjI5C1-yzkrumjLYA.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-830298852164908263.post-1748877846917956306</id><published>2008-12-15T11:30:00.001-08:00</published><updated>2008-12-15T17:21:29.292-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MYSQL'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>Criando auditoria do seu aplicativo e melhorando o desempenho com Stored Procedures no MYSQL</title><content type='html'>E ai pessoal,&lt;br /&gt;Nesse post veremos como criar uma auditoria de todas as inclusões, alterações e exclusões que os usuários fazem em sua base de Dados MySQL. Faremos isso com a ajuda de &lt;span style="font-weight: bold;"&gt;Stored Procedures &lt;/span&gt;que, além de nos auxiliar na auditoria, já é comprovado que elas aumentam o desempenho quando vamos trabalhar com nossas tabelas de base de dados e além disso,  não ficamos dependendo de qual linguagem será implementado o sistema desde que a linguagem consiga se comunicar com a base e chamar as SPs do servidor Mysql.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 102, 0);font-size:130%;" &gt;&lt;span style="font-weight: bold;"&gt;ENTENDENDO O USO DE  STORED PROCEDURE&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Primeiramente veremos como trabalha as Stored Procedures no Mysql.&lt;br /&gt;A criação de SPs estão disponíveis apenas na versão 5.x do MySQL, o que foi um marco do SGBD OpenSource. Ainda faltam alguns recursos no MYSQL como vemos em outros SGBD, como a criação de Exceptions e outras funcionalidades.&lt;br /&gt;&lt;br /&gt;Uma Stored Procedure trabalha parecido como Functions, Procedures e Métodos das linguagens de programação, onde você cria o nome e passa os paramêtros para a rotina.&lt;br /&gt;Nós temos 3 tipos  diferentes de métodos em SP. Esses métodos podem ser de &lt;span style="font-weight: bold;"&gt;Entrada&lt;/span&gt;, de &lt;span style="font-weight: bold;"&gt;Saída&lt;/span&gt; ou de &lt;span style="font-weight: bold;"&gt;Entrada e Saida ao mesmo tempo&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span class="c2"&gt;&lt;span style="font-weight: bold; color: rgb(204, 0, 0);"&gt;IN:&lt;/span&gt; &lt;/span&gt; este é um parâmetro de entrada, ou seja, um parâmetro cujo seu valor será utilizado no interior do procedimento para produzir algum resultado;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 0, 0);" class="c2"&gt;OUT:&lt;/span&gt; esté parâmetro retorna algo de dentro do procedimento para o lado externo, colocando os valores manipulados disponíveis na memória ou no conjunto de resultados;&lt;br /&gt;&lt;br /&gt;&lt;span class="c2"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="color: rgb(204, 0, 0);"&gt;INOUT:&lt;/span&gt; &lt;/span&gt; &lt;/span&gt;faz os dois trabalhos ao mesmo tempo!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 102, 0);font-size:130%;" &gt;&lt;span style="font-weight: bold;"&gt;CRIANDO STORED PROCEDURES&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Agora veremos como criar Stored Procedures.&lt;br /&gt;&lt;br /&gt;Exemplo de criação de SP no MYSQL:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(0, 153, 0);"&gt;//Criamos um delimitador, para que possamos criar várias "linhas de código" em um único script&lt;/span&gt;&lt;br /&gt;DELIMITER $&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(0, 153, 0);"&gt;/*Apagamos a procedure chamada sp_pessoas caso ela já exista.*/&lt;/span&gt;&lt;br /&gt;DROP PROCEDURE IF EXISTS sp_pessoas$&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(0, 153, 0);"&gt;/*Criamos uma procedure chamada sp_pessoas que recebe 3 parâmetros de entrada&lt;/span&gt;*/&lt;br /&gt;CREATE PROCEDURE sp_pessoas(IN sNome_pessoa VARCHAR(35), IN sEndereco_pessoa VARCHAR(30), IN sUf CHAR(1))&lt;br /&gt;BEGIN&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(0, 153, 0);"&gt;/*Inserimos na entidade pessoas, valores passados ao chamar a Stored Procedure&lt;/span&gt;*/&lt;br /&gt;INSERT INTO pessoas(nome_pessoa, endereco_pessoa, uf) VALUES (sNome_pessoa, sEndereco_pessoa, sUF);&lt;br /&gt;&lt;br /&gt;END$&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Para podermos chamarmos essa StoredProcedure diretamente pelo Mysql, utilizamos a função CALL.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Exemplo: &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(153, 0, 0);"&gt;CALL sp_pessoas('Mauricio', 'Rua sem saida', 'SP');&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold; color: rgb(255, 102, 0);"&gt;CRIANDO A AUDITORIA&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Para criarmos a auditoria, iremos criar uma tabela chamada &lt;span style="font-weight: bold;"&gt;usabilidade, &lt;/span&gt; na qual irá conter dados do usuário que esta efetuando o processo no sistema e um pequeno histórico sobre o processo.&lt;br /&gt;Campos da tabela &lt;span style="font-weight: bold;"&gt;usabilidade&lt;/span&gt; :&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 153);"&gt;idoperador&lt;/span&gt; &lt;span style="color: rgb(204, 0, 0);"&gt;INT(11)&lt;/span&gt; - (AI, PK)&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 153);"&gt;data_uso&lt;/span&gt; &lt;span style="color: rgb(204, 0, 0);"&gt;TIMESTAMP&lt;/span&gt; - (Default value: CURRENT_TIMESTAMP)&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 153);"&gt;menu&lt;/span&gt; &lt;span style="color: rgb(204, 0, 0);"&gt;VARCHAR(35)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 153);"&gt;acao&lt;/span&gt; &lt;span style="color: rgb(204, 0, 0);"&gt;VARCHAR(35)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Agora criaremos uma SP para Adicionar uma nova ou Atualizar uma pessoa já existente na entidade.&lt;br /&gt;Para isso, vamos inserir algumas linhas no código do exemplo acima. Ele ficará assim:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(0, 153, 0);"&gt;/*Criamos um delimitador, para que possamos criar várias "linhas de código" em um único script*/&lt;/span&gt;&lt;br /&gt;DELIMITER $&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(0, 153, 0);"&gt;&lt;/span&gt;&lt;br /&gt;DROP PROCEDURE IF EXISTS sp_pessoas_IU$&lt;br /&gt;&lt;br /&gt;CREATE PROCEDURE sp_pessoas_IU(sIdpessoa INT(11), sNome_pessoa VARCHAR(35), sEndereco_pessoa VARCHAR(30),  sUf CHAR(1), sIdoperador INT(11))&lt;br /&gt;BEGIN&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(0, 153, 0);"&gt;/*O que faremos aqui, é verificar pelo id da pessoa, se ela já existe. Caso nao exista (seja igual a 0), insere no banco. Caso contrário, atualiza os dados*/&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 0, 0);"&gt; IF NOT EXISTS(SELECT idpessoa FROM pessoas WHERE idpessoa = sIdpessoa) THEN&lt;/span&gt;&lt;br /&gt; INSERT INTO pessoas(nome_pessoa, endereco_pessoa, uf) VALUES (sNome_pessoa, sEndereco_pessoa, sUF);&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(0, 153, 0);"&gt;       /*Inserimos na entidade usabilidade, o historico do que o usuário processou.*/&lt;/span&gt;&lt;br /&gt; INSERT INTO usabilidade(idoperador, menu, acao) VALUES (sIdoperador, 'CADASTROS - PESSOAS', CONCAT('O USUÁRIO INSERIU A SEGUINTE PESSOA: ', LAST_INSERT_ID()));&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 0, 0);"&gt;ELSE&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;UPDATE pessoas SET nome_pessoa = sNome_pessoa, sEndereco_pessoa = sNome_pessoa, uf = sUF WHERE idpessoa = sIdpessoa;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(0, 153, 0);"&gt;/*Inserimos na entidade usabilidade, o historico do que o usuário processou.*/&lt;/span&gt;&lt;br /&gt; INSERT INTO usabilidade(idoperador, menu, acao) VALUES (sIdoperador, 'CADASTROS - PESSOAS', CONCAT('O USUÁRIO ATUALIZOU A SEGUINTE PESSOA: ', sIdpessoa));&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0); font-weight: bold;"&gt;   END IF;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;END$&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Agora, criaremos a StoredProcedure para Apagar um usuário da entidade:&lt;br /&gt;&lt;br /&gt;DROP PROCEDURE IF EXISTS sp_pessoas_D$&lt;br /&gt;&lt;br /&gt;CREATE PROCEDURE sp_pessoas_D(sIdpessoa INT(11),  sIdoperador INT(11))&lt;br /&gt;BEGIN&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0); font-style: italic;"&gt;    /*Apaga a pessoa da base de dados*/&lt;/span&gt;&lt;br /&gt;DELETE FROM pessoas WHERE idpessoa = sIdPessoa;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(0, 153, 0);"&gt;       /*Inserimos na entidade usabilidade, o historico do que o usuário processou.*/&lt;/span&gt;&lt;br /&gt; INSERT INTO usabilidade(idoperador, menu, acao) VALUES (sIdoperador, 'CADASTROS - PESSOAS', CONCAT('O USUÁRIO DELETOU A SEGUINTE PESSOA: ', sIdpessoa));&lt;br /&gt;&lt;br /&gt;END$&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 102, 0);font-size:130%;" &gt;&lt;span style="font-weight: bold;"&gt;CHAMANDO AS STORED PROCEDURES&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Stored procedure de inserção:&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(0, 153, 0);"&gt;/*Chamamos a StoredProcedure, inserindo uma nova pessoa. Nota que o IdPessoa passado no parametro da nossa SP, tem o valor 0 (ZERO). Fazendo isso, forçamos a inserção na nossa base de dados, pois nunca existirá um usuário com o Id 0(Zero) em nossa base de dados*/&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(0, 153, 0);"&gt;/*Insere um usuario*/&lt;/span&gt;&lt;br /&gt;CALL sp_pessoas_IU(0, 'Mauricio', 'Rua Bahia', 'SP', 1);&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(0, 153, 0);"&gt;/*Atualiza o usuário*/&lt;/span&gt;&lt;br /&gt;CALL sp_pessoas_IU(1, 'Mauricio', 'Rua Bahia', 'BA', 1);&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;/*Deletando um usuário*/&lt;/span&gt;&lt;br /&gt;CALL sp_pessoas_D(1, 1);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Blz pessoal?&lt;br /&gt;Qualquer dúvida, enviem comentários.&lt;br /&gt;Terei prazer de responder ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/830298852164908263-1748877846917956306?l=devutils.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devutils.blogspot.com/feeds/1748877846917956306/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=830298852164908263&amp;postID=1748877846917956306' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/830298852164908263/posts/default/1748877846917956306'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/830298852164908263/posts/default/1748877846917956306'/><link rel='alternate' type='text/html' href='http://devutils.blogspot.com/2008/12/criando-auditoria-do-seu-aplicativo-e.html' title='Criando auditoria do seu aplicativo e melhorando o desempenho com Stored Procedures no MYSQL'/><author><name>Maurício Vinicius de O. Santos</name><uri>http://www.blogger.com/profile/10158075805974585222</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_l_YF-xHSDL4/STdFoMVcXEI/AAAAAAAAAAM/JXTfPHMPqmI/S220/ATgAAACOLsPwGjdpAa_SnOfdO8oYetUIkSOR5GaAc2aKfeEu6I4-M5gbzP0CnwnwwaDRa6r1hQ_cDneOBEkOgXyiYiANAJtU9VCdj81JzTyD8JjI5C1-yzkrumjLYA.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-830298852164908263.post-3869968536327935042</id><published>2008-12-12T05:41:00.000-08:00</published><updated>2008-12-12T05:49:41.752-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Delphi'/><title type='text'>Trabalhando com tabela Mestre e Detalhe no Delphi</title><content type='html'>E aew pessoal.&lt;br /&gt;Esse post foi feito pelo meu amigo Marcos Carmo. Ele esta contribuindo com esse artigo falando sobre Mestre Detalhe no Delphi utilizando componentes ADO, DataSetProvider e ClientDataSet.&lt;br /&gt;Ele também disponibilizou seu e-mail para quem quizer tirar dúvidas, enviar críticas ou sugestões com relação ao artigo:&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;E-mail: &lt;/span&gt;m4rk0s@gmail.com&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;MSN:&lt;/span&gt; m4rk0s_c4rm0@hotmail.com&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 102, 0);font-size:130%;" &gt;&lt;span style="font-family:arial;"&gt;SITUAÇÃO&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;Iniciei este artigo pensando na dificuldade que inúmeros programadores têm quando trabalham com tabelas Mestre&gt;Detalhe, inclusive eu tive essa dificuldade quando comecei a programar.&lt;br /&gt;Conheci várias maneiras para resolver isso, sendo que julguei apenas 2 delas como viáveis e irei explicar o método que prefiro e utilizo.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 0, 0);"&gt;Métodos&lt;/span&gt;&lt;br /&gt;Aqui estão alguns métodos que encontrei com suas respectivas qualidades e defeitos.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Método 1&lt;/span&gt;&lt;br /&gt;Iniciar transação ao abrir o form, gravar a tabela mestre, dessa maneira você obtém o ID_MESTRE e pode gravar direto na Detalhe, em caso de cancelamento basta dar um Rollback.&lt;br /&gt;Qualidade: Fácil e rápido de programar&lt;br /&gt;Defeito: Transação muito tempo ativa, praticamente deixa o sistema monousuário.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Método 2&lt;/span&gt;&lt;br /&gt;Inserir o Mestre ao abrir o form e entrar em modo de edição, dessa maneira você obtém o ID_MESTRE e pode gravar direto na Detalhe, em caso de cancelamento deverá deletar os registros.&lt;br /&gt;Qualidade: Fácil e rápido de programar&lt;br /&gt;Defeito: É necessário apagar tudo o que foi incluido em caso de cancelamento e cada item incluido é um acesso ao banco de dados.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Método 3&lt;/span&gt;&lt;br /&gt;Inserir os dados em um StringGrid e passar gravar tudo ao confirmar.&lt;br /&gt;Qualidade: Acesso único ao banco de dados.&lt;br /&gt;Defeito: Trabalhar com StringGrid é trabalhoso, exige muitas linhas de código e tempo.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Método 4&lt;/span&gt;&lt;br /&gt;Inserir o Mestre ao criar o form e entrar em modo de edição, sendo a query detalhe utilizando o LockType como ltBatchOptimistic, dessa maneira você obtém o ID_MESTRE e pode gravar direto na Detalhe. ltBatchOptimistic serve para trabalhar em cache, caso haja cancelamento deverá deletar o registro Mestre.&lt;br /&gt;Qualidade: Considero esse método viável, é rápido de programar e trabalha em cache, tendo ótimo desempenho e contato único com o banco de dados.&lt;br /&gt;Defeito: É necessário apagar o registro em caso de cancelamento e se o ID_MESTRE for um campo identidade vc perde um número da sequência.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Método 5 (Vencedor)&lt;/span&gt;&lt;br /&gt;Utilizar ClientDataSet para a tabela Detalhe, trabalhando tudo em cache e acessando o banco apenas quando a operação for finalizada.&lt;br /&gt;Qualidade: Faz tudo em cache tendo ótimo desempenho e gerando o ID_MESTRE apenas na finalização da operação.&lt;br /&gt;Defeito: Utiliza muitos componentes (query, datasetprovider, clientdataset) e precisa fazer looping na tabela detalhe para gravar o ID_MESTRE.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 102, 0); font-weight: bold;font-size:130%;" &gt;&lt;span style="font-family:arial;"&gt;O QUE É PRECISO&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;1 TADOQuery (qryMestre) - para a tabela Mestre (SELECT * FROM MESTRE)&lt;br /&gt;1 TADOQuery (qryDetalhe)- para a tabela Detalhe (SELECT * FROM DETALHE WHERE ID_MESTRE = :ID_MESTRE)&lt;br /&gt;1 TDataSetProvider (dspDetalhe) - que será ligado a TADOQuery da tabela detalhe {dspDetalhe.DataSet := qryDetalhe}&lt;br /&gt;1 TClientDataSet (cdsDetalhe) - que será ligado ao TDataSetProvider {cdsDetalhe.ProviderName := dspDetalhe.Name}&lt;br /&gt;e o básico: TForm, TButton, TDBEdit, TDBLookupComboBox, TDBGrid, etc...&lt;br /&gt;&lt;br /&gt;É importante ressaltar que para trabalhar com o TClientDataSet é necessário ter a midas.dll na pasta system32 ou na pasta do executável do software. Existem algumas pessoas que adicionam a midas.dll ao projeto, o problema de fazer isso é que o projeto fica imenso.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 102, 0); font-weight: bold;font-family:arial;font-size:130%;"  &gt;COMO FAZER (HOW TO)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Não vou entrar em detalhes quanto ao básico considerando que este tutorial é para quem tem um nível intermediário com Delphi.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Primeiros passos:&lt;/span&gt;&lt;br /&gt;Antes de mais nada vá ao dspDetalhe e altere a propriedade UpdateMode para UpWhereKeyOnly, isso significa que quando o TClientDataSet montar a instrução UPDATE (em uma edição) a única coisa que entrará na cláusula WHERE será a chave da tabela (isso depende de umas configurações que faremos adiante com os fields).&lt;br /&gt;Agora vamos aos fields.&lt;br /&gt;Adicione-os nas Querys e no ClientDataSet (considerando as ligações que foram citadas acima).&lt;br /&gt;&lt;br /&gt;Agora as propriedades dos fields da tabela Detalhe. A qryDetalhe e o cdsDetalhe deverão estar iguais. ProviderFlags, todos os fields do tipo fkData (exceto o ID_DETALHE se ele for Identity) deverão estar pfInUpdate = True, o ID_DETALHE deve estar com pfInWhere e pfInKey como true. Se o ID_DETALHE for Identity o delphi o trouxe como ReadOnly True, é importante que ele seja alterado para false para um procedimento que será explicado adiante. Fields do tipo Lookup, Calculated, InternalCalc ou Aggregate devem estar com todas as ProviderFlags como False.&lt;br /&gt;Importante: Fields do tipo Lookup devem estar com a propriedade LookupCache = True, caso contrário você terá a mensagem 'Erro desconhecido.' e vai surtar como eu surtei um dia.&lt;br /&gt;&lt;br /&gt;Uma informação importante, todos os trabalhos da tabela detalhe serão feitos no cdsDetalhe, então fields lookup por exemplo não precisam ser adicionados a qryDetalhe.&lt;br /&gt;Clique com o botão direito no cdsDetalhe e clique na opção FetchParams (para ele pegar o parâmetro ID_MESTRE da qryDetalhe conforme exemplo acima).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Agora vamos às linhas de código!&lt;/span&gt;&lt;br /&gt;- qryMestre.Append (ela deve estar aberta: qryMestre.Open)&lt;br /&gt;Inserção:&lt;br /&gt;- O parâmetro da cdsDetalhe deve estar com um ID que não exista na tabela Mestre, 0 por exemplo, se o campo for Identity ele nunca terá o valor 0. (cdsDetalhe.Params.ParamByName('ID_MESTRE').Value := 0)&lt;br /&gt;Edição:&lt;br /&gt;- O parâmetro da cdsDetalhe deve estar o valor do ID da tabela Mestre. (cdsDetalhe.Params.ParamByName('ID_MESTRE').Value := qryMasterID_MESTRE.Value)&lt;br /&gt;Abra a cdsDetalhe agora que ela já tem o parâmetro (cdsDetalhe.Open)&lt;br /&gt;Declare no seu form uma variável pública inteira inicializada com valor -1 (no meu exemplo será ID_DETALHE). A variável deve ser negativa e será decrementada para que não haja violação de chave.&lt;br /&gt;o evento OnNewRecord do cdsDetalhe você deverá fazer o seguinte:&lt;br /&gt;cdsDetalheID_DETALHE.Value := ID_DETALHE; &lt;span style="font-style: italic; color: rgb(0, 153, 0);"&gt;//por isso a propriedade ReadOnly deve estar como false&lt;/span&gt;&lt;br /&gt;Dec(ID_DETALHE);&lt;br /&gt;- Agora trabalhe nos botões referente à tabela Detalhe:&lt;br /&gt;Inserção: cdsDetalhe.Append;&lt;br /&gt;Edição: cdsDetalhe.Edit;&lt;br /&gt;Confirmação: cdsDetalhe.Post;&lt;br /&gt;Cancelamento: cdsDetalhe.Cancel;&lt;br /&gt;Exclusão: cdsDetalhe.Delete;&lt;br /&gt;- No botão de finalização do processo (confirmando) deve estar um código semelhante a este:&lt;br /&gt;try (opcional)&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0); font-style: italic;"&gt;//Iniciar transação (opcional)&lt;/span&gt;&lt;br /&gt;qryMestre.Post;&lt;br /&gt;cdsDetalhe.DisableControls; &lt;span style="color: rgb(0, 153, 0); font-style: italic;"&gt;//Apenas para aumentar a performance do looping que será &lt;/span&gt;feito.&lt;br /&gt;cdsDetalhe.First;&lt;br /&gt;while not cdsDetalhe.Eof do&lt;br /&gt;begin&lt;br /&gt;  cdsDetalhe.Edit;&lt;br /&gt;  cdsDetalheID_MESTRE.Value := qryMestreID_MESTRE.Value;&lt;br /&gt;  cdsDetalhe.Post;&lt;br /&gt;  cdsDetalhe.Next;&lt;br /&gt;end;&lt;br /&gt;cdsDetalhe.EnableControls;&lt;br /&gt;if cdsDetalhe.ApplyUpdates(0) &lt;&gt; 0 then &lt;span style="color: rgb(0, 153, 0); font-style: italic;"&gt;//Caso haja um erro ao incluir os itens ele gera uma exceção &gt; 0 não applica atualizações com erros &gt; -1 ignora erros e qualquer valor maior que 0 é a quantidade de erros que ele irá permitir&lt;/span&gt;&lt;br /&gt;  Raise Exception.Create('Erro ao incluir os itens (cdsDetalhe.ApplyUpdates(0))')&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(0, 153, 0);"&gt;//commit (opcional)&lt;/span&gt;&lt;br /&gt;except  (opcional)&lt;br /&gt;on e:Exception do&lt;br /&gt;begin&lt;br /&gt;  &lt;span style="font-style: italic; color: rgb(0, 153, 0);"&gt;//Retorna transação (rollback)&lt;/span&gt;&lt;br /&gt;  Application.MessageBox(pChar('Erro: '+e.Message),'Atenção',MB_ICONERROR);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Bom.. é isso aí...&lt;br /&gt;Não sou muito bom para explicar, mas acho que da pra entender.&lt;br /&gt;Qualquer dúvida basta me contatar por e-mail.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/830298852164908263-3869968536327935042?l=devutils.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devutils.blogspot.com/feeds/3869968536327935042/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=830298852164908263&amp;postID=3869968536327935042' title='3 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/830298852164908263/posts/default/3869968536327935042'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/830298852164908263/posts/default/3869968536327935042'/><link rel='alternate' type='text/html' href='http://devutils.blogspot.com/2008/12/trabalhando-com-tabela-mestre-e-detalhe.html' title='Trabalhando com tabela Mestre e Detalhe no Delphi'/><author><name>Maurício Vinicius de O. Santos</name><uri>http://www.blogger.com/profile/10158075805974585222</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_l_YF-xHSDL4/STdFoMVcXEI/AAAAAAAAAAM/JXTfPHMPqmI/S220/ATgAAACOLsPwGjdpAa_SnOfdO8oYetUIkSOR5GaAc2aKfeEu6I4-M5gbzP0CnwnwwaDRa6r1hQ_cDneOBEkOgXyiYiANAJtU9VCdj81JzTyD8JjI5C1-yzkrumjLYA.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-830298852164908263.post-3129154480648275826</id><published>2008-12-11T09:03:00.000-08:00</published><updated>2008-12-11T09:38:32.319-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Delphi'/><title type='text'>Colunas em ComboBox no Delphi</title><content type='html'>Eu sei que tenho postado muitas coisas em Delphi, isso é devido ao projeto em que estou agora que é feito em cima do Delphi 2007, mas espero estar postando sempre mais coisas novas para diversificar.&lt;br /&gt;&lt;br /&gt;Bom, vamos ao assunto do Post.&lt;br /&gt;&lt;br /&gt;Quase sempre precisei utilizar ComboBox com colunas, então eu até adotava alguns meios de adicioná-las em eventos "Draw" do Combobox, mas contece que eu queria ir mais além daquelas colunas estranhas. Eu gostaria de inserir dados com letras em negrito, cores de fundo ecolunas bem mais alinhadas. Foi pesquisando que achei o componente TColumnComboBox.&lt;br /&gt;Com ele é possível colocar cores e adicionar quantas colunas forem precisas em seu Combo.&lt;br /&gt;Ele pode ficar mais ou menos com o estilo abaixo:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_l_YF-xHSDL4/SUFJu3qW4bI/AAAAAAAAACA/rrbZcdyBmP0/s1600-h/combo-1.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 363px; height: 88px;" src="http://1.bp.blogspot.com/_l_YF-xHSDL4/SUFJu3qW4bI/AAAAAAAAACA/rrbZcdyBmP0/s320/combo-1.jpg" alt="" id="BLOGGER_PHOTO_ID_5278581307819352498" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Esse é um combo que utilizo em meu sistema.&lt;br /&gt;Eu estou buscando essas informações pela minha base de Dados, mas nada impede de você inserir seus dados fixos.&lt;br /&gt;Nós podemos inserir um código para identificar o registro que queremos trabalhar. Isso fica muito mais visível para o usuário que utiliza o sistema e mais "fácil" para quem esta implementando.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold; color: rgb(255, 102, 0);font-family:arial;" &gt;INSTALAÇÃO&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;O TColumnComboBox é feito pela empresa TMS Software.&lt;br /&gt;Para fazer o download do TColumComboBox, acesse a seguinte URL:&lt;br /&gt;http://www.tmssoftware.com/site/colcombo.asp&lt;br /&gt;&lt;br /&gt;A instalação é bem parecida com o FreeBoleto, que é um componente que eu ensino como instalá-lo aqui no meu Blog.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 102, 0);font-size:130%;" &gt;&lt;span style="font-family:arial;"&gt;FUNCIONAMENTO DO TCOLUMNCOMBOBOX&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;O TColumnComboBox não possui a propriedade &lt;span style="font-weight: bold;"&gt;Items&lt;/span&gt; como estamos acostumados a utilizar em um ComboBox comum.&lt;br /&gt;Para adicionar os dados, utilizaremos as propriedades &lt;span style="font-weight: bold;"&gt;Columns&lt;/span&gt; e &lt;span style="font-weight: bold;"&gt;ComboItems&lt;/span&gt;.&lt;br /&gt;Na propriedade Columns, adicionamos a quantidade e título das colunas que quizermos e em comboItens, adicionamos as linhas do TColumComboBox.&lt;br /&gt;&lt;br /&gt;Nesse post, ensinarei como inserir os valores em modo de Execução e além de criar o Combo, criaremos uma procedure que amplia a largura do ComboBox quando ele é clicado.&lt;br /&gt;&lt;br /&gt;Segue abaixo o código da criação dos items do TColumnComboBox:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;var&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(0, 153, 0);"&gt;//Cria um objeto do tipo TColumnComboBox&lt;/span&gt;&lt;br /&gt;C: TColumnComboBox;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;begin&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(0, 153, 0);"&gt;       //Faz referencia a classe&lt;/span&gt;&lt;br /&gt;      C := TColumnComboBox.Create(Self);&lt;br /&gt;&lt;br /&gt;     with C do&lt;br /&gt;     begin&lt;br /&gt;       Parent := Panel1;&lt;br /&gt;       Name := 'cmbFormaPagto';&lt;br /&gt;       Left := 10;&lt;br /&gt;       Top := 10;&lt;br /&gt;       Visible := true;&lt;br /&gt;       CharCase := ecUpperCase;&lt;br /&gt;       AutoSize := true;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0); font-style: italic;"&gt;        //Inserimos uma função no evento ondropdown do ComboBox, para assim que&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0); font-style: italic;"&gt;       //Clicar no ComboBox, a largura seja ampliada.&lt;/span&gt;&lt;br /&gt;       OnDropDown := ExpandirComboFormaPagto;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(0, 153, 0);"&gt;       //Cria a primeira coluna&lt;/span&gt;&lt;br /&gt;       with Columns.Add do&lt;br /&gt;       begin&lt;br /&gt;         Width:=25;&lt;br /&gt;         Font.Style:=[fsBold];&lt;br /&gt;         Color := clRed;&lt;br /&gt;       end;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(0, 153, 0);"&gt;       //Cria a segunda coluna&lt;/span&gt;&lt;br /&gt;       with Columns.Add do&lt;br /&gt;       begin&lt;br /&gt;         Width:=220;&lt;br /&gt;       end;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(0, 153, 0);"&gt;       //Cria a terceira coluna&lt;/span&gt;&lt;br /&gt;       with Columns.Add do&lt;br /&gt;         begin&lt;br /&gt;           Width:=220;&lt;br /&gt;           Font.Color:=clBlue;&lt;br /&gt;           Font.Style:=[fsBold];&lt;br /&gt;           Color := $00D1FCDC;&lt;br /&gt;         end;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(0, 153, 0);"&gt;       //Adciona os itens aos combobox&lt;/span&gt;&lt;br /&gt;             with ComboItems.Add do&lt;br /&gt;              begin&lt;br /&gt;               Strings.Add('1');&lt;br /&gt;               Strings.Add('Primeiro item');&lt;br /&gt;               Strings.Add(' Descrição 1');&lt;br /&gt;              end;&lt;br /&gt;&lt;br /&gt;             with ComboItems.Add do&lt;br /&gt;              begin&lt;br /&gt;               Strings.Add(2');&lt;br /&gt;               Strings.Add('Segundo item');&lt;br /&gt;               Strings.Add(' Descrição 2');&lt;br /&gt;              end;&lt;br /&gt;  &lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;        end;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt; end;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Segue abaixo o código da procedure para apliar a largura do ComboBox:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;begin&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;//Aqui decidimos a largura do ComboBox para 500, mas você pode mudar a largura que quizer.&lt;/span&gt;&lt;br /&gt;TComboBox(Sender).Perform(CB_SETDROPPEDWIDTH, 500, 0);&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;end;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Beleza pessoal?&lt;br /&gt;Abraços e até +.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/830298852164908263-3129154480648275826?l=devutils.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devutils.blogspot.com/feeds/3129154480648275826/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=830298852164908263&amp;postID=3129154480648275826' title='4 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/830298852164908263/posts/default/3129154480648275826'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/830298852164908263/posts/default/3129154480648275826'/><link rel='alternate' type='text/html' href='http://devutils.blogspot.com/2008/12/colunas-em-combobox-no-delphi.html' title='Colunas em ComboBox no Delphi'/><author><name>Maurício Vinicius de O. Santos</name><uri>http://www.blogger.com/profile/10158075805974585222</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_l_YF-xHSDL4/STdFoMVcXEI/AAAAAAAAAAM/JXTfPHMPqmI/S220/ATgAAACOLsPwGjdpAa_SnOfdO8oYetUIkSOR5GaAc2aKfeEu6I4-M5gbzP0CnwnwwaDRa6r1hQ_cDneOBEkOgXyiYiANAJtU9VCdj81JzTyD8JjI5C1-yzkrumjLYA.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_l_YF-xHSDL4/SUFJu3qW4bI/AAAAAAAAACA/rrbZcdyBmP0/s72-c/combo-1.jpg' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-830298852164908263.post-3801619953025657622</id><published>2008-12-10T02:23:00.000-08:00</published><updated>2008-12-10T03:05:09.387-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Delphi'/><title type='text'>Uso de Aggregates no ClientDataSet</title><content type='html'>Olá pessoal.&lt;br /&gt;Hoje nesse post, falarei sobre o uso de aggregates no ClientDataSet.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt; &lt;span style="font-weight: bold; color: rgb(255, 102, 0);font-family:arial;" &gt;PARA QUÊ E ONDE EU UTILIZO AGGREGATES?&lt;/span&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Uma das funções do aggregate, é poder gerar expressões que envolvam todas as ocorrências adquiridas em uma Query como Somar, Contar, adquirir o valor Mínimo, Máximo e média total.&lt;br /&gt;Muitos programadores costumam fazer isso atribuindo valores a um loop Do While Next;&lt;br /&gt;Mas essa é uma alternativa lerda em que caso for contar uma quantidade grande de registros, a aplicação pode ficar lenta.&lt;br /&gt;&lt;br /&gt;Você pode estar se perguntando: "Eu não posso fazer isso pelo InternalCalc?".&lt;br /&gt;Com o Internalcalc, eu consigo fazer operações no registro onde esta o ponteiro, mas não em todos os registros.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold; color: rgb(255, 102, 0);font-family:arial;" &gt;UTILIZANDO AGGREGATES&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Vamos botar a mão na massa.&lt;br /&gt;Arraste um Panel, um ClientDataSet, um DataSource e um DBGrid para o formulário.&lt;br /&gt;Marque a opção Align do panel para AlBottom e a opção Align do DBGrid para AlClient.&lt;br /&gt;&lt;br /&gt;Vamos carregar os dados no ClientDataSet de um arquivo XML.&lt;br /&gt;A instalação do Delphi gera alguns arquivos XML por padrão, para uso de testes dentro do Delphi.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Clique no ClientDataSet e clique na elipse(...) da propriedade FileName.&lt;/li&gt;&lt;li&gt;Vá na raiz onde esta instalado o Delphi-&gt; Arquivos de Programas -&gt;Arquivos Comuns-&gt;Borland Shared (ou CodeGear Shared) -&gt;Data.&lt;/li&gt;&lt;li&gt;Escolha o arquivo &lt;span style="font-weight: bold;"&gt;Employee.xml&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Marque a propriedade &lt;span style="font-weight: bold;"&gt;Active&lt;/span&gt; do CDS para TRUE.&lt;/li&gt;&lt;li&gt;Aponte a propriedade &lt;span style="font-weight: bold;"&gt;DataSet &lt;/span&gt;do DataSource1 para o ClientDataset1.&lt;/li&gt;&lt;/ul&gt;Seu Form deverá ficar assim:&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_l_YF-xHSDL4/ST-eFg1lL8I/AAAAAAAAABo/rWt01bO8Ekw/s1600-h/cds-aggregates1.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 309px; height: 211px;" src="http://1.bp.blogspot.com/_l_YF-xHSDL4/ST-eFg1lL8I/AAAAAAAAABo/rWt01bO8Ekw/s320/cds-aggregates1.jpg" alt="" id="BLOGGER_PHOTO_ID_5278111105852714946" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Clique 2x no ClientDataSet, e tecla CTRL+F(Add All Fields).&lt;/li&gt;&lt;li&gt;Marque a opção AggregatesActive do CDS para True.&lt;/li&gt;&lt;li&gt;No FieldsEditor do CDS, tecle CTRL+M(New Field).&lt;/li&gt;&lt;li&gt;em Name, digite SOMA e em FieldType, marque a opção Aggregate. Note que o Type do novo Field, também ficará como Aggregate.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_l_YF-xHSDL4/ST-fK43phdI/AAAAAAAAABw/v7M4j-zGva4/s1600-h/cds-aggregates2.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 320px; height: 218px;" src="http://2.bp.blogspot.com/_l_YF-xHSDL4/ST-fK43phdI/AAAAAAAAABw/v7M4j-zGva4/s320/cds-aggregates2.jpg" alt="" id="BLOGGER_PHOTO_ID_5278112297714812370" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Note que o FieldEditor adicionou uma nova linha separada com o campo Agregado. O CDS faz isso com todos os campos agregados que lhe é carregado.&lt;br /&gt;Clique no TField Soma e vá até a propriedade &lt;span style="font-weight: bold;"&gt;Expression&lt;/span&gt; no Object Inspector.&lt;br /&gt;Digite o seguinte: SUM(salary) e ainda no TFieldSoma, marque a propriedade &lt;span style="font-weight: bold;"&gt;Active&lt;/span&gt; para TRUE.&lt;br /&gt;Arraste um DBText para o Panel abaixo do DBGrid. Aponte o DataSource1 na propriedade DataSource do DBText e em DataField selecione a opção SOMA (que é o novo TField agregado que criamos).&lt;br /&gt;Note que o Caption do DBText já é alterado pegando a soma total do campo Salary em todas as ocorrências. Caso você filtre o ClientDataSet, a somatotal do DBText será a soma de todos os registros filtrados.&lt;br /&gt;&lt;br /&gt;Nossa aplicação não fica beeeeeeeeeeem mais rápida assim?&lt;br /&gt;:D&lt;br /&gt;legal né?&lt;br /&gt;&lt;br /&gt;Em caso de dúvidas, podem comentar que respondo o mais rápido que eu puder.&lt;br /&gt;&lt;br /&gt;Abraços e até a proxima.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/830298852164908263-3801619953025657622?l=devutils.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devutils.blogspot.com/feeds/3801619953025657622/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=830298852164908263&amp;postID=3801619953025657622' title='6 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/830298852164908263/posts/default/3801619953025657622'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/830298852164908263/posts/default/3801619953025657622'/><link rel='alternate' type='text/html' href='http://devutils.blogspot.com/2008/12/uso-de-aggregates-no-clientdataset.html' title='Uso de Aggregates no ClientDataSet'/><author><name>Maurício Vinicius de O. Santos</name><uri>http://www.blogger.com/profile/10158075805974585222</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_l_YF-xHSDL4/STdFoMVcXEI/AAAAAAAAAAM/JXTfPHMPqmI/S220/ATgAAACOLsPwGjdpAa_SnOfdO8oYetUIkSOR5GaAc2aKfeEu6I4-M5gbzP0CnwnwwaDRa6r1hQ_cDneOBEkOgXyiYiANAJtU9VCdj81JzTyD8JjI5C1-yzkrumjLYA.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_l_YF-xHSDL4/ST-eFg1lL8I/AAAAAAAAABo/rWt01bO8Ekw/s72-c/cds-aggregates1.jpg' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-830298852164908263.post-4298242316700077135</id><published>2008-12-09T02:55:00.000-08:00</published><updated>2008-12-09T04:51:06.001-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Delphi'/><category scheme='http://www.blogger.com/atom/ns#' term='MYSQL'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>Transactions com DBExpress 4 e MySQL 5</title><content type='html'>E ai pessoal. Antes de começar o Post, gostaria de agradecer aos meus amigos pelos comentários e pelos parabéns que tenho recebido por msn e orkut :).&lt;br /&gt;&lt;br /&gt;Nesse Post falarei sobre Transaction no Mysql utilizando o próprio MySQL e/ou Delphi 2007 com DBExpress 4.0.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 102, 0);font-family:arial;font-size:130%;"  &gt;TRANSACÇÃO DE DADOS (TRANSACTION)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;O que seria uma transacção de dados?&lt;br /&gt;Transacção de dados, nada mais é do que um acordo entre duas operações, uma regra de negócio que para ser finalizada, todos os dados precisam estar completos e fazendo parte de um acordo.&lt;br /&gt;&lt;br /&gt;Para exemplificar, imagina uma operação financeira. Dentro de uma conta a pagar, é necessário emitir 6 faturas e, essas faturas completam o valor total da conta criada.&lt;br /&gt;Ficaria assim:&lt;br /&gt;Valor total da conta a pagar: R$ 600&lt;br /&gt;Total de faturas: 6 faturas de R$100,00&lt;br /&gt;&lt;br /&gt;Agora imagina você cadastrando a conta e quando vai gerar as faturas, o servidor cai, seu computador desliga ou ocorre algum outro erro? O que acontece?&lt;br /&gt;Seus dados podem não estar completos, gerando inconsistência nos dados e, ao invés de você cadastrar as 6 faturas, acaba registrando apenas 4. Fora os problemas e erros que podem gerar na base de dados.&lt;br /&gt;É ai que a TRANSACTION entra em ação!&lt;br /&gt;&lt;br /&gt;Resumindo e quase "desenhando" como a transaction age em nosso sistema e base de dados:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 0, 0);"&gt;Sistema:&lt;/span&gt; Banco, esta ai? inicia uma transação ai pra mim.&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 153);"&gt;Base de dados:&lt;/span&gt; Transação realizada.&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 0, 0);"&gt;Sistema:&lt;/span&gt; Ei banco vlw, registra pra mim essa conta.&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 153);"&gt;Base de dados:&lt;/span&gt; Legal, conta registrada, pode continuar.&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 0, 0);"&gt;Sistema:&lt;/span&gt; Registra essa fatura:&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 153);"&gt;Base de dados:&lt;/span&gt; Fatura registrada.&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 0, 0);"&gt;Sistema:&lt;/span&gt; Banco, registra essa outra fatura:&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 0, 0);"&gt;Sistema:&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;Banco??? Banco???? Cadê vc????&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 0, 0);"&gt;Sistema:&lt;/span&gt; Como não consegui registrar tudo, entao vou cancelar a conta e a fatura já cadastrada para mais tarde quando a base voltar do banheiro, fazer tudo novamente.&lt;br /&gt;&lt;br /&gt;Isso é uma transaction gerada pelo sistema. Você também pode fazer a mesma coisa dentro de uma Stored Procedure ou uma trigger, direto pelo banco, sem a utilização do seu sistema, independentemente se é feito em Delphi, PHP, C#, Java ou qualquer outra linguagem de programação.&lt;br /&gt;&lt;br /&gt;Este tipo de utilização da transaction, depende do processo que você irá realizar.&lt;br /&gt;&lt;br /&gt;Por exemplo, se você deseja armazenar dados em um relacionamento 1-N, a melhor forma de utilizar  a transaction é pelo sistema, caso contrário, você pode fazer a transaction diretamente pelo banco, como em uma auditoria de cadastros e atualizações das entidades da sua base de dados.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 102, 0);font-family:arial;font-size:130%;"  &gt;TRANSACTION UTILIZANDO DBEXPRESS 4&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Em uma transação, temos:&lt;br /&gt;Inicio da transação&lt;br /&gt;Comandos SQL DML&lt;br /&gt;Se tudo deu certo, COMMIT (comete)&lt;br /&gt;Se deu algo errado, ROLLBACK (Volta e desfaz tudo!)&lt;br /&gt;&lt;br /&gt;Então, vamos la.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;var&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;Trans: TDBXTransaction;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;Qry: TSQLQuery;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;begin&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(0, 153, 0);"&gt;  //Inicia a transacão com o componente de conexão com a base de dados, chamada de &lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(0, 153, 0);"&gt; //CONEXAO. Ele é um TSQLConnection da aba DBExpress&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(0, 153, 0);"&gt; //Todos os objetos que se conectarem a essa conexão, estarão em transação&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);"&gt;Trans := CONEXAO.BeginTransaction(TDBXIsolations.ReadCommitted);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(0, 153, 0);"&gt;//Aqui utilizamos um try para verificar se tudo vai ocorrer bem&lt;/span&gt;.&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;try&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(0, 153, 0);"&gt;    //Cria um objeto da classe TSQLQuery para conectar-se ao componente de conexao a&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(0, 153, 0);"&gt;   // base de dados criada anteriormente&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;     Qry := TSQLQuery.Create(Self);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;     with Qry do&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;begin&lt;/span&gt;&lt;br /&gt;    SQLConnection := CONEXAO;&lt;br /&gt;    SQL.Text := 'INSERT INTO contas (documento, valor_original, valor_total) VALUES  ('+QuotedStr('00043244')+', '+QuotedStr('35.50')+', '+QuotedStr('40.00')+')';&lt;br /&gt;    ExecSQL;&lt;br /&gt;&lt;br /&gt;    SQL.Text := 'INSERT INTO faturas (idconta,  valor_total, data_lancamento, data_pagamento) VALUES  ('+QuotedStr('1')+', '+QuotedStr('2008/08/03')+', '+QuotedStr('2008/08/10')+')';&lt;br /&gt;    ExecSQL;   &lt;br /&gt;&lt;br /&gt;    SQL.Text := 'INSERT INTO faturas (idconta,  valor_total, data_lancamento, data_pagamento) VALUES  ('+QuotedStr('1')+', '+QuotedStr('2008/08/03')+', '+QuotedStr('2008/08/10')+')';&lt;br /&gt;     ExecSQL;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;      Close; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;      end;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(0, 153, 0);"&gt;  //Caso tudo ocorreu normalmente, Comete a transação, ou seja. Insere todos os dados na&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(0, 153, 0);"&gt;  //base de dados&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);"&gt; CONEXAO.CommitFreeAndNil(Trans);  &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;Except&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(0, 153, 0);"&gt;//Caso ocorreu algum erro, cancela TODAS as operações acima&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);"&gt;DM1.CONEXAO.RollbackFreeAndNil(Trans);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;end;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Esse cadastro foi feito apenas para explicação. Crie sua base de dados e provoque erros no código para testar sua aplicação utilizando TRANSACTION.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 102, 0);font-family:arial;font-size:130%;"  &gt;TRANSACTION DIRETAMENTE PELO MYSQL&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Para utilizar Transações no Mysql 5, o Engine das suas tabelas precisam estar como INNODB.&lt;br /&gt;Por padrão, MySQL é executado em modo autocommit. Isto         significa que assim que você executa uma instrução que         atualiza (modifica) uma tabela, o MySQL armazena a atualização         no disco.&lt;br /&gt; você pode colocar o MySQL em modo não autocommit com o         seguinte comando:        &lt;pre class="programlisting"&gt;&lt;span style="font-weight: bold; color: rgb(204, 0, 0);font-size:130%;" &gt;SET AUTOCOMMIT=0&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;         Depois de disabilitar o modo autocommit configurando a variável         &lt;code style="font-weight: bold;" class="literal"&gt;AUTOCOMMIT&lt;/code&gt; com zero, você deve utilizar         &lt;code style="font-weight: bold;" class="literal"&gt;COMMIT&lt;/code&gt; para armazenar suas alterações em         disco ou&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;&lt;code style="font-weight: bold;" class="literal"&gt;ROLLBACK&lt;/code&gt; se você deseja ignorar as         alterações que você fez desde o início da sua transação.       &lt;/p&gt; &lt;p&gt;         Se você quiser disabilitar o modo autocommit para uma única         série de instruções, você pode utiliar a instrução&lt;span style="font-weight: bold;"&gt;         &lt;/span&gt;&lt;code style="font-weight: bold;" class="literal"&gt;START TRANSACTION&lt;/code&gt;:&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);"&gt;START TRANSACTION; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;INSERT INTO contas(documento, valor_original, valor_total) VALUES ('343434', '45.50', '50.00');&lt;br /&gt;&lt;br /&gt;INSERT INTO faturas(idfatura, data_vencimento, data_pagamento) VALUES (LAST_INSERT_ID(), '2008-12-01', '2008-12-01');&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);"&gt; COMMIT; &lt;/span&gt;&lt;pre class="programlisting"&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:verdana;"&gt;Caso queira cancelar a transação, ao invés de COMMIT, use &lt;span style="font-weight: bold;"&gt;ROLLBACK&lt;/span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Pessoal, tentei explicar da forma mais simples possível como utilizamos Transações pelo Delphi utilizando o componente DBExpress e diretamente pelo Mysql.&lt;br /&gt;&lt;br /&gt;Blz pessoal?&lt;br /&gt;Abraços e até mais.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/830298852164908263-4298242316700077135?l=devutils.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devutils.blogspot.com/feeds/4298242316700077135/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=830298852164908263&amp;postID=4298242316700077135' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/830298852164908263/posts/default/4298242316700077135'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/830298852164908263/posts/default/4298242316700077135'/><link rel='alternate' type='text/html' href='http://devutils.blogspot.com/2008/12/transactions-com-dbexpress-4-e-mysql-5.html' title='Transactions com DBExpress 4 e MySQL 5'/><author><name>Maurício Vinicius de O. Santos</name><uri>http://www.blogger.com/profile/10158075805974585222</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_l_YF-xHSDL4/STdFoMVcXEI/AAAAAAAAAAM/JXTfPHMPqmI/S220/ATgAAACOLsPwGjdpAa_SnOfdO8oYetUIkSOR5GaAc2aKfeEu6I4-M5gbzP0CnwnwwaDRa6r1hQ_cDneOBEkOgXyiYiANAJtU9VCdj81JzTyD8JjI5C1-yzkrumjLYA.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-830298852164908263.post-3057170281183555071</id><published>2008-12-06T05:48:00.000-08:00</published><updated>2008-12-09T05:14:00.913-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>SQL: Relacionamentos Self One-to-Many</title><content type='html'>Esses dias para o plano de contas do sistema, precisei criar um cadastro que funcionasse de forma hierarquica, onde cada cadastro obedecia uma sequência.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;&lt;strong&gt;&lt;span style="color: rgb(204, 0, 0);"&gt;Exemplo&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;/div&gt;DESPESAS OPERACIONAIS&lt;br /&gt;&lt;div&gt;- ASSISTÊNCIA MÉDICA&lt;/div&gt;- VALE TRANSPORTE&lt;br /&gt;&lt;div&gt;- ALIMENTAÇÃO&lt;/div&gt;&lt;div&gt;- PRO-LABORE&lt;/div&gt;&lt;div&gt;- SALÁRIOS&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;Note que os últimos 5 itens ficam dentro de um item de nível superior.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Nós podemos fazer isso usando duas tabelas e fazendo um relacionamento 1-N &lt;/div&gt;ou, podemos criar um relacionamento chamado Self One-to-Many que utiliza a mesma tabela para poder fazer esses relacionamentos.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;O SQL pode tratar uma mesma tabela de diferentes modos.&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;strong&gt;&lt;span style="color: rgb(255, 102, 0);font-family:arial;font-size:130%;"  &gt;CRIANDO A TABELA&lt;/span&gt;&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Iremos criar uma tabela bem simples de um cadastro de categorias para um restautante.&lt;/div&gt;&lt;div&gt;As categorias do restaurante costumam ser: Bebidas, Doces, Salgados....e dentro dessas categorias ou grupos, existem outros grupos que se encaixam como em Bebidas, eu posso ter: ÁGUAS, REFRIGERANTES, BEBIDAS ALCOÓLICAS, etc.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Para essa referência, criaremos um campo que funciona como chave estrangeira. É a mesma coisa como se fossemos criar uma outra tabela para fazer o relacionamento das categorias.&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;O Código para criação das tabelas para uma base MySQL, é a seguinte:&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;Create table `test`.`categorias`( `idcategoria` int(11) NOT NULL AUTO_INCREMENT , `idsubcategoria` int(11) , `nome` varchar(50) , PRIMARY KEY (`idcategoria`), KEY `FKcategoria` (`idsubcategoria`), CONSTRAINT `FKcategoria` FOREIGN KEY (`idsubcategoria`) REFERENCES `categorias` (`idcategoria`)) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=latin1;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;Eu usei o tipo da tabela como INNODB, mas você poderá usar MyISAM normalmente.&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Com a tabela criada, insira os dados na tabela como na imagem abaixo:&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_l_YF-xHSDL4/STqH-P7kqfI/AAAAAAAAABY/_tkc0WWUqxs/s1600-h/sqlself1.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 320px; height: 215px;" src="http://1.bp.blogspot.com/_l_YF-xHSDL4/STqH-P7kqfI/AAAAAAAAABY/_tkc0WWUqxs/s320/sqlself1.jpg" alt="" id="BLOGGER_PHOTO_ID_5276679416915995122" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Veja que há um relacionamento de Refrigerantes, Alcoólicas e água com a categoria BEBIDAS.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 102, 0);font-size:130%;" &gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;CAPTURANDO DADOS RELACIONAMENTOS PELA MESMA TABELA&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Para fazer a query e receber os dados relacionados, tratamos a tabela de categorias como 2 tabelas distintas relacionadas.&lt;br /&gt;&lt;br /&gt;Para isso, podemos criar a seguinte query:&lt;br /&gt;SELECT CONCAT(c.nome, ' &gt;&gt; ', s.nome) as categorias FROM categorias c, categorias s&lt;br /&gt;WHERE s.idsubcategoria = c.idcategoria&lt;br /&gt;&lt;br /&gt;O Concat serve para concatenar dados em uma query SQL.&lt;br /&gt;O resultado será o seguinte:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_l_YF-xHSDL4/STqI7X1jvnI/AAAAAAAAABg/fa7AXHPw0FU/s1600-h/sqlself2.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 239px; height: 180px;" src="http://1.bp.blogspot.com/_l_YF-xHSDL4/STqI7X1jvnI/AAAAAAAAABg/fa7AXHPw0FU/s320/sqlself2.jpg" alt="" id="BLOGGER_PHOTO_ID_5276680467010272882" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Maravilha né?&lt;br /&gt;Dessa forma, como utilizamos a mesma estrutura de dados para as tabelas, podemos fazer o relacionamento Self One-to-Many.&lt;br /&gt;&lt;br /&gt;Qualquer dúvida, favor comentar ;)&lt;br /&gt;Abraços...e até +&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/830298852164908263-3057170281183555071?l=devutils.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devutils.blogspot.com/feeds/3057170281183555071/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=830298852164908263&amp;postID=3057170281183555071' title='5 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/830298852164908263/posts/default/3057170281183555071'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/830298852164908263/posts/default/3057170281183555071'/><link rel='alternate' type='text/html' href='http://devutils.blogspot.com/2008/12/sql-relacionamentos-self-to-self.html' title='SQL: Relacionamentos Self One-to-Many'/><author><name>Maurício Vinicius de O. Santos</name><uri>http://www.blogger.com/profile/10158075805974585222</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_l_YF-xHSDL4/STdFoMVcXEI/AAAAAAAAAAM/JXTfPHMPqmI/S220/ATgAAACOLsPwGjdpAa_SnOfdO8oYetUIkSOR5GaAc2aKfeEu6I4-M5gbzP0CnwnwwaDRa6r1hQ_cDneOBEkOgXyiYiANAJtU9VCdj81JzTyD8JjI5C1-yzkrumjLYA.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_l_YF-xHSDL4/STqH-P7kqfI/AAAAAAAAABY/_tkc0WWUqxs/s72-c/sqlself1.jpg' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-830298852164908263.post-5686961987057267679</id><published>2008-12-05T16:27:00.000-08:00</published><updated>2008-12-05T18:02:58.319-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><title type='text'>Arrays (Vetores/Matrizes) no PHP</title><content type='html'>Quando comecei a programar, tive muitas dúvidas de como usar arrays ou até mesmo o que é um array, vetor ou matriz.&lt;br /&gt;&lt;br /&gt;Esses dias no meu trabalho meu amigo meio "Bixinha" me perguntou:&lt;br /&gt;Aiiii...como que eu posso armazenar valores diferentes em uma mesma variável?&lt;br /&gt;Dai foi então que eu expliquei: ARRAY!&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 102, 0);font-size:130%;" &gt;&lt;span style="font-weight: bold;font-family:arial;" &gt;O QUE É UM ARRAY?&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Essa foi a pergunta da minha linda namorada antes da prova da faculdade.&lt;br /&gt;O que eu expliquei pra ela foi o seguinte:&lt;br /&gt;Array, é como se fosse um livro.&lt;br /&gt;Dentro de um livro, possuimos índices e, em cada índice, o livro possui um valor, que é o conteudo daquele indice.&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold; color: rgb(204, 0, 0);font-size:130%;" &gt;Exemplo:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;livro[0]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;livro[1]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;livro[2]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;No exemplo acima e seguindo o exemplo que dei à minha namorada sobre o livro, lemos o seguinte:&lt;br /&gt;Livro índice 0&lt;br /&gt;Livro índice 1&lt;br /&gt;Livro índice 2&lt;br /&gt;Então, esse livro possui 3 índices e cada índice do livro, possui textos diferentes.&lt;br /&gt;O array trabalha da mesma forma.&lt;br /&gt;Na programação, nós podemos dar valores aos índices de uma variável do tipo array.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold; color: rgb(204, 0, 0);font-size:130%;" &gt;Exemplo:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;livro[0] = 'Branca de neve encontrou os sete anões'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;livro[1] = 'Branca de neve foi morar com os 7 anões'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;livro[2] = 'Branca de neve mordeu a maça da bruxa e dormiu eternamente'&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:arial;font-size:130%;"  &gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 102, 0); font-weight: bold;"&gt;UTILIZANDO ARRAY NO PHP&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Uma dica que eu dou para as pessoas que tiram dúvidas comigo, é: Consulte o manual!!&lt;br /&gt;O manual do php é ótimo e além de fornecer informações sobre as funções e estruturas da linguagem, contém exemplos enviados pela comunidade "PHPense".&lt;br /&gt;Algumas funções já possuem manual em português.&lt;br /&gt;Para acessar o manual, basta entrar em &lt;span style="font-weight: bold;"&gt;www.php.net&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Meu patrão sempre me fala que manual é o guia dos "burros", mas na minha opinião, os espertos não perdem tempo fazendo besteiras e já os consultam logo de cara!&lt;br /&gt;&lt;br /&gt;Existem várias formas de criar um array, a forma mais fácil na minha opinião é descrita abaixo:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;$livro[0] = "Branca de neve encontrou os sete anões";&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;$livro[1] = "Branca de neve foi morar com os 7 anões";&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;$livro[2] = "Branca de neve mordeu a maça da bruxa e dormiu eternamente"&lt;span style="font-weight: bold;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Além de criar vetores por índices como feito acima, podemos criar vetores com seus índices e referenciá-los por um nome, exemplo:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;$livro[0]["titulo"] = "Branca de neve e os sete anões";&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;$livro[0]["autor"] = "Mariana";&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;$livro[0]["anopublicacao"] = "2000"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;$livro[1]["titulo"] = "Cinderela";&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt; $livro[1]["autor"] = "Maurício";&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt; $livro[1]["anopublicacao"] = "1980"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;O que o array acima esta fazendo, é criar uma "tabela" com seus índices e valores para cada "título"&lt;br /&gt;&lt;br /&gt;Imagine agora os dados digitados acima em uma tabela do word, que nas colunas contenha os títulos e valores:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;Título&lt;/span&gt;   &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;      &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;     &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;|          Autor     |      &lt;span style="color: rgb(51, 51, 153);"&gt;Ano Publicacao&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;Branca de...       &lt;/span&gt;       Mariana                       &lt;span style="color: rgb(51, 51, 153);"&gt;2000&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;Cinderela            &lt;/span&gt;  Maurício  &lt;span style="font-weight: bold;"&gt;   &lt;/span&gt;  &lt;span style="font-weight: bold;"&gt;     &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;      &lt;/span&gt;                 &lt;span style="color: rgb(51, 51, 153);"&gt;1980&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;É exatamente isso que estou fazendo ao criar o array.&lt;br /&gt;&lt;span style="color: rgb(255, 102, 0);font-family:arial;font-size:130%;"  &gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;ONDE E QUANDO USAR ARRAY?&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;O array é muito utilizado quando você deseja guardar em memória, valores diferentes em uma mesma variável.&lt;br /&gt;Essa função é muito utilizada em E-commerce, para inserir produtos em um carrinho de compras. Enquanto o usuário que navega o site nao finalizar a compra, todos os itens que ele solicitou ficam guardados em um array, até que na finalização da compra, o sistema passa todas as informações armazenadas do array para a base de dados.&lt;br /&gt;&lt;br /&gt;No exemplo do carrinho de compras, como queremos guardar os valores enquanto o usuário visita o site e mantê-los mesmo que ele acesse diferentes páginas do mesmo site, podemos criar variáveis de Sessão ($_SESSION) como arrays. Tá ai a dica.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 102, 0);font-family:arial;font-size:130%;"  &gt;&lt;span style="font-weight: bold;"&gt;FUNCÕES NATIVAS DO PHP PARA O USO DE ARRAY &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Existem algumas funções no PHP que nos auxilia no uso de array. Eu citarei as que eu acho mais importantes:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;count()&lt;/span&gt; —  Conta o número de índices de um array&lt;br /&gt;&lt;a href="http://www.php.net/manual/pt_BR/function.array-key-exists.php"&gt;array_key_exists&lt;/a&gt; — Checa se uma chave ou índice existe em um array&lt;br /&gt;&lt;a href="http://www.php.net/manual/pt_BR/function.array-keys.php"&gt;array_keys&lt;/a&gt; — Retorna todas as chaves de um array&lt;br /&gt;&lt;a href="http://www.php.net/manual/pt_BR/function.array-values.php"&gt;array_values&lt;/a&gt; — Retorna todos os valores de um array&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;print_r&lt;/span&gt; —  Retorna valores de uma variável&lt;br /&gt;&lt;a href="http://www.php.net/manual/pt_BR/function.array-search.php"&gt;array_search&lt;/a&gt; — Procura por um valor em um array e retorna sua chave correspondente caso seja encontrado&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/830298852164908263-5686961987057267679?l=devutils.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devutils.blogspot.com/feeds/5686961987057267679/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=830298852164908263&amp;postID=5686961987057267679' title='3 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/830298852164908263/posts/default/5686961987057267679'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/830298852164908263/posts/default/5686961987057267679'/><link rel='alternate' type='text/html' href='http://devutils.blogspot.com/2008/12/arrays-vetoresmatrizes-no-php.html' title='Arrays (Vetores/Matrizes) no PHP'/><author><name>Maurício Vinicius de O. Santos</name><uri>http://www.blogger.com/profile/10158075805974585222</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_l_YF-xHSDL4/STdFoMVcXEI/AAAAAAAAAAM/JXTfPHMPqmI/S220/ATgAAACOLsPwGjdpAa_SnOfdO8oYetUIkSOR5GaAc2aKfeEu6I4-M5gbzP0CnwnwwaDRa6r1hQ_cDneOBEkOgXyiYiANAJtU9VCdj81JzTyD8JjI5C1-yzkrumjLYA.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-830298852164908263.post-4713862895995890115</id><published>2008-12-05T11:35:00.000-08:00</published><updated>2008-12-07T07:32:53.710-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Delphi'/><title type='text'>Adeus StringGrid, Olá ClientDataSet</title><content type='html'>Muitas vezes que precisei armazenar dados em memória e tinha que mostrar esses dados em uma grid, utilizava o componente do Delphi chamado StringGrid, que armazena dados em forma de array e joga para a grid.&lt;br /&gt;&lt;br /&gt;Toda vez que eu tinha que fazer esse procedimento, já me dava uma preguiiiiiiça só de pensar q teria q montar a grid, de fazer os procedimentos para deletar itens, alterar, ou até mesmo para zebrar a stringgrid.&lt;br /&gt;&lt;br /&gt;O ClientDataSet é um componente muito poderoso e nos permite gravar dados em memória e usar um DataSource para interagir com meus componentes, como DBGrid ou qualquer outro que se utiliza de um DataSource para capturar os dados.&lt;br /&gt;Além disso, podemos gravar os dados em um arquivo XML para depois utilizar os dados registrados para outros fins. Ótimo não???!!!&lt;br /&gt;&lt;br /&gt;Então vamos a mão na massa.&lt;br /&gt;Arraste para seu formulário um ClientDataSet e um DataSource, ambos da paleta DataAccess.&lt;br /&gt;&lt;br /&gt;Clique duas vezes no ClientDataSet. Isso abrirá o FieldEditor.&lt;br /&gt;Clique com o botao direito do mouse nele e&lt;span style="font-weight: bold;"&gt; New Field&lt;/span&gt;(CTRL+N).&lt;br /&gt;em &lt;span style="font-weight: bold;"&gt;Name&lt;/span&gt;, digite: ID&lt;br /&gt;em &lt;span style="font-weight: bold;"&gt;Type&lt;/span&gt;, escolha a Opção &lt;span style="font-weight: bold; font-style: italic;"&gt;AutoIc&lt;/span&gt;.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_l_YF-xHSDL4/STmGUBMk_FI/AAAAAAAAAA4/-OaPrMYbrFo/s1600-h/cds-1.bmp"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 263px; height: 179px;" src="http://4.bp.blogspot.com/_l_YF-xHSDL4/STmGUBMk_FI/AAAAAAAAAA4/-OaPrMYbrFo/s320/cds-1.bmp" alt="" id="BLOGGER_PHOTO_ID_5276396116917943378" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Essa opção funciona como uma chave primária e nos volta um valor incrementado(AutoIncrement).&lt;br /&gt;&lt;br /&gt;em &lt;span style="font-weight: bold;"&gt;FieldType&lt;/span&gt;, marque a opção &lt;span style="font-weight: bold;"&gt;Data&lt;/span&gt;.&lt;br /&gt;Clique em OK.&lt;br /&gt;Nós faremos um exemplo bem simples, por isso, adicionaremos apenas mais 2 campos, chamados &lt;span style="font-weight: bold;"&gt;nome&lt;/span&gt; e &lt;span style="font-weight: bold;"&gt;enderec&lt;/span&gt;o.&lt;br /&gt;Faça o mesmo procedimento acima, apenas mudando a propriedade Name para nome e endereco e o Type desses 2 novos TFields para String e em Size, digite 50.&lt;br /&gt;&lt;br /&gt;O FieldsEditor ficará assim:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_l_YF-xHSDL4/STmGqYr2C3I/AAAAAAAAABA/wugOlQYGM2g/s1600-h/cds-2.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 103px; height: 133px;" src="http://3.bp.blogspot.com/_l_YF-xHSDL4/STmGqYr2C3I/AAAAAAAAABA/wugOlQYGM2g/s320/cds-2.jpg" alt="" id="BLOGGER_PHOTO_ID_5276396501180222322" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Clique com o botao direito no ClientDataSet e escolha a opção Create DataSet.&lt;br /&gt;&lt;br /&gt;Ligue a propriedade &lt;span style="font-weight: bold;"&gt;DataSet&lt;/span&gt; do DataSource1 ao ClientDataSet1.&lt;br /&gt;Arraste uma DBGRID e um DBNavigator ao formulário e ligue a propriedade &lt;span style="font-weight: bold;"&gt;DataSet&lt;/span&gt; dos 2 componentes ao DataSource1.&lt;br /&gt;Percebeu que os titulos da DBGrid já pegou o nome dos campos que você adicionou ao ClientDataSet?&lt;br /&gt;Legal né.&lt;br /&gt;No ClientDataSet1, marque a propriedade &lt;span style="font-weight: bold;"&gt;Active &lt;/span&gt;para TRUE e rode a aplicação.&lt;br /&gt;Veja como você manipula os dados pelo DBNavigator.&lt;br /&gt;Feche o programa e os dados não estarão mais la, pois o ClientDataSet gravou os dados em memória e assim que o aplicativo é encerrado, os dados são perdidos.&lt;br /&gt;Você pode usar o mesmo procedimento para componentes de terceiros como Jedi, RXLib, etc.&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 102, 0); font-weight: bold;font-family:arial;" &gt;GERANDO E REMOVENDO OS FIELDS EM EXECUÇÃO&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;É possível gerar os TFields em modo de execução.&lt;br /&gt;Sempre que adicionamos um novo campo em um ClientDataSet, o que estamos fazendo na realidade é adicionando um item a propriedade FieldDefs do ClientDataSet.&lt;br /&gt;Abra a propriedadede &lt;span style="font-weight: bold;"&gt;FieldDefs &lt;/span&gt;e note que todos os campos que acrescentamos como TField estarão lá com suas propriedades.&lt;br /&gt;E como geramos esses campos em modo de execução?&lt;br /&gt;Simples.&lt;br /&gt;Nós referenciamos os objetos pelo tipo do dados. Por exemplo:&lt;br /&gt;Para um campo String, teremos que criar um objeto proveniente da classe &lt;span style="font-weight: bold;"&gt;TStringField&lt;/span&gt;, para um Field do tipo Float, utilizamos a classe &lt;span style="font-weight: bold;"&gt;TFloatField &lt;/span&gt;e para um Field Auto Incremento, utilizamos a classe &lt;span style="font-weight: bold;"&gt;TAutoIncField&lt;/span&gt;.&lt;br /&gt;Criação de um TStringField:&lt;br /&gt;&lt;span id="ctl00_ContentPlaceHolder1_lblDicaDescricao"&gt;&lt;pre   style=";font-family:Verdana,Geneva,Arial,Helvetica,sans-serif;font-size:x-small;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;var&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Campo: TStringField;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;begin&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;with ClientDataSet1 do&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;begin&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;       with FieldDefs do&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;       begin&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;         Campo := TFloatField.Create(Self);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;         with Campo do&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;         begin&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;           FieldName := 'novoCampo';&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;           DisplayLabel := FieldName;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;           DataSet := cdsDemonstrativo;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;           Name := cdsDemonstrativo.Name+FieldName;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;           cdsDemonstrativo.FieldDefs.Add(Campo.Name, ftString, 1, False);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;         end;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;         Update;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;       end;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;end;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:georgia;font-size:100%;"  &gt;&lt;br /&gt;&lt;span style=";font-family:arial;font-size:130%;"  &gt;Como falei anteriormente, utilizamos FieldDefs para a criação do novo Field.&lt;br /&gt;&lt;br /&gt;Para liberar um TField da memória, podemos usar o seguinte código:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;  Campo :=TFloatField(Self.FindComponent('novocampo'));&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;  if Assigned(Campo) then&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;     Campo.Free;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=";font-family:verdana;font-size:130%;"  &gt;Qualquer dúvida, podem comentar que eu respondo.&lt;br /&gt;Abraços.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/830298852164908263-4713862895995890115?l=devutils.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devutils.blogspot.com/feeds/4713862895995890115/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=830298852164908263&amp;postID=4713862895995890115' title='3 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/830298852164908263/posts/default/4713862895995890115'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/830298852164908263/posts/default/4713862895995890115'/><link rel='alternate' type='text/html' href='http://devutils.blogspot.com/2008/12/adeus-stringgrid-ol-clientdataset.html' title='Adeus StringGrid, Olá ClientDataSet'/><author><name>Maurício Vinicius de O. Santos</name><uri>http://www.blogger.com/profile/10158075805974585222</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_l_YF-xHSDL4/STdFoMVcXEI/AAAAAAAAAAM/JXTfPHMPqmI/S220/ATgAAACOLsPwGjdpAa_SnOfdO8oYetUIkSOR5GaAc2aKfeEu6I4-M5gbzP0CnwnwwaDRa6r1hQ_cDneOBEkOgXyiYiANAJtU9VCdj81JzTyD8JjI5C1-yzkrumjLYA.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_l_YF-xHSDL4/STmGUBMk_FI/AAAAAAAAAA4/-OaPrMYbrFo/s72-c/cds-1.bmp' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-830298852164908263.post-1773120845657798827</id><published>2008-12-04T03:09:00.000-08:00</published><updated>2008-12-05T03:29:25.058-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Delphi'/><title type='text'>BOLETOS BANCÁRIOS COM DELPHI 6 AO 2007</title><content type='html'>Logo de manhã pela empresa, me foi pedido para adicionar ao sistema financeiro uma forma de enviar boletos bancários para os clientes assim que a conta com suas faturas fossem criadas.&lt;br /&gt;Eu já tinha criado boletos bancários via Web pelo PHP e pelo ASP.&lt;br /&gt;&lt;br /&gt;Pelo PHP, eu tinha as bibliotecas do PHP boleto f'ácil, pelo ASP eu criava os boletos seguindos os layouts dos bancos (móu trabalhão ferrado).&lt;br /&gt;A maravilha do Delphi, é que temos uma comunidade muito grande que cria componentes quase que diariamente :D .&lt;br /&gt;&lt;br /&gt;Eu testei dois componentes e que a maravilha dos dois, é que eles são openSource :D&lt;br /&gt;Os componentes são os seguintes:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 0, 0);"&gt;GBBoleto:&lt;/span&gt;&lt;br /&gt;http://sourceforge.net/projects/gbboleto/ &lt;span style="font-weight: bold;"&gt;(Delphi 5, 6 e 7)&lt;/span&gt;&lt;br /&gt;Bancos disponíveis:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;strong align="justify"&gt;Itaú&lt;/strong&gt;  &lt;/li&gt;&lt;li&gt;&lt;strong align="justify"&gt;NossaCaixa&lt;/strong&gt;  &lt;/li&gt;&lt;li&gt;&lt;strong align="justify"&gt;Banespa&lt;/strong&gt;  &lt;/li&gt;&lt;li&gt;&lt;strong align="justify"&gt;Unibanco&lt;/strong&gt;  &lt;/li&gt;&lt;li&gt;&lt;strong align="justify"&gt;Real&lt;/strong&gt;  &lt;/li&gt;&lt;li&gt;&lt;strong align="justify"&gt;Bradesco &lt;/strong&gt; &lt;/li&gt;&lt;li&gt;&lt;strong align="justify"&gt;Caixa Federal&lt;/strong&gt;  &lt;/li&gt;&lt;li&gt;&lt;strong&gt;Banco do Brasil&lt;/strong&gt;  &lt;/li&gt;&lt;li&gt;&lt;strong&gt;Santander&lt;/strong&gt;&lt;/li&gt;&lt;li style="font-weight: bold;"&gt;Banco de crédito nacional&lt;/li&gt;&lt;li style="font-weight: bold;"&gt;Sudameris&lt;/li&gt;&lt;li style="font-weight: bold;"&gt;Mercantil do Brasil&lt;/li&gt;&lt;li style="font-weight: bold;"&gt;Safra&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Sicredi&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 0, 0);"&gt;FreeBoleto:&lt;/span&gt;&lt;br /&gt;http://sourceforge.net/projects/freeboleto/ &lt;span style="font-weight: bold;"&gt;(Delphi 7 ao 2007)&lt;/span&gt;&lt;br /&gt;Bancos disponíveis:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;strong align="justify"&gt;Itaú&lt;/strong&gt;  &lt;/li&gt;&lt;li&gt;&lt;strong align="justify"&gt;NossaCaixa&lt;/strong&gt;  &lt;/li&gt;&lt;li&gt;&lt;strong align="justify"&gt;Banespa&lt;/strong&gt;  &lt;/li&gt;&lt;li&gt;&lt;strong align="justify"&gt;Unibanco&lt;/strong&gt;  &lt;/li&gt;&lt;li&gt;&lt;strong align="justify"&gt;Real&lt;/strong&gt;  &lt;/li&gt;&lt;li&gt;&lt;strong align="justify"&gt;Bradesco &lt;/strong&gt; &lt;/li&gt;&lt;li&gt;&lt;strong align="justify"&gt;Caixa Federal&lt;/strong&gt;  &lt;/li&gt;&lt;li&gt;&lt;strong&gt;Banco do Brasil&lt;/strong&gt;  &lt;/li&gt;&lt;li&gt;&lt;strong&gt;Santander&lt;/strong&gt; &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 102, 0); font-weight: bold;font-size:130%;" &gt;Instalando o FreeBoleto no Rad Studio 2007&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Para instalar o componente no RAD Studio 2007, basta clicar em File, Open e abra o arquivo FreeBoleto_D11.dproj.&lt;br /&gt;&lt;br /&gt;O Project Manager do Delphi ficará dessa forma:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_l_YF-xHSDL4/STe96U_zyvI/AAAAAAAAAAo/OcXNSStIcxc/s1600-h/pmfreeboleto.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 181px; height: 261px;" src="http://2.bp.blogspot.com/_l_YF-xHSDL4/STe96U_zyvI/AAAAAAAAAAo/OcXNSStIcxc/s320/pmfreeboleto.jpg" alt="" id="BLOGGER_PHOTO_ID_5275894298254232306" border="0" /&gt;&lt;/a&gt;Clique no &lt;span style="font-weight: bold;"&gt;FreeBoleto_D11.bpl&lt;/span&gt; com o botão direito do mouse, Build e depois clique em Install.&lt;br /&gt;Uma nova paleta chamada FreeBoleto é criada.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 102, 0); font-weight: bold;font-size:130%;" &gt;Entendendo como funciona o boleto bancário.&lt;br /&gt;&lt;/span&gt;Para criarmos boleto bancário, precisamos evidentemente possuir uma conta bancária em um dos bancos que o componente disponibiliza a geração do boleto.&lt;br /&gt;Abaixo estão alguns dados referente ao boleto bancário que você precisa conhecer:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(204, 0, 0);font-family:arial;font-size:85%;"  &gt;&lt;span style="font-weight: bold;"&gt;Código cedente: &lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:arial;font-size:85%;" class="content"  &gt;Este campo varia conforme o banco, mas em&lt;br /&gt;geral é composto pelo número da carteira, agência, conta e dígito, que dependendo&lt;br /&gt;do banco pode ser: agencia+conta ou mesmo carteira+agencia+conta, cada banco&lt;br /&gt;tem um padrão. Você precisa entrar em contato com o seu banco, e solicitar seu código cedente para geração de boleto.&lt;/span&gt;&lt;span style="font-style: italic;font-family:arial;font-size:85%;"  &gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 0, 0);"&gt;Cateira: &lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:arial;font-size:85%;" class="content"  &gt;Contem o código da carteira que está sendo utilizada. Isto também muda de banco&lt;br /&gt;para banco&lt;/span&gt;&lt;span style="font-style: italic;font-family:arial;font-size:85%;"  &gt;&lt;span style="color: rgb(204, 0, 0);font-family:arial;" &gt;&lt;/span&gt;&lt;span style="font-family:arial;"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 0, 0);"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="content"&gt;&lt;span style=";font-family:arial;font-size:85%;"  &gt;É justamente este campo que indica o tipo de cobrança escolhida pelo cedente.&lt;br /&gt;Por exemplo, no Unibanco a carteira sem registro é conhecida como "ESPECIAL"&lt;br /&gt;e a registrada como "REGISTRADA". Já no Itaú, a sem registro é conhecida como&lt;br /&gt;"174" ou "175" e a registrada como "109" e assim vai.&lt;br /&gt;Existem umas grandes variedades de modalidade de cobrança, para boletos cada&lt;br /&gt;uma tem uma finalidade, vantagens e desvantagens. Descrevi apenas as principais&lt;br /&gt;diferenças entre os dois tipos mais comuns, que atende a maioria dos usuários,&lt;br /&gt;temos mais detalhes sobre elas que não deu pra abordar neste artigo, mas o principal&lt;br /&gt;você já sabe.&lt;br /&gt;Se tiver maiores dúvidas, consulte seu banco, este sim poderá fornecer maiores&lt;br /&gt;detalhes sobre os tipos de cobrança. &lt;/span&gt;&lt;/span&gt;&lt;span style="font-style: italic;font-family:arial;font-size:85%;"  &gt;&lt;span style="color: rgb(204, 0, 0);font-family:arial;" &gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic;font-family:arial;font-size:85%;"  &gt;&lt;span style="font-weight: bold; color: rgb(204, 0, 0);"&gt;Nosso número:&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:arial;font-size:85%;" class="content"  &gt; Este campo também varia conforme o banco, mas você deve dar uma atenção especial à ele, porque quando o boleto é pago, é com esse número que aparece no seu extrato, assim você tem como identificar o boleto pago por um sistema administrador da sua conta fornecido pelo seu banco (Esse sistema gerenciador não é obrigatório).&lt;br /&gt;Você pode usar esse número para administrar seu sistema, como identificação de número da duplicata, número do boleto pago, ou algo dessa forma.&lt;br /&gt;Portanto esse número deve ser diferente para cada boleto emitido, e não podendo haver duplicidades.&lt;br /&gt;Alguns bancos fornecem uma faixa de números que o cliente pode trabalhar, outros já deixam a critério do cliente. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-family:arial;font-size:85%;"  &gt;&lt;span style="font-weight: bold; color: rgb(204, 0, 0);"&gt;Modalidade da conta: &lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:arial;font-size:85%;" class="content"  &gt;O banco tem varias modalidades de cobrança, e emissão de boletos. Vou descrever&lt;br /&gt;as duas principais e mais utilizadas e com as quais já trabalhei.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;u&gt;Cobrança Registrada&lt;/u&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Quando emitir seus boletos com cobrança registrada, você deve enviar um arquivo&lt;br /&gt;de remessa para o banco, este arquivo de remessa segue um padrão, que não vem&lt;br /&gt;ao caso agora, senão o artigo vai ficar enorme.&lt;br /&gt;&lt;br /&gt;Este arquivo de remessa que é enviado ao banco e serve para registrar os boletos&lt;br /&gt;emitidos. Assim, se algum sacado não pagar, o banco pode automaticamente ou&lt;br /&gt;por instrução do cedente, pode mandar o nome do sacado para protesto, ou mesmo&lt;br /&gt;o para o cadastro do spc.&lt;br /&gt;&lt;br /&gt;Ou seja, este tipo em geral é utilizado quando as empresas querem ter uma segurança&lt;br /&gt;maior, de modo que se o cliente não pagar eles tem um meio legal de protestar&lt;br /&gt;o sacado e cobrar a dívida.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;u&gt;Cobrança sem Registro&lt;/u&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Nessa cobrança você simplesmente emite o boleto e o envia para o sacado pagar&lt;br /&gt;e não há registro no banco sobre este boleto emitido, o banco só saberá da existência&lt;br /&gt;do boleto quando ele for pago.&lt;br /&gt;Esta é a cobrança mais indicada para uso na internet, porque se o cliente não&lt;br /&gt;pagar, simplesmente o pedido não é enviado.&lt;br /&gt;&lt;br /&gt;Agora que você já conhece os dois principais tipos de cobrança, vamos falar&lt;br /&gt;sobre o campo "carteira" do boleto. É justamente este campo que indica o tipo&lt;br /&gt;de cobrança escolhida pelo cedente.&lt;br /&gt;&lt;br /&gt;Por exemplo, no Unibanco a carteira sem registro é conhecida como "ESPECIAL"&lt;br /&gt;e a registrada como "REGISTRADA". Já no Itaú, a sem registro é conhecida como&lt;br /&gt;"174" ou "175" e a registrada como "109" e assim vai.&lt;br /&gt;&lt;br /&gt;Existem umas grandes variedades de modalidade de cobrança, para boletos cada&lt;br /&gt;uma tem uma finalidade, vantagens e desvantagens. Descrevi apenas as principais&lt;br /&gt;diferenças entre os dois tipos mais comuns, que atende a maioria dos usuários,&lt;br /&gt;temos mais detalhes sobre elas que não deu pra abordar neste artigo, mas o principal&lt;br /&gt;você já sabe.&lt;br /&gt;&lt;br /&gt;Se tiver maiores dúvidas, consulte seu banco, este sim poderá fornecer maiores&lt;br /&gt;detalhes sobre os tipos de cobrança. &lt;/span&gt;&lt;span style="font-style: italic;font-family:arial;font-size:85%;"  &gt;&lt;span style="font-weight: bold; color: rgb(204, 0, 0);"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 0, 0);"&gt;Convênio: &lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:arial;font-size:85%;"  &gt;&lt;span style="font-weight: bold; color: rgb(204, 0, 0);"&gt;&lt;/span&gt;&lt;span style="color: rgb(204, 0, 0);font-family:arial;" &gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Este campo serve apenas para o banco do brasil (pelo menos o que eu sei até agora).&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-style: italic;font-family:arial;font-size:85%;"  &gt;&lt;span style="font-weight: bold; color: rgb(204, 0, 0);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);font-family:arial;font-size:85%;"  &gt;Caso seu banco seja o B.B, entre em contato com sua agencia/gerente e obtenha mais informações.&lt;br /&gt;Como eu utilizo o Bradesco, não precisei utilizar este campo.&lt;/span&gt;&lt;span style="font-style: italic;font-family:arial;font-size:85%;"  &gt;&lt;span style="font-weight: bold; color: rgb(204, 0, 0);"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(204, 0, 0);"&gt;Documento:&lt;/span&gt;&lt;/span&gt; &lt;span style=";font-family:arial;font-size:85%;"  &gt;Você pode usar este campo para dizer qual documento/nota fiscal este boleto bancário pertence. Este campo não é obrigatório.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 102, 0); font-weight: bold;font-size:130%;" &gt;Criando o formulário e objetos para geração do boleto com o componente.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Você pode criar os objetos com as classes TFreeBoleto e TFreeBoletoImagem ou apenas arrastar os componentes que foram registrados na paleta FreeBoleto.&lt;br /&gt;&lt;br /&gt;No diretório do arquivo compactado que você efetuou o download, há um diretório chamado &lt;span style="font-weight: bold;"&gt;Demo&lt;/span&gt;.&lt;br /&gt;Abra o projeto e verifique os passos para a criação do boleto.&lt;br /&gt;O exemplo é bem simples.&lt;br /&gt;Em caso de dúvidas, há um grupo de discussões no yahoo do Freeboleto, que pode ser acessado pela URL:&lt;br /&gt;http://br.groups.yahoo.com/group/freeboleto&lt;br /&gt;&lt;br /&gt;Aqui esta "a cara" do boleto bancário utilizando o arquivo de demonstração do FreeBoleto:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_l_YF-xHSDL4/STgXZTrrI_I/AAAAAAAAAAw/GRvJDKoHjKY/s1600-h/boleto-final.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 320px; height: 250px;" src="http://3.bp.blogspot.com/_l_YF-xHSDL4/STgXZTrrI_I/AAAAAAAAAAw/GRvJDKoHjKY/s320/boleto-final.jpg" alt="" id="BLOGGER_PHOTO_ID_5275992687012160498" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Fmz pessoal?&lt;br /&gt;Abraços e até a proxima.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/830298852164908263-1773120845657798827?l=devutils.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devutils.blogspot.com/feeds/1773120845657798827/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=830298852164908263&amp;postID=1773120845657798827' title='7 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/830298852164908263/posts/default/1773120845657798827'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/830298852164908263/posts/default/1773120845657798827'/><link rel='alternate' type='text/html' href='http://devutils.blogspot.com/2008/12/boletos-bancrios-com-delphi-6-ao-2007.html' title='BOLETOS BANCÁRIOS COM DELPHI 6 AO 2007'/><author><name>Maurício Vinicius de O. Santos</name><uri>http://www.blogger.com/profile/10158075805974585222</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_l_YF-xHSDL4/STdFoMVcXEI/AAAAAAAAAAM/JXTfPHMPqmI/S220/ATgAAACOLsPwGjdpAa_SnOfdO8oYetUIkSOR5GaAc2aKfeEu6I4-M5gbzP0CnwnwwaDRa6r1hQ_cDneOBEkOgXyiYiANAJtU9VCdj81JzTyD8JjI5C1-yzkrumjLYA.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_l_YF-xHSDL4/STe96U_zyvI/AAAAAAAAAAo/OcXNSStIcxc/s72-c/pmfreeboleto.jpg' height='72' width='72'/><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-830298852164908263.post-8741565711396004881</id><published>2008-12-03T18:44:00.000-08:00</published><updated>2008-12-04T02:23:20.222-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Curiosidades'/><title type='text'>DIA DO PROGRAMADOR</title><content type='html'>&lt;div align="justify"&gt;Tá pensando que apenas médicos, veterinários e advogados tem seu dia?&lt;br /&gt;Também temos o nosso!!&lt;br /&gt;Não sei se foi por acaso, mas o dia do programador cai 3 dias após meu aniversário :P&lt;br /&gt;&lt;br /&gt;Peguei esse post no blog do Luciano pimenta, que também trabalha no nosso ramo e tem seu blog.&lt;br /&gt;&lt;br /&gt;" Se você ficou assustado ao ler o título, fique calmo e feliz, pois existe o nosso dia :). Claro que alguém lembraria daquele profissional, que nem sempre é entendido, muitos chamam de nerd, que usa óculos de grau elevado (nem todos) e que os assuntos sempre são voltados para tecnologias (também, nem todos), ou seja, nós programadores.&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;A definição do dia é a cara do programador ou seja o 256º dia do ano, o dia 13/Set ou 12/Set em anos bissextos. Saiba mais em: &lt;a href="http://pt.wikipedia.org/wiki/Dia_do_Programador"&gt;http://pt.wikipedia.org/wiki/Dia_do_Programador&lt;/a&gt;.&lt;br /&gt;No mesmo link temos como é comemorada a data pelos programadores americanos.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/830298852164908263-8741565711396004881?l=devutils.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devutils.blogspot.com/feeds/8741565711396004881/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=830298852164908263&amp;postID=8741565711396004881' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/830298852164908263/posts/default/8741565711396004881'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/830298852164908263/posts/default/8741565711396004881'/><link rel='alternate' type='text/html' href='http://devutils.blogspot.com/2008/12/dia-do-programador.html' title='DIA DO PROGRAMADOR'/><author><name>Maurício Vinicius de O. Santos</name><uri>http://www.blogger.com/profile/10158075805974585222</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_l_YF-xHSDL4/STdFoMVcXEI/AAAAAAAAAAM/JXTfPHMPqmI/S220/ATgAAACOLsPwGjdpAa_SnOfdO8oYetUIkSOR5GaAc2aKfeEu6I4-M5gbzP0CnwnwwaDRa6r1hQ_cDneOBEkOgXyiYiANAJtU9VCdj81JzTyD8JjI5C1-yzkrumjLYA.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-830298852164908263.post-4812234728387984149</id><published>2008-12-03T18:16:00.000-08:00</published><updated>2010-07-30T05:31:48.662-07:00</updated><title type='text'>INTRODUÇÃO AO BLOG</title><content type='html'>Meu nome é Maurício Vinicius, sou tecnologo em processamento de dados pela FATEC (Faculdade de tecnologia), trabalho como Analista desenvolvedor, possuo conhecimento em linguagens de programação e banco de dados e, comecei nesse ramo há 10 anos pelo Coldfusion ainda quando ele pertencia a Allaire.&lt;br /&gt;Resolvi criar esse blog para expôr todos problemas, resoluções e novidades que todo Analista/desenvolvedor se depara todos os dias.&lt;br /&gt;&lt;br /&gt;Tentarei passar meus conhecimentos e experiências da forma mais didática possível.&lt;br /&gt;Minha maior experiência e conhecimento são nas linguagens, SGBD, bibliotecas e ferramentas:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 0, 0);"&gt;Web:&lt;/span&gt;&lt;br /&gt;Coldfusion, PHP, ASP, ASP.NET, RAD STUDIO for .NET, EXTJS, JQUERY e CSS.&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 0, 0);"&gt;Win32:&lt;/span&gt;&lt;br /&gt;Delphi .&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 0, 0);"&gt;SGBD:&lt;/span&gt;&lt;br /&gt;MySql, POSTGRESQL, SQL SERVER e FIREBIRD&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 0, 0);"&gt;Análise:&lt;/span&gt;&lt;br /&gt;UML&lt;br /&gt;&lt;br /&gt;Já trabalhei nas seguintes empresas:&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);font-size:130%;" &gt;VE Provedor Internet - www.ve.com.br&lt;/span&gt;&lt;br /&gt;HAIDAR - Adm. de comércio Exterior - www.haidar.com.br&lt;br /&gt;KUHLMANN - Surveyors &amp;amp; Consultants - www.kuhlmann.com.br&lt;br /&gt;&lt;br /&gt;Volte sempre ao meu blog que tentarei efetuar posts todas as semanas.&lt;br /&gt;Abraços e até lá.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/830298852164908263-4812234728387984149?l=devutils.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devutils.blogspot.com/feeds/4812234728387984149/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=830298852164908263&amp;postID=4812234728387984149' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/830298852164908263/posts/default/4812234728387984149'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/830298852164908263/posts/default/4812234728387984149'/><link rel='alternate' type='text/html' href='http://devutils.blogspot.com/2008/12/introduo-do-blog.html' title='INTRODUÇÃO AO BLOG'/><author><name>Maurício Vinicius de O. Santos</name><uri>http://www.blogger.com/profile/10158075805974585222</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_l_YF-xHSDL4/STdFoMVcXEI/AAAAAAAAAAM/JXTfPHMPqmI/S220/ATgAAACOLsPwGjdpAa_SnOfdO8oYetUIkSOR5GaAc2aKfeEu6I4-M5gbzP0CnwnwwaDRa6r1hQ_cDneOBEkOgXyiYiANAJtU9VCdj81JzTyD8JjI5C1-yzkrumjLYA.jpg'/></author><thr:total>0</thr:total></entry></feed>
