Personel Devam Takip Mantığı Nasıl?

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Personel Devam Takip Mantığı Nasıl?

Mesaj gönderen fduman »

Merhabalar,

Şu aralar bir PDKS yazılımı geliştirmenin daha başlangıç aşamasındayım. Analizlerimi bir türlü tamamlayamıyorum, çünkü her mantıkta bir pürüz, bir karmaşa buluyorum. Bana göre bir programın mantığı basit ve anlaşılır olmalı, ancak çoğu zaman kendi kurduğum mantığı bile anlayamayacak duruma geliyorum.

Sizlerin de fikirlerini alabilmek için, kurduğum mantığı sizlere basitçe açıklamaya çalışmak istedim.

Program çok vardiyalı ve yaklaşık 1000 kişinin devam hareketlerini hesaplayacak yapıda olmalı, dönen vardiyalara da destek verebilmeli. Bundan kastım şu: A kişisi 1.10.2004 - 15.10.2004 arasında 08:00-16:00 çalışıyorsa, 16.10.2004-31.10.2004 arasında 16:00-22:00 çalışıyor. vs..
Bu vardiya döndürmeyi manuel veya otomatik olarak yapabilmeli.

Öncelikle yazılımda bir şirket takvimi olması gerektiğini düşündüm. Bu şirketin 1 yıl içindeki çalışma türlerinin bir ajandası gibi. Yani ayın 1-10 arası Normal çalışma, 11-12 arası hafta sonu, 13-14 arası normal çalışma, 14'ünde saat 13:00 a kadar normal, sonrası yarım gün, 16'sı bayram vs... gibi bir kaydın önceden hazırlanması gerekir.

Şirketteki bölümler tablosu tabii..
ve kullanıcı grupları diye birşey tanımladım. Bunuda kullanıcıları gruplandırmak ve toplu vardiya vs. vermek için düşündüm. Windows'daki gruplar gibi (Admin, User vs..).

Yapmak istediğim olabildiğince hareket hesaplamalarını SP'ler ile server tarafında halletmek.

Önerileriniz olursa veya bu konuda deneyimleriniz mevcutsa, yöntem vs. konularında bunları benimle paylaşırsanız mutlu olurum.
Kullanıcı avatarı
pentiumkivanc
Üye
Mesajlar: 350
Kayıt: 19 Şub 2004 10:24
İletişim:

Mesaj gönderen pentiumkivanc »

Ben daha önce yapmamıştım ama yapsaydım şöyle olurdu

Kod: Tümünü seç

GRP (gruplar)
GrupNo	Açıklama
-----------------------------------
0		Admin
1		Moderatör
2		Gündüzcü Personel Grubu
3		Gececi Personel Grubu
...

Kod: Tümünü seç

YTK (Yetki)
PersonelNo	GRPNo	ADI_SOYADI
-----------------------------------
0				0		Admin 1
1				0		Admin 2
2				2		Personel 1
3				2		Personel 2
4				3		Personel 3
...

Kod: Tümünü seç

CST (Çalışma Saatleri)
Id		Başlangıç		Bitiş
-----------------------------------
0		08:00			16:00	// Gündüzcü personelin çalışma saati
1		16:00			22:00	// Gececi personelin çalışma saati
2		08:00			13:00	// Yarım gün için çalışma saati
3		00:00			00:00	// Tatil günleri için çalışma saati
...

Kod: Tümünü seç

CDR (Çalışma Durumu)
ID		Açıklama
-----------------------------------
0		Normal
1		Yarım Gün
2		Tatil
...

Kod: Tümünü seç

VRD (Vardiyalar belirleniyor gündüz için 0 gece için 1 verdim)
ID	VrdNo	CDRNo	CSTNo
-----------------------------------
0		0		0		0 // Vardiya no 0 için çalışma durumu normal olunca Çalışma saatleri 08:00-16:00
1		0		1		2 // Vardiya no 0 için çalışma durumu yarım gün olunca çalışma saatleri 08:00-13:00
2		0		2		3 // Vardiya no 0 için çalışma durumu tatil olunca çalışma saatleri 00:00-00:00
3		1		0		1 // Vardiya no 1 için çalışma durumu normal olunca çalışma saatleri 16:00-22:00
...

