Share this topic on FacebookShare this topic on MySpaceShare this topic on Del.icio.usShare this topic on DiggShare this topic on StumbleUponShare this topic on TwitterShare this topic on GoogleShare this topic on Yahoo

Author Topic: TOOL & TIPS membuat dan menyimpan menu ke mysql  (Read 417 times)

0 Members and 1 Guest are viewing this topic.

Offline onytoo

  • Fox-id M.V.P
  • Junior Member
  • *
  • Thank You
  • -Given: 7
  • -Receive: 45
  • Posts: 230
TOOL & TIPS membuat dan menyimpan menu ke mysql
« on: January 22, 2010, 01:46:00 PM »

Halo sobat2 fox-id  :toothy4:

Saya bikin sebuah tool (program kecil) untuk membuat dan menyimpan menu ke tabel mysql.
Tool ini saya attach beserta project demo penggunaannya menggunakan kontrol activex treeview.

Ini kode mentahnya:

Code: [Select]

**************************************************
*-- Form:         frmdemo (d:\_fox_id\demomenu\form_demo.scx)
*-- ParentClass:  form
*-- BaseClass:    form
*-- Time Stamp:   01/22/10 12:48:06 PM
*
DEFINE CLASS frmdemo AS form


Height = 462
Width = 656
ShowWindow = 2
DoCreate = .T.
AutoCenter = .T.
Caption = "Demo Menu"
BackColor = RGB(166,57,100)
withmouse = .F.
nodeenter = .F.
mysqlcon = 0
Name = "frmDemo"


ADD OBJECT shpback AS shape WITH ;
Top = 0, ;
Left = 0, ;
Height = 440, ;
Width = 238, ;
Anchor = 7, ;
BorderStyle = 0, ;
BackColor = RGB(219,162,177), ;
Name = "shpBack"


ADD OBJECT otreeview AS olecontrol WITH ;
Top = 4, ;
Left = 4, ;
Height = 432, ;
Width = 230, ;
Anchor = 7, ;
Name = "oTreeView"


ADD OBJECT oimagelist AS olecontrol WITH ;
Top = 14, ;
Left = 238, ;
Height = 100, ;
Width = 100, ;
Name = "oImageList"


ADD OBJECT ostatusbar AS olecontrol WITH ;
Top = 440, ;
Left = 0, ;
Height = 22, ;
Width = 656, ;
Align = 2, ;
Name = "oStatusBar"


PROCEDURE showmenu
#define COLOR_PANEL RGB(219,162,177)
#define COLOR_LABEL RGB(144,7,61)

WITH this

LOCAL lcAlias, oNode, lcTeks, lcKey, lcParent

m.lcAlias = SELECT()

=SQLEXEC(.mysqlcon, "SELECT * FROM my_menu", "my_menu")

IF !USED('my_menu')
RETURN
ENDIF

SELECT my_menu

WITH .oTreeView

.Nodes.Clear()
.SelectedItem = .NULL.

SCAN

m.lcKey = '_' + TRANSFORM(my_menu.id)
m.lcTeks = ALLTRIM(my_menu.title)
m.lcParent = '_' + TRANSFORM(my_menu.id_parent)

IF my_menu.is_header = 1

IF my_menu.id_parent = 0

m.loNode = .Nodes.Add(, 1, m.lcKey, m.lcTeks, "fclose")
WITH m.loNode
.ExpandedImage = "fopen"
.Bold = .T.
.Expanded = .T.
.BackColor = COLOR_PANEL
.ForeColor = COLOR_LABEL
ENDWITH

ELSE

m.loNode = .Nodes.Add(m.lcParent, 4, m.lcKey, m.lcTeks, "fclose")
WITH m.loNode
.ExpandedImage = "fopen"
.Bold = .T.
.BackColor = COLOR_PANEL
ENDWITH

ENDIF

ELSE

IF this.Authorized(my_menu.id)

m.lnGroup = my_menu.group

DO CASE
CASE m.lnGroup = 1
m.lcIcon = "master"

CASE m.lnGroup = 2
m.lcIcon = "trans"

CASE m.lnGroup = 3
m.lcIcon = "report"

CASE m.lnGroup = 4
m.lcIcon = "tools"

