Konuyu Oyla:
  • Derecelendirme: 5/5 - 1 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Fiş numaralama (Genel)
#1
Günaydın  fiş numaralama için basit fonksiyon yazdım
işine yarayan geliştirmek isteyen olabilir düşüncesi ile buradan paylaşayım.
Kullanımı
edit_fis_no.Text:=fisnouret(edit1_no.Text);
// veya 
edit_fis_no.Text:=fisnouret('SVK.0025418');

Şeklinde kullanılınca gönderilen degeri bir artırarak geri gönderiyor.

function fisnouret(gecici_no: AnsiString): AnsiString;
var
i,sayi:Integer;
harfler,numaralar:Ansistring;
nokta_yeri:word;
begin
 i:=Length(gecici_no);   // gelen son numaranın uzunluğunu al
 numaralar:='';          // gelen bilgi içinde sayı olanlar için gecici alan
 harfler:='';            // gelen bilgi içinde harf ve ayraç karakterinin gecici tutulduğu alan
 nokta_yeri:= AnsiPos('.' ,gecici_no);  // ayraç karakterinin yerini bul.

 if nokta_yeri=0 then    // Ayraç karakteri yoksa uyarı ver ve çık.
       begin
       showmessage('Fiş numarasında . Karakteri olmak zorundadır.');
       Exit;
       end;

 harfler:= AnsiLeftStr(gecici_no , nokta_yeri); // Noktadan öncesini harf olrak algıla ve al
 numaralar := AnsiMidStr(gecici_no , nokta_yeri+1 , Length(gecici_no)+nokta_yeri); // Noktadan sonrasını numara olarak al
 sayi:=strtoint(trim(numaralar)); // alınan numaralar string de boşlukları sil ve tam sayıya çevir.
 sayi:=sayi+1;  // sayıyı 1 Artır
 Result:=harfler+inttostr(sayi);  // hazırlanan  harf ve sayıları birleştir gönder.

end;
"…De ki: "Hiç bilenlerle bilmeyenler bir olur mu? Şüphesiz, temiz akıl sahipleri öğüt alıp-düşünürler" (Zümer Suresi, 9)
Cevapla
#2
SQL Tablolarında Fiş numarası olan kolonu 1 arttırarak gelen numara veya harfi veriyor. (-1 dönüyorsa problem var)

function TDBF.FISSONNO(TABLO:String;KOLON:String;KOSUL:String):String;
var
SN,SF : string;
S1 : Char;
I1 : Integer;
begin
try
SBUL_.Close; SBUL_.SQL.Clear;
SBUL_.SQL.Add('SELECT MAX('+KOLON+') AS SKNO,MAX(CONVERT(DECIMAL, '+KOLON+')) AS SFNO FROM '+TABLO+' '+KOSUL);
SBUL_.Open;
except
 try
 SBUL_.Close; SBUL_.SQL.Clear;
 SBUL_.SQL.Add('SELECT MAX('+KOLON+') AS SKNO,0 AS SFNO FROM '+TABLO+' '+KOSUL);
 SBUL_.Open;
 except
 Result:='1'; exit;
 end;
end;
if SBUL_.RecordCount<=0 then begin Result:='0'; exit; end;
try SN:= SBUL_.FieldValues['SKNO']; except Result:='1'; end;
try SF:= SBUL_.FieldValues['SFNO']; except Result:='1'; end;
if Length(SN)<=0 then begin Result:='1'; exit; end;
try
if length(SN)<=length(SF) then SN:=SF;
I1:=Length(SN);
while I1>=0 do
begin
S1:=SN[I1];
 case S1 of
 '0'..'8','A'..'Y','a'..'y':
     begin
     SN[I1]:= Chr(Ord(S1)+1);
     I1:=0;
     end;
 '9' : begin SN[I1]:= #48; if I1=1 then SN:='1'+SN; end;
 'Z' : begin SN[I1]:= #65; if I1=1 then SN:='A'+SN; end;
 'z' : begin SN[I1]:= #97; if I1=1 then SN:='a'+SN; end;
 end;
inc(I1,-1);
end;
Result:=SN;
except
Result:='1';
end;
end;
Cevapla
#3
Function TersCevir(no:String):String;
var
   Cevrilen:String;
   i:Integer;
Begin
   i:= 0;
   Cevrilen := '';
   For i := length(no) DownTo 1 Do
   Begin
       Cevrilen := Cevrilen + no[i];
   End;
   Result := Cevrilen;
