| Author |
Message |
|
|
Post subject: ngopi isi tabel ke tabel lain
Posted: 15/Dec/2005 15:37
|
|
onSkilled
Joined: 17-Nov-2005
Posts: 93
|
|
hai para jawara delphi ada yang tau command sql atau coding blh juga
untuk ngopi isi tabel misalnya gw punya 2 tabel A dan B dengan struktur yang sama satu pake mysql(tabel A) satu pake access(tabel B) ngisinya hanya pada tabel B hasilnya nantinya gw mau isinya sama,
logikanya
tabel A bandingin dengan B,
semua record ditabel B yang ga ada di tabel A, copy ke tabel A
mohon bimbingannya supaya cepat jago kayak mas2 semua |
|
|
| |
|
|
|
 |
|
deLogic |
| Location: Jakarta |
|
Post subject:
Posted: 15/Dec/2005 18:57
|
|
onMage
Joined: 04-Jul-2005
Posts: 2282
Location: Jakarta
|
|
wah ini model sinkronisasi ya... AFAIK belom ada perintah SQL / coding yang sederhana dan singkat.. codingnya rada2 panjang, aq coba kasih logic nya aja dari aplikasi kecil yg pernah aq buat untuk pump data dari database yang berbeda, moga2 aja ada yang bisa dimanfaatin..
- asumsi saya, tabel asal dan tujuan sudah di-create, kalo tabel tujuan belum di-create, maka ya harus dicreate dulu lah, kalo pengen otomatis, maka Anda dapat menggunakan perintah SQL CREATE TABLE dengan terlebih dahulu me-retrieve informasi struktur tabel asal dan menyesuaikannya dengan syntax SQL yang dikenal di database tujuan. Misalnya TEXT di ADO/MSSQL menjadi BLOB SUB_TYPE 1 di FB/IB.
- tentu saja harus diketahui terlebih dahulu struktur tabelnya, sama atau enggak, nah kalo sama, mulai retrieve tipe data yang dipake dari field pertama sampai field terakhir dari tabel tersebut (seperti field name, type, size, default value, constraint, dsb.. [kalo pengen lengkap, bejibun buanget]). kalo struktur tabelnya statik, dalam artian Anda hanya sinkronisasi data dari tabel yg telah Anda kehendaki, bukan sembarang tabel, maka Anda tidak perlu melakukan proses retrieval tipe data, cukup masukkan aja di array const atau record atau list.
- Anda harus mempunyai field pengenal (mungkin primary dan unique) yg berfungsi sebagai pembanding untuk mengecek apakah suatu record sudah ada di tabel tujuan.
- lakukan iterasi pada record asal dari awal hingga eof.. nah pada saat iterasi per record, lakukan perbandingan untuk mengecek apakah record tsb sudah ada di tabel tujuan. Ada dapat melakukannya melalui metode locate record pada tabel tujuan dengan key yg Anda dapatkan dari tabel asal.
- jika perintah locate tidak berhasil, berarti record belom ada, nah lakukan insert record ke tabel tujuan. Anda bisa menggunakan perintah append atau SQL: INSERT INTO. jika Anda menggunakan perintah SQL, maka pastikan Anda menyesuaikan penulisan value yang sesuai, karena syntax antar database belum tentu sama. Misalnya penulisan passing datetime.
HINT:
- sebaiknya Anda menggunakan 2 Connection yang sejenis, misalnya keduanya menggunakan ADO, Zeos, dsb, karena akan lebih menjamin casting informasi struktur tabel yang lebih valid.
Sebagai gambaran saya menggunakan Zeos untuk aplikasi DataPump saya, untuk sementara baru bisa konversi tabel & view dari dan ke ADO (bisa Access, SQLServer, DBase, dsb tergantung driver), FB/IB, mySQL, Postgre dan sybase (blm di-test).
silahkan tanya lg kalo ada yg kurang.. |
_________________ .:: Lagi gak pengen pasang signature ::.
|
| |
|
|
|
 |
cyber_hecker |
| Location: Ponti Hot City |
|
Post subject:
Posted: 15/Dec/2005 20:29
|
|
onProfessional

