Ir al contenido


Foto

[RESUELTO] Número por registro en Firebird


  • Por favor identifícate para responder
21 respuestas en este tema

#1 felipe

felipe

    Advanced Member

  • Administrador
  • 3.283 mensajes
  • LocationColombia

Escrito 27 noviembre 2011 - 11:37

Que tal compañeros,
aunque es inusual este caso se me presenta la necesidad, requiero en una consulta SQL traer numerado cada registro, estuve revisando esta documentación pero no funciona del todo como lo requiero o no he logrado implementarla bien: http://www.firebirdfaq.org/faq343/

Espero me puedan orientar al respecto.


Saludos!
  • 0

#2 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 28 noviembre 2011 - 09:03

y no te sirve jalar la consulta desde un SP???
  • 0

#3 felipe

felipe

    Advanced Member

  • Administrador
  • 3.283 mensajes
  • LocationColombia

Escrito 28 noviembre 2011 - 09:21

y no te sirve jalar la consulta desde un SP???


Desafortunadamente no, sino así hubiera sido más sencillo :)


Saludos!
  • 0

#4 fredycc

fredycc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 874 mensajes
  • LocationOaxaca, México

Escrito 28 noviembre 2011 - 09:42

Que tal compañeros,
aunque es inusual este caso se me presenta la necesidad, requiero en una consulta SQL traer numerado cada registro, estuve revisando esta documentación pero no funciona del todo como lo requiero o no he logrado implementarla bien: http://www.firebirdfaq.org/faq343/

Espero me puedan orientar al respecto.


Saludos!


Pues he ejecutado el primer ejemplo y pues si me los enumera bien, a menos que tu requerimiento sea otro, pero no le veo problema, mi servidor es FB 2.5.1

Saludos
  • 0

#5 felipe

felipe

    Advanced Member

  • Administrador
  • 3.283 mensajes
  • LocationColombia

Escrito 28 noviembre 2011 - 10:19

Pues he ejecutado el primer ejemplo y pues si me los enumera bien, a menos que tu requerimiento sea otro, pero no le veo problema, mi servidor es FB 2.5.1

Saludos


Lo que sucede es que la consulta es algo compleja y esto hace que el contador no comience en 1 sino en otro valor.
Otra cosa a notar es que como se cuentan los registros consultados por sesión del usuario, sino se hace commit a la consulta este no reinicia el conteo.


Saludos!
  • 0

#6 felipe

felipe

    Advanced Member

  • Administrador
  • 3.283 mensajes
  • LocationColombia

Escrito 28 noviembre 2011 - 10:29

Acabo de verificar, el error del conteo se debe a que uso la instrucción DISTINCT dentro del query, aún así no la puedo eliminar :s


Saludos!
  • 0

#7 felipe

felipe

    Advanced Member

  • Administrador
  • 3.283 mensajes
  • LocationColombia

Escrito 28 noviembre 2011 - 10:46

¿O alguien conoce otra forma de seleccionar los registros no repetidos?


Saludos!
  • 0

#8 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 28 noviembre 2011 - 10:48

Hola Felipe,
¿Y cual es la dicha consulta? A si de a muchos le caemos a golpes a ver si se deja  :D

Otra posibilidad que se puede evaluar, si es que es viable, es la emplear campos calculados y dejar que la propia aplicación sea quien numere.

Saludos,
  • 0

#9 felipe

felipe

    Advanced Member

  • Administrador
  • 3.283 mensajes
  • LocationColombia

Escrito 28 noviembre 2011 - 10:58

Hola Felipe,
¿Y cual es la dicha consulta? A si de a muchos le caemos a golpes a ver si se deja  :D

Otra posibilidad que se puede evaluar, si es que es viable, es la emplear campos calculados y dejar que la propia aplicación sea quien numere.

Saludos,


Hola Delphius, lo de los campos calculados no me sirve :p, puesto que la consulta no la hago desde Delphi.

Y pues el query es algo así...


SELECT DISTINCT DC.*,
I.REFERENCIA, IC.ACABADO, V.CALIBRE, V.COLOR FROM
CAB_COTIZACION CC INNER JOIN DET_COTIZACION DC
ON (CC.ID_CABCOTIZACION = DC.ID_CABCOTIZACION)
INNER JOIN ITEM_COTIZACION IC
ON (DC.ID_DETCOTIZACION = IC.ID_DETCOTIZACION)
INNER JOIN ITEM I
ON (IC.ID_ITEM = I.ID_ITEM)
INNER JOIN VIDRIO V
ON (V.ID_VIDRIO = DC.VIDRIO)
WHERE CC.ID_CABCOTIZACION =:CAB


En el fallido intento por usar el ejemplo del Firebird FAQ hice esto:


SELECT DISTINCT DC.*,
RDB$GET_CONTEXT('USER_TRANSACTION', 'ROW#') AS RECNO,
RDB$SET_CONTEXT('USER_TRANSACTION', 'ROW#',
COALESCE(CAST(RDB$GET_CONTEXT('USER_TRANSACTION', 'ROW#') AS INTEGER), 0) + 1),
I.REFERENCIA, IC.ACABADO, V.CALIBRE, V.COLOR FROM
CAB_COTIZACION CC INNER JOIN DET_COTIZACION DC
ON (CC.ID_CABCOTIZACION = DC.ID_CABCOTIZACION)
INNER JOIN ITEM_COTIZACION IC
ON (DC.ID_DETCOTIZACION = IC.ID_DETCOTIZACION)
INNER JOIN ITEM I
ON (IC.ID_ITEM = I.ID_ITEM)
INNER JOIN VIDRIO V
ON (V.ID_VIDRIO = DC.VIDRIO)
WHERE CC.ID_CABCOTIZACION =:CAB


Si de algo sirve tanto :D


Saludos!
  • 0

#10 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 28 noviembre 2011 - 11:31

A ver si entiendo, ¿Lo que necesitas es que asignar un número (ordenado) a cada registro arrojado por la primera consulta?

Saludos
  • 0

#11 fredycc

fredycc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 874 mensajes
  • LocationOaxaca, México

Escrito 28 noviembre 2011 - 11:40

Es algo con respecto a esto felipe?

http://www.sqlserver...mple-using.html

Saludos
  • 0

#12 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 28 noviembre 2011 - 11:47

A groso modo veo que para que tu consulta funcione como la del ejemplo que refieres en el primer post, debes definir un campo entero o numérico por el cual ordenar la consulta, define eso y ya miraremos como la ensamblamos lo más parecida posible.

Saludos
  • 0

#13 felipe

felipe

    Advanced Member

  • Administrador
  • 3.283 mensajes
  • LocationColombia

Escrito 28 noviembre 2011 - 12:36

Hola, el problema no es el ordenamiento, pues este no tiene mayor relevancia para la consulta, simplemente se trata de enumerar cada registro de la consulta.

Por ejemplo si la ejecuto y trae consigo 5 registros entonces que los muestre así:

RECNO - CAMPO1 - CAMPO2 - CAMPO3
-------------------------------------------------
    1        ******    ******    ******
    2        ******    ******    ******
    3        ******    ******    ******
    4        ******    ******    ******
    5        ******    ******    ******
-------------------------------------------------

El inconveniente como comentaba, es que al usarlo por poseer el DISTINCT obtengo algo como:

RECNO - CAMPO1 - CAMPO2 - CAMPO3
-------------------------------------------------
    6        ******    ******    ******
    7        ******    ******    ******
    8        ******    ******    ******
    9        ******    ******    ******
  10        ******    ******    ******
-------------------------------------------------

Es decir, no comienza desde 1.



Saludos!
  • 0

#14 fredycc

fredycc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 874 mensajes
  • LocationOaxaca, México

Escrito 28 noviembre 2011 - 12:45

Mmm, pues yo haría una subconsulta donde solo traiga todo los id ya filtrados evitando duplicados y en la consulta principal se hace el conteo que comentas y no tendría que saltar tu numeración.

Saludos.
  • 0

#15 felipe

felipe

    Advanced Member

  • Administrador
  • 3.283 mensajes
  • LocationColombia

Escrito 28 noviembre 2011 - 01:12

Mmm, pues yo haría una subconsulta donde solo traiga todo los id ya filtrados evitando duplicados y en la consulta principal se hace el conteo que comentas y no tendría que saltar tu numeración.

Saludos.


¿Alguna idea con este query compañero? :)


Saludos!
  • 0

#16 fredycc

fredycc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 874 mensajes
  • LocationOaxaca, México

Escrito 28 noviembre 2011 - 01:39


Mmm, pues yo haría una subconsulta donde solo traiga todo los id ya filtrados evitando duplicados y en la consulta principal se hace el conteo que comentas y no tendría que saltar tu numeración.

Saludos.


¿Alguna idea con este query compañero? :)


Saludos!


Detectas que Campos específicos en tus joins te generan el hecho de usar distinct??, porque como creo indicas el uso del distinct en tu query provoca el salto de la numeración, probablemente solo el uso del right o left join lo solucionaría o hacer como te comento una subconsulta con los campos con el distinct que te permita partir de este para el el query principal completar los demás datos y evitar el salto en tu numeración. Espero haberme explicado felipe.

Saludos.
  • 0

#17 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 28 noviembre 2011 - 01:40

Hola.


Hola Felipe,
¿Y cual es la dicha consulta? A si de a muchos le caemos a golpes a ver si se deja  :D

Otra posibilidad que se puede evaluar, si es que es viable, es la emplear campos calculados y dejar que la propia aplicación sea quien numere.

Saludos,


Hola Delphius, lo de los campos calculados no me sirve :p, puesto que la consulta no la hago desde Delphi.

Y pues el query es algo así...


