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]

Kirim email ke