Criando listas com PHP/MySQL

Aug 30
2010

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:

<?php
	include_once('conexao.php');
	include('funcoes.php');

	CriarLista('Estado');
?>

A conexão é bem simples, faça como quiser.
Já a função, baseia-se na instrução SQL: SHOW FULL COLUMNS FROM TB_CLIENTE. Essa instrução retorna uma lista com os campos: Field, Type, Collation, Null, Key, Default, Extra Privileges e Comment. 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?
Nos comments da tabela em questão, eu coloquei a descrição dos campos, tipo o campo EST_CODIGO tem o comentário “Código”.
Read the rest of this entry »

Orientação à Objetos em Delphi (Parte 1 e 1/2)

Aug 27
2010

Apesar do povo no twitter querer me massacrar quando digo que o Delphi é uma linguagem (muito boa por sinal), há muito que ele não trata mais de Pascal com uma IDE bonitinha. Mas como eu respondi lá, isso é uma questão comercial, que pouco me importa, afinal, não ganho ou perco um centavo com isso. Quanto a linguagem ser boa, não há dúvidas, com ela eu construi minha casa, estou pagando o carro, os meus treinamentos, a educação do meu filho…

Piadas à parte, vamos ao ponto, no último post que eu tratei sobre o assunto (Orientação à Objetos) a coisa ficou meio descontextualizada, principalmente por se tratar de uma palestra que fiz aqui na Produtec. Assim, vou tentar simplificar um pouco mais o conceito, sem necessariamente entrar na conversa com o banco.
Primeiro vamos imaginar um problema. Alguém lhe fez a solicitação:

Criar uma classe Lampada, que tenha como ser ligada, desligada e possa me responder seu atual estado (ON/OFF). Essa pessoa lhe solicitou também um formulário que interagisse com essa classe, acessando os seus métodos.

Então vejamos, temos uma classe mais ou menos como a desenhada abaixo:


Como vemos, teremos então a classe Lampada, que possuirá um atributo privado chamado acesa do tipo boleano e três métodos públicos bastante simples; ligarLampada() muda o atributo acesa para true, desligarLampada() seta o atributo para false e isLampadaLigada() que retorna o estado do atributo. Até aqui bem simples.
Para a implementação eu vou herdar de TControl, por enquanto isso será suficiente, afinal não quero ter que implementar as coisas mais básicas na mão, como a criação do componente e tal. Isso fica mais ou menos assim:

unit uLampada;

interface

uses Controls;

type
  TLampada = class(TControl)
  private
      Facesa: Boolean;
      procedure Setacesa(const Value: Boolean);
      property acesa: Boolean read Facesa write Setacesa;
  public
      procedure LigarLampada;
      procedure DesligarLampada;
      function isLampadaLigada: Boolean;
  end;

implementation

{ TLampada }

procedure TLampada.DesligarLampada;
begin
   acesa := False;
end;

function TLampada.isLampadaLigada: Boolean;
begin
   Result := acesa;
end;

procedure TLampada.LigarLampada;
begin
   acesa := True;
end;

procedure TLampada.Setacesa(const Value: Boolean);
begin
   Facesa := Value;
end;

end.

Percebam aqui algumas particularidades do Delphi. Pra começar, os métodos tem um “tipo”. Métodos que necessitam retornar valores são declarados como function e os que não precisam retornar valor, portanto são somente procedimentos, são assim chamados procedure. Ambos podem receber parâmetros, mas no nosso exemplo não tivemos necessidade. A única diferença é mesmo o retorno.

Para declarar a propriedade acesa, eu simplesmente digitei property acesa:boolean; e pressionei o atalho Ctrl+Shift+C. Isso nos leva a outro ponto legal de destacar que é o encapsulamento. Veja como ficou o código:

  private
      Facesa: Boolean;
      procedure Setacesa(const Value: Boolean);
      property acesa: Boolean read Facesa write Setacesa;

Assim, na prática, o valor será gravado em Facesa (o “F” é padrão do Delphi, não pergunte). Como se percebe ele completou a linha com as cláusulas read e write, determinado assim o Getter e o Setter da propriedade acesa. Portanto quando uma chamada um outro objeto acessar a propriedade acesa, a classe irá ler o valor da variável Facesa e na hora de atribuir o valor, o procedimento Setacesa(const Value: Boolean);.