ENDCASE

IF my_menu.id_parent = 0

m.loNode = .Nodes.Add(, 1, m.lcKey, m.lcTeks, m.lcIcon)
m.loNode.BackColor = COLOR_PANEL

ELSE

m.loNode = .Nodes.Add(m.lcParent, 4, m.lcKey, m.lcTeks, m.lcIcon)
m.loNode.BackColor = COLOR_PANEL

IF !EMPTY(my_menu.command)

IF my_menu.is_report = 0

m.loNode.Tag = "DO FORM " + ALLTRIM(my_menu.command)

ELSE

m.loNode.Tag = "REPORT FORM " + ALLTRIM(my_menu.command)

ENDIF

ELSE

m.loNode.Tag = ''

ENDIF

ENDIF

ENDIF

ENDIF

ENDSCAN

m.loNode = .Nodes.Add(, 1, "_exit", "KELUAR", "logoff")
WITH m.loNode
.Bold = .T.
.BackColor = COLOR_PANEL
.ForeColor = COLOR_LABEL
ENDWITH

ENDWITH

ENDWITH

USE IN my_menu

SELECT (lcAlias)
ENDPROC


PROCEDURE authorized
LPARAMETERS tnID

*
* cek hak guna pemakai
*

RETURN .T.
ENDPROC


PROCEDURE Load
_screen.Visible = .F.
ENDPROC


PROCEDURE Unload
=SQLDISCONNECT(this.mysqlcon)
_screen.Visible = .T.
ENDPROC


PROCEDURE Init
#define GWL_STYLE -16
#define TVM_SETBKCOLOR 4381
#define TVM_GETBKCOLOR 4383
#define TVS_HASLINES 2

#define COLOR_PANEL RGB(219,162,177)

DECLARE LONG SendMessage IN WIN32API LONG, LONG, LONG, LONG
DECLARE LONG GetWindowLong IN WIN32API LONG, LONG
DECLARE LONG SetWindowLong IN WIN32API LONG, LONG, LONG

WITH this

* seting mysql sesuai server anda
.mysqlcon = SQLSTRINGCONNECT( ;
'DRIVER={MySQL ODBC 5.1 Driver};' + ;
'SERVER=localhost;' + ;
'DATABASE=tesdata;' + ;
'UID=root;' + ;
'PWD=;' ;
)

ENDWITH

* inisialiasi treeview
WITH this.oTreeView

LOCAL lnStyle

SendMessage(.hWnd, TVM_SETBKCOLOR, 0, COLOR_PANEL) 
m.lnStyle = GetWindowLong(.hWnd, GWL_STYLE)
SetWindowLong(.hWnd, GWL_STYLE, m.lnStyle - TVS_HASLINES)
SetWindowLong(.hWnd, GWL_STYLE, m.lnStyle)

.ImageList = this.oImageList
.Nodes.Clear()
.SelectedItem = .NULL.

ENDWITH

this.ShowMenu()
ENDPROC


PROCEDURE otreeview.NodeClick
LPARAMETERS Node

PUBLIC goContent, gcNodeKey
IF VARTYPE(m.gcNodeKey) != 'C'
m.gcNodeKey = ''
ENDIF

IF thisform.NodeEnter OR thisform.WithMouse
thisform.NodeEnter = .F.
thisform.WithMouse = .F.
m.lcKey = this.SelectedItem.Key
IF VARTYPE(m.goContent) == 'O' AND !ISNULL(m.goContent) AND (m.gcNodeKey != m.lcKey)
m.goContent.Release()
m.gcNodeKey = ''
ENDIF
IF m.lcKey == "_exit"
IF MESSAGEBOX("Benar akan keluar?", 36, "Konfirmasi") = 6
CLEAR EVENTS
thisform.Release()
ENDIF
ELSE
IF !ISNULL(this.SelectedItem.Parent)
IF !EMPTY(this.SelectedItem.Tag)
IF m.gcNodeKey != m.lcKey
m.gcNodeKey = m.lcKey
m.lcCommand = this.SelectedItem.Tag
IF ATC("DO FORM", m.lcCommand) > 0
m.lcCommand = m.lcCommand + " NAME goContent NOSHOW"
&lcCommand
m.goContent.Move(thisform.shpBack.Width + 1, 0, thisform.Width - thisform.shpBack.Width - SYSMETRIC(3) * 2)
m.goContent.Visible = .T.
ELSE
IF !EMPTY(m.lcCommand)
&lcCommand
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC


