Page 1 of 2
Ordenamiento de una Tabla usando SORT
Posted: Tue May 20, 2008 7:05 pm
by fespinoza
Tengo una aplicación para elaborar la tabla de posiciones de un torneo de futbol, el orden es Descendente, en primer lugar por los puntos obtenidos, luego el gol diferencia y luego los goles anotados; pero me pasa algo raro cuando quiero ordenar la tabla. Ver el grafico
Entre la posición 5 y 6 veran que el club AUCAS tiene 11 puntos y -2 de gol diferencia y L.D.U. CUENCA tiene el mismo puntaje y 0 de gol diferencia; lo correcto es que L.D.U. CUENCA este en quinto lugar y AUCAS en _ lugar, pero no es así; y pasa así siempre que se hallan dos equipos con el mismo puntaje, el orden por gol diferencia no funciona bien; así un +7 o un -7 siempre sale superior a un +3; y solo debería ser para el primer valor; el -7 debería ser menos que el -3, pero no.
El código que uso para ordenar el archivo es el siguiente:
SORT ON PTOS /D, G_D /D, G_F /D TO &RUTTAB.TBLAORDE
Cuando usaba FW2.7 en 16 bites, con el mismo codigo el ordenamiento se realizaba de forma correcta, pero ahora con 32 bits no funciona. Alguien me puede aclarar esto?
Saludos
Fernando Espinoza
[/img]
Posted: Tue May 20, 2008 8:53 pm
by Armando
Fernando:
Intenta cambiando el orden del sort de /D a /A
SORT ON PTOS /D, G_D /A, G_F /D TO &RUTTAB.TBLAORDE
Saludos
Posted: Tue May 20, 2008 9:18 pm
by fespinoza
Armando
El problema esta en que cuando los números en G_D son positivos si ordena bien , primero el mayor luego el menor (ejemplo primero 7 luego 3), pero si uno de los dos es negativo se pone primero el negativo y luego el positivo (ejemplo primero -3 luego 2); y si los dos son negativos; primero se pone el negativo mas alto (ejemplo, primero -7 luego -2).
Es decir, pareciera que primero saca un valor absoluto de G_D o lo hace positivo y luego ordena.
Saludos
Fernando Espinoza
Posted: Tue May 20, 2008 9:43 pm
by Armando
Fernando:
Ummm, pareciera un bug de [x]Harbour, intenta creando un índice por los _ que haces el sort, ademas al hacer el sort estas creando una nueva DBF que te consume espacio en disco aunque por lo que veo no son muchos registros.
Saludos
Posted: Tue May 20, 2008 10:31 pm
by horacio
Una preguntonta : _ son numéricos ???
Saludos
Posted: Wed May 21, 2008 12:53 pm
by fespinoza
Si, son campos numericos. Me inclino por lo que dice Armando, debe ser un bug de xHarbour.
Posted: Wed May 21, 2008 1:29 pm
by ADBLANCO
HAS INTENTADO CON INDICES? ASÍ COMO:
INDEX ON STR(PTOS,4,0)+STR(G_D,4,0)+STR(G_F,4,0) TO &RUTTAB.TBLAORDE DESCEND
Ordenamiento de una Tabla usando SORT (RESUELTO)
Posted: Wed May 21, 2008 2:00 pm
by fespinoza
Efectivamente usando INDICES se puede resolver el problema, pero sería bueno que alguien reporte este Bug a Harbour.
Posted: Wed May 21, 2008 3:32 pm
by leandro
fespinoza
Que mas amigo como estas?, que pena menterme en la conversación, te cuento que yo tambien estoy desarrollando una aplicación para controlar los datos de un torneo de futbol, he logrado hacer todo casi todo automático .... si quieres hecha un vistazo en ...
www.asodexincodemar.org
busca el link campeonato y ahi esta todo...
Pero definitivamente hay una sola cosa que no he podido hacer, el fixture (o Programación de las fechas), me funciona bien si hay ocho equipos... De casualidad tu haz hecho algo asi.... me podrias lanzar el salvavidas para sacar eso adelante?
Posted: Wed May 21, 2008 6:13 pm
by fespinoza
Leandro
Revise tu página, si bien mi sistema tiene casi lo mismo, yo no elaboro un fixture sino que voy ingresando los datos partido a partido, porque el fixture es conocido de antemano por todos.
Saludos
Posted: Fri May 23, 2008 1:44 am
by leandro
Amigo... Primero que todo gracias por responder....
Pero creo que no me hice entender. Como haces para generar los cruces de los partidos por ejemplo :
Primera Fecha
Equipo A Vs. Equipo B
Equipo C Vs. Equipo D
Segunda Fecha
Equipo A Vs. Equipo C
Equipo B Vs. Equipo D
Tercera Fecha
Equipo A Vs. Equipo D
Equipo B vs. Equipo C
Eso es lo que no he podido hacer... De casualidad me puedes ayudar con eso?
El codigo que tengo es el siguiente:
Code: Select all
*******************************************
*GENERA LA TABLA DE POSICIONES Y EL FIXTURE
*******************************************
PROC GenerarFix
desde=1
nequipos:=oRs:RecordCount()
equipo:="Equipo Numero "
fechas:=nequipos-1
tablafecha:=nequipos-1
TRY
oConJug:=toleauto():new("adodb.connection")
CATCH oError
MsgStop( "No se ha podido crear la conexión !", "Error de datos")
RETURN(.F.)
END
oConJug:ConnectionString:="Driver={MySQL ODBC 3.51 Driver};Server="+cHost+";Port="+nPuerto+";User="+cUsuario+";Password="+cPassword+";Option=3;"
TRY
oConJug:Open()
CATCH oError
MsgStop( "No pude abrir la conexión para crear las tablas !", "Error de datos")
RETURN(.F.)
END
cCommandSql := "USE asodexin_equipos"
TRY
oConJug:Execute(cCommandSql)
CATCH oError
MsgStop("No se pudo seleccionar la base de datos")
END
cQuery := "CREATE TABLE IF NOT EXISTS posiciones "
cQuery += "("
cQuery += "consec INTEGER(10) NOT NULL AUTO_INCREMENT,"
cQuery += "alias VARCHAR(50) NULL ,"
cQuery += "nombre VARCHAR(50) NULL,"
cQuery += "puntos INTEGER(10) NULL ,"
cQuery += "pj INTEGER(10) NULL ,"
cQuery += "pg INTEGER(10) NULL ,"
cQuery += "pe INTEGER(10) NULL ,"
cQuery += "pp INTEGER(10) NULL ,"
cQuery += "gf INTEGER(10) NULL ,"
cQuery += "gc INTEGER(10) NULL ,"
cQuery += "gd INTEGER(10) NULL ,"
cQuery += " PRIMARY KEY (consec)"
cQuery += ") "
cQuery += " TYPE = MYISAM;"
TRY
oConJug:Execute(cQuery)
CATCH oError
MsgInfo("La tabla Posiciones NO pudo ser creada")
END
cQuery := "CREATE TABLE IF NOT EXISTS menosvencida "
cQuery += "("
cQuery += "consec INTEGER(10) NOT NULL AUTO_INCREMENT,"
cQuery += "alias VARCHAR(50) NULL ,"
cQuery += "nombre VARCHAR(50) NULL,"
cQuery += "goles INTEGER(10) NULL ,"
cQuery += " PRIMARY KEY (consec)"
cQuery += ") "
cQuery += " TYPE = MYISAM;"
TRY
oConJug:Execute(cQuery)
CATCH oError
MsgInfo("La tabla Posiciones NO pudo ser creada")
END
desde:=1
FOR desde=1 TO tablafecha
cQuery := "CREATE TABLE IF NOT EXISTS fecha"+strzero(desde,2)
cQuery += " ("
cQuery += "consec INTEGER(10) NOT NULL AUTO_INCREMENT,"
cQuery += "control VARCHAR(10) NULL ,"
cQuery += "equip1 VARCHAR(2) NULL ,"
cQuery += "nombr1 VARCHAR(50) NULL ,"
cQuery += "alias1 VARCHAR(50) NULL ,"
cQuery += " PRIMARY KEY (consec)"
cQuery += ") "
cQuery += " TYPE = MYISAM;"
TRY
oConJug:Execute(cQuery)
CATCH oError
MsgInfo("La tabla Posiciones NO pudo ser creada")
END
NEXT
cQuery := "CREATE TABLE IF NOT EXISTS partidos "
cQuery += "("
cQuery += "control VARCHAR(10) NOT NULL ,"
cQuery += "equipo1 VARCHAR(50) NULL ,"
cQuery += "alias1 VARCHAR(50) NULL,"
cQuery += "goles1 VARCHAR(50) NULL,"
cQuery += "equipo2 VARCHAR(50) NULL ,"
cQuery += "alias2 VARCHAR(50) NULL,"
cQuery += "goles2 VARCHAR(50) NULL,"
cQuery += "hora VARCHAR(50) NULL,"
cQuery += "orden INTEGER(10) NULL,"
cQuery += "fecha VARCHAR(2) NULL,"
cQuery += " PRIMARY KEY (control)"
cQuery += ") "
cQuery += " TYPE = MYISAM;"
TRY
oConJug:Execute(cQuery)
CATCH oError
MsgInfo("La tabla Posiciones NO pudo ser creada")
END
nRegistros:=oRs:RecordCount()
IF nRegistros > 0
oRs:MoveFirst()
DO WHILE !oRs:Eof()
vFalias:=oRs:Fields("alias"):Value
vFequip:=oRs:Fields("equipo"):Value
vFdeleg:=oRs:Fields("delegado"):Value
vConsCB:="INSERT INTO posiciones (alias,nombre,puntos,pj,pg,pe,pp,gf,gc,gd) VALUES ('"+alltrim(vFalias)+"','"+alltrim(vFequip)+"',0,0,0,0,0,0,0,0)"
TRY
oConJug:Execute(vConsCB)
CATCH oError
MsgInfo("No se pudo insertar el registro","Error de datos")
END
vConsCM:="INSERT INTO menosvencida (alias,nombre,goles) VALUES ('"+alltrim(vFalias)+"','"+alltrim(vFequip)+"',0)"
TRY
oConJug:Execute(vConsCM)
CATCH oError
MsgInfo("No se pudo insertar el registro","Error de datos")
END
oRs:MoveNext()
ENDDO
ENDIF
oRs:MoveFirst()
//msginfo("despues de actualizar las tablas de posiciones y menos vencida")
**********
*msginfo("crear recoRsB1et 1")
//oVar := "SELECT * from menosvencida ORDER BY nombre"
oVar := "SELECT * from menosvencida"
TRY
oRsB1:=tOleAuto():New("ADODB.RecordSet")
CATCH oError
MsgStop( "No se ha podido crear el RECORDSET !","Error de Datos" )
END
oRsB1:CursorLocation := adUseClient //adUseServer
oRsB1:LockType := adLockOptimistic
oRsB1:CursorType := adOpenKeyset
oRsB1:Source := oVar
oRsB1:ActiveConnection( oConJug )
TRY
oRsB1:Open()
CATCH oError
MsgStop( "No se ha podido ejecutar el comando !", "Error de Datos" )
END
*msginfo("crear recoRsB1et 2")
//oVar := "SELECT * from posiciones ORDER BY nombre"
oVar := "SELECT * from posiciones"
TRY
oRsB2:=tOleAuto():New("ADODB.RecordSet")
CATCH oError
MsgStop( "No se ha podido crear el RECORDSET !","Error de Datos" )
END
oRsB2:CursorLocation := adUseClient //adUseServer
oRsB2:LockType := adLockOptimistic
oRsB2:CursorType := adOpenKeyset
oRsB2:Source := oVar
oRsB2:ActiveConnection( oConJug )
TRY
oRsB2:Open()
CATCH oError
MsgStop( "No se ha podido ejecutar el comando !", "Error de Datos" )
END
nRegistros := oRsB2:RecordCount()
if nRegistros > 0
oRsB2:MoveFirst()
DO WHILE !oRsB2:Eof()
vCon2:=oRsB2:Fields("consec"):Value
vNom2:=oRsB2:Fields("nombre"):Value
vAli2:=oRsB2:Fields("alias"):Value
nRegistros := oRsB1:RecordCount()
if nRegistros > 0
oRsB1:MoveFirst()
DO WHILE !oRsB1:Eof()
vCon1:=oRsB1:Fields("consec"):Value
vNom1:=oRsB1:Fields("nombre"):Value
vAli1:=oRsB1:Fields("alias"):Value
control:=alltrim(strzero(vCon2,2))+"*"+alltrim(strzero(vCon1,2))
inverso:=alltrim(strzero(vCon1,2))+"*"+alltrim(strzero(vCon2,2))
//msginfo(control)
oVar:="SELECT * from partidos WHERE control='"+control+"' or control='"+inverso+"'"
TRY
oConsBO := CreateObject("ADODB.Recordset")
CATCH oError
MsgStop( "No se ha podido crear el RECORDSET !","Error de Datos" )
RETURN(.F.)
END
oConsBO:CursorLocation := adUseClient //adUseServer
oConsBO:LockType := adLockOptimistic
oConsBO:CursorType := adOpenKeyset
oConsBO:Source := oVar
oConsBO:ActiveConnection( oConJug )
TRY
oConsBO:Open()
CATCH oError
MsgStop( "No se ha podido ejecutar el comando !","Error de Datos" )
END
nRegistros := oConsBO:RecordCount()
IF nRegistros=0
IF alltrim(strzero(vCon2,2))#alltrim(strzero(vCon1,2))
vConsCB:="INSERT INTO partidos (control,equipo1,alias1,equipo2,alias2,fecha) VALUES ('"+control+"','"+vNom1+"','"+vAli1+"','"+vNom2+"','"+vAli2+"',' ')"
TRY
oConJug:Execute(vConsCB)
CATCH oError
MsgInfo("No se pudo insertar el registro","Error de datos")
END
ENDIF
ENDIF
oRsB1:MoveNext()
ENDDO
endif
oRsB2:MoveNext()
ENDDO
endif
msginfo("fin del proceso cruze partidos")
oConJug:close()
msginfo("inicia la combinacion de los partidos")
oVar := "SELECT * from partidos"
TRY
oRsB3:=tOleAuto():New("ADODB.RecordSet")
CATCH oError
MsgStop( "No se ha podido crear el RECORDSET !","Error de Datos" )
END
oRsB3:CursorLocation := adUseClient //adUseServer
oRsB3:LockType := adLockOptimistic
oRsB3:CursorType := adOpenKeyset
oRsB3:Source := oVar
oRsB3:ActiveConnection( oConJug )
TRY
oRsB3:Open()
CATCH oError
MsgStop( "No se ha podido ejecutar el comando !", "Error de Datos" )
END
//msginfo("despues de crear el recorset")
desde:=1
FOR desde=1 TO fechas
consfecha:=strzero(desde,2)
oRsB3:MoveFirst()
DO WHILE !oRsB3:Eof()
IF Empty(oRsB3:Fields("fecha"):Value)
vConP:=oRsB3:Fields("control"):Value
vEq1P:=oRsB3:Fields("equipo1"):Value
vEq2P:=oRsB3:Fields("equipo2"):Value
vAl1P:=oRsB3:Fields("alias1"):Value
vAl2P:=oRsB3:Fields("alias2"):Value
vCod1:=subs(oRsB3:Fields("control"):Value,1,2)
vCod2:=subs(oRsB3:Fields("control"):Value,4,2)
oVar:="SELECT * from fecha"+consfecha+" WHERE equip1='"+vCod1+"'"
TRY
oConsBO := CreateObject("ADODB.Recordset")
CATCH oError
MsgStop( "No se ha podido crear el RECORDSET !","Error de Datos" )
RETURN(.F.)
END
oConsBO:CursorLocation := adUseClient //adUseServer
oConsBO:LockType := adLockOptimistic
oConsBO:CursorType := adOpenKeyset
oConsBO:Source := oVar
oConsBO:ActiveConnection( oConJug )
TRY
oConsBO:Open()
CATCH oError
MsgStop( "No se ha podido ejecutar el comando !","Error de Datos" )
END
nRegEqu1 := oConsBO:RecordCount()
oVar:="SELECT * from fecha"+consfecha+" WHERE equip1='"+vCod2+"'"
TRY
oConsPO := CreateObject("ADODB.Recordset")
CATCH oError
MsgStop( "No se ha podido crear el RECORDSET !","Error de Datos" )
RETURN(.F.)
END
oConsPO:CursorLocation := adUseClient //adUseServer
oConsPO:LockType := adLockOptimistic
oConsPO:CursorType := adOpenKeyset
oConsPO:Source := oVar
oConsPO:ActiveConnection( oConJug )
TRY
oConsPO:Open()
CATCH oError
MsgStop( "No se ha podido ejecutar el comando !","Error de Datos" )
END
nRegEqu2 := oConsPO:RecordCount()
IF nRegEqu1=0 .and. nRegEqu2=0
vConsCB:="INSERT INTO fecha"+consfecha+" (equip1,nombr1,alias1) VALUES ('"+vCod1+"','"+vEq1P+"','"+vConP+"')"
TRY
oConJug:Execute(vConsCB)
CATCH oError
MsgInfo("No se pudo insertar el registro","Error de datos")
END
vConsCB:="INSERT INTO fecha"+consfecha+" (equip1,nombr1,alias1) VALUES ('"+vCod2+"','"+vEq2P+"','"+vConP+"')"
TRY
oConJug:Execute(vConsCB)
CATCH oError
MsgInfo("No se pudo insertar el registro","Error de datos")
END
oRsB3:Fields("fecha"):value := consfecha
oRsB3:Update()
ENDIF
ENDIF
oRsB3:MoveNext()
ENDDO
NEXT
Posted: Fri May 23, 2008 2:38 pm
by fespinoza
Leandro
Como te indicaba mi aplicación ingresa los resultados de _ profesionales de primera y segunda división de Ecuador; pero el fixture del torneo no lo determino yo, sino la Federación Ecuatoriana de Fútbol, por tanto no controlo ese tema, sino que dependo de lo que resuelva otro organismo; por tanto no tengo una experiencia creando ese tipo de programa que requieres tu.
Re: Ordenamiento de una Tabla usando SORT
Posted: Sat Jun 06, 2009 11:25 am
by fespinoza
Amigos, volviendo a este tema casi un año después.
Resulta que hasta ahora el Harbour no resuelve este problema del mal funcionamiento del comando SORT, tal como lo describo en los posts anteriores (no ordena bien la tabla, porque cuando le toca comparar numeros que pueden ser positivos o negativos, parece que primero calcula el valor absoluto del número y luego ordena; por lo cual en un ordenamiento descendente un -6 se pone antes de un +1); he intentado creando la libreria de FWH con el xHarbour de hace dos meses y no funciona bien igual.
Ahora con el comando INDEX tampoco lo puedo hacer funcionar; basados en los siguientes datos, alguien me puede dare una idea de como puedo hacer lo mismo que hacia con el SORT pero ahora con INDEX.
ANTES: SORT ON PTOS /D, G_D /D, G_F /D TO &RUTTAB.TBLAORDE
donde PTOS y G_F son campos numericos que solo pueden tomar numeros positivos y G_D es también campo numerico pero puede tomar numeros positivos y negativos.
Saludos
Fernando Espinoza
Re: Ordenamiento de una Tabla usando SORT
Posted: Sun Jun 07, 2009 1:43 am
by ronaldo
coloque sinal de menos assim> -G_D
Re: Ordenamiento de una Tabla usando SORT
Posted: Mon Jun 08, 2009 12:50 am
by fespinoza
Ronaldo
Gracias por el interes, lamentablemente poner el signo menos no basta para engañar al sistema; porque parece que el comnando SORT primero saca el valor absoluto del número y luego ordena, entonces no me sirve.