günün kontrol sırası şöyle olur:
kontrol edilen gün özel gün mü? değilse hafta sonu mu? ikiside değilse normal gündür zaten

Bu durumda özel günler için bir tablo bulunmalı,
özel günler periyodik olarak tekrar edenler (19 mayıs, 23 nisan)
bir kereye mahsus olanlar
diye ikiye ayrılırar. Sürekli tekrar edenler sadece gün ve ay değeri taşırlar. Yıl içinde
bulunduğumuz yıl ile birleştirilip
bir kereye mahsus olanlara (15.10.2005 gibi)
kesin tarih girilir.

Kod: Tümünü seç

OGN (Özel Günler)
ID	Tekrar	GG	AA	YY	CDRKod
-----------------------------------
0		1		23	04				2
1		1		19	05				2
2		0		05	06	2005	  1
...
Bu durumda eğer tarih bu tablodan birine uyuyorsa yapacağı işlemi CDRKod ile
belirliyoruz. Daha sonra VRD.CDRNo ile personelin VRD.CSTNo ile çalışacağı saatleri CST
tablosundaki id alanından
seçiyoruz. Yukardakine göre açıklamak kerekirse OGN tablosunun Id=0. kaydında her yıl
tekrar eden 23 nisanda CDR kod (çalışma durumu kodu) 2 yani "Tatil". Gelen bu 2 değeri
işçinin vardiyasına göre VRD.CDRNo ile kıyaslanıyor ve VRD.CSTNo çıkıyor. Yani buna göre
vardiyası 0 olan (güncüzcü diyelim) personelin çalışma saatleri 3 çıkıyor. Gidip bakıyoruz
CST de 3 numara neymiş: 00:00-00:00 yani personel çalışmıyor.


hafta sonu mu değilmi? yada her çarşamba biz şu saate kadar çalışıyoruz da diyebilirler.
Bu da ayrı bir tabloda tutulmalı

Kod: Tümünü seç

HFG (Haftanın günü kontrolü)
ID	CDRKod
0		2
1		0
2		0
3		0
4		0
5		0
6		0
7		1

Bu durumda personelin çalışma programını oluştururken

Kod: Tümünü seç

VGS (Vardiya grup sistemi)
GrupNo	VardiyaNo
2			0	//Gündüzcü personel grubunun hangi vardiya sisteminde old. tanımladık
3			1	//Gececi personel grubunun hangi vardiya sisteminde old. tanımladık
Böylece personelin grubunu 2 değil de 3 yapınca personel, 1 numaralı vardiya sistemiyle
çalışacak. (yani bu sisteme göre gececi olacak) Bu durumda vardiya değiştirme işlemi
bu tabloydaki vardiya no değerinin 0-1 ile değiştirilmesiyle yapılabilir
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

Özenli yanıtın için teşekkür ederim. Benim kurduğum tablo yapısına çok benziyor.

Personel'in giriş mi, çıkış mı yaptığına nasıl karar verebiliriz peki?

Yani bana gelecek olan data şu şekilde:

Personel_ID
Geçiş Tarihi
Geçiş Saati

Bundan Personel girmiş mi çıkmış mı bulmam gerekli. Kart çekmeyi unuttu ise veya o gün mesai yaptıysa (örneğin 8 saat daha çalıştı) nasıl bulunabilir?

Önce veri adedi tek sayıysa birisini eksik yapmıştır gibi bir mantıkla gitmek istedim. Buradaki asıl problem şu: eğer gece 22 de gelip, ertesi gün 08:00 de çıkarsa nasıl ayırt edebileceğim? Çünkü o güne göre hesap yaptığımdan sanki o gün 1 kere geçiş yapmış gibi görünecek. bir de gün içinde işi çıkar ve birden fazla geçiş yaparsa nasıl olacak? örneğin 6 kere giriş çıkış yapmış. Bunu nasıl ayırabilirim bilemiyorum. Bu konuda kafamda net birşey belirmiş değil.