Joined: 19-May-2005
Posts: 981
Location: Ponti Hot City
Status: Offline
|
|
yup.. bener, seperti yang dikatakan deLogic, emang gitu caranya. tapi disini gue mberi contoh kodingnya..., karena menurut dinox struktur tabelnya sama cuma lain database, disini gue bercontoh hanya untuk kasus seperti itu :
sebagai contoh kita mempunyai tabel TBarang pada database microsoft Access dengan struktur Kode, NamaBarang, Satuan, Jumlah
dan anggap aja ditabel TBarang ini (di ms Access) terdapat 10 buah data.
selain itu kita juga mempunya tabel TBarang di mySQL dengan struktur tabel yang sama.
tapi data yang terdapat pada tabel TBarang (mySQL) hanya 4 buah.
setelah itu kita membuat project baru.
untuk database ms. access saya menggunakan komponen ADOConnection, ADOTable dan sebuah dataset. untuk database mySQL, saya menggunakan komponen zeos yaitu zConnection, zTable, dataset dan sebuah zQuery (untuk proses yang berhubungan dengan pemindahan data, pembuatan tabel, dan sebagainya)
koding lengkap nya :
Code:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, ADODB, StdCtrls, Buttons, ZDataset, ZAbstractRODataset,
ZAbstractDataset, ZAbstractTable, ZConnection, Grids, DBGrids;
type
TForm1 = class(TForm)
ADOConnection1: TADOConnection;
DBGrid1: TDBGrid;
ADOTable1: TADOTable;
ADOTable1Kode: TWideStringField;
ADOTable1NamaBarang: TWideStringField;
ADOTable1Satuan: TWideStringField;
ADOTable1Jumlah: TIntegerField;
DataSource1: TDataSource;
ZConnection1: TZConnection;
ZTable1: TZTable;
ZTable1Kode: TStringField;
ZTable1NamaBarang: TStringField;
ZTable1Satuan: TStringField;
ZTable1Jumlah: TIntegerField;
DataSource2: TDataSource;
DBGrid2: TDBGrid;
ZQuery1: TZQuery;
BitBtn1: TBitBtn;
procedure BitBtn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.BitBtn1Click(Sender: TObject);
const
lDeleteTable =
'DROP TABLE IF EXISTS tempBarang';
lCreateTable =
'CREATE TABLE `tempBarang` ('#13#10+
' `Kode` varchar(10) NOT NULL,'#13#10+
' `NamaBarang` varchar(50) default NULL,'#13#10+
' `Satuan` varchar(30) default NULL,'#13#10+
' `Jumlah` int(11) default NULL,'#13#10+
' PRIMARY KEY (`Kode`)'#13#10+
') ENGINE=InnoDB DEFAULT CHARSET=latin1';
lDataNotExist =
'SELECT'#13#10+
' tempbarang.Kode,'#13#10+
' tempbarang.NamaBarang,'#13#10+
' tempbarang.Satuan,'#13#10+
' tempbarang.Jumlah'#13#10+
'FROM'#13#10+
' tbarang'#13#10+
' RIGHT OUTER JOIN tempbarang ON (tbarang.Kode=tempbarang.Kode)'#13#10+
'WHERE'#13#10+
' (tbarang.Kode IS NULL)';
begin
with ZQuery1 do begin
SQL.Clear;
SQL.Append(lDeleteTable);
ExecSQL;
end;
with ZQuery1 do begin
SQL.Clear;
SQL.Append(lCreateTable);
ExecSQL;
end;
with ADOTable1 do begin
Close;
Open;
repeat
ZQuery1.SQL.Clear;
ZQuery1.SQL.Append(
Format('INSERT INTO tempBarang VALUES (%s, %s, %s, %s)',
[QuotedStr(FieldByName('Kode').AsString),
QuotedStr(FieldByName('NamaBarang').AsString),
QuotedStr(FieldByName('Satuan').AsString),
FieldByName('Jumlah').AsString]));
ZQuery1.ExecSQL;
Next;
until Eof;
end;
with ZQuery1 do begin
SQL.Clear;
SQL.Append('INSERT INTO TBarang');
SQL.Append(lDataNotExist);
ExecSQL;
end;
ADOTable1.Requery();
ZTable1.Refresh;
end;
end.
logika :
Code:
with ZQuery1 do begin
SQL.Clear;
SQL.Append(lDeleteTable);
ExecSQL;
end;
with ZQuery1 do begin
SQL.Clear;
SQL.Append(lCreateTable);
ExecSQL;
end;
buat sebuah tabel temporary untuk menyimpan data dari tabel access. tabel temporary ini mempunyai struktur yang sama dengan tabel TBarang yang ada pada database mySQL. jika tabel tersebut ada, maka hapus tabelnya terlebih dahulu.
Code:
with ADOTable1 do begin
Close;
Open;
repeat
ZQuery1.SQL.Clear;
ZQuery1.SQL.Append(
Format('INSERT INTO tempBarang VALUES (%s, %s, %s, %s)',
[QuotedStr(FieldByName('Kode').AsString),
QuotedStr(FieldByName('NamaBarang').AsString),
QuotedStr(FieldByName('Satuan').AsString),
FieldByName('Jumlah').AsString]));
ZQuery1.ExecSQL;
Next;
until Eof;
end;
pindahkan data dari tabel yang di access ke tabel temporary dengan fungsi repeat. walau sebenarnya perintah iterasi seperti ini sangat tidak disarankan. tapi karena emang cuma ini caranya.. yach terpaksa deh. kekekeke
Code:
with ZQuery1 do begin
SQL.Clear;
SQL.Append('INSERT INTO TBarang');
SQL.Append(lDataNotExist);
ExecSQL;
end;
buat query yang menggabungkan antara TBarang dan tempBarang pada mySQL dengan syarat data tersebut tidak ada pada tabel TBarang. setelah itu simpan semua data sekaligus ke dalam TBarang (mySQL).
refresh datanya.. supaya keliatan hasilnya
check database mySQL dan lihatlah, apakah data sudah pindah semua belon.. yup.. selesai pelajaran kita hari ini. kekekeke
|
_________________
|
| |
|
|
|
 |
|
|
|