none
filtrar por fechas para cambio de estatus RRS feed

  • Pregunta

  • Hola a todos muchas gracias por leerme, tengo la siguiente duda, espero alguien pueda ayudarme.

    Tengo un campo  en una tabla llamado "ActualizacionInicial" la cual es una fecha en que se tiene que presentar una persona a hacer un tramite, por otro lado en otra tabla tengo un campo llamado "FechaCaptura" en donde se guarda la fecha en que la persona realizo cierto tramite, tengo que cambiarle el estatus a la persona a SUSPENDIDO si no se presenta a mas tardar dos meses después de la "ActualizacionInicial" es aquí donde no se como hacerle, ¿alguna idea?, agradezco su ayuda. (el update ya lo tengo en un botón) el detalle esta en filtrar a las personas que no hicieron su tramite en determinada fecha. gracias.

    gaby

    miércoles, 21 de agosto de 2019 1:12

Respuestas

Todas las respuestas

  • Hola Gabriela1403:

    Según tu exposición, yo entiendo que tienes el siguiente escenario:

    create table tramite (
     id int identity(1,1) primary key,
     idPersona int,
     Actualizacioninicial datetime
    )
    go
    create table personaTramite (
    id int identity(1,1) primary key,
    idPersona int,
    tramite varchar(25),
    FechaCaptura datetime
    )
    go
    insert into tramite 
    (idPersona, Actualizacioninicial)
    values
    (1,'20190820 09:40:23'),
    (2,'20190820 10:40:23'),
    (3,'20190820 11:40:23'),
    (4,'20190820 12:40:23'),
    (5,'20190820 13:40:23'),
    (6,'20190820 14:40:23'),
    (7,'20190820 15:40:23'),
    (8,'20190820 16:40:23'),
    (9,'20190820 17:40:23');
    go
    insert into personaTramite 
    (idPersona, tramite, FechaCaptura)
    values
    (1,'A','20190820 19:32:23'),
    (2,'B','20190820 11:05:00'),
    (3,'B','20190820 11:41:17'),
    (4,'A','20190820 12:55:12'),
    (5,'B','20190820 16:18:33'),
    (6,'C','20190820 17:33:55'),
    (7,'B','20190820 16:21:24'),
    (8,'D','20190820 18:05:26'),
    (9,'B','20190820 18:31:17');
    go

    Para saber cuantas personas han realizado un trámite dos horas después de la fecha de actualización, puedes utilizar la función datediff

    SELECT t.id, 
           t.idPersona, 
           t.Actualizacioninicial, 
           pt.id, 
           pt.idPersona, 
           pt.tramite, 
           pt.FechaCaptura,
    	  DATEDIFF(hour, t.Actualizacioninicial, pt.FechaCaptura) as NumHoras
    FROM tramite t
         INNER JOIN personaTramite pt ON t.idPersona = pt.idPersona
    WHERE DATEDIFF(hour, t.Actualizacioninicial, pt.FechaCaptura) > 2;

    Salida

    DateDiff

    https://docs.microsoft.com/es-es/sql/t-sql/functions/datediff-transact-sql?view=sql-server-2017

    miércoles, 21 de agosto de 2019 3:38
  • Hola muchas gracias por tu ayuda, pero no, la idea no es así, explico de nuevo (una disculpa por no agregar los scripts necesarios para la reproducción).
    La ActualizacionInicial, es la fecha en la que deben presentarse,
    la FechaCaptura, es el día que realmente se presentaron, (esta fecha  la tienen las personas que SI se presentaron)
    pero no la tienen quienes no vinieron.
    Las personas pueden venir a hacer su tramite máximo 2 MESES después de la fecha de ActualizacionInicial si no vienen, aqui causan suspensión.

    Ejemplo

    Nombre     ActualizacionInicial         FechaCaptura
    Pepito        '20190820 19:32:23'      '20190821 16:32:23'     

     El tiene hasta el '20191020 19:32:23' para presentarse o causa SUSPENSION

    Juanito      '20190820 19:32:23'       NULL
    Lo mismo el.

    Pedro        '20190820 19:32:23'      '20191020 16:32:23'  
    El se salvo porque vino el ultimo día.

    Aqui supongamos que ya estamos a 20191020 19:32:23 entonces Juanito ya causa suspensión (no puedo seleccionar a los que FechaCaptura es = is null porque intervienen otros factores como que en algún momento hicieron otro tramite y se capturo ahi) podriamos agregar otro campo como ActualizacionFinal y de ahi hacerle algo? 


    gaby

    miércoles, 21 de agosto de 2019 16:24
  • Hola Gabriela1403:

    Hasta lo que te marco aquí no hay ningún problema

    porque intervienen otros factores como que en algún momento hicieron otro tramite y se capturo ahi

    Entonces hay que identificar de alguna manera este trámite. Yo te he marcaro, tramite como un varchar, aunque puede ser cualquier tipo de campo.

    De manera que personaTramite, en ese movimiento se identifica que esta haciendo, entonces al cruzarlo con tramite, se sabe si esta dentro de los dos meses.

    Por ejemplo (si te he entendido bien)

    create table tramite (
     id int identity(1,1) primary key,
     idPersona int,
     nombre varchar(10),
     Actualizacioninicial datetime
    )
    go
    
    create table personaTramite (
    id int identity(1,1) primary key,
    idPersona int,
    tramite varchar(25),
    FechaCaptura datetime
    )
    go
    /* le añado el nombre para que sea visible con tu ejemplo */
    insert into tramite 
    (idPersona, nombre, Actualizacioninicial)
    values
    (1,'PEPITO','20190820 19:32:23'),
    (2,'JUANITO','20190820 19:32:23'),
    (3,'PEDRO','20190820 19:32:23'),
    (4,'LUIS','20190620 19:32:23');
    go /* una persona puede hacer varios trámites, pero solo 1 es el inicial */ insert into personaTramite (idPersona, tramite, FechaCaptura) values (1,'INICIAL','20190821 16:32:23'), (2,'OTRO','20190821 11:05:00'), (2,'DIFERENTE','20190822 11:41:17'), (3,'INICIAL','20191020 16:32:23'), (3,'OTRO','20190820 16:18:33'); GO

    Una solución podría ser:

    WITH CTE
         AS (SELECT pt.id,
                    pt.idPersona,
                    pt.tramite,
                    pt.FechaCaptura
             FROM personaTramite pt
             WHERE pt.tramite = 'INICIAL')
         SELECT P.nombre,
                P.Actualizacioninicial,
                C.FechaCaptura,
                CASE
                    WHEN P.ActualizacioniniciaL > DATEADD(MONTH, -2, C.FechaCaptura)
                    THEN 'EN RANGO'
                    WHEN(C.FechaCaptura IS NULL
                         AND P.Actualizacioninicial > DATEADD(MM, -2, GETDATE()))
                    THEN 'NO CADUCADO'
                    ELSE 'CADUCADO'
                END
         FROM CTE C
              RIGHT JOIN tramite P ON C.idPersona = P.idPersona
         WHERE P.ActualizacioniniciaL > DATEADD(MONTH, -2, C.FechaCaptura)
               OR (C.FechaCaptura IS NULL);

    En el cte recogemos todos los tramites iniciales.

    Lo cruzamos con tramite para cada persona.

    Y le pedimos que nos traiga, donde la actualización inicial sea > FechaCaptura menos 2 meses.

    o que actualización inicial sea mayor que ahora menos dos meses.

    Si observas la salida

    Ni a PEPITO, ni a Juanito, ni a Pedro, habría que cambiarles, el estado, solo se le cambiaría a LUIS, que no tiene tramites introducidos, y además se pasa 2 meses de la fecha actual.

    Si es correcto, en vez de la select, se realizaría una update.

    ¿Es esto, bastante más aproximado, a lo que solicitas?


    miércoles, 21 de agosto de 2019 18:58
  • Hola muchas gracias por tu ayuda, te comento:
    El tramite a realizar es una actualizacion de datos cuatrimestral, actualizan su dirección, correo electronico etc.
    se me ocurrio crear otra tabla donde se insertaran las "Fechas de actualizacion de datos" para poder llamar a los que fueran nulos a un gridview, ahorita el problema que traigo es que puse un parametro y no se como pasarselo al grid para mandarlo a llamar, ya que ahora no me sale nada dado que no se como pasarle el parametro. ¿se puede hacer lo que pienso?

    CREATE TABLE [dbo].[RentasPadronActualiza](
    	[IDActualizacion] [int] NOT NULL,
    	[IDPadronRenta] [int] NULL,
    	[Paterno] [varchar](255) NULL,
    	[Materno] [varchar](255) NULL,
    	[Nombre] [varchar](255) NULL,
    	[PredioOrigen] [varchar](255) NULL,
    	[TipoRiesgo] [varchar](255) NULL,
    	[Estatus] [varchar](255) NULL,
    	[Año] [int] NULL,
    	[NumActua1] [int] NULL,
    	[Actualizacion1] [bit] NULL,
    	[Fecha_1] [datetime] NULL,
    	[NumActua2] [int] NULL,
    	[Actualizacion2] [bit] NULL,
    	[Fecha_2] [datetime] NULL,
    	[NumActua3] [int] NULL,
    	[Actualizacion3] [bit] NULL,
    	[Fecha_3] [datetime] NULL
    ) ON [PRIMARY]
    

    AQUI PONGO HASTA EL 2, PERO SON 3 EN REALIDAD
    
    ALTER PROCEDURE [dbo].[spu_Rp_ActivosSuspendidosEstructurales]
    
    @NumActualizacion AS INT, 
    @Año as int 
      
    AS
    BEGIN
    
      IF  @NumActualizacion = 1 AND @Año = (select year(getdate()))
    BEGIN
    	SELECT DISTINCT 
    	
    	     RenP.IDPadronRenta    
    		,RenP.IDPredio			
    		,RenP.[Nombre Completo]
    		,RenP.PredioOrigen
    		,RenP.ColoniaPredioOrigen
    		,RenP.Delegacion	
    		,RenP.AcuerdoConsejo
    		,RenP.TipoRiesgo		
    		,RenP.Estatus
    		,RenP.MontoApoyo
    		,RenP.Direccion
    		,RenP.Colonia
    		,RenP.DelegacionAc
    		,RPA.Año
    		
    			
    	 FROM RentasPadron RenP
    	
    	 INNER JOIN 
    	 RentasPadronActualiza RPA
    	 ON RenP.IDPadronRenta = RPA.IDPadronRenta
    	 LEFT JOIN
    	 RentasPadronActualizacion RPAC
    	 ON RPA.IDPadronRenta = RPAC.IDPadronRenta
    	 	 
    	 WHERE  Fecha_1 is null  AND RenP.TipoRiesgo ='ESTRUCTURAL' and RenP.Estatus = 'ACTIVO'
    	 
    	 order by IDPadronRenta asc
    	 
    	 END 
    	 	 
    	 ------
    	 
    	ELSE IF   @NumActualizacion = 2 AND @Año = (select year(getdate()))
    	BEGIN
    	SELECT DISTINCT 
    	
    	     RenP.IDPadronRenta    
    		,RenP.IDPredio			
    		,RenP.[Nombre Completo]
    		,RenP.PredioOrigen
    		,RenP.ColoniaPredioOrigen
    		,RenP.Delegacion	
    		,RenP.AcuerdoConsejo
    		,RenP.TipoRiesgo		
    		,RenP.Estatus
    		,RenP.MontoApoyo
    		,RenP.Direccion
    		,RenP.Colonia
    		,RenP.DelegacionAc
    		,RPA.Año
    		
    			
    	 FROM RentasPadron RenP
    	
    	 INNER JOIN 
    	 RentasPadronActualiza RPA
    	 ON RenP.IDPadronRenta = RPA.IDPadronRenta
    	 LEFT JOIN
    	 RentasPadronActualizacion RPAC
    	 ON RPA.IDPadronRenta = RPAC.IDPadronRenta
    	 	 
    	 WHERE  Fecha_2 is null  AND RenP.TipoRiesgo ='ESTRUCTURAL' and RenP.Estatus = 'ACTIVO'
    	 
    	 END 


    gaby

    miércoles, 28 de agosto de 2019 22:50
  • Hola Gabriela1403:

    Si se puede, pero estas hablando de otra tecnología, de como cargar datos en un datagrid.

    Normalmente, para los dataGrid, se alimenta su propiedad DataSource, con una colección, por ejemplo un dataTable, y es este dataTable, el que dispone de sus elementos en base a una consulta. Esta consulta, se envía a la base de datos, con un parámetro, y el retorno, cambia según este. Y esto varía el datagrid.

    Cargar datagrid

    https://ervingilvargas.blogspot.com/2014/03/cargar-datagridview-mediante-c-y-sql.html

    Pasar parámetros

    https://www.tutorialesprogramacionya.com/csharpya/detalleconcepto.php?codigo=208

    Pero esto ya es objeto de otra pregunta en el foro del lenguaje que corresponda. 

    Veo que ya conoces como llegar a ellos, pero por si acaso.

    Foro c#

    https://social.msdn.microsoft.com/Forums/es-ES/home?forum=vcses

    • Marcado como respuesta Gabriela1403 jueves, 29 de agosto de 2019 19:05
    jueves, 29 de agosto de 2019 3:39
  • Si muchas gracias, ya lo pude resolver. 

    gaby

    jueves, 29 de agosto de 2019 19:06