10 Juli 2009

Mau Beli Laptop Tanpa Garansi Resmi?

Indonesia mempunyai pasar yang cukup besar untuk urusan laptop. Banyak produk berbagai macam merk yang di impor masuk ke Indonesia. Karena ada saudara yang minta saran tentang membeli laptop yang cocok, oleh sebab itu aku mulai mencari referensi sebanyak mungkin tentang laptop dan sebagainya. Bukan soal merk atau spesifikasi laptop yang menjadi alasan dari saudara yang meminta bantuan padaku, tapi masalah banyaknya laptop tanpa garansi resmi yang cukup banyak beredar di pasaran.
Ada istilah laptop BM (Black Market) yang berarti laptop tersebut di impor tanpa mengikuti aturan impor yang semestinya, seperti aturan perpajakan, bea masuk, dan lain-lain. Dengan demikian laptop BM bisa lebih murah daripada laptop yang memiliki garansi resmi. Ada lagi istilah PI (Parallel Import) yang berarti laptop tidak di impor oleh badan/toko/perorangan yang tidak ditunjuk sebagai agen atau distributor resmi untuk produk yang bersangkutan.
Dengan demikian berarti laptop BM/PI pasti lebih murah dibanding laptop yang mempunyai garansi resmi. Dengan alasan ini pula yang membuat banyak pembeli tertarik untuk membeli laptop yang tanpa garansi resmi. Menguntungkan bagi pembeli dan juga penjual. Mengapa laptop BM.PI bisa lebih murah? Jelas karena tidak membayar pajak bea cukai. Selain itu pengimpor barang juga tidak perlu mendirikan jaringan service center yang luas, karena anggapan mereka kalau ada kerusakan, mereka perbaiki sendiri, atau kalau sulit diperbaiki, dikembalikan ke negara asalnya. Konsumen menunggu lama? Itulah resikonya kalau membeli barang tanpa garansi resmi.
Ada lagi istilah laptop refurbished, artinya adalah produk yang tidak memenuhi standar kualitas pabrik atau cacat produksi yang terlanjur keluar dipasaran, kemudian dikembalikan ke pabrik. Oleh pabrik tersebut diperbaiki dan bahkan di bentuk ulang bila ada cacat fisiknya. Kemudian laptop tersebut dijual lagi di pasaran dengan harga murah. Di luar negeri, produk semacam ini akan dibeli label “Refurbished” dan dijual dengan harga diskon besar, bahkan bisa mencapai 30%. Di Amerika produk refurbished dibeli label jelas dan tidak boleh dijual sebagai barang yang baru, sekalipun kelihatan baru dan ada segel dari pabrik, karena laptop refurbished bisa ada goresan, kotoran, dan bentuk kerusakan fisik lain yang tidak mempengaruhi performa.
Bagaimana membedakan laptop PI/BM/refurbished dan yang bergaransi resmi? Mudah saja, cek kartu garansinya. Tanyakan kartu garansinya ke penjual. Cek kartu garansinya, apakah dikeluarkan oleh distributor resmi atau tidak. Nomor telepon service centernya pasti tercantum disana, hubungi bila perlu. Beberapa produsen saat ini juga menyediakan registrasi serial number, registrasikan bila memang produsen menyediakan fasilitas tersebut.
Laptop dengan garansi resmi akan diterima di service center di semua kota, bahkan di seluruh dunia. Ada pengalaman teman saya yang membeli laptop Toshiba di luar negeri, ternyata baterainya rusak, kemudian dibawa ke service center di Surabaya dan baterai diganti baru dengan hanya membayar biaya administrasi. Ada pengalaman orang lain yang membeli laptop Toshiba yang tanpa garansi resmi, ketika dia pindah ke kota lain, dan dibawa ke service center, disana dikatakan bahwa barang itu barang bekas! Dengan kenyataan ini dipikirkan dulu apa kita mau membeli laptop yang tanpa garansi resmi, atau kalau tetap mau nekat juga Anda sudah tahu resikonya.

Baca selengkapnya...

07 Juli 2009

Menjalankan File dan Menunggu Sampai Ditutup

