Page 1 of 1

ASORT no me ordena

Posted: Wed Nov 16, 2016 12:56 pm
by AidTIC
Buenas a todos,

Estoy con un problema con la funcion ASOFT, de un tiempo a esta parte, no me ordena el array,

Tengo la versión HMG.3.4.3 y el caso es que hace unos días si que me iba.

No se que pueda estar pasando.

he implementado algo el programa , pero nada que le deba afectar.

Gracias

Good morning everyone,

I'm having a problem with the ASOFT function, for a while this part, I do not order the array,

I have version HMG.3.4.3 and the case is that a few days ago if I was leaving.

I do not know what may be happening.

I've implemented the program somewhat, but nothing that should affect it.

Thank you

Re: ASORT no me ordena

Posted: Wed Nov 16, 2016 1:10 pm
by EduardoLuis
Hi AidTic:

Please post a sample to see what is going wrong.-
With regards.
Eduardo

Re: ASORT no me ordena

Posted: Wed Nov 16, 2016 1:29 pm
by esgici
AidTIC wrote: I'm having a problem with the ASOFT function, for a while this part, I do not order the array,
...]
Do you noticed ANSI / Unicode difference ?

Happy HMG'ing :D

Re: ASORT no me ordena

Posted: Wed Nov 16, 2016 1:35 pm
by AidTIC
La verdad es que solo he probado un Unicode.

Esta es la función:


Function SelecEnvios ()
Local aEnvio := {}
Local aCEnv := {}

DO CASE

CASE dTrans->(DBSetOrder()) = "ITEMP" .and. Win_Alert.Label_1.VALUE ="Filtro por Cliente " + CLIENTES->CLI_NOMBRE // indexkey() = "str(CLI_CODIGO)+DTOS(DB_CADUCA)"

EnviarCorreo( "Productos a punto de caducar" , "body.html", "1" , clientes->CLI_CEMAIL ,) // clientes->CLI_CEMAIL )

CASE dTrans->(DBSetOrder()) = "CADUCAN" .or. dTrans->(DBSetOrder()) = "CADUCAR" .or. (dTrans->(DBSetOrder()) = "ITEMP" .and. Win_Alert.Label_1.VALUE = "Oculto Productos Caducados")
dTrans->(DBGOTOP())
aEnvio := {}
While ! dTrans->(Eof())
nDIAS := dTrans->db_caduca - date()
if nDias >= 0 .and. nDias < 31
If dTrans->DB_precli < 0.01
DO CASE
CASE ALLTRIM(dTrans->db_ARTICU) = "Alta Dominio" .OR. ALLTRIM(dTrans->db_ARTICU) = "Renovación de Dominio"
IDet := "Renovación del dominio " + AllTrim(dTrans->db_descri) + " :"
CASE ALLTRIM(dTrans->db_ARTICU) = "IP Dedicada"
IDet := "Renovación de la IP Dedicada " + AllTrim(dTrans->db_descri) + " :"
CASE ALLTRIM(dTrans->db_ARTICU) = "Alojamiento Web"
IDet := "Renovación del Alojamiento " + AllTrim(dTrans->db_descri) + " :"
CASE ALLTRIM(dTrans->db_ARTICU) = "Hosting"
IDet := "Renovación del Hosting " + AllTrim(dTrans->db_descri) + " :"
OTHERWISE
IDet := "Producto " + ALLTRIM(aEnviar [rEnv] [4]) + " " + AllTrim(dTrans->db_descri) + " :"
ENDcase
pventa := InputBox ( IDet , "Precio de Producto a Cero" , "Importe" , , , , 400 )
dTrans->DB_PreCli := VAL(pventa)
EndIf
IF nDIAS < 1 .and. dTrans->db_SNDCNF = "No"
dTrans->db_SNDCNF := "Si"
dTrans->db_SND005 := "Si"
dTrans->db_SND015 := "Si"
dTrans->db_SND030 := "Si"