PROCEDURE otreeview.KeyUp
LPARAMETERS keycode, shift

thisform.NodeEnter = (KeyCode == 13)
IF !ISNULL(this.SelectedItem) AND thisform.NodeEnter
NODEFAULT
RAISEEVENT(this, "NodeClick", this.SelectedItem)
ELSE
DODEFAULT(keycode, shift)
ENDIF
ENDPROC


PROCEDURE otreeview.MouseDown
LPARAMETERS button, shift, x, y

thisform.WithMouse = .T.
DODEFAULT(button, shift, x, y)
ENDPROC


ENDDEFINE
*
*-- EndDefine: frmdemo
**************************************************


**************************************************
*-- Form:         frmchoice (d:\_fox_id\demomenu\form_choice.scx)
*-- ParentClass:  form
*-- BaseClass:    form
*-- Time Stamp:   01/22/10 12:37:02 PM
*
DEFINE CLASS frmchoice AS form


Top = 0
Left = 0
Height = 250
Width = 375
ShowWindow = 1
DoCreate = .T.
BorderStyle = 1
Caption = "Form1"
MaxButton = .F.
MinButton = .F.
Movable = .F.
Name = "frmChoice"


PROCEDURE Init
LPARAMETERS tcCaption

this.Caption = m.tcCaption
ENDPROC


ENDDEFINE
*
*-- EndDefine: frmchoice
**************************************************


**************************************************
* createmenu.prg
**************************************************
* ubah sesuai setingan mysql server masing-masing
mysqlcon = SQLSTRINGCONNECT( ;
'DRIVER={MySQL ODBC 5.1 Driver};' + ;
'SERVER=localhost;' + ;
'DATABASE=tesdata;' + ;
'UID=root;' + ;
'PWD=;' ;
)

=SQLEXEC(mysqlcon, "DELETE FROM my_menu")
=SQLEXEC(mysqlcon, "ALTER TABLE my_menu AUTO_INCREMENT=1")

#define GRP_MASTER  1
#define GRP_TRANS   2
#define GRP_REPORT  3
#define GRP_TOOLS   4

m.lnId = 0

*
* CONTOH untuk menyusun menu item
*

lnHeader = _HDR("MASTER", 0, GRP_MASTER)
lnItem = _ITM("Kota", lnHeader, "form_choice with 'Data Kota'")
lnItem = _ITM("Bank", lnHeader, "form_choice with 'Data Bank'")
lnItem = _ITM("Periode Katalog", lnHeader, "form_choice with 'Katalog'")
lnItem = _ITM("Produk", lnHeader, "form_choice with 'Data Produk'")
lnItem = _ITM("Supplier", lnHeader, "form_choice with 'Data Supplier'")
lnItem = _ITM("Member", lnHeader, "form_choice with 'Data Member'")

lnHeader = _HDR("TRANSAKSI", 0, GRP_TRANS)
lnItem = _ITM("Pesanan Member", lnHeader, "form_choice with 'Transaksi Pesanan Member'")
lnItem = _ITM("Pemesanan dan Pembelian", lnHeader, "form_choice with 'Transaksi Pemesanan & Pembelian'")
lnItem = _ITM("Penjualan", lnHeader, "form_choice with 'Transaksi Penjualan'")
lnItem = _ITM("Retur Pembelian/Penjualan", lnHeader, "form_choice with 'Transaksi Retur Pembelian/Penjualan'")
lnItem = _ITM("Kas", lnHeader, "form_choice with 'Transaksi Kas'")

lnHeader = _HDR("LAPORAN", 0, GRP_REPORT)

lnHeader = _HDR("KELENGKAPAN", 0, GRP_TOOLS)
lnItem = _ITM("Tukar Password", lnHeader, "form_choice with 'Tukar Password'")
lnItem = _ITM("Reindex Database", lnHeader, "form_choice with 'Reindex Database'")
lnItem = _ITM("Pengaturan Sistim", lnHeader, "form_choice with 'Pengaturan Sistim'")
lnItem = _ITM("Pengguna Sistim", lnHeader, "form_choice with 'Manajemen Pemakai'")

