Ordenar Dataset

Foro público de Xailer en español
Responder
Avatar de Usuario
XeviCOMAS
Mensajes: 586
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: 9256
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: 586
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: 586
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: 5707
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: 586
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: 586
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: 586
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: 586
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: 586
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