[RESUELTO] Número por registro en Firebird
#1
Escrito 27 noviembre 2011 - 11:37
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!
#2
Escrito 28 noviembre 2011 - 09:03
#3
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!
#4
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
#5
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!
#6
Escrito 28 noviembre 2011 - 10:29
Saludos!
#7
Escrito 28 noviembre 2011 - 10:46
Saludos!
#8
Escrito 28 noviembre 2011 - 10:48
¿Y cual es la dicha consulta? A si de a muchos le caemos a golpes a ver si se deja
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,
#9
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
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 , 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
Saludos!
#10
Escrito 28 noviembre 2011 - 11:31
Saludos
#11
Escrito 28 noviembre 2011 - 11:40
#12
Escrito 28 noviembre 2011 - 11:47
Saludos
#13
Escrito 28 noviembre 2011 - 12:36
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!
#14
Escrito 28 noviembre 2011 - 12:45
Saludos.
#15
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!
#16
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.
#17
Escrito 28 noviembre 2011 - 01:40
Hola Felipe,
¿Y cual es la dicha consulta? A si de a muchos le caemos a golpes a ver si se deja
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 , 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
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
#18
Escrito 28 noviembre 2011 - 01:44
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.
#19
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.
#20
Escrito 28 noviembre 2011 - 02:10
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!