Ayuda 3 Combobox Anidados * URGENTE ??

Ayuda 3 Combobox Anidados * URGENTE ??

Postby remtec » Tue Sep 06, 2022 3:38 pm

Hola Amigos.

Tengo una necesidad urgente de poder implementar un requerimiento, sobre el uso de Combobox.

Maestro Antonio, me presento un código para manejar 2 combobox, el cual amablemente Francisco Alegría adapto a mi necesidad y quedo funcionando muy bien.

Este se trata que al seleccionar una Ciudad en su Array, filtra y muestra en el array de comunas, solo las que pertenecen, pero ahora debo agregar un 3er array, que contiene los sectores de cada comuna y que debe ser filtrado según la comuna seleccionada, final mente obtendría para una ciudad, todas las comunas y para cada comuna todos sus sectores.

Muy agradecido de Francisco por haber modificado este codigo.

Espero haber expuesto bien mi requerimiento.

Muchos saludos.
Antonio

Código Funcional para 2 Combobox anidados:
Code: Select all  Expand view

function Prue_Combo()
   local oDlg, cCiudad, cComuna, oComuna
   local aCiudades, aComunas, aArr

   aArr := CrearArrays2()

   aCiudades := aArr[1]
   aComunas  := aArr[2]


   cCiudad := aCiudades[1]
   cComuna := aComunas[1,1]

   DEFINE DIALOG oDlg FROM 1,1 TO 300, 600 PIXEL TITLE "Seleccione Ciudad y Comuna"

   @ 20, 10 COMBOBOX cCiudad ITEMS aCiudades SIZE 130,200 PIXEL OF oDlg ;
            ON CHANGE ( oComuna:SetItems( aComunas[ AScan( aCiudades, cCiudad ) ] ), oComuna:Set( oComuna:aItems[ 1 ] ) )

   @ 20,160 COMBOBOX oComuna VAR cComuna ITEMS aComunas[ 1 ] SIZE 130,200 PIXEL OF oDlg

   @ 100,(300/2)-(100/2) BUTTON "Mostrar seleccionado" SIZE 100, 20 PIXEL OF oDlg ;
            ACTION MsgInfo( cCiudad, cComuna )

   ACTIVATE DIALOG oDlg CENTERED

return nil

Function CrearArrays2()
   local aArray1 := {}, aArray2 := {}, aItems := {}, nVar, n
   local aCiudades:={ { 1,'ARICA'},;
                { 2,'PARINACOTA'},;
                { 3,'IQUIQUE'},;
                { 4,'TAMARUGAL'},;
                { 5,'ANTOFAGASTA'},;
                { 49,'SANTIAGO'},;
                { 54,'TALAGANTE'} }

   local aComunas:= { { 1,'ARICA'},;
                        { 1,'CAMARONES'},;
                        { 2,'PUTRE'},;
                        { 2,'GENERAL LAGOS'},;
                        { 3,'IQUIQUE'},;
                        { 3,'ALTO HOSPICIO'},;
                        { 4,'POZO ALMONTE'},;
                        { 4,'CAMIÑA'},;
                        { 4,'COLCHANE'},;
                        { 4,'HUARA'},;
                        { 4,'PICA'},;
                        { 5,'ANTOFAGASTA'},;
                        { 5,'MEJILLONES'},;
                        { 5,'SIERRA GORDA'},;
                        { 5,'TALTAL'} }

   local aSector= { { 1,1,'CERRO'},;
                        { 1,2,'COSTA'},;
                        { 2,1,'CENTRO'},;
                        { 2,2,'COSTA SUR'},;
                        { 3,1,'VALLE'},;
                        { 3,2,'ALTO PIREN'},;
                        { 4,1,'ALTO BLANCO'},;
                        { 4,2,'VALLE VERDE'},;
                        { 4,3,'RIO MAIPO'},;
                        { 4,4,'ALTO JAHUEL'},;
                        { 4,5,'SAN JORGE'},;
                        { 5,1,'SAN LEON'},;
                        { 5,2,'CERRILLOS'},;
                        { 5,3,'SAN ADOLFO'},;
                        { 5,4,'EL MONTE'} }




  For n := 1 To Len(aCiudades)
      aadd(aArray1, aCiudades[n,2])
      nVar := aCiudades[n,1]
      aItems := {}
      AEval( aComunas, {|a| if(a[1] == nVar, aadd(aItems, a[2]),) } )
      if( len(aItems) = 0, aadd(aItems,"Sin Valor"), nil )
      aadd(aArray2, aItems)
  Next

  SysRefresh()

