In order for this site to work correctly we need to store a small file (called a cookie) on your computer. Most every site in the world does this, however since the 25th of May 2011, by law we have to get your permission first. Please abandon the forum if you disagree.

Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.

Ordenar Dataset

Foro público de Xailer en español
Responder
Avatar de Usuario
XeviCOMAS
Mensajes: 582
Registrado: Sab Mar 12, 2011 8:16 pm

Ordenar Dataset

Mensaje por XeviCOMAS »

Necesito ordenar un Dataset por un campo, pero "limpio"... me explico.

Resulta que los NIF/CIF cada uno los va entrando a su gusto.
Alguien me los entra LetraGuionNumeros
Otros LetraBarraNumeros
O incluso NumerosPuntosNumerosGuionLetra

Pues necesito Ordenar ese campo quitando puntos, guiones, barras... vaya, TODO lo que no sea o letra o número.

Hasta mis DBFs, utilizo un índice que llama una función

Código: Seleccionar todo

      INDEX ON Upper(xCIFreal(Field->DNI)) TAG "CLIEN03"
...
FUNCTION xCIFreal( c )
   Local c2 := "", c3, n, n2 := Len(c)
   For n:=1 to n2
      c3 := SubStr( c, n, 1)
      If Upper(c3) $ "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
         c2 += c3
      EndIf
   Next
Return PadR( Upper(c2), n2, " " )
Pero con los DataSets, tirando de MariaDB, pues que no se como hacerlo.

Algo como :Sort( xCIFreal(DNI) ) //Esto ordena por DNI sin tener en cuenta la función xCIFreal()

Gracias por vuestro tiempo
Un Saludo,
Xevi.
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9246
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Re: Ordenar Dataset

Mensaje por ignacio »

Échale un vistazo a:

https://dev.mysql.com/doc/refman/8.0/en ... xp-replace

