Como Actilizar 2º Combobox ANIDADOS " URGENTE "

remtec
Posts: 431
Joined: Fri May 12, 2017 2:50 pm

Como Actilizar 2º Combobox ANIDADOS " URGENTE "

Post by remtec »

Hola Amigos.

Tengo 2 Combobox, al seleccionar un elemento en e 1º, no logro que se actualice la lista del 2º Combobox.

Agregadeciendo su ayuda,

Muchos Saludos

Antonio.

Dejo parte del codigo:

Code: Select all


        @ 014,05 SAY "Tipo de Examen"           SIZE 100,10 PIXEL OF oDlg4   RIGHT  FONT oFon6
        @ 025,05 SAY "Nombre  Examen"              SIZE 100,10 PIXEL OF oDlg4  RIGHT  FONT oFon6

        @ 012,110 ComboBox oGet5 Var nExam Items ArrTranspose(aExamenes)[2] SIZE 100,200 PIXEL OF oDlg4       FONT oFon6;
                             ON CHANGE ((Tip_Ate1:=ArrTranspose(aExamenes)[1][oGet5:nAt]),IF(!SeleAran(Tip_Ate1,oGet6),(MsgStop("TODO BIEN"),(oGet6:Refresh(),oGet6:Setfocus()),.F.), (oGet6:UpDate(),oGet6:Refresh(),oGet6:Setfocus(), .T.) ))     // <===  Al Seleccionar aqui, carga aArancel, pero no se actualiza

        @ 025,110 ComboBox oGet6 Var nCodi Items ArrTranspose(aArancel)[1] SIZE 145,200 PIXEL OF oDlg4       FONT oFon6;
             ON CHANGE ((Cod_Exa1:=ArrTranspose(aArancel)[2][oGet6:nAt]),oMemo2:Setfocus())  // <== Aqui no se actualiza en forma automatica la lista de elementos.

.....
...

Function SeleAran(Tip_Ate1,oGet6)
            aArancel := {}
            Sele Aran
            Seek Tip_Ate1
            If Eof()
                  MsgStop( "No Se Encontro Arancel Para Tipo Examen "+Tip_Ate1)
                  Return .f.
            Endif
            Do While (Tip_Ate=Tip_Ate1).and.!Eof()
                    Aadd(aArancel, { Aran->Nom_Ara,Aran->Cod_Ara})
                    DbSkip()
            EndDo
            cNom9 := ASort(aArancel,,,{|x,y| x[1]<y[1]})   // "       "        "  nombre
            nCodi:=1

               oGet6:GoTop()
               oGet6:Refresh()
            Return .t.

 
Last edited by remtec on Wed Apr 08, 2020 4:35 pm, edited 2 times in total.
JESUS MARIN
Posts: 91
Joined: Wed Jan 02, 2019 8:36 am

Re: Como Actilizar 2º Combobox

Post by JESUS MARIN »

Code: Select all

Static function combo2()

LOCAL oCombo1, oCombo2
LOCAL cVar1, cVar2
LOCAL aItems1:={"A","B","C"}, aItems2:={"A-1","A-2","A-3"}

LOCAL oDlg


DEFINE DIALOG oDlg FROM 1,1 TO 200,400 PIXEL

 @ 012,12 ComboBox oCombo1 Var cVar1 Items aItems1 SIZE 100,200 PIXEL OF oDlg 
          

 @ 042,12 ComboBox oCombo2 Var cVar2 Items aItems2 SIZE 100,200 PIXEL OF oDlg UPDATE

 oCombo1:bChange := { || aItems2:=Actualiza(cVar1), oCombo2:SetItems(aItems2), cVar2:=aItems2[1], oCombo2:Refresh() }


ACTIVATE DIALOG oDlg CENTER

RETURN(NIL)


STATIC FUNCTION Actualiza(cVar1)

LOCAL aReturn:={}