Personelin o günkü vardiya saatine ve 1 kişinin maximum çalışabilme süresine göre (ör 15 saat) bir algoritma kurmak gerekli zannedersem. Ayrıca bu algoritma gün içinde 2'den fazla hareketi de doğru yorumlamalı (yani işi çıkar gider, geri gelir vs..). Her hareketi bu giriş bu çıkış diye bilebilmeli vs....

İşin içinden çıkamıyorum. Çok mu ayrıntılı düşünüyorum acaba?

İyi günler dilerim
Misafir

Mesaj gönderen Misafir »

merhaba.
giriş-çıkış için ayrı bir sistem kullanılabilir aslında.onun haricinde ilk mesajınızda belirttiğiniz şirketin çalışma takvimine göre bunu belirleyebilirsiniz. yani çalışma saati içinde çıkıp gitmiş ve aynı çalışma saati içinde tekrar girmişse işi vardır diyebiliriz. ancak gitmiş ve geri dönmemişse bu adminlere iletilip nedeni araştırılmalıdır. diğer konu 22-08 olayına gelince; yine çalışma takviminde böyle bir vardiyanın girilmiş olması sizin için yol gösterici bir kavram olmalı. giriş 22 görünüyor çıkış 08..haliyle tek mesai yapmıştır ancaak, bu noktada bir de tarih kontrolü gerekli, tahmininiz üzre tarih ardışık olmalı..
kolay gelsin.
Kullanıcı avatarı
pentiumkivanc
Üye
Mesajlar: 350
Kayıt: 19 Şub 2004 10:24
İletişim:

Mesaj gönderen pentiumkivanc »

Bence de fazla detaylı düşünüyorsunuz, personelin kart çekmeyi unutmaması gerekiyor, zira vatandaşlar bu sistemi personel işleri düzenli yürüsün diye yapıyorlar. Personelin kart geçirmeyi unutması durumunu bilerek gözardı etmelisiniz diye düşünüyorum.
Kolay gelsin..
Misafir

Mesaj gönderen Misafir »

küçük bir şey bende yapmıştım bu konuda.

* haftalık çalışma takvimi oluşturmuştum.
* personel kartında iki alanda son işlemi sakladım. yani bu personel en son şu saatte giriş yaptı gibi bir bilgi sakladım.
* daha sonra gelen bilgiyi karşılaştırarak hareket tipini belirledim. burada istediğin gibi kontroller yapabilirsin. mesela mesaisi dolmadan çıkmışsa raporlarsın. fazla çalışmışsa ayrıca raporlarsın.

eğer personel çıkışları kendi programından yapılıyorsa, yada kontrol edebiliyorsan bunun için şöyle bir şey yapmıştım. personel izin aldığında yada iş için ayrılacağında. kartı geçiriyor. sen bakıyorsun vardiyası henüz dolmamış. hemen izin kodu soruyor. bu izin kodu izni veren amir tarafından sisteme tanımlanıp personele söyleniyor, personel de bu kodu tuşlayıp çıkıyor.

gibi.
Dovlet
Üye
Mesajlar: 6
Kayıt: 16 Tem 2008 09:39

Re: Personel Devam Takip Mantığı Nasıl?

Mesaj gönderen Dovlet »

Ben de vardiya konusunda bir calisma yapiyordum ama biraz daha basit sistem olacak yine de nasil yapsam diye fikir alacaktim:
problem soyle.
her gun 3 vardiya var gece vardiyasinin ise ucreti biraz fazla.ama bir ay icinde her kes bu gece vardiyasinda calismis olabiliyor. iste ayin sonunda veritabnina gore girilen yoklama ve saat hesabina gore toplam kac saat calisti ve bunun kac saatini gece vardiyasinda calisti olarak almam lazim.

bir de yoklama girilirken o alana sadece 1 den 8'e kadar degerlerin girilmesini yada gelmediyse "gm" hasta ise "ht" gibi degerlerin kabul edilmesi bunlarin disinda bir deger girildiginde kabul etmemesi ve uyarlimasi nasil yapilabilir?

3000 den fazla elelman var.kafam biraz karisti.
vt olarak MSSQL2000 kullaniyoruz.

