FILE: ADRES.BAS [ ADRES 417 Version 2.3 ]
Option Explicit
Type AdresKayiti
     Tip As String * 1
     Kod As String * 20
     Ad As String * 40
     Adres1 As String * 40
     Adres2 As String * 40
     Semt As String * 15
     Kent As String * 15
     Ulke As String * 15
     Posta As String * 5
     Telefon As String * 35
     Fax As String * 19
     Vergi1 As String * 17
     Vergi2 As String * 13
     Meslek As String * 40
     Ozel As String * 40
     Previous As Integer
     Next As Integer
     Parola As String * 7
     GizliBilgi As String * 146
End Type
Type IndexKayiti
     First As Integer
     Last As Integer
End Type
Global Const KEY_UP = &H26
Global Const KEY_DOWN = &H28
Global Const KEY_PRIOR = &H21
Global Const KEY_NEXT = &H22
Global Const KEY_HOME = &H24
Global Const KEY_END = &H23
Global Const KEY_F1 = &H70
Global Const KEY_F2 = &H71
Global Const KEY_F3 = &H72
Global Const KEY_F4 = &H73
Global Const KEY_F5 = &H74
Global Const KEY_F6 = &H75
Global Const KEY_F7 = &H76
Global Const KEY_F8 = &H77
Global Const KEY_F9 = &H78
Global Const KEY_F10 = &H79
Global Const KEY_F11 = &H7A
Global Const KEY_F12 = &H7B
Global Const KEY_ESCAPE = &H1B
Global Adres As AdresKayiti
Global Indeks As IndexKayiti
Global DosyaNo As Integer
Global SonKayit As Integer
Global AktifKayit As Integer
Global IndexDosyaNo As Integer
Global IndexKayitNo As Integer
Global ListeYapildi As Integer
Global LstDosyaNo As Integer
Global Telefon As Integer
Global AbcIlkKayit As Integer
Global AbcSonKayit As Integer
Global HataTipi As Integer
Global PrnTarih As String
Global PrnGun As String
Global Tablo43 As String * 44
Global Tablo112 As String * 112
Public Sub Indekser()
REM SY-32 / TK-44+ [ SY-32 Version 2.TR ] Sort Method by Erdogan Tan
REM 10 June 2001
Dim Start As Integer
Dim KarSay As Integer
Dim TarKarSay As Integer
Dim AktifKod As String
Dim TaramaKod As String
Dim TaramaKayit As Integer
Dim RndPointer As Integer
Dim NextPointer As Integer
Dim Kar(20) As String * 1
Dim AktifKar(20) As Integer
Dim TarKar(20) As Integer
Dim GeriIndex As Integer
Dim IleriIndex As Integer
Dim YeniIndexKayit As Integer
Get #DosyaNo, AktifKayit, Adres
AktifKod = Trim(Adres.Kod)
KarSay = Len(AktifKod)
For Start = 1 To KarSay
    Kar(Start) = Mid$(AktifKod, Start, 1)
    AktifKar(Start) = Sy32Val(Kar(Start))