Return { aArray1, aArray2 }

 
Last edited by remtec on Wed Sep 07, 2022 1:29 pm, edited 1 time in total.
FWH 22.10 - HARBOUR - PELLES C
remtec
 
Posts: 719
Joined: Fri May 12, 2017 2:50 pm

Re: Ayuda Urgente con Combobox Anidados ??

Postby remtec » Wed Sep 07, 2022 12:22 am

Amigos.

Alguna posibilidad?

Saludos

Antonio
FWH 22.10 - HARBOUR - PELLES C
remtec
 
Posts: 719
Joined: Fri May 12, 2017 2:50 pm

Re: Ayuda Urgente con Combobox Anidados ??

Postby cmsoft » Wed Sep 07, 2022 3:08 am

Acá te dejo el ejemplo, prueba y comenta.
Code: Select all  Expand view

#include "fivewin.ch"
function Prue_Combo()
   local oDlg, cCiudad, cComuna, oComuna
   local aCiudades, aComunas, aArr, nZ1, nZ2, encon,i, nZona

   aArr := CrearArrays2()

   aCiudades := aArr[1]
   aComunas  := aArr[2]


  // cCiudad := aCiudades[1]          <----- Aqui siempre se ubica en el primer registro
  // cComuna := aComunas[1,1]         <----- Aqui siempre se ubica en el primer registro

   cCiudad := 'TAMARUGAL'              // <----- Aqui le asigno un valor cualquier, donde quiero que se ubique
   cComuna := 'COLCHANE'          // <----- Aqui le asigno un valor cualquier, donde quiero que se ubique


****** Aqui aplico tu rutina para ubicar la Comuna y lo hace muy bien

nZ1:=0
nZ2:=0
encon:=.F.
FOR i := 1 to len(aComunas)
     nZona := ascan(aComunas[i],Trim(cComuna))
     IF nZona > 0
        encon := .T.
        //MsgInfo("La posicion es " + str(i)+ ","+ str(nZona))
        nZ1:=i
        nZ2:=nZona
     ENDIF
NEXT i
IF !encon
    MsgInfo("No lo encontro")
ENDIF

// El Proble que nunca se ubica el la comuna seleccionada en el combobox, siempre lo hace en el primer elemento



   DEFINE DIALOG oDlg FROM 1,1 TO 300, 600 PIXEL TITLE "Seleccione Ciudad y Comuna"

   @ 20, 10 COMBOBOX cCiudad ITEMS aCiudades SIZE 130,200 PIXEL OF oDlg ;
            ON CHANGE ( oComuna:SetItems( aComunas[ AScan( aCiudades, cCiudad ) ] ), oComuna:Set( oComuna:aItems[ 1 ] ) )

   @ 20,160 COMBOBOX oComuna VAR cComuna ITEMS aComunas[ 1 ] SIZE 130,200 PIXEL OF oDlg                   // <------- Aqui necedito que se muestre al ingresar la comuna seleccionada
   
   @ 100,(300/2)-(100/2) BUTTON "Mostrar seleccionado" SIZE 100, 20 PIXEL OF oDlg ;
            ACTION MsgInfo( cCiudad, cComuna )
 
   ACTIVATE DIALOG oDlg CENTERED ON INIT (oComuna:SetItems( aComunas[ nZ1] ), oComuna:Set( nZ2 ))   //<- Creo que te faltaba esto

return nil

Function CrearArrays2()
   local aArray1 := {}, aArray2 := {}, aItems := {}, nVar, n
   local aCiudades:={ { 1,'ARICA'},;
                { 2,'PARINACOTA'},;
                { 3,'IQUIQUE'},;
                { 4,'TAMARUGAL'},;
                { 5,'ANTOFAGASTA'},;
                { 49,'SANTIAGO'},;
                { 54,'TALAGANTE'} }

   local aComunas:= { { 1,'ARICA'},;
                { 1,'CAMARONES'},;
                { 2,'PUTRE'},;
                { 2,'GENERAL LAGOS'},;
                { 3,'IQUIQUE'},;
                { 3,'ALTO HOSPICIO'},;
                { 4,'POZO ALMONTE'},;
                { 4,'CAMIÑA'},;
                { 4,'COLCHANE'},;
                { 4,'HUARA'},;
                { 4,'PICA'},;
                { 5,'ANTOFAGASTA'},;
                { 5,'MEJILLONES'},;
                { 5,'SIERRA GORDA'},;
                { 5,'TALTAL'} }


