Antonariy,
Исходные данные
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28.
******* ОТДЕЛЕНИЕ / ФИЛИАЛ : 0001 / 0001
------------------------------------------------------------------------------------------------------------------------------------
История по карточному счету клиента за период : 01.06.2011 - 30.06.2011
Банк : 01 Дата обработки в системе UniCard : 09.08.2011
Карточка : 600000000000000006 MAESTRO
Счет номер : 40000000000000000003 / Валюта счета : 810 / Кредит.лимит : 0
Фамилия И.О. : ИВАНОВ И.И.
Отделение / Филиал : 0001 / 0001 Дата открытия счета : 23MAY05
------------------------------------------------------------------------------------------------------------------------------------
Номер держат. Дата Тип Номер Дата Приход Расход Описание транзакции
Номер выпуска транзакции транз. транз. платежа
------------------------------------------------------------------------------------------------------------------------------------
1/0 03JUN11 0000 000000 306 3288.63 0.00
1/0 06JUN11 0100 000000 606 0.00 -300.00 BANKOMAT ...
1/0 14JUN11 0000 000007 1406 0.00 -500.00 BANKOMAT ...
1/0 17JUN11 0010 20003 1706 0.00 -100.00 BEE-.....
1/0 17JUN11 0000 00073 1706 0.00 -100.00 BANKOMAT ...
1/0 17JUN11 0100 100001 1706 0.00 -20.00 BANKOMAT ...
1/0 17JUN11 0000 300001 1706 1000.00 0.00
1/0 17JUN11 0010 900039 1706 0.00 -10.00 BANKOMAT ...
1/0 20JUN11 0000 200003 2006 0.00 -200.00 MOB.. .
1/0 22JUN11 0100 200004 2206 0.00 -60.00
1/0 27JUN11 0000 900000 2606 0.00 -500.00 BANKOMAT
------------------------------------------------------------------------------------------------------------------------------------
Итого : 4288.63 -1790.00
Остаток на начало периода : 5018.52
Остаток на конец периода : 7517.15
Таких кусочков много, через некоторое время начинается новый филиал и все повторяется с ******* ОТДЕЛЕНИЕ / ФИЛИАЛ : 0001 / 0001
в шапке бывает что нет номера счета и/или даты открытия счета
количество строк после шапки может быть разным, от 1 и до ...
класс CXml4Db
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. 205. 206. 207. 208. 209. 210. 211. 212. 213. 214. 215. 216. 217. 218. 219. 220. 221. 222. 223. 224. 225. 226. 227. 228. 229. 230. 231. 232. 233. 234. 235. 236. 237. 238. 239. 240. 241. 242. 243. 244. 245. 246. 247. 248. 249. 250. 251. 252. 253. 254. 255. 256. 257. 258. 259. 260. 261. 262. 263. 264. 265. 266. 267. 268. 269. 270. 271. 272. 273. 274. 275. 276. 277. 278. 279. 280. 281. 282. 283. 284. 285. 286. 287. 288. 289. 290. 291. 292. 293. 294. 295. 296. 297. 298. 299. 300. 301. 302. 303. 304. 305. 306. 307. 308. 309. 310. 311. 312. 313. 314. 315. 316. 317. 318.
' =======================================
Option Compare Database
Option Explicit
Option Base 0
' =======================================
' =======================================
' Define private const
Private Const m_csModuleName As String = "CXml4Db"
Private Const cnMaxXmlSize As Long = 1073741823 ' максимальный размер xml, которые сервер сможет принять
Private Const cstrXmlQuot As String = """
Private Const cstrXmlAmp As String = "&"
Private Const cstrXmlApos As String = "'"
Private Const cstrXmlLt As String = "<"
Private Const cstrXmlGt As String = ">"
'Private Const cstrQuot As String = """ ' & Chr(34)" ' ну и как же мне блин это объявить константой?!!
Private Const cstrAmp As String = "&"
Private Const cstrApos As String = "`"
Private Const cstrLt As String = "<"
Private Const cstrGt As String = ">"
' =======================================
' =======================================
' define private var's
Private conn As New ADODB.Connection ' соединение с базой данных
Private cmdAddXml As New ADODB.Command ' команда выполнение которой позволит загрузить xml в бд
Private cmdRs As ADODB.Recordset ' для взятия результата выполнения команды
Private strStorageProcedureName As String ' имя хранимой процедуры, которую необходимо выполнить для
' загрузки xml в базу данных
Private strStorageProcedureParam As String ' имя параметра хранимой процедуры, подразумевается, что
' параметр имеет тип xml
Private strMainBuffer As String ' основной буфер для хранения xml
Private colTagStack As New Collection ' Стэк открытых тэгов
Private nTagStackCharLen As Long ' длина стэка в символах
Private bPrepared As Boolean ' признак инициализации
Private cstrQuot As String
' =======================================
' =======================================
Private Sub Class_Initialize()
strStorageProcedureName = vbNullString
strStorageProcedureParam = vbNullString
strMainBuffer = vbNullString
cstrQuot = "" & Chr(34)
bPrepared = False
nTagStackCharLen = 0
End Sub
' =======================================
' =======================================
' чистит буфер
Private Sub ClearBuffer()
strMainBuffer = vbNullString
End Sub
' =======================================
' =======================================
Private Sub Class_Terminate()
End Sub
' =======================================
' =======================================
' уровень заполнения буфера в процентах
' =======================================
Property Get FillLevel() As Long
FillLevel = Fix((Len(strMainBuffer) + nTagStackCharLen) / cnMaxXmlSize * 100)
End Property
' =======================================
' =======================================
' максимальный размер буфера
' =======================================
Property Get MaxSize() As Long
MaxSize = cnMaxXmlSize
End Property
' =======================================
' =======================================
' максимальный размер буфера
' =======================================
Property Get CurrentSize() As Long
CurrentSize = Len(strMainBuffer)
End Property
' =======================================
' =======================================
' был ли инициализирован объект
' =======================================
Property Get IsPrepared() As Long
IsPrepared = bPrepared
End Property
' =======================================
' =======================================
' инициализирующая функция, необходимо передать строку соединения, имя хранимой процедуры
' и имя параметра хранимой процедуры
' =======================================
Public Function Prepare(strConnectionString As String, strSpName As String, strSpParamName As String) As Boolean
On Error GoTo Error_Prepare
bPrepared = False
Prepare = False
strStorageProcedureName = strSpName
strStorageProcedureParam = strSpParamName
conn.CursorLocation = adUseClient
Call conn.Open(strConnectionString)
' ------------------
cmdAddXml.ActiveConnection = conn
cmdAddXml.CommandText = strSpName
cmdAddXml.CommandTimeout = 0
cmdAddXml.CommandType = adCmdStoredProc
Call cmdAddXml.Parameters.Append(cmdAddXml.CreateParameter("@return", adInteger, adParamReturnValue))
Call cmdAddXml.Parameters.Append(cmdAddXml.CreateParameter(strSpParamName, adVarWChar, adParamInput, cnMaxXmlSize))
' ------------------
Call ClearBuffer
Prepare = True
bPrepared = True
Exit Function
Error_Prepare:
Call ErrorMessage(m_csModuleName, "Prepare")
End Function
' =======================================
' =======================================
Private Function AddXml2Db() As Long
On Error GoTo Error_AddXml2Db
AddXml2Db = -1
' если не было инициализации, то работать не будем
If (Not IsPrepared) Then Exit Function
conn.BeginTrans
cmdAddXml.Parameters("@return").value = 0
cmdAddXml.Parameters(strStorageProcedureParam).value = strMainBuffer
Set cmdRs = cmdAddXml.Execute()
AddXml2Db = cmdAddXml.Parameters("@return").value
conn.CommitTrans
Exit Function
Error_AddXml2Db:
Call ErrorMessage(m_csModuleName, "AddXml2Db")
conn.RollbackTrans
'Resume Next
End Function
' =======================================
' =======================================
Public Function FlushBuffer() As Long
On Error GoTo ErrorHandler
FlushBuffer = -1
Exit Function
' на всякий случай закроем все тэги из стэка
Call CloseAllTag
' если буфер пусть, то ни чего выполнять не будем.
'If (nMainBufferLen = 0) Then Exit Function
If (Len(strMainBuffer) = 0) Then Exit Function
' собственно отправляем данные в БД
FlushBuffer = AddXml2Db()
' чистим буфер
Call ClearBuffer
Exit Function
ErrorHandler:
Stop
End Function
' =======================================
' =======================================
' открывает новый тэг, фактически заменяет предустановленные константы, если они есть в имени тэга
' добавляет тэг в стэк, вычисляет длину стэка в символах
' =======================================
Public Sub OpenTag(strTagName As String)
On Error GoTo ErrorHandler
' добавим в стэк
Call colTagStack.Add(strTagName)
' добавим в буффер
strMainBuffer = strMainBuffer & "<" & strTagName & ">" & vbCrLf
' вычислим длину стэка
nTagStackCharLen = nTagStackCharLen + Len(strTagName)
Exit Sub
ErrorHandler:
Stop
End Sub
' =======================================
' =======================================
' закрывает тэг, если существует открытый тэг в стэке
' =======================================
Public Sub CloseTag()
On Error GoTo ErrorHandler
Dim nItemCount As Long, strTagName As String
' закрывать будем с хвоста
nItemCount = colTagStack.Count
' если в стэке что-то есть, то будем закрывать
If (nItemCount > 0) Then
' формируем тэг xml
strTagName = "</" & colTagStack.item(nItemCount) & ">"
' кладем его в главный буфер
strMainBuffer = strMainBuffer & strTagName & vbCrLf
' правим длину стэка в символах
nTagStackCharLen = nTagStackCharLen - Len(strTagName) + 3 ' "</ >" --> 3
' удаляем элемент из стэка
Call colTagStack.Remove(nItemCount)
End If
Exit Sub
ErrorHandler:
Stop
End Sub
' =======================================
' =======================================
' закрывает все тэги, которые существуют в стэке
Public Sub CloseAllTag()
On Error GoTo ErrorHandler
' цикл по всем элементам стэка
While colTagStack.Count > 0
Call CloseTag
Wend
' на всякий случай обнулим, возможно я где-то ошибся в вычислениях ...
nTagStackCharLen = 0
Exit Sub
ErrorHandler:
Stop
End Sub
' =======================================
' =======================================
' добавляет данные, обернутые в тэг, данные и тэги просматриваются на предмет наличия предустановленных констант
Public Sub AddData(strTagName As String, strData As String)
On Error GoTo ErrorHandler
' локальные переменные
Dim strTrueData As String, strOpenTag As String, strCloseTag As String, strItem As String
strOpenTag = "<" & strTagName & ">"
strCloseTag = "</" & strTagName & ">"
' заменим предустановленные константы для данных
strTrueData = strData
strTrueData = Replace(strTrueData, cstrQuot, cstrXmlQuot)
strTrueData = Replace(strTrueData, cstrAmp, cstrXmlAmp)
strTrueData = Replace(strTrueData, cstrApos, cstrXmlApos)
strTrueData = Replace(strTrueData, cstrLt, cstrXmlLt)
strTrueData = Replace(strTrueData, cstrGt, cstrXmlGt)
strItem = strOpenTag & strTrueData & strCloseTag
strMainBuffer = strMainBuffer & strItem & vbCrLf
Exit Sub
ErrorHandler:
Stop
End Sub
' =======================================
' =======================================
' добавляет текст в основной буфер, предполается, что текст правильный и его не нужно фильтровать
Public Sub AddText(strText As String)
On Error GoTo ErrorHandler
strMainBuffer = strMainBuffer & strText
Exit Sub
ErrorHandler:
Stop
End Sub
' =======================================
Класс CImportSvvSve, в нем фактически все самое затратное сконцентрировано в функции Import_One_SvvSveWithXml
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. 205. 206. 207. 208. 209. 210. 211. 212. 213. 214. 215. 216. 217. 218. 219. 220. 221. 222. 223. 224. 225. 226. 227. 228. 229. 230. 231. 232. 233. 234. 235. 236. 237. 238. 239. 240. 241. 242. 243. 244. 245. 246. 247. 248. 249. 250. 251. 252. 253. 254. 255. 256. 257. 258. 259. 260. 261. 262. 263. 264. 265. 266. 267. 268. 269. 270. 271. 272. 273. 274. 275. 276. 277. 278. 279. 280. 281. 282. 283. 284. 285. 286. 287. 288. 289. 290. 291. 292. 293. 294. 295. 296. 297. 298. 299. 300. 301. 302. 303. 304. 305. 306. 307. 308. 309. 310. 311. 312. 313. 314. 315. 316. 317. 318. 319. 320. 321. 322. 323. 324. 325. 326. 327. 328. 329. 330. 331. 332. 333. 334. 335. 336. 337. 338. 339. 340. 341. 342. 343. 344. 345. 346. 347. 348. 349. 350. 351. 352. 353. 354. 355. 356. 357. 358. 359. 360. 361. 362. 363. 364. 365. 366. 367. 368. 369. 370. 371. 372. 373. 374. 375. 376. 377. 378. 379. 380. 381. 382. 383. 384. 385. 386. 387. 388. 389. 390. 391. 392. 393. 394. 395. 396. 397. 398. 399. 400. 401. 402. 403. 404. 405. 406. 407. 408. 409. 410. 411. 412. 413. 414. 415. 416. 417. 418. 419. 420. 421. 422. 423. 424. 425. 426. 427. 428. 429. 430. 431. 432. 433. 434. 435. 436. 437. 438. 439. 440. 441. 442. 443. 444. 445. 446. 447. 448. 449. 450. 451. 452. 453. 454. 455. 456. 457. 458. 459. 460. 461. 462. 463. 464. 465. 466. 467. 468. 469. 470. 471. 472. 473. 474. 475. 476. 477. 478. 479. 480. 481. 482. 483. 484. 485. 486. 487. 488. 489. 490. 491. 492. 493. 494. 495. 496. 497. 498. 499. 500. 501. 502. 503. 504. 505. 506. 507. 508. 509. 510. 511. 512. 513. 514. 515. 516. 517. 518. 519. 520. 521. 522. 523. 524. 525. 526. 527. 528. 529. 530. 531. 532. 533. 534. 535. 536. 537. 538. 539. 540. 541. 542. 543. 544. 545. 546. 547. 548. 549. 550. 551. 552. 553. 554. 555. 556. 557. 558. 559. 560. 561. 562. 563. 564. 565. 566. 567. 568. 569. 570. 571. 572. 573. 574. 575. 576. 577. 578. 579. 580. 581. 582. 583. 584. 585. 586. 587. 588. 589. 590. 591. 592. 593. 594. 595. 596. 597. 598. 599. 600. 601. 602. 603. 604. 605. 606. 607. 608. 609. 610. 611. 612. 613. 614. 615. 616. 617. 618. 619. 620. 621. 622. 623. 624. 625. 626. 627. 628. 629. 630. 631. 632. 633. 634. 635. 636. 637. 638. 639. 640. 641. 642. 643. 644. 645. 646. 647. 648. 649. 650. 651. 652. 653. 654. 655. 656. 657. 658. 659. 660. 661. 662. 663. 664. 665. 666. 667. 668. 669. 670. 671. 672. 673. 674. 675. 676. 677. 678. 679. 680. 681. 682. 683. 684. 685. 686. 687. 688. 689. 690. 691. 692. 693. 694. 695. 696. 697. 698. 699. 700. 701. 702. 703. 704. 705. 706. 707. 708. 709. 710. 711. 712. 713. 714. 715. 716. 717. 718. 719. 720. 721. 722. 723. 724. 725. 726. 727. 728. 729. 730. 731. 732. 733. 734. 735. 736. 737. 738. 739. 740. 741. 742. 743. 744. 745. 746. 747. 748. 749. 750. 751. 752. 753. 754. 755. 756. 757. 758. 759. 760. 761. 762. 763. 764. 765. 766. 767. 768. 769. 770. 771. 772. 773. 774. 775. 776. 777. 778. 779. 780. 781. 782. 783. 784. 785. 786. 787. 788. 789. 790. 791. 792. 793. 794. 795. 796. 797. 798. 799. 800. 801. 802. 803. 804. 805. 806. 807. 808. 809. 810. 811. 812. 813. 814. 815. 816. 817. 818. 819. 820. 821. 822. 823. 824. 825. 826. 827. 828. 829. 830. 831. 832. 833. 834. 835. 836. 837. 838. 839. 840. 841. 842. 843. 844. 845. 846. 847. 848. 849. 850. 851. 852. 853. 854. 855. 856. 857. 858. 859. 860. 861. 862. 863. 864. 865. 866. 867. 868. 869. 870. 871. 872. 873. 874. 875. 876. 877. 878. 879. 880. 881. 882. 883. 884. 885. 886. 887. 888. 889. 890. 891. 892. 893. 894. 895. 896. 897. 898. 899. 900. 901. 902. 903. 904. 905. 906. 907. 908. 909. 910. 911. 912. 913. 914. 915. 916. 917. 918. 919. 920. 921. 922. 923. 924. 925. 926. 927. 928. 929. 930. 931. 932. 933. 934. 935. 936. 937. 938. 939. 940. 941. 942. 943. 944. 945. 946. 947. 948. 949. 950. 951. 952. 953. 954. 955. 956. 957. 958. 959. 960. 961. 962. 963. 964. 965. 966. 967. 968. 969.
' =======================================
Option Compare Database
Option Explicit
Option Base 0
' =======================================
' =======================================
' Define private const
Private Const m_csModuleName = "CImportSvvSve"
Private Const csFileType1 = "EUROPAY INTERNATIONAL"
Private Const csFileType2 = "VISA INTERNATIONAL"
Private Const csFileType3 = "**** ОТДЕЛЕНИЕ / ФИЛИАЛ :"
Private Const csSqlAddCard = "prc_AddCard"
Private Const csSqlAddCardFile = "prc_AddCardFile"
Private Const csSqlGetCardFileId = "prc_GetCardFileId"
Private Const csSqlCardFileEndLoad = "prc_CardFileEndLoad"
Private Const csSqlAddCardHistory = "prc_AddCardHistory"
Private Const csSqlUpdateCardHistory = "prc_UpdateCardHistory"
Private Const csSqlAddCardOperation = "prc_AddCardOperation"
Private Const csSqlXmlProcedureName = "prc_Add"
Private Const csSqlXmlProcedureParam = "@XmlDoc"
' =======================================
' =======================================
' define private var's
Private monthListRus As Variant
Private monthListEng As Variant
Private conn As New ADODB.Connection
Private cmdAddCard As New ADODB.Command
Private cmdAddCardFile As New ADODB.Command
Private cmdGetCardFileId As New ADODB.Command
Private cmdCardFileEndLoad As New ADODB.Command
Private cmdAddCardHistory As New ADODB.Command
Private cmdUpdateCardHistory As New ADODB.Command
Private cmdAddCardOperation As New ADODB.Command
Private cmdRs As ADODB.Recordset
Private TrueDecDelimiter As String
' =======================================
' =======================================
Private Sub Class_Initialize()
' Array index - 0 To 11 - option base 0
monthListEng = Array("JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC")
monthListRus = Array("ЯНВ", "ФЕВ", "МАР", "АПР", "МАЙ", "ИЮН", "ИЮЛ", "АВГ", "СЕН", "ОКТ", "НОЯ", "ДЕК")
TrueDecDelimiter = Trim(GetSysLocaleInfo(LOCALE_SDECIMAL))
End Sub
' =======================================
' =======================================
Private Function Prepare(strConnectionString As String) As Boolean
On Error GoTo Error_Prepare
Prepare = False
conn.CursorLocation = adUseClient
Call conn.Open(strConnectionString)
' ------------------
cmdAddCard.ActiveConnection = conn
cmdAddCard.CommandText = csSqlAddCard
cmdAddCard.CommandTimeout = 0
cmdAddCard.CommandType = adCmdStoredProc
Call cmdAddCard.Parameters.Append(cmdAddCard.CreateParameter("@return", adInteger, adParamReturnValue))
Call cmdAddCard.Parameters.Append(cmdAddCard.CreateParameter("@pCardNum", adVarChar, adParamInput, 25))
Call cmdAddCard.Parameters.Append(cmdAddCard.CreateParameter("@pAccountNum", adVarChar, adParamInput, 20))
Call cmdAddCard.Parameters.Append(cmdAddCard.CreateParameter("@pCardType", adVarChar, adParamInput, 50))
Call cmdAddCard.Parameters.Append(cmdAddCard.CreateParameter("@pCurrencyCode", adChar, adParamInput, 3))
Call cmdAddCard.Parameters.Append(cmdAddCard.CreateParameter("@pClientName", adVarChar, adParamInput, 100))
Call cmdAddCard.Parameters.Append(cmdAddCard.CreateParameter("@pAccountOpenDate", adDate, adParamInput))
Call cmdAddCard.Parameters.Append(cmdAddCard.CreateParameter("@pBankCode", adChar, adParamInput, 2))
Call cmdAddCard.Parameters.Append(cmdAddCard.CreateParameter("@pOsbNum", adVarChar, adParamInput, 4))
Call cmdAddCard.Parameters.Append(cmdAddCard.CreateParameter("@pVspNum", adVarChar, adParamInput, 5))
' ------------------
' ------------------
cmdAddCardFile.ActiveConnection = conn
cmdAddCardFile.CommandText = csSqlAddCardFile
cmdAddCardFile.CommandTimeout = 0
cmdAddCardFile.CommandType = adCmdStoredProc
Call cmdAddCardFile.Parameters.Append(cmdAddCardFile.CreateParameter("@return", adInteger, adParamReturnValue))
Call cmdAddCardFile.Parameters.Append(cmdAddCardFile.CreateParameter("@pCardFileName", adVarChar, adParamInput, 800))
Call cmdAddCardFile.Parameters.Append(cmdAddCardFile.CreateParameter("@pCardFileSize", adBigInt, adParamInput))
' ------------------
' ------------------
cmdGetCardFileId.ActiveConnection = conn
cmdGetCardFileId.CommandText = csSqlGetCardFileId
cmdGetCardFileId.CommandTimeout = 0
cmdGetCardFileId.CommandType = adCmdStoredProc
Call cmdGetCardFileId.Parameters.Append(cmdGetCardFileId.CreateParameter("@return", adInteger, adParamReturnValue))
Call cmdGetCardFileId.Parameters.Append(cmdGetCardFileId.CreateParameter("@pCardFileName", adVarChar, adParamInput, 800))
Call cmdGetCardFileId.Parameters.Append(cmdGetCardFileId.CreateParameter("@pCardFileSize", adBigInt, adParamInput))
' ------------------
' ------------------
cmdCardFileEndLoad.ActiveConnection = conn
cmdCardFileEndLoad.CommandText = csSqlCardFileEndLoad
cmdCardFileEndLoad.CommandTimeout = 0
cmdCardFileEndLoad.CommandType = adCmdStoredProc
Call cmdCardFileEndLoad.Parameters.Append(cmdCardFileEndLoad.CreateParameter("@return", adInteger, adParamReturnValue))
Call cmdCardFileEndLoad.Parameters.Append(cmdCardFileEndLoad.CreateParameter("@pIdCardFile", adInteger, adParamInput))
' ------------------
' ------------------
cmdAddCardHistory.ActiveConnection = conn
cmdAddCardHistory.CommandText = csSqlAddCardHistory
cmdAddCardHistory.CommandTimeout = 0
cmdAddCardHistory.CommandType = adCmdStoredProc
Call cmdAddCardHistory.Parameters.Append(cmdAddCardHistory.CreateParameter("@return", adInteger, adParamReturnValue))
Call cmdAddCardHistory.Parameters.Append(cmdAddCardHistory.CreateParameter("@pBegDate", adDate, adParamInput))
Call cmdAddCardHistory.Parameters.Append(cmdAddCardHistory.CreateParameter("@pEndDate", adDate, adParamInput))
Call cmdAddCardHistory.Parameters.Append(cmdAddCardHistory.CreateParameter("@pCardLimit", adDouble, adParamInput))
Call cmdAddCardHistory.Parameters.Append(cmdAddCardHistory.CreateParameter("@pUnicardDate", adDate, adParamInput))
Call cmdAddCardHistory.Parameters.Append(cmdAddCardHistory.CreateParameter("@pIdCardFile", adInteger, adParamInput))
Call cmdAddCardHistory.Parameters.Append(cmdAddCardHistory.CreateParameter("@pIdCard", adInteger, adParamInput))
' ------------------
' ------------------
cmdUpdateCardHistory.ActiveConnection = conn
cmdUpdateCardHistory.CommandText = csSqlUpdateCardHistory
cmdUpdateCardHistory.CommandTimeout = 0
cmdUpdateCardHistory.CommandType = adCmdStoredProc
Call cmdUpdateCardHistory.Parameters.Append(cmdUpdateCardHistory.CreateParameter("@return", adInteger, adParamReturnValue))
Call cmdUpdateCardHistory.Parameters.Append(cmdUpdateCardHistory.CreateParameter("@pIdCardHistory", adInteger, adParamInput))
Call cmdUpdateCardHistory.Parameters.Append(cmdUpdateCardHistory.CreateParameter("@pBegRest", adDouble, adParamInput))
Call cmdUpdateCardHistory.Parameters.Append(cmdUpdateCardHistory.CreateParameter("@pEndRest", adDouble, adParamInput))
Call cmdUpdateCardHistory.Parameters.Append(cmdUpdateCardHistory.CreateParameter("@pTurnoverIn", adDouble, adParamInput))
Call cmdUpdateCardHistory.Parameters.Append(cmdUpdateCardHistory.CreateParameter("@pTurnoverOut", adDouble, adParamInput))
' ------------------
' ------------------
cmdAddCardOperation.ActiveConnection = conn
cmdAddCardOperation.CommandText = csSqlAddCardOperation
cmdAddCardOperation.CommandTimeout = 0
cmdAddCardOperation.CommandType = adCmdStoredProc
Call cmdAddCardOperation.Parameters.Append(cmdAddCardOperation.CreateParameter("@return", adInteger, adParamReturnValue))
Call cmdAddCardOperation.Parameters.Append(cmdAddCardOperation.CreateParameter("@pNumD", adInteger, adParamInput))
Call cmdAddCardOperation.Parameters.Append(cmdAddCardOperation.CreateParameter("@pNumV", adInteger, adParamInput))
Call cmdAddCardOperation.Parameters.Append(cmdAddCardOperation.CreateParameter("@pTransDate", adDate, adParamInput))
Call cmdAddCardOperation.Parameters.Append(cmdAddCardOperation.CreateParameter("@pTransType", adInteger, adParamInput))
Call cmdAddCardOperation.Parameters.Append(cmdAddCardOperation.CreateParameter("@pTransNum", adInteger, adParamInput))
Call cmdAddCardOperation.Parameters.Append(cmdAddCardOperation.CreateParameter("@pPayDate", adDate, adParamInput))
Call cmdAddCardOperation.Parameters.Append(cmdAddCardOperation.CreateParameter("@pSummIn", adDouble, adParamInput))
Call cmdAddCardOperation.Parameters.Append(cmdAddCardOperation.CreateParameter("@pSummOut", adDouble, adParamInput))
Call cmdAddCardOperation.Parameters.Append(cmdAddCardOperation.CreateParameter("@pTransRem", adVarChar, adParamInput, 50))
Call cmdAddCardOperation.Parameters.Append(cmdAddCardOperation.CreateParameter("@pIdCardHistory", adInteger, adParamInput))
' ------------------
Prepare = True
Exit Function
Error_Prepare:
Call ErrorMessage(m_csModuleName, "Prepare")
End Function
' =======================================
' =======================================
Private Function AddCardFile(strCardFileName As String, strCardFileSize As String) As Long
On Error GoTo Error_AddCardFile
AddCardFile = 0
conn.BeginTrans
cmdAddCardFile.Parameters("@return").value = 0
cmdAddCardFile.Parameters("@pCardFileName").value = strCardFileName
cmdAddCardFile.Parameters("@pCardFileSize").value = strCardFileSize
Set cmdRs = cmdAddCardFile.Execute()
AddCardFile = cmdAddCardFile.Parameters("@return").value
conn.CommitTrans
Exit Function
Error_AddCardFile:
Call ErrorMessage(m_csModuleName, "AddCardFile")
conn.RollbackTrans
'Resume Next
End Function
' =======================================
' =======================================
Private Function GetCardFileId(strCardFileName As String, strCardFileSize As String) As Long
On Error GoTo Error_GetCardFileId
GetCardFileId = 0
conn.BeginTrans
cmdGetCardFileId.Parameters("@return").value = 0
cmdGetCardFileId.Parameters("@pCardFileName").value = strCardFileName
cmdGetCardFileId.Parameters("@pCardFileSize").value = strCardFileSize
Set cmdRs = cmdGetCardFileId.Execute()
GetCardFileId = cmdGetCardFileId.Parameters("@return").value
conn.CommitTrans
Exit Function
Error_GetCardFileId:
Call ErrorMessage(m_csModuleName, "GetCardFileId")
conn.RollbackTrans
'Resume Next
End Function
' =======================================
' =======================================
Private Function CardFileEndLoad(strIdCardFile As String) As Long
On Error GoTo Error_GetCardFileId
CardFileEndLoad = 0
conn.BeginTrans
cmdCardFileEndLoad.Parameters("@return").value = 0
cmdCardFileEndLoad.Parameters("@pIdCardFile").value = strIdCardFile
Set cmdRs = cmdCardFileEndLoad.Execute()
CardFileEndLoad = cmdCardFileEndLoad.Parameters("@return").value
conn.CommitTrans
Exit Function
Error_GetCardFileId:
Call ErrorMessage(m_csModuleName, "CardFileEndLoad")
conn.RollbackTrans
'Resume Next
End Function
' =======================================
' =======================================
Private Function AddCard(strCardNum As String, strAccountNum As String, strCardType As String, _
strCurrencyCode As String, strClientName As String, strAccountOpenDate As String, _
strBankCode As String, strOsbNum As String, strVspNum As String) As Long
On Error GoTo Error_AddCard
AddCard = 0
conn.BeginTrans
cmdAddCard.Parameters("@return").value = 0
cmdAddCard.Parameters("@pCardNum").value = strCardNum
cmdAddCard.Parameters("@pAccountNum").value = strAccountNum
cmdAddCard.Parameters("@pCardType").value = strCardType
cmdAddCard.Parameters("@pCurrencyCode").value = strCurrencyCode
cmdAddCard.Parameters("@pClientName").value = strClientName
cmdAddCard.Parameters("@pAccountOpenDate").value = strAccountOpenDate
cmdAddCard.Parameters("@pBankCode").value = strBankCode
cmdAddCard.Parameters("@pOsbNum").value = strOsbNum
cmdAddCard.Parameters("@pVspNum").value = strVspNum
Set cmdRs = cmdAddCard.Execute()
AddCard = cmdAddCard.Parameters("@return").value
conn.CommitTrans
Exit Function
Error_AddCard:
Call ErrorMessage(m_csModuleName, "AddCard")
conn.RollbackTrans
'Resume Next
End Function
' =======================================
' =======================================
Private Function AddCardHistory(strBegDate As String, strEndDate As String, strCardLimit As String, _
strUnicardDate As String, strIdCardFile As String, strIdCard As String) As Long
On Error GoTo Error_AddCardHistory
AddCardHistory = 0
conn.BeginTrans
cmdAddCardHistory.Parameters("@return").value = 0
cmdAddCardHistory.Parameters("@pBegDate").value = strBegDate
cmdAddCardHistory.Parameters("@pEndDate").value = strEndDate
cmdAddCardHistory.Parameters("@pCardLimit").value = strCardLimit
cmdAddCardHistory.Parameters("@pUnicardDate").value = strUnicardDate
cmdAddCardHistory.Parameters("@pIdCardFile").value = strIdCardFile
cmdAddCardHistory.Parameters("@pIdCard").value = strIdCard
Set cmdRs = cmdAddCardHistory.Execute()
AddCardHistory = cmdAddCardHistory.Parameters("@return").value
conn.CommitTrans
Exit Function
Error_AddCardHistory:
Call ErrorMessage(m_csModuleName, "AddCardHistory")
conn.RollbackTrans
'Resume Next
End Function
' =======================================
' =======================================
Private Function UpdateCardHistory(strIdCardHistory As String, strBegRest As String, strEndRest As String, _
strTurnoverIn As String, strTurnoverOut As String) As Long
On Error GoTo Error_UpdateCardHistory
UpdateCardHistory = 0
conn.BeginTrans
cmdUpdateCardHistory.Parameters("@return").value = 0
cmdUpdateCardHistory.Parameters("@pIdCardHistory").value = strIdCardHistory
cmdUpdateCardHistory.Parameters("@pBegRest").value = strBegRest
cmdUpdateCardHistory.Parameters("@pEndRest").value = strEndRest
cmdUpdateCardHistory.Parameters("@pTurnoverIn").value = strTurnoverIn
cmdUpdateCardHistory.Parameters("@pTurnoverOut").value = strTurnoverOut
Set cmdRs = cmdUpdateCardHistory.Execute()
UpdateCardHistory = cmdUpdateCardHistory.Parameters("@return").value
conn.CommitTrans
Exit Function
Error_UpdateCardHistory:
Call ErrorMessage(m_csModuleName, "UpdateCardHistory")
conn.RollbackTrans
'Resume Next
End Function
' =======================================
' =======================================
Private Function AddCardOperation(strNumD As String, strNumV As String, strTransDate As String, _
strTransType As String, strTransNum As String, strPayDate As String, strSummIn As String, _
strSummOut As String, strTransRem As String, strIdCardHistory As String) As Long
On Error GoTo Error_AddCardOperation
AddCardOperation = 0
conn.BeginTrans
cmdAddCardOperation.Parameters("@return").value = 0
cmdAddCardOperation.Parameters("@pNumD").value = strNumD
cmdAddCardOperation.Parameters("@pNumV").value = strNumV
cmdAddCardOperation.Parameters("@pTransDate").value = strTransDate
cmdAddCardOperation.Parameters("@pTransType").value = strTransType
cmdAddCardOperation.Parameters("@pTransNum").value = strTransNum
cmdAddCardOperation.Parameters("@pPayDate").value = strPayDate
cmdAddCardOperation.Parameters("@pSummIn").value = strSummIn
cmdAddCardOperation.Parameters("@pSummOut").value = strSummOut
cmdAddCardOperation.Parameters("@pTransRem").value = strTransRem
cmdAddCardOperation.Parameters("@pIdCardHistory").value = strIdCardHistory
Set cmdRs = cmdAddCardOperation.Execute()
AddCardOperation = cmdAddCardOperation.Parameters("@return").value
conn.CommitTrans
Exit Function
Error_AddCardOperation:
Call ErrorMessage(m_csModuleName, "AddCardOperation")
conn.RollbackTrans
'Resume Next
End Function
' =======================================
' =======================================
Private Sub Class_Terminate()
' add your code this
End Sub
' =======================================
' =======================================
'************************************************************************************
'* Функция форматирующая дату, переводит дату из формата 15NOV05 в формат 15.11.05 *
'************************************************************************************
Private Function ConvertDate(strDate As String) As String
On Error Resume Next
Dim strNewDate As String, i As Long, strStr As String
strNewDate = strDate
For i = 0 To 11
If (InStr(strNewDate, monthListEng(i)) > 0) Then
strStr = "00" & CStr(i + 1)
strStr = "." & right(strStr, 2) & "."
strNewDate = Replace(strNewDate, monthListEng(i), strStr)
Exit For
End If
If (InStr(strNewDate, monthListRus(i)) > 0) Then
strStr = "00" & CStr(i + 1)
strStr = "." & right(strStr, 2) & "."
strNewDate = Replace(strNewDate, monthListRus(i), strStr)
Exit For
End If
Next i
ConvertDate = strNewDate
End Function
' =======================================
' =======================================
Private Function Convert2TrueNumber(strNumber As String) As String
If (TrueDecDelimiter = ",") Then
Convert2TrueNumber = Replace(strNumber, ".", ",")
Else
Convert2TrueNumber = Replace(strNumber, ",", ".")
End If
End Function
' =======================================
' =======================================
' импорт одного файла *.svv либо *.sve с импользованием xml
' на входе:
' strFileName - имя исходного файла *.svv либо *.sve
' strTextCode - кодировка исходного файла
' pForm - форма для отображения процесса
' strConnectionString - строка соединения
' на выходе код результата
' =======================================
Private Function Import_One_SvvSveWithXml(strFileName As String, strTextCode As String, _
pForm As cProgressForm, strConnectionString As String) As Byte
' установим обработчик ошибок
On Error GoTo Error_Import_One_SvvSveWithXml
' изначально полагаем, что все прекрасно, при наличии ошибок отметим это
Import_One_SvvSveWithXml = cnResultOk
' объект для генерации xml и последующей его передачи на сервер
Dim xml As New CXml4Db, bResult As Boolean
bResult = xml.Prepare(strConnectionString, csSqlXmlProcedureName, csSqlXmlProcedureParam)
' локальные переменные
Dim fso As Variant, InFile As Variant, TextStream As Variant
Dim strInText As String ', strTmp As String
Dim nFileSize As Long, nLoadSize As Long, nLoadPercent As Long, nLen As Long
' покажем какой файл мы импортируем
pForm.Label3 = strFileName
' открываем входной файл
Set fso = CreateObject("Scripting.FileSystemObject")
Set InFile = fso.GetFile(strFileName)
Set TextStream = InFile.OpenAsTextStream(1)
' инициализация счетчиков
nFileSize = InFile.Size
nLoadSize = 0
nLoadPercent = 0
' определение типа используемой кодировки кодировки
Dim nEncode As Byte
nEncode = 0
If UCase(strTextCode) = UCase("DOS -> Windows") Then nEncode = 1
If UCase(strTextCode) = UCase("Windows -> DOS") Then nEncode = 2
' еще локальные переменные
Dim bStart As Boolean, bDataBlock As Boolean
Dim BankCode As String, OsbNum As String, VspNum As String, CardType As String
Dim CardNum As String, AccountNum As String, CurrencyCode As String
Dim ClientName As String, AccountOpenDate As String, BegDate As String, EndDate As String
Dim CardLimit As String, UnicardDate As String, BegRest As String, EndRest As String
Dim TurnoverIn As String, TurnoverOut As String, NumD As String, NumV As String
Dim TransDate As String, TransType As String, TransNum As String, PayDate As String
Dim SummIn As String, SummOut As String, TransRem As String, strStr As String
Dim strSplitArray As Variant
Dim IdCardHistory As String, IdCardFile As String, IdCard As String
Dim IdCardOperation As String ', IdBank As String, IdCardType As String
'Dim nPos As Long, nPos2 As Long, nPos3 As Long, nLocLen As Long,
Dim i As Long, strTrueFileName As String, nResult As Long, nFlushCount As Long
nFlushCount = 0
' в идеале конечно же нужно вычислить хэш файла, тогда можно утверждать, что файл уникален ...
' проверим был ли файл загружен ранее
strTrueFileName = left(strFileName, 800)
' IdCardFile = GetCardFileId(strTrueFileName, CStr(nFileSize))
IdCardFile = "0" ' заглушка пока пробуем без базы
' если файл бы загружен ранее, то на выход.
If (Val(IdCardFile) > 0) Then GoTo Exit_Import_One_SvvSveWithXml
' зарегистрируем данный файл
' IdCardFile = AddCardFile(strTrueFileName, CStr(nFileSize))
' флажки для парсинга
bStart = False
bDataBlock = False
' main loop
Do While Not TextStream.AtEndOfStream
' читаем очередную строку
strInText = TextStream.ReadLine
' optimize ecoding string
If (nEncode = 1) Then strInText = Dos2Win(CStr(strInText))
If (nEncode = 2) Then strInText = Win2Dos(CStr(strInText))
' определяем длину и все приводим к верхнему регистру
nLen = Len(strInText)
strInText = UCase(strInText)
' разбираем текст, если был дан старт
If bStart Then
If (InStr(strInText, "Остаток на конец периода :") > 0) Then
' если нашли "Остаток на конец периода :" значит блок данных закончился,
' ставим соответствующий признак и определяем сумму остатка
bDataBlock = False
EndRest = Convert2TrueNumber(Trim(Replace(strInText, "Остаток на конец периода :", "")))
' теперь необходимо выполнить prc_UpdateCardHistory
'IdCardHistory = UpdateCardHistory(IdCardHistory, BegRest, EndRest, TurnoverIn, TurnoverOut)
' формируем xml
' данные по истории
' ---------------------------------------------
Call xml.AddData("BegRest", BegRest)
Call xml.AddData("EndRest", EndRest)
Call xml.AddData("TurnoverIn", TurnoverIn)
Call xml.AddData("TurnoverOut", TurnoverOut)
' закроем тэг Main
Call xml.CloseTag
' теперь нужно определить необходимость сброса данных в базу данных на ms sql server
If (xml.FillLevel > 50) Then
nResult = xml.FlushBuffer()
nFlushCount = nFlushCount + 1
Call SysCmd(acSysCmdSetStatus, "Flush count: " & nFlushCount)
End If
' ---------------------------------------------
' clear all var's
BankCode = ""
OsbNum = ""
VspNum = ""
CardType = ""
CardNum = ""
AccountNum = ""
CurrencyCode = ""
ClientName = ""
AccountOpenDate = ""
BegDate = ""
EndDate = ""
CardLimit = ""
UnicardDate = ""
BegRest = ""
EndRest = ""
TurnoverIn = ""
TurnoverOut = ""
NumD = ""
NumV = ""
TransDate = ""
TransType = ""
TransNum = ""
PayDate = ""
SummIn = ""
SummOut = ""
TransRem = ""
IdCardHistory = ""
IdCardOperation = ""
'IdCardFile = ""
IdCard = ""
'IdBank = ""
'IdCardType = ""
ElseIf (InStr(strInText, "Остаток на начало периода :") > 0) Then
' определяем остаток на начало периода
BegRest = Convert2TrueNumber(Trim(Replace(strInText, "Остаток на начало периода :", "")))
ElseIf (InStr(strInText, "Итого :") > 0) Then
' определяем обороты по приходу и расходу
strStr = Trim(Replace(strInText, "Итого :", ""))
' убираем задвоенность пробелов
Do While (InStr(strStr, " ") > 0)
strStr = Replace(strStr, " ", " ")
Loop
strSplitArray = Split(strStr, " ")
TurnoverIn = Convert2TrueNumber(Trim(strSplitArray(LBound(strSplitArray))))
TurnoverOut = Convert2TrueNumber(Trim(strSplitArray(LBound(strSplitArray) + 1)))
ElseIf (InStr(strInText, "История по карточному счету клиента за период :") > 0) Then
' парсим данные
strStr = Trim(Replace(strInText, "История по карточному счету клиента за период :", ""))
strSplitArray = Split(strStr, "-")
BegDate = Trim(strSplitArray(LBound(strSplitArray)))
EndDate = Trim(strSplitArray(LBound(strSplitArray) + 1))
' отмечаем, что найден блок данных
bDataBlock = True
' формируем xml
' если еще ни чего нет, то нужно вставить первые тэги
' ---------------------------------------------
If (xml.CurrentSize = 0) Then
Call xml.OpenTag("Root")
Call xml.AddData("FileId", IdCardFile)
End If
' ---------------------------------------------
ElseIf (InStr(strInText, "Банк :") > 0) Then
strStr = Replace(strInText, "Банк :", "")
strStr = Trim(Replace(strStr, "Дата обработки в системе UniCard :", ""))
' убираем задвоенность пробелов
Do While (InStr(strStr, " ") > 0)
strStr = Replace(strStr, " ", " ")
Loop
strSplitArray = Split(strStr, " ")
BankCode = left(Trim(strSplitArray(LBound(strSplitArray))), 2)
UnicardDate = Trim(strSplitArray(LBound(strSplitArray) + 1))
ElseIf (InStr(strInText, "Карточка :") > 0) Then
strStr = Trim(Replace(strInText, "Карточка :", ""))
' убираем задвоенность пробелов
Do While (InStr(strStr, " ") > 0)
strStr = Replace(strStr, " ", " ")
Loop
strSplitArray = Split(strStr, " ")
CardNum = left(Trim(strSplitArray(LBound(strSplitArray))), 25)
CardType = ""
For i = LBound(strSplitArray) + 1 To UBound(strSplitArray)
CardType = CardType & " " & Trim(strSplitArray(i))
Next i
CardType = left(Trim(CardType), 50)
ElseIf (strInText Like "*Счет номер : ####################* / Валюта счета : * / Кредит.лимит :*") Then
' вариант обработки с номером счета
strStr = Replace(strInText, "Счет номер :", "")
strStr = Replace(strStr, "/ Валюта счета :", "")
strStr = Trim(Replace(strStr, "/ Кредит.лимит :", ""))
' убираем задвоенность пробелов
Do While (InStr(strStr, " ") > 0)
strStr = Replace(strStr, " ", " ")
Loop
strSplitArray = Split(strStr, " ")
AccountNum = left(Trim(strSplitArray(LBound(strSplitArray))), 20)
CurrencyCode = left(Trim(strSplitArray(LBound(strSplitArray) + 1)), 3)
CardLimit = Convert2TrueNumber(Trim(strSplitArray(LBound(strSplitArray) + 2)))
' если нет номера счета, все рушится!
ElseIf (strInText Like "*Счет номер : / Валюта счета : * / Кредит.лимит :*") Then
' вариант обработки, когда отсутствует номер счета, без которого все рушится.
strStr = Replace(strInText, "Счет номер : / Валюта счета :", "")
strStr = Trim(Replace(strStr, "/ Кредит.лимит :", ""))
' убираем задвоенность пробелов
Do While (InStr(strStr, " ") > 0)
strStr = Replace(strStr, " ", " ")
Loop
strSplitArray = Split(strStr, " ")
AccountNum = ""
CurrencyCode = left(Trim(strSplitArray(LBound(strSplitArray))), 3)
CardLimit = Convert2TrueNumber(Trim(strSplitArray(LBound(strSplitArray) + 1)))
' если нет номера счета, все рушится!
ElseIf ((InStr(strInText, "Счет номер :") > 0) And (InStr(strInText, "/ Кредит.лимит :") < 1)) Then
' еще один вариант, видимо что-то упорно падало ...
strStr = Replace(strInText, "Счет номер :", "")
strStr = Trim(Replace(strStr, "/ Валюта счета :", ""))
' убираем задвоенность пробелов
Do While (InStr(strStr, " ") > 0)
strStr = Replace(strStr, " ", " ")
Loop
strSplitArray = Split(strStr, " ")
AccountNum = left(Trim(strSplitArray(LBound(strSplitArray))), 20)
CurrencyCode = left(Trim(strSplitArray(LBound(strSplitArray) + 1)), 3)
CardLimit = "0"
ElseIf (InStr(strInText, "Фамилия И.О. :") > 0) Then
ClientName = left(Trim(Replace(strInText, "Фамилия И.О. :", "")), 100)
ElseIf (strInText Like "*Отделение / Филиал :*Дата открытия счета :*") Then
strStr = Replace(strInText, "Отделение / Филиал :", "")
strStr = Replace(strStr, "Дата открытия счета :", "")
strStr = Replace(strStr, "/", "")
' убираем задвоенность пробелов
Do While (InStr(strStr, " ") > 0)
strStr = Replace(strStr, " ", " ")
Loop
strStr = Trim(strStr)
strSplitArray = Split(strStr, " ")
OsbNum = left(Trim(strSplitArray(LBound(strSplitArray))), 4)
VspNum = left(Trim(strSplitArray(LBound(strSplitArray) + 1)), 5)
AccountOpenDate = ConvertDate(Trim(strSplitArray(LBound(strSplitArray) + 2)))
' нужно записать собранные данные по карте
'IdCard = AddCard(CardNum, AccountNum, CardType, CurrencyCode, ClientName, AccountOpenDate, BankCode, OsbNum, VspNum)
' нужно записать собранные данные по истории
'IdCardHistory = AddCardHistory(BegDate, EndDate, CardLimit, UnicardDate, IdCardFile, IdCard)
' формирование xml
' откроем основной тэг
' ---------------------------------------------
Call xml.OpenTag("Main")
' данные по карте
Call xml.AddData("CardNum", CardNum)
Call xml.AddData("AccountNum", AccountNum)
Call xml.AddData("CardType", CardType)
Call xml.AddData("CurrencyCode", CurrencyCode)
Call xml.AddData("ClientName", ClientName)
Call xml.AddData("AccountOpenDate", AccountOpenDate)
Call xml.AddData("BankCode", BankCode)
Call xml.AddData("OsbNum", OsbNum)
Call xml.AddData("VspNum", VspNum)
' данные по истории
Call xml.AddData("BegDate", BegDate)
Call xml.AddData("EndDate", EndDate)
Call xml.AddData("CardLimit", CardLimit)
Call xml.AddData("UnicardDate", UnicardDate)
' ---------------------------------------------
ElseIf ((InStr(strInText, "Отделение / Филиал :") > 0) _
And (InStr(strInText, "Дата открытия счета :") < 1) _
And (InStr(strInText, csFileType3) < 1)) Then
' Есть файлы в которых отсутствует "Дата открытия счета :", в таком случает программка падает :-(
strStr = Replace(strInText, "Отделение / Филиал :", "")
' убираем задвоенность пробелов
Do While (InStr(strStr, " ") > 0)
strStr = Replace(strStr, " ", " ")
Loop
strStr = Trim(strStr)
strSplitArray = Split(strStr, "/")
OsbNum = left(Trim(strSplitArray(LBound(strSplitArray))), 4)
VspNum = left(Trim(strSplitArray(LBound(strSplitArray) + 1)), 5)
AccountOpenDate = "01.01.1900" ' very old data - for not error
' нужно записать собранные данные карте
'IdCard = AddCard(CardNum, AccountNum, CardType, CurrencyCode, ClientName, AccountOpenDate, BankCode, OsbNum, VspNum)
' нужно записать собранные данные по истории
'IdCardHistory = AddCardHistory(BegDate, EndDate, CardLimit, UnicardDate, IdCardFile, IdCard)
' формирование xml
' откроем основной тэг
' ---------------------------------------------
Call xml.OpenTag("Main")
' данные по карте
Call xml.AddData("CardNum", CardNum)
Call xml.AddData("AccountNum", AccountNum)
Call xml.AddData("CardType", CardType)
Call xml.AddData("CurrencyCode", CurrencyCode)
Call xml.AddData("ClientName", ClientName)
Call xml.AddData("AccountOpenDate", AccountOpenDate)
Call xml.AddData("BankCode", BankCode)
Call xml.AddData("OsbNum", OsbNum)
Call xml.AddData("VspNum", VspNum)
' данные по истории
Call xml.AddData("BegDate", BegDate)
Call xml.AddData("EndDate", EndDate)
Call xml.AddData("CardLimit", CardLimit)
Call xml.AddData("UnicardDate", UnicardDate)
' ---------------------------------------------
Else
strStr = Mid(strInText, 1, 1)
If (IsNumeric(strStr) And bDataBlock) Then
strStr = Trim(Mid(strInText, 1, 15))
strSplitArray = Split(strStr, "/")
NumD = Trim(strSplitArray(LBound(strSplitArray)))
NumV = Trim(strSplitArray(LBound(strSplitArray) + 1))
TransDate = ConvertDate(Trim(Mid(strInText, 16, 10)))
TransType = Trim(Mid(strInText, 27, 6))
TransNum = Trim(Mid(strInText, 35, 8))
PayDate = right("00" & Trim(Mid(strInText, 45, 6)), 4)
If (Val(left(PayDate, 2)) > 31) Then PayDate = "0" & left(PayDate, 3)
PayDate = left(PayDate, 2) & "." & right(PayDate, 2) & "." & right(BegDate, 4)
SummIn = Convert2TrueNumber(Trim(Mid(strInText, 49, 16)))
SummOut = Convert2TrueNumber(Trim(Mid(strInText, 65, 16)))
TransRem = left(Trim(Mid(strInText, 85)), 50)
'If (Len(TransRem) < 1) Then TransRem = "-"
' нужно записать накопленное!
'IdCardOperation = AddCardOperation(NumD, NumV, TransDate, TransType, TransNum, PayDate, SummIn, SummOut, TransRem, IdCardHistory)
' формирование xml
' откроем дополнительный тэг
' ---------------------------------------------
Call xml.OpenTag("Add")
' данные по истории
Call xml.AddData("NumD", NumD)
Call xml.AddData("NumV", NumV)
Call xml.AddData("TransDate", TransDate)
Call xml.AddData("TransType", TransType)
Call xml.AddData("TransNum", TransNum)
Call xml.AddData("PayDate", PayDate)
Call xml.AddData("SummIn", SummIn)
Call xml.AddData("SummOut", SummOut)
Call xml.AddData("TransRem", TransRem)
' закроем тэг add
Call xml.CloseTag
' ---------------------------------------------
End If
End If
Else
' поиск признака файла svv либо sve
'If ((InStr(strInText, csFileType1) > 0) Or _
(InStr(strInText, csFileType2) > 0) Or _
(InStr(strInText, csFileType3) > 0)) Then
If (InStr(strInText, csFileType3) > 0) Then
' если признак найден, то запускаем парсер
bStart = True
End If
End If
' calc progress bar, update info & show
nLoadSize = nLoadSize + nLen ' + 2 ' 2 bytes = char 13 + char 10
nLoadPercent = Fix(nLoadSize / nFileSize * 100)
pForm.ProgressBar1 = nLoadPercent
If (pForm.Update) Then
Import_One_SvvSveWithXml = cnResultCancel
Exit Do
End If
Loop
' set time of card file end load
IdCardFile = CardFileEndLoad(IdCardFile)
Exit_Import_One_SvvSveWithXml:
TextStream.Close
Set TextStream = Nothing
Set InFile = Nothing
Set fso = Nothing
Exit Function
Error_Import_One_SvvSveWithXml:
'Call ErrorMessage(m_csModuleName, "Import_One_SvvSveWithXml")
Import_One_SvvSveWithXml = cnResultError
Debug.Print Err.Description
Resume Next
End Function
' =======================================
' =======================================
' Импортер файлов *.svv, *.sve, через технологию xml
' =======================================
Public Function Import_Group_SvvSve_WithXml(strFilePath As String, strFileMask As String, strTextCode As String, _
strConnectionString As String) As Byte
' установим обработчик событий
On Error GoTo Error_Import_Group_SvvSve_WithXml
' локальные переменны
Dim pFileList As New Collection
Dim nFileCount As Long, i As Long, nLoadPercent As Long, nFileImport As Long
Dim prgForm As New cProgressForm
Dim strFileName As Variant, nResult As Byte
Dim strMsg As String
' предварительно полагаем, что все нормально
Import_Group_SvvSve_WithXml = cnResultOk
'If (Not Prepare(strConnectionString)) Then
'Import_Group_SvvSve = cnResultError
'Exit Function
'End If
' создадим для пользователя форму
Call prgForm.CreateForm(3)
prgForm.EventPeriod = 3000
prgForm.Caption = "Мастер импорта историй по карточному счету"
prgForm.Label1 = "Импорт файлов историй по карточному счету (*.svv, *.sve)"
prgForm.Label2 = "Импортируется файл: "
Call prgForm.FormShow
Call prgForm.FormSetFocus
' сформируем список файлов, которые необходимо импортировать
Call GetFileList(strFilePath, strFileMask, pFileList)
' инициализируем количество файлов для импорта и количество импортированных файлов
nFileCount = pFileList.Count
nFileImport = 0
' если не найдено файлов, то завершает работу
If (nFileCount <= 0) Then
Exit Function
End If
' цикл по списку файлов
For Each strFileName In pFileList
nResult = Import_One_SvvSveWithXml(CStr(strFileName), strTextCode, prgForm, strConnectionString)
'nResult = Import_One_SvvSve(CStr(strFileName), strTextCode, prgForm)
Import_Group_SvvSve_WithXml = nResult
' проверка действий пользователя
If (nResult = cnResultCancel) Then Exit Function
' вычисление статистики
nFileImport = nFileImport + 1
nLoadPercent = Fix(nFileImport / nFileCount * 100)
strMsg = "Импортированно " & nFileImport & " (" & nLoadPercent & _
"%) из " & nFileCount & " файлов."
' отображение статистики
prgForm.Label4 = strMsg
prgForm.ProgressBar2 = nLoadPercent
Call prgForm.FormRepaint
Next strFileName
Exit_Import_Group_SvvSve_WithXml:
Exit Function
' обработчик ошибок
Error_Import_Group_SvvSve_WithXml:
Call ErrorMessage(m_csModuleName, "Import_Group_SvvSve_WithXml")
Import_Group_SvvSve_WithXml = cnResultError
Resume Next
End Function
' =======================================
|