Main.frm 97.1 KB
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 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687
VERSION 5.00
Object = "{87AC6DA5-272D-40EB-B60A-F83246B1B8D7}#1.0#0"; "TeComDatabase.dll"
Object = "{831FDD16-0C5C-11D2-A9FC-0000F8754DA1}#2.1#0"; "MSCOMCTL.OCX"
Begin VB.Form FormuarioPrincipal 
   Caption         =   "Valida Base de Dados GeoSan"
   ClientHeight    =   1770
   ClientLeft      =   60
   ClientTop       =   345
   ClientWidth     =   5970
   LinkTopic       =   "ValidaBase"
   ScaleHeight     =   1770
   ScaleWidth      =   5970
   StartUpPosition =   3  'Windows Default
   Begin MSComctlLib.StatusBar StatusBar1 
      Align           =   2  'Align Bottom
      Height          =   375
      Left            =   0
      TabIndex        =   3
      Top             =   1395
      Width           =   5970
      _ExtentX        =   10530
      _ExtentY        =   661
      _Version        =   393216
      BeginProperty Panels {8E3867A5-8586-11D1-B16A-00C0F0283628} 
         NumPanels       =   3
         BeginProperty Panel1 {8E3867AB-8586-11D1-B16A-00C0F0283628} 
            Object.Width           =   5292
            MinWidth        =   5292
            Text            =   "Verificação"
            TextSave        =   "Verificação"
         EndProperty
         BeginProperty Panel2 {8E3867AB-8586-11D1-B16A-00C0F0283628} 
            Text            =   "Nó"
            TextSave        =   "Nó"
         EndProperty
         BeginProperty Panel3 {8E3867AB-8586-11D1-B16A-00C0F0283628} 
            Text            =   "Trecho Rede"
            TextSave        =   "Trecho Rede"
         EndProperty
      EndProperty
   End
   Begin VB.CommandButton Cancela 
      Caption         =   "Cancelar"
      Height          =   375
      Left            =   1080
      TabIndex        =   1
      Top             =   720
      Width           =   1815
   End
   Begin VB.CommandButton ProcessaBancoDados 
      Caption         =   "Inicia Processamento"
      Height          =   375
      Left            =   3240
      TabIndex        =   0
      Top             =   720
      Width           =   1815
   End
   Begin VB.Label Label1 
      Caption         =   "Realize backup do banco de dados antes de iniciar"
      Height          =   375
      Left            =   1200
      TabIndex        =   2
      Top             =   240
      Width           =   3735
   End
   Begin TECOMDATABASELibCtl.TeDatabase TeDatabase1 
      Left            =   240
      OleObjectBlob   =   "Main.frx":0000
      Top             =   480
   End
End
Attribute VB_Name = "FormuarioPrincipal"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
'Checa a base de dados para verificação da integridade da mesma para exportação para simulação hidráulica

Option Explicit                         'Impede que uma variável seja utilizada sem que a mesma seja antes criada

Public Conn As New ADODB.Connection     'Define de forma global uma conexão com o banco de dados

Dim rsBusca As New ADODB.Recordset
Dim rsLayer As New ADODB.Recordset
Dim rsLinha As New ADODB.Recordset
Dim VALID As Boolean
Dim strSql As String
Dim rsFinal2 As New ADODB.Recordset
Dim rsSemPoints As New ADODB.Recordset
Dim rslinha1 As New ADODB.Recordset
Dim rslinha2 As New ADODB.Recordset
Dim strXL1 As String, strXL2 As String, strYL1 As String, strYL2 As String
Private Sub cmdCancelar_Click()
   Unload Me
End Sub
Private Sub ObtemCoordenadasIniciaisEFinaisLinha()

End Sub
Private Sub cmdExit_Click()
    Conn.Close
    Close #1
End Sub
'Irá verificar se todos os compontentes (nós) iniciais que estão definidos na tabela de atributo Waterlines, estão presentes
'Esta função varre toda tabela Waterlines na coluna de nó inicial e procura se o nó informado existe na tabela Watercomponents
'
' arquivoLog - nome do arquivo em que são gerados os logs da validação
'
Function ValidaComponentesIniciaisDeWaterlines(arquivoLog As String)
    Dim rsVBL As New ADODB.Recordset
    Dim rsVBP As New ADODB.Recordset
    Dim blnPontoCriado As Boolean           'Indica se a geometria do ponto foi criada ou não
    
    Open arquivoLog For Append As #1
    Print #1, vbCrLf & "Início;ValidaComponentesIniciaisDeWaterlines"
    Close #1
    'Seleciona todos os object_id_s e componentes iniciais da tabela Waterlines
    Set rsVBL = Conn.Execute("SELECT OBJECT_ID_ AS COD,INITIALCOMPONENT AS INI FROM WATERLINES ORDER BY INITIALCOMPONENT")
    'Se existirem redes de água
    If rsVBL.EOF = False Then
        'Seleciona todos os números dos componentes existentes dos nós
        Set rsVBP = Conn.Execute("SELECT COMPONENT_ID AS COMPONENTE FROM WATERCOMPONENTS ORDER BY COMPONENT_ID")
        'VALIDANDO TODOS OS COMPONENTES INITIAL DA WATERLINES
        'Se existirem nós de redes
        If rsVBP.EOF = False Then
            'Enquanto existirem nós e trechos de redes
            Do While Not rsVBP.EOF = True And Not rsVBL.EOF = True
                'Se o nó está presente na componente inicial do trecho de rede
                If rsVBP!COMPONENTE = rsVBL!ini Then 'validado
                    'Vamos ver o próximo trecho de rede, pois já foi encontrado o nó para o componente inicial do trecho de rede em Waterlines
                    rsVBL.MoveNext      'Move para o próximo trecho de rede
                    VALID = True        'Informa que foi validado e encontrado o nó inicial para o trecho de rede
                'Caso o nó seja menor que o nó inicial do trecho de rede
                ElseIf rsVBP!COMPONENTE < rsVBL!ini Then
                    'Procura o próximo nó, pois não encontrou o nó inicial da tabela Waterlines ainda
                    rsVBP.MoveNext      'Veja qual o próximo nó de Watercomponents
                    VALID = False       'Informa que ainda não encontrou o nó inicial de Waterlines em Watercomponents
                Else
                    'O nó é maior do que o componente inicial do trecho de rede, isto quer dizer que ele não foi encontrado.
                    Open arquivoLog For Append As #1
                    Print #1, "ValidaComponentesIniciaisDeWaterlines-20;Componente Inicial:"; Tab(21); rsVBL!ini; Tab(31); "da linha"; Tab(40); rsVBL!COD; Tab(50); "NÃO ENCONTRADO."
                    Close #1
                    
                    CriaComponenteDefault (rsVBL!ini)
                    If blnPontoCriado = True Then
                        Open arquivoLog For Append As #1
                        Print #1, "ValidaComponentesIniciaisDeWaterlines-21;Componente " & rsVBL!ini & " POSSUI GEOMETRIA E FOI CRIADO AUTOMATICAMENTE."
                        Close #1
                    Else
                        Open arquivoLog For Append As #1
                        Print #1, "ValidaComponentesIniciaisDeWaterlines-22;Componente " & rsVBL!ini & " NÃO PODE SER CRIADO AUTOMATICAMENTE."
                        Close #1
                    End If
                    rsVBL.MoveNext
                End If
                'Verifica se chegarmos ao final da leitura de todos os nós e não exsitem mais nós para lermos
                If rsVBP.EOF = True Then
                    If VALID = False Then
                        Do While Not rsVBL.EOF = True
                            Print #1, "ValidaComponentesIniciaisDeWaterlines-23;Componente Inicial:"; Tab(21); rsVBL!ini; Tab(31); "da linha"; Tab(40); rsVBL!COD; Tab(50); "não encontrado!"
                            blnPontoCriado = CriaComponenteDefault(rsVBL!ini)
                            If blnPontoCriado = True Then
                                Open arquivoLog For Append As #1
                                Print #1, "ValidaComponentesIniciaisDeWaterlines-24;Componente " & rsVBL!ini & " POSSUI GEOMETRIA E FOI CRIADO AUTOMATICAMENTE."
                                Close #1
                            Else
                                Open arquivoLog For Append As #1
                                Print #1, "ValidaComponentesIniciaisDeWaterlines-25;Componente " & rsVBL!ini & " NÃO PODE SER CRIADO AUTOMATICAMENTE."
                                Close #1
                            End If
                            rsVBL.MoveNext
                        Loop
                    End If
                    Exit Do
                End If
           Loop
       End If
   End If
   Open arquivoLog For Append As #1
   Print #1, "Fim;ValidaComponentesIniciaisDeWaterlines"
   Close #1
End Function
'Irá verificar se todos os compontentes (nós) finais que estão definidos na tabela de atributo Waterlines, estão presentes
'Esta função varre toda tabela Waterlines na coluna de nó final e procura se o nó informado existe na tabela Watercomponents
'
' arquivoLog - nome do arquivo em que são gerados os logs da validação
'
Function ValidaComponentesFinaisDeWaterlines(arquivoLog As String)
    Dim rsVBL As New ADODB.Recordset
    Dim rsVBP As New ADODB.Recordset
    Dim blnPontoCriado As Boolean           'Indica se a geometria do ponto foi criada ou não
    
    Open arquivoLog For Append As #1
    Print #1, vbCrLf & "Início;ValidaComponentesFinaisDeWaterlines"
    Close #1
    'Seleciona todos os object_id_s e componentes finais da tabela Waterlines
    Set rsVBL = Conn.Execute("SELECT OBJECT_ID_ AS COD,FINALCOMPONENT AS FIM FROM WATERLINES ORDER BY FINALCOMPONENT")
    'Se existirem redes de água
    If rsVBL.EOF = False Then
        Set rsVBP = Conn.Execute("SELECT COMPONENT_ID AS COMPONENTE FROM WATERCOMPONENTS ORDER BY COMPONENT_ID")
        'VALIDANDO TODOS OS COMPONENTES FINAL DA WATERLINES
        'Se existirem nós de redes
        If rsVBP.EOF = False Then
            'Enquanto existirem nós e trechos de redes
            Do While Not rsVBP.EOF = True And Not rsVBL.EOF = True
                'Se o nó está presente na componente final do trecho de rede
                If rsVBP!COMPONENTE = rsVBL!fim Then 'validado
                    'Vamos ver o próximo trecho de rede, pois já foi encontrado o nó para o componente final do trecho de rede em Waterlines
                    rsVBL.MoveNext      'Move para o próximo trecho de rede
                    VALID = True        'Informa que foi validado e encontrado o nó final para o trecho de rede
                'Caso o nó seja menor que o nó final do trecho de rede
                ElseIf rsVBP!COMPONENTE < rsVBL!fim Then
                    'Procura o próximo nó, pois não encontrou o nó final da tabela Waterlines ainda
                    rsVBP.MoveNext      'Veja qual o próximo nó de Watercomponents
                    VALID = False       'Informa que ainda não encontrou o nó final de Waterlines em Watercomponents
                Else
                    'O nó é maior do que o componente final do trecho de rede, isto quer dizer que ele não foi encontrado.
                    Open arquivoLog For Append As #1
                    Print #1, "ValidaComponentesFinaisDeWaterlines-30;Componente Final:"; Tab(21); rsVBL!fim; Tab(31); "da linha"; Tab(40); rsVBL!COD; Tab(50); "NÃO ENCONTRADO."
                    Close #1
                    
                    CriaComponenteDefault (rsVBL!fim)
                    If blnPontoCriado = True Then
                        Open arquivoLog For Append As #1
                        Print #1, "ValidaComponentesFinaisDeWaterlines-31;Componente " & rsVBL!fim & " POSSUI GEOMETRIA E FOI CRIADO AUTOMATICAMENTE."
                        Close #1
                    Else
                        Open arquivoLog For Append As #1
                        Print #1, "ValidaComponentesFinaisDeWaterlines-32;Componente " & rsVBL!fim & " NÃO PODE SER CRIADO AUTOMATICAMENTE."
                        Close #1
                    End If
                    rsVBL.MoveNext
                End If
                If rsVBP.EOF = True Then
                    If VALID = False Then
                        Do While Not rsVBL.EOF = True
                            Open arquivoLog For Append As #1
                            Print #1, "ValidaComponentesFinaisDeWaterlines-33;Componente Final:"; Tab(21); rsVBL!fim; Tab(31); "da linha"; Tab(40); rsVBL!COD; Tab(50); "não encontrado!"
                            Close #1
                            
                            CriaComponenteDefault (rsVBL!fim)
                            If blnPontoCriado = True Then
                               Open arquivoLog For Append As #1
                               Print #1, "ValidaComponentesFinaisDeWaterlines-34;Componente " & rsVBL!fim & " POSSUI GEOMETRIA E FOI CRIADO AUTOMATICAMENTE."
                               Close #1
                            Else
                               Open arquivoLog For Append As #1
                               Print #1, "ValidaComponentesFinaisDeWaterlines-35;Componente " & rsVBL!fim & " NÃO PODE SER CRIADO AUTOMATICAMENTE."
                               Close #1
                            End If
                            rsVBL.MoveNext
                        Loop
                    End If
                    'Verifica se chegarmos ao final da leitura de todos os nós e não exsitem mais nós para lermos
                    Exit Do
                End If
            Loop
        End If
    End If
    Open arquivoLog For Append As #1
    Print #1, "Fim;ValidaComponentesFinaisDeWaterlines"
    Close #1
