Solución a combobox dependientes en form abm

212 views
Skip to first unread message

Lionel Kieffer

unread,
Feb 22, 2017, 2:00:22 PM2/22/17
to Comunidad de Visual Foxpro en Español
Hola buenas tardes, tengo el siguiente problema que no puedo solucionar. En un form tipo abm, tengo un combobox con las provincias y otro con localidades. El combobox provincias, lo utilizo con Rowsourcetype:6-Campos y en el procedimiento InteractiveChange, utilizo este código para filtrar el combobox localidades.

SELECT localidad FROM localidades WHERE id_provincia=this.Value INTO CURSOR cur_localidad
Thisform.cmbLocalidad.RowSource = "cur_localidad"
Thisform.cmbLocalidad.Requery
Thisform.cmbLocalidad.Refresh

El combobox localidades uso el Rowsourcetype: 2-alias y el rowsource vacío. En la práctica funciona perfecto, el combobox provincias filtra la elección en el combobox localidades y también se guarda en la tabla la información que elijo; el problema radica en que cuando voy pasando de a un registro por el form abm y visualizando los registros, el combobox localidades me aparece vacío no mostrando la información de la tabla, mientras que los otros objetos si lo hacen. Yo creo que el problema debe ser porque trabaja con cursor y no con campos y tabla fija. Espero sus repuestas, desde ya muchas gracias a todos.

Mauricio Gonzalez

unread,
Feb 22, 2017, 3:32:52 PM2/22/17
to Comunidad de Visual Foxpro en Español
si provincias y localidades son tablas, porque no las relacionas?

Lionel Kieffer

unread,
Feb 22, 2017, 4:11:08 PM2/22/17
to Comunidad de Visual Foxpro en Español
Hice la relación, pero seguro que algo hice mal porque nunca me funciono; le puse filtro e hice una consulta. Tendrás algun link con ejemplo, para mi debo estar haciendo algo mal con el filtrado, porque relacionar las relaciono a las tablas

ZeRoberto

unread,
Feb 22, 2017, 4:16:46 PM2/22/17
to publicesvfoxpro
De que pais eres?

Lo que tendrias que hacer es despues de hacer el skip auntomaticamente filtrar los combos, pero yo te recomendaria otra forma si bien cada localidad pertenece a un provincia porque no creas un codigo de ubigeo, de esa manera usas un solo combo que contiene tanto la provincia como la localidad.

Codigo   Provincia       Localidad
------   -------------   -----------
1001     SAN MARTIN      MORALES
1002     SAN MARTIN      TARAPOTO
1003     SAN MARTIN      SAUCE

Por ejemplo si seleccionas 1002 significa que es de la provincia de San Martin y de la localidad de Tarapoto

Saludos


El 22 de febrero de 2017, 15:32, Mauricio Gonzalez<moris_g...@hotmail.com> escribió:
si provincias y localidades son tablas, porque no las relacionas?




Mario López

unread,
Feb 22, 2017, 4:42:54 PM2/22/17
to Comunidad de Visual Foxpro en Español
@Lionel: va un ejemplo de la forma en la que yo utilizo los combos dependientes, a mi me funciona :)


* Combo dependiente


CREATE CURSOR Provincias (ID_PROVINCIA N (10), PROVINCIA C (12))
INSERT INTO Provincias (Id_provincia, Provincia) VALUES ( 1'Buenos Aires')
INSERT INTO Provincias (Id_provincia, Provincia) VALUES ( 2'La Pampa    ')
INSERT INTO Provincias (Id_provincia, Provincia) VALUES ( 3'Cordoba     ')

CREATE CURSOR Localidades (ID_LOCALIDAD N (10), ID_PROVINCIA N (10), LOCALIDAD C (22))
INSERT INTO Localidades (Id_localidad, Id_provincia, Localidad) VALUES ( 11'Capital Federal  (Bue)')
INSERT INTO Localidades (Id_localidad, Id_provincia, Localidad) VALUES ( 21'Mar del Plata    (Bue)')
INSERT INTO Localidades (Id_localidad, Id_provincia, Localidad) VALUES ( 31'Bahia Blanca     (Bue)')
INSERT INTO Localidades (Id_localidad, Id_provincia, Localidad) VALUES ( 42'Santa Rosa       (LP) ')
INSERT INTO Localidades (Id_localidad, Id_provincia, Localidad) VALUES ( 53'Cordoba          (Cba)')
INSERT INTO Localidades (Id_localidad, Id_provincia, Localidad) VALUES ( 63'Villa Carlos Paz (Cba)')

CREATE CURSOR Personas (ID_PERSONA N (10), NOMBRE C (10), ID_PROVINCIA N (10), ID_LOCALIDAD N (10))
INSERT INTO Personas (Id_persona, Nombre, Id_provincia, Id_localidad) VALUES ( 1'Persona #1'11)
INSERT INTO Personas (Id_persona, Nombre, Id_provincia, Id_localidad) VALUES ( 2'Persona #2'11)
INSERT INTO Personas (Id_persona, Nombre, Id_provincia, Id_localidad) VALUES ( 3'Persona #3'11)
INSERT INTO Personas (Id_persona, Nombre, Id_provincia, Id_localidad) VALUES ( 4'Persona #4'12)
INSERT INTO Personas (Id_persona, Nombre, Id_provincia, Id_localidad) VALUES ( 5'Persona #5'24)
INSERT INTO Personas (Id_persona, Nombre, Id_provincia, Id_localidad) VALUES ( 6'Persona #6'24)
INSERT INTO Personas (Id_persona, Nombre, Id_provincia, Id_localidad) VALUES ( 7'Persona #7'35)
INSERT INTO Personas (Id_persona, Nombre, Id_provincia, Id_localidad) VALUES ( 8'Persona #8'36)