Otra opción: Utiliza un QueryArray() y luego ASort( aData,, {|x,y| MiFuncion( x,y) }

Saludos
Ignacio Ortiz de Zúñiga
[Equipo de Xailer / Xailer team]
https://www.xailer.com
Avatar de Usuario
XeviCOMAS
Mensajes: 582
Registrado: Sab Mar 12, 2011 8:16 pm

Re: Ordenar Dataset

Mensaje por XeviCOMAS »

Ignacio, gracias por el apunte.

de esta manera, consigo ordenar correctamente el TDBBrowse que tiene asignado un TDataSet
::oDSTable:Sort( "REGEXP_REPLACE( REGEXP_REPLACE( dni, '-', '' ), '/', '' )" )

pero claro, hay una lista muy extensa de caracteres que deberia ir "anidando" en funciones REGEXP_REPLACE()... además, de que hay algun caracter como la barra \ que da error al correr o el punto . que hace que no se ordene correctamente el DataSet.

El tema está en que lo hago directamente en el Dataset, y no se como se podria hacer como comentas con un QueryArray y que éste esté vinculado a esa columna del DBBrowse... no se si me explico.

Se puede hacer un bucle o hacer recursiva una parte del la sentencia SQL???
Se puede llamar a una función de usuario desde la sentencia SQL ???


Gracias por vuestro tiempo.
Un Saludo,
Xevi.
Avatar de Usuario
XeviCOMAS
Mensajes: 582
Registrado: Sab Mar 12, 2011 8:16 pm

Re: Ordenar Dataset

Mensaje por XeviCOMAS »

Cada cosa que toco, SQL me sorprende más y más!!!

Código: Seleccionar todo

BEGIN
	SET @cNifReal = '';
	SET @cLectura = Upper(SUBSTRING(rtf,1,1));
	IF InStr( 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', @cLectura ) THEN
		SET @cNifReal = CONCAT( @cNifReal, @cLectura );
	END IF;
	SET @cLectura = Upper(SUBSTRING(rtf,2,1));
	IF InStr( 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', @cLectura ) THEN
		SET @cNifReal = CONCAT( @cNifReal, @cLectura );
	END IF;
	SET @cLectura = Upper(SUBSTRING(rtf,3,1));
	IF InStr( 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', @cLectura ) THEN
		SET @cNifReal = CONCAT( @cNifReal, @cLectura );
	END IF;
	SET @cLectura = Upper(SUBSTRING(rtf,4,1));
	IF InStr( 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', @cLectura ) THEN
		SET @cNifReal = CONCAT( @cNifReal, @cLectura );
	END IF;
	SET @cLectura = Upper(SUBSTRING(rtf,5,1));
	IF InStr( 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', @cLectura ) THEN
		SET @cNifReal = CONCAT( @cNifReal, @cLectura );
	END IF;
	SET @cLectura = Upper(SUBSTRING(rtf,6,1));
	IF InStr( 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', @cLectura ) THEN
		SET @cNifReal = CONCAT( @cNifReal, @cLectura );
	END IF;
	SET @cLectura = Upper(SUBSTRING(rtf,7,1));
	IF InStr( 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', @cLectura ) THEN
		SET @cNifReal = CONCAT( @cNifReal, @cLectura );
	END IF;
	SET @cLectura = Upper(SUBSTRING(rtf,8,1));
	IF InStr( 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', @cLectura ) THEN
		SET @cNifReal = CONCAT( @cNifReal, @cLectura );
	END IF;
	SET @cLectura = Upper(SUBSTRING(rtf,9,1));
	IF InStr( 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', @cLectura ) THEN
		SET @cNifReal = CONCAT( @cNifReal, @cLectura );
	END IF;
	SET @cLectura = Upper(SUBSTRING(rtf,10,1));
	IF InStr( 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', @cLectura ) THEN
		SET @cNifReal = CONCAT( @cNifReal, @cLectura );
	END IF;
	SET @cLectura = Upper(SUBSTRING(rtf,11,1));
	IF InStr( 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', @cLectura ) THEN
		SET @cNifReal = CONCAT( @cNifReal, @cLectura );
	END IF;
	SET @cLectura = Upper(SUBSTRING(rtf,12,1));
	IF InStr( 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', @cLectura ) THEN
		SET @cNifReal = CONCAT( @cNifReal, @cLectura );
	END IF;
	RETURN @cNifReal;
END
Funciona!!!
Pero, cómo lo puedo simplificar y hacerlo en un bucle, For...Next ???

Gracias por vuestro tiempo.
Un Saludo,
Xevi.
Avatar de Usuario
jfgimenez
Site Admin
Mensajes: 5705
Registrado: Lun Abr 06, 2015 8:48 pm
Contactar:

Re: Ordenar Dataset

Mensaje por jfgimenez »

Xevi,

prueba con:

Código: Seleccionar todo

REGEXP_REPLACE( dni, '[^0-9,A-Z]', '' )
José F. Giménez
[Equipo de Xailer / Xailer team]
http://www.xailer.com
http://www.xailer.info
Avatar de Usuario
XeviCOMAS
Mensajes: 582
Registrado: Sab Mar 12, 2011 8:16 pm

Re: Ordenar Dataset

Mensaje por XeviCOMAS »

Gracias, José.

Esto va perfectíssimo!!!

Ahora bien, para poder profundizar en alguna función propia en SQL,...
Cómo haria esa funcióncilla que he puesto, en un bucle???
Es por ir entendiendo y desarrollando más en SQL.

Gracias por vuestro tiempo.
Un Saludo,
Xevi.
Avatar de Usuario
XeviCOMAS
Mensajes: 582
Registrado: Sab Mar 12, 2011 8:16 pm

Re: Ordenar Dataset

Mensaje por XeviCOMAS »

Ahora me he fijado bien... no "discrimina" letras may/minusculas.

No me sirve 100%

Con mi funcioncilla, si que devuelvo orden discriminando donde B es lo mismo que b
Un Saludo,
Xevi.
Avatar de Usuario
XeviCOMAS
Mensajes: 582
Registrado: Sab Mar 12, 2011 8:16 pm

Re: Ordenar Dataset

Mensaje por XeviCOMAS »

Echo!!!

Fijándome en lo que hace la funcion REGEXP_REPLACE( dni, '[^0-9,A-Z]', '' )

Añado un Upper...
REGEXP_REPLACE( Upper(dni), '[^0-9,A-Z]', '' )

Y listo el pollo, que dirian!!!

GRACIAS!!!
Un Saludo,
Xevi.
Avatar de Usuario
XeviCOMAS
Mensajes: 582
Registrado: Sab Mar 12, 2011 8:16 pm

Re: Ordenar Dataset

Mensaje por XeviCOMAS »

Una cosa que me faltaria...

Para ordenar "temporalmente" un TDataset MariaDB me funciona de lujo...
::oDSTable:Sort( "REGEXP_REPLACE( Upper(dni), '[^0-9,A-Z]', '' )" )

Pero, para un TDBFDataset... cómo sería una función que quitara todos los caracteres que no se corresponden a 0-9 A-Z ???


Puedo ir haciendo StrTran...
::oDSTable:Sort( "Upper( StrTran( StrTran( StrTran( StrTran(dni,'/',''), '-', '' ), '.', '' ), '\', '' ) ) )

Pero no es lo suyo... alguna función harbour que no conozco para ese menester???
Un Saludo,
Xevi.
Avatar de Usuario
XeviCOMAS
Mensajes: 582
Registrado: Sab Mar 12, 2011 8:16 pm

Re: Ordenar Dataset

Mensaje por XeviCOMAS »

::oDSTable:Sort( "xCIFreal(dni)" )

Llamando a mi función, ordena el Browse a gusto!!!
Un Saludo,
Xevi.
Responder