End Function
'Esta função irá criar uma nova geometria de nó que não existe
'
'ident - número do nó inicial
'
Private Function CriaComponenteDefault(ident As Long) As Boolean
    On Error GoTo Trata_Erro
    Dim rsBusca As New ADODB.Recordset
    Dim rsLayer As New ADODB.Recordset
    Dim strSql As String
    Dim blnPontoCriado As Boolean                               'para indicar se existe uma geometria ou não
    
    'Verifica se existe
    strSql = "SELECT LAYER_ID,NAME FROM TE_LAYER WHERE NAME = '" & "WATERCOMPONENTS" & "'"
    Set rsLayer = Conn.Execute(strSql)
    If rsLayer.EOF = False Then
        Set rsBusca = Conn.Execute("SELECT * FROM POINTS" & rsLayer!layer_id & " WHERE OBJECT_ID = '" & ident & "'")
        If rsBusca.EOF = False Then 'A GEOMETRIA DO PONTO EXISTE
            'isto quer dizer que a geometria do ponto procurado existe
            'Verifique agora se o ponto procurado possui atributos em Watercomponents
            Set rsBusca = Conn.Execute("SELECT * FROM WATERCOMPONENTS WHERE OBJECT_ID_ = '" & ident & "'")
            If rsBusca.EOF = True Then
                'Não existe como o esperado, então tem que inserir os atributos
                Dim strCMD As String
                'strCMD = "SET IDENTITY_INSERT WATERCOMPONENTS ON;"
                strCMD = strCMD & "INSERT INTO WATERCOMPONENTS (COMPONENT_ID,OBJECT_ID_,SECTOR) VALUES (" & ident & "," & ident & ",999);"
                'strCMD = strCMD & "SET IDENTITY_INSERT WATERCOMPONENTS OFF"
                'MsgBox strCMD
                Conn.Execute (strCMD) 'insere o ponto na watercomponents
                Print #1, "Inserido atributo em Watercomponents com object_id_ = " & ident & " e component_id = " & ident
                'indica no flag que existe a geometria do ponto, pois foi verificado anteriormente que ela existia e somente os atributos não
                blnPontoCriado = True
            Else ' O PONTO JA FOI CRIADO NO PROCESSO ANTERIOR
                blnPontoCriado = True
            End If
               
        Else 'A GEOMETRIA DO PONTO NÃO EXISTE
            'indica no flag que a geometria do ponto não existe
            blnPontoCriado = False
        End If
    Else
        'É grave, pois não existe a tabela de componentes de rede, deve ser verificado o banco de dados
        MsgBox "Não encontrada na TE_LAYER referencia para a tabela WATERCOMPONENTS. Verifique a consistência do banco de dados. Acione o suporte da NEXUS."
        End
    End If
    CriaComponenteDefault = blnPontoCriado
Trata_Erro:
    If Err.Number = 0 Or Err.Number = 20 Then
        CriaComponenteDefault = blnPontoCriado
        Resume Next
    Else
        blnPontoCriado = False
        CriaComponenteDefault = blnPontoCriado
        Exit Function
    End If
End Function
'IDENTIFICA QUAL TABELA LINES O LAYER WATERLINES REGISTRA AS LOCALIZAÇÕES
'Esta função retorna o número do layer em que estão as geometrias das linhas das redes de água. Ela retorna um número
'que será utilizado para saber o nome da tabela LINESXX, onde XX é o número em que se encontram as geometrias da
'tabela WATERLINES
'
' ObtemGeomWaterlines - retorna o número da tabela de geometrias de linhas de redes de água
'
Private Function ObtemGeomWaterlines() As String
    Dim strSql As String
    Dim rsLayer As New ADODB.Recordset
    strSql = "SELECT LAYER_ID,NAME FROM TE_LAYER WHERE NAME = '" & "WATERLINES" & "'"
    Set rsLayer = Conn.Execute(strSql)
    If rsLayer.EOF = True Then
       MsgBox "Não localizada a tabela de geometrias 'LINES##' da tabela WATERLINES", vbExclamation, " Contate o suporte pois o banco está inconsistente."
       Exit Function
    Else
       ObtemGeomWaterlines = rsLayer!layer_id
    End If
End Function
'IDENTIFICA QUAL TABELA POINTS O LAYER WATERCOMPONENTS REGISTRA AS LOCALIZAÇÕES
'Esta função retorna o número do layer em que estão as geometrias dos nós das redes de água. Ela retorna um número
'que será utilizado para saber o nome da tabela POINTSXX, onde XX é o número em que se encontram as geometrias dos
'pontos da tabela WATERCOMPONENTS
'
' ObtemGeomWatercomponents - retorna o número da tabela de geometrias de pondos (nós) de redes de água
'
Private Function ObtemGeomWatercomponents() As String
    Dim strSql As String
    Dim rsLayer As New ADODB.Recordset
    strSql = "SELECT LAYER_ID,NAME FROM TE_LAYER WHERE NAME = '" & "WATERCOMPONENTS" & "'"
    Set rsLayer = Conn.Execute(strSql)
    If rsLayer.EOF = True Then
        MsgBox "Não localizada a tabela de geometrias 'Points##' da tabela WATERCOMPONENTS", vbExclamation, " Contate o suporte pois o banco está inconsistente."
        Exit Function
    Else
        ObtemGeomWatercomponents = rsLayer!layer_id
    End If
End Function
'Esta função apaga todos os atributos de redes de água que não possuem uma geometria associada aos mesmos, ou seja,
'apaga os atributos (dados alfanuméricos) soltos no banco, pois sem uma geometria associada, os mesmos não podem existir.
'
' ApagaLinhasAtributosSemGeometriasWaterlines - retorna o número de linhas da tabela WATERLINES que foram eliminadas por não possuirem geometria de linha de rede associada
' numeroTabela - recebe o número da tabela de geompetrias de linhas (trechos) de redes de águas
' arquivoLog - nome do arquivo em que são gerados os logs da validação
'
Private Function ApagaLinhasAtributosSemGeometriasWaterlines(numeroTabela As String, arquivoLog As String) As Integer
    Dim contador As Integer
    Dim strSql As String
    Dim rsLinha As New ADODB.Recordset
    
    contador = 0                        'zera o número de atributos apagados
    'EXCLUI AS LINHAS QUE NÃO POSSUEM GEOMETRIA NA TABELA LINES1
    strSql = "SELECT OBJECT_ID_ FROM WATERLINES WHERE OBJECT_ID_ NOT IN (SELECT OBJECT_ID FROM LINES" & numeroTabela & ")"
    Open arquivoLog For Append As #1
    Print #1, vbCrLf & "ApagaLinhasAtributosSemGeometriasWaterlines;" & strSql
    Close #1
    Set rsLinha = Conn.Execute(strSql)
    If rsLinha.EOF = False Then
        Do While Not rsLinha.EOF
            'VERIFICADO QUE QUANDO A LINHA NÃO POSSUI GEOMETRIA, ELA NÃO APARECE NO MAPA
            'E POR ISSO O USUÁRIO NÃO PODE MANIPULA-LA
            Open arquivoLog For Append As #1
            Print #1, "ApagaLinhasAtributosSemGeometriasWaterlines;" & "     DELETE FROM WATERLINES WHERE OBJECT_ID_ ='" & rsLinha!Object_id_ & "'"
            Close #1
            Conn.Execute ("DELETE FROM WATERLINES WHERE OBJECT_ID_ ='" & rsLinha!Object_id_ & "'")
            rsLinha.MoveNext
            contador = contador + 1
        Loop
    End If
    Open arquivoLog For Append As #1
    Print #1, "ApagaLinhasAtributosSemGeometriasWaterlines;" & "Fim do SELECT. " & contador & " linhas de atributos em WATERLINES encontradas sem geometrias associadas"
    Close #1
    ApagaLinhasAtributosSemGeometriasWaterlines = contador
End Function
'Esta função apaga todos as geometrias de redes de água que não possuem um atributo associado aos mesmos, ou seja,
'apaga as geometrias (coordenadas das linhas) soltas no banco, pois sem um atributo associado, as mesmoa não podem existir.
'
' ApagaGeometriasSemAtributosWaterlines - retorna o número de linhas (trechos de redes/geometrias) da tabela LINESXX que foram eliminadas por não possuirem atributos de rede associada em WATERLINES
' numeroTabela - recebe o número da tabela de geompetrias de linhas (trechos) de redes de águas
' arquivoLog - nome do arquivo em que são gerados os logs da validação
'
Private Function ApagaGeometriasSemAtributosWaterlines(numeroTabela As String, arquivoLog As String) As Integer
    'EXCLUI AS GEOMETRIAS DE LINHAS QUE NÃO TEM LINHAS NA TABELA WATERLINES
    Dim contador As Integer
    Dim strSql As String
    Dim rsLinha As New ADODB.Recordset
    
    contador = 0                            'zera o número de geometrias apagadas
    strSql = "SELECT OBJECT_ID FROM LINES" & numeroTabela & " WHERE OBJECT_ID NOT IN (SELECT OBJECT_ID_ FROM WATERLINES)"
    Open arquivoLog For Append As #1
    Print #1, vbCrLf & "ApagaLinhasAtributosSemGeometriasWaterlines; " & strSql; ""
    Close #1
    Set rsLinha = Conn.Execute(strSql)
    If rsLinha.EOF = False Then
        Do While Not rsLinha.EOF
            Open arquivoLog For Append As #1
            Print #1, "ApagaGeometriasSemAtributosWaterlines;" & "     DELETE FROM LINES1 WHERE OBJECT_ID ='" & rsLinha!object_id & "'"
            Close #1
            Conn.Execute ("DELETE FROM LINES1 WHERE OBJECT_ID ='" & rsLinha!object_id & "'")
            rsLinha.MoveNext
            contador = contador + 1
        Loop
    End If
    Open arquivoLog For Append As #1
    Print #1, "ApagaGeometriasSemAtributosWaterlines;" & "Fim do SELECT. " & contador & " linhas de geometrias de WATERLINES encontradas sem atributos associados"
    Close #1
    ApagaGeometriasSemAtributosWaterlines = contador
End Function
'Obter uma lista de componentes de redes (nós) que existem na tabela Watercomponents
'que não possuem informação geográfica na tabela PointsXX associada, ou seja, identifica nós existentes como atributos mas
'sem a presença da respectiva geometria
'
'WcSemGeometrias - retorna um Recordset contento os OBJECT_ID_s que não possuem as geometrias com as coordenadas dos nós
'numTabGeomPoints - recebe o número da tabela contento as geometrias dos pontos/nós das redes
'rsSemPoints - recordSet contendo o resultado da querie na tabela WATERCOMPONENTS com as linhas de atributos sem geometrias
'arquivoLog - nomo do arquivo em que são gerados os logs da validação
'
Private Function WcSemGeometrias(numTabGeomPoints As String, ByRef rsSemPoints As ADODB.Recordset, arquivoLog As String)
    Dim leGeoSanIni As New ValidaBase.CGeoSanIniFile  'Classe para ler dados de inicialização
    Dim TpConexao As String                         'Tipo de conexão, se SQLServer, Oracle ou Postgres
    Dim strSql As String
    'Dim rsSemPoints As new ADODB.Recordset
    'Informa onde estão as informações sobre a localização, nome e tipo de banco de dados
    leGeoSanIni.arquivo = App.Path & "\Controles\GeoSan.ini"
    TpConexao = leGeoSanIni.TipoBDados
    Select Case TpConexao
        Case "1-SQL Server 2005"
            'gera um Recordset contendo todos os OBJECT_ID_s sem geometrias
            strSql = "SELECT OBJECT_ID_ FROM WATERCOMPONENTS WHERE OBJECT_ID_ NOT IN (SELECT OBJECT_ID FROM POINTS" & numTabGeomPoints & ")"
            Open arquivoLog For Append As #1
            Print #1, vbCrLf & "WcSemGeometrias; " & strSql
            Close #1
            Set rsSemPoints = Conn.Execute(strSql)
            Open arquivoLog For Append As #1
            Print #1, "WcSemGeometrias;Fim do SELECT."
            Close #1
        Case "Oracle"
            'Não testado com Oracle ainda. Necessita testar novamente
            IMPRIME_COMPONENTE_SEM_GEOMETRIA 'CARREGA UM ARRAY QUE SERÁ USADO NO LUGAR DO RECORDSET
        Case "Postgres"
        
        Case Else
            MsgBox "Banco de dados incorreto, somente são aceitos SQLServer, Oracle e Postgres. Entre em contato com o suporte."
    End Select
