Author Topic: Create trigger lewat vfp  (Read 3124 times)

0 Members and 1 Guest are viewing this topic.

Offline rnd

  • Hero Member
  • *
  • Posts: 1.284
Create trigger lewat vfp
« on: April 08, 2009, 06:35:10 PM »
Mohon bantuan pada para master, saya biasa create trigger melalui gui, tapi saat ini ada kebutuhan untuk buat trigger melalui sqlexec.. kira kira bisa ngak ya ... Thanks atas bantuannya

Offline armen_sakti

  • Fox-id M.V.P
  • Hero Member
  • *
  • Posts: 1.254
Re: Create trigger lewat vfp
« Reply #1 on: April 08, 2009, 10:59:29 PM »
Creat SP, Trigger dan Function pada MysSQL Setau saya dan yang pernah saya coba tidak bisa dilakukan dengan SPT pak. Ini menyangkut Batch Command Processing, namun pada SPT hanya bisa berlaku 1 (satu) line Instruksi aja.

Slihakan yang lain yang sudah pernah mencoba

---------------------------------------------------------------------
Pernah saya preteli DB Information_schema disana ata tabel Triggers, Routines yang memuat informasi trigger apa saja yang ada pada Server DB MySQL, namun Information_schema tidak bisa di Update secara langsung alias diblok sistim MySQL, andai saja hal itu bisa dilakukan sudah pasti pertanyaan pak rnd terjawab.
« Last Edit: April 08, 2009, 11:47:04 PM by armen_sakti »

Offline rnd

  • Hero Member
  • *
  • Posts: 1.284
Re: Create trigger lewat vfp
« Reply #2 on: April 09, 2009, 07:47:30 AM »
akhirnya ada jawaban dari pa Armen yang menjelaskan rasa penasaran selama ini, thx pa Armen.... soalnya saya buang waktu banyak untuk coba coba masalah ini.

Offline foxy

  • Fox-id M.V.P
  • Hero Member
  • *
  • Posts: 3.605
    • Foxy Land
Re: Create trigger lewat vfp
« Reply #3 on: April 09, 2009, 02:39:00 PM »
@rnd:

Tanpa bermaksud bikin bingung, tapi kalau pakai MS-SQL bisa. Saya rasa seharusnya kalau pakai MySQL juga bisa. @armen mengatakan bahwa tabel DB Information_schema (pasti ini system table-nya MySQL...) tidak bisa diupdate. Hmmm... bang armen, apakah mungkin ini karena masalah user authorization aja? Kalau di MS-SQL, asalkan usernya memiliki hak akses dbo (database owner), maka pasti bisa membuat trigger; apakah itu melalui MS-SQL-SMS (Microsoft SQL Server Management Studio) atau melalui SPT dari VFP, atau bahkan melalui command line osql. Tapi --- ini di MS-SQL loh... Gak tau dengan MySQL.

Quote from: armen
Ini menyangkut Batch Command Processing, namun pada SPT hanya bisa berlaku 1 (satu) line Instruksi aja.

Satu line instruksi saja? Hmmm.... masa sih? Apa gak bisa di letakkan ke dalam block begin-end seperti ini (supaya gampang, langsung saya copy-paste dari salah satu method di form aplikasi saya):
Code: [Select]
text to lcSQLCmd textmerge noshow pretext 2
begin
declare @pkTrxCustomerFaktur uniqueidentifier
declare @OldPkCustomer uniqueidentifier
declare @NewPkCustomer uniqueidentifier
declare @pkTrxCustomerSJ uniqueidentifier

set @NewPkCustomer = '<<lcPKCustomer>>'
set @pkTrxCustomerFaktur = '<<xFaktur.pkTrxCustomerFaktur>>'

select @pkTrxCustomerSj = fkTrxCustomerSJ
  from trxCustomerFaktur
 where pkTrxCustomerFaktur = @pkTrxCustomerFaktur

select distinct fkBUkuCopy
  into #temp1
  from trxCustomerSJDetail
 where fkTrxCustomerSJ = @pkTrxCustomerSJ