A cláusula const antes do parâmetro indica que o mesmo não pode ser alterado no corpo do procedimento. Ele pode ser atribuído normalmente na chamada.

Com o procedimento SetAcesa podemos colocar quaisquer tratamentos que se fizerem necessários. Mas isso é assunto para outro post.

Para a aplicação rodar como pedido, devemos criar um formulário que interaja com um objeto da classe criada. Vou não criar muita firula aqui, serão apenas 3 botões, Ligar, Desligar e Status.

Aqui fica mais clara ainda a simplicidade desse sistema. Basta criar uma instância da classe TLampada e fazer com que os botões acessem os seus métodos. Veja como ficou simples.

unit uInterruptor;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, uLampada;

type
  TfrmInterruptor = class(TForm)
    btnLigar: TButton;
    btnDesligar: TButton;
    btnStatus: TButton;
    procedure btnStatusClick(Sender: TObject);
    procedure btnDesligarClick(Sender: TObject);
    procedure btnLigarClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    MinhaLampada: TLampada;
  public
  end;

var
  frmInterruptor: TfrmInterruptor;

implementation

{$R *.dfm}

procedure TfrmInterruptor.btnDesligarClick(Sender: TObject);
begin
   MinhaLampada.DesligarLampada;
end;

procedure TfrmInterruptor.btnLigarClick(Sender: TObject);
begin
   MinhaLampada.LigarLampada;
end;

procedure TfrmInterruptor.btnStatusClick(Sender: TObject);
var
   cMsg: String;
begin
   cMsg := 'A lâmpada ';

   if not MinhaLampada.isLampadaLigada then
      cMsg := cMsg + 'não ';

   cMsg := cMsg + 'está ligada.';
   ShowMessage(cMsg);
end;

procedure TfrmInterruptor.FormCreate(Sender: TObject);
begin
   MinhaLampada := TLampada.Create(Self);
end;

end.

A única dica é criar a MinhaLampada na criação do formulário. Não preciso me preocupar com dispor dela, pois ela foi criada “afiliada” ao form, portanto quando um for para o vinagre o outro vai junto.

Bom pessoal, agora que desaceleramos e começamos de maneira mais básica acho que consegui isolar um pouco mais os conceitos. Acredito que todos entendem que temos uma classe TLampada, com atributos privados, com métodos públicos que nos permitem controlar a lâmpada. Esclarecemos também que o que se manipula posteriormente é a instancia, o objeto MinhaLampada, não a classe. E podemos ter quantas instancias da Lampada criadas dentro da nossa aplicação.

No próximo post sobre o assunto vamos criar um serviço que controle a “energia” do exemplo. Até lá.

Executando scripts via Delphi

Aug 26
2010

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
   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 "0" é porque algo de errado aconteceu}
      if ErrorCode <> 0 then
         raise Exception.Create( 'Error: code = ' + IntToStr( ErrorCode ) )

   except
      on E: Exception do
         ShowMessage( E.Message );
   end
end;

Só testei em Oracle, mas não vejo motivos para não rodar em Interbase.

Porque não programamos em casa?

Aug 23
2010

Tratando mensagem MaskEdit

Aug 18
2010

Aconteceu de eu precisar tratar uma mensagem no TMaskEdit e minha memória idosa não se lembrar de como fazê-lo. Para que isso não ocorra mais e caso alguém tenha a mesma dúvida, deixo aqui registrada a solução.

Hoje, o componente em questão, estava com a máscara ‘!00:00:00;1;_’ o que obriga o que as posições marcadas pelo 0 sejam preenchidas. Por mais bobo que seja, basta trocar o 0 por 9 e fazer o tratamento no evento que mais lhe convier, no meu caso no OnExit do mesmo, como se segue:
Read the rest of this entry »

Delphi orientado à objetos – parte 1

Jul 27
2010

Já tem um bom tempo que programo com Delphi. E sempre ouvi críticas pesadíssimas sobre o quanto a linguagem é ruim. Eu sempre acreditei que existiram sempre programadores ruins e que os programas saiam ruins, o que gerou essa impressão negativa, bem como os vários problemas que a Borland (fabricante do Delphi, agora CodeGear) impôs nas mudanças de versão. Assim, resolvi desmistificar essa coisa de que é impossível programar orientado à objetos usando o Delphi.

