Página 1 de 1

Ordenar Dataset

Publicado: Mié Abr 10, 2019 9:45 am
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

Re: Ordenar Dataset

Publicado: Mié Abr 10, 2019 10:40 am
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

Re: Ordenar Dataset

Publicado: Mié Abr 10, 2019 3:25 pm
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.

Re: Ordenar Dataset

Publicado: Mié Abr 10, 2019 6:18 pm
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.

Re: Ordenar Dataset

Publicado: Mié Abr 10, 2019 7:09 pm
por jfgimenez
Xevi,

prueba con:

Código: Seleccionar todo

REGEXP_REPLACE( dni, '[^0-9,A-Z]', '' )

Re: Ordenar Dataset

Publicado: Mié Abr 10, 2019 7:27 pm
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.

Re: Ordenar Dataset

Publicado: Mié Abr 10, 2019 7:38 pm
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

Re: Ordenar Dataset

Publicado: Mié Abr 10, 2019 7:41 pm
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!!!

Re: Ordenar Dataset

Publicado: Mar Abr 16, 2019 11:04 am
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???

Re: Ordenar Dataset

Publicado: Mar Abr 16, 2019 3:39 pm
por XeviCOMAS
::oDSTable:Sort( "xCIFreal(dni)" )

Llamando a mi función, ordena el Browse a gusto!!!