// Aquí se generan los nuevos Array para hacer los filtro del combobox


  For n := 1 To Len(aCiudades)
      aadd(aArray1, aCiudades[n,2])
      nVar := aCiudades[n,1]
      aItems := {}
      AEval( aComunas, {|a| if(a[1] == nVar, aadd(aItems, a[2]),) } )
      if( len(aItems) = 0, aadd(aItems,"Sin Valor"), nil )
      aadd(aArray2, aItems)
  Next

  SysRefresh()

Return { aArray1, aArray2 }
 
User avatar
cmsoft
 
Posts: 1290
Joined: Wed Nov 16, 2005 9:14 pm
Location: Mercedes - Bs As. Argentina

Re: Ayuda Urgente con Combobox Anidados ??

Postby remtec » Wed Sep 07, 2022 3:34 am

cmsoft wrote:Acá te dejo el ejemplo, prueba y comenta.
Code: Select all  Expand view

#include "fivewin.ch"
function Prue_Combo()
   local oDlg, cCiudad, cComuna, oComuna
   local aCiudades, aComunas, aArr, nZ1, nZ2, encon,i, nZona

   aArr := CrearArrays2()

   aCiudades := aArr[1]
   aComunas  := aArr[2]


  // cCiudad := aCiudades[1]          <----- Aqui siempre se ubica en el primer registro
  // cComuna := aComunas[1,1]         <----- Aqui siempre se ubica en el primer registro

   cCiudad := 'TAMARUGAL'              // <----- Aqui le asigno un valor cualquier, donde quiero que se ubique
   cComuna := 'COLCHANE'          // <----- Aqui le asigno un valor cualquier, donde quiero que se ubique


****** Aqui aplico tu rutina para ubicar la Comuna y lo hace muy bien

nZ1:=0
nZ2:=0
encon:=.F.
FOR i := 1 to len(aComunas)
     nZona := ascan(aComunas[i],Trim(cComuna))
     IF nZona > 0
        encon := .T.
        //MsgInfo("La posicion es " + str(i)+ ","+ str(nZona))
        nZ1:=i
        nZ2:=nZona
     ENDIF
NEXT i
IF !encon
    MsgInfo("No lo encontro")
ENDIF

// El Proble que nunca se ubica el la comuna seleccionada en el combobox, siempre lo hace en el primer elemento



   DEFINE DIALOG oDlg FROM 1,1 TO 300, 600 PIXEL TITLE "Seleccione Ciudad y Comuna"

   @ 20, 10 COMBOBOX cCiudad ITEMS aCiudades SIZE 130,200 PIXEL OF oDlg ;
            ON CHANGE ( oComuna:SetItems( aComunas[ AScan( aCiudades, cCiudad ) ] ), oComuna:Set( oComuna:aItems[ 1 ] ) )

   @ 20,160 COMBOBOX oComuna VAR cComuna ITEMS aComunas[ 1 ] SIZE 130,200 PIXEL OF oDlg                   // <------- Aqui necedito que se muestre al ingresar la comuna seleccionada
   
   @ 100,(300/2)-(100/2) BUTTON "Mostrar seleccionado" SIZE 100, 20 PIXEL OF oDlg ;
            ACTION MsgInfo( cCiudad, cComuna )
 
   ACTIVATE DIALOG oDlg CENTERED ON INIT (oComuna:SetItems( aComunas[ nZ1] ), oComuna:Set( nZ2 ))   //<- Creo que te faltaba esto

return nil

Function CrearArrays2()
   local aArray1 := {}, aArray2 := {}, aItems := {}, nVar, n
   local aCiudades:={ { 1,'ARICA'},;
                { 2,'PARINACOTA'},;
                { 3,'IQUIQUE'},;
                { 4,'TAMARUGAL'},;
                { 5,'ANTOFAGASTA'},;
                { 49,'SANTIAGO'},;
                { 54,'TALAGANTE'} }

   local aComunas:= { { 1,'ARICA'},;
                { 1,'CAMARONES'},;
                { 2,'PUTRE'},;
                { 2,'GENERAL LAGOS'},;
                { 3,'IQUIQUE'},;
                { 3,'ALTO HOSPICIO'},;
                { 4,'POZO ALMONTE'},;
                { 4,'CAMIÑA'},;
                { 4,'COLCHANE'},;
                { 4,'HUARA'},;
                { 4,'PICA'},;
                { 5,'ANTOFAGASTA'},;
                { 5,'MEJILLONES'},;
                { 5,'SIERRA GORDA'},;
                { 5,'TALTAL'} }


