ARRAY -- ESTOY BLOQUEADO..

HMG en Español

Moderator: Rathinagiri

User avatar
SALINETAS24
Posts: 667
Joined: Tue Feb 27, 2018 3:06 am
DBs Used: DBF
Contact:

ARRAY -- ESTOY BLOQUEADO..

Post by SALINETAS24 »

Hola a todos.
Os pongo en antencedentes.
Tengo un array multidimensional, que en un principio puede tener el siguiente formato
aItem:=ARRAY(100,10)
Pero es un momento determinado tiene que tener, el numero de filas Y de columnas se tienen que modificar, hacer más grande o más pequeño, incluso borrando todos sus valores.
He utilizado ACLONE, usando para ello una nueva MATRIZ a la que clono a la antigua pero el resultado no es correcto, ya que al hacerlo en una funcion, y la nueva matriz esta declarada en LOCAL.., se copia tambien esta caracteristicas y pierdo los datos.

No recuerdo ahora mismo como inicializar Matrices o redimensionarlas. :mrgreen:

Muchas gracias y vamos con una cervecita...
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
SALINETAS24
Posts: 667
Joined: Tue Feb 27, 2018 3:06 am
DBs Used: DBF
Contact:

Re: ARRAY -- ESTOY BLOQUEADO..

Post by SALINETAS24 »

Hola.., este trozo de codigo no me funciona.
Es muy simple.., leo los campos de un fichero, que cargo en una Array de una dimensión. Una vez cargado lo paso a la matriz.
El primer registro lo carga bien, pero a partir de entonces no lo hace .., y desconozco el motivo.

Code: Select all

	// --> Inicializo valores
	_aPongo:={.t.,.t.,.f.}      // Selecciona campos 
	_aItem:={}
	(cAlias)->(DbGotop() )
	nCont:=1
	DO WHILE !(cAlias)->( Eof()) 
		nPos:=1
		FOR nFor=1 TO len(_aPongo)
			IF _aPongo[nFor]
				aGrid [nPos] :=( (cAlias)->(FIELDGET(nFor)) )
				nPos ++
			ENDIF
		NEXT

		msgbox(aGrid,len(aGrid))
		AADD(_aItem, aGrid )                  // --> ESTO NO CARGA
		msgdebug(_aItem)
		
		(cAlias)->(DbSkip())
	ENDDO
errortabla.JPG
errortabla.JPG (24.43 KiB) Viewed 3048 times
Gracias de antemano por la ayuda, y vamos con la cervecita...
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
AUGE_OHR
Posts: 2061
Joined: Sun Aug 25, 2019 3:12 pm
DBs Used: DBF, PostgreSQL, MySQL, SQLite
Location: Hamburg, Germany

Re: ARRAY -- ESTOY BLOQUEADO..

Post by AUGE_OHR »

SALINETAS24 wrote: Mon Dec 09, 2019 10:58 pm

Code: Select all

	FOR nFor=1 TO len(_aPongo)
		IF _aPongo[nFor]
			aGrid [nPos] :=( (cAlias)->(FIELDGET(nFor)) )
			nPos ++
		ENDIF
	NEXT
as i understand you have a 2-DIM Array so i guess it must be

Code: Select all

			aGrid [nFor][nPos] :=( (cAlias)->(FIELDGET(nFor)) )
have fun
Jimmy
User avatar
andyglezl
Posts: 1461
Joined: Fri Oct 26, 2012 7:58 pm
Location: Guadalajara Jalisco, MX
Contact:

Re: ARRAY -- ESTOY BLOQUEADO..

Post by andyglezl »

Maybe...

Code: Select all

	aGrid := {}
	DO WHILE !(cAlias)->( Eof()) 
		AADD( aGrid, { (cAlias)->( FIELDGET( 1) ), (cAlias)->( FIELDGET( 2 ) )  } )
		(cAlias)->(DbSkip())
	ENDDO
Andrés González López
Desde Guadalajara, Jalisco. México.
User avatar
SALINETAS24
Posts: 667
Joined: Tue Feb 27, 2018 3:06 am
DBs Used: DBF
Contact:

Re: ARRAY -- ESTOY BLOQUEADO..

Post by SALINETAS24 »

Hola AUGE_ORG, muchas gracias por contestar
AUGE_OHR wrote: Mon Dec 09, 2019 11:48 pm

Code: Select all


as i understand you have a 2-DIM Array so i guess it must be
[code]			aGrid [nFor][nPos] :=( (cAlias)->(FIELDGET(nFor)) )
Tengo un Array de 1-DIM, que cargo con campos que obtengo de una DBF, y posteriormente esos valores tienen que pasar a un Array de de 2-DIM. El gran problema es que desconozco la cantidad de filas y columnas que necesitaré ya que la selección de campos la realiza el usuario, por lo tanto no puedo hace un DIM en el aGrid como tu propones

