işlem zamanı mesai dışında ise yeniden tarihi hesapla

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
mustafasoy
Üye
Mesajlar: 154
Kayıt: 02 Ağu 2013 05:00
Konum: istanbul
İletişim:

işlem zamanı mesai dışında ise yeniden tarihi hesapla

Mesaj gönderen mustafasoy »

selamlar, sql server tarafında saat gün dakika kavramlarıyla kafam iyice allak bullak olmuş durumda
1.mesai başlangıç ve bitiş saatlerim var
2.üretim emiri oluştururken eğerki mesai saati dışında bir saate,dakikaya denk geliyorsa kaç saat,dakika mesai dışında ise bunu hesaplayarak ertesi gün mesai başlangıcı üzerine ilave ederek bir sonraki prosese başlangıç zamanını elde etmek istiyorum örneğin
mesai başlanıcı 08:00:00
mesai bitişi 19:00:00
işlem görecek miktar :100
işlem zamanı : 8 dakika
işleme başlayacak tarih : 01.01.2015 08:00:00
toplam işlem zamanı =800 dakika
bir gündeki çalışma zamanı = 660 dakika 08:00:00 -19:00:00 arası
bu durumda işlem zamanı 1 gun 140 dakika --> 1 gun 2 saat 20 dakika
dolayısıyla bir sonraki prosesin en erken başlangıç zamanı --> 01.01.2015 08:00:00 + 1 gun 2 saat 20 dakika = 02.01.2015 10:20:00 gibi olması lazım
sql tarafında çözmeye çalışıyorum fetch ile prosesleri ve işlem zamanları dönüyorum ve ilk olarak toplamta kaç gün kaç saat kaç dakika işlem göreceğini elde ediyorum ve başlangıç zamanının üzerine dakika , saat ve gün cinsinden ekliyorum sonra elde ettiğim zamanı mesai saat içindemi diye kontrol ediyorum
eğer mesai saat dışında ise mesai bitişinden kaç saat ve dakika fazla diye kontrol ediyorum ve ertesi gün başlangıç saatine ekliyorum
bu sefer yeni tarihi mesai saatinden yine fazla oluyor bunu engelleyemedim , bunun içinde fetch içinde tekrar while ile dönerek fark bulmaya çalıştım
mantık doğru işliyor ancak verdiği saatler anlamsız gelmeye başladı daha fazla devreleri yakmadan danışmak istedim

Kod: Tümünü seç

declare @modelkod varchar(50)= 'MM'
declare @xmiktar int =35
declare @mesbas datetime = (select top 1 firsttime from Urt_WorkTimeGlobal) -- mesai başlangıç saati
declare @mesbit datetime = (select top 1 lasttime  from Urt_WorkTimeGlobal) -- mesai bitiş saat
declare @xmesbas varchar(9) =' '+(select top 1 convert(varchar,firsttime,108) from Urt_WorkTimeGlobal) -- time sorunundan dolayı başlangıç
declare @xmesbit varchar(9) =' '+(select top 1 convert(varchar,LastTime, 108) from Urt_WorkTimeGlobal) -- time sorunundan dolayı bitiş
declare @mesaikontrol datetime
declare @tgun int, @tsaat int, @tdakika int  --toplam gun, saat, dakika ilgili proseste ne kadar işlem göreceği
declare @fgun int, @fsaat int, @fdakika int  --fark gun , saat , dakika mesai süresi sonunda iş bitmez ise ertesi güne nekadar ilave edileceğini hesaplar
declare @topmesdak int =datediff(MINUTE,@mesbas,@mesbit) -- bir günde toplam kaç dakika çalışılır
declare @artikgun int = 1440-@topmesdak -- gun bittiğinde ertesi gun mesai saatine kadar ilave edilecek değer
declare @miktar int , @bastar datetime , @proses varchar(5),@tzaman int,@bittar datetime,@artikzaman int -- cursor değişkenleri