Aadd( aEnvio , { dTrans->CLI_CODIGO , clientes->CLI_NOMBRE , clientes->CLI_CEMAIL , dTrans->DB_Articu , dTrans->DB_Descri , dTrans->DB_precli , dTrans->db_caduca } )

ElseIF nDIAS < 6 .and. dTrans->db_SND005 = "No"
dTrans->db_SND005 := "Si"
dTrans->db_SND015 := "Si"
dTrans->db_SND030 := "Si"
Aadd( aEnvio , { dTrans->CLI_CODIGO , clientes->CLI_NOMBRE , clientes->CLI_CEMAIL , dTrans->DB_Articu , dTrans->DB_Descri , dTrans->DB_precli , dTrans->db_caduca } )
elseif nDIAS < 16 .and. dTrans->db_SND015 = "No"
dTrans->db_SND015 := "Si"
dTrans->db_SND030 := "Si"
Aadd( aEnvio , { dTrans->CLI_CODIGO , clientes->CLI_NOMBRE , clientes->CLI_CEMAIL , dTrans->DB_Articu , dTrans->DB_Descri , dTrans->DB_precli , dTrans->db_caduca } )
elseif nDIAS < 31 .and. dTrans->db_SND030 = "No"
dTrans->db_SND030 := "Si"
Aadd( aEnvio , { dTrans->CLI_CODIGO , clientes->CLI_NOMBRE , clientes->CLI_CEMAIL , dTrans->DB_Articu , dTrans->DB_Descri , dTrans->DB_precli , dTrans->db_caduca } )
EndIf

Endif
dTrans->(DBSkip())
enddo

trEnv := Len(aEnvio)

If trEnv > 0
ASort(aEnvio)
CliEnv := aEnvio [1] [1]
Aadd( aCEnv , aEnvio [1] )
For ii := 2 to trEnv
msginfo(aEnvio [ii])
IF aEnvio [ii-1] [1] <> aEnvio [ii] [1]
EnviarCorreo( "Productos a punto de caducar" , "body.html", "3" , aEnvio [ii-1] [3] , aCEnv ) // clientes->CLI_CEMAIL )
aCEnv := {}
Endif
Aadd( aCEnv , aEnvio [ii] )
Next ii
EnviarCorreo( "Productos a punto de caducar" , "body.html", "3" , clientes->CLI_CEMAIL , aCEnv ) // clientes->CLI_CEMAIL )
EndIf
OTHERWISE
msginfo (" Envio No Contemplado ")
ENDCASE
Win_Alert.grid_1.Refresh
Return

Re: ASORT no me ordena

Posted: Wed Nov 16, 2016 3:04 pm
by andyglezl
Hola AidTIC

El ejemplo que pongas, debe de ser funcional ya que de otra forma no lo podemos probar...
--------------------------------------------------------------------------------------------------------------
Hi AidTIC

The example that you put, must be functional since otherwise we can not prove ...


Lo siguiente demuestra que la funcion ASort() está funcionando, quizá es algo mas de tu programa.
------------------------------------------------------------------------------------------------------------------------
The following shows that the ASort () function is working, maybe it is something more than your program.

Code: Select all

FUNCTION Sortea() 
LOCAL aPSort:= {}

Aadd( aPSort , "5" ) 
Aadd( aPSort , "1" ) 
Aadd( aPSort , "7" ) 
Aadd( aPSort , "2" ) 
Aadd( aPSort , "9" ) 
Aadd( aPSort , "4" ) 
ASort( aPSort )
MSGDEBUG( aPSort )

RETURN NIL

ASORT no me ordena

Posted: Wed Nov 16, 2016 3:55 pm
by Pablo César
AidTIC wrote:Aadd( aEnvio , { dTrans->CLI_CODIGO , clientes->CLI_NOMBRE , clientes->CLI_CEMAIL , dTrans->DB_Articu , dTrans->DB_Descri , dTrans->DB_precli , dTrans->db_caduca } )