WITH NEWOBJECT("xForm")
    .Show(1)
ENDWITH

RETURN


DEFINE CLASS xForm as Form
    ADD OBJECT txtId_Persona   AS TextBox
    ADD OBJECT txtNombre       AS TextBox
    ADD OBJECT cboId_Provincia AS ComboBox WITH ;
        RowSourceType = 2, RowSource = "cur_provincia", BoundColumn = 2, BoundTo = .T.

    * en el select uso SELECT nombre, id ...
    * vinculo el campo con la columna 2 del SELECT (no visible): BoundColumn = 2 y BoundTo = .T.
    ADD OBJECT cboId_Localidad AS ComboBox WITH ;
        RowSourceType = 2, RowSource = "cur_localidad", BoundColumn = 2, BoundTo = .T.

    ADD OBJECT cmgSkip AS CommandGroup WITH ;
        RowSourceType = 2, Caption = "Siguiente persona", ButtonCount = 5, AutoSize     = .T.


    * Genero los cursores en el Load para que estén disponibles en el Init
    PROCEDURE Load

    GO TOP IN Personas
    ThisForm.UpdateCursors()

    ENDPROC


    * actualizo los cursores usando siempre nombre, id
    FUNCTION UpdateCursors

    SELECT provincia, id_provincia FROM provincias  INTO CURSOR cur_provincia
    SELECT localidad, id_localidad FROM localidades WHERE id_provincia==personas.id_provincia INTO CURSOR cur_localidad

    RETURN


    PROCEDURE Init

    LOCAL nY

    WITH ThisForm
        nY = 10
        FOR EACH oCtrl IN .Controls
            .CurrentX = 10
            .CurrentY = nY

            sSrc = [Personas.] + SUBSTR(oCtrl.Name4)
            * IF PEMSTATUS(oCtrl, [ControlSource], 5)
            IF TYPE(sSrc) <> "U"
                * .Print(PROPER(oCtrl.Name))
                oCtrl.ControlSource = sSrc
            ENDIF
            oCtrl.Move(10, nY)
            nY = nY + oCtrl.Height + 10
        NEXT

        .cmgSkip.Buttons(1).Caption = "<<"
        .cmgSkip.Buttons(2).Caption = "<"
        .cmgSkip.Buttons(3).Caption = ">"
        .cmgSkip.Buttons(4).Caption = ">>"
        .cmgSkip.Buttons(5).Caption = "Salir"
        .Refresh()
    ENDWITH

    ENDPROC


    PROCEDURE cboId_Provincia.Valid
    ThisForm.Refresh()
    ENDPROC


    PROCEDURE cmgSkip.Click

    WITH This
        DO CASE
        CASE .Value==1
            GO TOP IN Personas
        CASE .Value==2
            IF ! BOF("Personas")
                SKIP -1 IN Personas
            ENDIF
        CASE .Value==3
            IF RECNO("Personas") < RECCOUNT("Personas")
                SKIP IN Personas
            ENDIF
        CASE .Value==4
            GO BOTTOM IN Personas
        CASE .Value==5
            ThisForm.Hide()
        ENDCASE

        ThisForm.Refresh()
    ENDWITH

    ENDPROC


    PROCEDURE Refresh
    ThisForm.UpdateCursors()
    ENDPROC
ENDDEFINE

***



HTH
Mario

---

integral

unread,
Feb 22, 2017, 7:54:17 PM2/22/17
to Comunidad de Visual Foxpro en Español

Estimado Amigo :

Te muestro una imagen de ejemplo utilizando el codigo de Ubigeo

Saludos,

INTEGRAL

Lionel Kieffer

unread,
Feb 22, 2017, 8:15:23 PM2/22/17
to Comunidad de Visual Foxpro en Español
Lo solucioné de la siguiente manera, no se si sera la mejor, pero lo probé y funcionó sin tirarme error en el módulo de captura de error. Tengo un módulo que dependiendo el estado del formulario si para ver o modificar, habilita o desabilita objetos, entonces le puse que cuando el form esta en modo ver, que habilita la barra para pasar regisitros; el combobox localidad el rowsourcetype =6 campos y rowsource la tabla localidades. Cuando el form esta para grabar nuevo registro o editar el combobox localidad en tipo alias y con el cursor filtrado desde el controlbox provincia. De esta manera cuando paso por registros me muestra lo que hay en la base de datos y cuando edito o modifico trabaja con le cursor y filtro. Desde ya muchas gracias por su tiempo, ayuda y ejemplos Mauricio Gonzalez, ZeRoberto, Mario López y Gabriel Velazco.

Antonito Mt

unread,
Feb 23, 2017, 11:16:54 AM2/23/17
to Comunidad de Visual Foxpro en Español
Aún así siempre he evitado usar selects en los comboboxes pues a veces hacen cosas raras con los refresh.

Prefiero tener un solo cursor con todas las localidades, filtrar y luego requery del combobox.
Reply all
Reply to author
Forward
0 new messages