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

Image

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.