DECLARE skodimlec CURSOR FOR  
					select /*p.Giren*/@xmiktar,cast(convert(varchar,p.TerminTar,104)+@xmesbas as datetime),mp.Proses,mp.PTime*@xmiktar  from Urt_Plan_gch p 
					left join model_p mp on mp.modelkod=p.SKOD
					where p.Mrptedariktipi=0  and mp.modelkod =@modelkod order by mp.ProsesNo -- işlem görecek model rotaya göre sıralanır
OPEN skodimlec
FETCH NEXT FROM skodimlec into @miktar,@bastar,@proses,@tzaman
WHILE @@FETCH_STATUS=0
BEGIN
		set @tgun			= @tzaman / @topmesdak 	
		set @tsaat			= @tzaman % @topmesdak / 60 
		set @tdakika		= @tzaman % @topmesdak % 60 
		set @bittar			= dateadd(MINUTE,@tzaman,@bastar)
		set @mesaikontrol	= convert(varchar,@bittar,104)+ @xmesbit 
		set @artikzaman=datediff(minute,convert(varchar,@bittar,104)+@xmesbit,@bittar)  	
		set @fgun		= @artikzaman / @topmesdak 
		set @fsaat		= @artikzaman % @topmesdak / 60
		set @fdakika	= @artikzaman % @topmesdak % 60
if (cast(@bittar as float) >cast(@mesbit as float)) or (cast(@bittar as float)<cast(@mesbas as float))
begin
	select @bastar as bastar,@bittar as bittar,@tgun as tgun,@tsaat as tsaat,@tdakika as tdakika,@fgun as fgun,@fsaat as fsaat,@fdakika as fdakika,@mesaikontrol
end
FETCH NEXT FROM skodimlec into @miktar,@bastar,@proses,@tzaman
set @bastar		= @bittar
END  
CLOSE skodimlec 
DEALLOCATE skodimlec

--3.proses 14.02.2015 17:40:00 + 3 gun 3 saat 45 dakika = 17.02.2015 21:25 --> 19:00 da mesai biter > 17.02.2015 19:00 > 145 dakika 2 saat 25 dakika > 15.02.2015 10:25 olur 
--4.proses 15.02.2015 10:25:00 + 4 gun 9 saat 5 dakika = 19.02.2015 19:30 -->  19:00 da mesai biter > 20.02.2015 19:00 > 30 dakika  > 30 dakika > 20.02.2015 08:30 olur

sorguda çok fazla oynadım sadece fikir vermesi açısından paylaşıyorum , teşekkürler
Nasıl ki Soru sorarak öğrendiyseniz , öğrendiklerinizi cevap vererek öğretiniz.
Kullanıcı avatarı
mustafasoy
Üye
Mesajlar: 154
Kayıt: 02 Ağu 2013 05:00
Konum: istanbul
İletişim:

Re: işlem zamanı mesai dışında ise yeniden tarihi hesapla

Mesaj gönderen mustafasoy »

sorunumu çözüm arkadaşlar belki başka bir kişinin işine yarar , kolay gelsin

Kod: Tümünü seç

declare @modelkod varchar(50)= 'MM'
declare @xmiktar  int =5
declare @mesbas   datetime = (select top 1 firsttime from Urt_WorkTimeGlobal)
declare @mesbit   datetime = (select top 1 lasttime from Urt_WorkTimeGlobal)
declare @xtar     datetime --= '01.01.2015 07:02:00'
declare @xmesbas  varchar(9) =' '+(select top 1 convert(varchar,firsttime,108) from Urt_WorkTimeGlobal)
declare @xmesbit  varchar(9) =' '+(select top 1 convert(varchar,LastTime, 108) from Urt_WorkTimeGlobal)
declare @miktar   int , @bastar datetime , @proses varchar(5),@tzaman int,@bittar datetime
declare @tgun int, @tsaat int, @tdakika int  --toplam gun, saat, dakika ilgili proseste ne kadar işlem göreceği
declare @fgun int, @fsaat int, @fdakika int  --fark gun , saat , dakika mesai süresi sonunda iş bitmez ise ertesi güne nekadar ilave edileceğini hesaplar
declare @topmesdak int =datediff(MINUTE,@mesbas,@mesbit) -- bir günde toplam kaç dakika çalışılır
declare @artikzaman int
DECLARE xcursor CURSOR FOR  
					select /*p.Giren*/@xmiktar,cast(convert(varchar,p.TerminTar,104)+@xmesbas as datetime),mp.Proses,mp.PTime*@xmiktar  from Urt_Plan_gch p 
					left join model_p mp on mp.modelkod=p.SKOD
					where p.Mrptedariktipi=0  and mp.modelkod =@modelkod order by mp.ProsesNo