End;

Function Numarator(no:String):String;
var
   Nmr, Temp, Temp1:String;
   Temp2:Char;
   i, Tmp:Integer;
Begin
   nmr := TersCevir(no);
   i:= 0;
   while i < length(no) Do
   Begin
       i := i + 1;
       if nmr[i] = '9' Then
       begin
           nmr[i] := '0';
           continue;
       End
       Else
       if (nmr[i] < '9') and (nmr[i] >= '0') Then
       Begin
           Temp := inttostr(StrToInt(nmr[i]) + 1);
           Tmp := i;
           Break;
       end;
       if nmr[i] = 'Z' Then
       begin
           nmr[i] := 'A';
           continue;
       End
       Else
       if (nmr[i] < 'Z') or (nmr[i] >= 'A') Then
       Begin
           Temp := inttostr(ord(nmr[i]));
           Temp := intToStr(StrToInt(Temp) + 1);
           Temp := Chr(StrToInt(Temp));
           Tmp := i;
           Break;
       end;
   End;
   i:= 0;
   while i < length(no) do
   Begin
       i := i + 1;
       if tmp = i Then
           if (temp[1] <= '9') and (temp[1] >= '0')  Then
               nmr[i] := temp[1]
           Else
           Begin
               nmr[i] := Temp[1];
           End;
       nmr[i] := nmr[i];
   End;

   result := TersCevir(nmr);
End;  //fno.Text:=numarator(ADOQuery1.FieldByName('F_NO').AsString);
Cevapla
#4
Sayın cinarbil,
edit_fis_no.Text:=fisnouret('SVK.0025418');
Eğer Satırdaki 'SVK' fis seri numarası ise size tavsiyem Seri no'yu String olarak ayrı bir alan tanımlamanızdır. No alanını Sayısal Yapın. Bir de Son No'yu kayıt yaparken son numarayı alarak kaydedin. Birden fazla kullanıcılarda mükerrer olması durumu olabilir. Kişi Numarayı alıp, Başka bir kullanıcıda aynı numarayı alabilir. Son numarayı alıp hemen saklarsanız kayıttan vazgeçme durumunda Numara atlaması olur. Seri No'yu ayrı bir tablo olarak ta tanımlamanızı öneririm.
Bilmeyen ve bilmediğini bilen çocuktur, ona öğretin.
Bilen ve bildiğini bilmeyen uykudadır, onu uyandırın.
Bilmeyen ve bilmediğini bilmeyen aptaldır, ondan sakının.
Bilen ve bildiğini bilen öncüdür, onu izleyin.
WWW
Cevapla
#5
Tüm yorum ve örnekler için teşekkür ederim.
"…De ki: "Hiç bilenlerle bilmeyenler bir olur mu? Şüphesiz, temiz akıl sahipleri öğüt alıp-düşünürler" (Zümer Suresi, 9)
Cevapla
#6
Bu fonksiyon  string içindeki sayısal alanı +1 yapar
function DegerArt(const S:String):String;
var i:Integer; Ch:Char; Normal:Boolean;
begin
 Result:=S;
 i:=Length(Result);
 Normal:=False;
 while (i>0) and not Normal do begin
   Ch:=Result[i];
   if CharInSet(Ch,['0'..'9']) then
   begin
     if Ch='9' then Ch:='0' else begin
       Inc(Ch);
       Normal:=True;
     end;
     Result[i]:=Ch;
   end else Break;
   dec(i);
 end;
 if not Normal then Insert('1',Result,i+1);
end;

Örnek;
edit_fis_no.Text:='SVK.'+DegerArt('SVK.0025418');
"Önemli olan şey ne söylediğin değildir,nasıl söylediğindir."
Cevapla
#7
Merhaba,

Programda oturum açan kullanıcılara farklı fiş no vermek icabet edebilir.

Bunun için en temiz yol; yönetici veritabanında bir tablo oluşturunuz. Alanlar ID (Primary), KisiNo (indexleyiniz), SeriAdi, Sayac şeklinde.

Bu aynı nokta da farklı yazıcılarda fatura yazdıranlar içinde mühim bir konu. Çünkü kesilen faturaların A serisi, B serisi C serisi gibi sıra numarası tarih doğrultusunda takip etmelidir. Yoksa mali açıdan denetimlerde problem teşkil edebilri.
Cevapla




Konuyu Okuyanlar: 1 Ziyaretçi