The array in COMBOBOX is EMPTY .....

General Help regarding HMG, Compilation, Linking, Samples

Moderator: Rathinagiri

Post Reply
User avatar
jorge_riv
Posts: 62
Joined: Thu Nov 22, 2018 2:20 pm
DBs Used: DBF, MySQL,SQL SERVER, Oracle.

The array in COMBOBOX is EMPTY .....

Post by jorge_riv »

There I show an example of my programs, it turns out that I define the arrays in a program like PUBLIC (aDim_PRO1: = {}, aDim_PRO2: = {}, aDim_PAR1: = {}, aDim_PAR2: = {}, aDim_LOC1: = {}, aDim_LOC2 : = {}), the first two arrays, I load them first, but then when processing the matches and the locations, empty the arrays and load them with their respective bases, IT DOES NOT BRING ME THE DATA OF THE ARRAY. (I check that it is loaded and it is), but in Combo_PAR AND Combo_LOC, it shows me empty the arrays.
I CAN'T UNDERSTAND WHAT'S HAPPENING-
Help
THANK YOU

-------------------------------------------------------------

Alli muestro un ejemplo de mis programas, resulta que defino los array en un programa como PUBLIC (aDim_PRO1 := {}, aDim_PRO2 := {}, aDim_PAR1 := {}, aDim_PAR2 := {}, aDim_LOC1 := {}, aDim_LOC2 := {}), los dos primeros array, los cargo primero, pero luego al procesar los partidos y las localidades, vaciar los array y los cargo con su respectivas bases, NO ME TRAE LOS DATOS DEL ARRAY. (reviso que este cargado y lo esta), pero en Combo_PAR Y Combo_LOC, me muestra vacio los array.
NO LOGRO ENTENDER QUE PASA-
Ayuda
GRACIAS

.........................................................

#include "hmg.ch"

#include 'Prog1.prg'
#include 'Prog2.prg'
#include 'Prog3.prg'
.
.
Prog1() (I call the Variable Declaration Program)
.
MiArea('PRO',1)
&cPRO->(DBGoTop())
DO WHILE !(&cPRO->(EOF()))
AADD( aDim_PRO1, &cPRO->PRO )
AADD( aDim_PRO2, &cPRO->NOM )
&cPRO->(DBSkip())
ENDDO
&cPRO->(DBGoTop())
*
DEFINE WINDOW Main_0 AT 0,0 WIDTH nW HEIGHT nH ;
MAIN BACKCOLOR CLR_AZUL_PANTALLA ;
ON RELEASE {|| Cerrar_Tablas() } ;
NOMAXIMIZE NOSIZE NOSYSMENU NOCAPTION

Prog2()

Prog3()

END WINDOW
ACTIVATE WINDOW Main_0
RETURN NIL
**********

-------- Prog1.prg (I define variables)
.
PUBLIC aDim_PRO1 := {}, aDim_PRO2 := {}, aDim_PAR1 := {}
PUBLIC aDim_PAR2 := {}, aDim_LOC1 := {}, aDim_LOC2 := {}
RETURN NIL
**********

-------- Prog2.prg
.
Util_Cargar()
.
RETURN NIL
**********

-------- Prog2.prg
FUNCTION Util_Cargar()
.
Util_Datos()
.
RETURN NIL


