Sunday, July 30, 2006

Python and Oracle

Simple IN Parameterim
export cx_Oraclev_conn = cx_Oracle.connect("scott/tiger@oracledb")
v_cur = v_conn.cursor()
arg_1 = v_cur.var(cx_Oracle.NUMBER)
arg_2 = v_cur.var(cx_Oracle.NUMBER)
result = v_cur.execute("""BEGIN:
p_Value := 20;
f_test(:p_Value,:p_value_o);
END;""",p_Value = arg_1, p_Value_o = arg_2)
print "Hasil IN :", arg_1.getvalue()
print "Hasil OUT :", arg_2.getvalue()

Simple IN / OUT Parameter

import cx_Oracle

v_conn = cx_Oracle.connect("scott/tiger@oracledb")
v_cur = v_conn.cursor()
# make variable input
v_cur.setinputsizes(arg_in = cx_Oracle.NUMBER)
v_input = raw_input("Masukan Bilangan ? ")

# make variable out
arg_out = v_cur.var(cx_Oracle.NUMBER)
result = v_cur.execute("""BEGIN
f_test(:arg_in, :p_value_o);
END;""",
arg_in = v_input, #place variable here(text/inputan)
p_Value_o = arg_out)

print "Hasil Input : ", v_input
print "Hasil Out : ", arg_out.getvalue()


Simple Calling Function

import cx_Oracle

v_conn = cx_Oracle.connect("scott/tiger@oracledb")
v_cur = v_conn.cursor()

# make variable input
v_cur.setinputsizes(arg_in = cx_Oracle.NUMBER)
v_input = raw_input("Masukan Bilangan ? ")

# make variable out
arg_out = v_cur.var(cx_Oracle.NUMBER)
result = v_cur.execute("""BEGIN
:p_value_o := f_test1(:arg_in);
END;""",
arg_in = v_input, #place variable here(text/inputan)
p_Value_o = arg_out)

print "Hasil Input : ", v_input
print "Hasil Out : ", arg_out.getvalue()


Simple Bind Cursor
import cx_Oracle

v_conn = cx_Oracle.connect("scott/tiger@oracledb")
v_cur = v_conn.cursor()
v_cur.arraysize = 50

# make variable input
v_cur.setinputsizes(arg_in_1 = cx_Oracle.NUMBER)
v_cur.setinputsizes(arg_in_2 = cx_Oracle.NUMBER)
v_input_1 = raw_input("From Empno ? ")
v_input_2 = raw_input("To Empno ? ")

v_cur.execute("""
begin
open :p_Cursor for select empno, ename from emp
where empno between :arg_in_1 and :arg_in_2;
end;""",
arg_in_1 = v_input_1,
arg_in_2 = v_input_2,
p_Cursor = v_cur)
v_row = v_cur.fetchone()
while v_row != None:
print str(v_row[0]) + " : " +str(v_row[1])
v_row = v_cur.fetchone()


Simple Refcursor

CREATE OR REPLACE package pkg_TestOutCursors as

type udt_RefCursor is ref cursor;

procedure TestOutCursor (
a_MaxIntValue number,
a_Cursor out udt_RefCursor
);

end;
/

CREATE OR REPLACE package body pkg_TestOutCursors as

procedure TestOutCursor (
a_MaxIntValue number,

a_Cursor out udt_RefCursor
) is
begin
open a_Cursor for
select
IntCol,
StringCol
from TestStrings
where IntCol <= a_MaxIntValue
order by IntCol;
end;

end;
/
import cx_Oracle

v_conn = cx_Oracle.connect("cx_oracle/dev@oracledb")
v_cur = v_conn.cursor()
v_cur.arraysize = 50

# make variable input
v_input_1 = raw_input("From Empno ? ")

v_cur.callproc("pkg_TestOutCursors.TestOutCursor", (v_input_1, v_cur))
v_row = v_cur.fetchone()
while v_row != None:
print str(v_row[0]) + " : " +str(v_row[1])
v_row = v_cur.fetchone()

Sunday, July 23, 2006

Calling Oracle Stored Procedures with PHP

Menarik untuk dicoba bagaimana PHP dapat memanggil Oracle Store Procedure dengan memakai Parameter IN / OUT.

Saya Mulai dengan Simple Store Procedure yang ada Parameter IN dan OUT

SQL> connect scott/tiger@oracledb;
Connected.
SQL> CREATE OR REPLACE PROCEDURE
2 sayHello (name IN VARCHAR2, greeting OUT VARCHAR2)
3 AS
4 BEGIN
5 greeting := 'Hello ' || name;
6 END;
7 /

