aku pernah bikin barang bagus nih : stored-procedure utk generate auto-kode.
silakan nikmati dulu DDL nya *penjelasan belakangan* :
-- Procedure "xp_autokode" DDL
CREATE [EMAIL PROTECTED] PROCEDURE `xp_autokode`(Mode tinyint,
Depan Varchar(20), Digit Tinyint, Tabel Varchar(255), Kolom Varchar(255))
BEGIN
DECLARE iLength long;
DECLARE iTmp long DEFAULT 1;
DECLARE sCekSatu varchar(255);
DECLARE sCekDua varchar(255);
DECLARE sTmp varchar(255);
DECLARE done int DEFAULT 0;
DECLARE cur CURSOR FOR SELECT Kode FROM VTmpKode;
DECLARE CONTINUE HANDLER FOR SQLState '02000' SET done = 1;
IF Mode = 0 THEN /*otomatis ngisi yang kosong*/
IF Digit > 0 THEN
DROP TABLE IF EXISTS VTmpKode;
CREATE TABLE VTmpKode
(
Kode varchar(255)
) ENGINE = HEAP;
SET @SQL = CONCAT('INSERT INTO VTmpKode(Kode) SELECT SUBSTRING(`',Kolom,'`
FROM (LENGTH("',Depan,'") + 1) FOR ',Digit,') as `Kode` FROM `',Tabel,'`
WHERE LEFT(`',Kolom,'`, Length("',Depan,'")) = "',Depan,'" AND
LENGTH(`',Kolom,'`) = (Length("',Depan,'") + ',Digit,') ORDER BY `',Kolom,'`
ASC');
/*SELECT @SQL;*/
PREPARE Query FROM @SQL;
EXECUTE Query;
OPEN Cur;
WHILE done <> 1 DO
FETCH CUR INTO sCekDua;
IF NOT done THEN
SET sCekSatu = CONCAT(REPEAT('0',(Digit - Length(iTmp))),iTmp);
IF sCekSatu = sCekDua THEN
SET iTmp = iTmp + 1;
SET sCekSatu = CONCAT(REPEAT('0',(Digit - Length(iTmp))),iTmp);
END IF;
END IF;
END WHILE;
CLOSE Cur;
IF sCekSatu IS NULL THEN SET sCekSatu = CONCAT(REPEAT('0',(Digit - 1)), 1);
END IF;
SELECT CONCAT(Depan,sCekSatu) INTO @Value ;
SELECT @Value as NewKode;
ELSE
SELECT '[MODE = AUTOFILL] DIGIT TIDAK BOLEH LEBIH KECIL DARI 1 !!!' as
Pesan;
END IF;
DROP TABLE IF EXISTS VTmpKode;
ELSE /*auto increment biasa*/
if digit > 0 then
SET @SQL = CONCAT(' SELECT
CONCAT("',Depan,'",LPAD(IFNULL(CAST(MAX(SUBSTR(',Kolom,',length("',Depan,'")+1,',
Digit,')) AS SIGNED),0)+1,',Digit,',0)) AS NewKode INTO @Value
FROM ',Tabel,
' WHERE LEFT(',Kolom,',LENGTH(',Kolom,')-',Digit,') =
"',Depan,'"');
PREPARE Query FROM @SQL;
EXECUTE Query;
SELECT @Value as NewKode;
else
SELECT '[MODE = AUTOINCREMENT] DIGIT TIDAK BOLEH LEBIH KECIL DARI 1 !!!' as
Pesan;
end if;
END IF;
END;
parameter dari tu SP adalah : mode, depan, digit, tabel, kolom
penjelasan :
> *mode :* isi 0 untuk generate kode AUTOFILL. dan isi 1 untuk generate kode
AUTOINCREMENT. ini istilah gua aja sih. ilustrasinya begini : misal ada data
001
002
003
006
007
maka, nilai AUTOFILL = 004 dan nilai AUTOINCREMENT = 008 (secara
autoincrement itu dalam DBMS algoritmanya adalah SELECT MAX(kolom) + 1 gtu
loh..)
> *depan :* adalah prefix.
> *digit :* jumlah digit nomor yg mo u generate
misal u mo generate kode dengan format "N/2008-00001234 dimana 2008 adalah
menunjukkan tahun, maka u bisa isi nilai parameter "depan" dengan
CONCAT('N/', Year(now())) dan nilai parameter "digit" dengan 8
> *tabel : *nama tabel
> *kolom : *nama kolom primary key yg mo u generate. utk nie
stored-procedure, gw mendefinisikan kolom harus bertipe VARCHAR. untuk kolom
bertipe numerik, gw bikin prosedur lain dengan nama *xp_autonumber* (mirip2
sih algoritmanya). klo ada yg mau, ntar ku posting deh..
cara manggilnya ?
berikut ini contohnya :
mysql> call xp_autokode(0,'001002',3,'tblwilayah','kode');
+-----------+
| NewKode |
+-----------+
| 001002004 |
+-----------+
1 row in set
mysql> call xp_autokode(1,'001002',3,'tblwilayah','kode');
+-----------+
| NewKode |
+-----------+
| 001002007 |
+-----------+
1 row in set
coba deh manfaatin procedure ku ini utk generate no faktur pajak loe..
semoga bisa membangkitkan inspirasi utk yg laen. hehehe.
NB : owya. platform DBMS gw ~ biasaa ~ MySQL 5 ^_^
--
wassalam,
*Rizky Prihanto*
http://www.software-arsitek.web.id
On 4/7/08, Didi wrote:
>
> Terima kasih atas bantuannya, maaf sebelumnya Mas/Mbak?
>
>
>
> _____
>
> On Behalf Of Lilis
> Sent: 03 April 2008 23:25
> Subject: Re: [indoprog-vb] Tanya: Angka + 1
>
>
> TXT_Nomor_Faktur_Pajak = LEFT(Data.Recordset!NSFP,11) & RIGHT("00000000"
> & 1 + RIGHT(Data.Recordset!NSFP,8),8)
>
> salam
> lilis
>
> [Non-text portions of this message have been removed]
>
>
>
>
[Non-text portions of this message have been removed]