FUNCTION Util_Datos()
LOCAL Y := 518
LOCAL X := 187
*
@ 0,0 TEXTBOX Txt_PRO OF Main_0 FIELD &cPDIR->PRO INVISIBLE
@ 0,0 TEXTBOX Txt_PAR OF Main_0 FIELD &cPDIR->PAR INVISIBLE
@ 0,0 TEXTBOX Txt_LOC OF Main_0 FIELD &cPDIR->LOC INVISIBLE
*
@ Y,X COMBOBOX Combo_PRO OF Main_0 WIDTH 210 HEIGHT 220 ;
ITEMS aDim_PRO2 VALUE VAL(This.Txt_PRO.Value);
FONT 'ARIAL' SIZE 12 BOLD UPPERCASE ;
FONTCOLOR FColorGet BACKCOLOR BColorGet ;
DISPLAYEDIT AUTOCOMPLETE SHOWDROPDOWN (.T.) ;
ON GOTFOCUS ( _Ver(.T.) ) ;
ON ENTER {|| ( _Valid('Combo_PRO'), ;
_Ver(.F.), ;
This.Combo_PAR.Setfocus ) }
@ Y,X LABEL Lbl_PRO_1 OF Main_0 FONT 'Arial' SIZE 11 BOLD
Y +=30
*
*------ Partido ------
*
@ Y,X COMBOBOX Combo_PAR OF Main_0 WIDTH 210 HEIGHT 220 ;
ITEMS aDim_PAR2 VALUE VAL(This.Txt_PAR.Value);
FONT 'ARIAL' SIZE 12 UPPERCASE ;
BOLD FONTCOLOR FColorGet BACKCOLOR BColorGet ;
DISPLAYEDIT AUTOCOMPLETE SHOWDROPDOWN (.T.) ;
ON GOTFOCUS ( _Ver(.T.) ) ;
ON CLOSEUP {|| ( _Valid('Combo_PAR'), ;
_Ver(.F.), ;
This.Combo_LOC.Setfocus ) }
@ Y,X LABEL Lbl_PAR_1 OF Main_0 FONT 'Arial' SIZE 11 BOLD
Y +=30
*
*------ Localidad ------
*
@ Y,X COMBOBOX Combo_LOC OF Main_0 WIDTH 210 HEIGHT 220 ;
ITEMS aDim_LOC2 VALUE VAL(This.Txt_LOC.Value);
FONT 'ARIAL' SIZE 12 UPPERCASE ;
BOLD FONTCOLOR FColorGet BACKCOLOR BColorGet ;
DISPLAYEDIT AUTOCOMPLETE SHOWDROPDOWN (.T.) ;
ON GOTFOCUS ( _Ver(.T.) ) ;
ON CLOSEUP {|| ( _Valid('Combo_LOC'), ;
Paci_Ver(.F.), ;
This.Txt_DOM.Setfocus ) }
@ Y,X LABEL Lbl_LOC_1 OF Main_0 FONT 'Arial' SIZE 11 BOLD
Y +=30
RETURN NIL


FUNCTION Paci_Valid(cObj)
/*
cCode == '70' // Provincia -----------> PRO
INDEX ON PRO TO ('tab\HCI07001.cdx')
cCode == '71' // Partidos ------------> PAR
INDEX ON PRO+PAR TO ('tab\HCI07101.cdx')
cCode == '72' // Localidad -----------> LOC
INDEX ON PRO+PAR+LOC TO ('tab\HCI07201.cdx')

SELECT(cPDIR)
SET RELATION TO &cPDIR->PRO INTO &cPRO
SET RELATION TO &cPDIR->PRO+&cPDIR->PAR INTO &cPAR
SET RELATION TO &cPDIR->PRO+&cPDIR->PAR+&cPDIR->LOC INTO &cLOC
*/

LOCAL nVal := GetProperty( cForm, cObj, 'Value' )
*
IF cObj=='Combo_PRO'
IF nVal>0
SETPROPERTY( cForm, 'Txt_PRO', 'Value', aDim_PRO1[nVal] )
SETPROPERTY( cForm, 'Lbl_PRO_1','Value', aDim_PRO2[nVal] )
aDim_PAR1 := {}
aDim_PAR2 := {}
MiArea('PAR',1)
&cPAR->(DBSeek((aDim_PRO1[nVal])))
DO WHILE !(&cPAR->(EOF())) .AND. aDim_PRO1[nVal]==&cPAR->PRO
AADD( aDim_PAR1, &cPAR->PAR )
AADD( aDim_PAR2, &cPAR->NOM )
&cPAR->(DBSkip())
ENDDO
&cPAR->(DBGoTop())
ENDIF
ELSEIF cObj=='Combo_PAR'
IF nVal>0
SETPROPERTY( cForm, 'Txt_PAR', 'Value', aDim_PAR1[nVal] )
SETPROPERTY( cForm, 'Lbl_PAR_1','Value', aDim_PAR2[nVal] )
aDim_LOC1 := {}
aDim_LOC2 := {}
MiArea('LOC',1)
&cLOC->(DBSeek((This.Txt_PRO.Value)+aDim_PAR1[nVal]))
DO WHILE !(&cLOC->(EOF()))
IF (This.Txt_PRO.Value)==&cLOC->PRO ;
.AND. (This.Txt_PAR.Value)=&cLOC->PAR
AADD( aDim_LOC1, &cLOC->LOC )
AADD( aDim_LOC2, &cLOC->NOM )
ENDIF
&cLOC->(DBSkip())
ENDDO
&cLOC->(DBGoTop())
ENDIF
ELSEIF cObj=='Combo_LOC'
IF nVal>0
SETPROPERTY( cForm, 'Txt_LOC', 'Value', aDim_LOC1[nVal] )
SETPROPERTY( cForm, 'Lbl_LOC_1','Value', aDim_LOC2[nVal] )
ENDIF
ENDIF
DO EVENTS
*
RETURN
**********
User avatar
AUGE_OHR
Posts: 2060
Joined: Sun Aug 25, 2019 3:12 pm
DBs Used: DBF, PostgreSQL, MySQL, SQLite
Location: Hamburg, Germany