yardimci olabilir misiniz?
Kullanıcı avatarı
conari
Üye
Mesajlar: 2102
Kayıt: 27 Nis 2006 03:10
Konum: İstanbul & Gebze Karışık

Re: Personel Devam Takip Mantığı Nasıl?

Mesaj gönderen conari »

Bu 3000 kişi kart basmıyormu?varsa buradan okuyabilirsiniz vtye atarsınız sanırım.
Kısıtlama olayını Combobaxa girersiniz ordan seçilir.
Ama ilerde değişmesi gerekir ise problem olur.

Ayrıca gelmediği günlerde izin olayını da gündeme almalısınız. Ücretli/Ücretsiz/Haftalık/Yıllık/Mazeretli(siz) Bunlar detay.
Bir kelimenin anlamını öğretsen bile yeter..
ResimResim
Dovlet
Üye
Mesajlar: 6
Kayıt: 16 Tem 2008 09:39

Re: Personel Devam Takip Mantığı Nasıl?

Mesaj gönderen Dovlet »

iste bizim burda teknoloji bu kadar :) kart gecirilmiyor puantor diye bir adam var tek tek giriyorlar.
gurplama falan da yok simdiye kadar burda access kullanilmis ve vardiya meselesi yokmus.
o benim problemim degil ya girsinler de ben bunun vt de nasil tasarlayacagim onu cozemiyorum.yoklama diye bir tabloya her gun icin ayri bir satir girilse 3000 adam ayin sonunda o tabloda 90000 satir olur.bir de bu 1 sene sonra cok buyuyor ve karisiyor.

Kod: Tümünü seç

SICIL NO       TARIH       1.VARDIYA      2.VARDIYA      3.VARDIYA
12345          22.07.08                       7 saat
seklinde ayin sonunda mesela her vardiyanin saatlerini ayri ayri hesaplayip toplamini ve 3.vardiya yani gece vardiyasinin da kac saat oldugunu gostermem yeterli.
ikutluay
Üye
Mesajlar: 2341
Kayıt: 03 Tem 2007 10:13

Re: Personel Devam Takip Mantığı Nasıl?

Mesaj gönderen ikutluay »

Dovlet yazdı:iste bizim burda teknoloji bu kadar :) kart gecirilmiyor puantor diye bir adam var tek tek giriyorlar.
gurplama falan da yok simdiye kadar burda access kullanilmis ve vardiya meselesi yokmus.
o benim problemim degil ya girsinler de ben bunun vt de nasil tasarlayacagim onu cozemiyorum.yoklama diye bir tabloya her gun icin ayri bir satir girilse 3000 adam ayin sonunda o tabloda 90000 satir olur.bir de bu 1 sene sonra cok buyuyor ve karisiyor.

Kod: Tümünü seç

SICIL NO       TARIH       1.VARDIYA      2.VARDIYA      3.VARDIYA
12345          22.07.08                       7 saat
seklinde ayin sonunda mesela her vardiyanin saatlerini ayri ayri hesaplayip toplamini ve 3.vardiya yani gece vardiyasinin da kac saat oldugunu gostermem yeterli.
sql server iin 1 milyon satır devede kulak. accesste düşünüyorsan başlamadan vazgec
Kişi odur ki, koyar dünyada bir eser. Eseri olmayanın yerinde yeller eser./Muhammed Hadimi
http://www.ibrahimkutluay.net
http://www.ibrahimkutluay.net/blog
Kullanıcı avatarı
conari
Üye
Mesajlar: 2102
Kayıt: 27 Nis 2006 03:10
Konum: İstanbul & Gebze Karışık

Re: Personel Devam Takip Mantığı Nasıl?

Mesaj gönderen conari »

sql server iin 1 milyon satır devede kulak. accesste düşünüyorsan başlamadan vazgec
+1
Bu gibi programlar sanırım ay bazında veya 3 ar aylık dönem v.s. için farklı tablolar create ediyorlar veya öncesini başka bir yere yedekleyip mevcut tabloyu boşaltıyorlar.
Bir kelimenin anlamını öğretsen bile yeter..
ResimResim
Kullanıcı avatarı
tanerileri
Üye
Mesajlar: 55
Kayıt: 06 Tem 2007 11:30

