Page 1 of 1

Ordenar Dataset

Posted: Wed Apr 10, 2019 9:45 am
by 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

Code: Select all

      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

Posted: Wed Apr 10, 2019 10:40 am
by ignacio
Échale un vistazo a:

https://dev.mysql.com/doc/refman/8.0/en/regexp.html#function_regexp-replace

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

Saludos

Re: Ordenar Dataset

Posted: Wed Apr 10, 2019 3:25 pm
by 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

Posted: Wed Apr 10, 2019 6:18 pm
by XeviCOMAS
Cada cosa que toco, SQL me sorprende más y más!!!

Code: Select all

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

Posted: Wed Apr 10, 2019 7:09 pm
by jfgimenez
Xevi,

prueba con:

Code: Select all

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

Re: Ordenar Dataset

Posted: Wed Apr 10, 2019 7:27 pm
by 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

Posted: Wed Apr 10, 2019 7:38 pm
by 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

Posted: Wed Apr 10, 2019 7:41 pm
by 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

Posted: Tue Apr 16, 2019 11:04 am
by 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

Posted: Tue Apr 16, 2019 3:39 pm
by XeviCOMAS
::oDSTable:Sort( "xCIFreal(dni)" )

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