Procedure created.

Kita Panggil Store procedure dari PHP

$conn = oci_connect('SCOTT','TIGER','ORACLEDB') or die;


$sql = 'BEGIN sayHello(:name, :message); END;';

$stmt = oci_parse($conn,$sql);

// Bind the input parameter
oci_bind_by_name($stmt,':name',$name,32);

// Bind the output parameter
oci_bind_by_name($stmt,':message',$message,32);

// Assign a value to the input
$name = ' I am OUT Parameter ';

oci_execute($stmt);

// $message is now populated with the output value
print "$message\n";
?>

Query Absensi

Query Absensi
Lanjutan Program Absensi yang telah saya buat ada article menarik dari indodba.net tentang query absensi.

Bagaimana cara membuat query absensi dengan table seperti ini :

NOINDUK CODE TANGGAL
------- ---- -------------------
001 A 21-07-2004 06:00:00
001 B 21-07-2004 17:30:00
001 A 22-07-2004 06:00:00
001 A 23-07-2004 07:00:00
001 A 23-07-2004 07:15:00
001 B 24-07-2004 17:30:00

Untuk menyatakan masuk dan keluarnya karyawan dinyatakan dengan nilai
CODE, yaitu A = masuk dan B = Keluar
Terkadang dalam satu hari seorang karyawan mempunyai nilai A dan B.
Tetapi kadang hanya ada nilai A saja atau B saja.
Bagaimana cara membuat querynya hingga membentuk format seperti ini

NOINDUK TANGGAL JAM_MASUK JAM_KELUAR
------- ---------- --------- ----------
001 21-07-2004 06:00:00 17:30:00
001 22-07-2004 06:00:00
001 23-07-2004 07:00:00
001 24-07-2004 17:30:00


Terima Kasih



Answer :

Untuk membuat query seperti yang diinginkan membutuhkan
table bantuan yang berisi daftar tanggal-tanggal.
Berikut ini simulasi query absensi :

drop table karyawan cascade constraint;
create table karyawan(
noinduk varchar2(5) primary key,
nama varchar2(30));
drop table data_real cascade constraint;
create table data_real(
noinduk varchar2(5),
code varchar2(1),
tanggal date);
insert into karyawan values('001','AGUS');
insert into karyawan values('002','HERMAN');
insert into karyawan values('003','AGUNG');
commit;
/* Untuk karyawan 001 */
insert into data_real
values('001','A',to_date('01/06/04 07:30','dd/mm/yy hh24:mi'));
insert into data_real
values('001','A',to_date('01/06/04 07:45','dd/mm/yy hh24:mi'));
insert into data_real
values('001','B',to_date('01/06/04 17:00','dd/mm/yy hh24:mi'));
insert into data_real
values('001','B',to_date('01/06/04 17:05','dd/mm/yy hh24:mi'));

insert into data_real
values('001','A',to_date('02/06/04 06:30','dd/mm/yy hh24:mi'));
insert into data_real
values('001','B',to_date('02/06/04 16:00','dd/mm/yy hh24:mi'));

insert into data_real
values('001','B',to_date('03/06/04 17:00','dd/mm/yy hh24:mi'));

/* Untuk karyawan 002 */
insert into data_real
values('002','A',to_date('01/06/04 06:55','dd/mm/yy hh24:mi'));
insert into data_real
values('002','A',to_date('01/06/04 07:00','dd/mm/yy hh24:mi'));

insert into data_real
values('002','A',to_date('02/06/04 07:00','dd/mm/yy hh24:mi'));
insert into data_real
values('002','B',to_date('02/06/04 17:00','dd/mm/yy hh24:mi'));
insert into data_real
values('002','B',to_date('02/06/04 17:15','dd/mm/yy hh24:mi'));

insert into data_real
values('002','B',to_date('03/06/04 15:00','dd/mm/yy hh24:mi'));

/* Untuk karyawan 003 */
insert into data_real
values('003','A',to_date('01/06/04 07:00','dd/mm/yy hh24:mi'));
insert into data_real
values('003','B',to_date('01/06/04 17:00','dd/mm/yy hh24:mi'));

insert into data_real
values('003','A',to_date('02/06/04 06:30','dd/mm/yy hh24:mi'));
insert into data_real
values('003','B',to_date('02/06/04 16:00','dd/mm/yy hh24:mi'));

insert into data_real
values('003','A',to_date('03/06/04 06:30','dd/mm/yy hh24:mi'));
insert into data_real
values('003','B',to_date('03/06/04 17:00','dd/mm/yy hh24:mi'));
commit;

