Utilizar 2 dbcombo

Post Reply
Adolfredo Martinez
Posts: 121
Joined: Fri Feb 15, 2019 1:37 pm
Location: Aracataca-Colombia

Utilizar 2 dbcombo

Post by Adolfredo Martinez »

Hola amigos.

Alguien tiene por hay un ejemplo donde utilize dos dbcombo, en uno selecciona el departamento, y dependiento el departamento seleccionado en el otro me muestre los municipios de ese departamento.
User avatar
Jimmy
Posts: 1734
Joined: Thu Sep 05, 2019 5:32 am
Location: Hamburg, Germany

Re: Utilizar 2 dbcombo

Post by Jimmy »

hi,

you can use ON CHANGE ( = o:Change() ) to call a Function to "fill" your 2nd Combobox

i have ask ChatGPT for Sample
can you show me a Sample of 2 Combobox where 2nd Combobox depend on 1st combobox using fivewin command syntax

Sure, here's an example of how to create two comboboxes where the options available in the second combobox depend on the selection made in the first combobox using the Fivewin command syntax:

Code: Select all | Expand

#include "fw.ch"
FUNCTION Main()
   DEFINE WINDOW Form_1 ;
      AT 0,0 ;
      WIDTH 300 ;
      HEIGHT 200 ;
      TITLE 'Combobox Example' ;
      MAIN
      DEFINE COMBOBOX Combo_1
         ROW 20 ;
         COL 20 ;
         WIDTH 100 ;
         HEIGHT 24 ;
         FONT 'Arial', 10, FW_NORMAL
         ADDITEMS {'Option 1', 'Option 2', 'Option 3'} TO Combo_1
      END COMBOBOX
      DEFINE COMBOBOX Combo_2
         ROW 20 ;
         COL 140 ;
         WIDTH 100 ;
         HEIGHT 24 ;
         FONT 'Arial', 10, FW_NORMAL
         ITEMS {'Sub-Option 1', 'Sub-Option 2', 'Sub-Option 3'}
      END COMBOBOX
   END WINDOW
   ACTIVATE WINDOW Form_1

   // Bind a handler to the first combobox to update the options in the second combobox
   COMBO_1:Change := {|| UpdateCombo2()}

   PROCEDURE UpdateCombo2()
      LOCAL selectedOption := Combo_1:Value

      // Clear the options in the second combobox
      Combo_2:ClearItems()

      // Add new options based on the selected option in the first combobox
      IF selectedOption = 'Option 1'
         Combo_2:AddItems({'Sub-Option 1', 'Sub-Option 2'}) TO Combo_2
      ELSIF selectedOption = 'Option 2'
         Combo_2:AddItems({'Sub-Option 3', 'Sub-Option 4'}) TO Combo_2
      ELSIF selectedOption = 'Option 3'
         Combo_2:AddItems({'Sub-Option 5', 'Sub-Option 6'}) TO Combo_2
      ENDIF
   RETURN
END FUNCTION
In this example, we create a window with two comboboxes, Combo_1 and Combo_2. Combo_1 has three options: Option 1, Option 2, and Option 3. Combo_2 initially has three sub-options: Sub-Option 1, Sub-Option 2, and Sub-Option 3.

We then bind a handler to Combo_1's Change event using the COMBO_1:Change := {|| UpdateCombo2()} statement. This handler, UpdateCombo2(), is called whenever Combo_1's selection changes.

Inside UpdateCombo2(), we first get the selected option from Combo_1 using Combo_1:Value. We then clear the options in Combo_2 using Combo_2:ClearItems(). Finally, we add new options to Combo_2 based on the selected option in Combo_1. In this example, if Option 1 is selected in Combo_1, Sub-Option 1 and Sub-Option 2 are added to Combo_2; if Option 2 is selected, Sub-Option 3 and Sub-Option 4 are added; and if Option 3 is selected, Sub-Option 5 and Sub-Option 6 are added.

Note that the syntax and function calls used in this example may vary depending on the version of Fivewin you are using.
greeting,
Jimmy
User avatar
cmsoft
Posts: 1294
Joined: Wed Nov 16, 2005 9:14 pm
Location: Mercedes - Bs As. Argentina
Been thanked: 1 time

Re: Utilizar 2 dbcombo

Post by cmsoft »

Adolfredo, te dejo aqui un ejemplo que puse para Remtec

Code: Select all | Expand

#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 := '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

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

   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 ON INIT (oComuna:SetItems( aComunas[ nZ1] ), oComuna:Set( nZ2 )) 

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 }
Espero te sirva
Adolfredo Martinez
Posts: 121
Joined: Fri Feb 15, 2019 1:37 pm
Location: Aracataca-Colombia

Re: Utilizar 2 dbcombo

Post by Adolfredo Martinez »

Gracias amigos, por estar ahi.

Me pondre mano a la obra.
Post Reply