// Aquí se generan los nuevos Array para hacer los filtro del combobox


  For n := 1 To Len(aCiudades)
      aadd(aArray1, aCiudades[n,2])
      nVar := aCiudades[n,1]
      aItems := {}
      AEval( aComunas, {|a| if(a[1] == nVar, aadd(aItems, a[2]),) } )
      if( len(aItems) = 0, aadd(aItems,"Sin Valor"), nil )
      aadd(aArray2, aItems)
  Next

  SysRefresh()

Return { aArray1, aArray2 }
 



Amigo Cesar.

Mil disculpas por haberte molestado.

Como siempre, eres un Maestro, pero en esta publicación, me encuentro solicitando un tercer combobox anidado.

El código que me has entregado funciono perfecto, pero es otro requerimiento que te realice en tu correo privado, de poder modificar sobre los combobox ya grabados.

Me alegro mucho que lo hayas publicados para nuestros colegas que lo puedan nececitar.


Infinitas gracias.

Muchos Saludos.

Antonio
FWH 22.10 - HARBOUR - PELLES C
remtec
 
Posts: 719
Joined: Fri May 12, 2017 2:50 pm

Re: Ayuda 3 Combobox Anidados * URGENTE ??

Postby remtec » Wed Sep 07, 2022 3:14 pm

Amigos Buen dia

Alguna idea de como anidar 3 combobox, codigo funcionando Ciudad y Comuna, falta agregar sectores que depende de Comunas??

Saludos

Antonio
FWH 22.10 - HARBOUR - PELLES C
remtec
 
Posts: 719
Joined: Fri May 12, 2017 2:50 pm

Re: Ayuda 3 Combobox Anidados * URGENTE ??

Postby Antonio Linares » Wed Sep 07, 2022 4:14 pm

Antonio,

Aplicando la misma lógica que usamos en el primer combo para que se rellene el segundo, podrias extenderlo al segundo para que se rellene el tercero.

No lo he probado, pero diria que es el camino a seguir
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42099
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Ayuda 3 Combobox Anidados * URGENTE ??

Postby remtec » Wed Sep 07, 2022 4:41 pm

Buen dia Maestro Antonio.

Muchas gracias por responder.

Es lo que he tratado de hacer, pero no me ha resultado, ya llevo 2 dias y no doy con la solucion, continuare intentando, claro que entre mas intentos mas me nublo.

Muchos saludos

Antonio.
FWH 22.10 - HARBOUR - PELLES C
remtec
 
Posts: 719
Joined: Fri May 12, 2017 2:50 pm

Re: Ayuda 3 Combobox Anidados * URGENTE ??

Postby Antonio Linares » Wed Sep 07, 2022 5:49 pm

Aqui tienes una primera versión, cuya lógica aun no es correcta, pero te puede servir de arranque :-)

Depende de como quieras organizar las provincias, las ciudades y los barrios. Segun como ordenes los arrays asi habrá
que cambiar el código.

Code: Select all  Expand view
#include "FiveWin.ch"

function Main()

   local oDlg, cProvincia := "Almeria", oCiudades, cCiudad := "Uno"
   local cBarrio := "aaa", oBarrios
   local aProvincias := { "Almeria", "Cadiz", "Cordoba", "Granada", "Huelva", "Jaen", "Malaga", "Sevilla" }
   local aCiudades := { { "Uno", "Dos", "Tres" }, { "Cuatro", "Cinco", "Seis" }, { "Siete", "Ocho", "Nueve" } }
   local aBarrios := { { "aaa", "bbb", "ccc" }, { "ddd", "eee", "fff" }, { "ggg", "hhh", "iii" } }

   DEFINE DIALOG oDlg TITLE "Seleccione provincia, ciudad y barrio" SIZE 500, 200

   @ 1,  3 COMBOBOX cProvincia ITEMS aProvincias ;
      ON CHANGE ( oCiudades:SetItems( aCiudades[ AScan( aProvincias, cProvincia ) ] ), oCiudades:Set( oCiudades:aItems[ 1 ] ) )

   @ 1, 12 COMBOBOX oCiudades VAR cCiudad ITEMS aCiudades[ 1 ] ;
      ON CHANGE ( oBarrios:SetItems( GetBarrios( aCiudades, cCiudad, aBarrios ) ), oBarrios:Set( oBarrios:aItems[ 1 ] ) )  

   @ 1, 21 COMBOBOX oBarrios VAR cBarrio ITEMS aBarrios[ 1 ]

   @ 3, 10 BUTTON "Mostrar seleccionado" ACTION MsgInfo( cProvincia, cCiudad + "," + cBarrio )

   ACTIVATE DIALOG oDlg CENTERED