Berikut ini adalah daftar tanggal-tanggal yang nantinya
akan dijoinkan pada table DATA_REAL.

drop table my_date;
create table my_date(tanggal date);
declare
tgl_awal date;
begin
tgl_awal := to_date('01/01/02','dd/mm/yy');
for i in 1..5000 loop
insert into my_date values(tgl_awal+i);
end loop;
end;
/
commit;

Dan querynya menjadi seperti ini :

select a1.noinduk,
a1.tanggal,
min(a1.jam_masuk) as jam_masuk,
max(a1.jam_keluar) as jam_keluar
from (
select a.noinduk,
a.code,
trunc(a.tanggal) as tanggal,
decode(a.code,'A',to_char(a.tanggal,'hh24:mi:ss'),null) as jam_masuk,
decode(a.code,'B',to_char(a.tanggal,'hh24:mi:ss'),null) as jam_keluar
from data_real a, my_date b
where trunc(a.tanggal) = b.tanggal
) a1
group by a1.noinduk, a1.tanggal;

NOINDUK TANGGAL JAM_MASUK JAM_KELUAR
------- --------- --------- -----------
001 01-JUN-04 07:30:00 17:05:00
001 02-JUN-04 06:30:00 16:00:00
001 03-JUN-04 17:00:00
002 01-JUN-04 06:55:00
002 02-JUN-04 07:00:00 17:15:00
002 03-JUN-04 15:00:00
003 01-JUN-04 07:00:00 17:00:00
003 02-JUN-04 06:30:00 16:00:00
003 03-JUN-04 06:30:00 17:00:00

Membuat Program Absensi

Setelah mengetahui bagaimana cara oracle forms menyimpan Image sekarang kita coba untuk membuat program absensi, Intinya program ini akan mengambil data pegawai beserta gambarnya dan akan menyimpan jam masuk dan jam keluar.


Kalau kita lihat program absensi di atas untuk untuk menampilkan jam saya menggunakan TIMER oracle form, dan ada juga penggunaan OLE untuk ngeluarin sound (Fungsi soundnya saya dapat dari Internet tapi lupa di mana linknya !!!, Maaf yang punya fungsi ini saya pake yah ) yang keluar “Thank You” kalau anda terdaftar sebagai pegawai.

Ini Fungsi untuk Soundnya :
FUNCTION speak(Text IN varchar2, Speed IN number DEFAULT 150) RETURN boolean IS
DirectSS ole2.obj_type;
ArgList ole2.obj_type;
Speaking number;
BEGIN

if Text is null then
return FALSE;
end if;

-- Create Microsoft Direct Speech Synthesis Control Object
DirectSS := OLE2.create_obj('Speech.VoiceText');

-- Register application
ArgList := ole2.create_arglist;
ole2.add_arg(ArgList, 'Oracle');
ole2.add_arg(ArgList, 'Forms');
ole2.invoke(DirectSS, 'Register', ArgList);
ole2.destroy_arglist(ArgList);

-- Set control properties
ole2.set_property(DirectSS, 'SuppressExceptions', 1);
ole2.set_property(DirectSS, 'Enabled', 1);
ole2.set_property(DirectSS, 'Initialized', 1);
ole2.set_property(DirectSS, 'Speed', Speed);

-- Start speaking
ArgList := ole2.create_arglist;
ole2.add_arg(ArgList, Text);
ole2.add_arg(ArgList, 0);
ole2.invoke(DirectSS, 'Speak', ArgList);
ole2.destroy_arglist(ArgList);

-- Check speaking state
Speaking := ole2.get_num_property(DirectSS, 'IsSpeaking');

ole2.release_obj(DirectSS);
return Speaking=1;

EXCEPTION
when OTHERS then
return FALSE;
END;

Silahkan kirim email ke dadin_dj@yahoo.co.id untuk dapatkan source code nya.

Mudah2an membantu

Menyimpan File Image di Oracle Forms

Bagi yang sedang belajar Oracle Forms seperti saya biasanya penasaran bagaimana caranya Oracle forms bisa menampilkan Image dan apakah image itu bisa di disimpan di dalam Database. Oracle forms bisa menampilkan Image dengan 2 cara yaitu :
1. Dari Database item
2. File System
Gambar di bawah ini saya buat dengan cara pertama dimana image disimpan di database. Untuk cara ke 2 menyusul yach ngantuk berat nih… zzzz zzzzz zzzzzzz.