Hola AndyGlez, muchas gracias por contestar..
andyglezl wrote: Tue Dec 10, 2019 12:40 am Maybe...

Code: Select all

	aGrid := {}
	DO WHILE !(cAlias)->( Eof()) 
		AADD( aGrid, { (cAlias)->( FIELDGET( 1) ), (cAlias)->( FIELDGET( 2 ) )  } )
		(cAlias)->(DbSkip())
	ENDDO
El problema Andy, como he comentado con AUGE es que el numero del FIELGET lo desconozco, es una selección que realiza el usuario de los campos del DBF, y como quiero que la función trabaje con cualquier DBF, tampoco se el numero de campos que tiene la DBF, por eso utilizo el ARRAY _aPongo, el cual contiene .T. o .F. , dependiendo que el usuario quiera ver ese campo o no quiera verlo.

He estado realizando algunas pruebas y la verdad es que no entiendo, si hago la asignación del valor a mano, si que puedo traspasar el dato sin problemas de un ARRAY de 1 DIM, a otro ARRAY de 2 DIM , pero cuando lo leo con el FIELGET..., no funciona...

Code: Select all


local  cCadena [4]
local aItems := {}
	//--> Asigno valores ARRAY 1 DIM
	  cCadena[1]:="primera"
	  cCadena[2]:=2
	  cCadena[3]:=3
	  cCadena[4]:=DATE()
	  // --> Paso valores ARRA1 1 DIM  a ARRAY 2 DIM
  	  AADD (aItems, cCadena )
  	  // --> Resultado OK
	  msgdebug(aItems)
	  //--> Asigno valores ARRAY 1 DIM DE OTRA FORMA
	   cCadena:={"Carrot",        5, 30, DATE()+1 }
	     // --> Paso valores ARRA1 1 DIM  a ARRAY 2 DIM
          AADD (aItems, cCadena )
            // --> Resultado OK
	  msgdebug(aItems)
	  
 

Imaginate que quieres cargar en un GRID una DBF, pero los campos a mostrar los ha seleccionado previamente el usuario, para ver solo lo que el usuario quiera verr.., puede ser el 1, 2,5, 7, 10...., o solo el 3 y 4 ¿como lo cargo..?

Muchas gracias por vuestra ayuda...,
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
SALINETAS24
Posts: 667
Joined: Tue Feb 27, 2018 3:06 am
DBs Used: DBF
Contact:

Re: ARRAY -- ESTOY BLOQUEADO..

Post by SALINETAS24 »

Otra cosa mas.
Si la asignación la hago asi

Code: Select all

	  cCadena:={"Carrot",        5, 30, DATE()+1 }
	  AADD (aItems, cCadena )
	  cCadena:={"pepe",        5, 30, DATE()+1 }
	  AADD (aItems, cCadena )
	  cCadena:={"antonio",        5, 30, DATE()+1 }
	  AADD (aItems, cCadena )
	   msgdebug(aItems)
el resultado es correcto, pero si lo hago así....

Code: Select all

	  cCadena[1]:="primera"
	  cCadena[2]:=2
	  cCadena[3]:=3
	  cCadena[4]:=DATE()
  	  msgbox(cCadena)
      AADD (aItems, cCadena )
	  msgdebug(aItems)
	  cCadena[1]:="dos"
	  cCadena[2]:=2
	  cCadena[3]:=3
	  cCadena[4]:=DATE()
  	  msgbox(cCadena)
      AADD (aItems, cCadena )
	  msgdebug(aItems)
	  cCadena[1]:="tres"
	  cCadena[2]:=2
	  cCadena[3]:=3
	  cCadena[4]:=DATE()
  	  msgbox(cCadena)
      AADD (aItems, cCadena )
	  msgdebug(aItems)
	  cCadena[1]:="fort"
	  cCadena[2]:=2
	  cCadena[3]:=3
	  cCadena[4]:=DATE()
  	  msgbox(cCadena)
      AADD (aItems, cCadena )
	  msgdebug(aItems)
EL RESULTADO ES INCORRECTO..., ¿ALGUIEN SABE EL MOTIVO DEL ERROR..?
¿COMO PUEDO PASAR UN ARRAY DE 1 DIM A UNA MATRIZ DE 2 DIM...?
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
AUGE_OHR
Posts: 2061
Joined: Sun Aug 25, 2019 3:12 pm
DBs Used: DBF, PostgreSQL, MySQL, SQLite
Location: Hamburg, Germany

Re: ARRAY -- ESTOY BLOQUEADO..

Post by AUGE_OHR »

hi,

now i understand what you want.
you need a Picklist for FIELD of DBF and use Result for GRID
Picklist.jpg
Picklist.jpg (22.69 KiB) Viewed 3003 times
this a CLASS in Xbase++ but it is "just" 2 x Listbox to select Field of DBF