Menggunakan fungsi ShellExecuteEx mempunyai keuntungan dibanding dengan fungsi ShellExecute. Jika kita menjalankan aplikasi eksternal dari aplikasi kita dan ingin menunggu sampai aplikasi yang dijalankan ditutup baru bisa kembali ke aplikasi kita, bisa dengan menggunakan fungsi ShellExecuteEx. Kuncinya terletak pada parameter fMask. Jika flag SEE_MASK_NOCLOSEPROCESS aktif, maka saat file dijalankan parameter hProcess akan berisi handle pada file tersebut. Handle tersebut bisa digunakan untuk mengetahui apakah file yang dijalankan tersebut sudah ditutup. Supaya lebih jelas diberikan contoh program seperti dibawah ini.
var
  SEInfo: TShellExecuteInfo;
  ExitCode: DWORD;
begin
  FillChar(SEInfo, SizeOf(SEInfo), 0);
  with SEInfo do
  begin
    cbSize := SizeOf(TShellExecuteInfo);
    fMask := SEE_MASK_NOCLOSEPROCESS;
    lpVerb := PChar('open');
    lpFile := PChar('notepad.exe');
    nShow := SW_SHOWNORMAL;
  end;
  if ShellExecuteEx(@SEInfo) then
  begin
    repeat
      GetExitCodeProcess(SEInfo.hProcess, ExitCode);
    until ExitCode <> STILL_ACTIVE;
  end;
end.

Baca selengkapnya...

06 Juli 2009

Fungsi Windows API: ShellExecuteEx

Fungsi ShellExecuteEx mempunyai kegunaan yang mirip dengan fungsi ShellExecute yang disediakan Windows. Untuk menggunakan fungsi ini, tambahkan unit ShellAPI pada form yang bersangkutan. Fungsi ShellExecuteEx hanya mempunyai satu parameter yang berupa pointer ke suatu record dan mengembalikan nilai dengan tipe boolean, True jika sukses atau False jika gagal. Sintaknya bisa kita lihat dibawah ini.
function ShellExecuteEx(lpExecInfo: PShellExecuteInfo): BOOL;

Parameter pada fungsi diatas di deklarasikan sebagai berikut.
type
  PShellExecuteInfo = ^TShellExecuteInfo;
  TShellExecuteInfo = record
    cbSize: DWORD;
    fMask: ULONG;
    Wnd: HWND;
    lpVerb: PWideChar;
    lpFile: PWideChar;
    lpParameters: PWideChar;
    lpDirectory: PWideChar;
    nShow: Integer;
    hInstApp: HINST;
    lpIDList: Pointer;
    lpClass: PWideChar;
    hkeyClass: HKEY;
    dwHotKey: DWORD;
    hIcon: THandle;
    hProcess: THandle;
  end;

