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
User avatar
XeviCOMAS
Posts: 503
Joined: Sat Mar 12, 2011 8:16 pm

Ordenar Dataset

Postby XeviCOMAS » Wed Apr 10, 2019 9:45 am

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
Un Saludo,
Xevi.
User avatar
ignacio
Site Admin
Posts: 8509
Joined: Mon Apr 06, 2015 8:00 pm
Location: Madrid, Spain
Contact:

Re: Ordenar Dataset

Postby ignacio » Wed Apr 10, 2019 10:40 am

É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
Ignacio Ortiz de Zúñiga
[Equipo de Xailer / Xailer team]
http://www.xailer.com
http://www.xailer.info
User avatar
XeviCOMAS
Posts: 503
Joined: Sat Mar 12, 2011 8:16 pm

Re: Ordenar Dataset

Postby XeviCOMAS » Wed Apr 10, 2019 3:25 pm

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.
User avatar
XeviCOMAS
Posts: 503
Joined: Sat Mar 12, 2011 8:16 pm

Re: Ordenar Dataset

Postby XeviCOMAS » Wed Apr 10, 2019 6:18 pm

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.
Un Saludo,
Xevi.
User avatar
jfgimenez
Site Admin
Posts: 5614
Joined: Mon Apr 06, 2015 8:48 pm
Contact:

Re: Ordenar Dataset

Postby jfgimenez » Wed Apr 10, 2019 7:09 pm

Xevi,

prueba con:

Code: Select all

REGEXP_REPLACE( dni, '[^0-9,A-Z]', '' )
José F. Giménez
[Equipo de Xailer / Xailer team]
http://www.xailer.com
http://www.xailer.info
User avatar
XeviCOMAS
Posts: 503
Joined: Sat Mar 12, 2011 8:16 pm

Re: Ordenar Dataset

Postby XeviCOMAS » Wed Apr 10, 2019 7:27 pm

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.
User avatar
XeviCOMAS
Posts: 503
Joined: Sat Mar 12, 2011 8:16 pm

Re: Ordenar Dataset

Postby XeviCOMAS » Wed Apr 10, 2019 7:38 pm

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.
User avatar
XeviCOMAS
Posts: 503
Joined: Sat Mar 12, 2011 8:16 pm

Re: Ordenar Dataset

Postby XeviCOMAS » Wed Apr 10, 2019 7:41 pm

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.
User avatar
XeviCOMAS
Posts: 503
Joined: Sat Mar 12, 2011 8:16 pm

Re: Ordenar Dataset

Postby XeviCOMAS » Tue Apr 16, 2019 11:04 am

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.
User avatar
XeviCOMAS
Posts: 503
Joined: Sat Mar 12, 2011 8:16 pm

Re: Ordenar Dataset

Postby XeviCOMAS » Tue Apr 16, 2019 3:39 pm

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

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

Return to “Spanish”