Sunday, April 17, 2011

MySQL : Menambah bulan / hari / tahun dengan fungsi DATE_ADD

Hari ini lagi bikin script PHP ketemu masalah ketika ingin menambahkan bulan pada field bertype DATE. Misalnya jika ada data 2010-12-01 maka saya harus bisa menambahkan bulannya tanpa menggangu tanggal-nya dan tahun akan otomatis berubah jika penambahan bulan tsb melebihi Desember.

Cari di Google plus nanya ke master MySQL (Mr.Furqon), dapet deh caranya.. dengan menggunakan fungsi  DATE_ADD. Syntax-nya begini :

 
DATE_ADD(date,INTERVAL expr type)

Contohnya begini :

 SELECT DATE_ADD(tgl_jtempo, INTERVAL 1 MONTH) AS tgl_jtempo2;
> 2010-12-25

SELECT DATE_ADD(tgl_jtempo, INTERVAL -1 MONTH) AS tgl_jtempo2;
> 2010-10-25


Simpel kan? Oya perintah parameter INTERVAL -nya juga bisa flexibel, kita juga bisa menambahkan hari, tahun, jam, menit, detik.

 mysql> SELECT "1997-12-31 23:59:59" + INTERVAL 1 SECOND;
-> 1998-01-01 00:00:00

mysql> SELECT INTERVAL 1 DAY + "1997-12-31";
-> 1998-01-01

mysql> SELECT "1998-01-01" - INTERVAL 1 SECOND;
-> 1997-12-31 23:59:59

mysql> SELECT DATE_ADD("1997-12-31 23:59:59", INTERVAL 1 SECOND);
-> 1998-01-01 00:00:00

mysql> SELECT DATE_ADD("1997-12-31 23:59:59", INTERVAL 1 DAY);
-> 1998-01-01 23:59:59

mysql> SELECT DATE_ADD("1997-12-31 23:59:59", INTERVAL "1:1" MINUTE_SECOND);
-> 1998-01-01 00:01:00

mysql> SELECT DATE_SUB("1998-01-01 00:00:00", INTERVAL "1 1:1:1" DAY_SECOND);
-> 1997-12-30 22:58:59

mysql> SELECT DATE_ADD("1998-01-01 00:00:00", INTERVAL "-1 10" DAY_HOUR);
-> 1997-12-30 14:00:00

mysql> SELECT DATE_SUB("1998-01-02", INTERVAL 31 DAY);
-> 1997-12-02

mysql> SELECT EXTRACT(YEAR FROM "1999-07-02");
-> 1999

mysql> SELECT EXTRACT(YEAR_MONTH FROM "1999-07-02 01:02:03");
-> 199907

mysql> SELECT EXTRACT(DAY_MINUTE FROM "1999-07-02 01:02:03");
-> 20102 


type Value Expected expr format
SECOND SECONDS
MINUTE MINUTES
HOUR HOURS
DAY DAYS
MONTH MONTHS
YEAR YEARS
MINUTE_SECOND "MINUTES:SECONDS"
HOUR_MINUTE "HOURS:MINUTES"
DAY_HOUR "DAYS_HOURS"
YEAR_MONTH "YEARS-MONTHS"
HOUR_SECOND "HOURS:MINUTES:SECONDS"
DAY_MINUTE "DAYS HOURS:MINUTES"
DAY_SECOND "DAYS HOURS:MINUTES:SECONDS"

Saturday, April 16, 2011

Upload Foto ke Facebook dari Windows Explorer dengan Easy Photo Uploader

Salah satu cara untuk meng-upload foto dengan cepat tanpa harus login ke Facebook adalah dengan menggunakan Easy Photo Uploader. Aplikasi ini terintegrasi dengan shell context menu Windows Explorer sehingga Anda hanya perlu klik kanan pada foto yang akan anda upload kemudian klik "Send your photo(s) to Facebook" dari context menu.. 


Aplikasi ini secara otomatis akan menghubungkan account Facebook anda dan memungkinkan anda untuk meng-upload foto ke album yang sudah ada atau membuat album baru.





Download Easy Photo Uploader for Facebook disini

Delphi 7 : Memanfaatkan ItemIndex dalam seleksi Case-Of

Semester baru, mata kuliah baru. Dan kali ini saya mengambil matkul Delphi 7. Well, sebenarnya saya sudah pernah pake Delphi sekitar 9 tahun yang lalu, enak sih pake bahasa Pascal, tapi karena pada masa itu GUI Delphi sangat jelek dan VB6 lebih menggiurkan, so i had to say goodbye to Delphi. And now i have to learn it from the scratch :-)

Oke, mockup latihan serta rule yang diberikan dosen sangat simpel seperti ini :

Oke source code-nya serta bentuk form-nya di Delphi seperti ini :



unit Latihan3;

interface

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