Deskripsi dari parameter diatas adalah sebagai berikut.
  1. cbSize. Merupakan ukuran struktur dalam byte.
  2. fMask. Flag yang menunjukkan isi dan validitas dari anggota struktur yang lain. Bisa merupakan kombinasi dari konstanta berikut.
    • SEE_MASK_CLASSNAME
    • SEE_MASK_CLASSKEY
    • SEE_MASK_IDLIST
    • SEE_MASK_INVOKEIDLIST
    • SEE_MASK_ICON
    • SEE_MASK_HMONITOR.
    • SEE_MASK_HOTKEY
    • SEE_MASK_NOCLOSEPROCESS
    • SEE_MASK_CONNECTNETDRV
    • SEE_MASK_NOASYNC
    • SEE_MASK_FLAG_DDEWAIT
    • SEE_MASK_DOENVSUBST
    • SEE_MASK_FLAG_NO_UI
    • SEE_MASK_UNICODE
    • SEE_MASK_NO_CONSOLE
    • SEE_MASK_ASYNCOK
    • SEE_MASK_NOQUERYCLASSSTORE
    • SEE_MASK_HMONITOR
    • SEE_MASK_NOZONECHECKS
    • SEE_MASK_WAITFORINPUTIDLE
    • SEE_MASK_FLAG_LOG_USAGE
  3. Wnd. Sama dengan parameter hWnd para fungsi ShellExecute.
  4. lpVerb. Sama dengan parameter Operation para fungsi ShellExecute.
  5. lpFile. Sama dengan parameter FileName para fungsi ShellExecute.
  6. lpParameters. Sama dengan parameter Parameters para fungsi ShellExecute.
  7. lpDirectory. Sama dengan parameter Directory para fungsi ShellExecute.
  8. nShow. Sama dengan parameter ShowCmd para fungsi ShellExecute.
  9. hInstApp. Jika flag SEE_MASK_NOCLOSEPROCESS aktif dan fungsi sukses dijalankan, akan berisi nilai lebih dari 32. Jika gagal akan mengembalikan kode kesalahan.
  10. lpIDList. Optional. Alamat absolut dari struktur ITEMIDLIST yang berisi daftar identifier yang unik bagi file yang di eksekusi. Parameter ini diabaikan jika flag SEE_MASK_IDLIST atau SEE_MASK_INVOKEIDLIST pada parameter fMask tidak aktif.
  11. lpClass. Optional. Nama class dari file atau GUID. Parameter ini diabaikan jika flag SEE_MASK_CLASSNAME pada parameter fMask tidak aktif.
  12. hkeyClass. Optional. Registry key untuk class file. Parameter ini diabaikan jika flag SEE_MASK_CLASSKEY pada parameter fMask tidak aktif.
  13. dwHotKey. Optional. Shortcut pada keyboard yang di asosiasikan dengan aplikasi yang bersangkutan. Parameter ini diabaikan jika flag SEE_MASK_HOTKEY pada parameter fMask tidak aktif.
  14. hIcon. Optional. Handle ke suatu icon untuk class file. Hanya digunakan untuk Windows XP dan sebelumnya, diabaikan untuk Windows Vista dan sesudahnya. Parameter ini diabaikan jika flag SEE_MASK_ICON pada parameter fMask tidak aktif.
  15. hProcess. Berisi nilai kembali berupa handle untuk aplikasi yang dijalankan, jika flag SEE_MASK_NOCLOSEPROCESS pada parameter fMask aktif.

Contoh penggunaannya adalah sebagai berikut.
var
  SEInfo: TShellExecuteInfo;
begin
  FillChar(SEInfo, SizeOf(SEInfo), 0);
  with SEInfo do
  begin
    cbSize := SizeOf(TShellExecuteInfo);
    lpVerb := PChar('open');
    lpFile := PChar('C:\Windows');
    nShow := SW_SHOWNORMAL;
  end;
  ShellExecuteEx(@SEInfo);
end.

Baca selengkapnya...

03 Juli 2009

Fungsi Windows API: ShellExecute

ShellExecute merupakan fungsi yang disediakan oleh Windows melalui file pustaka “shell32.dll”, dan sudah ada sejak Windows 9x. Kegunaan dari fungsi ini adalah untuk melakukan operasi terhadap suatu file atau direktori. Operasi yang dimaksud bisa bermacam-macam yang nanti akan dijelaskan. Dalam pengembangan aplikasi dengan Delphi fungsi ini juga bisa dipakai dengan menambahkan unit “ShellAPI” pada form yang mengakses fungsi tersebut. Sintaknya adalah sebagai berikut.
function ShellExecute(hWnd: HWND; Operation, FileName, Parameters, Directory: PChar; ShowCmd: Integer): HINST;