select distinct fkTrxCustomerRcv
  into #temp2
  from trxCustomerRcvDetail
 where pkTrxCustomerRcvDetail in (select distinct fkTrxCustomerRcvDetail
from BukuCopyDetailRol
where fkBukuCopy in (select fkBukuCopy from #temp1))

update trxCustomerFaktur
   set fkCustomer = @NewPKCustomer
 where pkTrxCustomerFaktur = @pkTrxCustomerFaktur

update trxCustomerSJ
   set fkCustomer = @NewPKCustomer
 where pkTrxCustomerSJ = @pkTrxCustomerSJ

update BukuCopy
   set fkCustomer = @NewPKCustomer
 where pkBukuCopy in (select fkBukuCopy from #temp1)

update trxCustomerRcv
   set fkCustomer = @NewPKCustomer
 where pkTrxCustomerRcv in (select fkTrxCustomerRcv from #temp2)

drop table #temp1
drop table #temp2

end
endtext

if sqlexec (liHandle, lcSQLCmd) > 0
*--- (dst).

Memang betul, return value dari SPT paling banyak adalah berupa satu record set (tidak bisa lebih). Tapi record set itu bisa dihasilkan dari beberapa perintah seperti di code saya di atas (btw, pada SPT di atas, memang tujuannya adalah mengupdate data, tidak menghasilkan record set dan VFP juga tidak menangkap record set tersebut).

Kembali ke create trigger, kalau di MSSQL bisa, harusnya di MySQL juga bisa....
This post is provided as is. Feel free to use all the codes and information, however understand that I don't have any obligations to fix any bug(s) or follow up this subject.

Offline davidmustakim

  • Fox-id M.V.P
  • Hero Member
  • *
  • Posts: 14.053
  • Awas ya...
Re: Create trigger lewat vfp
« Reply #4 on: April 09, 2009, 06:03:35 PM »
IMHO-AFAIK: "semua" yang bisa di command-line mysql harusnya sih bisa juga di sqlexec()/SPT walaupun emang ada "pertanyaan" koq trigger baru dibuat waktu aplikasi / database udah dipakai,..bukankah harusnya ini bagian dari plan awal/integral, jadi emang cocok di GUI-mysql?...
Selain blocking begin-end harusnya juga bisa "memaksa" SPT jadi single-line/satu baris aja dengan memanggil UDF/fungsi atau exec() atau apalah... blum tau @rnd persisnya mau apa... 
Sebenarnya saya curiga @rnd men-test tanpa error trapping jadi tidak menyadari terjadinya error terkait kenyataan bahwa mysql belum mendukung "multiple triggers" yaitu bila action_time (before/after) dan trigger_event (insert/update/delete) sama pada satu tabel
... Tapi sekedar contoh dibawah ini CREATE TRIGGER jalan aja pake SPT:
Quote
lcTanpaDSN= "DRIVER={MySQL ODBC 3.51 Driver};SERVER=localhost;UID=root;PWD="
lnConnHandle=sqlstringconnect(m.lcTanpaDSN)
IF lnConnHandle < 1
   MESSAGEBOX("Koneksi ke Server GAGAL", 16, "Salah",5000)
   RETURN
ENDIF
lcSql="USE DAVIDTES"
lnSukses=SQLEXEC(lnConnHandle,lcSql)
messagebox(iif(lnSukses>0,"Sukses USE","Gagal USE"))
IF lnSukses > 0
    lcSql="CREATE TRIGGER coba1 before insert on davidtes.tes1 for each row set new.kode='x'"
    lnSukses=SQLEXEC(lnConnHandle,lcSql)
    messagebox(iif(lnSukses>0,"Sukses CREATE TRIGGER","Gagal CREATE TRIGGER"))
ENDIF

« Last Edit: April 09, 2009, 07:34:03 PM by davidmustakim »

Offline armen_sakti

  • Fox-id M.V.P
  • Hero Member
  • *
  • Posts: 1.254
Re: Create trigger lewat vfp
« Reply #5 on: April 09, 2009, 07:36:32 PM »
Quote from: 'davidmustakim '
    lcSql="CREATE TRIGGER coba1 before insert on davidtes.tes1 for each row set new.kode='x'"
    lnSukses=SQLEXEC(lnConnHandle,lcSql)

Emangnya Trigger sesederhana itu yah pak?

Quote from: 'foxy'
Satu line instruksi saja? Hmmm.... masa sih? Apa gak bisa di letakkan ke dalam block begin-end seperti ini (supaya gampang, langsung saya copy-paste dari salah satu method di form aplikasi saya):

Ya hal inilah yang membuat saya tidak ngerti kenapa MSSQL bisa sendangkan MySQL tidak bisa, tetapi menurt kesimpulan saya sementara penyebab tidak bisa melakukan Batch Command Processing SPT() untuk DB MySQL adalah conflic Rules of Command Excecution , ini penyebabnya karena pertentangan End character Execute command MySQL dengan VFP yaitu ";" tanda sambung Line command. Sementara ";" merupakan End Character of line Command Execute pada MySQL. Ketika SPT mempassing Blok Command atau Multiline Command pada Batch Processing, nah disini MySQL bingung meng Accept perintah tersebut, ini contohnya

Code: [Select]
TEXT TO cBatchCommand TEXTMERGE NOSHOW

DELIMITER |

CREATE TRIGGER testref BEFORE INSERT ON test1
  FOR EACH ROW BEGIN
    INSERT INTO test2 SET a2 = NEW.a1;
    DELETE FROM test3 WHERE a3 = NEW.a1; 
    UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1;
  END;
|

DELIMITER ;

ENDTEXT

SQLEXEC(nCon, cBatchCommand)
AERROR(aErr_)
MESSAGEBOX(aErr_(2))
RETURN

Keterangan special to papa foxy yang belum pernah coba MySQL
- Code dalam blok TEXT....ENDTEXT tersebut jika di lakukan pada MySQL Command Line Console ga masalah
- MySQL menerima dan menexecute command jika menemkan Caracter ";"
- DELIMITER | berfungsi merobah End Charecter Execute agar MySQL tidak mengexecute command jika menemukan Caracter ";"
- setelah menemukan character "|" barulah blok command yang telah diterima semuanya di execute.
- DELIMITER ; berfungsi mengembalikan default End Charecter Execute MySQL

Conflic dengan VFP :
- Ketika VFP mempassing Variable cBatchCommand via SPT, ketiga baris perintah yang diakhiri Caracter ";" akan digabung jadi 1 baris, sehingga Blok Proses jadi gini :
    INSERT INTO test2 SET a2 = NEW.a1 DELETE FROM test3 WHERE a3 = NEW.a1 UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1 END

Nah Command tersebutlah yang tidak diterima MySQL, sehingga saya simpulkan semenjak sy pake MySQL Caracter ";" merupakan penyebab conflic SPT() VFP kepada MySQL.

Gimana Pak David ?
Seharusnya Pak DV lah yang menjelaskan kepada papa foxy sebagai senior saya dan telah expert banget dengan MySQL, saya malah kuatir kalo2 penjelasan saya tersebut salah coz yang baca Foxer se Indonesia....hehehe
« Last Edit: April 09, 2009, 07:40:54 PM by armen_sakti »

Offline davidmustakim

  • Fox-id M.V.P
  • Hero Member
  • *
  • Posts: 14.053
  • Awas ya...
Re: Create trigger lewat vfp
« Reply #6 on: April 09, 2009, 08:52:55 PM »
@armen: tadi saya sekedar buktikan dan sekarang @rnd udah konfirmasi bahwa SPT bisa, dan Trigger bisa simple kalau memang harus simple...  jadi udah ga usah saya berpanjang lebar lagi kan?  selebihnya ada text to / textmerge... daripada didebatin baiknya dilihat per kasus aja nantinya, ga mungkinlah VFP harus KO cuman masalah delimiter, bukankah: VFP rocks ! ... ato udah mulai sangsi VFP ya ... hehehe
« Last Edit: April 09, 2009, 08:57:08 PM by davidmustakim »

Offline rnd

  • Hero Member
  • *
  • Posts: 1.284
Re: Create trigger lewat vfp
« Reply #7 on: April 09, 2009, 09:02:56 PM »
benar pa David, saya sudah coba dan berhasil, masalahnya lebih ke kata pa Foxy, pada usernya saya udah ganti ke root jadi bisa

fl_kn=sqlstringconnect("&fc_kon")
 TEXT TO str1 NOSHOW
  CREATE TRIGGER ins_pr before insert on dist.prd0409 for each row
     begin
        update sbal09 set s_i01=s_i01-NEW.id_qkrt ;
        insert into scar09 SET c_qty = c_qty-NEW.id_qkrt;
     end
  ENDTEXT
  if SQLEXEC(fl_kn,str1) < 0
     gagal
else
   berhasil

penjelasan kenapa saya maunya dari dalam vfp, karena org install saya ngak ngerti, dan saya cuma kirim prg via email, jadi ketika program dijalankan, trigger akan terbentuk dengan sendirinya

thx untuk para master pa Foxy, pa Armen dan pa David

Offline armen_sakti

  • Fox-id M.V.P
  • Hero Member
  • *
  • Posts: 1.254
Re: Create trigger lewat vfp
« Reply #8 on: April 09, 2009, 09:50:26 PM »
Busyeeeeeeeeeeeet.. :angry1:

Saya hampir 4 th pake MySQL semenjak versi 4.xx rupanya saya slama ini tidak memperhatikan User Previlages, saya pikir kalo udah login sebagai root ya semua kebijakan sudah full access, saya heran kok multi line command untuk trigger pada pak ronald berhasil di pass via SPT? Ada apa dengan MySQL saya  ???

Uuuuuuh...barusan saya buka User managemen eh ternyata user root itu ada 2 yaitu root@% sebagai anywhere connecting dan root@ll sebgai localhost connecting.

RUPANYA, TERNYATA SLAMA INI SAYA LOGIN DI USER root@%  :sad3:
Shiiiiiit  :sad2:


DAN JIKA LOGIN DENGAN root@ll SEMUA SUDAH FULL ACCESS


Hehehehe slama ini saya udah yakin benar bahwa Create Trigger/SP/Function tidak bisa dilakukan via SPT VFP, makanya saya nulis diatas panjang lebar rupanya isinya NOL besar, ya itulah manfaat diskusi.

Special thank to rnd, dengan Thread anda telah membebaskan saya dari penjara keterbatasan VFP thd MySQL  :icon_salut:

Quote from: 'davidmustakim'
ga mungkinlah VFP harus KO cuman masalah delimiter, bukankah: VFP rocks ! ... ato udah mulai sangsi VFP ya ... hehehe

Heheheh iya pak karena dipenjara, membuat pandangan saya jadi terbatas pak TQ  :icon_salut:
Waduh ntar kwalat deh telah merendahkan VFP hehehe
« Last Edit: April 09, 2009, 09:54:01 PM by armen_sakti »

Offline davidmustakim

  • Fox-id M.V.P
  • Hero Member
  • *
  • Posts: 14.053
  • Awas ya...
Re: Create trigger lewat vfp
« Reply #9 on: April 09, 2009, 10:03:51 PM »
wah... saya turut berbahagia udah ketemu culprit / biang-keroknya... walaupun dari awal saya 100% yakin terus terang kalo ada "wong sakti" beda pendapat kita ini jadi mikir ( tanpa kata emang) ... uh apa yang salah ya dengan kita ini.... hehehe. Jadi udah CASE CLOSED and thanks atas posting terakhirnya. YOU ARE A BRAVE HONEST BIG MAN ( cocok jadi CALEG SEJATI) !!!