Procedure Load Image
DECLARE
dir_name VARCHAR2(255);
v_filename VARCHAR2(255);
BEGIN
tool_env.GetVar('Photo',dir_name);
dir_name := dir_name||'\Payroll\Photo';
v_filename := Get_File_Name(dir_name,NULL,'BMP File (*.Bmp) | *.Bmp|');
if v_filename IS NOT NULL THEN
READ_IMAGE_FILE(v_filename, 'BMP', 'Karyawan_mst.Photo');
END IF;

END;

Silahkan kirim email ke dadin_dj@yahoo.co.id untuk dapatkan source code nya.

Mudah2an membantu

Friday, July 21, 2006

Dynamic Where di Oracle Report

SELECT ALL EMP.EMPNO, EMP.ENAME,
EMP.JOB, EMP.MGR, EMP.HIREDATE, EMP.SAL, EMP.COMM, EMP.DEPTNO
FROM EMP

BUAT USER PARAMETER
P_CON INITIAL VALUE 1=1
P_CON1 INITIAL VALUE 1=1

EDIT SELECT SEPERTI DIBAWAH
SELECT ALL EMP.EMPNO, EMP.ENAME,
EMP.JOB, EMP.MGR, EMP.HIREDATE, EMP.SAL, EMP.COMM, EMP.DEPTNO
FROM EMP
WHERE (&P_CON OR EMP.EMPNO = :P_EMPNO) AND
(&P_CON1 OR EMP.ENAME = :P_ENAME)

DI AFTER PARAMETER FORM

function AfterPForm return boolean is
begin
IF :P_EMPNO is not null then
:p_con := '1=0';
END IF;
IF :P_ENAME is not null then
:p_con1 := '1=0';
END IF;

return (TRUE);
end;

Getting First day and Last day in Oracle

SELECT trunc(to_date('102005', 'MMYYYY'), 'MM') FIRST_DAY ,
LAST_DAY(TO_DATE('102005','MMYYYY')) LAST_DAY
FROM DUAL

Thursday, July 20, 2006

My Projects

Main Menu


POS

Membuat Label Barcode

Membuat Label Barcode
Untuk dapat membuat label barcode seperti di bawah ini caranya gampang :


1. Install Free font code39
2. Buat di Oracle Report


Kalau ada yang perlu source silahkan email saya dadin_tea@yahoo.co.id

Print Report to Excel

Print Report to Excel
Terkadang user ingin menampilkan laporan ke dalam bentuk excel. Ada beberapa cara untuk menampilkah data ke dalam format excel bisa pake TEXT_IO atau dengan memakai perintah HOST. Kalau saya lebih suka dengan memakai cara ke dua karena disamping data bisa ditampilkan ke dalam format excel juga bisa di tampilkan ke format aslinya yaitu report builder.

– Procedure Print to Excell / Report Builder
DECLARE
PL_ID ParamList ;
txtParam VARCHAR2(1000);
v_report_date Varchar2(100) := null;
temp_file varchar2(300) := null;
BEGIN
temp_file := ‘c:\WINNT\TEMP’;
v_report_date := to_char(sysdate,’yymmddhh24miss’);

PL_ID := Get_Parameter_List(’TMPDATA’);
If NOT ID_NULL(PL_ID) Then
Destroy_Parameter_List(PL_ID) ;
End If;
PL_ID := Create_Parameter_List(’TMPDATA’);

Add_Parameter(PL_ID, ‘P_DR_TANGGAL’,TEXT_PARAMETER, :SLS_RPT.DR_TANGGAL);
Add_Parameter(PL_ID, ‘P_SD_TANGGAL’,TEXT_PARAMETER, :SLS_RPT.SD_TANGGAL);
Add_Parameter(PL_ID, ‘PARAMFORM’,TEXT_PARAMETER, ‘NO’);

IF :SLS_RPT.EXCEL = ‘N’ THEN
– Print to report builder
Run_Product(REPORTS, v_report_name, SYNCHRONOUS, RUNTIME, FILESYSTEM, pl_id, NULL);
ELSE
– Print to Excel
add_parameter(PL_ID,’desformat’, text_parameter,’html’);
add_parameter(PL_ID,’desname’ ,text_parameter, temp_file ||v_report_date||’.html’);
add_parameter(PL_ID,’destype’, text_parameter, ‘file’);

run_product(reports, v_report_name, synchronous, runtime, filesystem, PL_ID, Null);
host(’C:\Program Files\Microsoft Office\Office10\EXCEL.EXE ‘|| temp_file ||v_report_date||’.html’);
END IF;

END;