kendimi veritabani implemmentasyonu ve mantigi nokatisinda kismen yeterli goruyorken simdi aslinda bildiklerimin citir seylerden ibaret oldugunu anliyorum.
Su mevzuda bilginize ihtiyacim var.
Php ve MySql kullanaraktan ve icine birazda Ajax karistiraraktan bir online muhasebe sistemi yapmaya calisiyorum. Simdilik sadece amator bir yaklasimla calisiyorum bu projenin uzerinde yani kendi isyerimdeki otomasyon eksikliklerini personalize edilmis bir sistemle asma gudusu ile.
Fatura icin 3 tane tablom var
1 - inv_header
2 - inv_lines
3 - inv_lines_temp
fatura giris modulunde kullanici fatura kalem girislerini yaparken bu kalemler inv_lines_temp dosyasina yaziliyor ve kullanici kaydet komutunu verdikten sonra bu tablodaki bilgiler inv_lines tablosuna aktariliyor ve inv_lines_temp tablosunun icerigi bosaltiliyor. Tabiiki kayit islemi ile beraber diger alakli verilerde inv_header tablosuna donusuyor. Bir anlamda inv_header inv_lines icin master tablo gorevini goruyor.
MySQL de isin veritabani tarafinda master tablo, trigger gibi ozellikler ne derece etkin kullanilibiliniyor yada var mi bilemiyorum, cokta uzerine dusmedim cunku php nin native sql destegi bu tur ozelliklere bagimliligi azaltiyor.
Simdi fatura kaydederken bir sorun yok asil kafama takilan kullanicinin faturayi edit etmek istemesi durumunda nasil bir yol izlemem gerektigidir. Burada islemler anlik fiziksel olarak veritabanina yaziliyor commit.transaction gibi seyler olmadigindan yada varmi ben bilmiyorum. Bu bir sorun tabiiki cunku kullanici 5-6 degisiklik yaptiktan sonra eger faturayi degistirmekten vazgecerse nasil rollback olacak!
Soyle bir cozum olabilir. Edit edilecek faturanin ilgili kalem satirlari yeniden inv_lines_temp tablosuna cekilebilinir ve orada islemler yapilir ve akabinde eger kullanici degisiklikleri yapmaya karar verirse yapilan degisiklikler inv_lines_temp dosyasindan okunarak inv_lines dosyasi update edilecek ve bunun akabindede inv_header dosyasi guncellenecek. Ama bu yaklasim bana cok ilkelce geliyor.
Mesela diyelimki renk alani kirmizi olan kayitlari bulmak istiyorsunuz bir tablodan cok kolay bicimde su sekilde bulabilirsiniz
Kod: Tümünü seç
select * from table vhere renk="kirmizi"
Iste bu cok ilkel bir yontem ve benim yukarida bahsettigim cozumde sanki bu ilkel yonteme benziyor.

Bu mevzuyu daha profesyonelce halledebilmenin nasil bir yolu olabilir?
Kod: Tümünü seç
CREATE TABLE IF NOT EXISTS `inv_header` (
`id` int(11) NOT NULL auto_increment,
`inv_no` varchar(10) collate utf8_romanian_ci NOT NULL,
`client_id` varchar(11) collate utf8_romanian_ci NOT NULL,
`inv_date` date NOT NULL,
`inv_type` varchar(15) collate utf8_romanian_ci NOT NULL,
`adet` int(11) NOT NULL,
`net_sum` decimal(7,2) NOT NULL,
`vat_sum` decimal(7,2) NOT NULL,
`disc_prcnt` int(2) NOT NULL,
`disc_val` decimal(7,2) NOT NULL,
`grand_sum` decimal(7,2) NOT NULL,
`inv_exp` varchar(2) collate utf8_romanian_ci NOT NULL,
`exch_rate` decimal(5,2) NOT NULL,
UNIQUE KEY `id` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=9 ;
Kod: Tümünü seç
CREATE TABLE IF NOT EXISTS `inv_lines` (
`id` int(11) NOT NULL auto_increment,
`fat_id` varchar(10) collate utf8_romanian_ci NOT NULL,
`code_id` varchar(10) collate utf8_romanian_ci NOT NULL,
`tip` char(1) collate utf8_romanian_ci NOT NULL,
`adet` int(11) NOT NULL,
`unit_price` decimal(7,2) NOT NULL,
`line_net` decimal(7,2) NOT NULL,
`line_vat` decimal(7,2) NOT NULL,
`line_grand` decimal(7,2) NOT NULL,
UNIQUE KEY `id` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=26 ;
Kod: Tümünü seç
CREATE TABLE IF NOT EXISTS `inv_lines_temp` (
`id` int(11) NOT NULL auto_increment,
`code` varchar(10) collate utf8_romanian_ci NOT NULL,
`tip` char(1) collate utf8_romanian_ci NOT NULL,
`adet` int(11) NOT NULL,
`unit_price` decimal(7,2) NOT NULL,
`line_net` decimal(7,2) NOT NULL,
`line_vat` decimal(7,2) NOT NULL,
UNIQUE KEY `id` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;