Segue o material do nosso último treinamento, sobre como usar o Delphi, orientado à objetos.
Embora pareça que estamos trabalhando com OO desde sempre, afinal instanciamos objetos baseados em classes, isso não é inteiramente verdade.
Como me disse um professor certa vez: “Seu sistema é orientado à objetos? Ótimo. Me mostre a sua classe NotaFiscalSaída.”

Assim achei por bem usar um exemplo bem simples, estados e cidades para mostrar o poder que o Delphi tem e de quebra demonstrar que o que está errada é a maneira como programamos e não a linguagem que usamos, seja ela qual for.
Read the rest of this entry »

Novo Site W3Tutor

Aug 13
2009
Site W3Tutor

Site W3Tutor

Já está no ar desde o EDTED de Curitiba (06/06), o novo site da Agência W3Tutor.

O site foi criado com a estrutura adequada para mostrar os trabalhos realizados pelo nossa intrépida trupe. Visite e conheça um pouco sobre nós e sobre as nossas realizações.

[Delphi] Relógio usando Canvas

Aug 10
2009

Segue um exemplo usado no Dojo de 06/08/2009, aqui na Produtec.

Não houve tempo de concluí-lo, mas os conceitos básicos estão presentes. No código abaixo, tem somente o corpo básico, mais o ponteiro dos segundos. Fiquem à vontade para concluí-lo.

Para que o exemplo funcione, basta criar um form com ClientHeight e ClientWidth de no mínimo 300 e neste colocar um Timer com parâmetros padrões.

procedure TForm1.Timer1Timer(Sender: TObject);
const
   LARGURA = 300;
var
   XFinal, YFinal: Integer;
   Hora, Minuto, Segundo, MiliSegundo: Word;
   Angulo: Integer;
begin
   Refresh;
   Caption := TimeToStr(Time);  

   // Disco do Relógio
   Canvas.Pen.Width := 1;  

   Canvas.Brush.Color := clWhite;
   Canvas.Brush.Style := bsSolid;
   Canvas.Ellipse(0, 0, LARGURA, LARGURA);  

   // Ponteiros
   Canvas.Pen.Style := psSolid;
   Canvas.Pen.Width := 3;
   Canvas.Pen.Color := clBlack;  

   Canvas.MoveTo(LARGURA div 2, LARGURA div 2);  

   DecodeTime(Time, Hora, Minuto, Segundo, Milisegundo);  

   XFinal := (LARGURA div 2) + Trunc(Sin(DegToRad(180 - Segundo * 6)) * (LARGURA div 2));
   YFinal := (LARGURA div 2) + Trunc(Cos(DegToRad(180 - Segundo * 6)) * (LARGURA div 2));  

   Canvas.LineTo(XFinal, YFinal);  

end;

Dúvidas, coloquem a seguir.

Oficina de SQL

Aug 10
2009

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 slides não são nada sem a narração, mas como me pediram, ai está.

Dez idéias para motivar sua equipe sem gastar dinheiro

May 29
2009

Geralmente, temos três cenários quando o fim do ano se aproxima: a empresa que está muito bem, vendeu muito, cresceu, ganhou e fidelizou clientes; a empresa que está mais ou menos, perdeu alguns clientes, ganhou um pouco, mas vendeu o suficiente para pagar as contas, não conseguindo grandes lucros; e a empresa que foi mal, cujos clientes foram comprar da concorrência e o lucro é apenas uma hipótese pouco provável.

A verdade é que todas as empresas, não importa em que cenário se encaixam, precisam motivar seus vendedores para o final do ano. Para algumas, esse é um período de altos volumes de vendas – isso geralmente acontece com o varejo – e, para outras, é um período de poucos negócios.
Porém, mesmo que você esteja ganhando muito dinheiro no início deste ano, que esteja programando uma comemoração regada a champagne francês, você certamente vai adorar motivar sua equipe gastando pouco.

Existem muitas coisas que podem ser feitas sem nenhum – ou quase nenhum – dinheiro para estimular a equipe. Vejamos dez idéias diferentes que podem ser, agora mesmo, facilmente colocadas em prática em sua empresa:
Read the rest of this entry »

Arquivo

Categorias