return nil

function GetBarrios( aCiudades, cCiudad, aBarrios )

   local n, nAt

   for n = 1 to Len( aCiudades )
      if ( nAt := AScan( aCiudades[ n ], cCiudad ) ) != 0
         return aBarrios[ nAt ]
      endif
   next
   
return ""  
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42099
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Ayuda 3 Combobox Anidados * URGENTE ??

Postby Antonio Linares » Wed Sep 07, 2022 5:59 pm

Imagino que la forma correcta de organizar los datos seria asi:

local aProvincias := { "Almeria", "Cadiz", "Cordoba", "Granada", "Huelva", "Jaen", "Malaga", "Sevilla" }
local aCiudades := { { "Uno", "Dos", "Tres" }, { "Cuatro", "Cinco", "Seis" }, { "Siete", "Ocho", "Nueve" } }
local aBarrios := { { { "aaa", "bbb", "ccc" }, { "ddd", "eee", "fff" }, { "ggg", "hhh", "iii" } },;
{ { "jjj", "kkk", "lll" }, { "mmm", "nnn", "ooo" }, { "ppp"; "qqq", "rrr" } },;
{ { "sss", "ttt", "uuu" }, { "vvv", "www", "xxx" }, { "yyy", "zzz" } } }

luego la ciudad "Uno" tiene los barrios { "aaa", "bbb", "ccc" }
la ciudad "Dos" tiene los barrios { "ddd", "eee", "fff" }
etc...

Segun como quieras organizar los datos, asi tiene que cambiar el código para encontrar la provincia, ciudad y barrio
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42099
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Ayuda 3 Combobox Anidados * URGENTE ??

Postby remtec » Wed Sep 07, 2022 11:40 pm

Maestro Antonio

Muy amable, muchas gracias por su ayuda.

Estoy intentando encontrar el porque se cae después de algunas selecciones, es aleatorio, en la primera selección de ciudad, o en otras de los combobox.

Seguiré a ver si logro encontrar el origen.


Muchas gracias

Antonio.

Error:
Code: Select all  Expand view

Application
===========
   Path and name: C:\Desa\Clarp Estetica\Clarp.exe (32 bits)
   Size: 7,357,440 bytes
   Compiler version: Harbour 3.2.0dev (r2008190002)
   FiveWin  version: FWH 22.03
   C compiler version: Borland/Embarcadero C++ 7.0 (32-bit)
   Windows version: 6.2, Build 9200

   Time from start: 0 hours 0 mins 12 secs
   Error occurred at: 07/09/2022, 20:37:02
   Error description: Error BASE/1132  Error de rango: acceso al array
   Args:
     [   1] = A   {{"      ","Uno","Dos","Tres"},{"      ","Cuatro","Cinco","Seis"},{"      ","Siete","Ocho","Nueve"}} length: 3
     [   2] = N   5

Stack Calls
===========
   Called from: .\Clarp.PRG => (b)COMBOBOX3( 565 )
   Called from: .\source\classes\COMBOBOX.PRG => TCOMBOBOX:CHANGE( 581 )
   Called from: .\source\classes\CONTROL.PRG => TCONTROL:HANDLEEVENT( 1824 )
   Called from: .\source\classes\COMBOBOX.PRG => TCOMBOBOX:HANDLEEVENT( 923 )
   Called from: .\source\classes\WINDOW.PRG => _FWH( 3560 )
   Called from:  => SENDMESSAGE( 0 )
   Called from: .\source\classes\DIALOG.PRG => TDIALOG:COMMAND( 453 )
   Called from:  => TWINDOW:HANDLEEVENT( 0 )
   Called from: .\source\classes\DIALOG.PRG => TDIALOG:HANDLEEVENT( 1140 )
   Called from:  => DIALOGBOXINDIRECT( 0 )
   Called from: .\source\classes\DIALOG.PRG => TDIALOG:ACTIVATE( 304 )
   Called from: .\Clarp.PRG => COMBOBOX3( 574 )
   Called from: .\Clarp.PRG => (b)MAIN( 111 )
   Called from: .\source\classes\BTNBMP.PRG => TBTNBMP:CLICK( 713 )
   Called from: .\source\classes\BTNBMP.PRG => TBTNBMP:LBUTTONUP( 999 )
   Called from: .\source\classes\CONTROL.PRG => TCONTROL:HANDLEEVENT( 1845 )
   Called from: .\source\classes\BTNBMP.PRG => TBTNBMP:HANDLEEVENT( 2051 )
   Called from: .\source\classes\WINDOW.PRG => _FWH( 3560 )
   Called from:  => WINRUN( 0 )
 
