Ordenamiento de una Tabla usando SORT

User avatar
fespinoza
Posts: 188
Joined: Wed Feb 01, 2006 6:59 pm
Location: Ecuador

Ordenamiento de una Tabla usando SORT

Post 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]
User avatar
Armando
Posts: 2479
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México
Contact:

Post 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
SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
User avatar
fespinoza
Posts: 188
Joined: Wed Feb 01, 2006 6:59 pm
Location: Ecuador

Post 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
User avatar
Armando
Posts: 2479
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México
Contact:

Post 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
SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
horacio
Posts: 1270
Joined: Wed Jun 21, 2006 12:39 am
Location: Capital Federal Argentina

Post by horacio »

Una preguntonta : _ son numéricos ???

Saludos
User avatar
fespinoza
Posts: 188
Joined: Wed Feb 01, 2006 6:59 pm
Location: Ecuador

Post by fespinoza »

Si, son campos numericos. Me inclino por lo que dice Armando, debe ser un bug de xHarbour.
User avatar
ADBLANCO
Posts: 299
Joined: Mon Oct 22, 2007 3:03 pm
Location: Valencia - Venezuela

Post 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
Saludos

Angel, Valencia, Venezuela

xH .997 - FW 7.9 - BCC55 - WorkShop - MySql
User avatar
fespinoza
Posts: 188
Joined: Wed Feb 01, 2006 6:59 pm
Location: Ecuador

Ordenamiento de una Tabla usando SORT (RESUELTO)

Post by fespinoza »

Efectivamente usando INDICES se puede resolver el problema, pero sería bueno que alguien reporte este Bug a Harbour.
User avatar
leandro
Posts: 958
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia
Contact:

Post 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?
Saludos
LEANDRO ALFONSO
SISTEMAS LYMA - BASE
Bogotá (Colombia)
[ FWH 19.09 ] [ xHarbour 1.2.3 Intl. (SimpLex) (Build 20190613) ] [ Embarcadero C++ 7.30 for Win32 ]
User avatar
fespinoza
Posts: 188
Joined: Wed Feb 01, 2006 6:59 pm
Location: Ecuador

Post 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
User avatar
leandro
Posts: 958
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia
Contact:

Post 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

Saludos
LEANDRO ALFONSO
SISTEMAS LYMA - BASE
Bogotá (Colombia)
[ FWH 19.09 ] [ xHarbour 1.2.3 Intl. (SimpLex) (Build 20190613) ] [ Embarcadero C++ 7.30 for Win32 ]
User avatar
fespinoza
Posts: 188
Joined: Wed Feb 01, 2006 6:59 pm
Location: Ecuador

Post 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.
User avatar
fespinoza
Posts: 188
Joined: Wed Feb 01, 2006 6:59 pm
Location: Ecuador

Re: Ordenamiento de una Tabla usando SORT

Post 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
Saludos

Fernando Espinoza
User avatar
ronaldo
Posts: 137
Joined: Fri Nov 25, 2005 4:38 pm
Location: brasil
Contact:

Re: Ordenamiento de una Tabla usando SORT

Post by ronaldo »

coloque sinal de menos assim> -G_D
Ronaldo Minacapelli
Sistemas, Hospedagem e Criação de WebSites
http://www.bazevani.com.br
User avatar
fespinoza
Posts: 188
Joined: Wed Feb 01, 2006 6:59 pm
Location: Ecuador

Re: Ordenamiento de una Tabla usando SORT

Post 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.
Saludos

Fernando Espinoza
Post Reply