..//..
ASort(aEnvio)
En primero lugar, estás creando un ARRAY multidimensional y para ASort se necesita que sea UNIDIRECCIONAL (un solo campo digamos).
Screen5.png
Screen5.png (10.19 KiB) Viewed 5655 times
Y en segundo precisarias atribuir a otra ARRAY o a la misma con el resultado del ASort.

Ejemplificando de forma sintética:

Code: Select all

aEnvio1:={"001","002,"003",004"}
aEnvio2:={}
AADD(aEnvio2, { dTrans->CLI_CODIGO , clientes->CLI_NOMBRE , clientes->CLI_CEMAIL , dTrans->DB_Articu , dTrans->DB_Descri , dTrans->DB_precli , dTrans->db_caduca } )
SKIP
AADD(aEnvio2, { dTrans->CLI_CODIGO , clientes->CLI_NOMBRE , clientes->CLI_CEMAIL , dTrans->DB_Articu , dTrans->DB_Descri , dTrans->DB_precli , dTrans->db_caduca } )
SKIP
AADD(aEnvio2, { dTrans->CLI_CODIGO , clientes->CLI_NOMBRE , clientes->CLI_CEMAIL , dTrans->DB_Articu , dTrans->DB_Descri , dTrans->DB_precli , dTrans->db_caduca } )
SKIP
AADD(aEnvio2, { dTrans->CLI_CODIGO , clientes->CLI_NOMBRE , clientes->CLI_CEMAIL , dTrans->DB_Articu , dTrans->DB_Descri , dTrans->DB_precli , dTrans->db_caduca } )

aOrdenado:=ASort(aEnvio1)
Despues caberia recomponer tu array multimensional, varriendo aOrdenado y creando otro array con los valores de aEnvio2

Code: Select all

aResultado:={}
For i=1 Len(aOrdenado)
      cBusca:=aOrdenado[i]
      nPosArray:= AScan(aEnvio1,cBusca)
     
      AADD(aResultado,{aEnvio2[1,i],aEnvio2[2,i],aEnvio2[3,i], aEnvio2[4,i]... hasta 7)
aEnvio1 y aEnvio2 seria iguales (en la misma orden de composicion) pero la diferencia es que solo tendrá una columna y aEnvio2 todas las columnas (todos los campos).

Hay otras formas de hacerlo tambien. Esta es la que se me ocurrio ahora. Fijate aEnvio1 que yo utilizo string para campos numéricos y de preferencia con StrZero(dTrans->CLI_CODIGO,4,0) el 4 es por asi decir el tamaño máximo, puede ser otro valor para que lo arrebiente con la capacidad máxima. Pero al hacerlo con ceros es más seguro que hacer con espacios vacios.

AidTIC, como es tu nombre ? Seria bueno, que en tu próximos mensajes coloques tus códigos entre la TAG Code, asi se puede leer mejor.

Espero que hayas podido entenderme. Sinó posteá tu código y tus dudas.

Re: ASORT no me ordena

Posted: Wed Nov 16, 2016 4:25 pm
by srvet_claudio
Los array multidimensional se ordenan pasando un cb a Asort, ej

Code: Select all

bSort := {|a,b| a [3] > b [3]}

Re: ASORT no me ordena

Posted: Wed Nov 16, 2016 5:54 pm
by AidTIC
srvet_claudio wrote:Los array multidimensional se ordenan pasando un cb a Asort, ej

Code: Select all

bSort := {|a,b| a [3] > b [3]}

Que quieres decir con "cb"

ASORT no me ordena

Posted: Wed Nov 16, 2016 6:08 pm
by Pablo César
AidTIC wrote:Que quieres decir con "cb"
cb = CodeBlock, Sr. AidTIC

Parece que fué lo único que te importó... :o

Lo tendré en cuenta for next time...

Re: ASORT no me ordena

Posted: Wed Nov 16, 2016 6:12 pm
by AidTIC
Solucionado,

Code: Select all

[color=#000080] ASort(aEnvio ,,, {| x, y | x [1] <y [1]})[/color]
No había caído en los array multidimensional . Muchas gracias por vuestro tiempo y sabiduría.

Por cierto mi nombre es Martin.