Deskripsi dari parameter diatas adalah sebagai berikut.
  1. hWnd. Merupakan handle terhadap window yang untuk menampilkan user interface (UI) atau pesan kesalahan. Nilai bisa 0 yang berarti tidak berhubungan dengan suatu window.
  2. Operation. Merupakan string yang menggambarkan operasi yang digunakan terhadap suatu file atau direktori. Operasi yang dimaksud bisa berupa:
    • open. Membuka item yang ditentukan oleh parameter FileName. Bisa berupa file atau direktori. Item akan dibuka menggunakan aplikasi sesuai dengan ekstensi file yang di registrasikan.
    • edit. Menampilkan editor yang digunakan untuk membuka dan meng-edit file dokumen dari parameter FileName. Jika parameter yang diberikan bukan merupakan file dokumen, fungsi akan gagal dipanggil.
    • explore. Membuka direktori/folder yang diberikan oleh parameter FileName.
    • find. Membuka dialog pencarian pada direktori aktif atau pada direktori yang ditentukan oleh parameter FileName.
    • print. Mencetak file yang ditentukan oleh parameter FileName. Jika parameter yang diberikan bukan merupakan file dokumen, fungsi akan gagal dipanggil.
  3. FileName. Merupakan suatu obyek, bisa berupa file atau direktori, yang di eksekusi oleh operasi yang ditentukan oleh parameter Operation.
  4. Parameters. Jika file yang ditentukan merupakan file aplikasi yang bisa dijalankan, isi dari parameter ini digunakan sebagai parameter untuk file aplikasi yang bersangkutan.
  5. Directory. Merupakan direktori kerja default, jika tidak diisi merupakan direktori aktif.
  6. ShowCmd. Flag yang menentukan bagaimana aplikasi ditampilkan waktu dibuka. Konstanta yang bisa dipakai:
    • SW_HIDE
    • SW_MAXIMIZE
    • SW_MINIMIZE
    • SW_RESTORE
    • SW_SHOW
    • SW_SHOWDEFAULT
    • SW_SHOWMAXIMIZED
    • SW_SHOWMINIMIZED
    • SW_SHOWMINNOACTIVE
    • SW_SHOWNA
    • SW_SHOWNOACTIVATE
    • SW_SHOWNORMAL

Jika fungsi berhasil dijalankan, akan mengembalikan nilai integer lebih besar dari 32. Jika gagal, akan mengembalikan kode kesalahan sebagai berikut:
  • 0
  • ERROR_FILE_NOT_FOUND
  • ERROR_PATH_NOT_FOUND
  • ERROR_BAD_FORMAT
  • SE_ERR_ACCESSDENIED
  • SE_ERR_ASSOCINCOMPLETE
  • SE_ERR_DDEBUSY
  • SE_ERR_DDEFAIL
  • SE_ERR_DDETIMEOUT
  • SE_ERR_DLLNOTFOUND
  • SE_ERR_FNF
  • SE_ERR_NOASSOC
  • SE_ERR_OOM
  • SE_ERR_PNF
  • SE_ERR_SHARE

Contoh penggunaannya:
Membuka aplikasi tertentu.
ShellExecute(0, ‘open’, ‘notepad.exe’, nil, nil, SW_SHOWNORMAL);
Explore direktori/folder tertentu.
ShellExecute(0, ‘explore’, ‘C:\Windows’, nil, nil, SW_SHOWNORMAL);
Edit file dokumen.
ShellExecute(0, ‘edit’, ‘C:\textfile.txt’, nil, nil, SW_SHOWNORMAL);
Menampilkan dialog pencarian pada direktori tertentu.
ShellExecute(0, ‘find’, ‘C:\Windows\system’, nil, nil, SW_SHOWNORMAL);
Mencetak file dokumen.
ShellExecute(0, ‘print’, ‘C:\textfile.txt’, nil, nil, SW_SHOWNORMAL);

Baca selengkapnya...

01 Juli 2009

Akses Internet Unlimited dengan Mobi

Operator telepon seluler berbasis CDMA Mobile-8 tampaknya tidak mau ketinggalan dengan operator lain dalam rangka akses internet unlimited, walaupun sebenarnya ketinggalan juga nih. Ini ditandai dengan diluncurkan produk Mobi. Berbeda dengan paket Mobi sebelumnya yang di bundling dengan modem, yang ini cuma kartu perdana saja. Dengan begini semakin banyak juga pilihan untuk akses internet yang terjangkau untuk semua rakyat, termasuk yang di pinggiran kota seperti saya ini.
Paket yang disediakan ada 4:
  • Rp. 50.000 (up to 125 Kbps) quota 500 MB setelah itu 64 Kbps
  • Rp. 100.000 (up to 1024 Kbps) quota 1.5 GB setelah itu 64 Kbps
  • Rp. 150.000 (up to 3.1 Mbps) quota 2.5 GB setelah itu 128 Kbps
  • Rp. 250.000 (up to top speed) quota 3.5 GB setelah itu 256 Kbps