Re: Personel Devam Takip Mantığı Nasıl?

Mesaj gönderen tanerileri »

Yıllar önce "paradox for dos" ile bahsettiğiniz tür bir program geliştirmiştim.
yazmaya başlarken ki hedeflerimle , bittiği andaki elimde olan program çok farklı olmuştu.
zira çok karmaşık ve bir o kadarda değişik bir sistem puantör uygulaması.
personel kart basmayı unutabiliyor , bu durumda bugünkü tek kart yarının girişi olmasın yani gececi olmasın gibi bir arayış içine giriyorsun haliyle , yada aynı gün 2 den fazla hareket olabiliyor, personel aynı hafta içinde 2-3 tür vardşyada gelmiş olabiliyor yada 1 gün sabahlamış olabiliyor vs vs vs yüzlerce ihtimal var. her halükarda ilk yazdığım koda , sonralarda o kadar çok eklemeler yaptımki , program çalışıyordu çalışmasına ama her ay tekrardan gözle kontrol etmem gerekiyordu , hatalar vs olabiliyordu.

Sonradan kart basma makinamız arızalandı , bunu değiştirirken beraberinde yazılımı olan bir kart makinası aldık , bu yazılımı incelediğimde bunu bende yapardım dediğimi dün gibi hatırlıyorum.
çünkü o kadar genele yaymışlarki , mesela bir yıl için çalışma takvimi yapmışlar , her gün iin bu takvimi giriyorssun (tabi kopyalama mantığıyla hızlı girebiliyorsun) , sonra resmi tatiler , vardiya gurupları , personel bazında hangi vardiyalarda gelebilieceği , bunların hep girilmesi lazım , zaten bu kadar veri girdikten sonra hesaplaması kolay dediğinizi duyar gibiyim , bende aynen öyle demiştim.

program şuan % 90-95 işimizi görüyor. (neptün pdks sisimleri ve programı) . ama bundada sorunlar var , tek kartları raporlayıp , bunları girmeniz lazım. fazla mesaiyi onaylamanız lazım , yada seçmeli olarak onaylamasızda yapabiliyorsunuz. şunu unutmayı hiçbir program % 100 bütün kullanıcıları hatasız yada elle müdehalesiz hesaplayamaz.

bu kadar ön bilgiden sonra size şunu öneririm = bahsettiğim yada başka bir firmadan bir yazılım alın , kendiniz uğraşmayın. 1000 kullanıcılı bir şirketse zaten buna kaynak ayırabilir durumdadır.
zira siz oranın personeliyseniz , puantör ile ilgili ne zaman hata olsa sizden bilecekler , ben bunu yaşadım ve gördüm. programınıza yığınla yama yapmanız gerekecek.
şuan kendi seçtiği programla insan kaynakları kendi hesaplıyor puantörü ve ben çok rahatım.

Puantör, içine girdikçe sizi kendine çeken bir bataklık gibidir , kaldıki o firmanın personeliyseniz dahada kötü durumunuz.

Amerikayı yeniden keşfetmeye gerek yok , hazır bir program almanızı öneririm.
Taner İLERİ.
Dovlet
Üye
Mesajlar: 6
Kayıt: 16 Tem 2008 09:39

Re: Personel Devam Takip Mantığı Nasıl?

Mesaj gönderen Dovlet »

Taner tamamen katiliyorum sana ben de hep diyorum Edison lambayi 1000 kere denemis bulmus evimizde lamba kullanmak icin kendimiz yapmaya gerek yok bunun yerine yeni seyler uzerine kafa yoralim ama iste herkes ayni dusunmuyor.Bazi adamlarin ufku genis bazisininki dar . Ben burda ise yeni basladim ve delphi bilmiyordum bunlarla ugrasarak ogreniyorum.Ben ogreneyim de gerisini sirket dusunsun.

Simdi bu konuda biraz Kodla alakali bir sey soracagim ayri bir konu acacaktim ama yarin obur gun baska biri bu konuda ugrasacaksa aradigi herseyi bu konu altinda bulsunlar diye burda soracagim.