OPEN xcursor
FETCH NEXT FROM xcursor into @miktar,@bastar,@proses,@tzaman
WHILE @@FETCH_STATUS=0
BEGIN
	set @tgun		= @tzaman / @topmesdak 
	set @tsaat		= @tzaman % @topmesdak / 60
	set @tdakika	= @tzaman % @topmesdak % 60
	set @bittar		= dateadd(DAY,@tgun,dateadd(hour,@tsaat,dateadd(MINUTE,@tdakika,@bastar)))

	set @xtar =dateadd(minute,@tzaman,@bastar)	
	set @xtar		= dateadd(DAY,@tgun,dateadd(hour,@tsaat,dateadd(MINUTE,@tdakika,@bastar)))
	set @bittar=@xtar

	if ((substring(cast(cast(@xtar as float)-floor(cast(@xtar as float))as varchar),3,20) >= substring(cast(cast(@mesbas as float)-floor(cast(@mesbas as float))as varchar),3,20)) 
	and (substring(cast(cast(@xtar as float)-floor(cast(@xtar as float))as varchar),3,20) <= substring(cast(cast(@mesbit as float)-floor(cast(@mesbit as float))as varchar),3,20)))

	begin
		select @proses as proses,@bastar as bastar,@bittar as bittar--'mesai içi',@tgun,@tsaat,@tdakika,@fgun,@fsaat,@fdakika,@artikzaman,@miktar
		--substring(cast(cast(@xtar as float)-floor(cast(@xtar as float))as varchar),3,20),substring(cast(cast(@mesbas as float)-floor(cast(@mesbas as float))as varchar),3,20),substring(cast(cast(@mesbit as float)-floor(cast(@mesbit as float))as varchar),3,20)
		set @bastar=@bittar
	end
	else
	begin
			set @artikzaman=datediff(minute,convert(varchar,@bittar,104)+@xmesbit,@bittar)  
			 --/*
			 if @artikzaman / @topmesdak=0 
				begin 
					set @fgun		=@artikzaman / @topmesdak+1
					set @fsaat		= abs(@artikzaman % @topmesdak / 60)
					set @fdakika	= abs(@artikzaman % @topmesdak % 60)
				end
				else
				begin
					set @fgun		=0
					set @fsaat		= 12-abs(@artikzaman % @topmesdak / 60)
					set @fdakika	= 60-abs(@artikzaman % @topmesdak % 60)
				end
				--*/
				
			--set @fsaat		= abs(@artikzaman % @topmesdak / 60)
			--set @fdakika	= abs(@artikzaman % @topmesdak % 60)
			set @bittar		= dateadd(day,@fgun,dateadd(HOUR,@fsaat,dateadd(MINUTE,@fdakika,convert(varchar,@bittar,104)+@xmesbas)))
		select @proses as proses,@bastar as bastar,@bittar as bittar--,'mesai dışı',@tgun,@tsaat,@tdakika,@fgun,@fsaat,@fdakika,@artikzaman,@miktar
		--substring(cast(cast(@xtar as float)-floor(cast(@xtar as float))as varchar),3,20),substring(cast(cast(@mesbas as float)-floor(cast(@mesbas as float))as varchar),3,20),substring(cast(cast(@mesbit as float)-floor(cast(@mesbit as float))as varchar),3,20)
		--set @bastar=@bittar
	end