Next Start
If AktifKar(1) > 0 Then
   IndexKayitNo = AktifKar(1)
   If IndexKayitNo > 44 Then IndexKayitNo = 44
   Get #IndexDosyaNo, IndexKayitNo, Indeks
   If Indeks.Last > 0 Then
      TaramaKayit = Indeks.Last
      Get #DosyaNo, TaramaKayit, Adres
      TaramaKod = Trim(Adres.Kod)
      TarKarSay = Len(TaramaKod)
      For Start = 1 To TarKarSay
          Kar(Start) = Mid$(TaramaKod, Start, 1)
          TarKar(Start) = Sy32Val(Kar(Start))
      Next Start
      If TarKarSay < KarSay Then
         For Start = TarKarSay + 1 To KarSay
             TarKar(Start) = 0
         Next Start
      End If
      If TarKarSay > KarSay Then
         For Start = KarSay + 1 To TarKarSay
             AktifKar(Start) = 0
         Next Start
         KarSay = TarKarSay
      End If
      For Start = 1 To KarSay
          If AktifKar(Start) > TarKar(Start) Then
             Indeks.Last = AktifKayit
             Put #IndexDosyaNo, IndexKayitNo, Indeks
             If Adres.Next = TaramaKayit Then
                Adres.Next = AktifKayit
                Put #DosyaNo, TaramaKayit, Adres
                Get #DosyaNo, AktifKayit, Adres
                Adres.Previous = TaramaKayit
                Adres.Next = AktifKayit
                Put #DosyaNo, AktifKayit, Adres
                Exit Sub
             Else
                RndPointer = Adres.Next
                Adres.Next = AktifKayit
                Put #DosyaNo, TaramaKayit, Adres
                Get #DosyaNo, RndPointer, Adres
                Adres.Previous = AktifKayit
                Put #DosyaNo, RndPointer, Adres
                Get #DosyaNo, AktifKayit, Adres
                Adres.Previous = TaramaKayit
                Adres.Next = RndPointer
                Put #DosyaNo, AktifKayit, Adres
                Exit Sub
             End If
          Else
             If AktifKar(Start) < TarKar(Start) Then Exit For
          End If
      Next Start
   End If
   If Indeks.First > 0 Then
      TaramaKayit = Indeks.First
      Get #DosyaNo, TaramaKayit, Adres
      TaramaKod = Trim(Adres.Kod)
      TarKarSay = Len(TaramaKod)
      NextPointer = Adres.Next
      For Start = 1 To TarKarSay
          Kar(Start) = Mid$(TaramaKod, Start, 1)
          TarKar(Start) = Sy32Val(Kar(Start))
      Next Start
      If TarKarSay < KarSay Then
         For Start = TarKarSay + 1 To KarSay
             TarKar(Start) = 0
         Next Start
      End If
      If TarKarSay > KarSay Then
         For Start = KarSay + 1 To TarKarSay
             AktifKar(Start) = 0
         Next Start
         KarSay = TarKarSay
      End If
      For Start = 1 To KarSay
          If AktifKar(Start) < TarKar(Start) Then
             Indeks.First = AktifKayit
             Put #IndexDosyaNo, IndexKayitNo, Indeks
             If Adres.Previous = TaramaKayit Then
                Adres.Previous = AktifKayit
                Put #DosyaNo, TaramaKayit, Adres
                Get #DosyaNo, AktifKayit, Adres
                Adres.Previous = AktifKayit
                Adres.Next = TaramaKayit
                Put #DosyaNo, AktifKayit, Adres
                Exit Sub
             Else
                RndPointer = Adres.Previous
                Adres.Previous = AktifKayit
                Put #DosyaNo, TaramaKayit, Adres
                Get #DosyaNo, RndPointer, Adres
                Adres.Next = AktifKayit
                Put #DosyaNo, RndPointer, Adres
                Get #DosyaNo, AktifKayit, Adres
                Adres.Previous = RndPointer
                Adres.Next = TaramaKayit
                Put #DosyaNo, AktifKayit, Adres
                Exit Sub
             End If
          Else
             If AktifKar(Start) > TarKar(Start) Then Exit For
          End If
      Next Start
   End If
   If Indeks.First < 1 Or Indeks.Last < 1 Then
      Indeks.First = AktifKayit
      Indeks.Last = AktifKayit
      Put #IndexDosyaNo, IndexKayitNo, Indeks
      If IndexKayitNo > 1 Then
         GeriIndex = IndexKayitNo - 1
      Else
         Get #DosyaNo, AktifKayit, Adres
         Adres.Previous = AktifKayit
         Put #DosyaNo, AktifKayit, Adres
         GoTo Devam
      End If
Geri:
      Get #IndexDosyaNo, GeriIndex, Indeks
      RndPointer = Indeks.Last
      If RndPointer < 1 Then
         If GeriIndex > 1 Then
            GeriIndex = GeriIndex - 1
            GoTo Geri
         Else
            Get #DosyaNo, AktifKayit, Adres
            Adres.Previous = AktifKayit
            Put #DosyaNo, AktifKayit, Adres
            GoTo Devam
         End If
      Else
         Get #DosyaNo, AktifKayit, Adres
         Adres.Previous = RndPointer
         Put #DosyaNo, AktifKayit, Adres
         Get #DosyaNo, RndPointer, Adres
         Adres.Next = AktifKayit
         Put #DosyaNo, RndPointer, Adres
      End If
Devam:
      If IndexKayitNo < 44 Then
         IleriIndex = IndexKayitNo + 1
      Else
         Get #DosyaNo, AktifKayit, Adres
         Adres.Next = AktifKayit
         Put #DosyaNo, AktifKayit, Adres
         Exit Sub
      End If