type
  TForm1 = class(TForm)
    GroupBox1: TGroupBox;
    GroupBox2: TGroupBox;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    txtNama: TEdit;
    txtGapok: TEdit;
    txtTunjJab: TEdit;
    GroupBox3: TGroupBox;
    Label6: TLabel;
    Label7: TLabel;
    txtPPH: TEdit;
    txtTotal: TEdit;
    btnHitung: TButton;
    btnEnd: TButton;
    txtGolongan: TEdit;
    txtJabatan: TEdit;
    procedure btnHitungClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btnHitungClick(Sender: TObject);
var
  gapok, tunj, pph, total : real;

begin
   IF UPPERCASE(txtJabatan.Text) = 'STAFF' THEN
      begin
        if UPPERCASE(txtGolongan.Text) = 'A' then
            begin
              gapok := 1000000;
              tunj  := 700000;
            end
        else
        if UPPERCASE(txtGolongan.Text) = 'B' then
            begin
              gapok := 1300000;
              tunj  := 900000;
            end
        else
        if UPPERCASE(txtGolongan.Text) = 'C' then
            begin
              gapok := 1600000;
              tunj  := 1200000;
            end
        else
            begin
              gapok := 2000000;
              tunj  := 1500000;
            end;
      end
   ELSE
   if UPPERCASE(txtJabatan.Text) = 'MANAGER' then
      begin
        if UPPERCASE(txtGolongan.Text) = 'A' then
            begin
              gapok := 2500000;
              tunj  := 1700000;
            end
        else
        if UPPERCASE(txtGolongan.Text) = 'B' then
            begin
              gapok := 3000000;
              tunj  := 1900000;
            end
        else
        if UPPERCASE(txtGolongan.Text) = 'C' then
            begin
              gapok := 3500000;
              tunj  := 2000000;
            end
        else
            begin
              gapok := 4000000;
              tunj  := 3000000;
            end;
      end;
      total := gapok + tunj;
      pph := 0.05 * total;
      txtgapok.Text := floattostr(gapok);
      txttunjjab.Text := floattostr(tunj);
      txtpph.Text := floattostr(pph);
      txttotal.Text := floattostr(total-pph);
    end;
end.

Dari code beserta form diatas, kita bisa melihat beberapa kondisi IF-THEN yang tidak optimized dan UI yang rentan akan kesalahan entry. Misalnya bagaimana jika user memasukkan Jabatan selain Staff & Manager, atau Golongan selain A, B, C, D.

Dengan sedikit modifikasi, kita bisa memanfaatkan komponen RadioGroup untuk  meminimalisir kesalahan user :



Source code-nya :

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    GroupBox1: TGroupBox;
    GroupBox2: TGroupBox;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    rgGolongan: TRadioGroup;
    rgJabatan: TRadioGroup;
    txtNama: TEdit;
    txtGapok: TEdit;
    txtTunj: TEdit;
    GroupBox3: TGroupBox;
    Label4: TLabel;
    txtPPH: TEdit;
    Label5: TLabel;
    txtTotal: TEdit;
    btnClose: TButton;
    procedure btnCloseClick(Sender: TObject);
    procedure rgGolonganClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btnCloseClick(Sender: TObject);
begin
  close;
end;

procedure TForm1.rgGolonganClick(Sender: TObject);
var
    gapok, tunj, pph, total : real;
begin
    IF rgjabatan.ItemIndex = 0 THEN
    begin
        case rggolongan.ItemIndex of
        0 : begin
              gapok := 1000000;
              tunj  := 700000;
            end;
        1 : begin
              gapok := 1300000;
              tunj  := 900000;
            end;
        2 : begin
              gapok := 1600000;
              tunj  := 1200000;
            end;
        3 : begin
              gapok := 2000000;
              tunj  := 1500000;
            end;
        end;
    end
    ELSE
    begin
        case rggolongan.ItemIndex of
        0 : begin
              gapok := 2500000;
              tunj  := 1700000;
            end;
        1 : begin
              gapok := 3000000;
              tunj  := 1900000;
            end;
        2 : begin
              gapok := 3500000;
              tunj  := 2000000;
            end;
        3 : begin
              gapok := 4000000;
              tunj  := 3000000;
            end;
        end;
    end;
    
    total := gapok + tunj;
    pph   := 0.05 * total;
    txtgapok.Text := formatcurr('###,###',gapok);
    txttunj.Text  := formatcurr('###,###',tunj);
    txtpph.Text   := formatcurr('###,###',pph);
    txttotal.Text := formatcurr('###,###',total-pph);

end;

end.

Untuk code diatas, saya mengganti IF-THEN dengan CASE-OF yang lebih simpel dan mudah dipahami. Karena limitasi CASE-OF di Delphi hanya mengenal integer, kita bisa memanfaatkan ItemIndex dari control RadioGroup (rgGolongan)

Oya, kita perlu mengaitkan event rgGolonganClick ke rgJabatan.OnClick supaya melakukan prosedur yang sama ketika di-klik dan Form1.OnActivate supaya pada saat pertama kali aplikasi load, perhitungan akan dilakukan.


See? Ternyata Delphi tidak sulit. Thanks to Eko Wahyudiharto for the help :-)

---