SELECT DISTINCT DC.*,
I.REFERENCIA, IC.ACABADO, V.CALIBRE, V.COLOR FROM
CAB_COTIZACION CC INNER JOIN DET_COTIZACION DC
ON (CC.ID_CABCOTIZACION = DC.ID_CABCOTIZACION)
INNER JOIN ITEM_COTIZACION IC
ON (DC.ID_DETCOTIZACION = IC.ID_DETCOTIZACION)
INNER JOIN ITEM I
ON (IC.ID_ITEM = I.ID_ITEM)
INNER JOIN VIDRIO V
ON (V.ID_VIDRIO = DC.VIDRIO)
WHERE CC.ID_CABCOTIZACION =:CAB


En el fallido intento por usar el ejemplo del Firebird FAQ hice esto:


SELECT DISTINCT DC.*,
RDB$GET_CONTEXT('USER_TRANSACTION', 'ROW#') AS RECNO,
RDB$SET_CONTEXT('USER_TRANSACTION', 'ROW#',
COALESCE(CAST(RDB$GET_CONTEXT('USER_TRANSACTION', 'ROW#') AS INTEGER), 0) + 1),
I.REFERENCIA, IC.ACABADO, V.CALIBRE, V.COLOR FROM
CAB_COTIZACION CC INNER JOIN DET_COTIZACION DC
ON (CC.ID_CABCOTIZACION = DC.ID_CABCOTIZACION)
INNER JOIN ITEM_COTIZACION IC
ON (DC.ID_DETCOTIZACION = IC.ID_DETCOTIZACION)
INNER JOIN ITEM I
ON (IC.ID_ITEM = I.ID_ITEM)
INNER JOIN VIDRIO V
ON (V.ID_VIDRIO = DC.VIDRIO)
WHERE CC.ID_CABCOTIZACION =:CAB


Si de algo sirve tanto :D


Saludos!


Ya ibas bien, simplemente saca fuera del DISTINCT esa generación de nº.


SELECT *,
      RDB$GET_CONTEXT('USER_TRANSACTION', 'ROW#') AS RECNO,
      RDB$SET_CONTEXT('USER_TRANSACTION', 'ROW#', COALESCE(CAST(RDB$GET_CONTEXT('USER_TRANSACTION', 'ROW#') AS INTEGER), 0) + 1)
FROM (SELECT DISTINCT DC.*,
                      I.REFERENCIA, IC.ACABADO, V.CALIBRE, V.COLOR
      FROM CAB_COTIZACION CC
          INNER JOIN DET_COTIZACION DC ON (CC.ID_CABCOTIZACION = DC.ID_CABCOTIZACION)
          INNER JOIN ITEM_COTIZACION IC ON (DC.ID_DETCOTIZACION = IC.ID_DETCOTIZACION)
          INNER JOIN ITEM I ON (IC.ID_ITEM = I.ID_ITEM)
          INNER JOIN VIDRIO V ON (V.ID_VIDRIO = DC.VIDRIO)
      WHERE CC.ID_CABCOTIZACION =:CAB)


Saludos

  • 0

#18 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 28 noviembre 2011 - 01:44

Vaya, ha quedado totalmente desalineado :(

Sería buena idea que los textos dentro de una sección SQL, se mostrasen en un tipo de letra de tamaño fijo, como el Courier.

Saludos.
  • 0

#19 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 28 noviembre 2011 - 01:50

Vaya, ha quedado totalmente desalineado :(

Sería buena idea que los textos dentro de una sección SQL, se mostrasen en un tipo de letra de tamaño fijo, como el Courier.

Saludos.


Olvidadlo, ya he visto que no estaba bien alineado porqué lo he escrito originalmente en el editor del Foro, en la letra por defecto, y por tanto el espaciado no era fijo.

Lo he vuelto a alinear, desde mi editor SQL, y ahora "casi" sale bien. Aún hay un poco de diferencia en donde debería alinearse alguna línea. Pero no es tan exagerado.

NOTA: Felipe, compara esta última consulta, con la que tu escribiste. Si coges una política de alineación, verás como después es mucho más fácil comprender las consultas a simple vista.

Saludos.
  • 0

#20 felipe

felipe

    Advanced Member

  • Administrador
  • 3.283 mensajes
  • LocationColombia

Escrito 28 noviembre 2011 - 02:10

Hola Marc, gracias por la ayuda, algo sucede con el *,

Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 1, column 9.
,.
[/quote]

Si elimino esta parte solo me muestra la numeración, mas no los registros de la consulta.

[quote author=fredycc"" data-cid="59463" data-time="1322509173">

Detectas que Campos específicos en tus joins te generan el hecho de usar distinct??, porque como creo indicas el uso del distinct en tu query provoca el salto de la numeración, probablemente solo el uso del right o left join lo solucionaría o hacer como te comento una subconsulta con los campos con el distinct que te permita partir de este para el el query principal completar los demás datos y evitar el salto en tu numeración. Espero haberme explicado felipe.

Saludos.


El que me obliga a hacer el distinct es el campo IC.ACABADO, ya que este se repite "n" veces.


Saludos!
  • 0




IP.Board spam blocked by CleanTalk.