Π?ΠΌΠΏΠΎΡ€Ρ‚ банковской выписки

ΠœΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π» ΠΈΠ· GedeminWiki
ΠŸΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ: навигация, поиск

ΠžΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠΌΠΏΠΎΡ€Ρ‚ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· тСкстововго Ρ„Π°ΠΉΠ»Π° Π² Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… Π“Π΅Π΄Ρ‹ΠΌΠΈΠ½Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠ°ΠΊ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ встроСнного ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° ΠΈΠΌΠΏΠΎΡ€Ρ‚Π°, Ρ‚Π°ΠΊ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ рСгулярныС выраТСния. Π’ Π΄Π°Π½Π½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ рассмотрим Π²Ρ‚ΠΎΡ€ΠΎΠΉ способ. Π’ качСствС ΠΎΠ±Ρ€Π°Π·Ρ†Π° Ρ„Π°ΠΉΠ»Π° с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ возьмСм Π±Π°Π½ΠΊΠΎΠ²ΡΠΊΡƒΡŽ выписку Π‘Π΅Π»Π°Π³Ρ€ΠΎΠΏΡ€ΠΎΠΌΠ±Π°Π½ΠΊΠ°. Как Π²ΠΈΠ΄Π½ΠΎ, содСрТимоС Ρ„Π°ΠΉΠ»Π° -- это выписка ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΈΠ»ΠΈ нСскольким банковским счСтам. НапишСм ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ ParseFile, которая Π±ΡƒΠ΄Π΅Ρ‚ ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» с диска Π² строку, ΠΏΠ΅Ρ€Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΈΠ· Π”ΠžΠ‘ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ Ρ€Π°Π·Π±ΠΎΡ€Π° выписки ParseStatement:

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅

ParseFile

Sub ParseFile
  Const ForReading = 1
  Dim s
  s = System.OEMToAnsi(CreateObject("Scripting.FileSystemObject")._
    OpenTextFile("c:\temp\vyp.txt", ForReading).ReadAll)
  ParseStatement s
End Sub

Π—Π°Π΄Π°Ρ‡Π° ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ ParseStatement -- Ρ€Π°Π·Π±ΠΈΡ‚ΡŒ тСкст Π½Π° ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½Ρ‹Π΅ выписки ΠΈ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ ParseOneStatement, ΠΏΠ΅Ρ€Π΅Π΄Π°Π² Π΅ΠΉ Π½Π° Π²Ρ…ΠΎΠ΄ счСт, Π΄Π°Ρ‚Ρƒ выписки ΠΈ Π΅Π΅ тСкст:

ParseStatement

Sub ParseStatement(s)
  Dim regEx, Matches, I, J
  Set regEx = CreateObject("VBScript.RegExp")
  regEx.IgnoreCase = True
  regEx.Global = True
  regEx.Pattern = "Π›ΠΈΡ†Π΅Π²ΠΎΠΉ\s+ΠΏΠΎ\s+счСту\s+N\s+(\d{4})-(\d{9}).+Π·Π°\D+(\d{1,2})\.(\d{1,2})\.(\d{1,4})" 

  Set Matches = regEx.Execute(s)
  For I = 1 To Matches.Count
   If I = Matches.Count Then
     J = Len(s)
   Else
     J = Matches(I).FirstIndex
   End If
   ParseOneStatement Matches(I - 1).SubMatches(0) & Matches(I - 1).SubMatches(1), _
     DateSerial(Matches(I - 1).SubMatches(4), Matches(I - 1).SubMatches(3), Matches(I - 1).SubMatches(2)), _
     Mid(s, Matches(I - 1).FirstIndex, J - Matches(I - 1).FirstIndex)
  Next
End Sub

Как Π²ΠΈΠ΄Π½ΠΎ, ΠΌΡ‹ распознаСм выписки Π² Ρ„Π°ΠΉΠ»Π΅ ΠΏΠΎ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΡƒ. ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ содСрТит строку "Π›ΠΈΡ†Π΅Π²ΠΎΠΉ счСт". Из Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° ΠΌΡ‹ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅ΠΌ Π½ΠΎΠΌΠ΅Ρ€ счСта ΠΈ Π΄Π°Ρ‚Ρƒ выписки. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ счСт ΠΌΡ‹ "склСиваСм" ΠΈΠ· Π΄Π²ΡƒΡ… частСй, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π² ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»Π΅ ΠΎΠ½ содСрТит Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ -- дСфис. Π”Π°Ρ‚Ρƒ ΠΈΠ· тСкста ΠΌΡ‹ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅ΠΌ ΠΏΠΎ-ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ: дСнь, мСсяц ΠΈ Π³ΠΎΠ΄, объСдиняя ΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΌ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ DateSerial.