Re: The array in COMBOBOX is EMPTY .....

Post by AUGE_OHR »

hi,

i´m still a Newbie so i´m not sure about your Code Style.

Code: Select all

#include 'Prog1.prg'
#include 'Prog2.prg'
#include 'Prog3.prg'
.
Prog1() (I call the Variable Declaration Program)
.

DEFINE WINDOW Main_0 AT 0,0 WIDTH nW HEIGHT nH ;
you try to create Child Control before Parent ... how does it work ... :roll:

i recommend to use Formdesigner and ON INIT to "fill" Controls
have fun
Jimmy
User avatar
jorge_riv
Posts: 62
Joined: Thu Nov 22, 2018 2:20 pm
DBs Used: DBF, MySQL,SQL SERVER, Oracle.

Re: The array in COMBOBOX is EMPTY .....

Post by jorge_riv »

It is just an example, just detail that so as not to detail the entire code. COMBOBOX does not use ON INIT, I use Child, the problem is that when selecting a province, and validating in the matches database, it loads it in the array aDim_PAr1 and aDim_PAR2, but when going to COMBOBOX Combo_PAR, IT DOES NOT SHOW THE ARRAY THAT I CHARGE PREVIOUSLY.
when putting: MsgInfo (aDim_PAR1 [1] + '' + aDim_PAR2 [1] + '' + STR (LEN (aDim_PAR2))), it shows me the data well, but when I go to COMBOBOX the array is empty, very strange
User avatar
jorge_riv
Posts: 62
Joined: Thu Nov 22, 2018 2:20 pm
DBs Used: DBF, MySQL,SQL SERVER, Oracle.

Re: The array in COMBOBOX is EMPTY .....

Post by jorge_riv »

I use Harbor MiniGUI Extended Edition 20.04 (Release) and compile with Borlan BCC102
User avatar
AUGE_OHR
Posts: 2060
Joined: Sun Aug 25, 2019 3:12 pm
DBs Used: DBF, PostgreSQL, MySQL, SQLite
Location: Hamburg, Germany

Re: The array in COMBOBOX is EMPTY .....

Post by AUGE_OHR »

hi,

you use

Code: Select all

ITEMS aDim_PRO2 VALUE VAL(This.Txt_PRO.Value);
without ItemCount

better start with Empty Array and use AddItem()
have fun
Jimmy
User avatar
SALINETAS24
Posts: 667
Joined: Tue Feb 27, 2018 3:06 am
DBs Used: DBF
Contact:

Re: The array in COMBOBOX is EMPTY .....

Post by SALINETAS24 »

jorge_riv wrote: Sat May 09, 2020 11:00 pm
Alli muestro un ejemplo de mis programas, resulta que defino los array en un programa como PUBLIC (aDim_PRO1 := {}, aDim_PRO2 := {}, aDim_PAR1 := {}, aDim_PAR2 := {}, aDim_LOC1 := {}, aDim_LOC2 := {}), los dos primeros array, los cargo primero, pero luego al procesar los partidos y las localidades, vaciar los array y los cargo con su respectivas bases, NO ME TRAE LOS DATOS DEL ARRAY. (reviso que este cargado y lo esta), pero en Combo_PAR Y Combo_LOC, me muestra vacio los array.
NO LOGRO ENTENDER QUE PASA-
Ayuda
GRACIAS