Tapi sayangnya dari 4 paket tersebut hanya 1 saja yang bisa dinikmati diluar area Jakarta dan sekitarnya saja. Tapi lumayan buat internetan dengan biaya murah, cuma Rp. 50.000 jadi. Selain itu hanya bisa dinikmati di area Jakarta dan sekitarnya karena jaringan EVDO yang bisa mencapai kecepatan maksimal sampai 3.1 Mbps. Bagi yang pernah coba bisa sharing pengalamannya.
Pertama kali kita mesti beli kartu perdana Mobi dulu di counter Mobile-8, bisa ditebus dengan harga Rp. 75.000 (termasuk untuk akses internet unlimited bulan pertama), selanjutnya dengan melakukan isi ulang senilai Rp. 50.000 tiap bulan, katanya sih bisa akses internet unlimited. Selanjutnya adalah mendaftarkan kartu perdana tersebut seperti layaknya kartu perdana lain, ini bisa dibantu oleh operator yang melayani kita di counter Mobile-8. Langkah terakhir adalah dengan mengirimkan SMS ke 777, yang kemudian akan kita dapatkan kiriman balasan berupa username dan password yang digunakan untuk akses internet.
REG<spasi>UNL50 (untuk paket Rp. 50.000)
REG<spasi>UNL100 (untuk paket Rp. 100.000)
REG<spasi>UNL150 (untuk paket Rp. 150.000)
REG<spasi>UNL250 (untuk paket Rp. 250.000)

Informasi ini sudah sejak pertengahan Juni 2009 aku dapat, tapi baru bisa direalisasikan akhir Juni. Di website Mobile-8 sendiri belum terdapat informasi tentang akses unlimited ini, jadi cukup menyesatkan. Diluar itu akses internet cukup baik, jika dibanding dengan yang aku pakai sebelumnya dari Starone. Tidak bisa membandingkan dengan yang lain, karena pilihan yang sangat terbatas di tempatku. Selamat mencoba mumpung belum terlalu banyak yang tahu…

Baca selengkapnya...

30 Juni 2009

Mendapatkan Informasi File Aplikasi

File aplikasi yang mempunyai ekstensi seperti .exe atau .dll bisa memiliki informasi yang berkaitan dengan file tersebut. Misalnya versi dari file, perusahaan, keterangan, atau apa pun yang kita mau. Informasi tersebut akan menyatu dengan file aplikasi yang bersangkutan. Informasi ini bisa kita dapatkan dengan menampilkan properties dari file aplikasi itu. Jika file aplikasi tersebut memiliki informasi, maka bisa kita lihat pada tab Version dari properties file tersebut.
Menambahkan informasi pada file aplikasi bisa memiliki keuntungan. Misalnya bila kita mengembangkan sebuah aplikasi dan ada update dari file aplikasi untuk keperluan penambahan fitur atau perbaikan terhadap kesalahan/bug. Aplikasi yang dibuat bisa melakukan update otomatis ke suatu lokasi tertentu jika ditemukan file aplikasi yang sama dengan versi yang lebih baru.
Delphi juga menyediakan sarana untuk menambahkan informasi pada aplikasi yang kita buat. Pada menu Project->Options, terdapat pilihan “Include version information in project” yang harus kita aktifkan (default tidak aktif). Versi file di Windows dibagi menjadi 4 bagian, Major, Minor, Release dan Build. Pilihan “Auto-increment build number” jika di aktifkan, maka angka pada bagian Build akan otomatis ditambah satu jika dilakukan proses build (menu Project->Build <nama_project>/Build All Projects) dan compile.








Pada bagian Project Options tersebut terdapat sejumlah key yang bisa kita beri nilai, seperti CompanyName, FileDescription, FileVersion, dan seterusnya. Untuk mendapatkan informasi dari suatu file aplikasi gunakan cara ini.
uses SysUtils, Windows;

function GetFileVersionInformation(const aFileName, aName: string): string;
const
  LocaleID = '0421';
var
  VerInfoSize, VerValueSize, Dummy: DWORD;
  VerInfo, VerValue: PChar;
