Ver Mensaje Individual
  #7
Antiguo 23 de agosto de 2017, 22:19
Kuk
Administrador
Última Actividad 19.09.2026 20:11
Posts Posts: 2.500
Likes enviados Enviados: 1037
Likes recibidos Recibidos: 1207

dmosca, he aquí la solución. El truco consiste en darle un ID ficticio a cada Nodo, y guardar ese ID ficticio del padre. Luego se lee por capas/niveles comprobando si hay hijos o no, y así hasta que ningún nodo del nivel tenga hijos.

Aquí va el código de cómo guardar la jerarquía:

Código COBOL:
  1.  ENVIRONMENT DIVISION.
  2.  INPUT-OUTPUT SECTION.
  3.  FILE-CONTROL.
  4.      
  5.      SELECT OPTIONAL TREE-FILE
  6.      ASSIGN TO "TREE.DB"
  7.      ORGANIZATION INDEXED
  8.      ACCESS MODE DYNAMIC
  9.      RECORD KEY  IS TRE-ID
  10.      FILE STATUS IS SW-FS.
  11.      
  12.  DATA DIVISION.
  13.  FILE SECTION.
  14.  
  15.  FD  TREE-FILE.
  16.  01  TRE-REC.
  17.      05  TRE-ID                         PIC S9(4) COMP-5.
  18.      05  TRE-ID-PADRE                   PIC S9(4) COMP-5.
  19.      05  TRE-NIVEL                      PIC S9(4) COMP-5.      
  20.      05  TRE-NODE    OBJECT REFERENCE POW-CNODE.
  21.      05  TRE-NODE-N REDEFINES TRE-NODE  PIC S9(9) COMP-5.
  22.      05  TRE-TEXT                       PIC X(50).
  23.      05  TRE-ImageIndex                 PIC S9(9) COMP-5.
  24.      05  TRE-SelectedImageIndex         PIC S9(9) COMP-5.
  25.      05  TRE-ExpandedImageIndex         PIC S9(9) COMP-5.
  26.  
  27.  WORKING-STORAGE SECTION.
  28.  01  SW-FS                              PIC X(2).
  29.      88  SW-FS-EOF                                VALUE "10".
  30.  
  31.  01  SV-NIVEL                           PIC S9(4) COMP-5.
  32.  01  SV-N                               PIC S9(4) COMP-5.
  33.  01  SV-COUNT                           PIC S9(4) COMP-5.
  34.  
  35.  01  IDX-MAX                            PIC S9(4) COMP-5.
  36.  01  IDX-1                              PIC S9(4) COMP-5.
  37.  01  IDX-2                              PIC S9(4) COMP-5.
  38.  01  IDX-3                              PIC S9(4) COMP-5.
  39.  
  40.  01  IDX-T                              PIC S9(4) COMP-5.
  41.  01  TBL-TREE.
  42.      05  TB-TREE OCCURS 0 TO 5000 TIMES DEPENDING ON IDX-T.
  43.          10  TB-ID                      PIC S9(4) COMP-5.
  44.          10  TB-ID-PADRE                PIC S9(4) COMP-5.
  45.          10  TB-NIVEL                   PIC S9(4) COMP-5.        
  46.          10  TB-NODE    OBJECT REFERENCE POW-CNODE.
  47.          10  TB-NODE-N REDEFINES TB-NODE PIC S9(9) COMP-5.
  48.          10  TB-TEXT                    PIC X(50).
  49.          10  TB-ImageIndex              PIC S9(9) COMP-5.
  50.          10  TB-SelectedImageIndex      PIC S9(9) COMP-5.
  51.          10  TB-ExpandedImageIndex      PIC S9(9) COMP-5.
  52.  
  53.  01  SW-CHILDS                          PIC X.
  54.      88  SW-CHILDS-SI                             VALUE "S".
  55.      88  SW-CHILDS-NO                             VALUE "N".
  56.  
  57.  PROCEDURE DIVISION.
  58.      
  59.      CALL "CBL_DELETE_FILE2" USING BY CONTENT "TREE.DB"
  60.      
  61.      OPEN I-O TREE-FILE
  62.      
  63.      MOVE ZEROS                  TO IDX-T
  64.      MOVE "Count" OF CmTreeView1 TO IDX-MAX
  65.      MOVE 1                      TO IDX-1, SV-NIVEL
  66.      
  67.      PERFORM UNTIL IDX-1 > IDX-MAX
  68.          ADD 1 TO IDX-T
  69.          
  70.          MOVE IDX-T                                  TO TB-ID(IDX-T)
  71.          MOVE ZEROS                                  TO TB-ID-PADRE(IDX-T)
  72.          MOVE SV-NIVEL                               TO TB-NIVEL(IDX-T)
  73.          MOVE "Root"(IDX-1) OF CmTreeView1           TO TB-NODE(IDX-T)
  74.          MOVE "Text"               OF TB-NODE(IDX-T) TO TB-TEXT(IDX-T)
  75.          MOVE "ImageIndex"         OF TB-NODE(IDX-T) TO TB-ImageIndex(IDX-T)
  76.          MOVE "SelectedImageIndex" OF TB-NODE(IDX-T) TO TB-SelectedImageIndex(IDX-T)
  77.          MOVE "ExpandedImageIndex" OF TB-NODE(IDX-T) TO TB-ExpandedImageIndex(IDX-T)
  78.          
  79.          PERFORM WRITE-TRE-REC        
  80.          
  81.          ADD 1 TO IDX-1
  82.      END-PERFORM
  83.      
  84.      SET SW-CHILDS-SI TO TRUE
  85.      
  86.      PERFORM UNTIL SW-CHILDS-NO
  87.          SET SW-CHILDS-NO TO TRUE
  88.          
  89.          MOVE 1     TO IDX-2
  90.          MOVE IDX-T TO SV-N
  91.          
  92.          PERFORM UNTIL IDX-2 > SV-N
  93.              IF  TB-NIVEL(IDX-2) = SV-NIVEL
  94.                  PERFORM CHILDS
  95.              END-IF
  96.              
  97.              ADD 1 TO IDX-2
  98.          END-PERFORM
  99.          
  100.          ADD 1 TO SV-NIVEL
  101.      END-PERFORM
  102.      
  103.      CLOSE TREE-FILE
  104.      
  105.      GOBACK
  106.      .    
  107.      
  108.  CHILDS.
  109.      
  110.      IF  "Count" OF TB-NODE(IDX-2) > 0
  111.          SET SW-CHILDS-SI TO TRUE
  112.          
  113.          MOVE 1                         TO IDX-3
  114.          MOVE "Count" OF TB-NODE(IDX-2) TO SV-COUNT
  115.          
  116.          PERFORM UNTIL IDX-3 > SV-COUNT
  117.              ADD 1 TO IDX-T
  118.              
  119.              MOVE IDX-T TO TB-ID(IDX-T)
  120.              MOVE IDX-2 TO TB-ID-PADRE(IDX-T)
  121.              
  122.              ADD 1 TO SV-NIVEL GIVING TB-NIVEL(IDX-T)
  123.              
  124.              MOVE "Child"(IDX-3)       OF TB-NODE(IDX-2) TO TB-NODE-N(IDX-T)
  125.              MOVE "Text"               OF TB-NODE(IDX-T) TO TB-TEXT(IDX-T)
  126.              MOVE "ImageIndex"         OF TB-NODE(IDX-T) TO TB-ImageIndex(IDX-T)
  127.              MOVE "SelectedImageIndex" OF TB-NODE(IDX-T) TO TB-SelectedImageIndex(IDX-T)
  128.              MOVE "ExpandedImageIndex" OF TB-NODE(IDX-T) TO TB-ExpandedImageIndex(IDX-T)
  129.          
  130.              PERFORM WRITE-TRE-REC        
  131.              
  132.              ADD 1 TO IDX-3
  133.          END-PERFORM
  134.      END-IF
  135.      .
  136.  
  137.  WRITE-TRE-REC.
  138.      
  139.      WRITE TRE-REC FROM TB-TREE(IDX-T)
  140.      
  141.      IF  SW-FS NOT = "00"
  142.          INVOKE POW-SELF "DisplayMessage" USING "Error" SW-FS 48
  143.          
  144.          CLOSE TREE-FILE
  145.          
  146.          GOBACK
  147.      END-IF
  148.      .

