Page 1 of 1
dudas con Arrays
Posted: Sun Oct 11, 2009 1:50 pm
by mgsoft
Hola:
Tengo dos dudillas, a ver si por favor me podéis ayudar.
Primera, ¿hay alguna función rápida, mejor en C, que carge en un Array el contenido de un campo de una base de datos, para evitar hacer un DO while !eof()?.
Segunda, ¿hay alguna función que elimine los elementos duplicados de un Array?.
Mil gracias.
Re: dudas con Arrays
Posted: Sun Oct 11, 2009 6:44 pm
by Antonio Linares
Re: dudas con Arrays
Posted: Mon Oct 12, 2009 5:04 pm
by mgsoft
Antonio:
Gracias por responder, pero no veo de qué forma.
igualmente, ¿Hay alguna función para cargar el contenido de todo un campo de la DBF en el Array, para evitar esto (por lentitud)?
do while !eof()
aadd (array, FIELD->NOMBRE)
DBSKIP()
ENDDO
Muchas gracias
Re: dudas con Arrays
Posted: Mon Oct 12, 2009 5:19 pm
by Armando
mgsoft:
Disculpa mi ignorancia, cual es la utilidad de cargar toda una DBF (10m 20m o 50m regs) a un array ?
Saludos
Re: dudas con Arrays
Posted: Mon Oct 12, 2009 8:25 pm
by Antonio Linares
DbEval( { || AAdd( array, FIELD->NOMBRE ) } )
recorre toda la DBF y añade el campo al array. Lo mismo que quieres hacer pero desde nivel C.
Re: dudas con Arrays
Posted: Mon Oct 12, 2009 8:26 pm
by mgsoft
Muchas gracias Antonio!!!.
Armando, lo que quiero es usar la clase TAutoGet, y por ejemplo que el programa complete automáticamente los conceptos, los apellidos, la localidad, etc. De ahí la necesidad de tener en un Array el contenido de algunas bases de datos.
El tener un array de varios megas, ¿ralentiza la aplicación?.
Gracias.
Re: dudas con Arrays
Posted: Mon Oct 12, 2009 10:28 pm
by Marcelo Via Giglio
Mgsoft,
perdon por lo entrometido, pero no creo que ganes mucha velocidad, si tienes las tablas DBF con los indices adecuados, el TAutoGet funcionara bastante rapido. Ademas, imagina que tienes frecuentes actualizaciones de esa informacion, deberas tambien actualizar los arrays, y si estuvieras comportiendo la informacion, seria aun mas complejo.
Disculpa el atrevimiento
saludos
Marcelo
Re: dudas con Arrays
Posted: Tue Oct 13, 2009 12:22 pm
by mgsoft
Marcelo:
Por favor, ningún problema en tu comentario, al contrario, pues me queda mucho que aprender.
La clase TAutoGet, hasta donde yo se, únicamente acepta un Array con los valores.
Creo que es muy útil que el programa autocomplete un campo (p. ej. apellidos, localidad, etc). No sé de qué otro modo se puede hacer.
Cualquier comentario será bienvenido. Gracias
Re: dudas con Arrays
Posted: Tue Oct 13, 2009 12:39 pm
by Marcelo Via Giglio
MgSoft,
dejame buscar, yo tengo eso funcionando con base de datos, talvez, no la clase en si, pero de otra forma, por ultimo se modifica la clase.
busco y lo que encuentre lo publico
saludos
Marcelo
Re: dudas con Arrays
Posted: Tue Oct 13, 2009 3:24 pm
by VPOZO
Hola compañero me parece que lo que quieres hacer lo puedes lograr usando el DBCOMBO que hace un combobox con campos de una tabla, busca el ejemplo dbctest.prg o el testdbc1.prg.
ojala te sirva..
Re: dudas con Arrays
Posted: Tue Oct 13, 2009 4:22 pm
by Marcelo Via Giglio
Hola,
mira este codigo, de esta manera lo hice
Code: Select all
REDEFINE BMPGET oGet VAR cResponsable ID 102 OF oDlg BCOLOR CLR_BLACK, CLR_YELLOW ;
UPDATE WHEN ! job $ "anul,del,view,anul";
PICTURE "@!"
oGet:bPostKey := {|oGet, cBuffer| setResponsable( oget ) }
//------------------------------------------------------------------------------
FUNCTION setResponsable( oGet )
//------------------------------------------------------------------------------
LOCAL nPosItem := 0 // Text position into ::aItems
LOCAL nPosCursor := oGet:nPos // Current cursor position
LOCAL nLength := LEN(oGet:cText) // Text length
LOCAL cStartTxt := LEFT(oGet:cText, nPosCursor-1) // Start text (position 1 to cursor position -1)
LOCAL cItem := ""
LOCAL nKey := 0
nKey := oGet:nLastKey
DO CASE
CASE nKey == VK_TAB .or. ;
nKey == VK_RETURN .or. ;
nKey == VK_DELETE
oGet:Assign() // Assign typed text
CASE nKey >= 32 .And. nKey <= 256
responsables -> ( DBEXIST( cStartTxt, "nombre", .T. ) )
cItem := responsables -> nombre
IF LEFT( cItem, LEN(cStartTxt) ) = cStartTxt
nLength := LEN( RTRIM( cItem ) )
cItem += SPACE( nLength - LEN(cItem) )
oGet:SetText( cItem )
oGet:SetSel( nPosCursor -1, nLength) // Select found text
oGet:oGet:Buffer = PAD( cItem, LEN( oGet:oGet:Buffer ))
RETURN(.t.)
ENDIF
oGet:HideSel() // Text not found -> Undo selected text
ENDCASE
RETURN( .T. )
El DBEXIST es una funcion propia, pudes reemplazarla por un DBSEEK. Si te das cuenta esto es parte de la clase de Maurilio, entonces esa misma clase podrias modificarla para que en lugar de utilizar arrays puedas utilizar una tabla, claro que la idea es que se parametrice para generalizar
Espero te ayude.
saludos
Marcelo