End Function
'Esta rotina apaga os pontos (geometrias) dos nós das redes que não possuem atributos associados aos mesmos
'
'José Maria Villac Pinheiro - 11/12/2012
'
'numTabGeomPoints - recebe o número da tabela contento as geometrias dos pontos/nós das redes
'arquivoLog - nomo do arquivo em que são gerados os logs da validação
'
Private Function ApagaPointsSemWatercomponents(numTabGeomPoints As String, arquivoLog As String)
    Dim leGeoSanIni As New ValidaBase.CGeoSanIniFile    'Classe para ler dados de inicialização
    Dim TpConexao As String                             'Tipo de conexão, se SQLServer, Oracle ou Postgres
    Dim strSql As String
    Dim rs As New ADODB.Recordset
    
    On Error GoTo Trata_Erro:
    
    StatusBar1.Panels.Item(1).Text = "3-Apaga nós sem atributos"
    'Informa onde estão as informações sobre a localização, nome e tipo de banco de dados
    leGeoSanIni.arquivo = App.Path & "\Controles\GeoSan.ini"
    TpConexao = leGeoSanIni.TipoBDados
    Select Case TpConexao
        Case "1-SQL Server 2005"
            'gera um Recordset contendo todos os OBJECT_ID_s da tabela de geometrias (POINTS2) que não possuem atrubutos em WATERCOMPONENTS
            strSql = "SELECT OBJECT_ID FROM POINTS" & numTabGeomPoints & " WHERE OBJECT_ID NOT IN (SELECT OBJECT_ID_ FROM WATERCOMPONENTS)"
            Open arquivoLog For Append As #1
            Print #1, vbCrLf & "PointsSemWatercomponents; " & strSql
            Close #1
            Set rs = Conn.Execute(strSql)
            Open arquivoLog For Append As #1
            Print #1, "ApagaPointsSemWatercomponents;Fim do SELECT."
            Close #1
        Case "Oracle"
            'Não testado com Oracle ainda. Necessita testar novamente
            IMPRIME_COMPONENTE_SEM_GEOMETRIA 'CARREGA UM ARRAY QUE SERÁ USADO NO LUGAR DO RECORDSET
        Case "Postgres"
            'Implementar
        Case Else
            MsgBox "Banco de dados incorreto, somente são aceitos SQLServer, Oracle e Postgres. Entre em contato com o suporte."
    End Select
    'para cada object_id da tabela POINTS2 que não possui atributo, apaga-o, pois é um ponto no espaço sem associação com nada
    Do While Not rs.EOF
        Dim objID As String
        objID = rs.Fields("OBJECT_ID").Value
        StatusBar1.Panels.Item(2).Text = "ObjID geom: " & objID
        StatusBar1.Panels.Item(3).Text = " "
        strSql = "DELETE FROM Points" & numTabGeomPoints & " WHERE object_id = '" & objID & "'"
        Conn.Execute (strSql)
        Open arquivoLog For Append As #1
        Print #1, "ApagaPointsSemWatercomponents;Apagado o ponto com object_id: " & objID & " da tabela Points" & numTabGeomPoints & " que não tinha um atributo associado."
        Close #1
        rs.MoveNext
    Loop
    rs.Close
    Open arquivoLog For Append As #1
    Print #1, "ApagaPointsSemWatercomponents;Fim do processamento."
    Close #1
Trata_Erro:

If Err.Number = 0 Or Err.Number = 20 Then
    Resume Next
Else
   'Resume
   Me.MousePointer = vbDefault
   Open arquivoLog For Append As #1
   Print #1, Now & " - Function ApagaPointsSemWatercomponents - " & Err.Number & " - " & Err.Description
   Close #1
   PrintErro CStr(Me.Name), "Function ApagaPointsSemWatercomponents, tipo de erro: ", CStr(Err.Number), CStr(Err.Description), True
   MsgBox "Um posssível erro foi identificado:" & Chr(13) & Chr(13) & Err.Description & Chr(13) & Chr(13) & "Foi gerado na pasta do aplicativo o arquivo: " & App.Path & "\Controles\GeoSanLog.txt" & " com informações desta ocorrência.", vbInformation
End If

End Function
'Esta rotina verifica se para cada atributo de nó existe um object_id da geometria deste nó.
'Depois faz o contrário, verifica se para cada object_id de uma geometria de nó, existe o respectivo atributo
'
'José Maria Villac Pinheiro - 11/12/2012
'
'numTabGeomPoints - recebe o número da tabela contento as geometrias dos pontos/nós das redes
'arquivoLog - nomo do arquivo em que são gerados os logs da validação
'
Private Function VefificaUnicidadeNos(numTabGeomPoints As String, arquivoLog As String)
    Dim leGeoSanIni As New ValidaBase.CGeoSanIniFile    'Classe para ler dados de inicialização
    Dim TpConexao As String                             'Tipo de conexão, se SQLServer, Oracle ou Postgres
    Dim strSql As String
    Dim strSql2 As String
    Dim rs As New ADODB.Recordset
    Dim rs2 As New ADODB.Recordset
    Dim numeroNos As Integer
    Dim objID As String
    
    On Error GoTo Trata_Erro:
    
    'Informa onde estão as informações sobre a localização, nome e tipo de banco de dados
    leGeoSanIni.arquivo = App.Path & "\Controles\GeoSan.ini"
    TpConexao = leGeoSanIni.TipoBDados
    StatusBar1.Panels.Item(1).Text = "2-Verificação da unicidade dos nós"
    Select Case TpConexao
        Case "1-SQL Server 2005"
            'gera um Recordset contendo todos os OBJECT_ID_s da tabela de geometria POINTS2, sem restrições
            strSql = "SELECT OBJECT_ID FROM POINTS" & numTabGeomPoints
            Open arquivoLog For Append As #1
            Print #1, vbCrLf & "VefificaUnicidadeNos; " & strSql
            Close #1
            Set rs = Conn.Execute(strSql)
            Open arquivoLog For Append As #1
            Print #1, "VefificaUnicidadeNos;Fim do SELECT."
            Close #1
        Case "Oracle"
            'Não testado com Oracle ainda. Necessita testar novamente
            IMPRIME_COMPONENTE_SEM_GEOMETRIA 'CARREGA UM ARRAY QUE SERÁ USADO NO LUGAR DO RECORDSET
        Case "Postgres"
        
        Case Else
            MsgBox "VefificaUnicidadeNos;Banco de dados incorreto, somente são aceitos SQLServer, Oracle e Postgres. Entre em contato com o suporte."
    End Select
    'para cada geometria (object_id) do ponto
    Do While Not rs.EOF
        objID = rs.Fields("OBJECT_ID").Value
        'procura na tabela de atrubutos WATERCOMPONENTS quantos atributos deste nó estão lá cadastrados
        strSql2 = "select count(object_id_) from watercomponents where object_id_ = '" & objID & "'"
        Set rs2 = Conn.Execute(strSql2)
        numeroNos = rs2.Fields(0)
        StatusBar1.Panels.Item(2).Text = "ObjID nó: " & objID
        StatusBar1.Panels.Item(3).Text = "Total nós: " & numeroNos
        If numeroNos = 0 Then
            'indica no arquio de log a não conformidade de que os atributos do nó não foram encontrados
            Open arquivoLog For Append As #1
            Print #1, "VefificaUnicidadeNos;O nó numero: " & objID & " existe na tabela Points" & numTabGeomPoints & " mas não existe na tabela watercomponents."
            Close #1
        ElseIf numeroNos > 1 Then
            'indica no arquivo de log que existe mais de um atributo associado a geometria, deveria existir apenas um
            Open arquivoLog For Append As #1
            Print #1, "VefificaUnicidadeNos;O nó numero: " & objID & " existe na tabela Points" & numTabGeomPoints & " e existe na tabela watercomponents: " & numeroNos & " vezes, deveria existir uma única vez."
            Close #1
        Else
            'está tudo certo, existe um atributo na tabela de atributos que está associado a geometria e então não precisa fazer nada
        End If
        rs.MoveNext                         'vamos a próxima geometria de ponto
    Loop
    Open arquivoLog For Append As #1
    Print #1, "VefificaUnicidadeNos;Fim do processamento."
    Close #1
    'Agora verifica ao contrário
    'Informa onde estão as informações sobre a localização, nome e tipo de banco de dados
    Select Case TpConexao
        Case "1-SQL Server 2005"
            'gera um Recordset contendo todos os OBJECT_ID_s sem geometrias
            strSql = "SELECT OBJECT_ID_ FROM WATERCOMPONENTS"
            Open arquivoLog For Append As #1
            Print #1, vbCrLf & "VefificaUnicidadeNos; " & strSql
            Close #1
            Set rs = Conn.Execute(strSql)
            Open arquivoLog For Append As #1
            Print #1, "VefificaUnicidadeNos;Fim do SELECT."
            Close #1
        Case "Oracle"
            'Não testado com Oracle ainda. Necessita testar novamente
            IMPRIME_COMPONENTE_SEM_GEOMETRIA 'CARREGA UM ARRAY QUE SERÁ USADO NO LUGAR DO RECORDSET
        Case "Postgres"
        
        Case Else
            MsgBox "VefificaUnicidadeNos;Banco de dados incorreto, somente são aceitos SQLServer, Oracle e Postgres. Entre em contato com o suporte."
    End Select
    Do While Not rs.EOF
        objID = rs.Fields("OBJECT_ID_").Value
        strSql2 = "select count(object_id) from points" & numTabGeomPoints & " where object_id = '" & objID & "'"
        Set rs2 = Conn.Execute(strSql2)
        numeroNos = rs2.Fields(0)
        StatusBar1.Panels.Item(2).Text = "ObjID nó: " & objID
        StatusBar1.Panels.Item(3).Text = "Total nós: " & numeroNos
        If numeroNos = 0 Then
            Open arquivoLog For Append As #1
            Print #1, "VefificaUnicidadeNos;O nó numero: " & objID & " existe na tabela WATERCOMPONENTS mas não existe na tabela POINTS" & numTabGeomPoints
            Close #1
        ElseIf numeroNos > 1 Then
            Open arquivoLog For Append As #1
            Print #1, "VefificaUnicidadeNos;O nó numero: " & objID & " existe na tabela WATERCOMPONENTS e existe na tabela POINTS" & numTabGeomPoints & ": " & numeroNos & " vezes, deveria existir uma única vez."
            Close #1
        Else
        End If
        rs.MoveNext
    Loop
    rs.Close
    rs2.Close
    Open arquivoLog For Append As #1
    Print #1, "VefificaUnicidadeNos;Fim do processamento."
    Close #1

Trata_Erro:

If Err.Number = 0 Or Err.Number = 20 Then
    Resume Next
Else
   'Resume
   Me.MousePointer = vbDefault
   Open arquivoLog For Append As #1
   Print #1, Now & " - Function VefificaUnicidadeNos - " & Err.Number & " - " & Err.Description
   Close #1
   PrintErro CStr(Me.Name), "Function VefificaUnicidadeNos, tipo de erro: ", CStr(Err.Number), CStr(Err.Description), True
   MsgBox "Um posssível erro foi identificado:" & Chr(13) & Chr(13) & Err.Description & Chr(13) & Chr(13) & "Foi gerado na pasta do aplicativo o arquivo: " & App.Path & "\Controles\GeoSanLog.txt" & " com informações desta ocorrência.", vbInformation
End If
   
End Function
Private Sub ProcuraSeEhNoInicial(id_componente As String, rsNoInicial As ADODB.Recordset)
    'Procura se este nó de Watercomponents é um nó inicial de alguma rede de água em Waterlines
    Set rsNoInicial = Conn.Execute("SELECT LINE_ID,OBJECT_ID_,INITIALCOMPONENT FROM WATERLINES WHERE INITIALCOMPONENT ='" & id_componente & "'")
    If rsNoInicial.EOF = False Then
        'ProcuraSeEhNoInicial = True
    Else
        'ProcuraSeEhNoInicial = False
    End If
End Sub
Private Sub ProcuraSeEhNoFinal(id_componente As String, rsNoInicial As ADODB.Recordset)
    'Procura se este nó de Watercomponents é um nó inicial de alguma rede de água em Waterlines
    Set rsNoInicial = Conn.Execute("SELECT LINE_ID,OBJECT_ID_,FINALCOMPONENT FROM WATERLINES WHERE FINALCOMPONENT ='" & id_componente & "'")
    If rsNoInicial.EOF = False Then
        'ProcuraSeEhNoInicial = True
    Else
        'ProcuraSeEhNoInicial = False
    End If
End Sub