FWH 22.10 - HARBOUR - PELLES C
remtec
 
Posts: 719
Joined: Fri May 12, 2017 2:50 pm

Re: Ayuda 3 Combobox Anidados * URGENTE ??

Postby Antonio Linares » Thu Sep 08, 2022 4:57 am

La razón es simple:

Estas intentando acceder al elemento quinto de un array que tiene solo tres elementos:

[ 1] = A {{" ","Uno","Dos","Tres"},{" ","Cuatro","Cinco","Seis"},{" ","Siete","Ocho","Nueve"}} length: 3
[ 2] = N 5
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42099
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Ayuda 3 Combobox Anidados * URGENTE ??

Postby Cgallegoa » Fri Sep 09, 2022 2:51 am

Otra forma, enredado pero funcional :D

Code: Select all  Expand view
#include "fivewin.ch"


STATIC lInicia := .T.

Function Inicio()
   LOCAL oDlg, oCiudades, oComunas, oSectores, aCiudCbx := {}, aComunCbx := {}, aSectCbx := {}
   LOCAL cCiudad, cComuna, cSector, nPos := 0
   LOCAL aCiudades := {{"1","Ciudad Uno"},;
                       {"2","Ciudad Dos"},;
                       {"3","Ciudad Tres"} }
   
   LOCAL aComunas  := {{"1.1","Comuna Uno Ciud.Uno"},;
                       {"1.2","Comuna Dos Ciud.Uno"},;
                       {"1.3","Comuna Tres Ciud.Uno"},;
                       {"2.1","Comuna Uno Ciud.Dos"},;
                       {"2.2","Comuna Dos Ciud.Dos"},;
                       {"2.3","Comuna Tres Ciud.Dos"},;
                       {"3.1","Comuna Uno Ciud.Tres"},;
                       {"3.2","Comuna Dos Ciud.Tres"} }
   
   LOCAL aSectores := {{"1.1.1","Sector 1 Com.1.1"},;
                       {"1.1.2","Sector 2 Com.1.1"},;
                       {"1.1.3","Sector 3 Com.1.1"},;
                       {"1.1.4","Sector 4 Com.1.1"},;
                       {"1.2.1","Sector 1 Com.1.2"},;
                       {"1.2.2","Sector 2 Com.1.2"},;
                       {"1.2.3","Sector 3 Com.1.2"},;
                       {"1.2.4","Sector 4 Com.1.2"},;
                       {"1.2.5","Sector 5 Com.1.2"},;
                       {"1.3.1","Sector 1 Com.1.3"},;
                       {"1.3.2","Sector 2 Com.1.3"},;
                       {"1.3.3","Sector 3 Com.1.3"},;
                       {"2.1.1","Sector 1 Com.2.1"},;
                       {"2.1.2","Sector 2 Com.2.1"},;
                       {"2.2.1","Sector 1 Com.2.2"},;
                       {"2.2.2","Sector 2 Com.2.2"},;
                       {"2.3.1","Sector 1 Com.2.3"},;
                       {"3.1.1","Sector 1 Com.3.1"},;
                       {"3.1.2","Sector 2 Com.3.1"},;
                       {"3.2.1","Sector 1 Com.3.2"},;
                       {"3.2.2","Sector 2 Com.3.2"},;
                       {"3.2.3","Sector 3 Com.3.2"} }
   
   AEVAL(aCiudades,{|aReg| AADD(aCiudCbx,aReg[2])})
   cCiudad := aCiudCbx[1]
   
   aComunCbx := CargaComuna(aCiudades[1,1],aComunas)
   cComuna := aComunCbx[1]
   
   aSectCbx := CargaSector(aComunas[1,1],aSectores)
   cSector := aSectCbx[1]
   
   DEFINE DIALOG oDlg SIZE 600,300 TITLE "Nested Combobox" TRUEPIXEL
   
        @ 10, 10 COMBOBOX oCiudades VAR cCiudad ITEMS aCiudCbx  OF oDlg PIXEL SIZE 150,10
           oCiudades:bChange := {|| nPos := ASCAN(aCiudades,{|x|x[2]=cCiudad } ) ,;
                                    CargaComuna(aCiudades[nPos,1], aComunas, oComunas, @cComuna) ,;
                                    CargaSector(aComunas[nPos,1], aSectores, oSectores, @cSector)}
   
        @ 10,190 COMBOBOX oComunas  VAR cComuna ITEMS aComunCbx OF oDlg PIXEL SIZE 150,10
           oComunas:bChange  := {|| nPos := ASCAN(aComunas,{|x|x[2]=cComuna } ) ,;
                                    CargaSector(aComunas[nPos,1], aSectores, oSectores, @cSector) }
   
        @ 10,370 COMBOBOX oSectores VAR cSector ITEMS aSectCbx  OF oDlg PIXEL SIZE 150,10
   
   ACTIVATE DIALOG oDlg CENTERED // ON PAINT (oCiudades:Open(),oComunas:Open(),oSectores:Open())
   
