<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Juliano Ribeiro &#187; SQL</title>
	<atom:link href="http://julianoribeiro.com.br/blog/category/desenvolvimento/sql/feed/" rel="self" type="application/rss+xml" />
	<link>http://julianoribeiro.com.br/blog</link>
	<description>Development and Design</description>
	<lastBuildDate>Tue, 31 Jan 2012 11:40:50 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Meu TCC &#8211; SOS</title>
		<link>http://julianoribeiro.com.br/blog/meu-tcc-sos/</link>
		<comments>http://julianoribeiro.com.br/blog/meu-tcc-sos/#comments</comments>
		<pubDate>Wed, 01 Dec 2010 11:23:23 +0000</pubDate>
		<dc:creator>Juliano Ribeiro</dc:creator>
				<category><![CDATA[Faculdade]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://julianoribeiro.com.br/blog/?p=449</guid>
		<description><![CDATA[Na minha graduação eu criei um controle (extremamente simples) para ordens de serviço (Sistema de Ordens de Serviço, dai a sigla). Embora eu sempre enxerguei como sendo meu último trabalho acadêmico a maioria dos meus professores vislumbraram que deveria ser o grande trabalho da minha vida. Ledo engano. Bom, fui aprovado, portanto não deve ter [...]]]></description>
			<content:encoded><![CDATA[<p>Na minha graduação eu criei um controle (extremamente simples) para ordens de serviço (Sistema de Ordens de Serviço, dai a sigla).</p>
<p><a href="http://julianoribeiro.com.br/blog/wp-content/uploads/2010/12/logo.jpg"><img class="aligncenter size-full wp-image-455" title="logoSOS" src="http://julianoribeiro.com.br/blog/wp-content/uploads/2010/12/logo.jpg" alt="" width="271" height="90" /></a></p>
<p>Embora eu sempre enxerguei como sendo meu último trabalho acadêmico a maioria dos meus professores vislumbraram que deveria ser o grande trabalho da minha vida. Ledo engano. Bom, fui aprovado, portanto não deve ter ficado tão ruim, principalmente porque apliquei nele diversas práticas que aprendi dentro e fora da instituição e se hoje fosse faze-lo novamente, estou certo de que escreveria uns 30% menos códigos, no mínimo.</p>
<p>De qualquer forma, eu compactei e coloco aqui como anexo. Podem baixar à vontade, só peço que, caso o utilizem de alguma forma como auxílio no seu trabalho, me citem de alguma forma como referência.</p>
<p style="text-align: center;"><a title="Projeto Completo" href="http://julianoribeiro.com.br/troca/SOS.rar">Projeto Completo</a></p>
<p>A documentação eu acrescento um outro dia.</p>
]]></content:encoded>
			<wfw:commentRss>http://julianoribeiro.com.br/blog/meu-tcc-sos/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Padrão Builder com Delphi</title>
		<link>http://julianoribeiro.com.br/blog/padrao-builder-com-delphi/</link>
		<comments>http://julianoribeiro.com.br/blog/padrao-builder-com-delphi/#comments</comments>
		<pubDate>Wed, 06 Oct 2010 18:58:36 +0000</pubDate>
		<dc:creator>Juliano Ribeiro</dc:creator>
				<category><![CDATA[Delphi]]></category>
		<category><![CDATA[Orientação à Objetos]]></category>
		<category><![CDATA[Pessoal]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[Builder]]></category>
		<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[Orientação à Objeto]]></category>
		<category><![CDATA[Padrão de Projetos]]></category>
		<category><![CDATA[POO]]></category>
		<category><![CDATA[Programação]]></category>

		<guid isPermaLink="false">http://julianoribeiro.com.br/blog/?p=431</guid>
		<description><![CDATA[Voltando a falar de programação, hoje vamos continuar a falar da orientação à objetos dentro do Delphi. Apesar de estar estudando Java já tem algum tempo, eu trabalho com Delphi desde de sua versão 2.0, então fica bem difícil não querer aplicar tudo o que aprendi sobre o assunto na linguagem que tenho mais afinidade. [...]]]></description>
			<content:encoded><![CDATA[<p>Voltando a falar de programação, hoje vamos continuar a falar da orientação à objetos dentro do Delphi. Apesar de estar estudando Java já tem algum tempo, eu trabalho com Delphi desde de sua versão 2.0, então fica bem difícil não querer aplicar tudo o que aprendi sobre o assunto na linguagem que tenho mais afinidade.<br />
<span id="more-431"></span><br />
O padrão de projeto <strong>Builder</strong>, nada mais é que um construtor especializado, que executa determinadas ações sempre que precisa construir um novo objeto. Vamos imaginar, por exemplo, que você criou em sua classe de serviços, um método <strong>getItemById</strong>, que tem como parâmetro óbvio o <strong>ID</strong> e retorna um objeto da classe referenciada. Digamos que seria um código semelhante à esse:</p>
<pre class="brush: delphi;">
function TServicoMinhaClasse.getMinhaClasseById(Id: Integer): TMinhaClasse;
var
   cls: TMinhaClasse;
begin
   cls := TMinhaClasse.Create;
   Result := cls;
end;
</pre>
<p>Esse seria um código legal, se a classe não tivesse atributos. Para piorar esses dados ficam guardados em banco de dados. Portanto, eu preciso criar a conexão (ou usar uma existente) e criar uma nova consulta ao banco, configurando o banco. Para o nosso exemplo, vamos imaginar que a MinhaClasse tenha código e descrição somente. O código da unit da classe ficaria como o abaixo:</p>
<pre class="brush: delphi;">
unit unMinhaClasse;

interface

type
   TMinhaClasse = class(TObject)

   private
      FDescricao: String;
      FID: Integer;
      procedure SetID(const Value: Integer);
      procedure SetDescricao(const Value: String);
   public
      property ID: Integer read FID write SetID;
      property Descricao: String read FDescricao write SetDescricao;
   end;

implementation

{ TMinhaClasse }

procedure TMinhaClasse.SetID(const Value: Integer);
begin
  FID := Value;
end;

procedure TMinhaClasse.SetDescricao(const Value: String);
begin
  FDescricao := Value;
end;

end.
</pre>
<p>Assim, para preencher essas propriedades, vamos modificar o corpo da nossa função para algo assim:</p>
<pre class="brush: delphi;">
(...)
var
   qry: TSQLQuery;
begin
   cls := TMinhaClasse.Create;

   qry := TSQLQuery.Create;

   try
      qry.Database    := dModule.Database;
      qry.Transaction := dModule.Transaction;
      qry.SQL.Add('select * from tabela where id = :id');
      qry.ParamByName('id').AsInteger := Id;
      qry.Open;

      if not qry.IsEmpty then
      begin
         cls.ID        := qry.FieldByName('id').AsInteger;
         cls.Descricao := qry.FieldByName('descricao').AsString;
      end
      else
      begin
         cls := nil;
      end;
   finally
      qry.Free;
   end;

   Result := cls;
end;</pre>
<p>Ok, ficou bom, mas imagine a longo prazo. Para cada uma das vezes que eu precisar da classe, eu teria de criar uma nova instância de SQLQuery e configura-la. Isso pode (e quase sempre vai) me induzir a errar em algum momento, na hora que eu esquecer de passar algum parâmetro ou mesmo validar se o banco está conectado. Para evitar todos esses problemas, criaremos um Builder, que para nós será simplesmente um construtor melhor para nossa SQLQuery.</p>
<p>Esse construtor vai ser instanciado dentro do objeto de serviço que  e será vinculado à esse. Assim, todas as querys serão filhas desse objeto e serão destruídas quando esse for. Nesse builder vou precisar de duas propriedades: BancoDeDados e Transação. Assim, no construtor desse meu builder eu já as preencho e garanto que todos as querys ali criadas saem já configuradas como deve ser.</p>
<p>Desse jeito, a classe builder fica assim:</p>
<pre class="brush: delphi;">
unit unQueryBuilder;

interface

uses
  SysUtils, Classes, SqlExpr, DBXpress;

type
   TQueryBuilder = class(TObject)
   private
      FTransacao: TTransactionDesc;
      FBancoDeDados: TSQLConnection;
      procedure SetBancoDeDados(const Value: TSQLConnection);
      procedure SetTransacao(const Value: TTransactionDesc);
   public
      property BancoDeDados: TSQLConnection read FBancoDeDados write SetBancoDeDados;
      property Transacao: TTransactionDesc read FTransacao write SetTransacao;
      function NovaInstancia(Dono: TComponent): TSQLQuery;
      constructor Create(Base: TSQLConnection; Trans: TTransactionDesc);
   end;

implementation

{ TQueryBuilder }

constructor TQueryBuilder.Create(Base: TSQLConnection; Trans: TTransactionDesc);
begin
   Self.BancoDeDados := Base;
   Self.Transacao := Trans;
end;

function TQueryBuilder.NovaInstancia(Dono: TComponent): TSQLQuery;
var
   pdsNovo: TSQLQuery;
begin
   pdsNovo := TSQLQuery.Create(Dono);
   pdsNovo.Database    := Self.BancoDeDados;
   pdsNovo.Transaction := Self.Transacao;
   Result := pdsNovo;
end;

procedure TQueryBuilder.SetBancoDeDados(const Value: TSQLConnection);
begin
   FBancoDeDados := Value;
end;

procedure TQueryBuilder.SetTransacao(const Value: TTransactionDesc);
begin
   FTransacao := Value;
end;

end.</pre>
<p>Assim, toda vez que instanciar o novo serviço, devemos criar uma variável (ou propriedade) que armazene esse objeto Builder, mais ou menos assim:</p>
<pre class="brush: delphi;">   FabricaQuery := TQueryFactory.Create(Base, Trans);</pre>
<p>Refatorando a chamada da função, teremos isso:</p>
<pre class="brush: delphi;">
function TServicoMinhaClasse.getMinhaClasseById(Id: Integer): TMinhaClasse;
var
   qry: TSQLQuery;
   cls: TMinhaClasse;
begin
   qry := FabricaQuery.NovaInstancia(nil);

   try
      qry.SQL.Add('select * from tabela where id = :id');
      qry.ParamByName('id').AsInteger := Id;
      qry.Open;

      if not qry.IsEmpty then
      begin
         cls.ID        := qry.FieldByName('id').AsInteger;
         cls.Descricao := qry.FieldByName('descricao').AsString;
      end
      else
      begin
         cls := nil;
      end;
   finally
      qry.Free;
   end;

   result := cls;
end;</pre>
<p>Talvez ainda tenha muito mais a melhorar, mas já está melhor do que inicial. Embora, aparentemente, o ganho tenha sido pouco, a vantagem desse padrão só seria sentida se não o utilizássemos. As propriedades poderiam ser preenchidas incorretamente e mais validações poderiam deixar de ser executadas. Dá para aprimorar muito mais. Mas eu vou até aqui, o resto deixo com vocês.</p>
<blockquote><p>Pessoal, esse código pode gerar alguns erros. Ele foi originalmente escrito para a empresa que trabalho e por isso, muito do que era usado aqui foi substituído por componentes genéricos.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://julianoribeiro.com.br/blog/padrao-builder-com-delphi/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Criando listas com PHP/MySQL &#8211; Paginação</title>
		<link>http://julianoribeiro.com.br/blog/criando-listas-com-phpmysql-paginacao/</link>
		<comments>http://julianoribeiro.com.br/blog/criando-listas-com-phpmysql-paginacao/#comments</comments>
		<pubDate>Sun, 12 Sep 2010 00:24:48 +0000</pubDate>
		<dc:creator>Juliano Ribeiro</dc:creator>
				<category><![CDATA[Artigos]]></category>
		<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Funções]]></category>
		<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://julianoribeiro.com.br/blog/?p=383</guid>
		<description><![CDATA[Olá amiguinhos. Depois de colocar uma listagem bem simples, buscando os dados do banco e montando numa tabela, eu vou colocar o resto da implementação, bem como os arquivos do projeto. Nesse post vamos criar a lista, pagina, postando para uma página de tratamento fictícia. Vamos usar um pouco de Javascript e CSS, mas não [...]]]></description>
			<content:encoded><![CDATA[<p>Olá amiguinhos.</p>
<p>Depois de colocar uma <a href="http://julianoribeiro.com.br/blog/criando-listas-com-phpmysql/">listagem bem simples</a>, buscando os dados do banco e montando numa tabela, eu vou colocar o resto da implementação, bem como os arquivos do projeto. </p>
<p>Nesse post vamos criar a lista, pagina, postando para uma página de tratamento fictícia. Vamos usar um pouco de <strong>Javascript</strong> e <strong>CSS</strong>, mas não é obrigatório, é só para dar alguma elegância ao projeto.</p>
<p>Como eu fiz esse artigo meio que de encomenda para um amigo, que não queria usar <strong>Ajax</strong>, eu não isso aqui. Portanto pense nisso antes das críticas <img src='http://julianoribeiro.com.br/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> .<br />
<span id="more-383"></span><br />
Bom, vamos ao código. Para fazer a chamada eu criei um arquivo chamado <strong>lstEstado.php</strong>. Nesse arquivo, vou colocar a chamada, e um tratamento para que o controle da página seja feito por aqui (o que seria dispensável se usássemos Ajax).</p>
<pre class="brush: php;">
&lt;?php
	// Arquivo de listagem lstEstado.php. 

	// Arquivo de conexão, faça como achar melhor
	include_once('conexao.php'); 

	// Arquivo que irá conter a função CriarLista
	include('funcoes.php');

	// Controle para o caso da variável $pg vir vazia
	// na primeira chamada da lista pelo menu
	if (!isset($_GET['pg'])) {
		$pg = 1;
	} else {
		$pg = $_GET['pg'];
	}

	// A chamada da função. Parâmetros:
	// 1 - o nome da tabela no banco
	// 2 - a quantidade de linhas que serão exibidas por páginas
	// 3 - a página que se deseja exibir
	// 4 - o arquivo que trata a postagem da lista
	// 5 - o arquivo da listagem (para paginar)
	CriarLista('estado', 7, $pg, 'req.php', 'lstEstado.php');
?&gt;
</pre>
<p>Assim a chamada para o arquivo de listagem seria somente isso. Você poderia ter dois times de programação, um que usa as funções e outro que as desenvolve. No futuro eu oriento isso à objetos, para ficar mais interessante ainda.</p>
<p>No arquivo funções, eu vou ter dois blocos. O do Javascript e o do PHP propriamente dito. O bloco do Javascript, ao menos no meu arquivo, vai primeiro, mas aqui eu vou colocar depois por questões didáticas. Esse arquivo eu colocar ele inteiro aqui, mas com vários cortes para os meus comentários.</p>
<pre class="brush: php;">
&lt;?php
	include_once('conexao.php');

	// Criação da função...
	function CriarLista($tabela, $itemsPorPagina, $paginaAtual, $tratamento, $URL_Lista) {

		$sql = &quot;select count(*) total from &quot;.$tabela;
		$res = mysql_query($sql);
		$lin = mysql_fetch_assoc($res);
		$totalCidades = $lin['total'];
</pre>
<p>Nesse bloquinho acima, fizemos uma consulta ao banco para saber quantos registros eu tenho. Isso vai ser muito útil na hora de calcular a quantidade de páginas que teremos (dividindo esse total pela variável <strong><em>$itemsPorPagina</em></strong>).</p>
<p>No meio do código eu vou colocando imagens, que serão usadas para navegar nas páginas da listagem. Perceba que nessas eu uso a mesma <em><strong>$URL_Lista</strong></em> que recebi como parâmetro, acrescentando o parâmetro <strong>pg</strong>.</p>
<pre class="brush: php;">
		echo &quot;&lt;a class=\&quot;botao\&quot; href=\&quot;{$URL_Lista}?pg=1\&quot; title=\&quot;Primeira página\&quot;&gt;&lt;img src=\&quot;navega/first.png\&quot;&gt;&lt;/a&gt;&quot;;

		if ($paginaAtual == 1) {
			echo &quot;&lt;img src=\&quot;navega/stop.png\&quot; /&gt;&quot;;
		} else {
			echo &quot;&lt;a class=\&quot;botao\&quot; href=\&quot;{$URL_Lista}?pg=&quot;.($paginaAtual - 1).&quot;\&quot; title=\&quot;Página anterior\&quot;&gt;&lt;img src=\&quot;navega/previous.png\&quot;&gt;&lt;/a&gt;&quot;;
		}
</pre>
<p>Esse bloco acima, da condição da primeira página, bem como o do botão <strong>próximo</strong>, tem essa tratamento de condição somente para não deixar vazio o espaço desses botões e evitar problemas de consistência, como por exemplo, na primeira página existir um link para a página anterior que obviamente daria erro.</p>
<p>No bloco abaixo eu monto uma caixa de seleção com uma <strong><em>Option</em></strong> para cada página que pode existir, somente controlando a quantidade de itens que podem caber numa página. Caso a página atual seja o <strong>$i</strong> da vez naquele laço, o programa já o marca como selecionado.</p>
<p>Aproveitando que a última posição, que fica na variável $controle, guarda o número da última página, eu a coloco no último link do nosso navegadorzinho. Segue o código:</p>
<pre class="brush: php;">
		echo &quot; &lt;select id=\&quot;comboPagina\&quot; onchange=\&quot;javascript:window.location='{$URL_Lista}?pg='+(this.value)\&quot;&gt;&quot;;

		for ($i = 1; $i &lt;= $totalCidades; $i = $i + $itemsPorPagina) {
			$controle++;
			$selecionado = &quot;&quot;;

			if ($paginaAtual == $controle) {
				$selecionado = &quot; selected &quot;;
			}

			echo &quot;&lt;option {$selecionado}&gt;&quot;.$controle.&quot;&lt;/option&gt;&quot;;
		}
		echo &quot;&lt;/select&gt;&quot;;

		if ($paginaAtual == $controle) {
			echo &quot;&lt;img src=\&quot;navega/stop.png\&quot; /&gt;&quot;;
		} else {
			echo &quot;&lt;a class=\&quot;botao\&quot; href=\&quot;{$URL_Lista}?pg=&quot;.($paginaAtual + 1).&quot;\&quot; title=\&quot;Próxima página\&quot;&gt;&lt;img src=\&quot;navega/next.png\&quot; /&gt;&lt;/a&gt;&quot;;
		}

		echo &quot;&lt;a class=\&quot;botao\&quot; href=\&quot;{$URL_Lista}?pg=&quot;.($controle).&quot;\&quot; title=\&quot;Última página\&quot;&gt;&lt;img src=\&quot;navega/last.png\&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&quot;;
</pre>
<p>O código abaixo é muito semelhante ao que colocamos na semana passada. Nele, como já foi explicado, nós pegamos os dados da tabela citada no parâmetro. Com esses dados preenchemos um array, <strong>$estrutura</strong>, com os valores que essa consulta retorna (Field, Type, Collation, Null, Key, Default, Extra Privileges e Comment). Quando encontrar algum campo que na variável <strong>Key</strong> tenha o valor <em>&#8216;PRI&#8217;</em> (Chave primária), ele o reserva na variável <strong><em>$campoChave</em></strong> (Tá, eu sei, só funciona para tabelas com uma chave única, simples, nunca composta, mas deixo isso para vocês resolverem).</p>
<p>No meio desse bloco já vou acrescentando os <strong>echos</strong> que vou precisar para a correta exibição do resultado. Acho que as tags falam por si.</p>
<pre class="brush: php;">
		// *** Listagem *** //

		$sql = 'SHOW FULL COLUMNS FROM ' . $tabela;
		$res = mysql_query($sql);
		$sql = 'select ';
		$estrutura = array();
		$pos = 1;

		echo &quot;
			&lt;form action='{$tratamento}' method='post' id='frm1'&gt;
				&lt;input type='hidden' name='acao' id='acao' value='' /&gt;
				&lt;input type='hidden' name='opcao' id='opcao' value='' /&gt;
				&lt;table border='1'&gt;
					&lt;tr&gt;&quot;;

		while ($lin = mysql_fetch_assoc($res)) {
			echo &quot;&lt;th&gt;&quot;.$lin['Comment'].&quot;&lt;/th&gt;&quot;;
			$estrutura[$pos++] = $lin;
			$sql .= $lin['Field'] . ', ';

			if ($lin['Key'] == 'PRI') {
				$campoChave = $lin['Field'];
			}
		}
		echo &quot;&lt;/tr&gt;&quot;;
</pre>
<p>Já que estava no laço que passava pelos nomes dos campos, já aproveitei e criei o início da tabela, com a linha que terá os &lt;th&gt;.</p>
<p>Veja que a variável $sql começou a ser preenchida com os nomes dos campos no bloco acima. Nesse ponto do código ela já deve estar mais ou menos assim: </p>
<p>SELECT CAMPO1, CAMPO2, CAMPOn, </p>
<p>Nosso próximo passo é tirar a vírgula que sobrou no final, acrescentar a tabela, juntamente com a limitação de páginas e mandar isso pro banco. A seguir eu preencho os dados da table, com o resultado do que veio da consulta que montamos. Para cada um daqueles campos, nós o colocamos dentro de uma tag &lt;TD&gt; para a correta exibição na tela.</p>
<pre class="brush: php;">
		$sql = substr($sql, 0, strlen($sql) - 2);
		$sql .= &quot; from &quot;. $tabela ;
		$sql .= &quot; limit &quot;.(($paginaAtual - 1) * $itemsPorPagina).&quot;, &quot;.$itemsPorPagina;
		$res = mysql_query($sql);

		while ($lin = mysql_fetch_assoc($res)) {
			echo &quot;&lt;tr onMouseOver=\&quot;javascript:Sel('&quot;.$lin[$campoChave].&quot;')\&quot; &gt;&quot;;
			foreach ($estrutura as $campo) {
				echo &quot;&lt;td&gt;&quot;.$lin[$campo['Field']].&quot;&lt;/td&gt;&quot;;
			}
			echo &quot;&lt;td&gt;&quot;;
			echo &quot;&lt;input type='button' value='altera' onclick=\&quot;javascript:Posta('alterar')\&quot; /&gt;&quot;;
			echo &quot;&lt;input type='button' value='excluir' onclick=\&quot;javascript:Posta('excluir')\&quot; /&gt;&quot;;
			echo &quot;&lt;/td&gt;&quot;;
			echo &quot;&lt;/tr&gt;&quot;;
		}
		echo &quot;&lt;/table&gt;&lt;/form&gt;&quot;;
	}
?&gt;
</pre>
<p>Você prestou atenção, reparou que eu coloquei uma pitadinha de Javascript dentro da nossa tabela.</p>
<pre class="brush: php;">
	// Pitada número 1
	echo &quot;&lt;tr onMouseOver=\&quot;javascript:Sel('&quot;.$lin[$campoChave].&quot;')\&quot; &gt;&quot;;

	// (...)
	// Essa função vai setar um campo oculto do campo chamado &quot;opcao&quot; para o valor do ID daquela linha
	function Sel(id) {
		document.getElementById('opcao').value = id;
	}
</pre>
<p>Ficou claro, o código acima faz o truque de ao mover o mouse por sobre uma determinada linha da tabela, seja setado o valor do ID daquela pro campo oculto opcao.</p>
<p>E para que isso serve? Serve para o código a seguir, que envia o formulário todo que está envolta da tabela toda, envie os dados para o nosso arquivo de postagem.</p>
<pre class="brush: php;">
	// Pitada número 1
	echo &quot;&lt;input type='button' value='altera' onclick=\&quot;javascript:Posta('alterar')\&quot; /&gt;&quot;;
	echo &quot;&lt;input type='button' value='excluir' onclick=\&quot;javascript:Posta('excluir')\&quot; /&gt;&quot;;

	// (...)
	function Posta(acao) {
		document.getElementById('acao').value = acao;
		document.getElementById('frm1').submit();
	}
</pre>
<p>E isso gera o resultado que vocês mesmos podem verificar ao implementar o código acima. </p>
<p>Conclusão</p>
<p>A finalidade desse código é facilitar aos programadores para não terem que nunca mais voltar a programar um administrador (simples) para pequenos sites. Baseado nos conceitos apresentados aqui, o exemplo pode ser muito ampliado para um ponto tal de que até mesmo os formulários sejam feitos por funções prontas, e até mesmo o arquivo de tratamento dos formulários seja feitos de maneira automática. O limite é a habilidade do programador (e a sua preguiça). Qualquer dúvida podem me procurar no <a href="http://twitter.com/JulianoRibeiro">Twitter</a> ou mandem um <a href="mailto:contato@julianoribeiro.com.br">e-mail</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://julianoribeiro.com.br/blog/criando-listas-com-phpmysql-paginacao/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Criando listas com PHP/MySQL</title>
		<link>http://julianoribeiro.com.br/blog/criando-listas-com-phpmysql/</link>
		<comments>http://julianoribeiro.com.br/blog/criando-listas-com-phpmysql/#comments</comments>
		<pubDate>Tue, 31 Aug 2010 01:51:45 +0000</pubDate>
		<dc:creator>Juliano Ribeiro</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Pessoal]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[Função]]></category>
		<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://julianoribeiro.com.br/blog/?p=362</guid>
		<description><![CDATA[Hoje resolvi variar um pouco. Como estou ajudando um amigo no seu TCC, escrevi para ele uma função bem legal, pelo menos eu achei, depois me falem o que acharam. Eu vou colocar ela aqui em duas etapas. Nessa primeira, vamos criar uma lista, somente passando uma tabela do banco. A assinatura da função vai [...]]]></description>
			<content:encoded><![CDATA[<p>Hoje resolvi variar um pouco. Como estou ajudando um amigo no seu TCC, escrevi para ele uma função bem legal, pelo menos eu achei, depois me falem o que acharam. Eu vou colocar ela aqui em duas etapas. Nessa primeira, vamos criar uma lista, somente passando uma tabela do banco. A assinatura da função vai ficar mais ou menos assim:</p>
<pre class="brush: php;">
&lt;?php
	include_once('conexao.php');
	include('funcoes.php');

	CriarLista('Estado');
?&gt;
</pre>
<p>A conexão é bem simples, faça como quiser.<br />
Já a função, baseia-se na instrução SQL: <strong>SHOW FULL COLUMNS FROM TB_CLIENTE</strong>. Essa instrução retorna uma lista com os campos: <em>Field, Type, Collation, Null, Key, Default, Extra Privileges e Comment</em>. Para nós, nesse momento só interessam Field e Comment. Explico. Pegaremos os campos que retornam nessa SQL e com eles, comporemos a nova SQL com os campos que a primeira retornou, ficou claro?<br />
Nos comments da tabela em questão, eu coloquei a descrição dos campos, tipo o campo <strong>EST_CODIGO</strong> tem o comentário <strong>&#8220;Código&#8221;</strong>.<br />
<span id="more-362"></span><br />
Para usar, eu fiz o trechinho de código abaixo:</p>
<pre class="brush: php;">
		$sql = 'SHOW FULL COLUMNS FROM ' . $tabela; // Crio a string
		$res = mysql_query($sql); // Envia a string para o banco e guarda o retorno
		$sql = 'select '; // Crio a nova SQL
		$estrutura = array(); // Inicializo o array
		$pos = 1; // Inicializa 1ª posição

		echo &quot;&lt;table border='1'&gt;
				&lt;tr&gt;&quot;; // Monta o início da tabela

		while ($lin = mysql_fetch_assoc($res)) {
			echo &quot;&lt;td&gt;&quot;.$lin['Comment'].&quot;&lt;/td&gt;&quot;;
			$estrutura[$pos++] = $lin;
			$sql .= $lin['Field'] . ', ';
		}
		echo &quot;&lt;/tr&gt;&quot;;
		$sql = substr($sql, 0, strlen($sql) - 2);
		$sql .= &quot; from &quot;. $tabela ;
</pre>
<p>Com esse código ai conseguimos compor uma nova SQL, algo como <em>Select EST_CODIGO, EST_NOME from ESTADO</em>. Assim, poderemos fazer a nova consulta como deve ser. Além disso, todo o resultado daquele <em><strong>resource</strong></em> fica armazenado em um array chamado <strong>estrutura</strong>, para consulta posterior.<br />
Com esses dados em mãos, vamos simplesmente fazer a nova consulta no banco e trazer os dados para dentro da tabela. Veja como fica esse trecho:</p>
<pre class="brush: php;">
		$res = mysql_query($sql);
		while ($lin = mysql_fetch_assoc($res)) {
			echo &quot;&lt;tr&gt;&quot;;
			foreach ($estrutura as $campo) {
				echo &quot;&lt;td&gt;&quot;.$lin[$campo['Field']].&quot;&lt;/td&gt;&quot;;
			}
			echo &quot;&lt;/tr&gt;&quot;;
		}
		echo &quot;&lt;/table&gt;&quot;;
</pre>
<p>e assim funciona, e no próximo post eu coloco o arquivo para download e também como paginar o resultado dessa função.</p>
<p>Até mais</p>
]]></content:encoded>
			<wfw:commentRss>http://julianoribeiro.com.br/blog/criando-listas-com-phpmysql/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Executando scripts via Delphi</title>
		<link>http://julianoribeiro.com.br/blog/executando-scripts-via-delphi/</link>
		<comments>http://julianoribeiro.com.br/blog/executando-scripts-via-delphi/#comments</comments>
		<pubDate>Thu, 26 Aug 2010 14:24:09 +0000</pubDate>
		<dc:creator>Juliano Ribeiro</dc:creator>
				<category><![CDATA[Delphi]]></category>
		<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[ErrorCode]]></category>
		<category><![CDATA[Interbase]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[TMemo]]></category>
		<category><![CDATA[TSQLConnection]]></category>

		<guid isPermaLink="false">http://julianoribeiro.com.br/blog/?p=325</guid>
		<description><![CDATA[Já me ocorreu necessidade de rodar alguns scripts simples, para dar manutenção em clientes. A procedure abaixo coleta o conteúdo de um TMemo e envia para banco executar. Qualquer ErrorCode maior que zero indica que houve uma mensagem de retorno negativa. Infelizmente não tenho essa tabela de códigos disponível. procedure TForm1.ExecutaScript; var ErrorCode: Integer; begin [...]]]></description>
			<content:encoded><![CDATA[<p>Já me ocorreu necessidade de rodar alguns <strong>scripts </strong>simples, para dar manutenção em clientes. A <strong>procedure </strong>abaixo coleta o conteúdo de um <strong>TMemo </strong>e envia para banco executar. Qualquer <strong>ErrorCode </strong>maior que zero indica que houve uma mensagem de retorno negativa. Infelizmente não tenho essa tabela de códigos disponível.</p>
<pre class="brush: delphi;">
procedure TForm1.ExecutaScript;
var
  ErrorCode: Integer;
begin
   try
      ErrorCode := Conexao.ExecuteDirect(MemoSQL.Text);
      // Conexao é um TSQLConnection já conectado ao banco.

      if ErrorCode = 0 then
          ShowMessage('Script rodado com sucesso');

      {Se retornar diferente de &quot;0&quot; é porque algo de errado aconteceu}
      if ErrorCode &lt;&gt; 0 then
         raise Exception.Create( 'Error: code = ' + IntToStr( ErrorCode ) )

   except
      on E: Exception do
         ShowMessage( E.Message );
   end
end;
</pre>
<p>Só testei em <strong>Oracle</strong>, mas não vejo motivos para não rodar em <strong>Interbase</strong>.</p>
]]></content:encoded>
			<wfw:commentRss>http://julianoribeiro.com.br/blog/executando-scripts-via-delphi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Oficina de SQL</title>
		<link>http://julianoribeiro.com.br/blog/oficina-de-sql/</link>
		<comments>http://julianoribeiro.com.br/blog/oficina-de-sql/#comments</comments>
		<pubDate>Mon, 10 Aug 2009 11:16:03 +0000</pubDate>
		<dc:creator>Juliano Ribeiro</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[Oficina]]></category>
		<category><![CDATA[Produtec]]></category>
		<category><![CDATA[Treinamento]]></category>

		<guid isPermaLink="false">http://julianoribeiro.com.br/blog/?p=259</guid>
		<description><![CDATA[Tem alguns dias já, realizamos na Produtec uma oficina sobre SQL. A nossa equipe é bastante jovem, então valeu a pena rever alguns conceitos básicos aplicáveis à base de dados de nosso maior produto, o Maximum (ERP). Abaixo seguem os slides. Qualquer dúvida podem perguntar que eu esclareço. Talvez fique um pouco descontextualizado, porque os [...]]]></description>
			<content:encoded><![CDATA[<p>Tem alguns dias já, realizamos na <a href="http://www.produtec.com.br">Produtec</a> uma oficina sobre SQL. A nossa equipe é bastante jovem, então valeu a pena rever alguns conceitos básicos aplicáveis à base de dados de nosso maior produto, o Maximum (ERP).</p>
<p>Abaixo seguem os slides. Qualquer dúvida podem perguntar que eu esclareço.</p>
<p><iframe height="335" width="450" name="Treinamento-SQL-ppt" style="border:1px solid #AABBCC" scrolling="no" src="http://show.zoho.com/embed?id=559650000000005001" frameBorder="0"></iframe></p>
<p>Talvez fique um pouco descontextualizado, porque os slides não são nada sem a narração, mas como me pediram, ai está.</p>
]]></content:encoded>
			<wfw:commentRss>http://julianoribeiro.com.br/blog/oficina-de-sql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

