Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   MS SQL Server (https://www.clubdelphi.com/foros/forumdisplay.php?f=23)
-   -   como obtener un unico valor entre dos campos de folio de sql server (https://www.clubdelphi.com/foros/showthread.php?t=73578)

uper 03-05-2011 00:51:22

como obtener un unico valor entre dos campos de folio de sql server
 
Tengo una tabla que cada vez que se solicite un tramite registro el num de aprobacion y otros datos, en esta tabla guardo informacion de folio que me autorizan a usar, por decir folio inicio y folio final, la situacion se presenta cuando comienza a tener mas tramites, debo obtener solo el numero de aprobacion para el folio que estoy usando.
este es ta estructura
tabla: sellos_prt
plaza char(2), tipo char(1), numtram int, inicio char(12), final CHAR(12), numaprobacion char(12)
por ejemplo:

plaza=01, tipo=1, inicio=1, final=10, numaprobacion=380
plaza=01, tipo=1, inicio=11, final=20, numaprobacion=885

Cuando yo solicite el folio 3 me debe regresar el numaprobacion= 380 (que esta entre ese rango), para el folio 17 me debe regresar el numaprobacion=885, para el folio 5 me debe de regresar el numaprobacion= 380 y asi. cree una consulta: select top 1 numaprobacion from selloscfd_prt where plaza='01' and tipo='1' and inicio>='5' and final<='5' pero no es la esperada, me podrian ayudar
les agradesco, gracias

ContraVeneno 03-05-2011 01:15:52

Creo que sería mejor que te estuvieras basando en la serie, en lugar de solamente el folio.

Al crear tu factura, que se seleccione la serie que vas a usar para facturar y con eso obtienes el número de aprobación y el siguiente folio... te convendría tener un lugar donde vayas guardando el siguiente folio disponible. O podrías crear una tabla donde estén todos los folios que generaste e irles cambiando el estatus dependiendo de lo que le hagan a la factura (factura, devolución, cancelación).

Si solo vas a pedir el número de folio cuando solo tienes capturado el rango, creo que te la vas a complicar más de lo normal.

Por cierto, te recomiendo ampliamente que los números los manejes como números. Los folios nunca van a contener letras por lo que te recomiendo que los declares como int y no como char....

además, si lo dejas así como char, deberás tener MUCHO cuidado porque para un char en SQL, ' 1', no es lo mismo que '1 '... y cuando quieras ordenar por folio, te vas a topar con dolor de cabeza ya que primero va a ordenar todos los 1, luegos todos los 2, etc (1, 10, 11, 12... 2, 20, 21... 3, 30, 31...).

por último, al ser char(12), significa que siempre se van a guardar 12 caracteres, así que estas guardando valores:
Código:

'1          '
cuando podrías guardar solo un caracter si lo tuvieras como int, o mínimo como varchar....

sinalocarlos 03-05-2011 01:19:42

Cita:

Empezado por uper (Mensaje 398630)
Tengo una tabla que cada vez que se solicite un tramite registro el num de aprobacion y otros datos, en esta tabla guardo informacion de folio que me autorizan a usar, por decir folio inicio y folio final, la situacion se presenta cuando comienza a tener mas tramites, debo obtener solo el numero de aprobacion para el folio que estoy usando.
este es ta estructura
tabla: sellos_prt
plaza char(2), tipo char(1), numtram int, inicio char(12), final CHAR(12), numaprobacion char(12)
por ejemplo:

plaza=01, tipo=1, inicio=1, final=10, numaprobacion=380
plaza=01, tipo=1, inicio=11, final=20, numaprobacion=885

Cuando yo solicite el folio 3 me debe regresar el numaprobacion= 380 (que esta entre ese rango), para el folio 17 me debe regresar el numaprobacion=885, para el folio 5 me debe de regresar el numaprobacion= 380 y asi. cree una consulta: select top 1 numaprobacion from selloscfd_prt where plaza='01' and tipo='1' and inicio>='5' and final<='5' pero no es la esperada, me podrian ayudar
les agradesco, gracias

Tu consulta esta bien, que es lo que te regresa que no es lo esperado?

ContraVeneno 03-05-2011 01:26:24

el problema puede venir porque está buscando un '5' sin espacios y en la base de datos está con todos los espacios ya que el campo es char(12).

tendría que hacer una conversión, o utilizar las funciones rtrim, ltrim o cambiarlo a varchar.... o lo más sencillo, manejar los números como números y declararlo como int.

uper 05-05-2011 00:15:50

Saludos a todos, con respecto a la duda de como obtener un unico valor entre dos campos de folio de sql server, comento que por un lado tengo una tabla de folios que al generarse la factura se va a actualizando el folio, la tabla que describo como sellos_prt la uso para obtener un num de aprobacion, lo que significa que solo me autorizan un determinado rango de folios y no puedo generar mas facturas hasta que no me vuelva a autorizar mas folios.
Este num de aprobacion es importante por que necesito obtener por medio de una consulta de acuerdo al folio me de el num. de aprobacion.

Por otro lado ya los cambie los campos inicio y final por enteros y no me regresa nada de valor.

select top 1 numaprobacion from selloscfd_prt where plaza='01' and tipo='1' and inicio>=5 and final<=5

alguna suferencia les agradesco, gracias

abelg 19-05-2011 18:47:41

Hola espero esto te sirva ejecutalo en el manejador de consultas de SQL Server en cualquier base de Datos pues crea temporales.

Código SQL [-]
Create Table #tmp_folio (
        plaza char(2),
        tipo int,
        numtram int,
        inicio int,
        final int,
        numaprobacion int)
        
        
insert into #tmp_folio Values ('01', 3, 1 , 1, 10, 380)
insert into #tmp_folio Values ('01', 4, 1 , 11, 20, 885)

declare @valor_buscado int
-- Ejemplo 1
set @valor_buscado = 3
Select numaprobacion
from #tmp_folio
where plaza = '01' and @valor_buscado between inicio and final 

--Ejemplo2
set @valor_buscado = 15
Select numaprobacion
from #tmp_folio
where plaza = '01' and @valor_buscado between inicio and final 

Drop table #tmp_folio

A mi me salio lo que pedías.
salu2

uper 21-05-2011 00:52:20

saludos a todos, si pues ya lo comprove si usar temporales, y resulto es buscar un rango de folios sabiendo el folio que le voy a pasar como parametro


gracias.

abelg 23-05-2011 23:05:45

que bueno que solucionaste. Yo use temporales solo para simular tus tablas.
pues no tenia tus tablas.

la solución te planteaba en esta parte del código.

Código SQL [-]
where plaza = '01' and @valor_buscado between inicio and final

Salu2


La franja horaria es GMT +2. Ahora son las 02:14:07.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi