Senin, 04 Januari 2010

MS SQL : Store Procedure, Cursor and Others

CREATE Procedure sp_uAbsensi(@strKopeg varchar(15) ='KET-07070272',@iThn int = 2009,@iBln int =7)
As
Begin
Declare @Kondisi varchar(100)
Declare @Kond varchar(5)
Declare crKondisi cursor scroll for
Select KoAbs from KoAbs Where KoAbs <> 'K' and YTBayar='Y' and isnull(YTHKEff,'T')='T'
open crKondisi
set @Kondisi ='XX'
fetch first from crKondisi into @Kond
While @@fetch_status=0
Begin
Set @Kondisi =@Kondisi +','+''''+@Kond+''''
fetch Next from crKondisi into @Kond
End
close crKondisi
Deallocate crKondisi

if @Kondisi = 'XX' set @Kondisi='0' else set @Kondisi=replace(@Kondisi,'XX,','')
--print @Kondisi
--
Declare @Kopeg varchar(15),@Thn int,@Bln int
Declare @Jml Table (jumlah int)
Declare @intI int
Declare @strI varchar(2)
Declare @MySQL nvarchar(500)
Select @Kopeg=@strKopeg
Select @Thn=@iThn
Select @Bln=@iBln
set @intI=1
While @intI < 32
Begin
set @strI=convert(varchar(2),@intI)
if object_id('Tempdb..##JmlHadir') is not null drop table ##JmlHadir
Set @MySQL =' select isnull(sum(case when Tgl'+@strI + ' in ('+@Kondisi+') then 1 else 0 end '+
' ),0) as Jumlah into ##JmlHadir'+
' from mutabs b Inner Join mabs m on (b.Kode=m.Kode and b.NoBuk=m.Nobuk)'+
' where substring(b.KoPeg,1,3)=''KET'' and m.batal=0 and b.KoPeg='''+@Kopeg+''''+
' and b.Thn = '+convert(varchar(4),@Thn)+
' and b.Bln = '+convert(varchar(2),@Bln)

exec sp_executesql @MySQL
insert into @Jml select Jumlah from ##JmlHadir
set @intI =@intI+1
continue
End
if object_id('Tempdb..##JmlHadir') is not null drop table ##JmlHadir
Select sum(Jumlah) Jumlah into ##JmlHadir from @Jml
End

CREATE Procedure sp_uAbsensi1(@intHit int=1,@strKopeg varchar(15) ='KET-07070272',@iThn int = 2009,@iBln int =7)
As
Begin
Declare @Kondisi varchar(100)
Declare @Kond varchar(5)
Declare crKondisi cursor scroll for
Select KoAbs from KoAbs Where KoAbs <> 'K' and YTBayar='Y' and isnull(YTHKEff,'T')='T'
open crKondisi
set @Kondisi ='XX'
fetch first from crKondisi into @Kond
While @@fetch_status=0
Begin
Set @Kondisi =@Kondisi +','+''''+@Kond+''''
fetch Next from crKondisi into @Kond
End
close crKondisi
Deallocate crKondisi
if @Kondisi = 'XX' set @Kondisi='0' else set @Kondisi=replace(@Kondisi,'XX,','')
--
Declare @Kopeg varchar(15),@Thn int,@Bln int
Declare @Jml Table (jumlah int)
Declare @intI int
Declare @strI varchar(2)
Declare @MySQL nvarchar(500)
Select @Kopeg=@strKopeg
Select @Thn=@iThn
Select @Bln=@iBln
set @intI=@intHit
While @intI < 32
Begin
set @strI=convert(varchar(2),@intI)
if object_id('Tempdb..##JmlHadir1') is not null drop table ##JmlHadir1
Set @MySQL =' select isnull(sum(case when Tgl'+@strI + ' in ('+@Kondisi+') then 1 else 0 end '+
' ),0) as Jumlah into ##JmlHadir1'+
' from mutabs b Inner Join mabs m on (b.Kode=m.Kode and b.NoBuk=m.Nobuk)'+
' where substring(b.KoPeg,1,3)=''KET'' and m.batal=0 and b.KoPeg='''+@Kopeg+''''+
' and b.Thn = '+convert(varchar(4),@Thn)+
' and b.Bln = '+convert(varchar(2),@Bln)
exec sp_executesql @MySQL
insert into @Jml select Jumlah from ##JmlHadir1
set @intI =@intI+1
continue
End
if object_id('Tempdb..##JmlHadir1') is not null drop table ##JmlHadir1
Select sum(Jumlah) Jumlah into ##JmlHadir1 from @Jml
End

CREATE Procedure sp_uAbsensi12(@intHit1 int=1,@intHit2 int=31,@strKopeg varchar(15) ='KET-07070272',@iThn int = 2009,@iBln int =7)
As
Begin
Declare @Kondisi varchar(100)
Declare @Kond varchar(5)
Declare crKondisi cursor scroll for
Select KoAbs from KoAbs Where KoAbs <> 'K' and YTBayar='Y' and isnull(YTHKEff,'T')='T'
open crKondisi
set @Kondisi ='XX'
fetch first from crKondisi into @Kond
While @@fetch_status=0
Begin
Set @Kondisi =@Kondisi +','+''''+@Kond+''''
fetch Next from crKondisi into @Kond
End
close crKondisi
Deallocate crKondisi
if @Kondisi = 'XX' set @Kondisi='0' else set @Kondisi=replace(@Kondisi,'XX,','')
--
Declare @Kopeg varchar(15),@Thn int,@Bln int
Declare @Jml Table (jumlah int)
Declare @intI int
Declare @strI varchar(2)
Declare @MySQL nvarchar(500)
Select @Kopeg=@strKopeg
Select @Thn=@iThn
Select @Bln=@iBln
set @intI=@intHit1
While @intI < @intHit2
Begin
set @strI=convert(varchar(2),@intI)
if object_id('Tempdb..##JmlHadir12') is not null drop table ##JmlHadir12
Set @MySQL =' select isnull(sum(case when Tgl'+@strI + ' in ('+@Kondisi+') then 1 else 0 end '+
' ),0) as Jumlah into ##JmlHadir12'+
' from mutabs b Inner Join mabs m on (b.Kode=m.Kode and b.NoBuk=m.Nobuk)'+
' where substring(b.KoPeg,1,3)=''KET'' and m.batal=0 and b.KoPeg='''+@Kopeg+''''+
' and b.Thn = '+convert(varchar(4),@Thn)+
' and b.Bln = '+convert(varchar(2),@Bln)
exec sp_executesql @MySQL
insert into @Jml select Jumlah from ##JmlHadir12
set @intI =@intI+1
continue
End
if object_id('Tempdb..##JmlHadir12') is not null drop table ##JmlHadir12
Select sum(Jumlah) Jumlah into ##JmlHadir12 from @Jml
End

CREATE Procedure sp_uAbsensi2(@intHit int=31,@strKopeg varchar(15) ='KET-07070272',@iThn int = 2009,@iBln int =7)
As
Begin
Declare @Kondisi varchar(100)
Declare @Kond varchar(5)
Declare crKondisi cursor scroll for
Select KoAbs from KoAbs Where KoAbs <> 'K' and YTBayar='Y' and isnull(YTHKEff,'T')='T'
open crKondisi
set @Kondisi ='XX'
fetch first from crKondisi into @Kond
While @@fetch_status=0
Begin
Set @Kondisi =@Kondisi +','+''''+@Kond+''''
fetch Next from crKondisi into @Kond
End
close crKondisi
Deallocate crKondisi
if @Kondisi = 'XX' set @Kondisi='0' else set @Kondisi=replace(@Kondisi,'XX,','')
--
Declare @Kopeg varchar(15),@Thn int,@Bln int
Declare @Jml Table (jumlah int)
Declare @intI int
Declare @strI varchar(2)
Declare @MySQL nvarchar(500)
Select @Kopeg=@strKopeg
Select @Thn=@iThn
Select @Bln=@iBln
set @intI=1
While @intI < @intHit+1
Begin
set @strI=convert(varchar(2),@intI)
if object_id('Tempdb..##JmlHadir2') is not null drop table ##JmlHadir2
Set @MySQL =' select isnull(sum(case when Tgl'+@strI + ' in ('+@Kondisi+') then 1 else 0 end '+
' ),0) as Jumlah into ##JmlHadir2'+
' from mutabs b Inner Join mabs m on (b.Kode=m.Kode and b.NoBuk=m.Nobuk)'+
' where substring(b.KoPeg,1,3)=''KET'' and m.batal=0 and b.KoPeg='''+@Kopeg+''''+
' and b.Thn = '+convert(varchar(4),@Thn)+
' and b.Bln = '+convert(varchar(2),@Bln)
exec sp_executesql @MySQL
insert into @Jml select Jumlah from ##JmlHadir2
set @intI =@intI+1
continue
End
if object_id('Tempdb..##JmlHadir2') is not null drop table ##JmlHadir2
Select sum(Jumlah) Jumlah into ##JmlHadir2 from @Jml
End

CREATE Procedure sp_uAbsensi3(@strKopeg varchar(15) ='KET-07070272',@iThn int = 2009,@iBln1 int =1,@iBln2 int =12)
As
Begin
Declare @Jml Table (jumlah int)
Declare @intI int
set @intI=@iBln1

if @iBln1 = @iBln2
begin
Exec sp_uAbsensi @strKopeg,@iThn,@intI
insert into @Jml select Jumlah from ##JmlHadir
end
else
begin
While @intI <@iBln2+1
Begin
Exec sp_uAbsensi @strKopeg,@iThn,@intI
insert into @Jml select Jumlah from ##JmlHadir
set @intI=@intI+1
continue
End
end

if object_id('Tempdb..##JmlHadir3') is not null drop table ##JmlHadir3
Select sum(Jumlah) Jumlah into ##JmlHadir3 from @Jml
End

CREATE Procedure sp_uAbsensi4(@intHit1 int=1,@intHit2 int=31,@strKopeg varchar(15) ='KET-07070272',@iThn int = 2009,@iBln1 int =1,@iBln2 int =12)
As
Begin
Declare @Jml Table (jumlah int)
Declare @intI int

--if @iBln2 >@iBln1
--Begin
Exec sp_uAbsensi1 @intHit1,@strKopeg,@iThn,@iBln1
insert into @Jml select Jumlah from ##JmlHadir1
set @intI=@iBln1+1
While @intI <@iBln2
Begin
Exec sp_uAbsensi @strKopeg,@iThn,@intI
insert into @Jml select Jumlah from ##JmlHadir
set @intI=@intI+1
continue
End

Exec sp_uAbsensi2 @intHit2,@strKopeg,@iThn,@iBln2
insert into @Jml select Jumlah from ##JmlHadir2
--End

if object_id('Tempdb..##JmlHadir4') is not null drop table ##JmlHadir4
Select sum(Jumlah) Jumlah into ##JmlHadir4 from @Jml
End

CREATE Procedure sp_uAbsensi5(@intHit1 int=1,@intHit2 int=31,@strKopeg varchar(15) ='KET-07070272',@iThn1 int = 2009,@iBln1 int=1,@iThn2 int = 2009,@iBln2 int=12)
As
Begin
Declare @Jml Table (jumlah int)
Declare @intI int
Declare @intY int

if @iThn1= @iThn2
Begin
if @iBln1= @iBln2
Begin
exec sp_uAbsensi12 @intHit1,@intHit2,@strKopeg,@iThn1,@iBln1
insert into @Jml select Jumlah from ##JmlHadir12
end
else
Begin
exec sp_uAbsensi4 @intHit1,@intHit2,@strKopeg,@iThn1,@iBln1,@iBln2
insert into @Jml select Jumlah from ##JmlHadir4
end
End
Else if @iThn2> @iThn1
Begin
set @intY =@iThn1
exec sp_uAbsensi4 @intHit1,31,@strKopeg,@iThn1,@iBln1,12
insert into @Jml select Jumlah from ##JmlHadir4
set @intY =@intY+1

While @intY < @iThn2
Begin
exec sp_uAbsensi3 @strKopeg,@intY,1,12
insert into @Jml select Jumlah from ##JmlHadir3
set @intY=@intY+1
continue
End

if @intY = @iThn2
Begin
exec sp_uAbsensi4 1,@intHit2,@strKopeg,@iThn2,@iBln1,@iBln2
insert into @Jml select Jumlah from ##JmlHadir4
set @intY =@intY+1
End
End
if object_id('Tempdb..##JmlHadir5') is not null drop table ##JmlHadir5
Select sum(Jumlah) Jumlah into ##JmlHadir5 from @Jml

End

CREATE Procedure sp_uAbsensiDet(@strKopeg varchar(15) ='KET-07070272',@iThn int = 2009,@iBln int =7,@Tgl int=1)
As
Begin
Declare @Kondisi varchar(100)
Declare @Kond varchar(5)
Declare crKondisi cursor scroll for
Select KoAbs from KoAbs Where KoAbs <> 'K' and YTBayar='Y' and isnull(YTHKEff,'T')='T'
open crKondisi
set @Kondisi ='XX'
fetch first from crKondisi into @Kond
While @@fetch_status=0
Begin
Set @Kondisi =@Kondisi +','+''''+@Kond+''''
fetch Next from crKondisi into @Kond
End
close crKondisi
Deallocate crKondisi
if @Kondisi = 'XX' set @Kondisi='0' else set @Kondisi=replace(@Kondisi,'XX,','')
--
Declare @Kopeg varchar(15),@Thn int,@Bln int
Declare @Jml Table (jumlah int)
Declare @intI int
Declare @strI varchar(2)
Declare @MySQL nvarchar(500)
Select @Kopeg=@strKopeg
Select @Thn=@iThn
Select @Bln=@iBln
set @intI=1
--While @intI < 32
--Begin
set @strI=convert(varchar(2),@Tgl)
if object_id('Tempdb..##JmlHadirDet') is not null drop table ##JmlHadirDet
Set @MySQL =' select isnull(sum(case when Tgl'+@strI + ' in ('+@Kondisi+') then 1 else 0 end '+
' ),0) as Jumlah into ##JmlHadirDet'+
' from mutabs b Inner Join mabs m on (b.Kode=m.Kode and b.NoBuk=m.Nobuk)'+
' where substring(b.KoPeg,1,3)=''KET'' and m.batal=0 and b.KoPeg='''+@Kopeg+''''+
' and b.Thn = '+convert(varchar(4),@Thn)+
' and b.Bln = '+convert(varchar(2),@Bln)
exec sp_executesql @MySQL
insert into @Jml select Jumlah from ##JmlHadirDet
--set @intI =@intI+1
--continue
--End
if object_id('Tempdb..##JmlHadirDet') is not null drop table ##JmlHadirDet
Select sum(Jumlah) Jumlah into ##JmlHadirDet from @Jml
End

Delphi - Single application instance

Source :http://www.ibrtses.com/delphi/singleinstance.html

Delphi - Single application instance
disclaimer
the source code of this page may not appear correctly in certain browsers
due to special characters. Have a look at the source of this HTML page
with notepad instead

Limiting an application to start just once per machine is usually required when an
external resource such as a Comport is accessed. This feature is achieved by allocation
of a global variable, such as a mutex.
The original version
Be the original application MyApp.dpr generated by Delphi as dpr file.

program MyApp;
uses
Windows,Forms,
MyApp1 in 'MyApp1.pas' {Form1};

{$R *.RES}

begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.


The single instance version
Do the following changes ( in bold ):

program MyApp;
uses
Windows,Forms,
MyApp1 in 'MyApp1.pas' {Form1};


var
Mutex : THandle;
{$R *.RES}

begin
Mutex := CreateMutex(nil, True, 'MyAppName');
if (Mutex <> 0) and (GetLastError = 0) then
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
if Mutex <> 0 then
CloseHandle(Mutex);
end;
end.


The application will only start once at a time without any further notice.
Any further attempts will be defeated.

A little addition, perhaps as modal notice, could notify the user
that only one is allowed at a time.


INGIN KERJA DARI RUMAH?