SQLDISCONNECT(mysqlcon)
RETURN

*
* fungsi untuk membuat menu header
*
* parameter:
* - tcDesc   : deskripsi menu item
* - tnParent : menu induk
* - tnGroup  : id group
*
FUNCTION _HDR(tcDesc, tnParent, tnGroup)
IF m.tnParent > 0
=SQLEXEC(mysqlcon, "SELECT * FROM my_menu WHERE id='" + TRANSFORM(m.tnParent) + "'", "my_menu")
m.lnGroup = my_menu.group
m.lnLevel = my_menu.level + 1
ELSE
m.lnGroup = m.tnGroup
m.lnLevel = 0
ENDIF
=SQLEXEC(mysqlcon, "INSERT INTO my_menu (`id_parent`,`group`,`title`,`command`,`is_header`,`is_report`,`level`)" + ;
" VALUES (" + ;
TRANSFORM(m.tnParent) + "," + ;
TRANSFORM(m.lnGroup) + ;
",'"+m.tcDesc+"'" + ;
",''" + ;
",'1'" + ;
",'0'," + ;
TRANSFORM(m.lnLevel) + ;
")", "my_menu")
m.lnID = m.lnID + 1
RETURN m.lnID
ENDFUNC

*
* fungsi untuk membuat menu item
*
* parameter:
* - tcDesc   : deskripsi menu item
* - tnParent : menu induk
* - tcCommand: nama form atau nama report
* - tlReport : .T. jika tcparam adalah report
*
FUNCTION _ITM(tcDesc, tnParent, tcCommand, tlReport)
=SQLEXEC(mysqlcon, "SELECT * FROM my_menu WHERE id='" + TRANSFORM(m.tnParent) + "'", "my_menu")
m.lnGroup = my_menu.group
m.lnLevel = my_menu.level + 1
=SQLEXEC(mysqlcon, "INSERT INTO my_menu (`id_parent`,`group`,`title`,`command`,`is_header`,`is_report`,`level`)" + ;
" VALUES (" + ;
TRANSFORM(m.tnParent) + "," + ;
TRANSFORM(m.lnGroup) + ;
",'"+m.tcDesc+"'" + ;
",'" + STRTRAN(m.tcCommand,"'", '"') + "'" + ;
",'0'" + ;
",'"+IIF(m.tlReport, '1', '0')+"'," + ;
TRANSFORM(m.lnLevel) + ;
")", "my_menu")
m.lnID = m.lnID + 1
RETURN m.lnID
ENDFUNC


buat database 'tesdata' di mysql  atau kalau mau buat saja di dalam database yang kamu pilih dan ini tabel menu-nya :

Code: [Select]

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for `my_menu`
-- ----------------------------
DROP TABLE IF EXISTS `my_menu`;
CREATE TABLE `my_menu` (
  `id` int(6) NOT NULL AUTO_INCREMENT,
  `id_parent` int(6) NOT NULL DEFAULT '0',
  `group` int(2) NOT NULL DEFAULT '1',
  `title` varchar(60) NOT NULL DEFAULT '',
  `command` longtext,
  `is_header` tinyint(1) NOT NULL DEFAULT '0',
  `is_report` tinyint(1) NOT NULL DEFAULT '0',
  `level` int(2) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8;


Untuk pertama kali jangan langsung jalankan projectnya, jalankan dulu file createmenu.prg untuk membuat menu, ubah item nya seperti contoh jika kamu inginkan.

Nah, file 'createmenu.prg' inilah tool yang saya maksud,  dan digunakan hanya ketika kita membuat menu, sebaiknya dibuat exclude pada projectnya. 

Semoga tool ini berguna bagi sobat2 ku semua. Maaf kalau tidak memuaskan, tapi kamu bisa memodifikasinya sesuai keinginan, dan dengan sedikit trik dan modifikasi kamu juga bisa memfilter menu item yang akan ditampilkan sesuai dengan hak akses pengguna aplikasi kamu, OK.  :thumbsup: