Feeds:
Posts
Comments

Posts Tagged ‘Coding’

Hai prenz … last post di taon 2010 nih…

Karena ada kesibukan … (ngodink) hehehehe :mrgreen: jadi ketemu deh permasalahan nya, dulu mah gak pernah terpikirkan gimana caranya untuk deleting record dengan subquerying …

Subquerying biasanya dilakukan dengan select statement mulu kalo di mysql, nah sekarang kejadian deh pengen delete record dengan kondisi yang di subquerying tersebut.

Contoh kasus nya adalah saya pengen menghapus record yang sama pada tanggal yang sama akan tetapi ada kondisi field yang berbeda.

contoh data :


Nah yang dikotak merahin itu diatas kebanyakan untuk field cause = cause_ori, maka saya ingin menghapus yang data cause = cause_ori nya

kalau di select dengan perintah dibawah ini :

select ab.nip, ab.dated, ab.cause, ab.cause_ori, count(ab.nip) as maxcount
from absence ab
inner join
( select nip, dated, cause, cause_ori
   from absence
   where cause <> cause_ori
   group by nip, dated
   order by nip, dated
) as a on ab.nip = a.nip and ab.dated = a.dated
group by ab.nip, ab.dated
having count(ab.nip) > 1
order by ab.nip, ab.dated

mendapatkan hasil seperti :

Bejibun kan datanya dan itu double kalo di scroll ke bawah bahkan ada yang triple, dan gak mungkin saya looping satu persatu untuk menghapus data tersebut.

Nah, sekarang bagaimana ingin menghapus records yang buanyak tersebut dengan menggunakan perintah SQL Statements ???

Setelah putar – puter otak dan RTFM, maka didapat SQL statemen untuk delete seperti dibawah ini :

delete deleted.* from absence as deleted
inner join
(
   select ab.ab_id
   from absence ab
   inner join
   ( select nip, dated, cause, cause_ori
     from absence
     where cause <> cause_ori
     group by nip, dated
     order by nip, dated
    ) as a on ab.nip = a.nip and ab.dated = a.dated
   group by ab.nip, ab.dated
   having count(ab.nip) > 1
   order by ab.nip, ab.dated
) as joined on deleted.ab_id = joined.ab_id

sudah deh, dengan meng-execute statement tersebut … semua data yang tidak diinginkan … lenyap dari permukaan harddisk :mrgreen:

Segetoh dulu deh … dikhawatirkan lupa, mendingan sharing dengan teman-teman… siapa tahu ada yang perlu juga :mrgreen:

Salam,
😎
Man’z

Advertisements

Read Full Post »

Dear All,

After we trying the previous technique, we have face the problem … But, Fortunately we found the way to change it and running smoothly … :mrgreen:

Change the step and you will find the (maybe) good solutions … :mrgreen: but still have one problem when handling the big data aware …

First alias ka hiji kieu :

put one procedure at Public Level:

public
 { Public declarations }
 procedure UpdateGambar(AView: TcxGridTableView; ARecordIndex: integer);

kemudian, create the code like shown below, in previous post we put this code at GetProperties event :

procedure TForm8.UpdateGambar(AView: TcxGridTableView; ARecordIndex: integer);
var
 AValue: string;
 APicture: TPicture;
 AFileName : string;
begin
 AView.DataController.PostEditingData;
 AFileName := 'C:\Manz\Projects\Web\hrms\public_html\images\photo\' +
 VarToStr(AView.DataController.Values[ARecordIndex, cxGrid1DBTableView1nip.Index]) + '.jpg';
 if FileExists(aFileName) then
 begin
   APicture := TPicture.Create;
   try
     APicture.LoadFromFile(AFileName);
     SavePicture(APicture, AValue);
   finally
     FreeAndNil(APicture);
   end;
 end
 else AValue := '';

 AView.DataController.Values[ARecordIndex, cxGrid1DBTableView1Column1.Index] := AValue;
end;

next, at event onPropertiesEditValueChanged at column Image on File, put this code like shown below :

procedure TForm8.cxGrid1DBTableView1Column1PropertiesEditValueChanged(
 Sender: TObject);
var
 AIndex: Integer;
begin
 AIndex := cxGrid1DBTableView1.DataController.FocusedRecordIndex;
 UpdateGambar(cxGrid1DBTableView1, AIndex);
end;

next, at event Form Create put this code like shown below :

procedure TForm8.FormCreate(Sender: TObject);
var
 i: integer;
begin
 for i := 0 to cxGrid1DBTableView1.DataController.RecordCount - 1 do
 UpdateGambar(cxGrid1DBTableView1, i);
end;

After that, you may running your project  …. and … tadaaaa…. , smooth scrolling in the grid without knowing the error will be appear :mrgreen:

But, this the problem when handling the big data aware, cause will be loaded slowly …, you may filtering your data table or query with the limit. :mrgreen:

That’s all folks, … gitu azah dach … sekian dan terima kasih .. jangan lupa donat nya ya weekekekekekek :mrgreen:

Salam Coderz,
😎
Man’z

Read Full Post »

Dear All,

Met ketemu lagi dalam acara Delphi Coderz … :mrgreen:

Kemarin, ada dari temen bro @ImanD mengenai bagaimana memunculkan gambar bukan dari database saja, akan tetapi dari file juga, soalnya kita pengguna Developer Express Quantum Grid.

Setelah membaca dan mengurai dari keterangan Knowledge Basenya Developer Express. Akhirnya bisa ditampilkan apa yang diinginkan … sebelumnya mah udah jalan tapi gak bisa munclu gambarnya :mrgreen:

Nah, sekarang daripada ngomong gak karuan langsung saja, kita buat project baru dan simpan deh komponen yang diperlukan seperti zConnection, zTable (karena pake ZeosLib), DataSource dan cxGridnya.

Untuk di gridnya ditambahkan 1 column unbound, jadi dikenal dengan column cxGrid1DBTableView1Column1, dengan set properties :

cxGrid1DBTableView1Column1.Properties := Images
.Properties.Images.GraphicClassName := TJPEGImage
.Properties.Images.ImmediatePost := true

sekarang untuk Databindingnya di set ke:

cxGrid1DBTableView1Column1.DataBinding.ValueType := string

untuk DataBinding.FieldName nya di kosyonk an saja, karena ini tidak dipakai, jadi column ini disebut unbound data-aware.

Sekarang … Codingz , tadi nya saya pikir bisa disimpan pada event onCustomDrawCell, karena untuk masalah beda warna tiap baris bisa digunakan event ini, tapi ternyata terjadi infinite-loop pada event Paint nya DevexGrid.

Jadi, saya tempatkan pada event : onGetProperties dari cxGrid1DBTableView1Column1 dengan isi :

procedure TForm8.cxGrid1DBTableView1Column1GetProperties(
  Sender: TcxCustomGridTableItem; ARecord: TcxCustomGridRecord;
  var AProperties: TcxCustomEditProperties);
var
  AFileName, AValue: String;
  APicture: TPicture;
begin
  AFileName := 'C:\Manz\Projects\Web\hrms\public_html\images\photo\' +
               VarToStr(ARecord.Values[cxGrid1DBTableView1nip.Index]) + '.jpg';
  if (fileexists(AFileName)) then
  begin
    APicture := TPicture.Create;
    try
      APicture.LoadFromFile(AFileName);
      SavePicture(APicture, AValue);
    finally
      freeAndNil(APicture);
    end;
  end
  else AValue := '';

  cxGrid1DBTableView1.DataController.Values[ARecord.RecordIndex, Sender.Index] := AValue;
end;


Dengan hasil snap-shot diatas .. maka hasil yang di-inginkan keluar seperti ini :mrgreen:

ImageLoad

ada 2 field tertera diatas, yaitu from DB dan from File, nah yang from File inilah yang disebut dengan unbounded data-aware.

Dikau temanz .. bisa mencoba nya … any error, any mistake (salah), access denied or error yang laindon’t ask … alias jangan tanya … silahkan trace sendiri sajah yah … :mrgreen:

Seperti biasa, kalau code ini berguna untuk kalian teman-temanz, teman-temanz bisa donate kepadaku ya ya ya :mrgreen: for keep this blog live and given the some tricky … :mrgreen:

Salam Coderz,
😎
Man’z

procedure TForm8.cxGrid1DBTableView1Column1GetProperties(
Sender: TcxCustomGridTableItem; ARecord: TcxCustomGridRecord;
var AProperties: TcxCustomEditProperties);
var
AFileName, AValue: String;
APicture: TPicture;
begin
AFileName := ‘C:\Manz\Projects\Web\hrms\public_html\images\photo\’ +
VarToStr(ARecord.Values[cxGrid1DBTableView1nip.Index]) + ‘.jpg’;
if (fileexists(AFileName)) then
begin
APicture := TPicture.Create;
try
APicture.LoadFromFile(AFileName);
SavePicture(APicture, AValue);
finally
freeAndNil(APicture);
end;
end
else AValue := ”;

cxGrid1DBTableView1.DataController.Values[ARecord.RecordIndex, Sender.Index] := AValue;
end;

Read Full Post »

Dear All,

Once again, MySQL make me headache to handle un-linked key that consist at temporary tables and this two table is manipulate by record-form model.

This is a scenario :

We’ve 2 table — simple table that want to inserting the key for linked between that tables, that the key from master table is generated from trigger.

for example :

create table tbl_a
(
  uid varchar(40) default '-',
  name varchar(50),
  constraint pk_tbl_a primary key (uid)
);

create table tbl_b
(
  uid varchar(40),
  qty double precision default 0,
  description varchar(100),
  constraint fk_tbl_b foreign key (uid)
    references tbl_a (uid)
    on update cascade on delete cascade
);

now, we create the trigger for this table a.

create trigger trig_tbl_a before insert on tbl_a for each row
set new.uid = uuid();

but, how to insert the tbl_b.uid ? if we use simple insert statement … ?

After we long discussed with our best friends … Now, we have one good idea.

This the resolving the problem :

drop and re-create the trigger at table a :

drop trigger trig_tbl_a;
create trigger trig_tbl_a before insert on tbl_a for each row
begin
  set new.uid = uuid();
  create temporary table if not exists t_uid(uid varchar(40));
  delete from t_uid;
  insert into t_uid values (new.uid);
end;

then, create trigger for table b:

create trigger trig_tbl_b before insert on tbl_b for each row
set new.uid = (select uid from t_uid);

after that, we can relate the data on table b using the uid key.

try this :

mysql> insert into tbl_a (name) values ('Manz');
Query OK, 1 row affected, 1 warning (0.03 sec)

mysql> insert into tbl_b (qty, description) values (10, 'Movie ordered with DVD original version');
Query OK, 1 row affected (0.03 sec)

mysql> select * from tbl_a;
+--------------------------------------+------+
| uid                                  | name |
+--------------------------------------+------+
| 4b5a8c27-0321-11de-88cd-184e3e4ece1f | Manz |
+--------------------------------------+------+
1 row in set (0.02 sec)

mysql> select * from tbl_b;
+--------------------------------------+------+-----------------------------------------+
| uid                                  | qty  | description                             |
+--------------------------------------+------+-----------------------------------------+
| 4b5a8c27-0321-11de-88cd-184e3e4ece1f |   10 | Movie ordered with DVD original version |
+--------------------------------------+------+-----------------------------------------+
1 row in set (0.00 sec)

Now, we can use the code to update my uid. And result is my headache is gone…. :mrgreen:

Cheers,
😎
Man’z

Read Full Post »

Allo Frenz … ketemu lagi …

Kali ini aku akan ngebahas sedikit cara di FastReport. Fastreport adalah software reporting tools buat delphi yang lumayan bagus, cakep, lite, gampang… satu lagi … cepret … 😀

Nah, disini aku akan mengulas sedikit mengenai bagaimana seh caranya ngitung balance ?, dalam kasus ku ini untuk ngitung balance quantity, tapi biasanya juga gak jauh berbeda dengan ngitung balance yang ada di akunting neraca … cuman beda field aja kali ya 😀

Dah lah gak mau cerita panjang lebar, karena daku bukan tukang dongeng, jadi lieur mo ngomongin apa.

Dikau frendz bisa lihat langsung di sekerin shyut nya dibawah ini :

Nah, biarpun sekerin shyut nya ketjil, tapi masih bisa liat kan 😀

Disini, daku memberlakukan peraturan kalau transaksi di detail typenya 101, berarti quantitynya nambah karena itu statusnya pemasukan, kalau 201 berarti quantitynya ngurang karena stattusnya pemakaian …. jadi … Opening Balance = 7, Pemasukkan (101) = 30, Pemakaian (201) = 15, jadi sisanya tinggal 22, gimana cara ngitungnya ?? ya tinggal 7 + 30 – 15 = 22 .. gampang kan …

Dah ah cape, sekarang koding nya nih …

Woops, sebelum ngoding, di DetailBand nya di simpen satu memo dengan nama memo1.

Sekarang codingya gimana, simpan coding dibawah ini pada event DetailData1OnBeforePrint.

  if (<frxDBDataset1."movement_type"> = '101') then                                                                                                              
    balance := balance + <frxDBDataset1."quantity">
  else if (<frxDBDataset1."movement_type"> = '102') then                                                                                                              
    balance := balance - <frxDBDataset1."quantity">;                                                                                                                         
  memo1.text := formatfloat('#0.00', balance);

Nah, tapi jangan lupa simpan pada paliiiiiinnnngggg atas code assingment ini :

var
  Balance: real;

Truzz … ?? ya wis … jalanin ajah .. see what already do with FastReport … no guarantee 😀

Salam Coderz,
😎
Man’z

Read Full Post »