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
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!!!