IF cObj=='Combo_PRO'
IF nVal>0
SETPROPERTY( cForm, 'Txt_PRO', 'Value', aDim_PRO1[nVal] )
SETPROPERTY( cForm, 'Lbl_PRO_1','Value', aDim_PRO2[nVal] )

//// -------------------------------------------------------------------
//// ------------------ LINEAS DEL PROBLEMA
aDim_PAR1 := {} //--> linea del problema
aDim_PAR2 := {} //--> linea del problema

MiArea('PAR',1)
&cPAR->(DBSeek((aDim_PRO1[nVal])))
.
Hola Jorge, sin poder probar tu ejemplo es difícil ver donde se produce el error, no obstante te diré que he detectado este posible "error" de asignación.
El tema es que esa asignación que haces "aDim_PAR1 := {} " en la FUNCTION Paci_Valid, produce una nueva definición de la variable, pero en LOCAL, algo como una duplicación de variables y hace que el resultado que obtenemos no sea correcto.
Una solución pasa por inicializar esas variables PUBLICAS, antes de la llamada a la función Paci_Valid y siempre que estemos en el procedimiento donde se van a utilizar, osease donde tenemos el COMBOBOX.

Voy a ver si me se explicar

Code: Select all

// --> Ejemplo Incorrecto
MiArea('PRO',1)
PUBLIC  aDim_PRO1:={}
PUBLIC  aDim_PRO1:={}
&cPRO->(DBGoTop())
DO WHILE !(&cPRO->(EOF()))
   AADD( aDim_PRO1, &cPRO->PRO )
   AADD( aDim_PRO2, &cPRO->NOM )
   &cPRO->(DBSkip())
ENDDO

// En algún momento ejecutas la función Paci_Valid
aDim_PAR1 := {}
aDim_PAR2 := {}
Paci_valid(cObj)


//-------------------------------------------------------

FUNCTION Paci_Valid(cObj)
LOCAL nVal := GetProperty( cForm, cObj, 'Value' )
*
IF cObj=='Combo_PRO'
IF nVal>0
SETPROPERTY( cForm, 'Txt_PRO', 'Value', aDim_PRO1[nVal] )
SETPROPERTY( cForm, 'Lbl_PRO_1','Value', aDim_PRO2[nVal] )
MiArea('PAR',1)
&cPAR->(DBSeek((aDim_PRO1[nVal])))
DO WHILE !(&cPAR->(EOF())) .AND. aDim_PRO1[nVal]==&cPAR->PRO
AADD( aDim_PAR1, &cPAR->PAR )
AADD( aDim_PAR2, &cPAR->NOM )
&cPAR->(DBSkip())
..........
El tema es que cada vez que haces un "aDim_PAR1 := {}" en una FUNCTION O PROCEDURE estas definiendo de nuevo a esas variables pero en LOCAL, no da error pero cuando hace la carga no lo realiza sobre la PUBLICA (nuestra original), lo hace sobre la ultima definida (LOCAL).

Espero haberme explicado...,

Vamos con una cervecita fresquita... ;)
Como dijo el gran pensador Hommer Simpson..., - En este mundo solo hay 3 tipos de personas, los que saben contar y los que no. :shock:
User avatar
jorge_riv
Posts: 62
Joined: Thu Nov 22, 2018 2:20 pm
DBs Used: DBF, MySQL,SQL SERVER, Oracle.

Re: The array in COMBOBOX is EMPTY .....

Post by jorge_riv »

El tema es que prove sin poner vacia los array y dejarlas definidas en PUBLIC al principio, y tampoco lo hace, el tema es que las defino como publicas al principio y las lleno en el otro programa y tampoco los toma, es como si al hacer un AADD en Paci_Valid. quedan como locales, es raro- En cambio al definir al principio el array aDim_PRO1 y aDim_PRO2, mientras leo la Base de Datos, esos arrays los toma, y al seleccionar en COMBOBOX una provicia, busco los partidos correspondientes segun el valor del array, y cargo en los arrays de partidos, paraselleccionarlos, pero queda vacio
Post Reply