---

not know how much you have so i tell the hole Story which i use

Code: Select all

   ::aBroFields := ::oPG:MultidbStruct( ::cTable ) // same as DbStruct() but for my SQL CLASS
   IF LEN( ::aBroFields ) > 0
      ::SelectFields()
this Array i have to prepare for Picklist.

as i want fo fill a Listbox it is just 1-DIM

Code: Select all

METHOD PGUDialog:SelectFields()
LOCAL aSingle := {}
LOCAL aResult
LOCAL i, iMax
LOCAL nPosi
LOCAL aClone

   iMax := LEN( ::aBroFields )
   IF iMax > 0
      aClone := ACLONE( ::aBroFields )
      // reduce Array to 1-DIM for Listbox of PickList
      aSingle := AEVAL( aClone, { | a, i | a := a[ DBS_NAME ] },,, .T. )
      
      aResult := PickList( ::drawingArea, aSingle, "Picklist Dialog", "Available", "Select" )
      IF LEN( aResult ) > 0
         FOR i := iMax TO 1 STEP - 1 // start with highest Element
               nPosi := ASCAN( aResult, { | x | x = ::aBroFields[ i ] [ DBS_NAME ] } )
               IF nPosi > 0
               ELSE
                  // remove unwanted Field  
                  AREMOVE( ::aBroFields, i )
               ENDIF
            ENDIF
         NEXT
      ENDIF
   ENDIF
RETURN self
my Technique is to remove unwanted Field from Array.

now last Step what you are searching for (hope so)

Code: Select all

   aData := {}
   aWide := {}
   aType := {}  
   aCrtl := {}  
   iMax := LEN( ::aBroFields )
   IF iMax > 0
      ::OutMsg( "used Fields for Column :" + CRLF )
      FOR i := 1 TO iMax
         AADD(aData := ::aBroFields[ i ] [ DBS_NAME ] )
         AADD(aWide := ::aBroFields[ i ] [ DBS_LEN  ] * 8 )
         AADD(aType := ::aBroFields[ i ] [ DBS_TYPE ] )
         // check Type 
         // { 'CHECKBOX' , 'Yes' , 'No' },{'TEXTBOX','CHARACTER'},{'TEXTBOX','NUMERIC'},{'TEXTBOX','DATE'}
         // AADD(aCrtl, {...} )
      NEXT

      DEFINE GRID GRID_1
         ...
         COLUMNFIELDS aData
         HEADERS      aData
         WIDTHS       aWide
         COLUMNCONTROLS { aCrtl }
have fun
have fun
Jimmy
martingz
Posts: 395
Joined: Wed Nov 18, 2009 11:14 pm
Location: Mexico

Re: ARRAY -- ESTOY BLOQUEADO..

Post by martingz »

Salinetas no se si entendi bien, pero te envio algo que hice rapido , espero que te de una idea, como te digo no estoy seguro de que entendi bien lo que necesitas, el cpodigo se puede mejorar



saludos
Attachments
Gridprueba.zip
(3.29 KiB) Downloaded 155 times
martingz
Posts: 395
Joined: Wed Nov 18, 2009 11:14 pm
Location: Mexico

Re: ARRAY -- ESTOY BLOQUEADO..

Post by martingz »

Se me ha olvidado tienes que dar click en el encabezado de las columnas que quieres agregar al nuevo array


saludos
User avatar
SALINETAS24
Posts: 667
Joined: Tue Feb 27, 2018 3:06 am
DBs Used: DBF
Contact:

Re: ARRAY -- ESTOY BLOQUEADO..

Post by SALINETAS24 »

Hola Auge...,
AUGE_OHR wrote: Tue Dec 10, 2019 8:27 am hi,

now i understand what you want.
you need a Picklist for FIELD of DBF and use Result for GRID
Picklist.jpg
Efectivamente.., pero quiero desligar totalmente el DBF, por lo que tengo que cargar el resultado en un MATRIZ, con el fin de mejorar los tiempos de trabajo en RED

Y TACHAAAAAAAN!!!!!

Conseguido.....

Sabia que era una tontería..., pero la respuesta a mi problema es ... 8-)

Code: Select all

	  cCadena[1]:="tres"
	  cCadena[2]:=2
	  cCadena[3]:=3
	  cCadena[4]:=DATE()

	  AADD(_aItem, aclone(cCadena) )
Ahora el usuario ya puede seleccionar que campos quiere que se le muestren y en lugar de vincular una DBF con 10000 registros, lo puedo paginar.., y puedo cargar de 1000 en 1000.., por ejemplo.

Gracias martingz, no he comprobado tu ejemplo, pero le doy un vistazo con mucho gusto.

Y los dicho.., vamos con una ronda de cervecita fresquita que esta la pago yo.....(virtualmente se entiende..!!) :lol:
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:
Post Reply