Для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ выписки, указанная ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅Ρ‚ Π½ΠΎΠΌΠ΅Ρ€ счСта, Π΄Π°Ρ‚Ρƒ выписки ΠΈ вмСстС с Π΅Π΅ тСкстом ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ Π½Π° Π²Ρ…ΠΎΠ΄ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π΅ ParseOneStatement.

ParseOneStatement

Sub ParseOneStatement(acc, dt, s)
  Dim regEx, Match, Matches, I
  Set regEx = CreateObject("VBScript.RegExp")
  regEx.IgnoreCase = True
  regEx.Global = True
  regEx.MultiLine = True
  
  regEx.Pattern = "Код банка \d{6}(\d{3})"
  Set Matches = regEx.Execute(s)
 
  Dim AccID
  AccID = FindAccount(acc, Matches(0).SubMatches(0))
  
  regEx.Pattern = "^\s+(\d{1,2}) (\d{3}) (\d{4})-(\d{9})\s+(\d+).{6}\s+([0-9 .]+)"

  Set Matches = regEx.Execute(s)
  If Matches.Count > 0 Then
 
    Dim Creator, ObjV, ObjL
    Set Creator = new TCreator
    Set ObjV = Creator.GetObject(Application, "TgdcBankStatement", "")
    Set ObjL = Creator.GetObject(Application, "TgdcBankStatementLine", "")

    ObjV.Open
    ObjV.Insert
    ObjV.FieldByName("accountkey").AsInteger = AccID
    ObjV.FieldByName("documentdate").AsDateTime = dt
    ObjV.Post
  
    ObjL.Open
    For Each Match In Matches
      ObjL.Insert
      ObjL.FieldByName("operationtype").AsString = Match.SubMatches(0)
      ObjL.FieldByName("account").AsString = Match.SubMatches(2) & Match.SubMatches(3)
      ObjL.FieldByName("bankcode").AsString = Match.SubMatches(1)
      ObjL.FieldByName("number").AsString = Match.subMatches(4)
      ObjL.FieldByName("documentdate").AsDateTime = dt
      If Len(Match.Value) < 55 Then
        ObjL.FieldByName("dsumncu").AsCurrency = Replace(Match.subMatches(5), " ", "")
      Else
        ObjL.FieldByName("csumncu").AsCurrency = Replace(Match.subMatches(5), " ", "")
      End If
      ObjL.FieldByName("parent").AsInteger = ObjV.ID
      ObjL.Post
    Next
  End If
End Sub


FindAccount

Function FindAccount(Acc, BankCode) 

  Dim BankID
  BankID = FindBank(BankCode)

  Dim Creator, q
  Set Creator = new TCreator
  Set q = Creator.GetObject(Application, "TIBSQL", "")
  q.Transaction = gdcBaseManager.ReadTransaction
  q.SQL.Text = "SELECT a.id FROM gd_companyaccount a JOIN gd_bank b " &_
    "ON b.bankkey = a.bankkey AND b.bankcode = :BC AND a.account = :ACC "
  q.ParamByName("BC").AsString = BankCode
  q.ParamByName("Acc").AsString = Acc
  q.ExecQuery
  
  If q.EOF Then
    Dim ObjA
    Set ObjA = Creator.GetObject(Application, "TgdcAccount", "")
   
    ObjA.Open
    ObjA.Insert
    ObjA.FieldByName("account").AsString = Acc
    ObjA.FieldByName("companykey").AsInteger = IBLogin.CompanyKey
    ObjA.FieldByName("bankkey").AsInteger = BankID
    ObjA.Post
   
    FindAccount = ObjA.ID
  Else
    FindAccount = q.Fields(0).AsInteger
  End If

End Function

FindBank

Function FindBank(BankCode)
  Dim Creator, q
  Set Creator = new TCreator
  Set q = Creator.GetObject(Application, "TIBSQL", "")
  q.Transaction = gdcBaseManager.ReadTransaction
  q.SQL.Text = "SELECT bankkey FROM gd_bank WHERE bankcode = :BC"
  q.ParamByName("BC").AsString = BankCode
  q.ExecQuery
  If q.EOF Then
    Dim ObjB
    Set ObjB = Creator.GetObject(Application, "TgdcBank", "")
    ObjB.Open
    ObjB.Insert
    ObjB.FieldByName("name").AsString = BankCode
    ObjB.FieldByName("bankcode").AsString = BankCode
    ObjB.Post
    FindBank = ObjB.ID
  Else
    FindBank = q.Fields(0).AsInteger
  End If
End Function
ΠŸΠ΅Ρ€ΡΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ инструмСнты
ΠŸΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΡ‚Π²Π° ΠΈΠΌΡ‘Π½

Π’Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹
ДСйствия
Навигация
Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Ρ‹