Return(NIL)
//---------------------------------------------------------------//

Function CargaComuna(cCiudad, aComunas, oComunas, cComuna)
   LOCAL aResp := {}, cResp
   FOR EACH cResp IN aComunas
       if SubStr(cResp[1],1,1) == cCiudad
          AADD(aResp,cResp[2])
       endif
   next
   IF !lInicia
      oComunas:SetItems(aResp,.F.)
      cComuna := aResp[1]
      oComunas:Refresh()
   endif
Return(aResp)
//---------------------------------------------------------------//

Function CargaSector(cComuna, aSectores, oSectores, cSector)
   LOCAL aResp := {}, cResp
   FOR EACH cResp IN aSectores
       if SubStr(cResp[1],1,3) == cComuna
          AADD(aResp,cResp[2])
       endif
   next
   IF !lInicia
      oSectores:SetItems(aResp,.F.)
      cSector := aResp[1]
      oSectores:Refresh()
   endif
   lInicia := .F.
Return(aResp)
//---------------------------------------------------------------//

 
Saludos,

Carlos Gallego

*** FWH-24.07, xHarbour 1.3.1 Build 20240624, Borland C++7.70, PellesC ***
Cgallegoa
 
Posts: 492
Joined: Sun Oct 16, 2005 3:32 am
Location: Quito - Ecuador

Re: Ayuda 3 Combobox Anidados * URGENTE ??

Postby remtec » Fri Sep 09, 2022 3:20 am

Cgallegoa wrote:Otra forma, enredado pero funcional :D

Code: Select all  Expand view
#include "fivewin.ch"


STATIC lInicia := .T.

Function Inicio()
   LOCAL oDlg, oCiudades, oComunas, oSectores, aCiudCbx := {}, aComunCbx := {}, aSectCbx := {}
   LOCAL cCiudad, cComuna, cSector, nPos := 0
   LOCAL aCiudades := {{"1","Ciudad Uno"},;
                       {"2","Ciudad Dos"},;
                       {"3","Ciudad Tres"} }
   
   LOCAL aComunas  := {{"1.1","Comuna Uno Ciud.Uno"},;
                       {"1.2","Comuna Dos Ciud.Uno"},;
                       {"1.3","Comuna Tres Ciud.Uno"},;
                       {"2.1","Comuna Uno Ciud.Dos"},;
                       {"2.2","Comuna Dos Ciud.Dos"},;
                       {"2.3","Comuna Tres Ciud.Dos"},;
                       {"3.1","Comuna Uno Ciud.Tres"},;
                       {"3.2","Comuna Dos Ciud.Tres"} }
   
   LOCAL aSectores := {{"1.1.1","Sector 1 Com.1.1"},;
                       {"1.1.2","Sector 2 Com.1.1"},;
                       {"1.1.3","Sector 3 Com.1.1"},;
                       {"1.1.4","Sector 4 Com.1.1"},;
                       {"1.2.1","Sector 1 Com.1.2"},;
                       {"1.2.2","Sector 2 Com.1.2"},;
                       {"1.2.3","Sector 3 Com.1.2"},;
                       {"1.2.4","Sector 4 Com.1.2"},;
                       {"1.2.5","Sector 5 Com.1.2"},;
                       {"1.3.1","Sector 1 Com.1.3"},;
                       {"1.3.2","Sector 2 Com.1.3"},;
                       {"1.3.3","Sector 3 Com.1.3"},;
                       {"2.1.1","Sector 1 Com.2.1"},;
                       {"2.1.2","Sector 2 Com.2.1"},;
                       {"2.2.1","Sector 1 Com.2.2"},;
                       {"2.2.2","Sector 2 Com.2.2"},;
                       {"2.3.1","Sector 1 Com.2.3"},;
                       {"3.1.1","Sector 1 Com.3.1"},;
                       {"3.1.2","Sector 2 Com.3.1"},;
                       {"3.2.1","Sector 1 Com.3.2"},;
                       {"3.2.2","Sector 2 Com.3.2"},;
                       {"3.2.3","Sector 3 Com.3.2"} }
   
   AEVAL(aCiudades,{|aReg| AADD(aCiudCbx,aReg[2])})
   cCiudad := aCiudCbx[1]
   
   aComunCbx := CargaComuna(aCiudades[1,1],aComunas)
   cComuna := aComunCbx[1]
   
   aSectCbx := CargaSector(aComunas[1,1],aSectores)
   cSector := aSectCbx[1]
   
   DEFINE DIALOG oDlg SIZE 600,300 TITLE "Nested Combobox" TRUEPIXEL
   
        @ 10, 10 COMBOBOX oCiudades VAR cCiudad ITEMS aCiudCbx  OF oDlg PIXEL SIZE 150,10
           oCiudades:bChange := {|| nPos := ASCAN(aCiudades,{|x|x[2]=cCiudad } ) ,;
                                    CargaComuna(aCiudades[nPos,1], aComunas, oComunas, @cComuna) ,;
                                    CargaSector(aComunas[nPos,1], aSectores, oSectores, @cSector)}
   
        @ 10,190 COMBOBOX oComunas  VAR cComuna ITEMS aComunCbx OF oDlg PIXEL SIZE 150,10
           oComunas:bChange  := {|| nPos := ASCAN(aComunas,{|x|x[2]=cComuna } ) ,;
                                    CargaSector(aComunas[nPos,1], aSectores, oSectores, @cSector) }
   
        @ 10,370 COMBOBOX oSectores VAR cSector ITEMS aSectCbx  OF oDlg PIXEL SIZE 150,10
   
   ACTIVATE DIALOG oDlg CENTERED // ON PAINT (oCiudades:Open(),oComunas:Open(),oSectores:Open())
   