'Procura nós em Watercomponents sem geometrias em PointsXX
Private Function CorrigeGeometriaNosNaoExistentesEmWatercomponents(rsSemPoints As Object) As String
    Dim id_componente As String                                     'object_id da geometria
    Dim rsInitial As New ADODB.Recordset                            'cursor para WATERLINES onde INITIALCOMPONENT é o nó inicial
    Dim rsInitial2 As New ADODB.Recordset                           'demais trechos de rede com o nó inicial, com exceção do trecho inicial já visto
    Dim rsFinal As New ADODB.Recordset                              'lista com linhas (trechos de rede) com nós finais dos trechos de redes de água que pertencem a outros trechos de redes
    Dim LINHA1 As String                                            'object_id da linha que é componente inicial
    Dim LINHA2 As String                                            'object_id da linha que é componente final
    Dim XL1 As Double, XL2 As Double, YL1 As Double, YL2 As Double  'X e Y iniciais e finais da linha
    Dim retorno As Integer
    Dim QTDPT As Integer                                            'número de pontos (vértices) que compõem a linha para pegar as coordenadas do ultimo ponto
    Dim CONTALINHAS As Integer                                      'Indica quantos trechos de rede estão associados a este nó sem geometria
    Dim strCMD As String                                            'comando SQL
    
    'Verifica se o objeto passado é realmente um Recordset
    If Not TypeOf rsSemPoints Is ADODB.Recordset Then
        CorrigeGeometriaNosNaoExistentesEmWatercomponents = "Falha em receber um Recordset válido em CorrigeGeometriaNosNaoExistentesEmWatercomponents"
        Exit Function
    End If
    'Enquanto existirem nós em Watercomponents sem geometrias, varre cada object_id_ de Watercompontes sem geometria
    Do While Not rsSemPoints.EOF = True
        id_componente = rsSemPoints!Object_id_      'obtem o object_id_ que não tem geometria associada
        Dim teste As Boolean                        'indica se é nó inicial ou não de algum trecho de rede
        'verifica se o nó em questão é um nó inicial de algum trecho de redes em WATERLINES
        Call ProcuraSeEhNoInicial(id_componente, rsInitial)
        If Not rsInitial.EOF = True Then
            'chegando a este ponto significa que o componente é inicial de 1 ou mais linhas
            LINHA1 = rsInitial!Object_id_ 'carrega em LINHA1 o id da linha que o componente é inicial
            retorno = TeDatabase1.getPointOfLine(0, LINHA1, 0, XL1, YL1) 'retorna em XL1 e YL1 as coordenadas iniciais da linha
            'Procura se este nó de Watercomponents é um nó final de alguma rede de água em Waterlines
            Set rsFinal = Conn.Execute("SELECT LINE_ID,OBJECT_ID_,FINALCOMPONENT FROM WATERLINES WHERE FINALCOMPONENT ='" & id_componente & "'AND OBJECT_ID_ <> '" & LINHA1 & "'")
            If rsFinal.EOF = False Then
                LINHA2 = rsFinal!Object_id_
                'chegando a este ponto significa que o componente é inicial e final de duas OU mais linhas
                'ANALISAR AS 2 LINHAS
                'FAZER A PESQUISA PARA SABER O X,Y DAS LINHAS
                QTDPT = TeDatabase1.getQuantityPointsLine(0, LINHA2) 'retorna número de pontos que compõem a linha para pegar as coordenadas do ultimo ponto
                If QTDPT >= 2 Then
                    retorno = TeDatabase1.getPointOfLine(0, LINHA2, QTDPT - 1, XL2, YL2) 'retorna em XL2 e YL2 as coordenadas finais da linha
                End If
                If XL1 = XL2 And YL1 = YL2 Then
                   strSql = "insert into points2 (object_id,x,y) values ('" & id_componente & "'," & XL1 & "," & YL1 & "')"
                   Conn.Execute (strSql)
                   Print #5, "Componente " & id_componente & " localizado com sucesso!"
                Else
                   'MsgBox "Valor inconsistente para o componente de rede nº " & id_componente & " contido nas linhas " & LINHA1 & " e " & LINHA2 & "." & Chr(13) & Chr(13) & "Não foi possivel corrigir automaticamente.", vbExclamation, ""
                   Print #5, "Valor inconsistente para o componente de rede nº " & id_componente & " contido nas linhas " & LINHA1 & " e " & LINHA2 & ". Não foi possivel corrigir automaticamente."
                End If
            Else
                'chegando a este ponto significa que o componente é somente inicial de duas ou mais linhas
                'ANALIZAR A LINHA QUE ELE É INICIAL
                CONTALINHAS = 1
                rsInitial.MoveNext
                Do While Not rsInitial.EOF = True
                    CONTALINHAS = CONTALINHAS + 1
                Loop
                If CONTALINHAS = 1 Then 'O PONTO ESTÁ CONECTADO A SOMENTE 1 LINHA
                    'retorno = TeDatabase1.getPointOfLine(0, rsInitial!Object_id_, 0, XL1, YL1)
                    strXL1 = Replace(XL1, ",", ".") 'converte o valor double do XL1
                    strYL1 = Replace(YL1, ",", ".") 'converte o valor double do YL1
                    strSql = "insert into points2 (object_id,x,y) values ('" & id_componente & "'," & strXL1 & "," & strYL1 & ")"
                    Conn.Execute (strSql)
                    Print #5, "Componente " & id_componente & " localizado com sucesso!"
                Else 'O PONTO ESTÁ CONECTADO A MAIS DE 1 LINHA
                    Set rsInitial2 = Conn.Execute("SELECT LINE_ID,OBJECT_ID_,INITIALCOMPONENT FROM WATERLINES WHERE INITIALCOMPONENT ='" & id_componente & "' AND OBJECT_ID_ <> '" & LINHA1 & "'")
                    If rsInitial2.EOF = False Then
                        LINHA2 = rsInitial2!Object_id_
                        retorno = TeDatabase1.getPointOfLine(0, rsInitial2!Object_id_, 0, XL2, YL2)
                        If XL1 = XL2 And YL1 = YL2 Then
                            strXL1 = Replace(XL1, ",", ".") 'converte o valor double do XL1
                            strYL1 = Replace(YL1, ",", ".") 'converte o valor double do YL1
                            strSql = "insert into points2 (object_id,x,y) values ('" & id_componente & "'," & XL1 & "," & YL1 & "')"
                            Conn.Execute (strSql)
                            Print #5, "Componente " & id_componente & " localizado com sucesso!"
                        Else
                            'MsgBox "Valores inconsistentes para a linha " & LINHA1 & " e linha " & LINHA2 & "." & Chr(13) & Chr(13) & "Não foi possivel corrigir automaticamente.", vbExclamation, ""
                            Print #5, "Valores inconsistentes para a linha " & LINHA1 & " e linha " & LINHA2 & ". Não foi possivel corrigir automaticamente."
                        End If
                    Else
                        'MsgBox "Valores inconsistentes para a linha " & LINHA1 & "." & Chr(13) & Chr(13) & "Não foi possivel corrigir automaticamente.", vbExclamation, ""
                        Print #5, "Valores inconsistentes para a linha " & LINHA1 & ". Não foi possivel corrigir automaticamente."
                    End If
                End If
            End If
        Else
            'chegando a este ponto significa que o componente não é inicial de nenhuma linha
            'verificando se ele é final de alguma linha
            Set rsFinal = Conn.Execute("SELECT LINE_ID,OBJECT_ID_,FINALCOMPONENT FROM WATERLINES WHERE FINALCOMPONENT ='" & id_componente & "'")
            If rsFinal.EOF = False Then
                'chegando a este ponto significa que o componente é somente final de duas ou mais linhas
                LINHA1 = rsFinal!Object_id_
                retorno = TeDatabase1.getPointOfLine(0, LINHA1, 0, XL1, YL1)
                CONTALINHAS = 1
                rsFinal.MoveNext
                Do While Not rsFinal.EOF = True
                   CONTALINHAS = CONTALINHAS + 1
                Loop
                If CONTALINHAS = 1 Then 'O PONTO ESTÁ CONECTADO A SOMENTE 1 LINHA
                    strXL1 = Replace(XL1, ",", ".") 'converte o valor double do XL1
                    strYL1 = Replace(YL1, ",", ".") 'converte o valor double do YL1
                    strSql = "insert into points2 (object_id,x,y) values ('" & id_componente & "'," & XL1 & "," & YL1 & "')"
                    Conn.Execute (strSql)
                    Print #5, "Componente " & id_componente & " localizado com sucesso!"
                Else 'O PONTO ESTÁ CONECTADO A MAIS DE 1 LINHA
                    Set rsFinal2 = Conn.Execute("SELECT LINE_ID,OBJECT_ID_,INITIALCOMPONENT FROM WATERLINES WHERE INITIALCOMPONENT ='" & id_componente & "' AND OBJECT_ID_ <> '" & LINHA1 & "'")
                    If rsFinal2.EOF = False Then
                         LINHA2 = rsFinal2!Object_id_
                         retorno = TeDatabase1.getPointOfLine(0, rsFinal2!Object_id_, 0, XL2, YL2)
                         If XL1 = XL2 And YL1 = YL2 Then
                            strSql = "insert into points2 (object_id,x,y) values ('" & id_componente & "'," & XL1 & "," & YL1 & "')"
                            Conn.Execute (strSql)
                            Print #5, "Componente " & id_componente & " localizado com sucesso!"
                         Else
                            'MsgBox "Valores inconsistentes para a linha " & LINHA1 & " e linha " & LINHA2 & "." & Chr(13) & Chr(13) & "Não foi possivel corrigir automaticamente.", vbExclamation, ""
                            Print #5, "Valores inconsistentes para a linha " & LINHA1 & " e linha " & LINHA2 & "." & Chr(13) & Chr(13) & "Não foi possivel corrigir automaticamente."
                         End If
                     Else
                        'MsgBox "Valores inconsistentes para a linha " & LINHA1 & "." & Chr(13) & Chr(13) & "Não foi possivel corrigir automaticamente.", vbExclamation, ""
                        Print #5, "Valores inconsistentes para a linha " & LINHA1 & "." & Chr(13) & Chr(13) & "Não foi possivel corrigir automaticamente."
                     End If
                End If
            Else
               'chegando a este ponto significa que o componente não é inicial nem final de linhas
               strCMD = "DELETE FROM WATERCOMPONENTS WHERE OBJECT_ID_ ='" & id_componente & "'"
               Conn.Execute (strCMD)
               Print #5, "Componente de rede " & id_componente & " sem conexões. >> Excluído."
            End If
        End If
        rsSemPoints.MoveNext
    Loop
    CorrigeGeometriaNosNaoExistentesEmWatercomponents = "Sucesso"
End Function
' numTabGeomPoints - Número da tabela de geometrias (PointsXX) associada a tabela Watercomponents
' esta rotina não está sendo chamada por nenhuma parte do software se vier a ser utilizada é necessário configurar o recemento do arquivoLog
Private Function localizaFaltaPointsEmWatercomponents(numTabGeomPoints) As String

    Dim rsSemPoints As New ADODB.Recordset          'Lista de object_id_s que não possuem geometrias
    Dim id_componente As Integer                    'Object_id_ de Watercomponents sem geometria em PointsXX
    Dim rsInitial As New ADODB.Recordset            '
    Dim rsFinal As New ADODB.Recordset              '
    Dim LINHA1 As String
    Dim LINHA2 As String
    Dim XL1 As Double, XL2 As Double, YL1 As Double, YL2 As Double
    Dim pontos As String
    Dim arquivoLog As String
    
    arquivoLog = ""                                 'é necessário receber este parâmetro para passar para a próxima função chamada
    
    pontos = numTabGeomPoints
    'Procura nós em Watercomponents sem geometrias em PointsXX
    Set rsSemPoints = WcSemGeometrias(pontos, rsSemPoints, arquivoLog)
    If rsSemPoints.EOF = False Then
        'Se existem nós sem geometrias
        Dim teste As String
        teste = CorrigeGeometriaNosNaoExistentesEmWatercomponents(rsSemPoints)
    Else
        'Se não existem nós sem geometrias, ou seja todos os nós em Watercomponents possuem uma geometria associada
        
    End If
End Function
'Esta rotina está apenas como referência para as demais processadas e poderá vir a ser apagada
Private Sub cmdInciar_Click()
    Dim TpConexao As String                                         'Tipo de conexão, se SQLServer, Oracle ou Postgres
    Dim id_componente As Integer                                    'Object_id_ de Watercomponents sem geometria em PointsXX
    Dim rsInitial As New ADODB.Recordset                            'cursor para WATERLINES onde INITIALCOMPONENT é o nó inicial
    Dim LINHA1 As String                                            'object_id da linha que é componente inicial
    Dim LINHA2 As String                                            'object_id da linha que é componente final
    Dim XL1 As Double, XL2 As Double, YL1 As Double, YL2 As Double  'X e Y iniciais e finais da linha
    Dim retorno As Integer
    Dim rsFinal As New ADODB.Recordset                              'lista com linhas (trechos de rede) com nós finais dos trechos de redes de água que pertencem a outros trechos de redes
    Dim QTDPT As Integer                                            'número de pontos (vértices) que compõem a linha para pegar as coordenadas do ultimo ponto
    Dim CONTALINHAS As Integer                                      'Indica quantos trechos de rede estão associados a este nó sem geometria
    Dim rsInitial2 As New ADODB.Recordset                           'demais trechos de rede com o nó inicial, com exceção do trecho inicial já visto
    Dim strCMD As String                                            'comando SQL
    Dim rsVBL As New ADODB.Recordset
    Dim rsVBP As New ADODB.Recordset
    Dim blnPontoCriado As Boolean                                   'para indicar se existe uma geometria ou não
    
