*<note>
La función ShowError() que se ve en el ejemplo, es una UDF que muestra el mensaje de error.
El ejemplo está basado en una tabla con los siguientes campos:
Provincia C(30)
Codprov C(1) * ID de Provincia
CIUDAD C(50)
CPOSTAL C(4)
Se utilizan dos combobox (cmb_Provincias y cmb_Localidades)
Se utilizan dos propiedades del form "MiCodProv" y "MiCiudad"
Se utilizan dos métodos del form: "relleno_cmb_Provincias" y "relleno_cmb_localidades"
Este ejemplo es válido solamente para tablas nativas
En otro caso, se deberán utilizar cursores en lugar de arrays.
*</note>
*<task>
* Agrego dos métodos al formulario:
* 1 - relleno_cmb_Provincias()
* 2 - relleno_cmb_localidades()
* Agrego una propiedad "MiCodProv" al formulario
* para manejar el cmb_Provincias
ADDPROPERTY(thisform,"MiCodprov","")
* Agrego una propiedad "MiCiudad" al formulario
* para manejar el cmb_Localidades
ADDPROPERTY(thisform,"MiCiudad","")
*</task>
*<Init>
this.relleno_cmb_Provincias()
*</Init>
*<metodo name="relleno_cmb_Provincias">
** METODO: relleno_cmb_Provincias
TRY
LOCAL LOEX AS EXCEPTION,;
i,;
lnTally
LOCAL ARRAY laProvin(1)
* Determino del archivo de localidades las provincias
* existentes con su Id. (codprov)
SELECT distinct provincia,codprov ;
FROM zip_code ;
WHERE !DELETED() ;
ORDER BY provincia ;
INTO ARRAY laProvin
lnTally = _tally
* Relleno el combobox.
WITH thisform.cmb_provincias
.clear
.RowSourceType = 0
.boundcolumn = 2
.ControlSource = 'thisform.MiCodProv'
* Se agrega esta línea para evitar que aparezca el cuadro vacío
.AddListItem("(Seleccione Provincia)",1,1)
.AddListItem("",1,2)
FOR i = 1 TO m.lnTally
.AddListitem(PROPER(laProvin[i,1]),i+1,1)
.AddListitem(laProvin[i,2],i+1,2)
NEXT
.requery
.refresh
ENDWITH
thisform.relleno_cmb_localidades(thisform.MiCodprov)
CATCH TO LOEX
LOEX.USERVALUE = PROGRAM()
SHOWERROR(LOEX)
FINALLY
ENDTRY
</metodo>
<metodo name = "relleno_cmb_localidades">
* METODO: relleno_cmb_localidades
**********************************
* Llamado por relleno_cmb_Provincias()
* Llamado por cmb_provincias.Click()
* -------------------------------------
LPARAMETERS tcCodProv
TRY
LOCAL LOEX AS EXCEPTION,;
i,;
lnTally
LOCAL ARRAY laLocali(1)
* Determino del archivo de localidades las provincias
* existentes con su Id. (codprov)
SELECT ciudad,cpostal ;
FROM zip_code ;
WHERE codprov == m.tcCodProv ;
ORDER BY ciudad ;
INTO ARRAY lalocali
lnTally = _tally
* Relleno el combobox.
WITH thisform.cmb_localidades
.clear
.RowSourceType = 0
.boundcolumn = 2
.columnCount = 2
.columnwidths = "150,50"
.ControlSource = 'thisform.MiCiudad'
* Se agrega esta línea para evitar que aparezca el cuadro vacío
.AddListItem("(Seleccione Localidad)",1,1)
.AddListItem("",1,2)
FOR i = 1 TO m.lnTally
.AddListitem(PROPER(laLocali[i,1]),i+1,1)
.AddListitem(laLocali[i,2],i+1,2)
NEXT
.Enabled = !EMPTY(m.lnTally) && cuando no hay localidades, se deshabilita el cuadro
.requery
.refresh
ENDWITH
CATCH TO LOEX
LOEX.USERVALUE = PROGRAM()
SHOWERROR(LOEX)
FINALLY
ENDTRY
</metodo>
<evento name = "cmb_Provincias.Click"
* Código del Evento Click de cmb_Provincias
TRY
LOCAL LOEX AS EXCEPTION,;
lnItem
lnItem = this.ListItemId
IF !EMPTY(m.lnItem)
thisform.relleno_cmb_localidades(THIS.ListItem(m.lnItem,2))
ENDIF
CATCH TO LOEX
LOEX.USERVALUE = PROGRAM()
SHOWERROR(LOEX)
FINALLY
ENDTRY
*</evento>
<evento name = "cmb_Localidades.Click">
* Código del Evento Click de cmb_Localidades
* (Solo para ejemplo - debe ir lo que se necesita realmente)
LOCAL lnItem,;
lcCodigo,;
lcCiudad
lnItem = this.ListItemId
IF !EMPTY(m.lnItem)
lcCodigo = this.ListItem(m.lnItem,2)
lcCiudad = this.ListItem(m.lnItem,1)
MESSAGEBOX("Código Postal = "+m.lcCodigo + CHR(13) ;
+ "Ciudad = "+m.lcCiudad )
ENDIF
*</evento>