FETCH NEXT FROM xcursor into @miktar,@bastar,@proses,@tzaman
set @bastar=@bittar
END  
CLOSE xcursor 
DEALLOCATE xcursor
/*
1.senaryo***************************************************************
miktar = 35 çift 
mesai baslangıcı = 08:00:00
mesai bitişi     = 19:00:00
1.proses işlem zamanı =20  --> 20*35 = 700 dakika
2.proses işlem zamanı =72  --> 72*35 = 2520 dakika
3.proses işlem zamanı =63  --> 63*35 = 2205 dakika
4.proses işlem zamanı =91  --> 91*35 = 3185 dakika

1.proses 10.02.2015 08:00  1 gun 0 saat 40 dakika --> 11.02.2015 08:40
2.proses 11.02.2015 08:40  3 gun 9 saat 00 dakika --> 14.02.2015 17:40
3.proses 14.02.2015 17:40  3 gun 3 saat 45 dakika --> 18.02.2015 10:25 --> 17.02.2015 21:25 --> 02 saat 25 dakika fark --> 
4.proses 18.02.2015 10:25  4 gun 9 saat 05 dakika --> 23.02.2015 08:30 --> 22.02.2015 19:30 --> 00 saat 30 dakika fark -->

2.senaryo***************************************************************
miktar = 35 çift 
mesai baslangıcı = 08:00:00
mesai bitişi     = 19:00:00
1.proses işlem zamanı =10  --> 10*35 = 350 dakika
2.proses işlem zamanı =72  --> 72*35 = 2520 dakika
3.proses işlem zamanı =63  --> 63*35 = 2205 dakika
4.proses işlem zamanı =91  --> 91*35 = 3185 dakika

1.proses 10.02.2015 08:00  0 gun 5 saat 50 dakika --> 10.02.2015 13:50
2.proses 10.02.2015 13:50  3 gun 9 saat 00 dakika --> 14.02.2015 11:50 --> 13.02.2015 22:50 --> 03 saat 50 dakika fark -->
3.proses 14.02.2015 11:50  3 gun 3 saat 45 dakika --> 17.02.2015 15:35
4.proses 17.02.2015 15:35  4 gun 9 saat 05 dakika --> 22.02.2015 13:40 --> 22.02.2015 00:40 --> 05 saat 40 dakika fark -->

3.senaryo***************************************************************
miktar = 35 çift 
mesai baslangıcı = 08:00:00
mesai bitişi     = 19:00:00
1.proses işlem zamanı =5   --> 05*35 = 175  dakika
2.proses işlem zamanı =72  --> 72*35 = 2520 dakika
3.proses işlem zamanı =63  --> 63*35 = 2205 dakika
4.proses işlem zamanı =91  --> 91*35 = 3185 dakika

1.proses 11.02.2015 08:00  0 gun 2 saat 55 dakika --> 11.02.2015 10:55
2.proses 11.02.2015 10:55  3 gun 9 saat 00 dakika --> 15.02.2015 08:55 --> 13.02.2015 19:55 --> 55 dakika fark --> 
3.proses 15.02.2015 08:55  3 gun 3 saat 45 dakika --> 18.02.2015 12:40 
4.proses 18.02.2015 12:40  4 gun 9 saat 05 dakika --> 23.02.2015 10:45 --> 21.02.2015 21:45 --> 2 saat 45 dakika fark -->   

4.senaryo***************************************************************
miktar = 35 çift 
mesai baslangıcı = 08:00:00
mesai bitişi     = 19:00:00
1.proses işlem zamanı =30  --> 30*35 = 1050 dakika
2.proses işlem zamanı =45  --> 45*35 = 1575 dakika
3.proses işlem zamanı =20  --> 21*35 = 735  dakika
4.proses işlem zamanı =68  --> 68*35 = 2380 dakika

1.proses 16.02.2015 08:00  1 gun 6 saat 30 dakika --> 17.02.2015 14:30
2.proses 17.02.2015 14:30  2 gun 4 saat 15 dakika --> 19.02.2015 18:45 
3.proses 19.02.2015 18:45  1 gun 0 saat 40 dakika --> 21.02.2015 08:25 --> 14.02.2015 19:25 --> 25 dakika fark
4.proses 21.02.2015 08:25  3 gun 6 saat 40 dakika --> 24.02.2015 15:05

5.senaryo***************************************************************
miktar = 35 çift 
mesai baslangıcı = 08:00:00
mesai bitişi     = 19:00:00
1.proses işlem zamanı =077  --> 077*35 = 2695 dakika
2.proses işlem zamanı =120  --> 120*35 = 4200 dakika
3.proses işlem zamanı =178  --> 178*35 = 6230 dakika
4.proses işlem zamanı =215  --> 215*35 = 7525 dakika

1.proses 10.02.2015 08:00  4  gun 0 saat 55 dakika --> 14.02.2015 08:55
2.proses 14.02.2015 08:55  6  gun 4 saat 00 dakika --> 20.02.2015 12:55
3.proses 20.02.2015 12:55  9  gun 4 saat 50 dakika --> 01.03.2015 17:45
4.proses 01.03.2015 17:45  11 gun 4 saat 25 dakika --> 13.03.2015 11:10  --> 12.03.2015 22:10

6.senaryo***************************************************************
miktar = 10 çift 
mesai baslangıcı = 08:00:00
mesai bitişi     = 19:00:00
1.proses işlem zamanı =66  --> 66*10 = 660 dakika
2.proses işlem zamanı =66  --> 66*10 = 660 dakika
3.proses işlem zamanı =66  --> 66*10 = 660 dakika
4.proses işlem zamanı =66  --> 66*10 = 660 dakika

1.proses 26.02.2015 08:00  1 gun 0 saat 0 dakika --> 27.02.2015 08:00
2.proses 27.02.2015 08:00  1 gun 0 saat 0 dakika --> 28.02.2015 08:00
3.proses 28.02.2015 08:00  1 gun 0 saat 0 dakika --> 01.03.2015 08:00
4.proses 01.03.2015 08:00  1 gun 0 saat 0 dakika --> 02.03.2015 08:00

7.senaryo***************************************************************
miktar = 5 çift 
mesai baslangıcı = 08:00:00
mesai bitişi     = 19:00:00
1.proses işlem zamanı =66  --> 66*5 = 330 dakika
2.proses işlem zamanı =66  --> 66*5 = 330 dakika
3.proses işlem zamanı =66  --> 66*5 = 330 dakika
4.proses işlem zamanı =66  --> 66*5 = 330 dakika

1.proses 26.02.2015 08:00  0 gun 5 saat 30 dakika --> 26.02.2015 13:30
2.proses 26.02.2015 13:30  0 gun 5 saat 30 dakika --> 26.02.2015 19:00
3.proses 26.02.2015 19:00  0 gun 5 saat 30 dakika --> 27.02.2015 13:30
4.proses 27.02.2015 13:30  0 gun 5 saat 30 dakika --> 27.02.2015 19:00

8.senaryo***************************************************************
miktar = 5 çift 
mesai baslangıcı = 06:00:00
mesai bitişi     = 20:00:00
1.proses işlem zamanı =66  --> 66*5 = 330 dakika
2.proses işlem zamanı =66  --> 66*5 = 330 dakika
3.proses işlem zamanı =66  --> 66*5 = 330 dakika
4.proses işlem zamanı =66  --> 66*5 = 330 dakika

1.proses 26.02.2015 06:00  0 gun 5 saat 30 dakika --> 26.02.2015 11:30
2.proses 26.02.2015 11:30  0 gun 5 saat 30 dakika --> 26.02.2015 17:00
3.proses 26.02.2015 17:00  0 gun 5 saat 30 dakika --> 27.02.2015 08:30
4.proses 27.02.2015 08:30  0 gun 5 saat 30 dakika --> 27.02.2015 14:00

*/
Nasıl ki Soru sorarak öğrendiyseniz , öğrendiklerinizi cevap vererek öğretiniz.
Cevapla