On Error GoTo Trata_Erro
   Me.MousePointer = vbHourglass
   
   Open App.Path & "\Controles\ValidaBase2.log" For Append As #5    ' ABRE O ARQUIVO TEXTO PARA LOG
   
'*** FEITO *** IDENTIFICA QUAL TABELA LINES O LAYER WATERLINES REGISTRA AS LOCALIZAÇÕES
   strSql = "SELECT LAYER_ID,NAME FROM TE_LAYER WHERE NAME = '" & "WATERLINES" & "'"
   Set rsLayer = Conn.Execute(strSql)
   If rsLayer.EOF = True Then
      MsgBox "Não localizada a tabela de geometrias 'LINES##' da tabela WATERLINES", vbExclamation, ""
      Exit Sub
   Else
   
'*** FEITO *** EXCLUI AS LINHAS QUE NÃO POSSUEM GEOMETRIA NA TABELA LINES1
      strSql = "SELECT OBJECT_ID_ FROM WATERLINES WHERE OBJECT_ID_ NOT IN (SELECT OBJECT_ID FROM LINES" & rsLayer!layer_id & ")"
      Set rsLinha = Conn.Execute(strSql)
      If rsLinha.EOF = False Then
         Do While Not rsLinha.EOF
            'VERIFICADO QUE QUANDO A LINHA NÃO POSSUI GEOMETRIA, ELA NÃO APARECE NO MAPA
            'E POR ISSO O USUÁRIO NÃO PODE MANIPULA-LA
            'Conn.Execute ("DELETE FROM WATERLINES WHERE OBJECT_ID_ ='" & rsLinha!Object_id_ & "'")
            Print #5, "Linha " & rsLinha!Object_id_ & " SEM GEOMETRIA, EXCLUÍDA."
            rsLinha.MoveNext
         Loop
      End If
      
      
'*** FEITO *** EXCLUI AS GEOMETRIAS DE LINHAS QUE NÃO TEM LINHAS NA TABELA WATERLINES
      strSql = "SELECT OBJECT_ID FROM LINES" & rsLayer!layer_id & " WHERE OBJECT_ID NOT IN (SELECT OBJECT_ID_ FROM WATERLINES)"
      Set rsLinha = Conn.Execute(strSql)
      If rsLinha.EOF = False Then
         Do While Not rsLinha.EOF
            'Conn.Execute ("DELETE FROM LINES1 WHERE OBJECT_ID ='" & rsLinha!object_id & "'")
            Print #5, "DESENHO DE Linha COD " & rsLinha!object_id & " SEM INFORMAÇÃO DE CADASTRO, EXCLUÍDA."
            rsLinha.MoveNext
         Loop
      End If
   
   End If
   
'*** FEITO *** IDENTIFICA QUAL TABELA POINTS O LAYER WATERCOMPONENTS REGISTRA AS LOCALIZAÇÕES
   strSql = "SELECT LAYER_ID,NAME FROM TE_LAYER WHERE NAME = '" & "WATERCOMPONENTS" & "'"
   Set rsLayer = Conn.Execute(strSql)
   If rsLayer.EOF = True Then
      MsgBox "Não localizada a tabela de geometrias 'Points##' da tabela WATERCOMPONENTS", vbExclamation, ""
      Exit Sub
   End If
   
     
'*** FEITO *** COM O SELECT ABAIXO OBTEM-SE UMA LISTA DOS COMPONENTES DE REDE QUE EXISTEM NA TABELA WATERCOMPONENTES MAS NÃO TEM INFORMAÇÃO GEOGRAFICA
   If TpConexao = 1 Then 'CASO SQL SERVER
      strSql = "SELECT OBJECT_ID_ FROM WATERCOMPONENTS WHERE OBJECT_ID_ NOT IN (SELECT OBJECT_ID FROM POINTS" & rsLayer!layer_id & ")"
      Set rsSemPoints = Conn.Execute(strSql)
   Else 'CASO ORACLE
      IMPRIME_COMPONENTE_SEM_GEOMETRIA 'CARREGA UM ARRAY QUE SERÁ USADO NO LUGAR DO RECORDSET
   End If
 
      Do While Not rsSemPoints.EOF = True
         id_componente = rsSemPoints!Object_id_
         
         'VERIFICANDO A QUAL LINHA ESTE COMPONENTE É COMPONENTE INICIAL
         Set rsInitial = Conn.Execute("SELECT LINE_ID,OBJECT_ID_,INITIALCOMPONENT FROM WATERLINES WHERE INITIALCOMPONENT ='" & id_componente & "'")
         
         If rsInitial.EOF = False Then
            'chegando a este ponto significa que o componente é inicial de 1 ou mais linhas
            LINHA1 = rsInitial!Object_id_ 'carrega em LINHA1 o id da linha que o componente é inicial
            
            retorno = TeDatabase1.getPointOfLine(0, LINHA1, 0, XL1, YL1) 'retorna em XL1 e YL1 as coordenadas iniciais da linha

            'VERIFICANDO SE O COMPONENTE É TAMBEM FINAL DE ALGUMA OUTRA LINHA
            Set rsFinal = Conn.Execute("SELECT LINE_ID,OBJECT_ID_,FINALCOMPONENT FROM WATERLINES WHERE FINALCOMPONENT ='" & id_componente & "'AND OBJECT_ID_ <> '" & LINHA1 & "'")
            If rsFinal.EOF = False Then
               LINHA2 = rsFinal!Object_id_
               'chegando a este ponto significa que o componente é inicial e final de duas OU mais linhas
               'ANALISAR AS 2 LINHAS
               
               'FAZER A PESQUISA PARA SABER O X,Y DAS LINHAS
               
               QTDPT = TeDatabase1.getQuantityPointsLine(0, LINHA2) 'retorna número de pontos que compõem a linhA para pegar as coordenadas do ultimo ponto
               If QTDPT >= 2 Then
                  retorno = TeDatabase1.getPointOfLine(0, LINHA2, QTDPT - 1, XL2, YL2) 'retorna em XL2 e YL2 as coordenadas finais da linha
               End If
              

               If XL1 = XL2 And YL1 = YL2 Then
                  strSql = "insert into points2 (object_id,x,y) values ('" & id_componente & "'," & XL1 & "," & YL1 & "')"
                  Conn.Execute (strSql)
                  Print #5, "Componente " & id_componente & " localizado com sucesso!"
                  
               Else
                  'MsgBox "Valor inconsistente para o componente de rede nº " & id_componente & " contido nas linhas " & LINHA1 & " e " & LINHA2 & "." & Chr(13) & Chr(13) & "Não foi possivel corrigir automaticamente.", vbExclamation, ""
                  Print #5, "Valor inconsistente para o componente de rede nº " & id_componente & " contido nas linhas " & LINHA1 & " e " & LINHA2 & ". Não foi possivel corrigir automaticamente."
               End If
            
            Else
               'chegando a este ponto significa que o componente é somente inicial de duas ou mais linhas
               'ANALIZAR A LINHA QUE ELE É INICIAL

               CONTALINHAS = 1
               rsInitial.MoveNext
               Do While Not rsInitial.EOF = True
                  CONTALINHAS = CONTALINHAS + 1
               Loop
               If CONTALINHAS = 1 Then 'O PONTO ESTÁ CONECTADO A SOMENTE 1 LINHA
               
                  'retorno = TeDatabase1.getPointOfLine(0, rsInitial!Object_id_, 0, XL1, YL1)
                  
                  strXL1 = Replace(XL1, ",", ".") 'converte o valor double do XL1
                  strYL1 = Replace(YL1, ",", ".") 'converte o valor double do YL1
                  
                  strSql = "insert into points2 (object_id,x,y) values ('" & id_componente & "'," & strXL1 & "," & strYL1 & ")"
                  
                  Conn.Execute (strSql)
                  Print #5, "Componente " & id_componente & " localizado com sucesso!"
                  
               
               Else 'O PONTO ESTÁ CONECTADO A MAIS DE 1 LINHA
                  Set rsInitial2 = Conn.Execute("SELECT LINE_ID,OBJECT_ID_,INITIALCOMPONENT FROM WATERLINES WHERE INITIALCOMPONENT ='" & id_componente & "' AND OBJECT_ID_ <> '" & LINHA1 & "'")
                  If rsInitial2.EOF = False Then
                     LINHA2 = rsInitial2!Object_id_
                     retorno = TeDatabase1.getPointOfLine(0, rsInitial2!Object_id_, 0, XL2, YL2)
                     
                     If XL1 = XL2 And YL1 = YL2 Then
                        strXL1 = Replace(XL1, ",", ".") 'converte o valor double do XL1
                        strYL1 = Replace(YL1, ",", ".") 'converte o valor double do YL1
                        strSql = "insert into points2 (object_id,x,y) values ('" & id_componente & "'," & XL1 & "," & YL1 & "')"
                        Conn.Execute (strSql)
                        Print #5, "Componente " & id_componente & " localizado com sucesso!"
                     Else
                        
                        'MsgBox "Valores inconsistentes para a linha " & LINHA1 & " e linha " & LINHA2 & "." & Chr(13) & Chr(13) & "Não foi possivel corrigir automaticamente.", vbExclamation, ""
                        Print #5, "Valores inconsistentes para a linha " & LINHA1 & " e linha " & LINHA2 & ". Não foi possivel corrigir automaticamente."
                     End If
                  Else
                  
                     'MsgBox "Valores inconsistentes para a linha " & LINHA1 & "." & Chr(13) & Chr(13) & "Não foi possivel corrigir automaticamente.", vbExclamation, ""
                     Print #5, "Valores inconsistentes para a linha " & LINHA1 & ". Não foi possivel corrigir automaticamente."
                  End If
                  
               End If
               
            End If
            
         Else
            'chegando a este ponto significa que o componente não é inicial de nenhuma linha
            'verificando se ele é final de alguma linha
            Set rsFinal = Conn.Execute("SELECT LINE_ID,OBJECT_ID_,FINALCOMPONENT FROM WATERLINES WHERE FINALCOMPONENT ='" & id_componente & "'")
            If rsFinal.EOF = False Then
               'chegando a este ponto significa que o componente é somente final de duas ou mais linhas
            
               LINHA1 = rsFinal!Object_id_
               retorno = TeDatabase1.getPointOfLine(0, LINHA1, 0, XL1, YL1)
            
               CONTALINHAS = 1
               rsFinal.MoveNext
               Do While Not rsFinal.EOF = True
                  CONTALINHAS = CONTALINHAS + 1
               Loop
               If CONTALINHAS = 1 Then 'O PONTO ESTÁ CONECTADO A SOMENTE 1 LINHA
               
                  
                  strXL1 = Replace(XL1, ",", ".") 'converte o valor double do XL1
                  strYL1 = Replace(YL1, ",", ".") 'converte o valor double do YL1
                  strSql = "insert into points2 (object_id,x,y) values ('" & id_componente & "'," & XL1 & "," & YL1 & "')"
                  Conn.Execute (strSql)
                  Print #5, "Componente " & id_componente & " localizado com sucesso!"
               
               Else 'O PONTO ESTÁ CONECTADO A MAIS DE 1 LINHA
                  Set rsFinal2 = Conn.Execute("SELECT LINE_ID,OBJECT_ID_,INITIALCOMPONENT FROM WATERLINES WHERE INITIALCOMPONENT ='" & id_componente & "' AND OBJECT_ID_ <> '" & LINHA1 & "'")
                  If rsFinal2.EOF = False Then
                     
                     LINHA2 = rsFinal2!Object_id_
                     retorno = TeDatabase1.getPointOfLine(0, rsFinal2!Object_id_, 0, XL2, YL2)
                     
                     If XL1 = XL2 And YL1 = YL2 Then
                        strSql = "insert into points2 (object_id,x,y) values ('" & id_componente & "'," & XL1 & "," & YL1 & "')"
                        Conn.Execute (strSql)
                        Print #5, "Componente " & id_componente & " localizado com sucesso!"
                     Else
                        
                        'MsgBox "Valores inconsistentes para a linha " & LINHA1 & " e linha " & LINHA2 & "." & Chr(13) & Chr(13) & "Não foi possivel corrigir automaticamente.", vbExclamation, ""
                        Print #5, "Valores inconsistentes para a linha " & LINHA1 & " e linha " & LINHA2 & "." & Chr(13) & Chr(13) & "Não foi possivel corrigir automaticamente."
                     End If
                  Else
                  
                     'MsgBox "Valores inconsistentes para a linha " & LINHA1 & "." & Chr(13) & Chr(13) & "Não foi possivel corrigir automaticamente.", vbExclamation, ""
                     Print #5, "Valores inconsistentes para a linha " & LINHA1 & "." & Chr(13) & Chr(13) & "Não foi possivel corrigir automaticamente."
                     
                  End If
                  
               End If
            
            
            Else
               'chegando a este ponto significa que o componente não é inicial nem final de linhas
               
               strCMD = "DELETE FROM WATERCOMPONENTS WHERE OBJECT_ID_ ='" & id_componente & "'"
               Conn.Execute (strCMD)
            
               Print #5, "Componente de rede " & id_componente & " sem conexões. >> Excluído."
            
            End If
               
         End If
         rsSemPoints.MoveNext
      Loop
   'End If
   
   Print #5, ""
   Print #5, " * * * * FIM DE VERIFICAÇÃO DE GEOMETRIAS * * * *"
   Print #5, ""