DbGrid de personellerin listesinde baslarina checkbox eklesem veya eklemeden de Multiselect ile sectikten sonra.formun icinde bir tane Edit ten veya combobox tan bir deger sectigim zaman selili olan butun satirlarda o alana tek giriste bilgi girilebiliyor mu?

mesela 100 tane persoenl sectim diyelim bunlarin vardiya alanina edit den 2 yazdigim zaman 100 tane personelin vardiya alanina 2 yazmasi lazim.tek tek girmemesi icin.Cunku vardiyada gruplama yok.
Kullanıcı avatarı
tanerileri
Üye
Mesajlar: 55
Kayıt: 06 Tem 2007 11:30

Re: Personel Devam Takip Mantığı Nasıl?

Mesaj gönderen tanerileri »

Dbcheckbox ile yapayım dersen eğer

dbcheckbox u table da bir boolean alana bağlaman lazım . mesela TField Degistir:TBoolean; gibi.
Sonra checboxlarda işaretlediğin kayıtlara editdeki değeri ataman içinse ,

with Table1 do
begin
first;
While not eof do
begin
FieldByName('Vardiya').asinteger:=StrToInt(Edit1.Text));
Next;
end;
end;

şeklinde yapabilirsin , ama sürekli böyle işlemler yapacaksan bunlara tabloda açtığın saha yardımıyla yapmanı önermem. bu kodu kafanda bir fikir oluşsun diye yazdım.

Dbgrid in selct özelliği daha kullanışlı gözüküyor. oranında zaaf tarafı , ekranda görmediğin kadar çok sayıda personelin varsa bunları seçmekdeki zorluğun.

forumda dbgrid multiselect diye aratırsan bununla ilgil iörnekler bulabilirsin.

yeni başlayan biri olarak sana yagene tafsiyem şudur.

öncelikle componentleri , özelliklerini (Properties) denemeler yaparak ve sonuçlarını görerek anlamaya çalış.
sonrada eventleri aynı mantıkla çözmeye çalış.
Pascal konusunda sıkıntın varsada , hepsinden öncelikle pascal ve komutlarını öğren . (marco cantu nun epascal isimle küçük kitabını tafsiye ederim , türkçe çeviriside yapılmıştuı sanırım , internette ararsan bulabilirsin)

Gerçek program yazarak değilde, denemeler yaparak öğrenmeni tafsiye ederim.

Kolay gelsin.
Taner İLERİ.
Dovlet
Üye
Mesajlar: 6
Kayıt: 16 Tem 2008 09:39

Re: Personel Devam Takip Mantığı Nasıl?

Mesaj gönderen Dovlet »

Taner tesekkur ederim tavsiyelerini de dikkate alacagim.Epascal kitabi da buldum indirdim.Zaten temel dillerden pascal veya c gibi bir dille ugrasmayi dusunuyorum.Su an personel takip programini delphiyi hic bilmesem de az cok yaptim bir iki tane sey kaldi biri bu konu.bu proje ile ugrasirken kac kere deneme yanilma oldu.Ilk defa programlamaya ciddi sekilde delphi ile basladim sayilir universitede c, php falan gorduk ama isirik elma gibi yarida kaldi hepsi.su personel isini kopyala- yapistir ve taklitle bitireyim sonra ozunu anlamak icin temelden baslarim.:) biraz sacma ama butun ustadlar boyle diyor ustadliga giden yol taklitten gecer diyorlar.

Internetten soyle bir sey buldum about.delphi den biraz kendime gore degistirdim ama hala istedigim seyi yapamiyorum calismiyor.Bookmarklist le de buna benzer bir sey denedim o da olmadi.

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
begin
  if DBGrid1.SelectedRows.Count > 0 then
  begin
    with DBGrid1.DataSource.DataSet do
    begin
      for i := 0 to DBGrid1.SelectedRows.Count-1 do
      begin
        GotoBookmark(Pointer(DBGrid1.SelectedRows.Items[i]));
        AdoQuery1.FieldByName('Vardiya').AsInteger:=StrToInt(Edit1.Text);
      end;
    end;
  end
end;
Cevapla