Return(NIL)
//---------------------------------------------------------------//

Function CargaComuna(cCiudad, aComunas, oComunas, cComuna)
   LOCAL aResp := {}, cResp
   FOR EACH cResp IN aComunas
       if SubStr(cResp[1],1,1) == cCiudad
          AADD(aResp,cResp[2])
       endif
   next
   IF !lInicia
      oComunas:SetItems(aResp,.F.)
      cComuna := aResp[1]
      oComunas:Refresh()
   endif
Return(aResp)
//---------------------------------------------------------------//

Function CargaSector(cComuna, aSectores, oSectores, cSector)
   LOCAL aResp := {}, cResp
   FOR EACH cResp IN aSectores
       if SubStr(cResp[1],1,3) == cComuna
          AADD(aResp,cResp[2])
       endif
   next
   IF !lInicia
      oSectores:SetItems(aResp,.F.)
      cSector := aResp[1]
      oSectores:Refresh()
   endif
   lInicia := .F.
Return(aResp)
//---------------------------------------------------------------//

 


Hola Carlos.

Muy amable, muchas gracias por tu ayuda y buena voluntad.

Disculpa no haber respondido antes, lamentablemente mi sector estuvo sin energía eléctrica y sin poder encender equipos.

Prové tu código, pero a mi me muestra solo el 1er elemento de cada combobox, no muestra ningún elemento mas.

Muchas gracias por gestión.

Saludos

Antonio
FWH 22.10 - HARBOUR - PELLES C
remtec
 
Posts: 719
Joined: Fri May 12, 2017 2:50 pm

Re: Ayuda 3 Combobox Anidados * URGENTE ??

Postby remtec » Fri Sep 09, 2022 3:24 am

Antonio Linares wrote:La razón es simple:

Estas intentando acceder al elemento quinto de un array que tiene solo tres elementos:

[ 1] = A {{" ","Uno","Dos","Tres"},{" ","Cuatro","Cinco","Seis"},{" ","Siete","Ocho","Nueve"}} length: 3
[ 2] = N 5



Buenas noches Maestro Antonio.

Recien pudiendo encender equipos.

Muchas gracias por su indicación, si me había dado cuenta del motivo del error antes del corte de energía, pero malamente pensé en seguir viendo hoy la forma de solucionarlo, y no se pudieron encender equipos.

Muchos Saludos y muy agradecido.

Antonio
FWH 22.10 - HARBOUR - PELLES C
remtec
 
Posts: 719
Joined: Fri May 12, 2017 2:50 pm


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: Google [Bot] and 90 guests