'*** FEITO ***
   Set rsVBL = Conn.Execute("SELECT OBJECT_ID_ AS COD,INITIALCOMPONENT AS INI FROM WATERLINES ORDER BY INITIALCOMPONENT")
   If rsVBL.EOF = False Then
       Set rsVBP = Conn.Execute("SELECT COMPONENT_ID AS COMPONENTE FROM WATERCOMPONENTS ORDER BY COMPONENT_ID")
       'VALIDANDO TODOS OS COMPONENTES INITIAL DA WATERLINES
       If rsVBP.EOF = False Then
           Do While Not rsVBP.EOF = True And Not rsVBL.EOF = True
               If rsVBP!COMPONENTE = rsVBL!ini Then 'validado
                   rsVBL.MoveNext
                   VALID = True
               ElseIf rsVBP!COMPONENTE < rsVBL!ini Then
                   rsVBP.MoveNext
                   VALID = False
               Else
                   Print #5, "Componente Inicial:"; Tab(21); rsVBL!ini; Tab(31); "da linha"; Tab(40); rsVBL!COD; Tab(50); "NÃO ENCONTRADO."
                   
                   CriaComponenteDefault (rsVBL!ini)
                   If blnPontoCriado = True Then
                       Print #5, "Componente " & rsVBL!ini & " POSSUI GEOMETRIA E FOI CRIADO AUTOMATICAMENTE."
                   Else
                       Print #5, "Componente " & rsVBL!ini & " NÃO PODE SER CRIADO AUTOMATICAMENTE."
                   End If
                   
                   rsVBL.MoveNext
               End If
               If rsVBP.EOF = True Then
                   If VALID = False Then
                       Do While Not rsVBL.EOF = True
                           Print #5, "Componente Inicial:"; Tab(21); rsVBL!ini; Tab(31); "da linha"; Tab(40); rsVBL!COD; Tab(50); "não encontrado!"
                           
                           CriaComponenteDefault (rsVBL!ini)
                           If blnPontoCriado = True Then
                               Print #5, "Componente " & rsVBL!ini & " POSSUI GEOMETRIA E FOI CRIADO AUTOMATICAMENTE."
                           Else
                               Print #5, "Componente " & rsVBL!ini & " NÃO PODE SER CRIADO AUTOMATICAMENTE."
                           End If
                           rsVBL.MoveNext
                       Loop
                   End If
                   Exit Do
               End If
           Loop
       End If
   End If
   Print #5, ""
   Print #5, " * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *"
   Print #5, ""
'*** FEITO ***
   Set rsVBL = Conn.Execute("SELECT OBJECT_ID_ AS COD,FINALCOMPONENT AS FIM FROM WATERLINES ORDER BY FINALCOMPONENT")
   If rsVBL.EOF = False Then
       Set rsVBP = Conn.Execute("SELECT COMPONENT_ID AS COMPONENTE FROM WATERCOMPONENTS ORDER BY COMPONENT_ID")
       'VALIDANDO TODOS OS COMPONENTES FINAL DA WATERLINES
       If rsVBP.EOF = False Then
           Do While Not rsVBP.EOF = True And Not rsVBL.EOF = True
               If rsVBP!COMPONENTE = rsVBL!fim Then 'validado
                   rsVBL.MoveNext
                   VALID = True
               ElseIf rsVBP!COMPONENTE < rsVBL!fim Then
                   rsVBP.MoveNext
                   VALID = False
               Else
                   Print #5, "Componente Final:"; Tab(21); rsVBL!fim; Tab(31); "da linha"; Tab(40); rsVBL!COD; Tab(50); "NÃO ENCONTRADO."
                   
                   CriaComponenteDefault (rsVBL!fim)
                   If blnPontoCriado = True Then
                       Print #5, "Componente " & rsVBL!fim & " POSSUI GEOMETRIA E FOI CRIADO AUTOMATICAMENTE."
                   Else
                       Print #5, "Componente " & rsVBL!fim & " NÃO PODE SER CRIADO AUTOMATICAMENTE."
                   End If
   
                   rsVBL.MoveNext
               End If
               If rsVBP.EOF = True Then
                   If VALID = False Then
                       Do While Not rsVBL.EOF = True
                           Print #5, "Componente Final:"; Tab(21); rsVBL!fim; Tab(31); "da linha"; Tab(40); rsVBL!COD; Tab(50); "não encontrado!"
                           
                           CriaComponenteDefault (rsVBL!fim)
                           If blnPontoCriado = True Then
                              Print #5, "Componente " & rsVBL!fim & " POSSUI GEOMETRIA E FOI CRIADO AUTOMATICAMENTE."
                           Else
                              Print #5, "Componente " & rsVBL!fim & " NÃO PODE SER CRIADO AUTOMATICAMENTE."
                           End If
                           
                           rsVBL.MoveNext
                       Loop
                   End If
                   Exit Do
               End If
           Loop
       End If
   End If
   
   Close #5 'FECHA O ARQUIVO TEXTO PARA LOG
   
   rsVBL.Close
   rsVBP.Close
   Me.MousePointer = vbDefault
   MsgBox "foi gerado em xxx um relatório contendo o diagnóstico de rede.", vbInformation, ""
   Unload Me
   

Trata_Erro:

If Err.Number = 0 Or Err.Number = 20 Then
    Resume Next
Else
   'Resume
   Me.MousePointer = vbDefault
   Open App.Path & "\Controles\GeoSanLog.txt" For Append As #1
   Print #1, Now & " - frmVerificaConectividade - cmdInciar_Click - " & Err.Number & " - " & Err.Description
   Close #1
   MsgBox "Um posssível erro foi identificado:" & Chr(13) & Chr(13) & Err.Description & Chr(13) & Chr(13) & "Foi gerado na pasta do aplicativo o arquivo GeoSanLog.txt com informações desta ocorrência.", vbInformation

End If

End Sub
'revisar esta rotina

Private Function IMPRIME_COMPONENTE_SEM_GEOMETRIA()
   
   'FUNÇÃO PARA VERIFICAR SE OS OBJECT_ID NA TABELA POINTS POSSUEM UM OBJECT_ID_ NA WATERCOMPONENTS
   'CRIA UMA LISTA DE ID's DE WATERCOMPONENTS QUE NÃO FORAM ENCONTRADOS
   Dim rsWTC As New ADODB.Recordset
   Dim rsPOINT As New ADODB.Recordset
   
   Set rsWTC = Conn.Execute("SELECT OBJECT_ID_ AS ID_COMP, LENGTH(OBJECT_ID_) AS TAM FROM WATERCOMPONENTS ORDER BY TAM, OBJECT_ID_")
   
   'SELECT OBJECT_ID_, LENGTH(OBJECT_ID_) AS TAM from WATERCOMPONENTS ORDER BY TAM, OBJECT_ID_
   
   If rsWTC.EOF = False Then
       Set rsPOINT = Conn.Execute("SELECT OBJECT_ID AS ID_POINT, LENGTH(OBJECT_ID) AS TAM FROM POINTS16 ORDER BY TAM, OBJECT_ID")
       
       Open "c:\teste.txt" For Append As #4
       'COMPARANDO OS ID's
       
       If rsPOINT.EOF = False Then
           Do While Not rsPOINT.EOF = True And Not rsWTC.EOF = True
               If CDbl(rsPOINT!ID_POINT) = CDbl(rsWTC!ID_COMP) Then 'validado
                   rsWTC.MoveNext
                   VALID = True
               ElseIf CDbl(rsPOINT!ID_POINT) < CDbl(rsWTC!ID_COMP) Then
                   rsPOINT.MoveNext
                   VALID = False
               Else
                   Print #4, "Componente Inicial:"; Tab(21); rsWTC!ID_COMP; Tab(30); "NÃO ENCONTRADO NA TABELA DE GEOMETRIA."
                   
'                   CriaComponenteDefault (rsWTC!ini)
'                   If blnPontoCriado = True Then
'                       Print #5, "Componente " & rsWTC!ini & " POSSUI GEOMETRIA E FOI CRIADO AUTOMATICAMENTE."
'                   Else
'                       Print #5, "Componente " & rsWTC!ini & " NÃO PODE SER CRIADO AUTOMATICAMENTE."
'                   End If
                   
                   rsWTC.MoveNext
               End If
'               If rsVBP.EOF = True Then
'                   If VALID = False Then
'                       Do While Not rsWTC.EOF = True
'                           Print #5, "Componente Inicial:"; Tab(21); rsWTC!ini; Tab(31); "da linha"; Tab(40); rsWTC!COD; Tab(50); "não encontrado!"
'
'                           CriaComponenteDefault (rsWTC!ini)
'                           If blnPontoCriado = True Then
'                               Print #5, "Componente " & rsWTC!ini & " POSSUI GEOMETRIA E FOI CRIADO AUTOMATICAMENTE."
'                           Else
'                               Print #5, "Componente " & rsWTC!ini & " NÃO PODE SER CRIADO AUTOMATICAMENTE."
'                           End If
'                           rsWTC.MoveNext
'                       Loop
'                   End If
'                   Exit Do
'               End If
           Loop
       End If
   End If

Close #4

End Function

Private Sub Cancela_Click()
    Unload Me
End Sub
'A partir dos dados de um nó, localiza se existem trechos de rede encostados no mesmo
'
'
'
Private Function ProcuraTrechosEncostadosEmUmNo(no_coord_x As Double, no_coord_y As Double, objId_no As String, arquivoLog As String)

    Dim strSql As String
    Dim leGeoSanIni As New ValidaBase.CGeoSanIniFile    'Classe para ler dados de inicialização
    Dim TpConexao As String                             'Tipo de conexão, se SQLServer, Oracle ou Postgres
    Dim rsLinha As New ADODB.Recordset
    Dim retorno As Integer
    Dim numPontos As Integer
    Dim objIDLinha As String
    Dim Xi As Double
    Dim Xf As Double
    Dim Yi As Double
    Dim Yf As Double                                    'Coordenadas inicial e final da linha
    Dim encontrou As Boolean                            'indica se encontrou ou não uma extremidade da linha que coincide com a coordenada do nó
    Dim dbConn As New ADODB.Connection
    Dim tipoErro As String                              'Registra o tipo de erro que pode vir a acontecer
    Dim precisao As Double                              'Indica a precisão de comparação entre duas coordenadas
    Dim contadorTrechos As Integer                      'Para mostrar no statusbar o trecho que está sendo processado
    Dim dif_x As Double                                 'Calcula se os nós estão na mesma coordenada para comparar a precisão
    Dim dif_y As Double                                 'Calcula se os nós estão na mesma coordenada para comparar a precisão
    
    precisao = 0.01
    contadorTrechos = 0
    On Error GoTo Trata_Erro
    leGeoSanIni.arquivo = App.Path & "\Controles\GeoSan.ini"
    TpConexao = leGeoSanIni.TipoBDados
    dbConn.Open leGeoSanIni.StrConexao                              'Abre a conexão geográfica com o banco de dados do GeoSan para utilizar o TeDatabase
    TeDatabase1.Connection = dbConn                                 'Atribui a conexão para TeDatabase
    TeDatabase1.setCurrentLayer ("waterlines")                      'Indica que o layer ativo é o de redes de água, WATERLINES
    
    Select Case TpConexao
        Case "1-SQL Server 2005"
            'gera um Recordset contendo todos os OBJECT_ID_s sem geometrias
            strSql = "SELECT * FROM LINES1"
            strSql = strSql + " where lower_x <= " & no_coord_x + precisao & " and upper_x >= " & no_coord_x - precisao & " and lower_y <= " & no_coord_y + precisao & " and upper_y >= " & no_coord_y - precisao
            strSql = Replace(strSql, ",", ".")
            Set rsLinha = Conn.Execute(strSql)
        Case "Oracle"
            'Não implementado
        Case "Postgres"
            'Não implementado
        Case Else
            MsgBox "Banco de dados incorreto, somente são aceitos SQLServer, Oracle e Postgres. Entre em contato com o suporte."
    End Select
    
    encontrou = False
    objIDLinha = ""
    Do While Not rsLinha.EOF
        'procura em todas as linhas (redes) se existe um nó com as mesmas coordenadas que uma das extremidades da linha
        contadorTrechos = contadorTrechos + 1
        objIDLinha = rsLinha.Fields("object_id").Value
        retorno = TeDatabase1.getPointOfLine(0, objIDLinha, 0, Xi, Yi) 'retorna em Xi e Yi as coordenadas iniciais da linha
        dif_x = Abs(Xi - no_coord_x)
        dif_y = Abs(Yi - no_coord_y)
        If dif_x < precisao And dif_y < precisao Then
            encontrou = True
            Exit Do
        End If
        numPontos = TeDatabase1.getQuantityPointsLine(0, objIDLinha) 'retorna número de pontos que compõem a linhA para pegar as coordenadas do ultimo ponto
        If numPontos >= 2 Then
            retorno = TeDatabase1.getPointOfLine(0, objIDLinha, numPontos - 1, Xf, Yf) 'retorna em XL2 e YL2 as coordenadas finais da linha
        End If
        dif_x = Abs(Xf - no_coord_x)
        dif_y = Abs(Yf - no_coord_y)
        If dif_x < precisao And dif_y < precisao Then
            encontrou = True
            Exit Do
        End If
        StatusBar1.Panels.Item(3).Text = "Trecho " & CStr(contadorTrechos)
        rsLinha.MoveNext
    Loop
    If encontrou = False Then
        'o objIDLinha não tem relação aqui com o objId_no
        Open arquivoLog For Append As #1
        Print #1, vbCrLf & "Não encontra uma linha encostada no nó de object_id_ = " & objId_no
        Close #1
        'Implementação SQLServer para apagar o nó sozinho
            Dim rsNo As New ADODB.Recordset
            strSql = "DELETE FROM Points2 where object_id = " & objId_no
            Set rsNo = Conn.Execute(strSql)
            strSql = "DELETE FROM watercomponents where object_id_ = " & objId_no
            Set rsNo = Conn.Execute(strSql)
            'rsNo.Close
            Open arquivoLog For Append As #1
            Print #1, vbCrLf & "Apagada a geometria e atributo do nó de object_id_ = " & objId_no & " que não estava associado a nenhum trecho de rede."
            Close #1
    End If

