Ordenamiento de una Tabla usando SORT

Ordenamiento de una Tabla usando SORT

Postby fespinoza » Tue May 20, 2008 7:05 pm

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]
Code: Select all  Expand view
Code: Select all  Expand view
User avatar
fespinoza
 
Posts: 188
Joined: Wed Feb 01, 2006 6:59 pm
Location: Ecuador

Postby Armando » Tue May 20, 2008 8:53 pm

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

Postby fespinoza » Tue May 20, 2008 9:18 pm

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

Postby Armando » Tue May 20, 2008 9:43 pm

Fernando:

Ummm, pareciera un bug de [x]Harbour, intenta creando un índice por los mismos campos 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
User avatar
Armando
 
Posts: 3085
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México

Postby horacio » Tue May 20, 2008 10:31 pm

Una preguntonta : Los campos son numéricos ???

Saludos
horacio
 
Posts: 1358
Joined: Wed Jun 21, 2006 12:39 am
Location: Capital Federal Argentina

Postby fespinoza » Wed May 21, 2008 12:53 pm

Si, son campos numericos. Me inclino por lo que dice Armando, debe ser un bug de xHarbour.
User avatar
fespinoza
 
Posts: 188
Joined: Wed Feb 01, 2006 6:59 pm
Location: Ecuador

Postby ADBLANCO » Wed May 21, 2008 1:29 pm

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
ADBLANCO
 
Posts: 299
Joined: Mon Oct 22, 2007 3:03 pm
Location: Valencia - Venezuela

Ordenamiento de una Tabla usando SORT (RESUELTO)

Postby fespinoza » Wed May 21, 2008 2:00 pm

Efectivamente usando INDICES se puede resolver el problema, pero sería bueno que alguien reporte este Bug a Harbour.
User avatar
fespinoza
 
Posts: 188
Joined: Wed Feb 01, 2006 6:59 pm
Location: Ecuador

Postby leandro » Wed May 21, 2008 3:32 pm

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 AREVALO
Bogotá (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Embarcadero C++ 7.60 for Win32 ] [ FiveWin 23.07 ] [ xHarbour 1.3.0 Intl. (SimpLex) (Build 20230914) ]
User avatar
leandro
 
Posts: 1488
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia

Postby fespinoza » Wed May 21, 2008 6:13 pm

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

Postby leandro » Fri May 23, 2008 1:44 am

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  Expand view

*******************************************
*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 AREVALO
Bogotá (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Embarcadero C++ 7.60 for Win32 ] [ FiveWin 23.07 ] [ xHarbour 1.3.0 Intl. (SimpLex) (Build 20230914) ]
User avatar
leandro
 
Posts: 1488
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia

Postby fespinoza » Fri May 23, 2008 2:38 pm

Leandro

Como te indicaba mi aplicación ingresa los resultados de los campeonatos 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

Postby fespinoza » Sat Jun 06, 2009 11:25 am

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

Re: Ordenamiento de una Tabla usando SORT

Postby ronaldo » Sun Jun 07, 2009 1:43 am

coloque sinal de menos assim> -G_D
[b]Ronaldo Minacapelli[/b]
Sistemas, Hospedagem e Criação de WebSites
http://www.bazevani.com.br
User avatar
ronaldo
 
Posts: 139
Joined: Fri Nov 25, 2005 4:38 pm
Location: brasil

Re: Ordenamiento de una Tabla usando SORT

Postby fespinoza » Mon Jun 08, 2009 12:50 am

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

Next

Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: carlos vargas and 53 guests