Ileri:
      Get #IndexDosyaNo, IleriIndex, Indeks
      RndPointer = Indeks.First
      If RndPointer < 1 Then
         If IleriIndex < 44 Then
            IleriIndex = IleriIndex + 1
            GoTo Ileri
         Else
            Get #DosyaNo, AktifKayit, Adres
            Adres.Next = AktifKayit
            Put #DosyaNo, AktifKayit, Adres
            Exit Sub
         End If
      Else
         Get #DosyaNo, AktifKayit, Adres
         Adres.Next = RndPointer
         Put #DosyaNo, AktifKayit, Adres
         Get #DosyaNo, RndPointer, Adres
         Adres.Previous = AktifKayit
         Put #DosyaNo, RndPointer, Adres
      End If
      Exit Sub
   End If
Yeniden:
   IleriIndex = IndexKayitNo
   If NextPointer = TaramaKayit Then
Sonraki:
      If IleriIndex < 44 Then
         IleriIndex = IleriIndex + 1
         Get #IndexDosyaNo, IleriIndex, Indeks
         RndPointer = Indeks.First
         If RndPointer < 1 Then
            GoTo Sonraki
         Else
            Adres.Next = RndPointer
            Put #DosyaNo, TaramaKayit, Adres
            Get #DosyaNo, RndPointer, Adres
            Adres.Previous = TaramaKayit
            Put #DosyaNo, RndPointer, Adres
            NextPointer = RndPointer
         End If
      Else
         MsgBox ("Sıralama hatalı!  Düzeltmek için 'Oluştur' yada 'Sil' komutunu çalıştırın..."), 48, "! SIRALAMA  HATASI !"
         Exit Sub
      End If
   End If
   TaramaKayit = NextPointer
   Get #DosyaNo, TaramaKayit, Adres
   TaramaKod = Trim(Adres.Kod)
   TarKarSay = Len(TaramaKod)
   NextPointer = Adres.Next
   For Start = 1 To TarKarSay
       Kar(Start) = Mid$(TaramaKod, Start, 1)
       TarKar(Start) = Sy32Val(Kar(Start))
   Next Start
   If TarKarSay < KarSay Then
      For Start = TarKarSay + 1 To KarSay
          TarKar(Start) = 0
      Next Start
   End If
   If TarKarSay > KarSay Then
      For Start = KarSay + 1 To TarKarSay
          AktifKar(Start) = 0
      Next Start
      KarSay = TarKarSay
   End If
   For Start = 1 To KarSay
       If AktifKar(Start) < TarKar(Start) Then
          RndPointer = Adres.Previous
          Adres.Previous = AktifKayit
          Put #DosyaNo, TaramaKayit, Adres
          Get #DosyaNo, RndPointer, Adres
          Adres.Next = AktifKayit
          Put #DosyaNo, RndPointer, Adres
          Get #DosyaNo, AktifKayit, Adres
          Adres.Previous = RndPointer
          Adres.Next = TaramaKayit
          Put #DosyaNo, AktifKayit, Adres
          Exit Sub
       Else
          If AktifKar(Start) > TarKar(Start) Then Exit For
       End If
   Next Start
   GoTo Yeniden
End If
End Sub
Public Function Sy32Val(Character As String) As Integer
If Character = "ç" Then
   Character = "Ç"
Else
   If Character = "ğ" Then
      Character = "Ğ"
   Else
      If Character = "ı" Then
         Character = "I"
      Else
         If Character = "i" Then
            Character = "İ"
         Else
            If Character = "ö" Then
               Character = "Ö"
            Else
               If Character = "ş" Then
                  Character = "Ş"
               Else
                  If Character = "ü" Then
                     Character = "Ü"
                  Else
                     Character = UCase(Character)
                  End If
               End If
            End If
         End If
      End If
   End If
End If
Sy32Val = InStr(Tablo43, Character)
If Sy32Val = 0 Then Sy32Val = 44 + Asc(Character)
End Function

FILE: ADRES.FRM [ ADRES 417 Version 2.3 ]

Tablo43 = Chr$(32) + "0123456789ABCÇDEFGĞHIİJKLMNOÖPQRSŞTUÜVWXYZ" + Chr$(0)

***
NOTE: SY-26 and SY-32 have same logic but SY-26 uses direct ASC codes while 
SY-32 uses (Turkish based) modified character-index values. Sy32Val function 
gives the modified value for Index file which has 44 sort records. Previous 
version of SY-32 was using "instr" function and a character sort table which 
has 109 characters.
Read sy-26.html for other SY-26/SY-32 snippets and US-English sort method.
Return to adres417.html