Trata_Erro:
    If Err.Number = 0 Or Err.Number = 20 Then
        Resume Next
    Else
        Screen.MousePointer = vbDefault
        PrintErro CStr(Me.Name), "ProcessaBancoDados_Click(), tipo de erro: " & tipoErro, CStr(Err.Number), CStr(Err.Description), True
    End If
End Function
' Esta rotina localiza todos os nós que não possuem encostados nos mesmos um trecho de rede
'
' numTabGeomPoints - número da tabela que contem as geometrias de pontos dos nós (watercomponents)
' arquivoLog - nome do arquivo onde serão gerados os logs
'
Private Function ProcuraNosSemTrechosEncostados(numTabGeomPoints As String, arquivoLog As String)

    Dim strSql As String
    Dim leGeoSanIni As New ValidaBase.CGeoSanIniFile    'Classe para ler dados de inicialização
    Dim TpConexao As String                             'Tipo de conexão, se SQLServer, Oracle ou Postgres
    Dim rsNo As New ADODB.Recordset
    Dim coordNo_x As Double                             'Coordenada y do nó
    Dim coordNo_y As Double                             'Coordenada y do nó
    Dim objID As String
    Dim tipoErro As String                                          'Registra o tipo de erro que pode vir a acontecer
    Dim contadorNos As Integer                          'Conta para mostrar o andamento do processamento no statusbar
    
    On Error GoTo Trata_Erro
    
    StatusBar1.Panels.Item(1).Text = "1-Vefifica nós sem redes"
    contadorNos = 0
    leGeoSanIni.arquivo = App.Path & "\Controles\GeoSan.ini"
    TpConexao = leGeoSanIni.TipoBDados
    StatusBar1.Panels.Item(1).Text = "1-Verificação dos nós"
    Select Case TpConexao
        Case "1-SQL Server 2005"
            'gera um Recordset contendo todos os OBJECT_ID_s sem geometrias
            strSql = "SELECT * FROM POINTS" & numTabGeomPoints
            Set rsNo = Conn.Execute(strSql)
        Case "Oracle"
            'Não implementado
        Case "Postgres"
            'Não implementado
        Case Else
            MsgBox "Banco de dados incorreto, somente são aceitos SQLServer, Oracle e Postgres. Entre em contato com o suporte."
    End Select
    
    Do While Not rsNo.EOF
        'obtenho os dados do ponto com suas coordenadas
        contadorNos = contadorNos + 1
        StatusBar1.Panels.Item(2).Text = "Nó " & CStr(contadorNos)
        objID = rsNo.Fields("OBJECT_ID").Value
        coordNo_x = rsNo.Fields("x").Value
        coordNo_y = rsNo.Fields("y").Value
        Call ProcuraTrechosEncostadosEmUmNo(coordNo_x, coordNo_y, objID, arquivoLog)
        rsNo.MoveNext
    Loop
    
Trata_Erro:
    If Err.Number = 0 Or Err.Number = 20 Then
        Resume Next
    Else
        Screen.MousePointer = vbDefault
        PrintErro CStr(Me.Name), "ProcessaBancoDados_Click(), tipo de erro: " & tipoErro, CStr(Err.Number), CStr(Err.Description), True
    End If