begin
  Result := '';
  VerInfoSize := GetFileVersionInfoSize(PChar(aFileName), Dummy);
  if VerInfoSize > 0 then
  begin
    VerInfo := AllocMem(VerInfoSize);
    GetFileVersionInfo(PChar(aFileName), 0, VerInfoSize, VerInfo);
    if VerQueryValue(VerInfo, PChar('StringFileInfo\' + LocaleID + '04E4\' + aName), Pointer(VerValue), VerValueSize) then
      Result := VerValue;
    FreeMem(VerInfo, VerInfoSize);
  end;
end;

Contoh cara menggunakannya:
ShowMessage(GetFileVersionInformation(Application.ExeName, ‘FileVersion’));
ShowMessage(GetFileVersionInformation(Application.ExeName, ‘CompanyName’));

Pada skrip diatas terdapat konstanta LocaleID, karakter tersebut tergantung dari pengaturan lokalisasi/bahasa yang kita pakai. Pada contoh diatas digunakan pengaturan lokalisasi/bahasa Indonesian. Pengaturan tersebut bisa kita lihat pada Project Options.











Bisa juga kita menambahkan informasi tambahan selain yang telah ada. Arahkan cursor sampai pada key paling bawah, kemudian tekan tombol panah bawah. Masukkan nama key dan isi nilai dari key tersebut.

Baca selengkapnya...

26 Juni 2009

Query Dinamis SQL Server

Perintah EXECUTE pada SQL Server digunakan untuk menjalankan procedure, function dan bisa juga string yang berisi perintah SQL. Tanda kurung buka dan kurung tutup mutlak digunakan sebelum dan sesudah string perintah SQL. Misalnya untuk menjalankan procedure bisa seperti ini:
EXECUTE (‘sp_databases’);
EXECUTE (‘SELECT * FROM sysdatabases’);

Jika kita memerlukan query yang menghasilkan jumlah field yang bisa berbeda, cara ini bisa menjadi solusi. Misalnya menampilkan hasil penjualan per tahun dari perusahaan. Tidak menjadi masalah jika tahun ditampilkan secara vertikal, tapi jika ditampilkan secara horisontal tentu tidak semudah itu. Disini diberikan contoh kasus dengan 3 tabel, periode, cabang dan penjualan. Tabel periode berisi tahun penjualan, tabel cabang berisi cabang perusahaan, dan tabel penjualan adalah data penjualan berdasarkan tanggal pada suatu cabang. Tabel-tabel tersebut di desain seperti ini.
CREATE TABLE periode(tahun int);
INSERT INTO periode VALUES (2007);
INSERT INTO periode VALUES (2008);
INSERT INTO periode VALUES (2009);

CREATE TABLE cabang(kode char(2));
INSERT INTO cabang VALUES ('01');
INSERT INTO cabang VALUES ('02');

CREATE TABLE penjualan(kode char(5), tanggal datetime, total money, kodecabang char(2));
INSERT INTO penjualan VALUES ('00001', '2007-02-21', 80000, '01');
INSERT INTO penjualan VALUES ('00002', '2007-07-09', 35000, '02');
INSERT INTO penjualan VALUES ('00003', '2008-01-11', 20000, '01');
INSERT INTO penjualan VALUES ('00004', '2008-04-15', 63000, '01');
INSERT INTO penjualan VALUES ('00005', '2008-12-30', 48000, '02');
INSERT INTO penjualan VALUES ('00006', '2009-03-03', 50000, '01');

Yang kita inginkan adalah menampilkan total penjualan per tahun per cabang dengan tahun ditampilkan secara horisontal. Dengan bantuan cursor hasil yang diinginkan bisa kita dapatkan.
DECLARE @tahun char(4);
DECLARE @query varchar(1000);
SET @query = 'SELECT c.kode AS cabang, ';
DECLARE crs CURSOR LOCAL FOR SELECT tahun FROM periode;
OPEN crs;
FETCH NEXT FROM crs INTO @tahun
WHILE @@FETCH_STATUS = 0
BEGIN
  SET @query = @query + 'SUM(CASE WHEN YEAR(p.tanggal) = ' + @tahun + ' THEN p.total ELSE 0 END)' + ' AS tahun' + @tahun;
  FETCH NEXT FROM crs INTO @tahun;
  IF @@FETCH_STATUS = 0 SET @query = @query + ', '
END
CLOSE crs
DEALLOCATE crs
SET @query = @query + ' FROM cabang AS c LEFT JOIN penjualan AS p ON p.kodecabang = c.kode GROUP BY c.kode';
EXECUTE (@query);

Hasilnya dari skrip diatas adalah sebagai berikut.





Untuk mendapatkan hasil dari perintah SQL seperti diatas tidak bisa didapatkan seperti mengakses tabel biasa. Jadi perintah berikut akan menghasilkan pesan kesalahan.
SELECT * FROM EXECUTE (‘SELECT * FROM sysdatabases’);

Caranya adalah menyimpan hasil dari perintah SQL tersebut ke suatu tabel atau tabel sementara. Contoh berikut akan menyimpan hasil dari beberapa perintah SQL ke tabel sementara dan menampilkan hasilnya.
INSERT INTO #tmp EXECUTE ('prosedur1');
INSERT INTO #tmp EXECUTE ('prosedur2');
INSERT INTO #tmp EXECUTE ('prosedur3');
SELECT * FROM #tmp;

Baca selengkapnya...

23 Juni 2009

Perintah GO pada SQL Server

Perintah GO hanya dikenali pada DBMS SQL Server, digunakan untuk mengakhiri perintah-perintah T-SQL (Transact SQL) pada SQL Server. Perintah GO ini bukan merupakan perintah T-SQL. Pada SQL Server kumpulan perintah dikirim ke instance SQL Server yang dinamakan “batch”. Dengan perintah GO, tool yang digunakan pada SQL Server, seperti Query Analyzer pada SQL Server 2000 atau SQL Server Management Studio pada SQL Server 2005/2008, akan mengirim sinyal ke instance SQL Server untuk mengakhiri batch yang bersangkutan. Suatu batch terdiri atas semua perintah setelah perintah GO terakhir, atau sejak awal skrip jika tidak ada perintah GO sebelumnya.
USE master;
GO
DECLARE @i int;
SET @i = 10;
SELECT @i;
GO

Contoh skrip diatas terdiri dari 2 batch, karena terdapat 2 perintah GO. Dengan skrip tersebut sebuah variabel dengan tipe integer di deklarasikan dan diisi dengan nilai 10 yang kemudian ditampilkan hasilnya. Variabel yang di deklarasikan tersebut hanya berlaku pada batch tempat variabel tersebut di deklarasikan dan tidak berlaku setelah perintah GO dijalankan.
USE master;
GO
DECLARE @i int;
SET @i = 10;
SELECT @i;
GO
SELECT @i; -- akan menampilkan pesan kesalahan

Jika kita membuat procedure, function atau trigger, maka perintah untuk membuat obyek tersebut harus merupakan perintah pertama pada suatu batch. Contoh berikut akan menampilkan pesan kesalahan.
USE master;
CREATE PROCEDURE proc1 AS SELECT 1;

Supaya skrip tersebut bisa berjalan tanpa adanya pesan kesalahan, kita harus menambahkan perintah GO sebelum perintah untuk membuat procedure.
USE master;
GO
CREATE PROCEDURE proc1 AS SELECT 1;

Pada SQL Server 2008 terdapat fitur baru dimana pada perintah GO terdapat parameter dengan tipe integer (optional) yang dapat diisi dengan nilai integer positif. Parameter ini jika diisi dengan nilai tertentu akan menjalankan batch yang bersangkutan sebanyak nilai dari parameter tersebut ditentukan. Contoh berikut akan membuat tabel “tbl” dan diisi dengan tanggal dan waktu sekarang sebanyak 10 kali.
CREATE TABLE tbl (tgl datetime)
GO
INSERT INTO tbl VALUES (GETDATE())
GO 10
SELECT * FROM tbl

Catatan: Perintah lain tidak bisa menempati baris yang sama dengan perintah GO. Perintah GO juga tidak memerlukan tanda ; sebagai akhir perintah. Tapi baris komentar dapat menyertai perintah GO. Contoh:
GO [ok]
GO; [error]
GO -- akhir dari batch [ok]

Baca selengkapnya...