Y aquí el código de cómo cargar los datos en el TreeView:

Código COBOL:
  1.  ENVIRONMENT DIVISION.
  2.  INPUT-OUTPUT SECTION.
  3.  FILE-CONTROL.
  4.      
  5.      SELECT OPTIONAL TREE-FILE
  6.      ASSIGN TO "TREE.DB"
  7.      ORGANIZATION INDEXED
  8.      ACCESS MODE SEQUENTIAL
  9.      RECORD KEY  IS TRE-ID
  10.      FILE STATUS IS SW-FS.
  11.      
  12.  DATA DIVISION.
  13.  FILE SECTION.
  14.  
  15.  FD  TREE-FILE.
  16.  01  TRE-REC.
  17.      05  TRE-ID                         PIC S9(4) COMP-5.
  18.      05  TRE-ID-PADRE                   PIC S9(4) COMP-5.
  19.      05  TRE-NIVEL                      PIC S9(4) COMP-5.      
  20.      05  TRE-NODE    OBJECT REFERENCE POW-CNODE.
  21.      05  TRE-NODE-N REDEFINES TRE-NODE  PIC S9(9) COMP-5.
  22.      05  TRE-TEXT                       PIC X(50).
  23.      05  TRE-ImageIndex                 PIC S9(9) COMP-5.
  24.      05  TRE-SelectedImageIndex         PIC S9(9) COMP-5.
  25.      05  TRE-ExpandedImageIndex         PIC S9(9) COMP-5.
  26.  
  27.  WORKING-STORAGE SECTION.
  28.  01  SW-FS                              PIC X(2).
  29.  
  30.  01  IDX-A                              PIC S9(4) COMP-5.
  31.  01  IDX-NOD                            PIC S9(4) COMP-5.
  32.  
  33.  01  IDX-T                              PIC S9(4) COMP-5.
  34.  01  TBL-TREE.
  35.      05  TB-TREE OCCURS 0 TO 5000 TIMES DEPENDING ON IDX-T.                        
  36.          10  TB-NODE    OBJECT REFERENCE POW-CNODE.
  37.          10  TB-NODE-N REDEFINES TB-NODE PIC S9(9) COMP-5.          
  38.  
  39.  01  swEof                      PIC X.
  40.      88  swEof-SI                     VALUE "S".
  41.      88  swEof-NO                     VALUE "N".
  42.  
  43.  01  CNT-READ                   PIC S9(4) COMP-5.
  44.  PROCEDURE DIVISION.
  45.      
  46.      INVOKE CmTreeView1 "Clear"
  47.      
  48.      SET swEof-NO TO TRUE
  49.        
  50.      OPEN INPUT TREE-FILE    
  51.      
  52.      IF  SW-FS NOT = "00"
  53.          INVOKE POW-SELF "DisplayMessage" USING "Error OPEN" SW-FS 48
  54.      END-IF
  55.      
  56.      PERFORM READ-FILE
  57.      
  58.      MOVE ZEROS TO IDX-T
  59.      
  60.      PERFORM UNTIL swEof-SI
  61.          IF  TRE-ID-PADRE = ZEROS
  62.              ADD 1 TO IDX-T
  63.              
  64.              INVOKE CmTreeView1 "Add" USING TRE-TEXT RETURNING IDX-NOD
  65.                  
  66.              MOVE "Root"(IDX-NOD) OF CmTreeView1 TO TB-NODE(IDX-T)
  67.              
  68.              PERFORM ICONOS            
  69.          
  70.          ELSE
  71.              ADD 1 TO IDX-T
  72.              
  73.              INVOKE TB-NODE(TRE-ID-PADRE) "Add" USING TRE-TEXT RETURNING IDX-NOD
  74.              
  75.              MOVE "Child"(IDX-NOD) OF TB-NODE(TRE-ID-PADRE) TO TB-NODE(IDX-T)  
  76.              MOVE POW-TRUE TO "Expanded" OF TB-NODE(TRE-ID-PADRE)
  77.              
  78.              PERFORM ICONOS          
  79.          END-IF
  80.          
  81.          PERFORM READ-FILE
  82.      END-PERFORM
  83.      
  84.      CLOSE TREE-FILE
  85.      
  86.      IF  SW-FS NOT = "00"
  87.          INVOKE POW-SELF "DisplayMessage" USING "Error CLOSE" SW-FS 48
  88.      END-IF
  89.      
  90.      GOBACK
  91.      .
  92.      
  93.  READ-FILE.
  94.      
  95.      READ TREE-FILE
  96.      
  97.      IF  SW-FS = "00"
  98.          CONTINUE
  99.          
  100.      ELSE
  101.          IF  SW-FS = "10"
  102.              SET swEof-SI TO TRUE
  103.              
  104.          ELSE
  105.              INVOKE POW-SELF "DisplayMessage" USING "Error" SW-FS 48
  106.              
  107.              GOBACK
  108.          END-IF
  109.      END-IF        
  110.      .
  111.      
  112.  ICONOS.
  113.      
  114.      MOVE TRE-ImageIndex          TO "ImageIndex"         OF TB-Node(IDX-T)
  115.      MOVE TRE-SelectedImageIndex  TO "SelectedImageIndex" OF TB-Node(IDX-T)
  116.      MOVE TRE-ExpandedImageIndex  TO "ExpandedImageIndex" OF TB-Node(IDX-T)
  117.      .            

Adjunto proyecto de ejemplo. El código no está optimizado, no tengo tiempo, se puede sacar fuera código repetido, pero bueno, la idea está ahí y funciona.
Archivos Adjuntos
Tipo de Archivo: rar TREEVIEW.rar (35,8 KB)Descargas: 132



NORMAS DEL FORO - para garantizar el buen funcionamiento del Foro.
¿Te han ayudado? NO TE OLVIDES de darle a
¿Quieres dirigirte a alguien en tu post? Notifícale haciendo clic en su Nick
Kuk is offline   Responder Con Cita