End Function
'Esta é a rotina inicial que realiza o processamento do banco de dados do GeoSan quando a não conformidades existentes no mesmo
'É dada uma ênfase em informar todas as atividades no arquivo de log do sistema
'
'
'
Private Sub ProcessaBancoDados_Click()
    On Error GoTo Trata_Erro                                        'Desvia para a rotina de tratamento de erro, caso um erro ocorra
    Dim leGeoSanIni As New ValidaBase.CGeoSanIniFile                'Abre a conexão com o banco de dados
    Dim num_linhas As Integer
    Dim numeroTabelaGeomWl As String
    Dim numeroTabelaGeomWc As String
    Dim rsSemPoints As New ADODB.Recordset
    Dim id_componente As String                                     'object_id da tabela de atributos de pontos que não possui geometria associada
    Dim rsFinal As New ADODB.Recordset                              'rsFinal indica os trechos de redes que possuem como nó final o mesmo que de outros trechos, ou seja redes conectadas
                                                                    'lista com linhas (trechos de rede) com nós finais dos trechos de redes de água que pertencem a outros trechos de redes
    Dim rsInitial As New ADODB.Recordset                            'lista com linhas (trechos de redes) com nós iniciais dos trechos de redes de água que pertencem a outros trechos de redes
    Dim LINHA1 As String                                            'object_id da linha que é componente inicial
    Dim LINHA2 As String                                            'object_id da linha que é componente final
    Dim QTDPT As Integer
    Dim retorno As Double
    Dim XL1 As Double, XL2 As Double, YL1 As Double, YL2 As Double  'X e Y iniciais e finais da linha
    Dim dbConn As New ADODB.Connection
    Dim strCMD As String                                            'comando SQL
    Dim arquivoLog As String                                        'nome do arquivo de log com todas as operações realizadas no banco de dados
    Dim tipoErro As String                                          'Registra o tipo de erro que pode vir a acontecer
    
    StatusBar1.Panels.Item(1).Text = "Iníciando ..."
    StatusBar1.Panels.Item(2).Text = "  "
    
    tipoErro = "Sem registro erro"                                  'indica que não existe um registro de erro
    Screen.MousePointer = vbHourglass                               'coloca o mouse como ampulheta
    leGeoSanIni.arquivo = App.Path & "\Controles\GeoSan.ini"        'Informa onde estão as informações sobre a localização, nome e tipo de banco de dados
    Conn.ConnectionString = leGeoSanIni.StrConexao                  'Inicializa a string de conexão com o banco de dados
    tipoErro = "Erro de conexão com base de dados: " & leGeoSanIni.StrConexao & " no arquivo: " & App.Path & "\Controles\GeoSan.ini"  'Registra a conexão caso o registro de erro ocorra
    Conn.Open                                                       'Abre a conexão com o banco de dados do GeoSan
    tipoErro = "Sem registro erro"                                  'indica que não existe um registro de erro
    arquivoLog = "\Controles\ValidaBase" & DateValue(Now) & "  " & TimeValue(Now) & ".log"    'define o nome completo do arquivo de log do sistema, incluíndo a data e hora em que o mesmo será gerado pela primeira vez
    arquivoLog = Replace(arquivoLog, "/", "-")                      'troca caractere / especial que não é aceito como parte do nome do arquivo
    arquivoLog = Replace(arquivoLog, ":", "-")                      'troca caractere : especial que não é aceito como parte do nome do arquivo
    arquivoLog = App.Path & arquivoLog                              'adiciona a localização do caminho onde o aplicativo está instalado
    Open arquivoLog For Append As #1                                'Inicia o log do sistema, abrindo o arquivo sem apagar o log anterior, mantendo sempre o histórico
    Print #1, vbCrLf & "ValidaBase;*************************************************************************************************"  'Pula uma linha antes de iniciar a escrita
    Print #1, "ValidaBase;Início do processamento do banco de dados GeoSan: " & DateValue(Now) & " - " & TimeValue(Now)
    Close #1
    numeroTabelaGeomWl = ObtemGeomWaterlines                        'Precisamos saber qual o número da tabela de geometrias que está relacionada com a tabela de atributos WATERLINES
    num_linhas = ApagaLinhasAtributosSemGeometriasWaterlines(numeroTabelaGeomWl, arquivoLog)    'Varre a tabela de WATERLINES para ver se encontra atributos sem geometrias e se encontrar apaga os atributos
    num_linhas = ApagaGeometriasSemAtributosWaterlines(numeroTabelaGeomWl, arquivoLog)          'Varre a tabela WATERLINES para ver se encontra geometrias sem atributos e se encontrar apaga as geometrias
    numeroTabelaGeomWc = ObtemGeomWatercomponents                   'Obtem o número da tabela POINTS, de geometrias dos nós das redes
    dbConn.Open leGeoSanIni.StrConexao                              'Abre a conexão geográfica com o banco de dados do GeoSan para utilizar o TeDatabase
    TeDatabase1.Connection = dbConn                                 'Atribui a conexão para TeDatabase
    TeDatabase1.setCurrentLayer ("waterlines")                      'Indica que o layer ativo é o de redes de água, WATERLINES
       
    

    
    'Procura por nós soltos, que não tenham trechos encostados nos mesmos
    Call ProcuraNosSemTrechosEncostados(numeroTabelaGeomWc, arquivoLog)
    
    
    'Verifica se para cada object_id em Points2 existe outro em Watercomponents e vice-versa
    Call VefificaUnicidadeNos(numeroTabelaGeomWc, arquivoLog)
    
    'Apaga todos os pontos dos nós que não possuem atributo associado
    'Ele vai na tabela POINTS2 e verifica se existem geometrias de nós (pontos) que não possuem atributos associados
    'Ele elimina as geometrias que não possuem atributos e registra as eliminadas no arquivo de log
    Call ApagaPointsSemWatercomponents(numeroTabelaGeomWc, arquivoLog)
    
    'Identifica se existem NÓS existentes como atributos mas sem a presença da respectiva geometria
    'Ele vai na tabela WATERCOMPONENTS e verifica se existem atributos de componentes (nós) que não possuem uma geometria associada
    'Em nosso modelo sempre deve existir uma geometria associada a um atributo
    Call WcSemGeometrias(numeroTabelaGeomWc, rsSemPoints, arquivoLog)
    
    'Desta forma, conforme chamada anterior vamos agora investigar os nós que possuem atributos, mas não possuem as respectivas geometrias associadas
    'Enquanto existirem nós sem geometrias
    'Primeiro verifica se existem atributos de pontos (nós de redes) sem geometrias, se não existir pula esta parte (While), pois está tudo ok
    Open arquivoLog For Append As #1
    Print #1, vbCrLf & "ProcessaBancoDados_Click;Início da investigação dos nós que possuem atributos mas não possuem geometrias"
    Close #1
    StatusBar1.Panels.Item(1).Text = "4-Nós com atributos sem geometrias"
    Do While Not rsSemPoints.EOF = True
        id_componente = rsSemPoints!Object_id_                              'obtem o object_id_ que não tem geometria associada
        StatusBar1.Panels.Item(2).Text = "Nó " & id_componente
        StatusBar1.Panels.Item(3).Text = " "
        Call ProcuraSeEhNoInicial(id_componente, rsInitial)                 'verifica se o nó em questão é um nó inicial de algum trecho de redes em WATERLINES
        If rsInitial.EOF = False Then
            'chegando a este ponto significa que o componente é inicial de 1 ou mais linhas (trechos de rede)
            LINHA1 = rsInitial!Object_id_                                   'carrega em LINHA1 o id da linha que o componente é inicial
            retorno = TeDatabase1.getPointOfLine(0, LINHA1, 0, XL1, YL1)    'retorna em XL1 e YL1 as coordenadas iniciais da linha
            'Procura pelos demais trechos de rede com OBJECT_ID do nó inicial com exceção do trecho já visto anteriormente
            Set rsFinal = Conn.Execute("SELECT LINE_ID,OBJECT_ID_,FINALCOMPONENT FROM WATERLINES WHERE FINALCOMPONENT ='" & id_componente & "'AND OBJECT_ID_ <> '" & LINHA1 & "'")
            If rsFinal.EOF = False Then
                'chegando a este ponto significa que o componente é final de 1 ou mais linhas (trechos de rede)
                LINHA2 = rsFinal!Object_id_                                 'carrega em LINHA1 o id da linha que o componente é final
                'chegando a este ponto significa que o componente é inicial e final de duas OU mais linhas
                'ANALISAR AS 2 LINHAS
                'FAZER A PESQUISA PARA SABER O X,Y DAS LINHAS
                'caso a linha que está conectada no ponto final possua mais de dois vertices, vamos obter as coordenadas do último vértice
                QTDPT = TeDatabase1.getQuantityPointsLine(0, LINHA2) 'retorna número de pontos que compõem a linhA para pegar as coordenadas do ultimo ponto
                If QTDPT >= 2 Then
                  retorno = TeDatabase1.getPointOfLine(0, LINHA2, QTDPT - 1, XL2, YL2) 'retorna em XL2 e YL2 as coordenadas finais da linha
                End If
                If XL1 = XL2 And YL1 = YL2 Then
                    strXL1 = Replace(XL1, ",", ".")     'converte o valor double do XL1
                    strYL1 = Replace(YL1, ",", ".")     'converte o valor double do YL1
                    strSql = "insert into points2 (object_id,x,y) values ('" & id_componente & "'," & strXL1 & "," & strYL1 & ")"       'insere esta geometria de ponto que está faltando
                    Open arquivoLog For Append As #1
                    Print #1, "ProcessaBancoDados_Click-03;" & strSql
                    Close #1
                    Conn.Execute (strSql)
                Else
                    'Não pode entrar aqui pois achou mais trechos de rede
                    'MsgBox "Valor inconsistente para o componente de rede nº " & id_componente & " contido nas linhas " & LINHA1 & " e " & LINHA2 & "." & Chr(13) & Chr(13) & "Não foi possivel corrigir automaticamente.", vbExclamation, ""
                    Open arquivoLog For Append As #1
                    Print #1, "ProcessaBancoDados_Click-04;Valor inconsistente para o componente de rede nº " & id_componente & " contido nas linhas " & LINHA1 & " e " & LINHA2 & ". Não foi possivel corrigir automaticamente."
                    Close #1
               End If
            Else
                'chegando a este ponto significa que o componente é somente inicial de duas ou mais linhas
                'ANALIZAR A LINHA QUE ELE É INICIAL
                Dim CONTALINHAS As Integer              'Indica quantos trechos de rede estão associados a este nó sem geometria
                
                CONTALINHAS = 1                         'Inicializa o contador para uma linha associada
                rsInitial.MoveNext                      'Vai para a próxima linha
                Do While Not rsInitial.EOF = True       'Enquanto existirem linhas com o nó inicial sem atributo de geometria
                    CONTALINHAS = CONTALINHAS + 1       'Incrementa o contador de trechos existentes em que o nó inicial não possui atributo de geometria
                    rsInitial.MoveNext
                Loop
                If CONTALINHAS = 1 Then                 'O PONTO ESTÁ CONECTADO A SOMENTE 1 LINHA
                    'Existe somente um trecho de rede (linha) com o nó inicial sem a respectiva geometria associada
                    strXL1 = Replace(XL1, ",", ".")     'converte o valor double do XL1
                    strYL1 = Replace(YL1, ",", ".")     'converte o valor double do YL1
                    'insere esta geometria de ponto que está faltando
                    strSql = "insert into points2 (object_id,x,y) values ('" & id_componente & "'," & strXL1 & "," & strYL1 & ")"
                    Open arquivoLog For Append As #1
                    Print #1, "ProcessaBancoDados_Click-01;" & strSql
                    Close #1
                    Conn.Execute (strSql)
                Else
                    'Existe mais de um trecho de rede (linha) com o nó inicial sem a respectiva geometria associada
                    'Temos que ver se a coordenada inicial desta linha
                    Dim rsInitial2 As New ADODB.Recordset   'demais trechos de rede com o nó inicial, com exceção do trecho inicial já visto
                    'Procura pelos demais trechos de rede com OBJECT_ID do nó inicial com exceção do trecho já visto anteriormente
                    Set rsInitial2 = Conn.Execute("SELECT LINE_ID,OBJECT_ID_,INITIALCOMPONENT FROM WATERLINES WHERE INITIALCOMPONENT ='" & id_componente & "' AND OBJECT_ID_ <> '" & LINHA1 & "'")
                    If rsInitial2.EOF = False Then
                        'Caso encontre mais trechos de rede que chegam no nó sem geometria
                        LINHA2 = rsInitial2!Object_id_
                        'Obtem a coordenada inicial do trecho de rede encontrado
                        retorno = TeDatabase1.getPointOfLine(0, rsInitial2!Object_id_, 0, XL2, YL2)
                        
                        'verifica se esta coordenada coincide com a do outro trecho, pois deve ser a mesma, pois são os mesmos trechos de rede
                        If XL1 = XL2 And YL1 = YL2 Then
                            strXL1 = Replace(XL1, ",", ".") 'converte o valor double do XL1
                            strYL1 = Replace(YL1, ",", ".") 'converte o valor double do YL1
                            'Insere o nó na tabela de geometrias associada a WATERCOMPONENTS
                            strSql = "insert into points2 (object_id,x,y) values ('" & id_componente & "'," & strXL1 & "," & strYL1 & ")"
                            Open arquivoLog For Append As #1
                            Print #1, "ProcessaBancoDados_Click-02;" & strSql
                            Close #1
                            Conn.Execute (strSql)
                        Else
                            'MsgBox "Valores inconsistentes para a linha " & LINHA1 & " e linha " & LINHA2 & "." & Chr(13) & Chr(13) & "Não foi possivel corrigir automaticamente.", vbExclamation, ""
                            Open arquivoLog For Append As #1
                            Print #1, "ProcessaBancoDados_Click-03;Valores inconsistentes para a linha " & LINHA1 & " e linha " & LINHA2 & ". Não foi possivel corrigir automaticamente."
                            Close #1
                        End If
                    Else
                        'Não pode entrar aqui pois achou mais trechos de rede
                        MsgBox "Valores inconsistentes para a linha " & LINHA1 & "." & Chr(13) & Chr(13) & "Não foi possivel corrigir automaticamente.", vbExclamation, ""
                        Open arquivoLog For Append As #1
                        Print #1, "ProcessaBancoDados_Click-04;Valores inconsistentes para o trehco de rede (linha): " & LINHA1 & ". Não foi possivel corrigir automaticamente."
                        Close #1
                    End If
                End If
            End If
        Else
            'Agora analisamos o nó final
            'chegando a este ponto significa que o componente não é inicial de nenhuma linha
            'verificando se ele é final de alguma linha
            'verifica se o nó em questão é um nó final de algum trecho de redes em WATERLINES
            Call ProcuraSeEhNoFinal(id_componente, rsFinal)
            If rsFinal.EOF = False Then
                'chegando a este ponto significa que o componente é final de 1 ou mais linhas (trechos de rede)
                LINHA1 = rsFinal!Object_id_                                     'carrega em LINHA1 o id da linha que o componente é inicial
                retorno = TeDatabase1.getPointOfLine(0, LINHA1, 0, XL1, YL1)    'retorna em XL1 e YL1 as coordenadas iniciais da linha
                CONTALINHAS = 1                                                 'Inicializa o contador para uma linha associada
                rsFinal.MoveNext                                                'Vai para a próxima linha
                Do While Not rsFinal.EOF = True                                 'Enquanto existirem linhas com o nó final sem atributo de geometria
                    CONTALINHAS = CONTALINHAS + 1                               'Incrementa o contador de trechos existentes em que o nó final não possui atributo de geometria
                    rsFinal.MoveNext
                Loop
                If CONTALINHAS = 1 Then                                         'O PONTO ESTÁ CONECTADO A SOMENTE 1 LINHA
                    'Existe somente um trecho de rede (linha) com o nó final sem a respectiva geometria associada
                    strXL1 = Replace(XL1, ",", ".")                             'converte o valor double do XL1
                    strYL1 = Replace(YL1, ",", ".")                             'converte o valor double do YL1
                    'insere esta geometria de ponto que está faltando
                    strSql = "insert into points2 (object_id,x,y) values ('" & id_componente & "'," & XL1 & "," & YL1 & "')"
                    Open arquivoLog For Append As #1
                    Print #1, "ProcessaBancoDados_Click-05;" & strSql
                    Close #1
                    Conn.Execute (strSql)
                    Open arquivoLog For Append As #1
                    Print #1, "ProcessaBancoDados_Click-05;Foi inserida uma geometria na tabela POINTS2 referente a WATERCOMPONENTS com object_id: " & id_componente & ", que estava faltando, com sucesso!"
                    Close #1
                Else 'O PONTO ESTÁ CONECTADO A MAIS DE 1 LINHA
                    'Existe mais de um trecho de rede (linha) com o nó final sem a respectiva geometria associada
                    'Temos que ver se a coordenada final desta linha
                    Set rsFinal2 = Conn.Execute("SELECT LINE_ID,OBJECT_ID_,INITIALCOMPONENT FROM WATERLINES WHERE INITIALCOMPONENT ='" & id_componente & "' AND OBJECT_ID_ <> '" & LINHA1 & "'")
                    If rsFinal2.EOF = False Then
                        'Caso encontre mais trechos de rede que chegam no nó sem geometria
                        LINHA2 = rsFinal2!Object_id_
                        'Obtem a coordenada inicial do trecho de rede encontrado
                        retorno = TeDatabase1.getPointOfLine(0, rsFinal2!Object_id_, 0, XL2, YL2)
                        'verifica se esta coordenada coincide com a do outro trecho, pois deve ser a mesma, pois são os mesmos trechos de rede
                        If XL1 = XL2 And YL1 = YL2 Then
                            'Insere o nó na tabela de geometrias associada a WATERCOMPONENTS
                            strSql = "insert into points2 (object_id,x,y) values ('" & id_componente & "'," & XL1 & "," & YL1 & "')"
                            Open arquivoLog For Append As #1
                            Print #1, "ProcessaBancoDados_Click-06;" & strSql
                            Close #1
                            Conn.Execute (strSql)
                            Open arquivoLog For Append As #1
                            Print #1, "ProcessaBancoDados_Click-06;Foi inserida uma geometria na tabela POINTS2 referente a WATERCOMPONENTS com object_id: " & id_componente & ", que estava faltando, com sucesso!"
                            Close #1
                        Else
                            'MsgBox "Valores inconsistentes para a linha " & LINHA1 & " e linha " & LINHA2 & "." & Chr(13) & Chr(13) & "Não foi possivel corrigir automaticamente.", vbExclamation, ""
                            Open arquivoLog For Append As #1
                            Print #1, "ProcessaBancoDados_Click-07;Valores inconsistentes para a linha " & LINHA1 & " e linha " & LINHA2 & "." & Chr(13) & Chr(13) & "Não foi possivel corrigir automaticamente."
                            Close #1
                        End If
                    Else
                        'Não pode entrar aqui pois achou mais trechos de rede
                        'MsgBox "Valores inconsistentes para a linha " & LINHA1 & "." & Chr(13) & Chr(13) & "Não foi possivel corrigir automaticamente.", vbExclamation, ""
                        Open arquivoLog For Append As #1
                        Print #1, "ProcessaBancoDados_Click-08;Valores inconsistentes para a linha " & LINHA1 & "." & Chr(13) & Chr(13) & "Não foi possivel corrigir automaticamente."
                        Close #1
                    End If
                End If
            Else
               'chegando a este ponto significa que o componente não é inicial nem final de linhas
               strCMD = "DELETE FROM WATERCOMPONENTS WHERE OBJECT_ID_ ='" & id_componente & "'"
               Open arquivoLog For Append As #1
               Print #1, "ProcessaBancoDados_Click-09;" & strSql
               Close #1
               Conn.Execute (strCMD)
            End If
        End If
        rsSemPoints.MoveNext
    Loop
    Open arquivoLog For Append As #1
    Print #1, "ProcessaBancoDados_Click;Fim da investigação dos nós que possuem atributos mas não possuem geometrias"
    Close #1
    'Agora vamos verificar quais os nós que estão presentes na componente inicial (nó inicial) da tabela Waterlines, mas não existe como nó em Watercomponents
    Call ValidaComponentesIniciaisDeWaterlines(arquivoLog)
    
    'Agora vamos verificar quais os nós que estão presentes na componente final (nó final) da tabela Waterlines, mas não existe como nó em Watercomponents
    Call ValidaComponentesFinaisDeWaterlines(arquivoLog)
    
    rsSemPoints.Close
    dbConn.Close
    Set dbConn = Nothing
    Screen.MousePointer = vbDefault                     'Volta mouse ao normal
    Conn.Close                                          'Fecha a conexão com o banco de dados
    Open arquivoLog For Append As #1
    Print #1, vbCrLf & "ValidaBase;Fim do processamento do banco de dados GeoSan: " & DateValue(Now) & " - " & TimeValue(Now)
    Print #1, "ValidaBase;*************************************************************************************************"
    Close #1                                           'Fecha o arquivo de log do sistema
    MsgBox "Validação concluída. Verifique o log no arquivo " & arquivoLog

Trata_Erro:
    If Err.Number = 0 Or Err.Number = 20 Then
        Resume Next
    Else
        Screen.MousePointer = vbDefault
        PrintErro CStr(Me.Name), "ProcessaBancoDados_Click(), tipo de erro: " & tipoErro, CStr(Err.Number), CStr(Err.Description), True
    End If

End Sub