IF cVar1="A"
   AADD(aReturn,"A-1")
   AADD(aReturn,"A-2")
   AADD(aReturn,"A-3")
ENDIF
IF cVar1="B"
   AADD(aReturn,"B-1")
   AADD(aReturn,"B-2")
   AADD(aReturn,"B-3")
ENDIF
IF cVar1="C"
   AADD(aReturn,"C-1")
   AADD(aReturn,"C-2")
   AADD(aReturn,"C-3")
ENDIF

RETURN(aReturn)



 
remtec
Posts: 431
Joined: Fri May 12, 2017 2:50 pm

Re: Como Actilizar 2º Combobox

Post by remtec »

Hola Jesus

Muchas gracias por responder.

No logro hacerlo funcionar, ya que mi Array son Multidimencionales ambos.
Del tipo:
aExamenes,{"EC ","EXAMEN 1 "})
aExamenes,{"RX ","EXAMEN 2 "})

El Primer Combobox, debe mostrar "EXAMEN 1" y al seleccionar, debo obteber "EC".
Aquí obtengo el codigo ===> ON CHANGE ((Tip_Ate1:=ArrTranspose(aExamenes)[1][oGet5:nAt])

Quizas me este ahogando en un vaso de agua, pero no logro dar con la solucion.

Saludos,

Antonio
JESUS MARIN
Posts: 91
Joined: Wed Jan 02, 2019 8:36 am

Re: Como Actilizar 2º Combobox " URGENTE "

Post by JESUS MARIN »

Buenos días Antonio

No veo como has definido las variables. Si son locales, staticas, etc....
No veo la estructura de los arrays.
Tampoco veo la función ArrTranspose(), y por lo tanto no veo lo que devuelve.

Pero entiendo que el funcionamiento debería ser el mismo para un array de una dimensión, o multidimensional.
Solo debes controlar bien, las posiciones.

Aquí te dejo un ejemplo con múltiples dimensiones. Si nos das mas información, tal vez sea mas fácil ayudarte.

Code: Select all

Static function combo2()

LOCAL oCombo1, oCombo2
LOCAL cVar1, cVar2
LOCAL aItems1:={ {"A","AA"},{"B","BB"},{"C","CC"}}, aItems2:={ {"A-1","A-2","A-3"}, {"B-1","B-2","B-3","B-4"}, {"C-1","C-2"} }
LOCAL aItems1b:={}, aItems2b:={}

LOCAL oDlg
LOCAL N:=1


// voy a suponer que tu funcion ArrTranspose() toma solo el segundo valor para el array del oCombo1
FOR N=1 TO LEN(aItems1)
   AADD(aItems1b, aItems1[n,2])
NEXT N
// voy a inicializar los datos del segundo array con las posiciones de "A"
aItems2b:=aItems2[1]




DEFINE DIALOG oDlg FROM 1,1 TO 200,400 PIXEL

 @ 012,12 ComboBox oCombo1 Var cVar1 Items aItems1b SIZE 100,200 PIXEL OF oDlg

 @ 042,12 ComboBox oCombo2 Var cVar2 Items aItems2b SIZE 100,200 PIXEL OF oDlg

 oCombo1:bChange := { || aItems2b:=aItems2[oCombo1:nAt], oCombo2:SetItems(aItems2b), cVar2:=aItems2b[1], oCombo2:Refresh() }


ACTIVATE DIALOG oDlg CENTER

RETURN(NIL)

 


Saludos
Jesús
JESUS MARIN
Posts: 91
Joined: Wed Jan 02, 2019 8:36 am

Re: Como Actilizar 2º Combobox " URGENTE "

Post by JESUS MARIN »

O prueba este otro ejemplo. He puesto tus datos en el primer array. A ver si así te aclaras mas. En el botón, te sale un mensaje con las opciones seleccionadas.

Code: Select all

Static function combo2()

LOCAL oCombo1, oCombo2
LOCAL cVar1, cVar2
LOCAL aItems1:={ {"EX","Examen 1"},{"RX","Examen 2"},{"HX","Examen 3"}}, aItems2:={ {"A-1","A-2","A-3"}, {"B-1","B-2","B-3","B-4"}, {"C-1","C-2"} }
LOCAL aItems1b:={}, aItems2b:={}

LOCAL oDlg
LOCAL N:=1


// voy a suponer que tu funcion ArrTranspose() toma solo el segundo valor para el array del oCombo1
FOR N=1 TO LEN(aItems1)
   AADD(aItems1b, aItems1[n,2])
NEXT N
// voy a inicializar los datos del segundo array con las posiciones de "A"
aItems2b:=aItems2[1]




DEFINE DIALOG oDlg FROM 1,1 TO 200,400 PIXEL

 @ 012,12 ComboBox oCombo1 Var cVar1 Items aItems1b SIZE 100,200 PIXEL OF oDlg

 @ 042,12 ComboBox oCombo2 Var cVar2 Items aItems2b SIZE 100,200 PIXEL OF oDlg UPDATE

 oCombo1:bChange := { || aItems2b:=aItems2[oCombo1:nAt], oCombo2:SetItems(aItems2b), cVar2:=aItems2b[1], oCombo2:Refresh() }

 @ 072,12 BUTTON "Mi selección es ? " OF oDlg SIZE 100,22 PIXEL ACTION MsgAlert( "Mi selección es : "+aItems1[oCombo1:nAt,1]+CRLF+aItems1[oCombo1:nAt,2]+CRLF+aItems2b[oCombo2:nAt] )

ACTIVATE DIALOG oDlg CENTER

RETURN(NIL)

 
JESUS MARIN
Posts: 91
Joined: Wed Jan 02, 2019 8:36 am

Re: Como Actilizar 2º Combobox " URGENTE "

Post by JESUS MARIN »

También veo que tienes un campo Memo. Si, por ejemplo, lo quieres actualizar de forma dinámica, cuando algunos de los dos _, utiliza esto :

(pruébalo y veras como cambia el objeto SAY que he puesto. Modifícalo a tu gusto y ejecuta las acciones que necesites)

Code: Select all

Static function combo2()

LOCAL oCombo1, oCombo2
LOCAL cVar1, cVar2
LOCAL aItems1:={ {"EX","Examen 1"},{"RX","Examen 2"},{"HX","Examen 3"}}, aItems2:={ {"A-1","A-2","A-3"}, {"B-1","B-2","B-3","B-4"}, {"C-1","C-2"} }
LOCAL aItems1b:={}, aItems2b:={}

LOCAL oDlg
LOCAL N:=1
LOCAL oSay, cText:=""

// voy a suponer que tu funcion ArrTranspose() toma solo el segundo valor para el array del oCombo1
FOR N=1 TO LEN(aItems1)
   AADD(aItems1b, aItems1[n,2])
NEXT N
// voy a inicializar los datos del segundo array con las posiciones de "A"
aItems2b:=aItems2[1]

cText:="Mi selección es : "+CRLF+aItems1[1,1]+CRLF+aItems1[1,2]+CRLF+aItems2[1,1] // se inicia con los primeros valores



DEFINE DIALOG oDlg FROM 1,1 TO 200,500 PIXEL

 @ 012,12 ComboBox oCombo1 Var cVar1 Items aItems1b SIZE 100,200 PIXEL OF oDlg

 @ 042,12 ComboBox oCombo2 Var cVar2 Items aItems2b SIZE 100,200 PIXEL OF oDlg UPDATE

 oCombo1:bChange := { || aItems2b:=aItems2[oCombo1:nAt], oCombo2:SetItems(aItems2b), cVar2:=aItems2b[1], oCombo2:Refresh() }

 oCombo2:bChange := { || ( cText:="Mi selección es : "+CRLF+aItems1[oCombo1:nAt,1]+CRLF+aItems1[oCombo1:nAt,2]+CRLF+IF(oCombo2:nAt=0,aItems2b[1],aItems2b[oCombo2:nAt]), oSay:SetText(cText) ) }

 @ 012,150 SAY oSay VAR cText OF oDlg PIXEL SIZE 100,200

ACTIVATE DIALOG oDlg CENTER

RETURN(NIL)


 
remtec
Posts: 431
Joined: Fri May 12, 2017 2:50 pm

Re: Como Actilizar 2º Combobox " URGENTE "

Post by remtec »

Hola Jesus.

Muchas gracias por tu preocupacion y tiempo que me has dedicado.

He revisado tus codigos ejemplos, veo que trabajas con doble Array, la verdad que me perdi, ya que desde el bChange, debo mandar a carjar a una function el segundo Array.

Se que te he molestado mucho, pero mira el primer codigo que me enviaste es lo que tengo mas claro, muestra inicialmente los los Array con sus combobox, solo que al seleccionar un nuevo elemento del 1º Combobox, ya a la function " Actualiza ", llena el arreglo de paso, pero al retornar al bChange, se muere, simplemente se sale del programa y no da error, la idea es que actualice los elementos del segundoo combobox, esa es la finalidad.

Muy agradecido,

Antonio.

Dejo todo el codigo con la explicacion que estoy Probando:

Code: Select all

#include "FiveWin.ch"

Static  aItems1:={}
Static  aItems2:={}

Static function combo2()

        LOCAL oCombo1, oCombo2
        LOCAL cVar1, cVar2 ,Tip_Ate1
        LOCAL oDlg ,a:=1,b:=1


        AADD( aItems1,{"A","ECOGRAFIAS    "})
        AADD( aItems1,{"B","RAYOS         "})
        AADD( aItems1,{"C","LABORATORIO   "})

        AADD(aItems2,{"A-1","DETALLE AA-1"})
    AADD(aItems2,{"A-2","DETALLE AA-2"})
    AADD(aItems2,{"A-1","DETALLE AA-3"})



        DEFINE DIALOG oDlg FROM 1,1 TO 200,400 PIXEL

         @ 012,12 ComboBox oCombo1 Var a Items ArrTranspose(aItems1)[2] SIZE 100,200 PIXEL OF oDlg           // <== Muestra en Detalle  "ECOGRAFIAS"    "

         @ 042,12 ComboBox oCombo2 Var b Items ArrTranspose(aItems2)[2] SIZE 100,200 PIXEL OF oDlg UPDATE    // <== Muestra en Detalle  "DETALLE AA-1"

         oCombo1:bChange := { ||(cVar1:=ArrTranspose(aItems1)[1][oCombo1:nAt]), aItems2:=Actualiza(cVar1), oCombo2:SetItems(aItems2), (cVar2:=ArrTranspose(aItems2)[1][oCombo2:nAt]), oCombo2:Refresh() }

         /*
                Notas:
                cVar1:=ArrTranspose(aItems1)[1][oCombo1:nAt]  <====  Obtengo  el 1º Elemento "A", esta variable la necesito para otra funcion
                aItems2:=Actualiza(cVar1)                     <====  Va a la Function Actualiza con el Valor cVar1 e llena nuevo Array aItems2
                oCombo2:SetItems(aItems2)                     <====  Cargo el Objeto con nuevo Array
                cVar2:=ArrTranspose(aItems2)[1][oCombo2:nAt]) <==== Obtengo el 1º Elemento del Segundo Combobox  "A-2"

        */
        ACTIVATE DIALOG oDlg CENTER

RETURN(NIL)


STATIC FUNCTION Actualiza(cVar1)

        LOCAL aReturn:={}
        ?cVar1
        IF cVar1="A"
           AADD(aReturn,{"A-1","DETALLE AA-1"})
           AADD(aReturn,{"A-2","DETALLE AA-2"})
           AADD(aReturn,{"A-1","DETALLE AA-3"})
        ENDIF
        IF cVar1="B"
           AADD(aReturn,{"B-1","DETALLE BB-1"})
           AADD(aReturn,{"B-1","DETALLE BB-1"})
           AADD(aReturn,{"B-1","DETALLE BB-1"})
        ENDIF
        IF cVar1="C"
           AADD(aReturn,{"C-1","DETALLE CC-1"})
           AADD(aReturn,{"C-1","DETALLE CC-1"})
           AADD(aReturn,{"C-1","DETALLE CC-1"})
        ENDIF

RETURN(aReturn)

 
JESUS MARIN
Posts: 91
Joined: Wed Jan 02, 2019 8:36 am

Re: Como Actilizar 2º Combobox " URGENTE "

Post by JESUS MARIN »

Que hace la función ArrTranspose() ?

Puedes copiarla ?

Gracias
JESUS MARIN
Posts: 91
Joined: Wed Jan 02, 2019 8:36 am

Re: Como Actilizar 2º Combobox " URGENTE "

Post by JESUS MARIN »

Una cosa

No creo que puedas asignar al combo2 un array multi-dimensional


Has puesto en el bChange

aItems2:=Actualiza(cVar1)
oCombo2:SetItems(aItems2)

Pero aItems2 es un array de dos dimensiones por cada elemento, por lo que es posible que al hacer el SetItems(), te da el error.
remtec
Posts: 431
Joined: Fri May 12, 2017 2:50 pm

Re: Como Actilizar 2º Combobox " URGENTE "

Post by remtec »

Hola Jesus

Si lo uso con las variables cVar1 y cVar2 en el Combobox, me da error.

Al usar: Var cVar1 Items ArrTranspose(aItems1)[2] <== cVar1 contiene la posicion del elemento y ArrTranspose(aItems1)[2] muestra el segundo elemento en esta caso el Detalle y no el codigo que no lo muestro, solo lo uso para obtener y usarlo mas adelante.

Quedo atento a los comentarios.

Saludos

Antonio

Codigo que cambie :

Code: Select all

DEFINE DIALOG oDlg FROM 1,1 TO 200,400 PIXEL

 @ 012,12 ComboBox oCombo1 Var cVar1 Items ArrTranspose(aItems1)[2] SIZE 100,200 PIXEL OF oDlg

 @ 042,12 ComboBox oCombo2 Var cVar2 Items ArrTranspose(aItems2)[2] SIZE 100,200 PIXEL OF oDlg UPDATE

 //oCombo1:bChange := { ||(cVar1:=ArrTranspose(aItems1)[1][oCombo1:nAt]), Actualiza(cVar1,oCombo2), (cVar2:=ArrTranspose(aItems2)[1][oCombo2:nAt]), oCombo2:Refresh() }


 oCombo1:bChange := { ||(cVar1:=ArrTranspose(aItems1)[1][oCombo1:nAt]), aItems2:=Actualiza(cVar1), oCombo2:SetItems(aItems2), (cVar2:=ArrTranspose(aItems2)[1][oCombo2:nAt]), oCombo2:Refresh() }


ACTIVATE DIALOG oDlg CENTER

 
Error:

Code: Select all

Application
===========
   Path and name: G:\Desa\Rem Sur\Siste2020\MenuRece.exe (32 bits)
   Size: 4,559,360 bytes
   Compiler version: Harbour 3.2.0dev (r1506171039)
   FiveWin  version: FWH 17.09
   C compiler version: Borland/Embarcadero C++ 7.0 (32-bit)
   Windows version: 5.1, Build 2600 Service Pack 3

   Time from start: 0 hours 0 mins 12 secs 
   Error occurred at: 08/04/2020, 12:19:11
   Error description: Error BASE/1132  Error de rango: acceso al array
   Args:
     [   1] = A   { ... } length: 2
     [   2] = N   0

 
remtec
Posts: 431
Joined: Fri May 12, 2017 2:50 pm

Re: Como Actilizar 2º Combobox " URGENTE "

Post by remtec »

JESUS MARIN wrote:Una cosa

No creo que puedas asignar al combo2 un array multi-dimensional


Has puesto en el bChange

aItems2:=Actualiza(cVar1)
oCombo2:SetItems(aItems2)

Pero aItems2 es un array de dos dimensiones por cada elemento, por lo que es posible que al hacer el SetItems(), te da el error.
Enconces, la pregunta del Millon.

Cual seria la forma de usar 2 Combobox Anidados con Array Multidimensional o no se puede usar ?

Que atento a los comentarios.

Saludos
Antonio
JESUS MARIN
Posts: 91
Joined: Wed Jan 02, 2019 8:36 am

Re: Como Actilizar 2º Combobox ANIDADOS " URGENTE "

Post by JESUS MARIN »

Antonio.

Es que no me queda claro lo que quieres hacer.

¿quieres utilizar dos combos con dos arrays? (cada array de dos dimensiones)
que se muestre el segundo valor de cada array ?
obtener los 4 valores ?

correcto ?
remtec
Posts: 431
Joined: Fri May 12, 2017 2:50 pm

Re: Como Actilizar 2º Combobox ANIDADOS " URGENTE "

Post by remtec »

Hola Jesus

Sigo dandote las gracias.

Efectivamente necesito mostrar en cada Combobox el 2º elemento y obtener para ambos, el Codigo y Detalle.

Con el primer Combobox, selecciono un elemento y debe ir a la function y llenar el Array del 2º Combobox y este mostrar los nuevos elementos, a su ves el usuario debera seleccionar un elemento de este segundo combobox.

Creo que estoy siendo un dolor de cabeza, pense que me seria mas simple.

Cuando asigno el nuevo Array generado al Objeto, este se cae: oCombo2:SetItems(aItems2), como dices, al parecer, no se puede asignar Array Multidimensional con SetItems(). Seria importante que algun Maestro pueda confirmarlo.


Muchisimas gracias.

Antonio.
JESUS MARIN
Posts: 91
Joined: Wed Jan 02, 2019 8:36 am

Re: Como Actilizar 2º Combobox ANIDADOS " URGENTE "

Post by JESUS MARIN »

Mañana te monto un ejemplo, pero creo que debes ayudarte de dos arrays para cada combo.
Saludos
Jesús
User avatar
cnavarro
Posts: 5792
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: Como Actilizar 2º Combobox ANIDADOS " URGENTE "

Post by cnavarro »

JESUS MARIN wrote:Mañana te monto un ejemplo, pero creo que debes ayudarte de dos arrays para cada combo.
Saludos
Jesús
Así es, es lo más sencillo en el caso de arrays multidimensionales
1) Creas un array a partir del primero que asignarás al 1º combobox

Code: Select all

local aTmp1  := {}
local aTmp2  := {}

AEVal( aExamenes, { | a | AAdd( aTmp1, a[ 1 ] + "  " + a[ 2 ] } )     // Este aTmp1 será el que asignes al 1º Combobox
// ó
// AEVal( aExamenes, { | a | AAdd( aTmp1, a[ 2 ] + "  " + a[ 1 ] } )     // Este aTmp1 será el que asignes al 1º Combobox

AEVal( aArancel,  { | a | AAdd( aTmp2, a[ 1 ] + "  " + a[ 2 ] } )     // Este aTmp2 será el que asignes al 2º Combobox
// ó
// AEVal( aArancel, { | a | AAdd( aTmp2, a[ 2 ] + "  " + a[ 1 ] } )     // Este aTmp1 será el que asignes al 2º Combobox

 

Pero cuando quieras obtener los elementos, seguirás usando el nAt del objeto combobox pero se lo aplicarás a los arrays originales: aExamenes y/o aArancel
C. Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
Si alguien te dice que algo no se puede hacer, recuerda que esta hablando de sus limitaciones, no de las tuyas.
Post Reply