Page 1 of 1

Ayuda 3 Combobox Anidados * URGENTE ??

PostPosted: Tue Sep 06, 2022 3:38 pm
by remtec
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 }

 

Re: Ayuda Urgente con Combobox Anidados ??

PostPosted: Wed Sep 07, 2022 12:22 am
by remtec
Amigos.

Alguna posibilidad?

Saludos

Antonio

Re: Ayuda Urgente con Combobox Anidados ??

PostPosted: Wed Sep 07, 2022 3:08 am
by cmsoft
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 }
 

Re: Ayuda Urgente con Combobox Anidados ??

PostPosted: Wed Sep 07, 2022 3:34 am
by remtec
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

Re: Ayuda 3 Combobox Anidados * URGENTE ??

PostPosted: Wed Sep 07, 2022 3:14 pm
by remtec
Amigos Buen dia

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

Saludos

Antonio

Re: Ayuda 3 Combobox Anidados * URGENTE ??

PostPosted: Wed Sep 07, 2022 4:14 pm
by Antonio Linares
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

Re: Ayuda 3 Combobox Anidados * URGENTE ??

PostPosted: Wed Sep 07, 2022 4:41 pm
by remtec
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.

Re: Ayuda 3 Combobox Anidados * URGENTE ??

PostPosted: Wed Sep 07, 2022 5:49 pm
by Antonio Linares
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 ""  

Re: Ayuda 3 Combobox Anidados * URGENTE ??

PostPosted: Wed Sep 07, 2022 5:59 pm
by Antonio Linares
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

Re: Ayuda 3 Combobox Anidados * URGENTE ??

PostPosted: Wed Sep 07, 2022 11:40 pm
by remtec
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 )
 

Re: Ayuda 3 Combobox Anidados * URGENTE ??

PostPosted: Thu Sep 08, 2022 4:57 am
by Antonio Linares
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

Re: Ayuda 3 Combobox Anidados * URGENTE ??

PostPosted: Fri Sep 09, 2022 2:51 am
by Cgallegoa
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)
//---------------------------------------------------------------//

 

Re: Ayuda 3 Combobox Anidados * URGENTE ??

PostPosted: Fri Sep 09, 2022 3:20 am
by remtec
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

Re: Ayuda 3 Combobox Anidados * URGENTE ??

PostPosted: Fri Sep 09, 2022 3:24 am
by remtec
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